文章目录
TensorRT学习笔记
1、什么是TensorRT
TensorRT是NVIDIA针对神经网络inference(推理)阶段提供的加速器。TensorRT™的核心是一个C++库,可以促进NVIDIA图形处理单元(GPU)的高性能计算。它专注于在GPU上快速有效地运行已经训练过的网络,以产生结果(一个过程,在各个地方被称为评分,检测,回归或推断)。
[外链图片转存失败(img-zcrKemDS-1562914545173)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/F2B7C4FA473549ED90E4D9C0865DBADE/16461)]
TensorRT通过组合层和优化内核选择来优化网络,从而提高延迟,吞吐量,功效和内存消耗。如果应用程序指定,它还将优化网络以低精度运行,进一步提高性能并降低内存需求。
一般在深度学习项目中。在深度学习算法的训练阶段为了加快速度,会使用多GPU的分布式。但是在项目部署到应用的过程中,为了降低成本,往往是使用单个GPU机器甚至是嵌入式平台进行部署。部署端也需要要有与训练端一样的深度学习环境,如caffe,tensorflow等。由于训练的网络模型可能会很大(比如,inception,resnet等),参数很多,而且部署端的机器性能存在差异,就会导致推理速度慢,延迟高。这对于那些高实时性的应用场合是致命的,比如自动驾驶要求实时目标检测,目标追踪等。所以为了提高部署推理的速度,出现了很多轻量级神经网络,比如squeezenet,mobilenet,shufflenet等。基本做法都是基于现有的经典模型提出一种新的模型结构,然后用这些改造过的模型重新训练,再重新部署。
tensorRT则是对训练好的模型进行优化。tensorRT就只是推理优化器。当你的网络训练完之后,可以将训练模型文件直接丢进tensorRT中,而不再需要依赖深度学习框架(Caffe,TensorFlow等)
当在没有使用TensorRT时将深度学习项目移植到单个GPU机器甚至是嵌入式平台。需要被移植的平台也具备相应的深度学习框架的环境。[外链图片转存失败(img-A0LBR156-1562914545176)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/BD9800AD4A8A4E9685464B6E42E12CDB/16434)]
但是当应用TensorRT后可以将不同深度学习框架的模型进行推理优化这样不在需要在单个GPU机器甚至是嵌入式平台上配置相应的深度学习环境。
[外链图片转存失败(img-sC2AW9Yq-1562914545176)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/A7AC56C351CD4D62A9B4029999B0C8F6/16448)]
可以将TensorRT看成一个前向传播的深度学习框架,这个框架可以将Caffe,TensorFlow的网络模型解析,然后与tensorRT中对应的层进行一一映射,把其他框架的模型统一全部 转换到tensorRT中,然后在tensorRT中可以针对NVIDIA自家GPU实施优化策略,并进行部署加速。
2、TensorRT加速原理
TensorRT的加速和优化主要体现在两个方面一是TensorRT支持INT8和FP16的计算,通过在减少计算量和保持精度之间达到一个理想的平衡(trade-off),达到加速推断的目的。二是对于网络结构进行重构和优化相对于训练过程,网络推断时模型结构及参数都已经固定,batchsize一般较小,对于精度的要求相较于训练过程也较低,这就给了很大的优化空间。
- 2.1、支持FP16 或者INT8的数据类型
训练时由于梯度等对于计算精度要求较高,但是在inference阶段(只有前向网络阶段)可以利用精度较低的数据类型加速运算,降低模型的大小。这里需要达到一个量化过程的平衡,当数据的精度降低时会对算法的精度有一定的影响,这里就需要在运行效率和精度之间进行一个平衡。但是总的来说在进行inference阶段时数据的精度对识别精度的影响相对于在训练阶段来说比较小。所以这里可以通过降低数据精度来进行优化。
-
2.2、对网络结构的重构和优化
-
2.2.1、解析网络模型,消除无用的输出层
消除网络中的无用的输出层,减少计算
-
2.2.2、对于网络结构的垂直整合
将目前主流的神经网络中的conv,BN,Relu三个层融合为一个层。如下图:
[外链图片转存失败(img-p05WCWQ7-1562914545176)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/EB8BF4C2378643CE8ADCC58F126CD7CB/16534)] -
2.2.3、对于网络的水平组合
对于网络的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合一起
[外链图片转存失败(img-2atTI3Po-1562914545177)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/88A957F9D2FB400BA2F9512FB123B5D0/16539)] -
2.2.4、减少传输吞吐量
对于concat层,将contact层的输入直接送入下面的操作中,不用单独进行concat后在输入计算,相当于减少了一次传输吞吐。
-
-
2.3、此外,构建阶段还在虚拟数据上运行图层以从其内核目录中选择最快的图像,并在适当的情况下执行权重预格式化和内存优化。
3、TensorRT如何运行
TensorRT有两种阶段:第一个阶段是构建阶段(build),第二种阶段是执行阶段(production).
- 3.1、构建阶段(build)
[外链图片转存失败(img-pNUqFdSe-1562914545177)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/A4A6EF17A0964F89A22BC732A5C19F2D/16563)]
graph TD
A[我们训练的模型]-->B[通过TensorRT提供的解析器解析各个框架的模型]
B -->C[重构和优化我们的网络]
C -->D[生成一个优化了的plan用于计算深度神经网络的前向传播]
这个plan是一个优化了的目标代码,可以序列化存储在内存或磁盘上。
TensorRT构建阶段:TensorRT运行时需要三个文件来部署一个分类神经网络:一个网络体系结构文件(deploy.prototxt),已训练的权值(net.caffemodel)和一个标签文件为每个输出类提供一个名称。另外,你必须定义batch size和输出层。
- 3.2、部署阶段
[外链图片转存失败(img-6ACH3ZJA-1562914545177)(https://note.youdao.com/yws/public/resource/a48e105e9dcf98f685bf69937a8ead17/xmlnote/46743F3868424F70A8D4889F0B8F5EBF/16565)]
在部署阶段,使用构建阶段生成的PLAN文件来执行神经网络的前向传播。TensorRT以最小化延迟和最大化吞吐量运行优化了的网络。
4、开发环境搭建
- 4.1、Windows C++环境搭建(后续补充)
- 4.2、Ubuntu python环境搭建(后续补充)
5、TensorRT核心库关键接口介绍
- 5.1、网络定义(Network Definition)
“网络定义”接口为应用程序提供了指定网络定义的方法。可以指定输入和输出张量,可以添加图层,还有用于配置每个支持的图层类型的界面。除了层类型(例如卷积层和循环层)以及插件层类型之外,应用程序还可以实现TensorRT本身不支持的功能。
- 5.2、优化构建(Builder)
Builder接口允许从网络定义创建优化引擎。它允许应用程序指定最大批量和工作空间大小,最小可接受精度水平,自动调整的计时迭代计数,以及用于量化网络以8位精度运行的接口。
- 5.3、执行推理(Engine)
Engine接口允许应用程序执行推理。它支持同步和异步执行,分析,枚举和查询引擎输入和输出的绑定。单个引擎可以具有多个执行上下文,允许使用单组训练参数来同时执行多个批次。
-
5.4、解析器( Parser)
- 5.4.1、Caffe Parser
此解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义图层注册插件工厂的功能。
- 5.4.2、UFF Parser
此解析器可用于以UFF格式解析网络。它还提供了注册插件工厂和传递自定义图层的字段属性的功能。
- 5.4.3、ONNX Parser
此解析器可用于解析ONNX模型。