这一系列的学习将从官网的开发者指南翻译加理解开始,如果有什么不对的地方请多指正。
这个直接去官网就可以看到,链接:https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html
TensorRT 5.0.4开发人员指南展示了如何使用C ++和Python API实现最常见的深度学习(网络)层(指实现网络层的删除、合并等操作,有些层在推断阶段是不需要的,有些层是可以合并处理的,后面会讲到)。 它展示了如何使用现有模型构建深度学习框架,并使用它来搭配解析器构建TensorRT引擎。 开发人员指南还提供了用户常见任务的详细说明,例如,创建TensorRT网络的定义、调用TensorRT构建器、序列化和反序列化,以及如何向引擎提供数据和执行推理; 所有这些都是C ++或Python API实现的。 最后,文档还为每个包供了参考样例。
老版本的文档都在:https://docs.nvidia.com/deeplearning/sdk/tensorrt-archived/index.html
1.什么是TensorRT
TensorRT™是一个可以促进NVIDIA图形处理单元(GPU)进行高性能推断的C ++库。它的出现是为了和诸如TensorFlow、Caffe、PyTorch、MXNet等训练框架进行互补的。它专注于在GPU上快速有效地运行已经过训练的网络以便进一步提高效率(所涉及的方面包括评分(socring)、检测、回归或推理过程)。
有些框架集成了TensorRT(如TensorFlow)以便在框架内进行推理。此外,TensorRT还可以当做用户应用程序中的一个库使用。它还包括用于从Caffe、ONNX或TensorFlow导入现有模型的解析器,以及用于构建模型的C ++和Python API。
图 1
(图1. TensorRT是一个用于生产部署的高性能神经网络推理优化器和运行引擎)
TensorRT通过组合层(层合并)和优化内核选择来优化网络,从而改善延迟,吞吐量,功效和内存消耗。根据应用程序的指定,它还可以通过以更低的精度运行、进一步提高性能并降低内存需来求优化网络。(意思就是比较灵活,可以根据自己的应用需求去调整引擎的运行策略)
下图展示了TensorRT被定义为高性能推理优化器和部件运行引擎的一部分。它可以采用在流行框架上训练的神经网络,优化神经网络计算,生成轻量级运行引擎(runtime翻译是‘运行’,但其实我理解为‘实时’)(这是部署到生产环境的唯一方法),并且它将在这些GPU平台上最大化吞吐量,延迟和性能。
图 2
(图2. TensorRT是一种可编程的推理加速器)
TensorRT API包括最常见的深度学习层的实现。有关图层的更多信息,请参阅TensorRT Layers(https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/index.html),你还可以使用C ++ Plugin API(https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_plugin.html)或Python Plugin API(https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/infer/Plugin/pyPlugin.html)为TensorRT不支持的不常用或更具创新性的层提供实现。
1.1 TensorRT的好处
在神经网络训练之后,TensorRT能够压缩、优化网络,并可以直接部署运行,摆脱对框架的依赖(tensorflow、caffe等)。
TensorRT结合了层(合并),优化了内核选择,并根据指定的精度(FP32,FP16或INT8)执行归一化和矩阵优化转换,以提高延迟,吞吐量和效率。对于深度学习推理,有5个用于衡量软件的关键因素:
!!吞吐量:给定时期内的产出量。 通常以每秒推理个数、每秒样本数以及每台服务器的吞吐量作为衡量标准,这些指标对于成本效益的增减至关重要。
!!效率:每单位功率提供的吞吐量,通常表示为性能/瓦特。 效率是实现成本效益增减的另一个关键因素,因为服务器,服务器机架和整个数据资源中心必须在固定功率预算内运行。
!!延迟:执行推理的时间,通常以毫秒为单位。 低延迟对于提供快速增长的基于实时推理的服务至关重要。
!!精度:有效训练的神经网络能够提供正确的结果。 对于图像分类而言,关键指标为top-5或top-1所占的百分比。
!!内存消耗:主机和其他设备在网络上执行推理所需的内存依赖于所使用的算法。这限制了网络和网络的哪些组合可以在给定的推理平台上运行。这对于需要多个网络且内存资源有限的系统尤为重要,比如用于智能视频分析和多摄像头,多网络自动驾驶系统的级联多级检测网络。
TensorRT的替代方案只有:1.使用训练框架本身进行推理。2.编写使用低级库和数学运算实现的专门用于执行网络推断的自定义应用程序。(这意思就是别想了,还是用TensorRT吧)
使用训练框架进行推理很容易,但是在给定的GPU上,与使用TensorRT等优化解决方案相比,往往会导致性能低得多。训练框架倾向于实现更加通用的代码,这些代码强调一般性,当优化时,优化往往侧重于有效的训练而不是有效的推理。通过编写自定义应用程序来执行神经网络可以获得更高的效率,但是它可能非常耗费人力并且需要相当多的专业知识才能在现代GPU上达到高水平的性能。此外,在一个GPU上工作的优化可能无法完全转换到同一系列中的其他GPU,并且每一代GPU都可能引入只能通过编写新代码来利用的新功能(怎么样死心了没,服不服,还是用TensorRT吧!)。TensorRT通过将API与特定硬件细节的高级抽象相结合,以及专为高吞吐量,低延迟和低设备内存占用推断而开发和优化的实现来解决这些问题。
1.1.1 哪些项目可以用到TensorRT?
TensorRT旨在供那些负责基于新的或现有深度学习模型构建功能和应用程序或将模型部署到生产环境中的工程师使用。这些部署可能是数据中心或云中的服务器,嵌入式设备,机器人或车辆中的服务器,或者将在用户工作站上运行的应用程序软件。TensorRT已成功应用于各种场景,包括以下情况:
机器人:运行各种计算机视觉模型,以自主地引导在动态环境中飞行的无人机系统。
自动驾驶汽车:TensorRT用于为NVIDIA Drive产品中的计算机视觉提供动力。
科研计算:比较流行的计算软件包嵌入了TensorRT,可实现神经网络模型的高吞吐量执行。
深度学习训练和部署框架:TensorRT包含在几个流行的深度学习框架中,包括TensorFlow和MXNet。 有关TensorFlow和MXNet容器发行说明,请参阅TensorFlow Release Notes (https://docs.nvidia.com/deeplearning/dgx/tensorflow-release-notes/index.html)和 MXNet Release Notes(https://docs.nvidia.com/deeplearning/dgx/mxnet-release-notes/index.html)。
视频分析:TensorRT在NVIDIA的DeepStream产品(https://developer.nvidia.com/)中使用,可以为存在1到16个摄像头输入的场景以及数百甚至数千个视频源组合在一起的数据中心提供复杂的视频分析解决方案。
自动语音识别:TensorRT可用于在小型桌面或桌面设备上提供语音识别功能。 以云存储中可用的词汇量较大的词汇识别系统为后台,这些设备能支持一定的语音识别场景。
1.2 哪些阶段适合使用TensorRT?
开发和部署深度学习模型的工作流程一般分为三个阶段:1.训练;2.提出部署解决方案;3.完成部署
训练阶段:数据科学家和开发人员将从他们想要解决的问题的描述出发,决定他们将使用的输入,输出和损失函数。他们可能还要收集,筛选,扩充,并标记训练,测试和验证数据集。接着设计网络结构,训练模型。在训练期间,他们将监督学习过程,这个过程中会有一定反馈,他们根据反馈修改损失函数,获取或增加训练数据。最后他们将验证模型性能并保存模型。训练和验证通常使用DGX-1™ , Titan, or Tesla。TensorRT通常在训练阶段的任何部分都不使用。
设计部署解决方案:在第二阶段,数据科学家和开发人员将从训练效果较好的模型开始,使用此训练模型创建和验证部署解决方案。主要包括以下步骤:
1.思考神经网络如何在其所在的更大的系统中运作的,并设计和实施适当的解决方案。其中可能包含的神经网络的系统范围非常多样化。比如包括:车辆中的自动驾驶系统;公共场所或企业园区的视频安全系统;消费者设备的语音接口;工业生产线自动化质量保证体系;提供产品推荐的在线零售系统;用户可以上传图像提供娱乐过滤器的消费者Web服务。
在设计和实现部署时可能需要考虑很多事情,确定你事情的优先级,给出你可以实现的不同系统的差异性。包括以下情况:你有一个网络或许多网络吗? 例如,你是在开发基于单个网络的特征或系统(面部检测),还是你的系统由不同模型的混合或级联组成,或者可能是由最终用户提供集合模型的更通用设施?。。。(后面省略一些吧,都是些问题)
TensorRT提供了一个快速,模块化,紧凑,强大,可靠的推理引擎,可以支持部署体系结构中的推理需求。
2.在数据科学家和开发人员定义他们的推理解决方案的架构之后,他们通过它确定他们的优先级是什么,然后他们使用TensorRT通过已经保存的网络构建推理引擎。根据所使用的训练框架和网络架构,有很多方法可以做到这一点。通常,这意味着你需要使用已保存的神经网络结合ONNX解析器、Caffe解析器、Tensorflow解析器等方法将其从保存的格式中解析为TensorRT需要的格式。(下图所示)
图 3
3.在解析网络之后,你需要考虑优化选项 - 批量大小,工作空间大小和混合精度。选择这些选项并将其指定为TensorRT构建步骤的一部分,你可以根据网络实际构建出优化的推理引擎。本指南的后续部分提供了有关此工作流程部分的详细说明和大量示例,将模型解析为TensorRT并选择优化参数。
图 4
(图4.TensorRT优化经过训练的神经网络模型,以生成部署就绪的运行时推理引擎。)
4.使用TensorRT创建推理引擎后,你需要验证它产生的结果是否和训练完成后直接推理的结果效果相同。如果你选择了FP32或FP16,它应该非常接近之前的结果。如果你选择了INT8,则在训练期间获得的精度与推理精度之间可能存在小的差距。
5.以序列化格式写出推理引擎。 这也称为计划文件。
部署解决方案: 在第三阶段,TensorRT库将链接到部署应用程序中,当需要推理结果时,该应用程序将调用库。要初始化推理引擎,应用程序将首先将模型从计划文件反序列化为推理引擎。TensorRT通常是异步使用的,因此,当输入数据到达时,程序使用输入缓冲区和TensorRT应该放置结果的缓冲区调用enqueue函数
1.3 TensorRT是怎么工作的?
为了优化推理模型,TensorRT采用你的网络定义,执行优化,包括特定平台的优化,并生成推理引擎。此过程称为构建阶段。构建阶段可能需要相当长的时间,尤其是在嵌入式平台上运行时。因此,典型的应用程序将构建一次引擎,然后将其序列化为计划文件以供以后使用。注意:生成的计划文件不能跨平台或用于TensorRT版本移植(用于其他版本的 TensorRT)。计划专门为他们构建的确切GPU模型制定(除了平台和TensorRT版本)并且必须能够重新定位到特定的GPU,以方便你想在不同的GPU上运行它们。构建阶段在图层图(layer graph?)上执行以下优化:去掉输出没有用的层;融合卷积,偏置和ReLU操作;融合比较相似的参数以及具有同源张量的操作(例如,GoogleNet v5初始模块中的1x1卷积);通过将层输出定向到最终目标来合并连接层。
如有必要,构建器还会修改权重的精度。当以8位整数精度生成网络时,它使用称为校准的过程来确定中间激活的动态范围,并因此确定用于量化的适当缩放因子。此外,构建阶段还在虚拟数据上运行图层以从其内核中选择最快的图像,并在适当的情况下执行权重预格式化和内存优化。
1.4 TensorRT提供了哪些功能?
TensorRT使开发人员能够导入,校准,生成和部署优化网络。网络可以直接从Caffe导入,也可以通过UFF或ONNX格式从其他框架导入。它们也可以通过实例化单个图层并直接设置参数和权重来以编程方式创建。用户还可以使用Plugin界面通过TensorRT运行自定义图层。通过graphurgeon实用程序,可以将TensorFlow节点映射到TensorRT中的自定义层,从而可以使用TensorRT对许多TensorFlow网络进行推理。
TensorRT在所有支持的平台上提供C ++实现,在x86上提供Python实现。TensorRT核心库中的关键接口有:
网络定义:网络定义接口为应用程序提供了指定网络的定义方法。可以指定输入和输出张量,可以添加图层,还有用于配置每个支持的图层类型的接口。除了层类型(例如卷积层和循环层)以及插件层类型之外,应用程序还可以实现TensorRT本身不支持的功能。更多关于层定义的信息请参考:https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_network_definition.html
生成器:生成器接口允许从网络定义角度创建优化引擎。它允许应用程序指定maximum batch和workspace size,最小可接受精度水平,自动调整的计时迭代计数,以及用于量化网络以8位精度运行的接口。更多信息请看:https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_builder.html
引擎:引擎接口允许应用程序执行推理。引擎的输入和输出支持同步和异步执行,分析,枚举和查询绑定。单个引擎可以具有多个执行上下文,允许使用单组训练参数来同时执行多个批次。更多信息https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_cuda_engine.html
TensorRT提供解析器,用于导入经过训练的网络以创建网络定义:
Caffe 解析器:此解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义图层注册插件工厂的功能。更多信息:C++ https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvcaffeparser1_1_1_i_caffe_parser.html python https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/parsers/Caffe/pyCaffe.html
UFF解析器:此解析器可用于以UFF格式解析网络。 它还提供了注册插件工厂和传递自定义图层的字段属性的功能。有关C ++ UFF Parser的更多详细信息:https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvuffparser_1_1_i_uff_parser.html python https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/parsers/Uff/pyUff.html
ONNX解析器:此解析器可用于解析ONNX模型。有关C ++ ONNX Parser的更多详细信息:https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/ python https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/parsers/Onnx/pyOnnx.html
限制:由于ONNX格式开发迅速,所以你可能会遇到模型版本和解析器版本之间的版本不匹配。 TensorRT 5.0.0附带的ONNX Parser支持ONNX IR版本0.0.3,opset版本7。