基于 LibTorch 构建强实时的深度学习 C++ 推理应用
本文介绍如何使用 LibTorch 在 C++ 环境中构建强实时的深度学习推理应用。内容包括环境配置、TorchScript 模型导出、C++ 推理代码编写与编译运行。通过优化内存管理和线程控制,提升系统实时性,适用于自动驾驶、工业自动化等对延迟敏感的场景。

本文介绍如何使用 LibTorch 在 C++ 环境中构建强实时的深度学习推理应用。内容包括环境配置、TorchScript 模型导出、C++ 推理代码编写与编译运行。通过优化内存管理和线程控制,提升系统实时性,适用于自动驾驶、工业自动化等对延迟敏感的场景。

在人工智能和实时系统领域,深度学习模型的推理性能对于系统的实时性和可靠性至关重要。Python 作为深度学习的主要开发语言,虽然提供了丰富的库和工具,但在实时性要求极高的场景中,其性能和内存管理能力可能受到限制。LibTorch(PyTorch C++)提供了一种在 C++ 环境中加载和运行 TorchScript 模型的方法,使得开发者能够在 C++ 中实现更严格的内存管理和线程控制,从而提升推理任务的实时性和性能。
在实际应用中,例如自动驾驶汽车的实时目标检测、工业自动化中的实时图像识别等场景,都需要快速、准确地处理大量数据并进行实时推理。通过使用 LibTorch 在 C++ 环境中实现推理任务,可以有效提升系统的实时性和可靠性,满足严格的实时性要求。
LibTorch 是 PyTorch 的 C++ 前端,它允许开发者在 C++ 环境中使用 PyTorch 的功能。LibTorch 提供了完整的 PyTorch 功能,包括张量操作、自动微分和模型加载等。通过 LibTorch,开发者可以将 PyTorch 模型导出为 TorchScript 格式,并在 C++ 环境中加载和运行这些模型。
TorchScript 是 PyTorch 的一种中间表示,用于将 Python 编写的 PyTorch 模型转换为可以在 C++ 环境中运行的格式。TorchScript 支持两种转换方式:
实时任务需要在严格的时间约束内完成,对系统的响应时间和确定性有很高的要求。在深度学习推理中,实时任务通常需要快速加载模型、处理输入数据并生成推理结果。为了满足这些要求,需要优化内存管理、减少线程切换和避免不必要的计算开销。
更新系统
sudo apt update && sudo apt upgrade -y
安装开发工具
sudo apt install build-essential cmake git -y
下载并解压 LibTorch
wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.10.0%2Bcpu.zip
unzip libtorch-cxx11-abi-shared-with-deps-1.10.0+cpu.zip
mv libtorch /usr/local/
设置环境变量
echo 'export LD_LIBRARY_PATH=/usr/local/libtorch/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
在自动驾驶汽车的实时目标检测系统中,车辆需要实时处理摄像头捕获的图像数据,并通过深度学习模型进行目标检测。系统要求在 100 毫秒内完成从图像采集到目标检测的整个过程,以确保车辆能够及时做出决策。在这种场景下,使用 LibTorch 在 C++ 环境中实现推理任务,可以有效优化内存管理和线程控制,减少推理延迟,满足实时性要求。
安装 PyTorch
pip install torch torchvision
编写 Python 脚本导出模型 下面是一个简单的 Python 脚本,用于将 PyTorch 模型导出为 TorchScript 格式:
import torch
import torchvision.models as models
# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()
# 创建一个示例输入
example_input = torch.rand(1, 3, 224, 224)
# 导出模型为 TorchScript 格式
traced_script_module = torch.jit.trace(model, example_input)
traced_script_module.save("resnet18_traced.pt")
运行脚本
python export_model.py
创建项目目录
mkdir -p ~/libtorch_inference/src
cd ~/libtorch_inference
编写 C++ 推理代码
在 src 目录下创建一个名为 inference.cpp 的文件,并添加以下代码:
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main() {
// Deserialize the ScriptModule from a file using torch::jit::load().
std::shared_ptr<torch::jit::script::Module> module;
try {
module = torch::jit::load("resnet18_traced.pt");
} catch (const c10::Error& e) {
std::cerr << "Error loading the model\n";
return -1;
}
std::cout << "model loaded\n";
// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({1, 3, 224, 224}));
// Execute the model and turn its output into a tensor.
at::Tensor output = module->forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/) << ;
;
}
在项目根目录下创建一个名为 CMakeLists.txt 的文件,并添加以下内容:
cmake_minimum_required(VERSION 3.14...)
project(libtorch_inference)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
find_package(Torch REQUIRED)
add_executable(inference src/inference.cpp)
target_link_libraries(inference "${TORCH_LIBRARIES}")
set_property(TARGET inference PROPERTY CXX_STANDARD 14)
set_property(TARGET inference PROPERTY CXX_STANDARD_REQUIRED True)
创建构建目录
mkdir build
cd build
运行 CMake
cmake ..
编译项目
make -j$(nproc)
运行推理程序
./inference
torch::jit::load 加载 TorchScript 模型。forward 方法执行推理任务,并输出推理结果。A1: 在导出 TorchScript 模型时,确保使用与 C++ 环境中相同的 PyTorch 版本。此外,检查模型是否包含不支持的操作或模块,并在必要时进行修改。
A2: 可以通过以下方式优化推理性能:
A3: 使用 GDB 或其他调试工具来调试 C++ 程序。可以通过设置断点、检查变量值和堆栈信息来定位问题。例如:
gdb ./inference
A4: 推理结果通常是一个张量,可以通过访问张量的值来获取模型的输出。例如:
at::Tensor output = module->forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
valgrind 等工具检查内存泄漏,确保程序的内存管理正确。本文详细介绍了如何使用 LibTorch 在 C++ 环境中构建强实时的深度学习推理应用。通过将 PyTorch 模型导出为 TorchScript 格式,并在 C++ 环境中加载和运行这些模型,开发者可以实现更严格的内存管理和线程控制,从而提升推理任务的实时性和性能。希望读者能够将本文所学知识应用到实际项目中,优化系统的实时性能。在实际开发过程中,建议结合具体需求进行调整和优化,确保系统在不同场景下都能表现出色。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online