TensorRT是如何做到架更快的?聊聊知乎还没人谈到的内核部分

作者 | 糯盐  编辑 | 极市平台

原文链接:https://zhuanlan.zhihu.com/p/666638357

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【模型部署】技术交流群

本文只做学术分享,如有侵权,联系删文

导读

 

文章总结了TensorRT工具链以及TensorRT后端优化流程。 

一. 是什么?

2016年Nvidia为自家GPU加速推理而提供的SDK,人们有时也把它叫做推理框架。

二. 为什么?

只有Nvidia最清楚自家GPU或DLA该如何优化,所以TensorRT跑网络的速度是最快的,比直接用Pytorch快N倍。

6719483e1b22207b95ab3dbd65375ed1.jpeg
遥遥领先的TensorRT

三. 怎么做到的?

1. 搜索整个优化空间

与Pytorch等其它训练框架最大区别是,TensorRT的网络优化算法是基于目标GPU所做的推理性能优化,而其它框架一方面需要综合考虑训练和推理,更重要的是它们没有在目标GPU上做针对性的优化。

TensorRT又是如何针对目标GPU优化的呢?

简单讲就是在可能的设计空间中搜索出全局最优解

这个搜索空间有哪些变量呢?

比如CUDA架构中的编程模型所对应的,将tensor划分为多少个block?以及这些block如何组织到Grid中

2b2393360ba6c169eb21c6460fccf49e.jpeg
任务被划分为多个Block
bf5a26c10d2575eae0f6fa20d9dd54f0.jpeg
Block以Grid的方式组织起来
88a3a66a1ee22c37e591a86af7852e56.jpeg
不同的组织层次以对应不同的存储体系结构中的不同存储器

再举例,使用什么样的指令完成计算,可能是FFMA、FMMA,可能是TensorCore指令...

更难的部分可能是tensor数据流的调度,把他们放在local、share还是global memory呢?如何摆放呢?

这些变量组合在一起是一个巨大的搜索空间,可能你的CPU计算几天也得不出个结果来。

但是我们知道神经网络的计算是由一个个粒度更大的算子组成的,算子上面还有粒度更大的层结构。我们也清楚地知道层与层之间相对独立,也就是说可以针对每层计算优化,最后把优化后的层串在一起大概率就是网络的全局最优解。

于是,TensorRT预先写了很多算子和层(CUDA Kernel)。当然这些算子的输入和输出tensor是可以配置的,以适应网络输入和输出的不同以及GPU资源的不同。

124ae18ed616292d941c2a69b613213f.jpeg
部分优化好的算子

搜索空间变小了,从原来的指令级别的搜索,上升到了算子级别的搜索。因为这些实现都是用CUDA kernel所写,更准确的说是Kernel级别的搜索了。

但是tensor数据流的调度问题并没有解决,这也是最关键和复杂的地方。我们应该将输入tensor划分为多少个Block呢?这些Blocks应该分配给多少个线程呢?tensor存储在哪呢?local/share/global memory的哪些地方呢?中间计算结果存储在哪里呢?

对于计算部分是可以通过模拟的方式(类似指令集仿真器)计算得到性能的,但是tensor数据流在share/L2/Global Memory的流动过程就很难通过仿真计算得到精确结果,因为要被模拟的数据量和线程数过大,何况要尝试的可能性还很多,靠CPU仿真计算的思路就别想了。唯一办法就是让候选算子在目标GPU上直接跑跑,统计出性能,最后通过比对选出最优解。TensorRT把这个过程叫做Timing,TensorRT甚至可以将优化的中间过程存储下来供你分析,叫做timing caching(通过trtexec --timingCacheFile=<file>)。

4a6438dff4d69b897f5b1b887a1e36a4.jpeg
Nvida GPU memory架构

以上所描述的优化过程可以叫做Hardware Aware Optimazation

总结起来优化器会重点分析:

  • Type of hardware(Hardware capability...)

  • Memory footprint(Share, Cache, Global...)

  • Input and output shape

  • Weight shapes

  • Weight sparsity

  • Level of quantization (so, reconsider memory)

而这些是Pytorch等框架不会去深入挖掘的,尤其是对存储系统的优化。

2. 强制选择Kernel

由于Block之间线程的运行顺序是随机的,CPU可能在向GDDR/HBM读写数据,甚至GPU的时钟频率也在随负载的变化而变化,这导致了不同系统运行环境下GPU的性能表现会有差异。这种差异也可能导致TensorRT Timing的最优解不是实际推理时的最优解,可能选择了次优的Kernel。

TensorRT提供了一个补救方法,就是强制指定选择某个Kernel实现,如果你很确信它是最优解的话。

TensorRT提供的API叫做AlgorithmSelector

3. Plugin

当然,你对自己设计的算子更有把握,可以自己写Kernel,然后指定使用它

不过更多情况下,是因为发现TensorRT不支持某个算子,你才被迫去写Kernel,毕竟CUDA编程不简单,何况性能还需要足够好。

4. cuBLAS和cuDNN

TensorRT安装指导要求你先安装CUDA SDK和cuDNN

CUDA SDK需要安装是显而易见的,因为TensorRT所调用的Kernel需要NVCC编译器来编译成Nvidia GPU的汇编指令序列啊

但是CUDA SDK中还有一个cuBLAS库也是被TensorRT所依赖的,我们知道C++库BLAS(Basic Linear Algebra Subprograms),它是针对CPU进行的线性代数计算优化,那么cuBLAS就是针对CUDA GPU开发的线性代数计算库,它的底层当然也就是用CUDA Kernel写成的。典型的矩阵乘法算子就可以直接调用cuBLAS了。

cuBLAS开发的很早,应该是CUDA生态最早的一批库了吧,但是随着深度学习的普及,Nvidia又在生态中加入了cuDNN库,它的层次更高,封装了到了网络层,所以其实TensorRT也可以直接调用优化好的cuDNN库中的Kernel?是也不是

TensorRT可以选择所谓Tactic(策略)来决定是使用TensorRT写的Kernel还是cuBLAS和cuDNN的

5. Tactic

TensorRT的Tactic能决定很多优化选项

例如,每次timing某个算子时需要平均的运行次数。缺省TensorRT会运行四次,以降低不确定性带来的误差,但这个次数是可以修改的。

还可以决定上面提到的Kernel库的选择,Plugin的选择,GPU时钟频率锁定等。

6. 量化

TensorRT当然具备网络量化能力,提供了将全网都量化到int8的隐性量化方式,也提供了插入Q/DQ Layer的显性量化方式。

混合量化是Nvidia做的很优秀的地方,这对于高效利用计算资源起到了重要作用,不过,这个另外的话题,以后有机会再谈。

7. 多应用推理和多卡推理

其实这才是Nvidia强悍的地方,在友商都在谈单卡性能时,其实多卡或多节点才是Nvidia的杀手锏

另外,对于单卡性能富余的情况下,可能希望有多个流并行推理,这个对于TensorRT来说也是必须支持的

四. TensorRT的内核到底是什么?

答:根据网络、输入、输出tensor、目标GPU的资源,通过实际运行,在候选Kernel库中择优的一个Hardware Aware优化器。

五. 编译器

最后,如果非要套用编译器前后端理论的话,上述谈到的部分应该属于编译器后端部分了,因为它已经和底层硬件息息相关了。只不过它逻辑上处于于NVCC这个实体编译器的上层。而编译器前端,也就是与硬件不相关的图融合部分是也是在TensorRT的Builder内完成的。

好了,如果你对AI编译器还不了解,可以看下面这篇入门文章

https://zhuanlan.zhihu.com/p/632648673

最后送上两幅图,作为总结

49cb2ed44009cb5748b7a4d84fa9a292.jpeg
TensorRT工具链
3dc8aff20f3d1194f563b1c64d19d23d.jpeg
TensorRT后端优化流程

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署协同感知语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

7972233a902d97cfedd0d4c219e95d58.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

86b8f59be70b11a4000ba5adc3a9cdb5.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

8afeee80d88e2e6019cdf67ab47b7e74.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

1b64788b6b85da907d24ad7ea01c1e24.jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值