以下内容将对 tensorRT_Pro 项目做一个系统的介绍,包括其核心价值、主要功能、应用案例以及关键的示例代码(附详细解释),帮助你快速了解并上手如何基于 TensorRT 在 NVIDIA GPU 上实现高性能推理。
GitHub - shouxieai/tensorRT_Pro: C++ library based on tensorrt integration
tensorRT_Pro 是由开发者 shouxieai 维护的一个 TensorRT 实践项目集合,旨在提供 在 NVIDIA GPU 上部署深度学习模型 的高效方案示例。该仓库涵盖了 图像分类、目标检测、实例分割 等常见任务,通过示例代码演示如何从原始模型(如 ONNX、PyTorch)转换到 TensorRT Engine,并完成推理、后处理、可视化等全流程。
不同模型的部署流程大同小异,一般分为以下几个步骤:
环境准备:
README.md
获取依赖说明。模型转换:
.pt
)或其他框架模型为起点,先导出到 .onnx
格式。.onnx
模型文件。构建 TensorRT Engine:
.onnx
转换成 .engine
。推理和后处理:
.engine
并执行推理。性能分析:
以下以 YOLOv5 推理为例,说明如何利用 tensorRT_Pro 在 C++ 下完成从 ONNX 到推理的完整流程。
tensorRT_Pro
├── YOLOv5
│ ├── CMakeLists.txt // YOLOv5的编译配置
│ ├── yolov5.cpp // 生成engine & 推理主流程
│ ├── plugins // 自定义插件或后处理代码
│ ├── ...
│ └── README.md // 该模块的使用说明
├── SSD
├── Classification
├── ...
└── README.md
实际项目结构可能略有不同,但通常每个模型都有独立的目录和编译脚本。
在 YOLOv5
目录下,一般会提供一个可执行文件(例如 yolov5
),可通过命令来进行模型转换和推理。典型命令如下:
# 在 YOLOv5 目录中
mkdir build && cd build
cmake ..
make -j
# 生成可执行文件 yolov5
# 先转换 ONNX -> TensorRT Engine
./yolov5 -s yolov5s.onnx yolov5s.engine
# 再用生成的 engine 进行推理
./yolov5 -d yolov5s.engine
-s
:序列化 (serialize),将 .onnx
转为 .engine
-d
:推理 (detect / inference)以简化的 C++ 代码片段为例,展示如何在 tensorRT_Pro 中进行推理(详细实现可参考项目内的完整源代码)。
(1) 反序列化引擎:
#include
#include
#include
nvinfer1::ICudaEngine* loadEngine(const std::string& enginePath) {
std::ifstream engineFile(enginePath, std::ios::binary);
if (!engineFile.good()) {
std::cerr << "Error reading engine file" << std::endl;
return nullptr;
}
engineFile.seekg(0, std::ios::end);
size_t fsize = engineFile.tellg();
engineFile.seekg(0, std::ios::beg);
std::vector engineData(fsize);
engineFile.read(engineData.data(), fsize);
engineFile.close();
// 创建TensorRT 运行时
nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(gLogger);
// 反序列化 engine
nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(engineData.data(), fsize, nullptr);
runtime->destroy();
return engine;
}
.engine
文件读入内存,再通过 IRuntime->deserializeCudaEngine()
生成 ICudaEngine
对象。(2) 创建执行上下文并推理:
void doInference(nvinfer1::ICudaEngine* engine, const cv::Mat& inputImg) {
nvinfer1::IExecutionContext* context = engine->createExecutionContext();
// 假设输入形状为 (1, 3, 640, 640)
int inputIndex = engine->getBindingIndex("images");
int outputIndex = engine->getBindingIndex("output");
// 数据预处理 (缩放、归一化、HWC->CHW 等)
// 这里只演示简要流程
cv::Mat resizedImg;
cv::resize(inputImg, resizedImg, cv::Size(640, 640));
resizedImg.convertTo(resizedImg, CV_32FC3, 1/255.0);
std::vector inputData(1 * 3 * 640 * 640);
// 将数据排布为 NCHW
// ...
// 分配 GPU buffer
void* buffers[2];
size_t inputSize = 1 * 3 * 640 * 640 * sizeof(float);
size_t outputSize = /* 根据实际网络输出大小做判断 */;
cudaMalloc(&buffers[inputIndex], inputSize);
cudaMalloc(&buffers[outputIndex], outputSize);
// 拷贝到 GPU
cudaMemcpy(buffers[inputIndex], inputData.data(), inputSize, cudaMemcpyHostToDevice);
// 推理执行(异步或同步)
context->enqueueV2(buffers, 0, nullptr);
// 拷贝输出到CPU
std::vector outputData(outputSize / sizeof(float));
cudaMemcpy(outputData.data(), buffers[outputIndex], outputSize, cudaMemcpyDeviceToHost);
// 后处理(解析检测框、NMS等)
// ...
// 释放资源
cudaFree(buffers[inputIndex]);
cudaFree(buffers[outputIndex]);
context->destroy();
}
enqueueV2
在 CUDA 流 上执行推理。丰富的示例模型
多精度支持
可移植性与扩展性
学习曲线相对平滑
tensorRT_Pro 作为一个 开源的 TensorRT 部署示例集合,为开发者提供了清晰、实用的模板,用于在 NVIDIA GPU 平台上 快速、高效 地部署深度学习模型。其核心价值在于:
如果你正寻找一套 C++ 端 / Python 端 的高性能推理解决方案,或想将现有的深度学习模型 迁移 到 NVIDIA GPU 以实现低延迟、高吞吐量,那么 tensorRT_Pro 将会是一个非常值得借鉴的项目。
【哈佛博后带小白玩转机器学习】 哔哩哔哩_bilibili
总课时超400+,时长75+小时