在DL模型的实际部署中,考虑到应用场景和对latency的高要求,出现了inference engine的概念,需要将训练好的各框架的模型部署到inference engine中提升模型的推理效率,可以充分利用硬件计算能力提升设备潜力,TensorRT就是NVIDIA针对GPU开发出的一款inference engine;
TensorRT基础概念

- 关于DL model training和inference过程的区别:
- 在模型的training过程中,主要包括forward和backward两个阶段,由于需要反向传播误差来更新权重,期间需要存储大量的中间结果,常用的加速训练的方式主要是多GPU分布式训练,这是很消耗计算资源的成本很高;
- inference过程比较单一,不需要存储中间结果,模型只需要顺序做一次计算就行,在实际部署中对计算资源需求不大,但是当前很多场景对实时性要求很高,因此希望在计算设备上inference尽可能地快,TensorRT的出现就是为了优化提升inference的性能;
- TensorRT的作用域和部署结构:
- TensorRT是一个只做inference的deep learning框架,其输入为各深度学习框架的训练模型;
- TensorRT会对模型结构进行解析,并对模型进行优化和结构重组;
- TensorRT的输出为deployment-ready runtime engine,配合着TensorRT的Runtime可以将优化后的推理模型部署到GPU各硬件平台;

- TensorRT优化策略:
- Layer & Tensor Fusion:在inference过程中输入输出数据的读写占用大量的时间,此时数据搬运的带宽就成了计算性能的瓶颈,同时GPU的计算资源也没有得到充分的利用,因此采用layer fusion的方式来减少layer数目,不仅可以提升CUDA core的利用率同时精简了整个模型结构使得inference更高效;
- Kernel Auto-Tuning:这部分的优化策略涉及到CUDA core的具体调用,是指TensorRT在针对不同模型不同硬件环境自动调整CUDA core的计算调用从而达到最优的计算性能;
- Multi-Stream Execution:TensorRT针对GPU的底层优化,可以并行处理输入数据流;
- Dynamic Tensor Memory:TensorRT会在inference阶段为每一个Tensor指定显存,可以优化显存的占用提高显存复用率;
- Precision Calibration:在训练过程中tensor通常都是FP32,这样可以保证训练时候的反向传播的精度,在inference阶段可以在保证计算精度很小损失的情况下降低数据精度,从而减少模型数据量内存占用量提升latency时间,将FP32转换成FP16和INT8肯定是有精度损失的,但是TensorRT可以自动化进行模型的校准,保证在FP32转INT8的过程中最小化性能损失;

TensorRT的 interface
- Network Definition:主要功能是为定义优化网络提供接口;
- Builder:主要功能是从定义的网络创建一个优化engine;
- Engine:主要功能是允许应用程序执行inference过程;
- TensorRT的Parser:CaffeParser、UFFParser、ONNXParser
TensorRT workflow


- TensorRT主要有build engine和engine deployment两个阶段:
- build:输入训练好的模型文件,经过优化和进度校准输出针对当前GPU平台和网络结构的TensorRT模型;
- deploy:加载TensorRT模型构造一个runtime engine并创建执行context,输入数据完成inference;