中继TensorRT集成
中继TensorRT集成
介绍
NVIDIA TensorRT是用于优化深度学习推理的库。这种集成将使尽可能多的算子从Relay转移到TensorRT,从而无需调整调度,即可在NVIDIA GPU上提高性能。
本文将演示如何安装TensorRT,并在启用TensorRT BYOC和运行时runtime的情况下构建TVM。将提供示例代码,使用TensorRT编译和运行ResNet-18模型,以及如何配置编译和运行时runtime设置。最后,记录支持的算子,以及如何扩展集成,以支持其它算子。
安装TensorRT
要下载TensorRT,需要创建一个NVIDIA Developer程序帐户。请参阅NVIDIA文档以获取更多信息:https : //docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html。如果有Jetson设备,例如TX1,TX2,Xavier或Nano,TensorRT将已经通过JetPack SDK安装在设备上。
有两种安装TensorRT的方法:
- 通过deb或rpm软件包进行系统安装。
- Tar文件安装。
使用tar文件安装方法,必须将提取的tar存储文件的路径提供给USE_TENSORRT_RUNTIME = / path / to / TensorRT。使用系统安装方法,USE_TENSORRT_RUNTIME = ON将自动安装。
使用TensorRT支持构建TVM
TensorRT在TVM中的集成有两个单独的构建标记。这些标志还可以启用交叉编译:USE_TENSORRT_CODEGEN = ON在主机上构建具有TensorRT支持的模块,而USE_TENSORRT_RUNTIME = ON使边缘设备上的TVM运行时runtime执行TensorRT模块。如果要编译,也要启用具有相同TVM构建的模型,则应同时启用。
- USE_TENSORRT_CODEGEN = ON / OFF-此标志将启用编译TensorRT模块,该模块不需要任何TensorRT库。
- USE_TENSORRT_RUNTIME = ON / OFF / TensorRT路径-此标志将启用TensorRT运行时runtime模块。针对已安装的TensorRT库构建TVM。
config.cmake文件中的示例设置:
set(USE_TENSORRT_CODEGEN ON)
set(USE_TENSORRT_RUNTIME /home/ubuntu/TensorRT-7.0.0.11)
使用TensorRT构建和部署ResNet-18
从MXNet ResNet-18模型创建中继relay图。
import tvm
from tvm import relay
import mxnet
from mxnet.gluon.model_zoo.vision import get_model
dtype = "float32"
input_shape = (1, 3, 224, 224)
block = get_model('resnet18_v1', pretrained=True)
mod, params = relay.frontend.from_mxnet(block, shape={'data': input_shape}, dtype=dtype)
为TensorRT标注并划分图形。TensorRT集成支持的所有算子都将被标记并卸载到TensorRT。其余算子将通过常规TVM CUDA编译和代码生成进行。
from tvm.relay.op.contrib.tensorrt import partition_for_tensorrt
mod, config = partition_for_tensorrt(mod, params)
使用partition_for_tensorrt返回的新模块和配置来构建Relay图。目标必须始终是cuda目标。partition_for_tensorrt会自动在配置中填写所需的值,因此无需修改-只需将其传递给PassContext,以便可以在编译期间读取值。
target = "cuda"
with tvm.transform.PassContext(opt_level=3, config={'relay.ext.tensorrt.options': config}):
lib = relay.build(mod, target=target, params=params)
导出模块。
lib.export_library('compiled.so')
加载模块并在目标计算机上运行推理,必须在USE_TENSORRT_RUNTIME启用后对其进行构建 。由于必须构建TensorRT引擎,因此第一次运行会花费更长的时间。
ctx = tvm.gpu(0)
loaded_lib = tvm.runtime.load_module('compiled.so')
gen_module = tvm.contrib.graph_runtime.GraphModule(loaded_lib['default'](ctx))
input_data = np.random.uniform(0, 1, input_shape).astype(dtype)
gen_module.run(data=input_data)
分区和编译设置
可以在partition_for_tensorrt中配置一些选项。
- version-TensorRT版本以(major, minor, patch)元组为目标。如果使用USE_TENSORRT_RUNTIME = ON编译TVM,则将改用链接的TensorRT版本。版本影响哪些算子分区到TensorRT。
- use_implicit_batch-使用TensorRT隐式批处理模式(默认为true)。设置为false将启用显式批处理模式,扩大支持算子范围,使其包括修改批处理维度的算子,但可能会降低某些模型的性能。
- remove_no_mac_subgraphs-启发式改进性能。如果没有任何乘累加运算,则删除已为TensorRT分区的子图。删除的子图将通过TVM的标准编译。
- max_workspace_size-允许每个子图用于TensorRT引擎创建的工作空间大小的字节数。有关更多信息,请参见TensorRT文档。可以在运行时runtime覆盖。
运行时runtime设置
可以在运行时runtime使用环境变量配置一些其他选项。
- FP16自动转换-TVM_TENSORRT_USE_FP16=1可以设置环境变量,将模型的TensorRT组件自动转换为16位浮点精度。可以大大提高性能,但可能会导致模型精度略有下降。
- 缓存TensorRT引擎-在首次推理期间,运行时runtime将调用TensorRT API来构建引擎。这可能很耗时,因此可以设置TVM_TENSORRT_CACHE_DIR指向一个目录来将这些内置引擎保存到磁盘上。下次加载模型并给其提供相同目录时,运行时runtime将加载已构建的引擎,以避免长时间的预热。每个模型都需要一个唯一的目录。
- TensorRT具有用于配置模型中每个图层可以使用的最大缓存cache空间的参数。通常最好使用不会导致内存不足的最大值。可以TVM_TENSORRT_MAX_WORKSPACE_SIZE通过指定要使用的字节大小,指定工作区大小来覆盖此设置。
Operator support支持
增加一个新的算子
为了增加对新算子的支持,需要对以下文件进行一系列更改:
- src / runtime / contrib / tensorrt / tensorrt_ops.cc创建一个新的op转换器类来实现该TensorRTOpConverter接口。必须实现构造函数以指定有多少输入以及它们是张量还是权重。还必须实现该 Convert方法来执行转换。使用参数的输入,属性和网络来添加新的TensorRT层,部署输出来完成的。可以使用现有的转换器为例。最后,在GetOpConverters()映射图上注册新的算子标签。
- python / relay / op / contrib / tensorrt.py,此文件包含TensorRT的标记规则。确定支持哪些算子及其属性。必须为中继算子注册一个注释函数,并通过检查属性返回true或false,来指定转换器支持哪些属性。
- tests / python / contrib / test_tensorrt.py为给定的算子添加单元测试。
中继TensorRT集成的更多相关文章
- 使用TensorRT集成推理inference
使用TensorRT集成推理inference 使用TensorRT集成进行推理测试. 使用ResNet50模型对每个GPU进行推理,并对其它模型进行性能比较,最后与其它服务器进行比较测试. ResN ...
- Relay张量集成
Relay张量集成 Introduction NVIDIA TensorRT是一个用于优化深度学习推理的库.这种集成将尽可能多地减轻从中继到TensorRT的算子,在NVIDIA GPU上提供性能提升 ...
- TensorRT 介绍
引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应 ...
- TensorRT Analysis Report分析报告
TensorRT Analysis Report 一.介绍 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可 ...
- TensorRT-优化-原理
TensorRT-优化-原理 一.优化方式 TentsorRT 优化方式: TensorRT优化方法主要有以下几种方式,最主要的是前面两种. 层间融合或张量融合(Layer & Tensor ...
- 深度学习框架:GPU
深度学习框架:GPU Deep Learning Frameworks 深度学习框架通过高级编程接口为设计.训练和验证深度神经网络提供了构建块.广泛使用的深度学习框架如MXNet.PyTorch.Te ...
- TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成
TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成 这个PR增加了对分区.编译和运行TensorRT BYOC目标的支持. Building 有两个新的cmake标志: ...
- HTTP权威协议笔记-7.集成点:网关、隧道及中继
.8.1 网关 定义:网关类似与翻译器,它抽象出了一种能够到达资源的方法. 实用:网关可以自动将HTTP流量转换为其他协议,这样使用HTTP协议的一方就不需要了解其他协议,也可实现与其他程序或设备交互 ...
- 【WEB HTTP】集成点:网关、隧道及中继
网关:网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法.网关是资源与应用程序之间的粘合剂. 在不同http版本之间进行转换的Web代理和网关一样,他们会执行复杂的逻辑,以便在各个端点之间进 ...
随机推荐
- 基于三层交换机的VRRP技术--MSTP、VRRP的综合运用
MSTP (多生成树) 每个VLAN或者几个VLAN拥有一颗生成树,基于实例的生成树.instance 1.instance 2 每个实例拥有一颗生成树.MSTP可以实现多VLAN 的负载分担,可以实 ...
- IntelliJ IDEA中项目的包和目录结构显示设置
在新建的目录下再创建一个新目录时,出现了目录没有分层显示,这样使用起来十分不方便. 解决方案:点击右上方的设置按钮,将"compact middle packages"取消勾选,实 ...
- controller通过map返回减少dto类的创建
更多精彩关注公众号 不要把实体类对象直接返给前端 ,首先想到的是创建DTO,但是这样就造成大量的DTO,显得很臃肿,为了减少dto的数量,像一些比较少的参数避免创建不必要的DTO,通过本次优化达到业务 ...
- python-内置函数-callable,chr,ord,bytes,随机验证码生成
s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...
- 想要测试Dubbo接口?测试的关键点在哪里?
Dubbo接口如何测试? 这个dubbo如何测试,dubbo接口测试什么玩意儿? RPC的有一个类型,叫Dubbo接口. 那这个接口如何测试?测试的关键点在哪里? 这个面试问题,我觉得大家可能就有 ...
- LeetCode 26. 删除有序数组中的重复项
双指针法 分析: 设置两个指针:p1,p2,初始p1指向数组的第一个元素,p2指向第二个元素 1)如果p1的值 == p2的值,就让p2后移一位 2)如果p1的值 != p2的值,修改p1的下一个元素 ...
- Django(10)ORM模型介绍
前言 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL语句. 2. ...
- [算法] 单链表插入排序(java)
实现 首先保证插入前的链表是个完整的,最后一个节点要断开 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可 Link.java class Link { private class Nod ...
- Jmeter 设置中文
1.正常启动jmeter.bat 2.点击[Options]选项,弹出下拉菜单选择[Choose Language]选项3.选择[Choose Language]选项,弹出下一级菜单选择[Chines ...
- R语言执行脚本的几种命令
R CMD BATCH 和 Rscript 使用前都要先添加环境变量 把 C:\Program Files\R\R-3.3.0\bin; 加到"系统变量"的Path 值的最开始 可 ...