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. Android NDK编程之Android.mk和Application.mk

    Android编程使用NDK必须创建一个jni文件夹,并且jni文件里一般包含有C/C++的源码文件.Android..mk文件.Application.mk文件(可选),Android.mk文件的编 ...

  2. hdu4454 三分 求点到圆,然后在到矩形的最短路

    题意:       求点到圆,然后在到矩形的最短路. 思路:       把圆切成两半,然后对于每一半这个答案都是凸性的,最后输出两半中小的那个就行了,其中有一点,就是求点到矩形的距离,点到矩形的距离 ...

  3. POJ3080方法很多(暴力,KMP,后缀数组,DP)

    题意:       给n个串(n>=2&&n<=10),每个串长度都是60,然后问所有串的最长公共子串,如果答案不唯一输出字典序最小的. 思路:直接暴力,枚举+KMP,后缀 ...

  4. hdu5108枚举因子求最小的m

    题意:      给一个n(<=10Y),然后让找到一个最小的m使得n/m是一个素数. 思路:       先用sqrt(n)的时间把所有的因子都求出来,然后在排序,枚举,就行了,这个题目这么做 ...

  5. 推荐算法-聚类-DBSCAN

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法,类似于均值转移聚类算法,但 ...

  6. (邹博ML)凸优化

    目录 凸集的基本概念 凸函数的基本概念 凸优化的一般提法 凸集基本概念 思考两个不能式 两个正数的算术平均数大于等于几何平均数 给定可逆对称阵Q,对于任意向量x,y,有: 思考凸集和凸函数 在机器学习 ...

  7. layui中流加载layui.flow

    1.引入layui.css和layui.js 2. html中定义容器 <div id="demo"></div> js部分: layui.use('flo ...

  8. 【小技巧】启动Tomcat 提示端口被占用 怎么办?一句命令解决

    windows环境: 方法1: 1.win+r 打开黑界面 2.输入命令 netstat -ano|findstr 8080 3.输入命令 taskkill /pid xxxx /f Linux环境: ...

  9. 简单聊聊VisualStudio的断点调试

    这节聊聊如何使用VisualStudio进行断点调试. 在debug过程中,我们有时需要查看程序在运行到某一行代码时,上下文中的变量或者一些其他的数据是什么样的,我们就要设置断点(Breakpoint ...

  10. FileInfo & DirectoryInfo

    这节讲两个实例类,FileInfo和DirectoryInfo两个类,用于操作某个具体的文件或者目录. FileInfo:     FileInfo不同于File,它是一个实例类,有一个string类 ...