TensorRT 7.2.1 开发概要(下)
一般来说,开发和部署深度学习模型的工作流要经过三个阶段。
Phase 1: Training
在训练阶段,数据科学家和开发人员将首先陈述他们想要解决的问题,然后决定他们将使用的精确输入、输出和损失函数。他们还将收集、整理、扩充并可能标记训练、测试和验证数据集。然后他们将设计网络结构并训练模型。在训练过程中,他们将监控学习过程,这可能会提供反馈,使他们修正损失函数,获取或增加训练数据。在这个过程的最后,他们将验证模型的性能并保存经过训练的模型。训练和验证通常使用DGX-1完成 、Titan或特斯拉数据中心GPU。
TensorRT通常不在训练阶段的任何部分使用。
Phase 2: Developing A Deployment Solution
在第二阶段,数据科学家和开发人员将从经过训练的模型开始,并使用这个经过训练的模型创建和验证部署解决方案。将这个阶段分解为几个步骤,您将得到:
汽车的自动驾驶系统
公共场所或公司校园的视频安全系统
用户设备的语音接口
工业生产线自动化质量保证系统
提供产品推荐的在线零售系统,或
提供娱乐性过滤器的消费者网络服务用户可以应用到上传的图像。
确定你的优先事项。考虑到您可以实现的不同系统的多样性,在设计和实现部署架构时可能需要考虑很多事情。
你有一个网络还是多个网络?例如,您是否正在开发基于单个网络(人脸检测)的功能或系统,您的系统也不会由不同模型的混合或级联组成,或者可能是由最终用户提供的集合模型的更通用的工具组成?
您将使用什么设备或计算元素来运行网络?CPU,GPU,其他,还是混合?如果模型要在GPU上运行,它是单一类型的GPU,还是需要设计一个可以在各种GPU上运行的应用程序?
数据如何到达模型?什么是数据管道?数据来自摄像机或传感器,来自一系列文件,还是通过网络连接上传?
将进行哪些预处理?数据的格式是什么?如果是图像,是否需要裁剪、旋转?如果是文本,它是什么字符集?是否允许所有字符作为模型的输入?有什么特别的代币吗?
您对延迟和吞吐量有什么要求?
你能批量处理多个请求吗?
您是否需要单个网络的多个实例来实现所需的总体系统吞吐量和延迟?
你将如何处理网络的输出?
需要哪些后处理步骤?
TensorRT提供了一个快速、模块化、紧凑、健壮、可靠的推理引擎,可以支持部署架构中的推理需求。
在数据科学家和开发人员定义了他们的推理解决方案的体系结构之后,他们通过确定他们的优先级,然后使用TensorRT从保存的网络中构建一个推理引擎。根据使用的培训框架和网络体系结构,有许多方法可以实现这一点。通常,这意味着您需要使用ONNX解析器(参见图3左侧)、Caffe解析器或UFF解析器将保存的神经网络从保存的格式解析为TensorRT。
2. 在使用TensorRT创建了一个推理引擎之后,您需要验证它是否再现了在训练过程中测量到的模型结果。如果您选择了FP32或FP16,它应该与结果非常接近。如果
您选择了INT8,那么在训练过程中获得的准确度与推理精度之间可能会有一个小差距。
3. 以序列化格式写出推理引擎。这也称为计划文件。
Phase 3: Deploying A Solution
TensorRT库将链接到部署应用程序,该应用程序将在需要推理结果时调用库。为了初始化推理机,应用程序首先将模型从计划文件反序列化到推理机中。
TensorRT通常是异步使用的,因此,当输入数据到达时,程序将调用一个包含输入缓冲区和TensorRT应将结果放入其中的缓冲区的排队函数。
为了优化推理模型,TensorRT获取网络定义,执行包括特定于平台的优化在内的优化,并生成推理引擎。这个过程被称为构建阶段。构建阶段可能需要相当长的时间,尤其是在嵌入式平台上运行时。因此,一个典型的应用程序将构建一个引擎,然后将其序列化为一个计划文件供以后使用。
注意:生成的计划文件不能跨平台或TensorRT版本移植。计划是特定的确切的GPU模型,他们是建立在(除了平台和TensorRT版本),必须重新针对特定的GPU,以防你想在不同的GPU上运行它们。
构建阶段对层图执行以下优化:
如果需要,生成器还可以修改权重的精度。当以8位整数精度生成网络时,它使用一个称为校准的过程来确定中间激活的动态范围,从而确定量化的适当比例因子。
此外,构建阶段还对虚拟数据运行层,以从其内核目录中选择最快的,并在适当的情况下执行权重预格式化和内存优化。
For more information, see Working With Mixed Precision.
1.4. What Capabilities Does TensorRT Provide?
TensorRT使开发人员能够导入、校准、生成和部署优化的网络。网络可以直接从Caffe导入,也可以通过UFF或ONNX格式从其他框架导入。它们也可以通过实例化各个层并直接设置参数和权重来以编程方式创建。
用户还可以使用插件接口通过TensorRT运行自定义层。GraphSurgeon实用程序提供了将TensorFlow节点映射到TensorRT中的自定义层的能力,从而可以使用TensorRT对许多TensorFlow网络进行推理。
TensorRT在所有支持的平台上提供C++实现,以及在x86, aarch64, and ppc64le上实现Python。
TensorRT核心库中的关键接口包括:
网络定义
网络定义接口为应用程序提供指定网络定义的方法。可以指定输入和输出张量,可以添加层,并且有一个用于配置每个支持层类型的接口。以及层类型,如卷积层和递归层,以及插件层类型允许应用程序实现TensorRT本机不支持的功能。有关网络定义的详细信息,请参阅网络定义API。
优化配置文件
优化配置文件指定对动态尺寸的约束。有关详细信息,请参阅优化配置文件API和使用动态形状部分。
生成器配置
生成器配置界面指定创建引擎的详细信息。它允许应用程序指定优化配置文件、最大工作空间大小、可接受的最低精度水平、自动调整的定时迭代计数以及量化网络以8位精度运行的接口。有关更多信息,请参阅构建器配置API。
Builder
生成器接口允许从网络定义和生成器配置创建优化的引擎。有关详细信息,请参阅构建器API。
Engine
引擎接口允许应用程序执行推理。它支持同步和异步执行、分析、枚举和查询引擎输入和输出的绑定。一个引擎可以有多个执行上下文,允许使用一组经过训练的参数同时执行多个批处理。有关引擎的更多信息,请参阅执行API。
TensorRT提供解析器,用于导入经过训练的网络以创建网络定义:
Caffe解析器
该解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络。它还提供了为自定义层注册插件工厂的功能。有关C++ CAFE解析器的更多细节,请参见NvCaffeParser或Python CalpE解析器。
UFF解析器
这个解析器可以用来解析UFF格式的网络。它还提供注册插件工厂和为自定义层传递字段属性的功能。有关C++ UFF解析器的更多细节,请参见NvUffParser或Python UFF解析器。
ONNX解析器
这个解析器可以用来解析ONNX模型。有关C++ ONNX解析器的更多细节,请参见NvONNXParser或Python ONX解析器。
注意:此外,一些TensorRT Caffe和ONNX解析器和插件可以在GitHub上找到。
For step-by-step instructions on how to install TensorRT, see the TensorRT Installation Guide.
Deprecision是一种预先警告功能将消失,这样您就有时间用另一种方法更新代码。从Tensorrt8.0开始,n.x版中不推荐使用的特性将在主发行版(n+2)中删除。例如,TensorRT 8.0将忽略TensorRT 6.0中不推荐使用的功能,其中一些功能早在TensorRT 4.0就已经弃用了。TensorRT 9.0将省略TensorRT 7.x中不推荐使用的功能。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章