1 What is TensorRT ?
TensorRT™的核心是一个C ++库,可以促进在NVIDIA图形处理单元(GPU)上的高性能推断。它旨在与TensorFlow,Caffe,PyTorch,MXNet等深度学习训练框架以互补的方式工作。它专注于在GPU上快速有效地运行已经训练过的网络,以便生成结果(在各个地方称为评分、检测、回归或推理的过程)。
一些训练框架(如TensorFlow)集成了TensorRT,因此可用于加速框架内的推理。但是,TensorRT可以用作用户应用程序中的库。它包括用于从Caffe、ONNX或TensorFlow导入现有模型的解析器,以及用于以编程方式构建模型的C ++和Python API。
图 1 TensorRT是用于产品开发的高性能神经网络推理优化器和运行时处理引擎
TensorRT通过组合层和优化内核选择来优化网络,从而改善延迟、吞吐量、功效和内存消耗。如果应用程序指定,它还将优化网络以更低的精度运行,进一步提高性能并降低内存需求。
下图显示了TensorRT被定义为高性能推理优化器和部件运行时引擎的一部分。它可以接受在这些流行框架上训练的神经网络,优化神经网络计算,生成轻量级运行时引擎(这是您需要部署到生产环境的唯一事物),然后它将最大化吞吐量、延迟和这些GPU平台上的性能。
图2 TensorRT是可编程的推理加速器
TensorRT API包括最常见的深度学习层的实现。有关层的更多信息,请参阅TensorRT层。您还可以使用C ++插件API或Python插件API为TensorRT不支持的不常用或更具创新性的层提供实现。
1.1 Benefits of TensorRT
在训练神经网络之后,TensorRT能够针对运行环境时进行压缩、优化和部署,而无需框架的开销。
TensorRT结合了层,优化了内核选择,并根据指定的精度(FP32,FP16或INT8)执行归一化和转换为最优的数学矩阵运算,以提高延迟、吞吐量和效率。
对于深度学习推理,有5个用于衡量软件的关键因素:
-
吞吐量
给定时期内的产出量。通常以推理量/秒或样本量/秒来衡量,每服务器吞吐量对于数据中心的成本有效扩展至关重要。 -
效率
每单位功率提供的吞吐量,通常表示为性能/瓦特。效率是实现成本效益数据中心扩展的另一个关键因素,因为服务器、服务器机架和整个数据中心必须在固定功率预算内运行。 -
延迟
执行推理的时间,通常以毫秒为单位。低延迟对于提供快速增长的基于实时推理的服务至关重要。 -
准确率
训练的神经网络能够提供正确答案的能力。对于图像分类,关键指标表示为Top-5或Top-1错误百分比。 -
内存占用
在网络上进行推理需要保留的主机和设备内存取决于所使用的算法。这限制了网络和网络的哪些组合可以在给定的推理平台上运行。这对于需要多个网络且存储器资源有限的系统尤其重要 - 例如用于智能视频分析和多摄像机、多网络自动驾驶系统的级联多级检测网络。
可替代使用TensorRT进行推理的方案包括:
- 使用训练框架本身进行推理;
- 编写专门用于使用低级库和数学运算来执行网络推理的自定义应用程序。
使用训练框架进行推理易于实现,但是在给定的GPU上,与使用TensorRT等优化解决方案相比,往往会导致性能低得多。训练框架倾向于实现更加通用的代码,这些代码强调一般性,当这些框架优化升级时,往往侧重于更加高效地训练。
通过编写自定义应用程序来执行神经网络可以获得更高的效率,但是它可能非常耗费人力并且需要相当多的专业知识才能在现代GPU上达到高水平的性能。此外,在一个GPU上工作的优化可能无法完全转换到同一系列中的其他GPU,并且每一代GPU都可能引入只能通过编写新代码来利用的新功能。
TensorRT通过将API与特定硬件细节的高级抽象相结合,以及专为高吞吐量、低延迟和低设备内存占用推理而开发和优化的实现来解决这些问题。
1.1.1 Who Can Benefit From TensorRT
TensorRT旨在供负责基于新的或现有深度学习模型构建功能和应用程序或将模型部署到生产环境中的工程师使用。这些部署可能是数据中心或云端的服务器、嵌入式设备、机器人或车辆中的服务器,或者将在用户工作站上运行的应用程序软件。
TensorRT已成功应用于各种场景,包括:
-
机器人
公司使用TensorRT销售机器人来运行各种计算机视觉模型,以自主地引导在动态环境中飞行的无人机系统。 -
自动驾驶
TensorRT用于为NVIDIA Drive产品中的计算机视觉提供动力。 -
科学计算
流行的技术计算软件包嵌入了TensorRT,可实现神经网络模型的高吞吐量执行。 -
深度学习训练和部署框架
TensorRT包含在几个流行的深度学习框架中,包括TensorFlow和MXNet。有关TensorFlow和MXNet容器发行说明,请参阅TensorFlow发行说明和MXNet发行说明。 -
视频分析
TensorRT在NVIDIA的DeepStream产品中使用,可以为1到16个摄像头输入的边缘设备以及数百甚至数千个视频源可能组合在一起的数据中心提供复杂的视频分析解决方案。 -
自动语音识别
TensorRT用于在小型桌面/桌面设备上提供语音识别功能。
小型设备支持有限的词汇表,云端设备可用词汇量较大的词汇识别系统。
1.2 Where Does TensorRT Fit?
通常,开发和部署深度学习模型的工作流程分为三个阶段。
- 阶段一是训练;
- List item
- 阶段二是开发部署解决方案;
- 阶段三是该解决方案的部署。
阶段一:训练
在训练阶段,数据科学家和开发人员将从他们想要解决的问题的陈述开始,并决定他们将使用的精确输入、输出和损失函数。他们还将收集、策划、扩充、并可能标记训练、测试和验证数据集。然后他们将设计网络结构并训练模型。在训练期间,他们将监控学习过程,该过程可能提供反馈,这将导致他们修改损失函数、获取或增加训练数据。在此过程结束时,他们将验证模型性能并保存训练模型。通常使用DGX-1™,Titan或Tesla数据中心GPU进行训练和验证。
TensorRT通常在训练阶段的任何部分都不使用。
阶段二:开发部署解决方案
在第二阶段,数据科学家和开发人员将从训练好的模型开始,并使用此训练模型创建和验证部署解决方案。
将这个阶段分解为几个步骤,你将得到:
-
想想神经网络如何在其所属的较大系统中运行,并设计和实施适当的解决方案。可能包含神经网络的系统范围非常多样化。例如:
车辆自动驾驶系统;
公共场所或企业园区的视频安全系统;
消费者设备的语音接口;
工业生产线自动化质量保证体系;
提供产品推荐的在线零售系统;
提供娱乐过滤器的消费者Web服务,可以应用于用户上传的图像。确定您的优先事项。鉴于您可以实现的不同系统的多样性,在设计和实现部署体系结构时可能需要考虑很多事情。
你有一个网络还是有许多网络?例如,您是在开发基于单个网络的特征或系统(面部检测),还是您的系统由不同模型的混合或级联组成,或者可能是由最终用户提供的集合模型的更通用设施?
您将使用什么设备或计算元素来运行网络? CPU,GPU,其他还是混合?如果模型要在GPU上运行,它是单一类型的GPU,还是需要设计一个可以在各种GPU上运行的应用程序?
数据如何进入模型?什么是数据管道?数据来自相机或传感器,来自一系列文件,还是通过网络连接上传?
将进行哪些预处理?数据的格式是什么?如果是图像,是否需要裁剪,旋转?如果它是文本字符集是什么,并且所有字符都允许作为模型的输入?有没有特别的代币?
您有什么延迟和吞吐量要求?
您能够将多个请求批处理在一起吗?
您是否需要单个网络的多个实例来实现所需的整体系统吞吐量和延迟?
您将如何处理网络输出?
需要哪些后期处理步骤?TensorRT提供了一个快速、模块化、紧凑、强大、可靠的推理引擎,可以支持部署体系结构中的推理需求。
-
在数据科学家和开发人员定义他们的推理解决方案的架构之后,他们通过它确定他们的优先级是什么,然后他们使用TensorRT从保存的网络构建推理引擎。根据所使用的训练框架和网络架构,有很多方法可以做到这一点。通常,这意味着您需要使用保存的神经网络并使用ONNX解析器(参见图3),Caffe解析器或TensorFlow / UFF解析器将其从其保存的格式解析为TensorRT。
图3 ONNX工作流程V1
-
在解析网络之后,您需要考虑优化选项 - 批量大小、工作空间大小和混合精度。选择这些选项并将其指定为TensorRT构建步骤的一部分,您可以根据网络实际构建优化的推理引擎。本指南的后续部分提供了有关此工作流程部分的详细说明和大量示例,将模型解析为TensorRT并选择优化参数(参见图4)。
图4 使用TensorRT优化训练好的神经网络模型以产生部署环境的运行推理引擎
-
使用TensorRT创建推理引擎后,您需要验证它是否会再现在训练过程中测量的模型结果。如果您选择了FP32或FP16,它应该非常接近地匹配训练结果。如果您选择了INT8,则在训练期间获得的精度与推理精度之间可能存在小的差距。
-
以序列化格式写出推理引擎。这也称为计划文件。
阶段三:部署解决方案
TensorRT库将链接到部署应用程序中,当需要推理结果时,该应用程序将调用库。要初始化推理引擎,应用程序将首先将模型从计划文件反序列化为推理引擎。
TensorRT通常是异步使用的,因此,当输入数据到达时,程序使用输入缓冲区和TensorRT应该放置结果的缓冲区调用enqueue函数。
1.3 How Does TensorRT Work?
为了优化推理模型,TensorRT采用您的网络定义,执行优化,包括特定于平台的优化,并生成推理引擎。此过程称为构建阶段。构建阶段可能需要相当长的时间,尤其是在嵌入式平台上运行时。因此,典型的应用程序将构建一次引擎,然后将其序列化为计划文件以供以后使用。
生成的计划文件不能跨平台或TensorRT版本移植。计划特定于他们构建的确切GPU模型(除了平台和TensorRT版本)并且必须重新定位到特定GPU,以防您想在不同的GPU上运行它们。
构建阶段在图层上执行以下优化:
- 消除未使用输出的层;
- 融合卷积、偏差和ReLU操作;
- 聚合足够相似的参数和相同的源张量的操作(例如,GoogleNet v5 inception模块中的1x1卷积);
- 通过将层输出定向到正确的最终目标来合并连接层。
如有必要,构建器还会修改权重的精度。当以8位整数精度生成网络时,它使用称为校准的过程来确定中间激活的动态范围,并因此确定用于量化的适当缩放因子。
此外,构建阶段还在虚拟数据上运行图层以从其内核目录中选择最快的内核,并在适当的情况下执行权重预格式化和内存优化。
更多信息请参考Working With Mixed Precision。
1.4 What Capabilities Does TensorRT Provide?
TensorRT使开发人员能够导入、校准、生成和部署优化网络。网络可以直接从Caffe导入,也可以通过UFF或ONNX格式从其他框架导入。它们也可以通过实例化单个图层并直接设置参数和权重来以编程的方式创建。
用户还可以使用Plugin界面通过TensorRT运行自定义图层。通过graphurgeon实用程序,可以将TensorFlow节点映射到TensorRT中的自定义层,从而可以使用TensorRT对许多TensorFlow网络进行推理。
TensorRT在所有支持的平台上提供C ++实现,在x86上提供Python实现。
TensorRT核心库中的关键接口是:
- 网络定义:“网络定义”接口为应用程序提供了指定网络定义的方法。可以指定输入和输出张量,可以添加图层,还有用于配置每个支持的图层类型的界面。除了层类型(例如卷积层和循环层)以及插件层类型之外,应用程序还可以实现TensorRT本身不支持的功能。有关网络定义的详细信息,请参阅网络定义API。
- 编译器:Builder界面允许从网络定义创建优化引擎。它允许应用程序指定最大批次和工作空间大小,最低可接受的精度水平,计时迭代计算的自动剪枝优化,以及用于量化网络以8位精度运行的接口。有关Builder的更多信息,请参阅Builder API。
- 引擎:Engine接口允许应用程序执行推理。它支持同步和异步执行、分析、枚举和查询引擎输入和输出的绑定。单个引擎可以具有多个执行上下文,允许使用单组训练参数来同时执行多个批次。有关Engine的更多信息,请参阅Execution API。
TensorRT提供解析器,用于导入经过训练的网络以创建网络定义:
- caffe解析器:此解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义图层注册插件工厂的功能。有关C ++ Caffe Parser的更多详细信息,请参阅NvCaffeParser或Python Caffe Parser。
- UFF解析器:此解析器可用于以UFF格式解析网络。它还提供了注册插件工厂和传递自定义图层的字段属性的功能。有关C ++ UFF Parser的更多详细信息,请参阅NvUffParser或Python UFF Parser。
- ONNX解析器:此解析器可用于解析ONNX模型。有关C ++ ONNX Parser的更多详细信息,请参阅NvONNXParser或Python ONNX Parser。
限制:由于ONNX格式正在快速开发,因此您可能会遇到模型版本和解析器版本之间的版本不匹配。 TensorRT 5.0.0附带的ONNX Parser支持ONNX IR(中间表示)版本0.0.3,opset版本7。
1.5 How Do I Get TensorRT?
参考 https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html 安装 TensorRT。