TensorRT
是一种高性能的神经网络推理优化器
和运行时推理引擎
,应用于项目落地部署
。首先需要有训练好的模型,然后经过TensorRT优化器的优化处理,利用TensorRT Runtime Engine进行落地部署。
SDK
推理优化器
,以及用于执行的runtme高的吞吐量
和更低的延迟
运行深度学习模型,用TensorRT可以加速模型的推理
TensorRT可以用在很多场景,包括嵌入式、自动驾驶、数据中心
,也就是在端测、边缘层、云端都可以考虑使用TensorRT,只要有GPU都可以利用TensorRT进行推理加速。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ffe641057b9f4e7396e71546235e0a76.png#pic_center
首先训练神经网络获得训练好的模型,然后利用TensorRT进行优化,可以指定Batch size
和Precision
,优化后获得tensorrt的推理引擎,并且序列化为一个plain文件保存到磁盘,最后在推理的时候进行反序列化使用。
onnx
,tensorflow
,caffe
,wts
等训练好的文件。TensorRT
我们需要Network Definition
,然后利用构建器builder
来优化参数,构建一个推理引擎,通过序列化保存到磁盘,然后从硬盘反序列化到内存进行推理使用。在runtime
使用时,基于输入的tensors就可以得到输出的tensor结果。TensorRT
中相关的功能进行介绍说明
Builder
:TensorRT的模型优化器,构建器将网络定义作为输入,执行与设备无关和针对特定设备的优化,并创建引擎。Network defination
:TensorRT中模型的表示,网络定义是张量和运算符的图Engine
: 表示TensorRT构建器优化好的模型Plan
: 序列化格式的优化推理引擎。典型的应用程序将构建一次引擎,然后将其序列化为计划文件以供以后使用。要初始化推理引擎,应用程序将首先从plan文件中反序列化模型。Runtime
: TensorRT的组件,可以在TensorRT引擎上执行推理。TensorRT生态系统分为两个部分:
转换
为优化的TensorRT引擎,可以通过onnx
,c++ api
,python api
转换为TensorRT优化引擎。转换TensorRT引擎主要有三个选择:
ONNX
转换,从.onnx
文件转换为了获得最佳性能和可定制性,还可以使用TensorRT网络定义API手动构建TensorRT引擎。 这涉及仅使用TensorRT操作按目标平台构建与原模型相同(或近似相同
,有的时候TensorRT算子不支持就需要改造网络)的网络。创建TensorRT网络后,可从框架中导出模型的权重,然后将其加载到TensorRT网络中。
用户可以使用C++
和Python API
的IPluginV2Ext
类来实现自定义层,从而扩展TensorRT的功能。自定义层(通常称为插件
)由应用程序实现和实例化。
使用TensorRT部署模型有以下三种选择:
• 可以通过Tensorflow进行部署
• using the standalone TensorRT runtime API
• using NVIDIA Triton Inference Server
其中第二种,TensorRT的runtimeAPI
允许最低的开销和最细粒度的控制,但是TensorRT本身不支持的运算符必须通过自己创建插件(plugin
)
TensorRT通常异步使用,因此,当输入数据到达时,程序将调用一个enqueue
函数。TensorRT将会从这个队列中异步的处理数据。
为了优化推理模型,TensorRT会采用你的网络定义,执行包括平台特定的优化
,并生成推理引擎。 此过程称为build阶段。 build阶段可能会花费大量时间,尤其是在嵌入式平台上运行时。 因此,典型的应用程序将只构建一次引擎,然后将其序列化为plan文件
以供以后使用。
构建阶段对图执行以下优化
• 消除不使用其输出的层
• 消除等同于无操作的操作
• 卷积、偏置和ReLU操作的融合
• 使用完全相似的参数和相同的源张量(例如,GoogleNet v5的初始模块中的1x1卷积)进行的操作聚合(aggregation)
• 通过将层输出定向到正确的最终目的地来合并拼接层。
必要时,builder还可以修改权重的精度
。 当生成8位整数精度的网络时,它使用称为calibration
(校准)的过程来确定中间激活的动态范围,从而确定用于量化的适当缩放因子。此外,build阶段还会在dummy数据上运行各层,以从其kernel目录中选择最快的文件,并在适当的情况下执行权重预格式化和内存优化。
• 根据模型创建TensorRT的网络定义
• 调用TensorRT构建器以从网络创建优化的runtime引擎
• 序列化和反序列化引擎,以便可以在runtime快速重新创建它
• 向引擎提供数据以执行推理