TensorRT
一、简介
TensorRT 是一个深度学习模型线上部署的优化引擎,即 GPU Inference Engine。Tensor 代表张量,即数据流动以张量的方式,如4维张量 [N, C, H, W]。RT表示 runtime。
一般情况如上图,线下构建网络结构,训练好模型,然后在实际业务中线上部署到对实时性要求较高(latency敏感)的场景,如一般的嵌入式设备,云端等等。实际应用中,可能同时处理几十路摄像头。TensorRT擅长CNN,3.0版本有RNN的API。
二、特性
2.1 特性列举
- 比一些深度学习框架,有更好的优化和及时性(虽然降低了使用的灵活性,但是有了更好的性能)
- 支持 custom layer,即用户自定义的神经网络层
- 利用低精度加速推理 inference,如FP16/INT8
2.2 特性1解释
在inference的阶段神经网络没有了后向传播,模型是固定的了,所以可使得计算图有更好的优化 (graph optimazation)。同时输入输出大小固定了,简化了内存管理 (memory management)。为了实时性,可改用更小的batch size,以减少latency(但是同时GPU的利用率也降低了)。这些方面都可以在TensorRT中得到改进。
2.3 特性2解释
如果来自其他深度学习框架的模型中,有个别网络层比较新,TensorRT中暂不支持,用户可以通过TensorRT提供的API自定义自己的网络层。(具体可参见本文第四部分“工作流程”)
2.4 特性3解释
低精度技术 (high speed reduced precision)。在training阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的时候,精度要求没有那么高,一般F16(半精度)就可以,甚至可以用INT8(8位整型),精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在嵌入式模型里面。
英伟达显卡对精度的支持情况:
- FP16 (Pascal P100 and V100 (tensor core))
- INT8 (P4/P40)
其中V100采用 NVIDIA Volta 架构,相较于前代Pascal架构效率提升50%,拥有 640 个 Tensor Cores,tensor core的引入可以较高能效大幅增加浮点计算吞吐量。其中P4是专门线上做inference的一张小卡,功耗低。其他的还有T4显卡(含有Turing Tensor Cores,支持INT8/INT4精度,更快的inference)。
上面是各显卡低精度与单精度FLOPS的比较。FLOPS (Floating-point Operations per Second),每秒浮点运算次数,亦称每秒峰值速度。TFLOPS (teraFLOPS) ,1万亿 (10^12) 次的浮点运算每秒。
三、精度转换
精度的降低可以大幅度加快神经网络模型的推理速度。
典型的精度转换流程:
TensorRT中,单精度(FP32)模型到半精度(FP16)模型的转换如下:
TensorRT中,FP32模型到INT8模型的转换如下:
四、工作流程
TensorRT的工作流程主要分为模型解析、模型转换优化、模型执行三个步骤(如下图)。
更加细化的流程如下:
比如传入一个caffe模型,解析(Tensor中的Parser)就是得到模型里面有哪些网络层,有怎样的连接关系。然后对应得再转换成TensorRT的。可能有个别的比较新的网络层TensorRT中没有支持,用户可以通过API接口自定义layer,比如构建某种特殊卷积层。这个自定义API支持C++和Python语言。
目前支持的layer类型:
Parser现在支持:
- caffe
- uff(tensorflow可转换的一种模型文件结构)
- ONNX (Open Neural Network Exchange),开放神经网络交换,对应Pytorch,caffe2等。
如果这些框架都不支持,还可以用TensorRT提供的API的,一层一层自己构建相应的神经网络。
从Caffe导入神经网络的示例代码:
从definition APIs导入神经网络的示例代码:
模型优化中,优化好的engine(上图中的PLAN),可以进行保存,可以序列化(serialization) 到一个buffer或者file里面。读的时候,再deserialization。具体优化策略看本文后面。
等到执行的时候,先创建一个context分配一些预先的资源,然后再执行新的优化好的模型。
示例代码:
4.1 自定义层
4.2 优化策略
卷积、添加bias和激活函数(如,ReLu)这些操作是可以合并到一起的。多路径网络层相同部分可以合并。concat层是可以消除的。并行的卷积计算可以合并到一起。还有就是针对特定的平台,自动选择最好的layers和算法。同时支持可扩展的multi-stream输入的并行处理。
如下图Inception结构在TensorRT中的优化方式:
具体的比如,YOLOv2的模型优化策略: