TensorRT是如何做到架构更快的?( 二 )


TensorRT提供的API叫做AlgorithmSelector 。
3. Plugin当然 , 你对自己设计的算子更有把握,可以自己写Kernel,然后指定使用它 。
不过 , 更多情况下,是因为发现TensorRT不支持某个算子,你才被迫去写Kernel , 毕竟CUDA编程不简单,何况性能还需要足够好 。
4. cuBLAS和cuDNNTensorRT安装指导要求你先安装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了 。
【TensorRT是如何做到架构更快的?】cuBLAS开发的很早,应该是CUDA生态最早的一批库了吧,但是随着深度学习的普及,Nvidia又在生态中加入了cuDNN库,它的层次更高 , 封装了到了网络层,所以其实TensorRT也可以直接调用优化好的cuDNN库中的Kernel?是也不是 。
TensorRT可以选择所谓Tactic(策略)来决定是使用TensorRT写的Kernel还是cuBLAS和cuDNN的 。
5. TacticTensorRT的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
最后送上两幅图,作为总结

TensorRT是如何做到架构更快的?

文章插图
TensorRT工具链
TensorRT是如何做到架构更快的?

文章插图
TensorRT后端优化流程




推荐阅读