
如何使用Tensorrt C ++ API进行高性能GPU机器学习推理。
支持具有单个 /多个输入的模型和带有批处理的单个 /多个输出。
项目概述视频。代码深度参考视频
该项目正在积极寻求维护者,以帮助指导其增长和改进。如果您对这个项目充满热情并且对贡献感兴趣,我很想听听您的来信!
请随时通过LinkedIn与您联系,以讨论如何参与其中。
我读了所有的nvidia tensorrt文档,所以您不必这样做!
该项目演示了如何使用Tensorrt C ++ API作为图像数据上的高性能GPU推断。它涵盖了如何执行以下操作:
以下说明假定您使用的是Ubuntu 20.04或22.04。您将需要为此示例代码提供自己的ONNX模型,或者可以下载示例模型(请参见下面的SANITY检查部分)。
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (用于记录)./scripts/中提供的build_opencv.sh脚本。CUDNN_INCLUDE_DIR和CUDNN_LIBRARY变量。CMakeLists.txt文件,然后用Tensorrt安装的路径替换TODO 。mkdir buildcd buildcmake ..make -j$(nproc)./run_inference_benchmark --onnx_model ../models/yolov8n.onnx./run_inference_benchmark --trt_model ../models/yolov8n.engine.NVIDIAGeForceRTX3080LaptopGPU.fp16.1.1YOLOv8n模型。pip3 install ultralytics 。 from ultralytics import YOLO
model = YOLO ( "./yolov8n.pt" )
model . fuse ()
model . info ( verbose = False ) # Print model information
model . export ( format = "onnx" , opset = 12 ) # Export the model to onnx using opset 12yolov8n.onnx (在./models/目录中)放置。./inputs/team.jpg中的图像运行推理应产生以下功能向量: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
启用INT8精度可以进一步加速推断,以减少动态范围而导致的准确性降低成本。对于INT8精度,用户必须提供校准数据,该数据代表了该模型将看到的真实数据。建议使用1K+校准图像。要使用Yolov8 Sanity检查模型启用INT8推断,必须采取以下步骤:
options.precision = Precision::FP16; to options.precision = Precision::INT8;在main.cpp中options.calibrationDataDirectoryPath = "";必须在main.cpp中更改以指定包含校准数据的路径。wget http://images.cocodataset.org/zips/val2017.zip下载该数据集。Int8EntropyCalibrator2::getBatch方法中的engine.cpp (请参阅TODO )中的调整代码适合您的模型。.calibration扩展),以便在随后的模型优化下可以重复使用。如果您想重新生成校准数据,则必须删除此缓存文件。Options.calibrationBatchSize ,以便整个批次可以适合您的GPU内存。基准在RTX 3050 Ti笔记本电脑GPU上运行,第11代英特尔(R)Core(TM)I9-11900H @ 2.50GHz。
| 模型 | 精确 | 批量大小 | AVG推理时间 |
|---|---|---|---|
| Yolov8n | fp32 | 1 | 4.732毫秒 |
| Yolov8n | FP16 | 1 | 2.493毫秒 |
| Yolov8n | INT8 | 1 | 2.009毫秒 |
| yolov8x | fp32 | 1 | 76.63毫秒 |
| yolov8x | FP16 | 1 | 25.08 ms |
| yolov8x | INT8 | 1 | 11.62毫秒 |
想知道如何将该库集成到您的项目中?或者也许如何读取Yolov8模型的输出以提取有意义的信息?如果是这样,请查看我的两个最新项目,即Yolov8-Tensorrt-CPP和Yolov9-Tensorrt-CPP,这些项目演示了如何使用Tensorrt C ++ API运行Yolov8/9推断(支持对象检测,语义段,身体姿势估计和身体姿势估计)。他们在后端使用了这个项目!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine中。我在整个代码中都写了很多评论,这应该使您很容易理解发生了什么。include/engine/EngineRunInference.inl中。include/engine/EngineBuildLoadNetwork.inl中。该实现使用spdlog库进行记录。您可以通过将环境变量LOG_LEVEL设置为以下值之一来更改日志级别: trace , debug , info , warn , error , critical , off 。
如果您从ONNX模型中创建Tensorrt引擎文件的问题,请考虑设置环境变量LOG_LEVEL以trace并重新运行应用程序。这应该为您提供有关构建过程失败的何处的更多信息。
如果这个项目对您有所帮助,我将不胜感激,如果您能给它一个明星。这将鼓励我确保它是最新的,并迅速解决问题。如果您需要更多的具体帮助,我也会做咨询工作。在LinkedIn上与我联系。
Loic Tetrel | Thomaskleiven | 威辛 |
v6.0
v5.0
Engine类以使用模板参数,该参数指定了模型输出数据类型。现在,该实现支持类型float , __half , int8_t , int32_t , bool和uint8_t的输出。Options为模型设置(例如,如果您的模型已针对FP32编译为FP32,但是您尝试运行FP16推断,它将失败,可能没有杂语错误)。v4.1
v4.0
v3.0
IExecutionContext::enqueueV3() )。driver已重命名为run_inference_benchmark ,现在必须以命令行参数为ONNX模型。Options.doesSupportDynamicBatchSize 。doessupportdynamicbatchsize。现在实现自动检测支持的批量大小。Options.maxWorkspaceSize 。现在,实现在模型构建过程中不限制GPU内存,从而允许实现使用与中间层可用的尽可能多的内存池。v2.2
v2.1
v2.0
Options.optBatchSizes已被删除,由Options.optBatchSize替换。谢谢这些好人(表情符号钥匙):
该项目遵循全企业规范。欢迎任何形式的贡献!