Fork me on cnblogs

TensorRT介绍

一、 TensorRT基本介绍

TensorRT是一种高性能深度学习推理优化器和运行时加速库,可以为深度学习应用提供低延迟、高吞吐率的部署推理。

TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。

TensorRT现已能支持TensorFlow、Caffe、Mxnet、Pytorch等几乎所有的深度学习框架,将TensorRT和NVIDIA的GPU结合起来,能在几乎所有的框架中进行快速和高效的部署推理。

 

一般的深度学习项目,训练时为了加快速度,会使用多GPU分布式训练。但在部署推理时,为了降低成本,往往使用单个GPU机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也要有与训练时相同的深度学习环境,如caffe,TensorFlow等。

由于训练的网络模型可能会很大(比如,inception,resnet等),参数很多,而且部署端的机器性能存在差异,就会导致推理速度慢,延迟高。这对于那些高实时性的应用场合是致命的,比如自动驾驶要求实时目标检测,目标追踪等。

为了提高部署推理的速度,出现了很多模型优化的方法,如:模型压缩、剪枝、量化、知识蒸馏等,这些一般都是在训练阶段实现优化。

而TensorRT 则是对训练好的模型进行优化,通过优化网络计算图提高模型效率。

image.png

当网络训练完之后,可以将训练模型文件直接丢进tensorRT中,而不再需要依赖深度学习框架(Caffe,TensorFlow等),如下:

                                           

 

 

 

二、优化方式

 

 TensorRT优化方法主要有以下几种方式,最主要的是前面两种。

  • 层间融合或张量融合(Layer & Tensor Fusion)

制约计算速度的CUDA核心计算张量,往往大量的时间也是浪费在CUDA核心的启动和对每一层输入/输出张量的读写操作上面,这造成了内存带宽的瓶颈和GPU资源的浪费。

TensorRT通过对层间的横向或纵向合并,使得层的数量大大减少,这样就可以一定程度的减少kernel launches和内存读写。

 

 

 

横向合并可以把卷积、偏置和激活层合并成一个CBR结构(convolution, bias, and ReLU layers are fused to form a single layer),只占用一个CUDA核心。

纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。

另外,对于多分支合并的情况,TensorRT完全可以实现直接接到需要的地方,不用专门做concat的操作,所以这一层也可以取消掉。

合并之后的计算图(右侧)的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。

  •  数据精度校准(Weight &Activation Precision Calibration)

大部分深度学习框架在训练神经网络时网络中的张量(Tensor)都是32位浮点数的精度(Full 32-bit precision,FP32),一旦网络训练完成,在部署推理的过程中由于不需要反向传播,完全可以适当降低数据精度,比如降为FP16或INT8的精度。更低的数据精度将会使得内存占用和延迟更低,模型体积更小。

如下表为不同精度的动态范围:

Precision

Dynamic Range

FP32

−3.4×1038 +3.4×1038−3.4×1038 +3.4×1038

FP16

−65504 +65504−65504 +65504

INT8

−128 +127−128 +127

INT8只有256个不同的数值,使用INT8来表示 FP32精度的数值,肯定会丢失信息,造成性能下降。不过TensorRT会提供完全自动化的校准(Calibration )过程,会以最好的匹配性能将FP32精度的数据降低为INT8精度,最小化性能损失。关于校准过程,后面会专门做一个探究。

  • Kernel Auto-Tuning内核自动调整

网络模型在推理计算时,是调用GPU的CUDA核进行计算的。TensorRT可以针对不同的算法,不同的网络模型,不同的GPU平台,进行 一些Kernel层面的优化,以保证当前模型在特定平台上以最优性能计算。

  • Dynamic Tensor Memory动态张量显存

在每个tensor使用期间,TensorRT会为其指定显存,避免显存重复申请,减少内存占用和提高内存的重复使用效率(reuse)。

  • Multi-Stream Execution多流执行

使用CUDA中的stream技术,对于同一输入的多个分支可以进行并行运算,还可以根据不同batchsize优化。

 

 

三、使用Tensorrt的一般步骤

image.png

基本流程:

1、训练神经网络,

2、优化得到推理引擎plan,序列化到磁盘

3、使用时反序列化,使用优化后的推理引擎进行加速

 

image.png

1、创建builder:构造器。包含tensorrt所有组件,及推理的整个流程,网络、解析器、输入输出的buffer地址,推理优化的引擎,输入输出结果的维度等

2、创建network。保存训练好的神经网络。

3、创建parser:用来解析网络。caffe、tensorflow、onnx……也可自定义
4、绑定:gpu的输入、输出地址、自定义组件

 

输入:训练好的神经网络模型及其结构。支持所有框架。

输出:一个可执行的推理引擎。

5、序列化反序列化

6、传输计算数据:CPU到GPU

7、执行计算

8、传输计算结果:GPU到CPU

 

 

 

四、运用场景

image.png

嵌入式、自动驾驶、数据中心

 

五、其他

1,插件支持

 

 

我们在做模型结构设计时,有时候自己会设计一些layer来满足任务需求,但是这些layer在使用Tensorrt优化时,TensorRT可能并不支持,如ROI Align,这时候就需要通过Plugin的形式自己去实现,如上图所示的custom layer。实现过程包括如下两个步骤:

首先需要重载一个IPlugin的基类,生成自己的Plugin的实现,告诉GPU或TensorRT需要做什么操作,要构建的Plugin是什么样子,其实就是类似于开发一个应用软件的插件,需要在上面实现什么功能。

其次要将插件替换网络中自己实现的layer。

 现在tensorRT支持的层有:

  • Activation: ReLU, tanh and sigmoid

  • Concatenation : Link together multiple tensors across the channel dimension.

  • Convolution: 3D,2D

  • Deconvolution

  • Fully-connected: with or without bias

  • ElementWise: sum, product or max of two tensors

  • Pooling: max and average

  • Padding

  • Flatten

  • LRN: cross-channel only

  • SoftMax: cross-channel only

  • RNN: RNN, GRU, and LSTM

  • Scale: Affine transformation and/or exponentiation by constant values

  • Shuffle: Reshuffling of tensors , reshape or transpose data

  • Squeeze: Removes dimensions of size 1 from the shape of a tensor

  • Unary: Supported operations are exp, log, sqrt, recip, abs and neg

  • Plugin: integrate custom layer implementations that TensorRT does not natively support.

基本上比较经典的层比如,卷积,反卷积,全连接,RNN,softmax等,在tensorRT中都是有对应的实现方式的,tensorRT是可以直接解析的。

但是由于现在深度学习技术发展日新月异,各种不同结构的自定义层(比如:STN)层出不穷,所以tensorRT是不可能全部支持当前存在的所有层的。那对于这些自定义的层该怎么办?

tensorRT中有一个 Plugin 层,这个层提供了 API 可以由用户自己定义tensorRT不支持的层。 如下图:

 

 

 这就解决了适应不同用户的自定义层的需求。

 

202202161809270252150250141033FD.jpg

 

build engine:创建解析器、工作空间、数据类型,序列化,释放

不同的设备引擎不通用,只能在同一个设备使用。例如:在服务器优化引擎,放到nano设备上,不行

pluginfoctory:如果网络层并不是直接支持的,自定义网络层

plugin:输入输出,初始化


2、实用工具Netron:

 

Netron是神经网络,深度学习和机器学习模型的可视化工具(viewer)。

Netron 支持目前大多数主流深度学习框架的模型,如下所示:

  • ONNX(.onnx,.pb)

  • Keras(.h5,.keras)

  • CoreML(.mlmodel)

  • TensorFlow Lite(.tflite)

  • Netron对Caffe(.caffemodel)

  • Caffe2(predict_net.pb)

  • MXNet(.model,-symbol.json)

  • TensorFlow.js(model.json,.pb)

  • TensorFlow(.pb,.meta)

image.png

Yolov5l可视化网络结构图:

20200729110503447.png

 

 

 



 

posted @ 2022-02-16 17:00  城北徐公fh  阅读(5316)  评论(0编辑  收藏  举报