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. ARM详细指令集

    算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S} <dest>, <op 1>, <op 2> dest ...

  2. POJ1149 最大流经典建图PIG

    题意:       有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ...

  3. Linux中的shell和bash

    目录 shell shell script sh bash Dash tty .pty 和 pts 学安全的我们,经常会听到说获得某服务器的shell,就是指获得某个服务器的操作权限.我们学习linu ...

  4. PhpStorm 配置本地文件自动上传至服务器

    目的:本地文件夹下的文件实时同步至指定服务器的文件夹,减少代码移植的成本和风险 添加一个SFTP连接 Tools - Deployment - Browse Remote Host 配置连接参数 Co ...

  5. 编译课设·CLion到VS踩坑·解决·备忘录

    应试用,VS使用习惯和JB系差别还是蛮大的 打不过他们就加入他们 键位修改 工具-选项 键盘:改keymap 字体和颜色:宋体必改. 自动恢复:自动保存默认3分钟 CMake:自救时可以看一下 键位名 ...

  6. CRM系统有哪几种常见类型?

    随着市场的快速变化,客户开始变得越来越重要,因此CRM客户管理系统开始逐渐被企业所认可.从CRM系统进入中国市场到现在十余年的发展中,越来越多的CRM厂商开始出现.为了满足不同行业.不同类型的企业的需 ...

  7. 克鲁斯卡尔(Kruskal)算法

    概览 相比于普里姆算法(Prim算法),克鲁斯卡尔算法直接以边为目标去构建最小生成树.从按权值由小到大排好序的边集合{E}中逐个寻找权值最小的边来构建最小生成树,只要构建时,不会形成环路即可保证当边集 ...

  8. prometheus node-exporter增加新的自定义监控项

    项目中collector中新增加自己所需监控项即可 定义启动node-exporter是传入的参数 var ( phpEndPoint = kingpin.Flag("collector.p ...

  9. [刷题] 102 Binary Tree Level Order Traversal

    要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...

  10. 使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程

    使用ps.top.ps_mem命令找出Linux中的最大内存消耗过程 2020-02-08 16:06:59作者:自力稿源:云网牛站 您可能已经看到Linux系统多次消耗过多的内存,如果是这种情况,那 ...