TensorRT 7.2.1 开发概要(下)

1.2. Where Does TensorRT Fit?

一般来说,开发和部署深度学习模型的工作流要经过三个阶段。

  • Phase 1 is training
  • Phase 2 is developing a deployment solution, and
  • Phase 3 is the deployment of that solution

Phase 1: Training

在训练阶段,数据科学家和开发人员将首先陈述他们想要解决的问题,然后决定他们将使用的精确输入、输出和损失函数。他们还将收集、整理、扩充并可能标记训练、测试和验证数据集。然后他们将设计网络结构并训练模型。在训练过程中,他们将监控学习过程,这可能会提供反馈,使他们修正损失函数,获取或增加训练数据。在这个过程的最后,他们将验证模型的性能并保存经过训练的模型。训练和验证通常使用DGX-1完成 、Titan或特斯拉数据中心GPU。

TensorRT通常不在训练阶段的任何部分使用。

Phase 2: Developing A Deployment Solution

在第二阶段,数据科学家和开发人员将从经过训练的模型开始,并使用这个经过训练的模型创建和验证部署解决方案。将这个阶段分解为几个步骤,您将得到:

  1. 思考一下神经网络在它所属的大系统中是如何工作的,并设计和实现适当的解决方案。可能包含神经网络的系统范围非常多样。示例包括:

汽车的自动驾驶系统

公共场所或公司校园的视频安全系统

用户设备的语音接口

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

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

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

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

你有一个网络还是多个网络?例如,您是否正在开发基于单个网络(人脸检测)的功能或系统,您的系统也不会由不同模型的混合或级联组成,或者可能是由最终用户提供的集合模型的更通用的工具组成?

您将使用什么设备或计算元素来运行网络?CPU,GPU,其他,还是混合?如果模型要在GPU上运行,它是单一类型的GPU,还是需要设计一个可以在各种GPU上运行的应用程序?

数据如何到达模型?什么是数据管道?数据来自摄像机或传感器,来自一系列文件,还是通过网络连接上传?

将进行哪些预处理?数据的格式是什么?如果是图像,是否需要裁剪、旋转?如果是文本,它是什么字符集?是否允许所有字符作为模型的输入?有什么特别的代币吗?

您对延迟和吞吐量有什么要求?

你能批量处理多个请求吗?

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

你将如何处理网络的输出?

需要哪些后处理步骤?

TensorRT提供了一个快速、模块化、紧凑、健壮、可靠的推理引擎,可以支持部署架构中的推理需求。

在数据科学家和开发人员定义了他们的推理解决方案的体系结构之后,他们通过确定他们的优先级,然后使用TensorRT从保存的网络中构建一个推理引擎。根据使用的培训框架和网络体系结构,有许多方法可以实现这一点。通常,这意味着您需要使用ONNX解析器(参见图3左侧)、Caffe解析器或UFF解析器将保存的神经网络从保存的格式解析为TensorRT。

  1. 解析网络后,考虑优化选项——批处理大小、工作区大小、混合精度和动态形状的边界这些选项被选择并指定为TensorRT构建步骤的一部分,在该步骤中,您可以基于网络构建优化的推理机。本指南的后续部分将提供有关工作流这一部分的详细说明和大量示例,将模型解析为TensorRT并选择优化参数(参见图3)。

2. 在使用TensorRT创建了一个推理引擎之后,您需要验证它是否再现了在训练过程中测量到的模型结果。如果您选择了FP32或FP16,它应该与结果非常接近。如果

您选择了INT8,那么在训练过程中获得的准确度与推理精度之间可能会有一个小差距。

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

Phase 3: Deploying A Solution

TensorRT库将链接到部署应用程序,该应用程序将在需要推理结果时调用库。为了初始化推理机,应用程序首先将模型从计划文件反序列化到推理机中。

TensorRT通常是异步使用的,因此,当输入数据到达时,程序将调用一个包含输入缓冲区和TensorRT应将结果放入其中的缓冲区的排队函数。

1.3. How Does TensorRT Work?

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

注意:生成的计划文件不能跨平台或TensorRT版本移植。计划是特定的确切的GPU模型,他们是建立在(除了平台和TensorRT版本),必须重新针对特定的GPU,以防你想在不同的GPU上运行它们。

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

  • Elimination of layers whose outputs are not used
  • Elimination of operations which are equivalent to no-op
  • The fusion of convolution, bias and ReLU operations
  • Aggregation of operations with sufficiently similar parameters and the same source tensor (for example, the 1x1 convolutions in GoogleNet v5’s inception module)
  • Merging of concatenation layers by directing layer outputs to the correct eventual destination.

如果需要,生成器还可以修改权重的精度。当以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上找到。

1.5. How Do I Get TensorRT?

For step-by-step instructions on how to install TensorRT, see the TensorRT Installation Guide.

1.6. TensorRT Deprecation Policy

Deprecision是一种预先警告功能将消失,这样您就有时间用另一种方法更新代码。从Tensorrt8.0开始,n.x版中不推荐使用的特性将在主发行版(n+2)中删除。例如,TensorRT 8.0将忽略TensorRT 6.0中不推荐使用的功能,其中一些功能早在TensorRT 4.0就已经弃用了。TensorRT 9.0将省略TensorRT 7.x中不推荐使用的功能。

TensorRT 7.2.1 开发概要(下)的更多相关文章

  1. TensorRT 7.2.1 开发概要(上)

    TensorRT 7.2.1 开发概要(上) Abstract 这个TysRR7.2.1开发者指南演示了如何使用C++和Python API来实现最常用的深层学习层.它展示了如何使用深度学习框架构建现 ...

  2. TensorRT 7.2.1开发初步

    TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...

  3. MVC开发模式下的用户角色权限控制

    前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...

  4. iOS系统提供开发环境下命令行编译工具:xcodebuild

    iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...

  5. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  6. angular 4 开发环境下打包文件过大

    angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...

  7. 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集

    简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...

  8. idea开发工具下报Set language level to 6-@Override in interfaces的解决方法

    idea开发工具下报Set language level to 6-@Override in interfaces的解决方法 实现接口时报如下错误:Set language level to 6-@O ...

  9. jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)

    不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上.     其实大家安装的jdk路径下,这 ...

随机推荐

  1. Python中Scapy网络嗅探模块的使用

    目录 Scapy scapy的安装和使用 发包 发包和收包 抓包 将抓取到的数据包保存 查看抓取到的数据包 格式化输出 过滤抓包 Scapy scapy是python中一个可用于网络嗅探的非常强大的第 ...

  2. layui select 动态赋值

    出现问题 赋值完成后页面不显示,没有效果 发现问题 赋值完成后需要重新渲染select 解决问题 form.render('select');

  3. linux 查看运行java所在目录

    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息 需要查看pos_service.jar的绝对路径(在哪里目录下)  使用:ll /proc/PID Linux在启动一个进 ...

  4. Eclipse中System.out.println()快捷键生成方法

    输入syso,再按ALT+/,如果不显示,就在输入完整一行   System.out.println();  之后点击5次shift键,显示是否使用粘滞键,点击是,  再输入sout,再按ALT+/ ...

  5. 段间跳转之TSS段

    TR寄存器,TSS描述符,TSS段 TR寄存器与普通的段寄存器一样都有可见部分和不可见部分.TR的可见部分为16位为其段选择子,不可见部分是32位的TSS基地址和16位的大小. TSS描述符存在GDT ...

  6. 关于MySQL参数,这些你要知道

    前言: 在前面一些文章中,经常能看到介绍某某参数的作用,可能有些小伙伴仍搞不清楚 MySQL 参数是啥.本篇文章我们来聊聊 MySQL 参数,学习下如何管理维护 MySQL 参数. 1.MySQL参数 ...

  7. 8.Linux的目录管理

    3 Linux目录管理 3.1 Linux 文件与目录管理 3.1.1 目录常用命令 ls: 列出目录 cd: 切换目录 pwd: 显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空 ...

  8. [bug] IDEA springboot项目 访问静态资源 html页面 报404

    原因 复制的静态资源目录没有编译 解决 检查target目录中,是否有static目录,若没有,重新右键项目install即可 若还不能解决,尝试浏览器缓存和IDEA编译设置,详见参考链接 参考 ht ...

  9. [bug] eclipse 点击new菜单后没有新建java project或class选项

    参考 https://blog.csdn.net/u013001763/article/details/54405758

  10. 在python的class中的,self到底是什么?

    答案:self可以理解为一个字典变量,内部存的就是对象的数据属性.如:{'name':'zhang','age':'18'}就是这些. 注意只有数据属性,并没有创建新的类的方法.  类-----> ...