TensorRT干货总结

TensorRT干货总结
1、 TensorRT的安装
2、 Pytorch生成engine
3、 TRT推理实战

1、 TensorRT的安装
1) Xavier
Xavier上安装了DeepStream,DeepStream里包含了TensorRT,DeepStream应用程序将深度神经网络和其他复杂的处理任务引入到流处理管道中,以实现对视频和其他传感器数据的近实时分析。从这些传感器中提取有意义的见解为提高运营效率和安全性创造了机会。例如,摄像头是当前使用最多的物联网传感器。在我们的家中,街道上,停车场,大型购物中心,仓库,工厂中都可以找到相机–无处不在。视频分析的潜在用途是巨大的:访问控制,防止丢失,自动结帐,监视,安全,自动检查(QA),包裹分类(智能物流),交通控制/工程,工业自动化等。
更具体地说,DeepStream应用程序是一组模块化插件,这些插件相连接以形成处理管道。每个插件代表一个功能块,例如,使用TensorRT进行推理或多流解码。硬件加速的插件与基础硬件(如果适用)交互以提供最佳性能。例如,解码插件与NVDEC交互,推理插件与GPU或DLA交互。每个插件可以根据需要在管道中实例化多次。
在这里插入图片描述

2) PC
(1) 查看cuda和cudnn版本
在这里插入图片描述

(2) 根据cuda版本和ubuntu/windows,在https://developer.nvidia.com/nvidia-tensorrt-8x-download这个链接中选择对应的版本下载下来,一解压就装上了。
在这里插入图片描述

如果是Win10,把bin目录和lib目录添加到环境变量中,重启电脑。
在这里插入图片描述

如果是linux:

在这里插入图片描述

再source ~/.bashrc
(3) 测试
在这里插入图片描述

在这里插入图片描述

注意:TRT Builder生成的模型文件(plan file)不是跨平台的,比如在server gpu上生成的plan file不能在板子上跑。同样是server上的卡,跨架构也是不行的。在Tesla T4上生成的,不能在P40上跑。相同架构的卡是可以的,P40上生成的,可以在P4上跑,但会报warning。

2、 Pytorch生成engine
在这里插入图片描述

常用路线是pytorch -> onnx -> engine/trt/plan,pytorch转成onnx(略)。
Onnx转成engine有2种方式:
1) 使用代码编写
在这里插入图片描述
在这里插入图片描述

一些术语:
Builder(网络原数据):模型搭建的入口,网络的tensorRT内部表示以及可执行程序引擎都是由该对象的成员方法生成的
BuiderConfig(网络原数据的选项):负责设置模型的一些参数,如是否开始fp16模式,in8模式等等
Network(计算图内容):网络的主体,在使用api搭建网络的过程当中,将不断地向其中添加一些层,并标记网络的输入输出节点,在其他两种workflow中,则使用Parser来加载来自Onnx文件中的网络,就无需一层一层手工添加
SerializedNetwork:模型网络在TRT中的内部表示,可用它生成可执行的推理引擎或者把它序列化保存为文件,方便以后读取和使用
Engine:推理引擎,是模型计算的核心,可理解为可执行程序的代码段
context:用于计算GPU的上下文。类比于cpu上的进程概念进程,是执行推理引擎的主体
buffer相关(数据的内存、显存相关):我们将需要把数据从cpu端搬到gpu端,执行推理计算后,再把数据由gpu端搬回cpu端。这些步骤涉及内存的申请、拷贝和释放,需要借助CUDA库或者扩大python库才能完成
excute:调用计算核心执行推理计算的具体过程
善后工作:还有一些外围的工作需要手工去完成

builder用于生成engine的步骤被称为序列化(serialize),engine用于tensorrt的推理模式时的操作被称为反序列化(deserialize),序列化的目的主要起到转换模型使其适用于Tensorrt的框架,并可以将转换后engine保存,用于后续推理。(序列化常常会花费一段时间大约几分钟,所以在真正使用时我们常常先生成engine保存文件,以后在推理时可以直接调用。不同的机器通常需要在本地生成相应的engine文件,毕竟调用的硬件或者库文件位置可能不同,相关优化也就不一样)。
在这里插入图片描述
在这里插入图片描述

2) 利用trtexec工具
首先将trtexec的路径放到环境变量中
在这里插入图片描述

在这里插入图片描述

trtexec  --onnx=onnx的路径  --saveEngine=engine的名字  --fp16/int8/best
--best 参数,相当于 --int8 --fp16 同时开。
一般来说,只开 fp16 可以把速度提一倍并且几乎不损失精度;但是开 --int8 会大大损失精度,速度会比 fp16 快,但不一定能快一倍。
这里不推荐使--int8,因为trtexec校准就象征性做了一下,真想自己部署 int8 模型还得自己写校准。
--useDLACore=0  --allowGPUFallback是将DLA上支持的算子转移到DLA上,如卷积、池化等,对不支持的算子采用GPU回退模式。
--shapes=onnx输入节点名称:1x3xHxW用在动态batch的onnx,例如:
--shapes=0:1x3x512x512,其中0就是onnx的输入节点名称,H为512、W为512。

在这里插入图片描述

生成成功会显示PASSED。
在这里插入图片描述

多次 inference 后统计并报时。报时会报很多个, Enqueue Time 是 GPU 任务排队的时间,H2D Latency 是把网络输入数据从主存 host 拷贝进显存 device 的时间,D2H Latency 是把显存上的网络输出拷贝回主存的时间,只有GPU Compute Time 是真正的网络 inference 时间。
3、 TRT推理实战
以yolox为例
在这里插入图片描述

在这里插入图片描述

运行命令:

./yolox  ../yolox_x_1018.engine  -i  ../../../../assets/cyline_20220607111827.avi

TensorRT官方文档给的实例化logger:
在这里插入图片描述
 
 
 

参考资料:
1、 https://blog.csdn.net/Tosonw/article/details/104154090
2、 https://zhuanlan.zhihu.com/p/502032016
3、 https://zhuanlan.zhihu.com/p/527238167
4、 https://zhuanlan.zhihu.com/p/571164208
5、 https://zhuanlan.zhihu.com/p/467239946
6、 https://blog.csdn.net/qq_36936443/article/details/124458745(这个链接解释的很详细)
7、 https://blog.51cto.com/u_11495341/3036153
8、 英伟达tensorrt官方文档链接https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值