TensorRT 4 开发者手册 中文版 (三-2)

  本手册为TensorRT 4.0.1.6 GA版英文手册翻译而来,博主英文水平一般般,主要作为备忘所用,分享出来以供更多开发者使用。TensorRT Developer Guide手册一共分为四个章节,主要内容在第二、三章,看懂这两章,写代码够用了。第一章为TensorRT综述,就是自吹有多牛逼。第四章为示例,介绍demo的代码结构及功能。开篇是目录,前三章每章为两到三篇,最后第四章示例,会拆分几个关键示例进行详细说明。

第一章 什么是TensorRT?

1.1 TensorRT优势

  TensorRT是一个优化推理引擎,它将训练好的神经网络模型,通过压缩、优化,最后部署一个没有框架开销的运行环境到产品中去。TensorRT合并层、优化卷积核选择,并根据指定精度(FP32、FP16和INT8)执行归一化和转换去优化的矩阵数学,以降低延迟,提高吞吐量和效率。

  对于深度学习推理,有5个用于衡量软件的关键指标:
1. 吞吐量
  给定时间内的输出量。通常以推理/秒或样本/秒来衡量,每服务器吞吐量对于数据中心的成本效益的可扩展性至关重要。
2. 效率
  每单位功率提供的吞吐量,通常表示为性能/瓦特。效率是实现经济高效的数据中心扩展的另一个关键因素,因为服务器,服务器机架和整个数据中心必须在固定的功率预算内运行。
3. 延迟
  执行推理的时间,通常以毫秒为单位。低延迟对于提供快速增长的基于实时推理的服务至关重要。
4. 准确性
  训练有素的神经网络能够提供正确的答案。对于基于图像分类的用法,关键指标表示为Top-5或Top-1百分比。
5. 内存使用情况
  主机和设备内存取决于所使用的神经网络算法需要申请多少内存空间进行推理。这限制了单个神经网络和组合神经网络是否可以在给定的推理平台上运行。这对于需要多个网络且存储器资源有限的系统尤为重要 - 例如用于智能视频分析和多摄像机,多网络自动驾驶系统的级联多级检测网络。

  使用TensorRT的可选方案包含:

   * ‣使用训练框架本身进行推理。*

   * ‣编写专门用于执行网络的自定义应用程序*

  使用低级库和数学运算。

  使用训练框架来执行推理很容易,但是在给定的GPU上,与使用TensorRT等优化解决方案相比,往往会导致性能低得多。 训练框架倾向于实现更加通用的代码,这些代码强调一般性,当优化时,优化往往集中在有效的训练上。

  通过编写自定义应用程序来执行神经网络可以获得更高的效率,但是它可能非常耗费人力并且需要相当多的专业知识才能在GPU上达到高水平的性能。此外,在一个GPU上工作的优化可能无法完全转换到同一系列中的其他GPU,并且每一代GPU都可能引入一些只能通过编写新代码来利用的新功能。TensorRT通过将API与特定硬件细节的高级抽象相结合来解决这些问题,它是专为高吞吐量,低延迟和低设备内存占用的推理而开发和优化的实现。

1.2 TensorRT适用场景

  开发和部署一个深度学习模型通常是通过这三个阶段:
   ‣阶段1训练
   ‣阶段2开发一个部署解决方案
   ‣阶段3部署这个解决方案

第1阶段:训练

  在训练阶段,数据科学家和开发人员将从他们想要解决的问题清单开始,并决定他们将使用的精确输入,输出和损失函数。他们还将收集,策划,扩充,并可能标记训练,测试和验证数据集。然后他们将设计网络结构并训练模型。在训练期间,他们将监控学习过程,该过程可能提供反馈,这将导致他们修改损失函数,获取或扩充训练数据。在此过程结束时,他们将验证模型性能并保存训练模型。训练和验证通常使用DGX-1™,Titan或Tesla数据中心GPU完成。 通常在训练阶段的任何部分都不使用TensorRT。

阶段2:开发部署解决方案

  在第二阶段,数据科学家和开发人员将从训练效果好的模型开始,使用此训练模型创建和验证部署解决方案。将这个阶段分解为如下几个步骤:

  1. 考虑神经网络如何在其所属的较大系统中起作用,并设计和实施适当的解决方案。包含神经网络的系统范围可能非常多样化。例子包括:

   ‣车辆中的自动驾驶系统

   ‣公共场所或企业园区的视频安全系统

   ‣消费者设备的语音接口

   ‣工业生产线自动化质量保证体系

   ‣提供产品推荐的在线零售系统

   ‣提供用户可以上传图像的娱乐过滤的消费者网络服务。

  确定您的优先事项。 鉴于您可以实现的不同系统的多样性,在设计和实现部署体系结构时可能需要考虑很多事项。

   ‣您是否拥有单个网络或多个网络?

   ‣您将使用什么设备或计算单元来运行网络?

   ‣数据如何进入模型?

   ‣将进行哪些预处理?

   ‣您对延迟和吞吐量要求?

   ‣您能够将多个请求批处理放在一起吗?

   ‣您是否需要单个网络的多个实例来实现所需的整体系统吞吐量和延迟?

   ‣您将如何处理网络输出?

   ‣需要哪些后处理步骤?

  TensorRT提供了一个快速,模块化,紧凑,强大,可靠的推理引擎,可以支持部署体系结构中的推理需求。

  1. 在数据科学家和开发人员定义他们的推理解决方案的架构之后,他们通过确定他们的优先级是什么,然后他们使用TensorRT从保存的网络构建推理引擎。 根据所使用的训练框架和网络架构,有很多方法可以做到这一点。 通常,这意味着您需要使用保存的神经网络并使用ONNX解析器(参见图2),Caffe解析器或TensorFlow / UFF解析器将其从保存的格式解析为TensorRT格式。
    ONNX工作流程V1
    图2 ONNX工作流程V1

  2. 在解析网络之后,您需要考虑优化选项 -- 批大小,工作空间大小和混合精度。 选择这些选项并将其指定为TensorRT构建步骤的一部分,您可以根据网络实际构建来优化的推理引擎。 本指南的后续部分提供了有关此工作流程部分的详细说明和大量示例,将您的模型解析为TensorRT并选择优化参数(参见图3)。

TensorRT优化训练神经网络模型产生部署就绪的运行时推理引擎
图3 TensorRT优化训练神经网络模型产生部署就绪的运行时推理引擎

  1. 使用TensorRT创建推理引擎后,您需要验证它是否能复现在训练过程中测试模型的结果。 如果您选择了FP32或FP16,它应该非常接近地匹配结果。 如果您选择了INT8,则在训练期间获得的精度与推理精度之间可能存在小的差距。

  2. 以序列化格式写出推理引擎。 这也称为计划文件。

阶段3:部署解决方案

  TensorRT库将链接到部署的应用程序,该应用程序在需要推理结果时将调用库。 要初始化推理引擎,应用程序将首先将模型从计划文件反序列化为推理引擎。
  TensorRT通常是异步使用的,因此,当输入数据到达时,程序调用enqueue函数并传入输入缓冲区和输入缓冲区的指针地址。

1.3 TensorRT如何工作

  为了优化推理模型,TensorRT采用您的网络定义,执行优化,包括特定于平台的优化,并生成推理引擎。此过程称为构建阶段。构建阶段可能需要相当长的时间,尤其是在嵌入式平台上运行时。因此,典型的应用程序将构建一次引擎,然后将其序列化供以后使用。

  构建阶段在层图上执行以下优化:

   ‣消除未使用输出的层

   ‣融合卷积,偏差和ReLU操作

   ‣具有足够相似的参数和相同的源张量的操作聚合(例如,GoogleNet v5初始模块中的1x1卷积)

   ‣通过将层输出定向到正确的最终地址来合并连接层(非拷贝方式)。

  如有必要,构建器还会修改权重的精度。当以8位整数精度生成网络时,它使用称为校准的过程来确定中间激活的动态范围,并因此确定用于量化的适当缩放因子。此外,构建阶段还在虚拟数据上运行层,以便从其内核目录(kernel catalog)中选择最快的层,并在适当的情况下执行权重预格式化和内存优化。有关更多信息,请参阅使用混合精度。

1.4 API概述

  TensorRT API使开发人员能够导入,校准,生成和部署优化网络。 网络可以直接从Caffe导入,也可以通过UFF或ONNX格式从其他框架导入。 它们也可以使用编程方式通过实例化单个层并直接设置参数和权重来创建。 TensorRT在所有支持的平台上提供C ++实现,在x86上提供Python实现。

  TensorRT核心库中的关键接口是:

网络定义

  “网络定义”接口为应用程序提供了指定网络定义的方法。可以指定输入和输出张量,可以添加层,还有用于配置每种支持的层类型的接口。除了层类型(例如卷积层和循环层)之外,插件层类型还可以使应用程序去实现TensorRT本身不支持的功能。有关网络定义的详细信息,请参阅Network Definition API。

生成器

  “生成器”接口允许从网络定义创建优化引擎。它允许应用程序指定最大批次大小和工作空间大小,最低可接受精度级别,自动调整的校准迭代次数,以及用于INT8量化网络的接口。有关生成器的更多信息,请参阅Builder API。

引擎

  “引擎”接口提供允许应用程序执行推理。它支持同步和异步执行,分析,枚举和查询绑定缓冲区信息,即引擎输入和输出。单个引擎可以具有多个执行上下文,允许一组训练参数用于同时执行多个批次。有关引擎的更多信息,请参阅Execution API。

  TensorRT提供解析器,用于导入经过训练的网络来创建网络定义:

Caffe Parser

  此解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义层注册插件工厂的功能。有关Caffe Parser的更多详细信息,请参阅NvCaffeParser。

Uff Parser

  此解析器用于UFF格式的解析网络。它还提供了注册插件工厂和传递自定义层的字段属性的功能。有关API的更多详细信息,请参阅NvUffParser。

ONNX Parser

  此解析器可用于解析ONNX模型。有关API的更多详细信息,请参阅NvONNXParser。 Python API实现包括一个名为TensorRT Lite的高度抽象的接口。在构建引擎和执行推理时,TensorRT Lite几乎可以处理所有事情,因此,用户可以快速创建引擎并开始处理数据。您可以在tensorrt.lite目录中找到TensorRT Lite。有关更多信息,请参阅TensorRT Lite。

1.5 获取TensorRT

  有关如何安装TensorRT的步骤说明,请参阅“TensorRT Installation Guide”。

发表评论

电子邮件地址不会被公开。 必填项已用*标注