tensorRT推理相关及遇到的坑

TensorRT是一个由NVIDIA提供的高性能深度学习推理优化工具,它可以提升模型运行速度,支持INT8和FP16计算,并对网络结构进行优化以适应GPU。在不同显卡和模型上,加速效果不同。在实践中,可能会遇到不支持的算子、ONNX模型转换问题,以及TensorRT版本对INT8量化结果的影响。解决这些问题通常需要调整模型、转换工具或TensorRT版本。
摘要由CSDN通过智能技术生成
  1. tebsorRT是什么

tensorRT是NVIDIA出的一个高性能深度学习推理(inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxnet、Pytorch等几乎所有的深度学习框架,将TensorRT和NVIDIA的GPU结合起来,能在几乎所有的框架中进行快速和高效的部署推理。

  1. 为什么能加速模型运行速度

TensorRT是英伟达针对自家平台做的加速包,TensorRT主要做了这么两件事情,来提升模型的运行速度。一个是支持INT8和FP16的计算。深度学习网络在训练时,通常使用 32 位或 16 位数据。TensorRT则在网络的推理时选用不这么高的精度,达到加速推断的目的。
第二个是TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了一起,针对GPU的特性做了优化。现在大多数深度学习框架是没有针对GPU做过性能优化的,而英伟达,GPU的生产者和搬运工,比如一些层在水平方向与深度方向都会做一定的合并,从而加速。

TensorRT具体加速效果决定于显卡和模型,例如在3080ti上resnet50从pytorch转TensorRT可以加速10倍,但是yolov5只能加速一倍多。
另外,TensorRT能做int8和fp16推理要看gpu是否支持,例如新3080ti支持int8和fp16推理,老tesla t4卡就只能做int8推理,更老的卡都不支持了。
TensorRT对网络推理的优化其实远不止CBR(conv、BN、Relu)合并这么简单,还会做Gemm、Winograd、cudnn kernel选择等一系列优化操作,然后遍历选取运行时间最短的cudnn api(打开日志verbose就能看到)。

  1. 实践中遇到的坑
    根据onnx模型生成trt的过程,如果遇到不支持的算子,有的时候报错反卷积和卷积操作不支持,就比较离谱了,这个时候通常是环境问题,以及onnx导出时的torch版本,我用8.4.2.4的tensorRT版本,torch1.9,op12导出onnx模型,可以将模型序列化为trt,但在反序列化推理的时候会报错Error Code 3: API 使用错误:
    在这里插入图片描述
    解决方法:
    用低版本1.5的torch及op为9的版本,导出onnx模型,推理报错问题解决。
    另外,tensorRT是不支持ATen操作的,模型网络结构只是一些矩阵的切片索引乘法,用低版本导出时就会包含ATen这个操作,奇怪,不知道为啥会有这个操作,见如下结构:
    在这里插入图片描述
    onnx包含ATen算子,tensorRT就会报错如下,然后运行卡住,异常退出:
    在这里插入图片描述
    最后将产生ATen这个操作的放在后处理,onnx去掉这部分,导出后,即可成功运行。
    注意:代码中声明的变量buffers, buffers的个数是输入加输出的总数,我的模型为1个输入,4个输出,所以声明如下:
void* buffers[5];

另外,模型推理时,如果没做预处理,送进推理的数据类型是U8C3时,推理也会异常退出,不会告诉你是哪里的问题,需要自己一步一步debug, 看各个步骤结果是否符合预期,tensorRt官方给出的栗子可以好好研究一下,有一篇非常详细的源码解读文章,一定要看一下,方便自己魔改:
https://blog.csdn.net/yanggg1997/article/details/111587687

在把int8的量化集成到自己工程中时,发现ubuntu系统的int8量化与win端结果不一致,相差很多,比如,python结果0.4114,ubuntu tensorRt量化后的结果0.37, 而win端量化前后的结果就是0.4114->0.4153,以为是自己细节哪里实现有问题,但是把预处理完的数据打印出来,值都一模一样,量化完结果就不一致了,最后定位到是tensorRT版本不一致造成的,这也是比较坑的一点,原来不同的tensorRt版本int8量化都会有这么大的差异,最后,在ubuntu系统上,下载和windows端一致的tensorRt 8.4.2.4版本,改变之前使用的8.2版本,量化后结果一致。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位不愿暴露自己的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值