本章概述了您可以使用 tensorrt 做什么。它旨在对所有 tensorrt 用户有用。
2.1. c++ and python apis
tensorrt 的 api 具有 c++ 和 python 的语言绑定,具有几乎相同的功能。 python api 促进了与 python 数据处理工具包和库(如 numpy 和 scipy)的互操作性。 c++ api 可以更高效,并且可以更好地满足某些合规性要求,例如在汽车应用中。 注意: python api 并非适用于所有平台。
2.2. the programming model
tensorrt 构建阶段的最高级别接口是builder ( c++ 、 python )。构建器负责优化模型并生成engine 。
为了构建引擎,您需要:
创建网络定义
为builder指定配置
调用builder创建引擎
networkdefinition接口( c++ 、 python )用于定义模型。将模型传输到 tensorrt 的最常见途径是以 onnx 格式从框架中导出模型,并使用 tensorrt 的 onnx 解析器来填充网络定义。但是,您也可以使用 tensorrt 的layer ( c++ , python ) 和tensor ( c++ , python ) 接口逐步构建定义。
无论您选择哪种方式,您还必须定义哪些张量是网络的输入和输出。未标记为输出的张量被认为是可以由构建器优化掉的瞬态值。输入和输出张量必须命名,以便在运行时,tensorrt 知道如何将输入和输出缓冲区绑定到模型。
builderconfig接口( c++ 、 python )用于指定tensorrt如何优化模型。在可用的配置选项中,您可以控制 tensorrt 降低计算精度的能力,控制内存和运行时执行速度之间的权衡,以及限制对 cuda ®内核的选择。由于构建器可能需要几分钟或更长时间才能运行,因此您还可以控制构建器搜索内核的方式,以及缓存搜索结果以供后续运行使用。
一旦有了网络定义和构建器配置,就可以调用构建器来创建引擎。构建器消除了无效计算、折叠常量、重新排序和组合操作以在 gpu 上更高效地运行。它可以选择性地降低浮点计算的精度,方法是简单地在 16 位浮点中运行它们,或者通过量化浮点值以便可以使用 8 位整数执行计算。它还使用不同的数据格式对每一层的多次实现进行计时,然后计算执行模型的最佳时间表,从而最大限度地降低内核执行和格式转换的综合成本。
构建器以称为计划的序列化形式创建引擎,该计划可以立即反序列化,或保存到磁盘以供以后使用。
注意:
tensorrt 创建的引擎特定于创建它们的 tensorrt 版本和创建它们的 gpu。
tensorrt 的网络定义不会深度复制参数数组(例如卷积的权重)。因此,在构建阶段完成之前,您不得释放这些阵列的内存。使用 onnx 解析器导入网络时,解析器拥有权重,因此在构建阶段完成之前不得将其销毁。
构建器时间算法以确定最快的。与其他 gpu 工作并行运行构建器可能会扰乱时序,导致优化不佳。
2.2.2. the runtime phase
tensorrt 执行阶段的最高级别接口是runtime( c++ 、 python )。 使用运行时时,您通常会执行以下步骤:
反序列化创建引擎的计划(plan 文件)
从引擎创建执行上下文(context) 然后,反复:
填充输入缓冲区以进行推理
调用enqueue()或execute()以运行推理
engine接口( c++ 、 python )代表一个优化模型。您可以查询引擎以获取有关网络输入和输出张量的信息——预期的维度、数据类型、数据格式等。
executioncontext接口( c++ 、 python )是调用推理的主要接口。执行上下文包含与特定调用关联的所有状态 – 因此您可以拥有与单个引擎关联的多个上下文,并并行运行它们。
调用推理时,您必须在适当的位置设置输入和输出缓冲区。根据数据的性质,这可能在 cpu 或 gpu 内存中。如果根据您的模型不明显,您可以查询引擎以确定在哪个内存空间中提供缓冲区。
设置缓冲区后,可以同步(执行)或异步(入队)调用推理。在后一种情况下,所需的内核在 cuda 流上排队,并尽快将控制权返回给应用程序。一些网络需要在 cpu 和 gpu 之间进行多次控制传输,因此控制可能不会立即返回。要等待异步执行完成,请使用cudastreamsynchronize在流上同步。
2.3. plugins
tensorrt 有一个plugin接口,允许应用程序提供 tensorrt 本身不支持的操作的实现。在转换网络时,onnx 解析器可以找到使用 tensorrt 的pluginregistry创建和注册的插件。
tensorrt 附带一个插件库,其中许多插件和一些附加插件的源代码可以在此处找到。
请参阅使用自定义层扩展 tensorrt一章。
2.4. types and precision
tensorrt 支持使用 fp32、fp16、int8、bool 和 int32 数据类型的计算。 当 tensorrt 选择 cuda 内核在网络中实现浮点运算时,它默认为 fp32 实现。有两种方法可以配置不同的精度级别:
为了在模型级别控制精度, builderflag选项( c++ 、 python )可以向 tensorrt 指示它在搜索最快时可能会选择较低精度的实现(并且因为较低的精度通常更快,如果允许的话,它通常会)。 因此,您可以轻松地指示 tensorrt 为您的整个模型使用 fp16 计算。对于输入动态范围约为 1 的正则化模型,这通常会产生显着的加速,而准确度的变化可以忽略不计。
对于更细粒度的控制,由于网络的一部分对数值敏感或需要高动态范围,因此层必须以更高的精度运行,可以为该层指定算术精度。
请参阅降低精度部分。
2.5. quantization
tensorrt 支持量化浮点,其中浮点值被线性压缩并四舍五入为 8 位整数。这显着提高了算术吞吐量,同时降低了存储要求和内存带宽。在量化浮点张量时,tensorrt 需要知道它的动态范围——即表示什么范围的值很重要——量化时会钳制超出该范围的值。
动态范围信息可由构建器根据代表性输入数据计算(这称为校准–calibration)。或者,您可以在框架中执行量化感知训练,并将模型与必要的动态范围信息一起导入到 tensorrt。
请参阅使用 int8章节。
2.6. tensors and data formats
在定义网络时,tensorrt 假设张量由多维 c 样式数组表示。每一层对其输入都有特定的解释:例如,2d 卷积将假定其输入的最后三个维度是 chw 格式 – 没有选项可以使用,例如 whc 格式。有关每个层如何解释其输入,请参阅tensorrt 网络层一章。
请注意,张量最多只能包含 2^31-1 个元素。 在优化网络的同时,tensorrt 在内部执行转换(包括到 hwc,但也包括更复杂的格式)以使用尽可能快的 cuda 内核。通常,选择格式是为了优化性能,而应用程序无法控制这些选择。然而,底层数据格式暴露在 i/o 边界(网络输入和输出,以及将数据传入和传出插件),以允许应用程序最大限度地减少不必要的格式转换。
请参阅i/o 格式部分
2.7. dynamic shapes
默认情况下,tensorrt 根据定义时的输入形状(批量大小、图像大小等)优化模型。但是,可以将构建器配置为允许在运行时调整输入维度。为了启用此功能,您可以在构建器配置中指定一个或多个optimizationprofile ( c++ 、 python )实例,其中包含每个输入的最小和最大形状,以及该范围内的优化点。
tensorrt 为每个配置文件创建一个优化的引擎,选择适用于 [最小、最大] 范围内的所有形状的 cuda 内核,并且对于优化点来说是最快的——通常每个配置文件都有不同的内核。然后,您可以在运行时在配置文件中进行选择。
请参阅使用动态形状一章。
2.8. dla
tensorrt 支持 nvidia 的深度学习加速器 (dla),这是许多 nvidia soc 上的专用推理处理器,支持 tensorrt 层的子集。 tensorrt 允许您在 dla 上执行部分网络,而在 gpu 上执行其余部分;对于可以在任一设备上执行的层,您可以在构建器配置中逐层选择目标设备。
请参阅使用 dla章节。
2.9. updating weights
在构建引擎时,您可以指定它可能需要稍后更新其权重。如果您经常在不更改结构的情况下更新模型的权重,例如在强化学习中或在保留相同结构的同时重新训练模型时,这将很有用。权重更新是通过refitter ( c++ , python ) 接口执行的。
请参阅refitting an engine 部分。
2.10. trtexec
示例目录中包含一个名为trtexec的命令行包装工具。 trtexec是一种无需开发自己的应用程序即可快速使用 tensorrt 的工具。 trtexec工具有三个主要用途:
在随机或用户提供的输入数据上对网络进行基准测试。
从模型生成序列化引擎。
从构建器生成序列化时序缓存。
请参阅trtexec部分。
2.11. polygraphy
polygraphy 是一个工具包,旨在帮助在 tensorrt 和其他框架中运行和调试深度学习模型。它包括一个python api和一个使用此 api 构建的命令行界面 (cli) 。
除此之外,使用 polygraphy,您可以:
在多个后端之间运行推理,例如 tensorrt 和 onnx-runtime,并比较结果(例如api 、 cli )
将模型转换为各种格式,例如具有训练后量化的 tensorrt 引擎(例如api 、 cli )
查看有关各种类型模型的信息(例如cli )
在命令行上修改 onnx 模型:
提取子图(例如cli )
简化和清理(例如cli )
隔离 tensorrt 中的错误策略(例如cli )
关于作者
ken he 是 nvidia 企业级开发者社区经理 & 高级讲师,拥有多年的 gpu 和人工智能开发经验。自 2017 年加入 nvidia 开发者社区以来,完成过上百场培训,帮助上万个开发者了解人工智能和 gpu 编程开发。在计算机视觉,高性能计算领域完成过多个独立项目。并且,在机器人和无人机领域,有过丰富的研发经验。对于图像识别,目标的检测与跟踪完成过多种解决方案。曾经参与 gpu 版气象模式grapes,是其主要研发者。
云天励飞将聚焦三大方向 实现AI边缘赋能
本届世界杯爆火的背后,离不开芯片的努力
一个工程师关于FPGA项目的感言
美国强硬插手中国收购全球第二大OLED驱动芯片企业
2022年17家国产车规级原厂MCU盘点
TensorRT的功能与应用分析
新型电阻梯乘法DAC应用于交流信号处理
基于MEMS技术的等离激元近红外光谱仪制造
QCC3056下source程序如何解决在HFP下没有音量同步功能的问题
Redmi7+AirDots高清图赏
TE CONNECTIVITY推出增强型C型USB连接器
PCB叠层结构与阻抗计算笔记分享
OPPO Find X搭载3D结构光人脸识别技术与潜望式双摄技术
高分子PTC自复保险丝与其它过流保护器件的区别
智芯智能档案室实现安防智慧化、安防等级全面提升
无线通信SCADA系统的实现与应用
联电公司证实12吋晶圆代工价格也开始调涨
双鹿电池质量管理投入
蓝牙mesh在智能家居中有着至关重要的作用
国产源表用于激光二极管LD的LIV特性测试实验