使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

时间:2024-05-23 19:31:36

使用NVIDIA 免费工具TENSORRT 加速推理实践–YOLOV3目标检测
使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
tensorRT5.0之前主要支持计算机视觉类的模型,现在已经升级到TensorRT7.0 ,对语音、语义、自然语言处理等方向的模型也能提供很好的支持。
使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
Nvidia TensorRT 是一种**高性能深度学习推理优化器和运行时加速库 ** ,可为深度学习推理应用程序提供低延迟和高吞吐量。应用场景主要是由于在嵌入式或移动端的GPU性能比较紧张,比如Nano,又希望能够保证快速的推理计算能力。
使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
介绍YoloV3 在没有使用TensorRT和使用TensorRT的对比效果,这里使用的硬件是Tx1,设置batchsize=1,如果没有使用TensorRT 的情况下基本帧率是1FPS,在使用TensorRT的情况下是4.6FPS,提升效果在4倍以上。当batchsize设置的更大的话,tensorRT加速效果更好,作者尝试最多加速到14FPS。

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

使用传统框架和使用TensorRT 显存占比相差很大。这里PPT中提到了TensorRT 内部显存共用机制,需要再查一下。

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

  1. 低精度的数据类型。通过使用FP16或者Int8 数据类型,就可以给数据计算以及存储单元的占比上减少很大的压力。在计算能力较弱的嵌入式或者移动端上,存储单元是非常重要的。因为GPU计算是协处理器,它会把数据从CPU内存到GPU显存之间进行传输。可以减少这部分存储单元的占比。
  2. 动态的张量内存管理。
  3. 多流的执行。
  4. Kernel 自动调整。
  5. 网络层的融合。

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
这页介绍TensorRT 的使用流程,首先由于TensorRT发展比较快,在自己电脑上安装版本经常需要更新,讲师的建议是能用docker尽量使用docker。

  1. 创建builder ,builder 构造器包含了TensorRT 后面所有的tui
  2. 创建network , 保存训练好的神经网络。其实TensorRT 的输入是训练好的模型,(支持所有的框架下的模型),输出是可执行的推理引擎。
  3. 创建Parser,解析network。
  4. 绑定输入、输出以及自定义组件。
  5. 系列化或者反序列化。把前面得到的引擎序列化后,以后再次使用就直接反序列化,不需要再重新执行前面四步骤。
  6. 传输计算数据。从host侧传输到device侧。
  7. 执行计算。
  8. 传输计算结果。从device侧到host侧。

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

讲师推荐的这个版本号不是最新代码,属于适合学习的一个版本代码。
https://github.com/NVIDIA-AI-IOT/deepstream_reference_apps/tree/7f27f22d674c64f4859dd1da896a43e35b0b9063

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
工程中主要包括两部分:一部分是创建推理引擎,一部分是执行推理。

GPU是协处理器,是异步计算,在CPU计算不知道GPU有没有计算完。设置工作空间是避免资源被释放掉。
设置数据类型,可以是INT8,FP16,FP32
序列化,把GPU优化后的引擎给写成一个文档,写到我们的硬盘上。 序列化上有个潜在的机制,TensorRT在同一个型号的设备上是通用的,但是在不同架构上是不通用的。比如在服务器上优化后序列化的引擎,直接拿过来在其他设备上比如Nano、TX2直接反序列化是不行的。

对于如果模型中在优化中存在TensorRT不支持的网络层,需要用plugin的方式去实现。主要有两个部分,一个是PluginFactory,一个是MyPlugin。

PluginFactory 是一个接口。

代码讲解

三种大的方式去创建引擎:

  1. 通过解析器来解析已有的网络。比如CaffeParser,OnnxParser,UFFParser。在官方document 有对应样例说明。
    2.用已经集成TensorRT的框架,比如TensorFlow。
  2. 基于TensorRT 自己去搭建网络模型。优点是灵活,缺点是需要有一定的TensorRT基础和实现能力。

trt-yolo-app.cpp main函数 --> yolo.cpp 创建yoloengine --> pluginfactory.cpp 如何定义plugin --> yoloplugin-lib.cpp 操作plugin具体运算–> yolov3.cpp 执行推理

DeepStream

使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测

TLT
使用NVIDIA 免费工具TENSORRT 加速推理实践--YOLOV3目标检测
TLT 可以直接提供出一个中间文件,这样TensorRT可以反序列化为推理引擎。(只能通过TLT 得到的文件,才能反序列化吗?)


资源

https://developer.nvidia-china.com/
https://www.nvidia.cn/content/dam/en-zz/zh_cn/assets/webinars/2020/jan08/1578537190017633564.mp4
https://www.nvidia.cn/developer/online-training/dli-community-training/

视频链接:
https://www.bilibili.com/video/av91148721/
PPT 地址
https://pan.baidu.com/s/1KVmYJoTojfX7BcJlhuSHbA
提取码:8x5w

FAQ

图像的预处理,包括拉流、编解码,推荐使用deepstream 。
视频回放放在优酷上。
网络剪枝推荐使用TLT