TensorRT详解

■ TensorRT概述

       NVIDIA®TensorRT™的核心是一个C++库,可以促进在NVIDIA图形处理单元(GPU)上的高性能推断。它旨在与Tensorflow、Caffe、Pytorch、MXNet等深度学习训练框架以互补的方式工作。它专注于在GPU上快速有地运行已经训练过的网络,以便生成结果(在各个地方称为评分、检测、回归或推理的过程)。
       一些训练框架(如Tensorflow)已经集成了TensorRT(比如Tensorflow1.9.0集成了TensorRT4),因此可用于加速框架内的推理。另外,TensorRT可以用作用户应用程序中的库。它包括用于以Caffe、ONNX或Tensorflow导入现有模型的解析器,以及用于以编程方式构建模型的C++和Python API。

在这里插入图片描述

                                                   图1. TensorRT是用于生产部署的高性能神经网络推理优化器和运行时引擎。

       TensorRT通过组合层和优化内核选择来优化网络,从而改善延迟(latency)、吞吐量(throughput)、能效(power efficiency)和内存消耗(memory consumption)。如果应用程序指定,它将另外优化网络以较低的精度运行,从而进一步提高性能并降低内存需求。
       下图显示了TensorRT被定义为高性能推理优化器和部件运行时引擎(runtime engine)的一部分。 它可以接受在这些流行的框架上训练过的神经网络,优化神经网络计算,生成轻量级的运行时引擎(这是你唯一需要部署到生产环境中的东西)。
在这里插入图片描述                                                                               图2.TensorRT是可编程的推理加速器

■ TensorRT的优势

       在训练了神经网络之后,TensorRT使网络可以在运行时进行压缩,优化和部署,而无需框架开销。
       TensorRT根据指定的精度(FP32,FP16或INT8)组合图层,优化内核选择以及执行规范化和转换为优化的矩阵数学运算,以改善延迟,吞吐量和效率。

– 对于深度学习推理,有五个用于衡量的关键因素:
● 吞吐量(Throughput):给定时间段内的产出量。每台服务器的吞吐量通常以推理/秒或样本/秒来衡量。
● 效率(Efficiency):每单位功率提供的吞吐量,通常表示为性能/瓦特。
● 延迟(Latency):执行推理的时间,通常以毫秒为单位
● 准确率(Accuracy):训练的神经网络能够提供正确答案的能力。
● 内存占用(Memory usage):在网络上进行推理需要保留的主机和设备内存取决于所使用的算法,这限制了网络和网络的哪些组合可以在给定的推理平台上运行。

– 其他加速方法:
1)使用训练框架本身执行推断。使用训练框架执行推理很容易,但是与使用TensorRT这样的优化解决方案相比,在给定GPU上的性能往往低得多。训练框架倾向于实施强调通用性的通用代码,并且当优化它们时,优化往往集中在有效的训练上。
2) 编写专门设计用于使用低级库和数学运算来执行网络的自定义应用程序。通过编写仅用于执行神经网络的自定义应用程序可以获得更高的效率,但是,这可能会非常费力,并且需要大量专业知识才能在现代GPU上达到较高的性能水平。此外,在一个GPU上进行的优化可能无法完全转换为同一系列中的其他GPU,并且每一代GPU都可能引入只能通过编写新代码来利用的新功能。

       TensorRT通过结合抽象出特定硬件细节的高级API和优化推理的实现来解决这些问题,以实现高吞吐量,低延迟和低设备内存占用。

– TensorRT的应用场景
       TensorRT供负责基于新的或现有的深度学习模型构建功能和应用程序或将模型部署到生产环境中的工程师使用。这些部署可能会在数据中心或云中的服务器,嵌入式设备,机器人或车辆或将在您的工作站上运行的应用程序软件中。
       TensorRT已在各种场景中成功使用,包括:
1)机器人(Robots):公司出售使用TensorRT的机器人来运行各种计算机视觉模型,以自动引导在动态环境中飞行的无人机系统。
2)自动驾驶(Autonomous Vehicles): TensorRT用于支持NVIDIA Drive产品中的计算机视觉。
3)科学计算(Scientific and Technical Computing):TensorRT嵌入了一种流行的技术计算包,可实现神经网络模型的高吞吐量执行。
4)深度学习训练和部署框架(Deep Learning Training and Deployment Frameworks):TensorRT包含在几个流行的深度学习框架中,包括Tensorflow和MXNet。
5)视频分析(Video Analytics): NVIDIA DeepStream产品中使用TensorRT在边缘(具有1-16个摄像机源)和数据中心(可能聚集数百甚至数千个视频源)中为复杂的视频分析解决方案提供支持。
6)自动语音识别(Automatic Speech Recognition):TensorRT用于在小型台式/台式设备上支持语音识别。设备上支持有限的词汇表,而云中提供了更大的词汇表语音识别系统。

■ TensorRT用在哪里

       通常,开发和部署深度学习模型的工作流程分为三个阶段:训练、开发解决部署方案、部署解决方案。
(1)训练:TensorRT通常在训练阶段的任何部分都不使用。
(2)部署方案:以序列化格式写出推理引擎(Plan File)。
       ① 定义推理解决方案的体系结构,确定优先级。
       ②定义了推理解决方案的体系结构,从而确定优先级后,使用TensorRT从保存的网络中构建了推理引擎。有多种方法可以执行此操作,具体取决于所使用的培训框架和网络体系结构。通常,这意味着你需要使用已保存的神经网络,并使用ONNX解析器(请参见图3左侧),Caffe解析器或UFF解析器将其从其保存的格式解析为TensorRT。
       ③ 解析网络后,请考虑优化选项:batch size,工作空间大小,混合精度以及动态形状上的边界,这些选项是在TensorRT构建步骤中选择和指定的,您可以在其中基于网络构建优化的推理引擎。将你的模型解析为TensorRT并选择了优化参数(请参见图3)。
       ④ 使用TensorRT创建推理引擎后,你需要验证它是否可以重现训练过程中测得的模型结果。如果选择了FP32或FP16,则它应与结果非常接近。如果你选择了INT8,则在训练过程中获得的准确度与推理准确度之间可能会有很小的差距。
       ⑤ 以序列化格式写出推理引擎。也称为计划文件(Plan File)。
在这里插入图片描述
                                                                                             图3.ONNX Workflow V1

(3)部署:在云端部署(TensorRT Inference Server),嵌入式系统。
       TensorRT库将链接到部署应用程序,部署应用程序将在需要推断结果时调用该库。 要初始化推理引擎,应用程序将首先将模型从计划文件中反序列化为推理引擎。
       TensorRT通常异步使用,因此,当输入数据到达时,程序将使用输入缓冲区和TensorRT应将结果放入其中的缓冲区调用入队函数。

■ TensorRT如何进行优化

       为了优化推力模型,TensorRT采用训练的网络定义执行优化。包括特定于平台的优化,并生成推理引擎,此过程称为构建阶段(build phase)。构建阶段可能需要相当长的时间,尤其实在嵌入式平台上运行时。因此,典型的应用程序将构建一次引擎,然后将其序列化为计划文件(plan file)以供以后使用。(注意:生成的计划文件不能跨平台或TensorRT版本移植。计划特定于他们构建的确切GPU模型(除了平台和TensorRT版本),并且如果你想在其他GPU上运行他们,则必须将其重新定位到特定的GPU。)

构建阶段对图层执行以下优化:
1)消除未使用输出的层
2)消除等同于无操作的操作
3)融合卷积,偏置和ReLU操作
4) 聚合足够相似的参数和相同的源张量的操作(例如GoogleNet v5的初始模块中的1x1卷积)
5) 通过将层输出定向到正确的最终目标来合并连接层。

       必要时,builder还会修改权重的精度。当生成8-bit int的网络时,它使用称为校准的过程来确定中间激活的动态范围,从而确定用于量化的适当缩放因子。
       此外,构建阶段还会在虚拟数据上运行图层,以从其内核目录中选择最快的内核,并在适当的情况下执行权重预格式化和内存优化。
在这里插入图片描述

                                                                                             图4.优化方式

■ TensorRT提供了哪些功能

       TensorRT使开发人员能够导入,校准,生成和部署优化的网络。 网络可以直接从Caffe导入,也可以通过UFF或ONNX格式从其他框架导入。 也可以通过实例化各个图层并直接设置参数和权重以编程方式创建它们。
       用户还可以使用Plugin界面通过TensorRT运行自定义图层。 通过GraphSurgeon实用程序可以将TensorFlow节点映射到TensorRT中的自定义层,从而可以使用TensorRT对许多TensorFlow网络进行推理。
       TensorRT在所有支持的平台上提供C ++实现,并在x86,aarch64和ppc64le上提供Python实现。

– TensorRT核心库的关键接口
1)网络定义(Network Definition):(可以通过TensorRT自定义网络结构)网络定义接口为应用程序提供了指定网络定义的方法。可以指定输入和输出张量,可以添加层,并且有一个用于配置每种支持的层类型的界面。以及卷积层和循环层等层类型,以及Plugin层类型都允许应用程序实现TensorRT本身不支持的功能。
2)优化配置文件(Optimization Profile):优化配置文件指定对动态尺寸的约束。
3)编译器配置(Builder Configuration):编译器配置界面指定用于创建引擎的详细信息。它允许应用程序指定优化配置文件,最大工作空间大小,最低可接受的精度水平,计时迭代计算的自动剪枝和优化,以及用于量化网络以8-bit精度运行的接口。
4)编译器(Builder): 编译器接口允许根据网络定义和构建器配置创建优化的引擎。
5)引擎(Engine):Engine接口允许应用程序执行推理。它支持同步和异步执行,分析以及枚举和查询引擎输入和输出的绑定。单个引擎可以具有多个执行上下文,从而允许将一组训练参数用于同时执行多个批次。

– TensorRT提供解析器,用于导入训练的网络以创建网络定义
1)caffe解析器(Caffe Parser): 该解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义层注册插件工厂的功能。
2)UFF解析器(UFF Parser):该解析器可用于解析UFF格式的网络。它还提供了注册插件工厂并为自定义层传递字段属性的功能。
3)ONNX解析器(ONNX Parser):该解析器可用于解析ONNX模型。

(有关API和Parse的更多详细信息可以查阅官方文档)

猜你喜欢

转载自blog.csdn.net/Roaddd/article/details/111600203