Relay张量集成

Introduction

NVIDIA TensorRT是一个用于优化深度学习推理的库。这种集成将尽可能多地减轻从中继到TensorRT的算子,在NVIDIA GPU上提供性能提升,而无需调整计划。

本文将演示如何安装TensorRT并在启用TensorRT BYOC和运行时的情况下构建TVM。将提供使用TensorRT编译和运行ResNet-18模型的示例代码,以及如何配置编译和运行时设置。最后,记录支持的运算符以及如何扩展集成以支持其他运算符。

Installing TensorRT

为了下载TensorRT,需要创建一个NVIDIA开发人员程序帐户。有关更多信息,请参阅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将自动定位安装。

Building TVM with TensorRT support

在TVM中有两个独立的构建标志用于TensorRT集成。这些标志还支持交叉编译:USE_TENSORRT_CODEGEN=ON还可以在主机上构建支持TENSORRT的模块,而USE_TENSORRT_RUNTIME=ON将使边缘设备上的TVM运行时执行TENSORRT模块。如果希望编译和执行具有相同TVM构建的模型,则应该同时启用这两个功能。

USE_TENSORRT_CODEGEN=ON/OFF-此标志将允许编译不需要任何TENSORRT库的TENSORRT模块。

USE_TENSORRT_RUNTIME=ON/OFF/path-to-TensorRT-此标志将启用TENSORRT运行时模块。这将根据已安装的TensorRT库构建TVM。

示例设置config.cmake文件:

set(USE_TENSORRT_CODEGEN ON)

set(USE_TENSORRT_RUNTIME /home/ubuntu/TensorRT-7.0.0.11)

Build and Deploy ResNet-18 with TensorRT

Create a Relay graph from a MXNet ResNet-18 model.

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返回的新模块和配置构建中继图。目标必须始终是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)

Export the module.

lib.export_library('compiled.so')

加载模块并在目标计算机上运行推断,目标计算机必须在启用USE_TENSORRT_RUNTIME运行时的情况下构建。第一次运行需要更长的时间,因为TensorRT engine必须编译出来。

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)

Partitioning and Compilation Settings

有一些选项可以在partition_for_tensorrt配置。

version-TensorRT version to target as tuple of (major, minor, patch)。如果TVM是使用USE_TENSORRT_RUNTIME=ON编译的,则将改用链接的TENSORRT版本。算子分解到TensorRT,将影响版本。

use_implicit_batch-使用TensorRT隐式批处理模式(默认为true)。设置为false将启用显式批处理模式,该模式将扩展支持的运算符以包括那些修改batch dimension的运算符,但可能会降低某些模型的性能。

remove_no_mac_subgraphs-一种改进性能的启发式方法。删除已为TensorRT分区的子图(如果它们没有任何乘法累加运算)。删除的子图将经过TVM的标准编译。

max_workspace_size-允许每个子图用于创建TensorRT引擎的工作区大小字节数。有关更多信息,请参见TensorRT文档。可以在runtime重写。

Runtime Settings

有一些附加选项可以在runtime使用环境变量进行配置。

Automatic FP16 Conversion-可以设置环境变量TVM_TENSORRT_USE_FP16=1,以自动将模型的TENSORRT组件转换为16位浮点精度。这可以极大地提高性能,但可能会在模型精度方面造成一些轻微的损失。

缓存TensorRT引擎-在第一次推断期间,runtime将调用TensorRT API来构建引擎。这可能很耗时,因此可以将TVM_TENSORRT_CACHE_DIR设置为指向将这些内置引擎保存到磁盘上的目录。下次加载模型并给它相同的目录时,runtime将加载已经构建的引擎,以避免长时间的预热。每个模型都需要一个唯一的目录。

TensorRT有一个参数来配置模型中每个层可以使用的最大暂存空间量。通常最好使用不会导致内存不足的最大值。可以使用TVM_TENSORRT_MAX_WORKSPACE_SIZE来覆盖此设置,方法是指定要使用的工作区大小(以字节为单位)。

Operator support

Adding a new operator

要添加对新算子的支持,需要对一系列文件进行更改:

src/runtime/contrib/tensorrt/tensorrt_ops.cc抄送创建一个实现TensorRTOpConverter接口的新op converter类。必须实现构造函数来指定有多少个输入以及它们是张量还是权重。必须实现Convert方法才能执行转换。这是通过使用params中的输入、属性和网络来添加新的TensorRT层并推送层输出来完成的。

可以使用现有的转换器作为示例。

最后,在GetOpConverters()映射中注册新的op conventer。

python/relay/op/contrib/tensorrt.py此文件包含TensorRT的注释规则。决定支持哪些运算符及其属性。必须为中继运算符注册注释函数,并通过检查属性是否返回true或false来指定转换器支持哪些属性。

tests/python/contrib/test_tensorrt.py为给定的运算符添加单元测试。

Relay张量集成的更多相关文章

  1. 将TVM集成到PyTorch

    将TVM集成到PyTorch 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.PyTo ...

  2. 向Relay添加算子

    向Relay添加算子 为了在Relay IR中使用TVM算子,需要在Relay中注册算子,以确保将其集成到Relay的类型系统中. 注册算子需要三个步骤: 使用RELAY_REGISTER_OPC + ...

  3. 将TVM集成到PyTorch上

    将TVM集成到PyTorch上 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.为此, ...

  4. 中继TensorRT集成

    中继TensorRT集成 介绍 NVIDIA TensorRT是用于优化深度学习推理的库.这种集成将使尽可能多的算子从Relay转移到TensorRT,从而无需调整调度,即可在NVIDIA GPU上提 ...

  5. 如何在TVM上集成Codegen(下)

    如何在TVM上集成Codegen(下) Bring DNNL to TVM: JSON Codegen/Runtime 现在实现将中继图序列化为JSON表示的DNNL codegen,然后实现DNNL ...

  6. 如何在TVM上集成Codegen(上)

    如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...

  7. 推荐一个集成环境 XAMPP

    摘自:http://blog.sina.com.cn/s/blog_72c4b92501012ll7.html 一个新手接触 Joomla! 的过程应该是这样的:看到这个词之后首先要弄明白“什么是Jo ...

  8. NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

    前言 我们都知道,API网关是工作在应用层上网关程序,为何要这样设计呢,而不是将网关程序直接工作在传输层.或者网络层等等更底层的环境呢?让我们先来简单的了解一下TCP/IP的五层模型.     (图片 ...

  9. OpenWrt(LEDE)2020.4.29更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成+软件包

    交流群:QQ 1030484865 电报:  t_homelede   固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.29)Lienol Feed及若干自行维护 ...

随机推荐

  1. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  2. Compare the contents of two arrays

    ✍️Define a methed to compare the contents of two arrays and return the result . 定义一个方法,用于比较两个数组的内容是否 ...

  3. spring boot pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 【近取 Key】Alpha - v1.0 测试报告

    Bug 前端 主页.登录.注册.导航 bug说明 修复方法 修复结果 导航栏有时不显示用户姓名 修改用户信息的获取逻辑与存储方式 成功 展示词图界面导航栏居右失败 在组件中增加自适应相关设置 成功 用 ...

  5. Django(24)永久重定向和临时重定向

    重定向 重定向分为永久重定向和临时重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面.比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面. ...

  6. mac SSH私钥取消密码(passphrase)

    取消私钥中的密码: 1.使用openssl命令去掉私钥的密码openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new 2.备份旧私钥mv ~/.ssh/ ...

  7. 分布式日志传输系统Databus(一)--系统介绍

    Databus系统是微博DIP团队开源的分布式日志传输系统.它是一个分布式.高可用的,用于采集和移动大量日志数据的服务.它基于流式数据的简单而灵活的架构,具备健壮性和容错性,具有故障转移与恢复机制.它 ...

  8. [设计模式] 设计模式课程(二十)--命令模式(Command)

    概述 "行为变化"模式:组件构建过程中,组件行为的变化经常会导致组件本身剧烈的变化."行为变化"模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现 ...

  9. 每天一个linux命令(49):at命令   atrm删除作业,由作业号标识。

    atq命令 例如:从现在起三天后的下午四点运行作业at 4pm + 3 days:在July 31上午十点运行作业at 10am July 31:明天上午一点运行作业at 1am tomorrow. ...

  10. debian配置---->/etc/apt/sources.list apt基本源设置指南

    yum或apt基本源设置指南   关于: 管理Linux服务器的运维或开发人员经常需要安装软件,最常用方式应该是通过Linux系统提供的包管理工具来在线安装,比如centos的yum,ubuntu或d ...