TensorRT的功能

news2024/11/24 16:12:40

TensorRT的功能

在这里插入图片描述

文章目录

  • TensorRT的功能
    • 2.1. C++ and Python APIs
    • 2.2. The Programming Model
      • 2.2.2. The Runtime Phase
    • 2.3. Plugins
    • 2.4. Types and Precision
    • 2.5. Quantization
    • 2.6. Tensors and Data Formats
    • 2.7. Dynamic Shapes
    • 2.8. DLA
    • 2.9. Updating Weights
    • 2.10. trtexec

本章概述了您可以使用 TensorRT 做什么。它旨在对所有 TensorRT 用户有用。

2.1. C++ and Python APIs

TensorRT 的 API 具有 C++ 和 Python 的语言绑定,具有几乎相同的功能。 Python API 促进了与 Python 数据处理工具包和库(如 NumPy 和 SciPy)的互操作性。 C++ API 可以更高效,并且可以更好地满足某些合规性要求,例如在汽车应用中。
注意: Python API 并非适用于所有平台。有关详细信息,请参阅NVIDIA TensorRT 支持矩阵。

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 支持使用 FP32FP16INT8BoolINT32 数据类型的计算。
当 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 )

有关更多详细信息,请参阅Polygraphy 存储库。

更多精彩内容:
https://www.nvidia.cn/gtc-global/?ncid=ref-dev-876561

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

狂神 VUE笔记

文章目录0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 [Vue](https://so.csdn.net/so/search?qVue&spm1001.2101.3001.7020)的七大属性1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind1.2 v-if , v-else , v-else-i…

Burp Suite Professional 2023.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接:https://sysin.org/blog/burp-suite-pro-2023/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org Burp Suite Professional&…

【Spring】一文带你吃透AOP面向切面编程技术(下篇)

个人主页: 几分醉意的CSDN博客_传送门 上节我们介绍了什么是AOP、Aspectj框架的前置通知Before传送门,这篇文章将继续详解Aspectj框架的其它注解。 文章目录💖Aspectj框架介绍✨JoinPoint通知方法的参数✨后置通知AfterReturning✨环绕通知Ar…

mysql数据库完全备份和增量备份与恢复

mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…

基于stm32mp157的嵌入式linux+qt项目实战物联网毕业设计选题之智慧医疗项目

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器,集成2个Cortex-A7核和1个Cortex-M4 核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRT…

吃瓜教程 | Datawhale 打卡(Task 01)

第1章 绪论 引言 机器学习致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。 “经验”通常以“数据”的形式存在。 机器学习研究的主要内容: 在计算机上从数据中产生“模型”(model)的算法,即“学习算法…

软件开发风险 需要规避的4个重点

1、前期减少投资 开发软件,最好减少前期的投入。软件开发成本高低是取决于所需开发的功能,需求越多,需要实现的功能越多,开发成本就越高。在不确定开发软件能够带来预期价值的情况下,建议先开发核心功能,辅…

分享166个HTML医疗保健模板,总有一款适合您

分享166个HTML医疗保健模板,总有一款适合您 166个HTML医疗保健模板下载链接:https://pan.baidu.com/s/1tBFEInec5Jnw_ShQd21MJg?pwdakif 提取码:akif Python采集代码下载链接:采集代码.zip - 蓝奏云 import os import shuti…

【残差稠密网络:医学图像:超分】

Residual dense network for medical magnetic resonance images super-resolution (医学磁共振图像超分辨率的残差稠密网络) 高分辨率磁共振成像(MRI)有助于专家定位病灶和诊断疾病,但高分辨率MRI难以获得。此外&am…

PyQt5数据库开发1 4.2 配置SQL Server 2008 数据源(ODBC编程)

文章目录 配置SQL Server 2008 数据源(ODBC编程) 1. 了解要配置的数据源服务器名称,以及数据库和对应表 2. 打开控制面板,点击管理工具 3. 双击数据源 4. 选择“用户DSN”选项卡,点击“添加” 5. 选择SQL Serv…

晚上下班之后可以做什么副业,业余时间需要利用起来

对大多数普通人来说,他们晚上有很多空闲时间,但他们总是在手机上玩游戏,刷视频,白白度过一夜。事实上,近年来,很多朋友都想利用晚上的时间做一些副业,因为目前的工资已经不能满足自己的需求&…

第05章_MySQL排序与分页

第05章_排序与分页 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 排序数据 如果没有使用排序操作,默认情况下查询返回的数据时按照添加数据的顺序显示的 SELECT employee_id, la…

yocto创建自己的machine

前面讲了如何离线构建yocto工程,这节讲如何创建自己的machine,在初始化yocto启动bitbake需要输入如下命令 DISTROfsl-imx-fb MACHINEimx6ull14x14evk source imx-setup-release.sh -b build其中DISTRO用来指定发行版本 MACHINE用来指定硬件平台 build为构…

HTML复习1

VSCode 工具生成骨架标签新增代码 < !DOCTYPE html>表示的什么意思&#xff1f; 这句代码的意思是&#xff1a;当前页面采取的是HTML5版本来显示网页. 注意&#xff1a; < !DOCTYPE> 声明位于文档中的最前面的位置&#xff0c;处于 < html> 标签之前。< …

SAP S/4HANA Cloud 2302 财务模块亮点

&#xff08;亮点1:&#xff09;含项目制造的按订单设计 (ETO) 使用 SAP S/4HANA Cloud 2302&#xff0c;新的范围项目 6GD首先发布在德国和美国的国家版本下&#xff0c;提供项目制造的按订单设计 (ETO)的功能。 价值体现 借助 ETO 解决方案&#xff0c;您可以&#xff1a;…

【模型部署】TensorRT的安装与使用

文章目录1.TensorRT的安装1.1 cuda/cudnn以及虚拟环境的创建1.2 根据cuda版本安装相对应版本的tensorRT2. TensorRT的使用2.1 直接构建2.2 使用 Python API 构建2.3 使用 C API 构建2.3.1 属性配置2.3.2 验证2.4 IR 转换模型2.4.1 使用 Python API 转换2.4.2 使用 C API 转换2.…

Moonbeam生态说|走近生态项目SubWallet

「Moonbeam生态说」是Moonbeam中文爱好者社区联合Moonbeam中文高级大使组织的社区AMA活动。该活动为已部署Moonriver或Moonbeam的项目方提供了在主流Moonbeam非官方中文社区内介绍自己的项目信息&#xff0c;包括&#xff1a;项目介绍、团队介绍、技术优势等&#xff0c;帮助社…

【Unity VR开发】结合VRTK4.0:创建抽屉

语录&#xff1a; 为有牺牲多壮志&#xff0c;敢叫日月换新天。 前言&#xff1a; 前面我们知道了门的基本实现原理是通过角度驱动器实现的&#xff0c;那么今天我们来实现一下抽屉的实现原理&#xff1a;线性驱动器。 正文&#xff1a; 步骤一&#xff1a; 首先我们需要在新…

零基础学Java要具备哪些前提条件?

很多零基础的学员对于学Java比较迷茫&#xff0c;想通过学Java掌握一技之长&#xff0c;却不知道入门需要具备哪些条件?不知道怎么去学习?下面详细来和大家聊聊&#xff1a;首先&#xff0c;要对Java语言感兴趣&#xff0c;兴趣是最好的老师&#xff0c;只有拥有兴趣才能在学…

浅析云边端协同架构的应用意义与EasyCVR视频融合能力升级

随着5G时代的到来&#xff0c;万物互联产生了海量数据&#xff0c;据IDC预测&#xff0c;到2025年全球设备连接总数将达到1000亿&#xff0c;集中式处理模型下核心网络无法承载如此大的数据量传输&#xff0c;数据也无法在云中心存储计算&#xff0c;因此基于云边端的架构模式成…