Nvidia TensorRT系列01-TensorRT的功能1

简介: NVIDIA TensorRT是一个高性能深度学习推理优化器和运行时,支持C++和Python API。其编程模型分为构建阶段和运行时阶段,前者优化模型,后者执行推理。TensorRT支持多种数据类型和精度,包括FP32、FP16、INT8等,并提供插件机制以扩展支持的操作。

Nvidia TensorRT系列01-TensorRT的功能1

B站:肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com)

博客:肆十二-CSDN博客

问答:(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com)

C++和Python API

TensorRT的API同时支持C++和Python两种语言,两者的功能几乎完全相同。Python API便于与Python数据处理工具包和库(如NumPy和SciPy)进行互操作。C++ API可能更高效,并可能更好地满足某些合规性要求,例如在汽车应用中。

注意:Python API并非在所有平台上都可用。更多信息请参考NVIDIA TensorRT支持矩阵。

编程模型

TensorRT在两个阶段中运行。在第一阶段,通常在线下进行,您为TensorRT提供一个模型定义,然后TensorRT会针对目标GPU进行优化。在第二阶段,您使用优化后的模型来运行推理。

第一阶段 构建阶段

TensorRT构建阶段的最高级接口是Builder(C++, Python).。构建器负责优化模型并生成一个Engine。

为了构建一个引擎,您必须:

  1. 创建一个网络定义。
  2. 为构建器指定配置。
  3. 调用构建器来创建引擎。

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。请参阅版本兼容性和硬件兼容性部分(Version Compatibility and Hardware Compatibility ),了解如何为向前兼容性配置引擎。

TensorRT的网络定义不会深度复制参数数组(例如卷积的权重)。因此,在构建阶段完成之前,您不得释放这些数组的内存。当使用ONNX解析器导入网络时,解析器拥有权重,因此在构建阶段完成之前不得销毁它。

构建器会计算算法的时间以确定最快的算法。如果构建器与其他GPU工作并行运行,可能会干扰计时,从而导致优化效果不佳。

第二阶段 运行时阶段(runtime)

TensorRT执行阶段的最高级别接口是运行时(Runtime) (C++, Python).。
在使用运行时,你通常会执行以下步骤:
反序列化一个计划以创建一个引擎。
从引擎中创建一个执行上下文。
然后,重复以下步骤:
为推理填充输入缓冲区。
在执行上下文上调用enqueueV3()来运行推理。
引擎接口(Engine) (C++, Python) 代表一个优化的模型。你可以查询引擎以获取有关网络输入和输出张量的信息——预期的维度、数据类型、数据格式等。

从引擎创建的执行上下文接口(ExecutionContext) (C++, Python) 是调用推理的主要接口。执行上下文包含与特定调用相关联的所有状态——因此,你可以有一个引擎关联的多个上下文,并并行运行它们。

在调用推理时,你必须在适当的位置设置输入和输出缓冲区。根据数据的性质,这可能是在CPU或GPU内存中。如果你的模型不明显,你可以查询引擎以确定在哪个内存空间中提供缓冲区。

设置好缓冲区后,可以排队进行推理(enqueueV3)。所需的内核在CUDA流上排队,并尽快将控制权返回给应用程序。有些网络需要CPU和GPU之间进行多次控制传输,因此控制权可能不会立即返回。要等待异步执行完成,请使用cudaStreamSynchronize在流上进行同步。

插件

TensorRT具有插件接口,允许应用程序提供TensorRT本身不支持的操作实现。在转换网络时,ONNX解析器可以找到并使用在TensorRT的PluginRegistry中创建和注册的插件。

TensorRT附带了一个插件库,可以在此处找到其中许多插件以及一些额外插件的源代码。here.

您也可以编写自己的插件库,并将其与引擎一起序列化。

如果需要cuDNN或cuBLAS,请安装该库,因为TensorRT不再附带它们。要获取cudnnContext或cublasContext,必须使用nvinfer1::IBuilderConfig::setTacticSource()设置相应的TacticSource标志。

有关更多详细信息,请参阅“使用自定义层扩展TensorRT”一章。

支持的类型和精度

类型

TensorRT支持FP32、FP16、BF16、FP8、INT4、INT8、INT32、INT64、UINT8和BOOL数据类型。有关层I/O数据类型的规范,请参阅TensorRT操作符文档。

  • FP32、FP16、BF16:未量化的浮点类型

  • INT8:低精度整数类型

    • 隐式量化
    • 解释为量化的整数。INT8类型的张量必须具有一个相关的比例因子(通过校准或setDynamicRange API设置)。
    • 显式量化
    • 解释为有符号整数。从INT8类型转换或转换到INT8类型需要一个明确的Q/DQ层。
  • INT4:用于权重压缩的低精度整数类型

    • INT4仅用于权重量化。在执行计算之前需要进行反量化。
    • 从INT4类型转换或转换到INT4类型需要一个明确的Q/DQ层。
    • INT4权重预计将通过每字节打包两个元素进行序列化。有关更多信息,请参阅“量化权重”部分。
  • FP8:低精度浮点类型

    • 8位浮点类型,其中1位用于符号,4位用于指数,3位用于尾数
    • 从FP8类型转换或转换到FP8类型需要一个明确的Q/DQ层。
  • UINT8:无符号整数I/O类型

    • 数据类型只能用作网络I/O类型。
    • 在UINT8中的网络级输入必须在使用数据执行其他操作之前,使用CastLayer从UINT8转换为FP32或FP16。
    • UINT8中的网络级输出必须由明确插入到网络中的CastLayer生成(将仅支持从FP32/FP16到UINT8的转换)。
    • 不支持UINT8量化。
    • ConstantLayer不支持UINT8作为输出类型。
  • BOOL

    • 与支持层一起使用的布尔类型。

强类型和弱类型

当向TensorRT提供网络时,您需要指定它是强类型还是弱类型,默认为弱类型。

对于强类型网络,TensorRT的优化器将根据网络输入类型和操作符规范静态推断中间张量类型,这与框架中的类型推断语义相匹配。然后,优化器将严格遵守这些类型。有关更多信息,请参阅强类型网络。

对于弱类型网络,如果可以提高性能,TensorRT的优化器可能会为张量替换不同的精度。在这种模式下,TensorRT默认对所有浮点运算使用FP32,但有两种方法可以配置不同级别的精度:

要在模型级别控制精度,可以使用BuilderFlag选项(C++,Python)向TensorRT指示,在搜索最快速度时,它可以选择较低精度的实现(并且由于较低精度通常更快,如果允许,它通常会这样做)。

例如,通过设置单个标志,您可以轻松地指示TensorRT对整个模型使用FP16计算。对于输入动态范围大约为1的正则化模型,这通常会在精度变化可忽略不计的情况下显著提高速度。

为了进行更精细的控制,如果某层必须以更高精度运行,因为网络的部分区域对数字敏感或需要高动态范围,则可以为该层指定算术精度。

有关更多详细信息,请参阅弱类型网络中的降低精度。

目录
相关文章
|
2天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1519 4
|
29天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
502 19
|
2天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
457 5
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
314 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2608 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析