TENSORRT:深度学习推理加速

TENSORRT:深度学习推理加速

1.TensorRT概述

深度学习应用开发的两个阶段

  • 训练:利用训练数据生成和优化网络模型
  • 推理:把网络模型集成到应用程序,输入现实数据,得到推理结果

TensorRT深度优化了推理的运行效率

  • 自动选取最优kernel
    矩阵乘法、卷积有多种CUDA实现方式,根据数据大小和形状自动选取最优实现
  • 计算图优化
    通过kernel融合、减少数据拷贝等手段,生成网络的优化计算图
  • 支持fp16/int8
    对数值进行精度转换与缩放,充分利用硬件的低精度高通量计算能力

TENSORRT的加速效果:

  • ResNet50 (输入1080p) 运行于T4
    fp32: 1.4x
    fp16: 6.4x (fp16 vs fp32: 4.5x)
  • EDVR (输入176×144) 运行于T4
    fp32: 1.1x
    fp16: 2.7x (fp16 vs fp32: 2.4x)

不同模型的加速效果不同,卷积模型加速较显著,含大量数据拷贝(slice/transpose)的模型加速效果一般,且fp16无明显帮助

2.快速上手TENSORRT

1)通过框架内部集成的TRT。TF-TRT/MXNet-TensorRT/TRTorch
易于使用,但远未达到最佳效率。
2)从现有框架导出模型(ONNX),再导入TRT。难度适中,效率尚可,但需要解决的问题:如何导出,如何导入。
3)使用TRT C++/Python API自行构造网络。兼容性最强,效率最高,难度最高。

普遍采用方法2,简单易上手。

2.1TRT编程流程

2.2从框架导出ONNX

ONNX是中立的计算图表示,可从PyTorch,TensorFlow(借助tf2onnx)和MXNet导出。
一般情况下,导出的ONNX仍具备运行能力。有时不能直接运行,而是需要补充ONNX Runtime。但“ONNX Runtime能支持运行”并不是“可被TRT顺利导入”的先决条件。
以PyTorch为例

2.3用PARSER将ONNX导入TRT

TRT官方开发包自带trtexec

trtexec的功能也可以自己编程实现,但是一般没必要:基本功能容易实现,但可配置的参数较多。
若trtexec运行成功,说明ONNX成功导入TRT:以TRT自有的层重建了等价的计算图,且计算图被构建为TRT engine,并保存成文件。

2.4运行ENGINE

加载engine文件,提供输入数据,即可运行。
注意事项:
对比TRT与原框架的计算结果a b,计算相对误差均值(avg(abs((a-b)/a)))
理想情况:fp32在1e-6数量级,fp16在1e-3数量级

正确测量加速比:
1)用cuda event:注意stream要设置正确
2)较粗略的简易方法:
gpu sync; 取t0; 启动gpu程序; gpu sync; 取t1,得t1- t0

2.5使用FP16/INT8加速计算

TRT后端的计算模式默认使用fp32。可在Volta以及更新的GPU上设置使用fp16/int8,输入数据保持不变。
使用fp16较为简单,设置标志即可:

对于EDVR,用ONNX导出的模型:
1)fp32: 0.9x
2)fp16: 1.8x

API搭建:1.1x/2.7x。API搭建效果更好。

建议使用fp16,加速效果较好。

使用int8需要校正数据集:float向int8转换需要量化,调整weight精度,校正数据集会让量化尽可能准确。

2.6总结与建议

对于初级用户,推荐试用框架集成的TRT,尝试加速效果,效果一般。
对于中级用户,用ONNX Parser导入模型,可能需要自定义Plugin。
对于高级用户,推荐使用网络定义API,实现完全迁移,需要了解参数格式。
推荐使用混合精度,fp16只需略微修改代码,明显提高速度,对精度影响较小。int8有更高的计算性能,一般会有精度下降。

2.7补充TensorRT Api示例(TRT 8.2 Wenet encoder)

3.比赛

英伟达TensorRT加速AI推理Hackathon 2021 —— Transformer模型优化赛

参赛队伍源码链接

本次参加英伟达官方比赛,学习了TensorRT的应用,收获良多。

发表评论

邮箱地址不会被公开。 必填项已用*标注