算法加速瓶颈
目前,各种卷积神经网络算法在Tensorrt的加速下,inference时间已大幅度的缩短,但后处理部分依然需要在CPU端进行,特别是用于剔除冗余检测框的NMS计算,后处理的耗时往往是inference部分的10倍甚至更多。为了加快算法的整体运算速度,尝试将后处理操作同样迁移至GPU处理。在加速算法的同时,这样做还有一个额外的好处,如果需要在设备上部署系统(算法只是其中一部分),CPU使用率及内存占用的降低可以使系统运行的更流畅。
可行性验证
-
Nv的官方博客Creating an Object Detection Pipeline for GPUs介绍了如何使用C++完成RetinaNet的训练与加速,其中包含了DALI(GPU端图像预处理)、Automatic Mixed Precision on Tensor Cores(混合精度训练)、TensorRT加速与添加NMS_TRT插件等。
-
上述方式只支持c++, 官方论坛python添加nms插件中的回答,验证了使用python在ONNX模型添加NMS插件的可能性。
得益于python的便捷性,选择技术路线2对ONNX模型进行修改。完成.trt
引擎构建后,考虑到c++与python的运算速度差异,使用C++编写引擎部署代码。由于推理以及后处理操作已经被包含至trt引擎中,GPU的计算结果即所需的算法输出,这使得引擎部署代码十分简单。
TensorRT完美的Python、C++接口支持,使得Python修改模型,C++部署引擎这一检测流程最大化的提升了效率,充分利用设备资源。
模型手术
感谢ShiqiYu大佬开源的人脸检测代码并提供源码及ONNX文件。再此基础上,本实验使用onnx graphsurgeon对原始onnx模型进行修改并添加NMS插件以使得inference以及后处理部分在GPU端被计算。完整的技术路线可以被分为模型手术、引擎构建、算法部署三个部分。
-
模型手术
确定ShiqiYu大佬所提供模型的opset版本后,依据后处理代码并查看onnx支持的op对ONNX模型的计算图进行修改,即使用onnx graphsurgeon添加相应的节点以及NMS插件等。完成模型手术后,使用Netron可视化网络结构,关键结构图如下图所示:
-
引擎构建
构建的.trt
引擎视部署设备的不同而不同,不能将不同设备的引擎文件迁移至其他设备使用。本实验所使用的Jetson NX已经默认安装了TensorRT,可以使用trtexec
完成引擎的构建,有几个经常使用的参数:--explicitBatch
在构建引擎时使用明确的batchsize--workspace
以兆字节为单位设置工作区大小,根据模型大小及设备资源设置--fp16
使用FP16精度以提升推理速度--best
自动选择性能最好的精度(FP32,FP16,int8)以提升性能,有坑需谨慎--verbose
引擎转换过程中输出详细的log,不知道报错原因时特别好用!--batch=
如果硬件支持的话,batchsize为32的倍数对于FP16和INT8推断往往具有最佳性能,因为可以使用Tensor Core。
-
算法部署
该步骤需要注意的是:由于使用了trt插件,读取引擎前需要提前导入,避免找不到插件而报错。
trt.init_libnvinfer_plugins(TRT_LOGGER, '')
推理速度及实验结果
实验1:Jetson NX启用15W-6Core
模式并开启 jetson_clocks
model | FP | H(0.75*W) | W | inference_time | total_time | 备注 | 描述 |
---|---|---|---|---|---|---|---|
YuFaceDetectNet_320 | 32 | 240 | 320 | 15.1ms | 30.0ms | opencv_dnn | GPU使用率低 |
YuFaceDetectNet_320 | 32 | 240 | 320 | 15.0ms | 29.5ms | opencv_dnn | onnx-simplifier精简网络结构 |
YuFaceDetectNet_320-trt | 32 | 240 | 320 | 3.4ms | 14.6ms | python | 仅推理部分使用trt加速 |
注:-trt
表示 onnx-slim2tensorrt
实验2:YuFaceDetectNet_320算法的推理及后处理(包含NMS)全部在GPU端进行。
平台 | FP | H(0.75*W) | W | inference_time | total_time |
---|---|---|---|---|---|
Jetson NX | FP32 | 240 | 320 | 3.5ms | 8.2ms |
Jetson Nano | FP32 | 240 | 320 | 9.8ms |
注:total_time包含了图像预处理及绘制detections到原图的过程
下一步计划
YOLOv3,YOLOv5的模型转换在路上,未来会逐步分享模型加速实验