TensorRT 7.2.1 开发概要(下)
TensorRT 7.2.1 开发概要(下)
一般来说,开发和部署深度学习模型的工作流要经过三个阶段。
- 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
在第二阶段,数据科学家和开发人员将从经过训练的模型开始,并使用这个经过训练的模型创建和验证部署解决方案。将这个阶段分解为几个步骤,您将得到:
- 思考一下神经网络在它所属的大系统中是如何工作的,并设计和实现适当的解决方案。可能包含神经网络的系统范围非常多样。示例包括:
汽车的自动驾驶系统
公共场所或公司校园的视频安全系统
用户设备的语音接口
工业生产线自动化质量保证系统
提供产品推荐的在线零售系统,或
提供娱乐性过滤器的消费者网络服务用户可以应用到上传的图像。
确定你的优先事项。考虑到您可以实现的不同系统的多样性,在设计和实现部署架构时可能需要考虑很多事情。
你有一个网络还是多个网络?例如,您是否正在开发基于单个网络(人脸检测)的功能或系统,您的系统也不会由不同模型的混合或级联组成,或者可能是由最终用户提供的集合模型的更通用的工具组成?
您将使用什么设备或计算元素来运行网络?CPU,GPU,其他,还是混合?如果模型要在GPU上运行,它是单一类型的GPU,还是需要设计一个可以在各种GPU上运行的应用程序?
数据如何到达模型?什么是数据管道?数据来自摄像机或传感器,来自一系列文件,还是通过网络连接上传?
将进行哪些预处理?数据的格式是什么?如果是图像,是否需要裁剪、旋转?如果是文本,它是什么字符集?是否允许所有字符作为模型的输入?有什么特别的代币吗?
您对延迟和吞吐量有什么要求?
你能批量处理多个请求吗?
您是否需要单个网络的多个实例来实现所需的总体系统吞吐量和延迟?
你将如何处理网络的输出?
需要哪些后处理步骤?
TensorRT提供了一个快速、模块化、紧凑、健壮、可靠的推理引擎,可以支持部署架构中的推理需求。
在数据科学家和开发人员定义了他们的推理解决方案的体系结构之后,他们通过确定他们的优先级,然后使用TensorRT从保存的网络中构建一个推理引擎。根据使用的培训框架和网络体系结构,有许多方法可以实现这一点。通常,这意味着您需要使用ONNX解析器(参见图3左侧)、Caffe解析器或UFF解析器将保存的神经网络从保存的格式解析为TensorRT。
- 解析网络后,考虑优化选项——批处理大小、工作区大小、混合精度和动态形状的边界这些选项被选择并指定为TensorRT构建步骤的一部分,在该步骤中,您可以基于网络构建优化的推理机。本指南的后续部分将提供有关工作流这一部分的详细说明和大量示例,将模型解析为TensorRT并选择优化参数(参见图3)。
2. 在使用TensorRT创建了一个推理引擎之后,您需要验证它是否再现了在训练过程中测量到的模型结果。如果您选择了FP32或FP16,它应该与结果非常接近。如果
您选择了INT8,那么在训练过程中获得的准确度与推理精度之间可能会有一个小差距。
3. 以序列化格式写出推理引擎。这也称为计划文件。
Phase 3: Deploying A Solution
TensorRT库将链接到部署应用程序,该应用程序将在需要推理结果时调用库。为了初始化推理机,应用程序首先将模型从计划文件反序列化到推理机中。
TensorRT通常是异步使用的,因此,当输入数据到达时,程序将调用一个包含输入缓冲区和TensorRT应将结果放入其中的缓冲区的排队函数。
为了优化推理模型,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 开发概要(下)的更多相关文章
- TensorRT 7.2.1 开发概要(上)
TensorRT 7.2.1 开发概要(上) Abstract 这个TysRR7.2.1开发者指南演示了如何使用C++和Python API来实现最常用的深层学习层.它展示了如何使用深度学习框架构建现 ...
- TensorRT 7.2.1开发初步
TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...
- MVC开发模式下的用户角色权限控制
前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...
- iOS系统提供开发环境下命令行编译工具:xcodebuild
iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...
- angular 4 开发环境下打包文件过大
angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...
- 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...
- idea开发工具下报Set language level to 6-@Override in interfaces的解决方法
idea开发工具下报Set language level to 6-@Override in interfaces的解决方法 实现接口时报如下错误:Set language level to 6-@O ...
- jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)
不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上. 其实大家安装的jdk路径下,这 ...
随机推荐
- Windows系统之间文件互传
1)利用Windows自带的文件共享服务 本次试验以Win7为服务器端,win10为客户端 1.确保Win7服务端开启对应的服务及开放相应的端口号 进入命令行界面,输入netstat -an,查看44 ...
- dalvik浅析二:jni、so
android大多使用java来开发,java中有个概念叫jni.当然说到jni,必然是少不了native code.在android中就是so库.我们来分析下jni在android dalvik的使 ...
- Python 第二章-列表和元组
第二章-列表和元组 2.0 在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序列号-即元素的位置, 也称为索引.第一个索引是0,第二个是1,以此类推. ...
- CVE-2018-8174(双杀漏洞)复现
目录 CVE-2018-8174双杀漏洞复现一(不稳定) 下载payload MSF监听 CVE-2018-8174双杀漏洞复现二
- Python 图片转字符图
pip install Image argparse pillow from PIL import Image import argparse #命令行输入参数处理 parser = argparse ...
- 在kubernetes上运行WASM负载
在kubernetes上运行WASM负载 WASM一般用在前端业务中,但目前有扩展到后端服务的趋势.本文使用Krustlet 将WASM服务部署到kubernetes. 简介 Krustlet 是一个 ...
- JVM什么叫安全检测点
[deerhang] 在JVM的垃圾回收阶段,GC线程首先要进行对象的可达性分析.为了避免多线程对可达性分析的影响引出了安全点检测的概念 当GC线程进行GC前,需要等待其他线程进入安全点.例如JVM调 ...
- python双曲线拟合
待拟合函数 y = alpha * pow(x, beta) 输入: x数组,y数组 输出: alpha,beta,相关系数R2 from scipy.optimize import leastsq ...
- JVM内存溢出后服务还能运行吗
文章开篇问一个问题吧,一个java程序,如果其中一个线程发生了OOM,那进程中的其他线程还能运行吗? 接下来做实验,看看JVM的六种OOM之后程序还能不能访问. 在这里我用的是一个springboot ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...