TensorRT

一、简介

TensorRT 是一个深度学习模型线上部署的优化引擎,即 GPU Inference Engine。Tensor 代表张量,即数据流动以张量的方式,如4维张量 [N, C, H, W]。RT表示 runtime。
a complete dl platform
一般情况如上图,线下构建网络结构,训练好模型,然后在实际业务中线上部署到对实时性要求较高(latency敏感)的场景,如一般的嵌入式设备,云端等等。实际应用中,可能同时处理几十路摄像头。TensorRT擅长CNN,3.0版本有RNN的API。

二、特性

2.1 特性列举

  1. 比一些深度学习框架,有更好的优化和及时性(虽然降低了使用的灵活性,但是有了更好的性能)
  2. 支持 custom layer,即用户自定义的神经网络层
  3. 利用低精度加速推理 inference,如FP16/INT8
    inference speed comparison between cpu, tensorflow and tensorRT

2.2 特性1解释

在inference的阶段神经网络没有了后向传播,模型是固定的了,所以可使得计算图有更好的优化 (graph optimazation)。同时输入输出大小固定了,简化了内存管理 (memory management)。为了实时性,可改用更小的batch size,以减少latency(但是同时GPU的利用率也降低了)。这些方面都可以在TensorRT中得到改进。
throughput with different batch sizelatency with different batch size

2.3 特性2解释

custom layer tensorRT
custom layer tensorRT
如果来自其他深度学习框架的模型中,有个别网络层比较新,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) 次的浮点运算每秒。

三、精度转换

精度的降低可以大幅度加快神经网络模型的推理速度。
YOLOv2 with INT8
ResNet50 performance FP32 INT8
典型的精度转换流程:
精度转换流程
TensorRT中,单精度(FP32)模型到半精度(FP16)模型的转换如下:
FP16 inference
parse model from FP32 to FP16
config the builder tensorRT
TensorRT中,FP32模型到INT8模型的转换如下:
it8 inference
generate calibration table
adopt calibration table

四、工作流程

TensorRT的工作流程主要分为模型解析、模型转换优化、模型执行三个步骤(如下图)。
tensorRT workflow
更加细化的流程如下:
tensorRT workflow
比如传入一个caffe模型,解析(Tensor中的Parser)就是得到模型里面有哪些网络层,有怎样的连接关系。然后对应得再转换成TensorRT的。可能有个别的比较新的网络层TensorRT中没有支持,用户可以通过API接口自定义layer,比如构建某种特殊卷积层。这个自定义API支持C++和Python语言。

目前支持的layer类型
layer types supported tensorRT
layer types supported tensorRT
Parser现在支持

  1. caffe
  2. uff(tensorflow可转换的一种模型文件结构)
  3. ONNX (Open Neural Network Exchange),开放神经网络交换,对应Pytorch,caffe2等。

如果这些框架都不支持,还可以用TensorRT提供的API的,一层一层自己构建相应的神经网络。

从Caffe导入神经网络的示例代码
从Caffe导入神经网络示例代码
从definition APIs导入神经网络的示例代码
从definition APIs导入神经网络的示例代码
模型优化中,优化好的engine(上图中的PLAN),可以进行保存,可以序列化(serialization) 到一个buffer或者file里面。读的时候,再deserialization。具体优化策略看本文后面。

等到执行的时候,先创建一个context分配一些预先的资源,然后再执行新的优化好的模型。

示例代码:
execute network

4.1 自定义层

custom layer tensorRT
custom layer tensorRT
custom layer tensorRT
execution tensorRT
execution tensorRT
custom layer tensorRT
custom layer tensorRT
custom layer tensorRT

4.2 优化策略

tensorRT optimization
卷积、添加bias和激活函数(如,ReLu)这些操作是可以合并到一起的。多路径网络层相同部分可以合并。concat层是可以消除的。并行的卷积计算可以合并到一起。还有就是针对特定的平台,自动选择最好的layers和算法。同时支持可扩展的multi-stream输入的并行处理。

如下图Inception结构在TensorRT中的优化方式
fuse network layers
fuse network layersfuse network layers
fuse network layersfuse network layers
具体的比如,YOLOv2的模型优化策略
YOLOv2 tensorRT
YOLOv2 tensorRT
YOLOv2 tensorRT

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐