Relay TensorRT 集成

2024-01-30 12:04
文章标签 集成 tensorrt relay

本文主要是介绍Relay TensorRT 集成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

NVIDIA TensorRT 是一个用于优化深度学习推理的库。这种集成尽可能多地将算子从 Relay 迁移到 TensorRT,无需对 schedule 调优,即可提升 NVIDIA GPU 的性能。

本教程演示如何安装 TensorRT 以及如何构建 TVM,来启用 TensorRT BYOC 和 runtime。此外,还给出了示例代码,演示了如何用 TensorRT 编译和运行 ResNet-18 模型,以及如何配置编译和 runtime 设置。最后,还记录了支持的算子,以及如何扩展集成来支持其他算子。

安装 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 会自动定位安装路径。

使用 TensorRT 支持构建 TVM

TVM 的 TensorRT 集成有两个单独的构建标志,这些标志启用了交叉编译: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/path-to-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 计算图:

from tvm import relay
import mxnet
from mxnet.gluon.model_zoo.vision import get_modeldtype = "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 编译和代码生成。

mod, config = partition_for_tensorrt(mod, params)

用 partition_for_tensorrt 返回的新模块和配置来构建 Relay 计算图。target 必须始终是 CUDA target。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 引擎,所以需要较长时间。

dev = tvm.cuda(0)
loaded_lib = tvm.runtime.load_module('compiled.so')
gen_module = tvm.contrib.graph_executor.GraphModule(loaded_lib['default'](dev))
input_data = np.random.uniform(0, 1, input_shape).astype(dtype)
gen_module.run(data=input_data)

分区和编译设置

有些选项可在 partition_for_tensorrt 中配置:

  • version - 用(major、minor、patch)元组表示的 TensorRT 版本。若在 USE_TENSORRT_RUNTIME=ON 条件下编译 TVM,则用链接的 TensorRT 版本。这个版本会影响哪些算子可以分区到 TensorRT。
  • use_implicit_batch - 使用 TensorRT 隐式批处理模式(默认为 true)。设置为 false 会启用显式批处理模式,这种方式会扩大支持的算子(包括那些修改批处理维度的算子),但会降低某些模型的性能。
  • remove_no_mac_subgraphs - 提高性能的启发式方法。若子图没有任何乘-加操作(multiply-accumulate operation),则删除已为 TensorRT 分区的子图。删除的子图将通过 TVM 的标准编译。
  • max_workspace_size - 允许每个子图用于创建 TensorRT 引擎的工作空间 size(以字节为单位)。它可在运行时被覆盖。更多信息请参阅 TensorRT 文档。

Runtime 设置

还有一些额外的选项,可在运行时用环境变量进行配置。

  • 自动 FP16 转换 - 设置环境变量 TVM_TENSORRT_USE_FP16=1,从而自动将模型的 TensorRT 组件转换为 16 位浮点精度。此设置可提高性能,但可能会导致模型精度略有下降。
  • 缓存 TensorRT 引擎 - runtime 会在第一次推理时调用 - TensorRT API 来构建引擎。这个过程会花费很多时间,因此可设置 TVM_TENSORRT_CACHE_DIR 指向磁盘上的目录,这个目录保存构建的引擎。这样下次加载模型时指定相同的目录,runtime 就会加载已经构建的引擎,从而避免较长的预热时间。每个模型的目录是唯一的。
  • TensorRT 有一个参数,用来配置模型中每一层可用的最大暂存空间量。最好使用最高值,它不会导致内存不足。可用 TVM_TENSORRT_MAX_WORKSPACE_SIZE 指定要用的工作区size(以字节为单位)来覆盖它。
  • 对于包含动态 batch 维度的模型,变量 TVM_TENSORRT_MULTI_ENGINE 可用于确定如何在 runtime 中创建 TensorRT 引擎。默认模式下 TVM_TENSORRT_MULTI_ENGINE=0,在内存中每次维护一个引擎。如果输入出现更高的 batch size,则用新的 max_batch_size 设置重新构建引擎——该引擎与所有 batch size(从 1 到 max_batch_size)兼容。此模式减少了运行时使用的内存量。第二种模式,TVM_TENSORRT_MULTI_ENGINE=1 将构建一个独特的 TensorRT 引擎,该引擎针对遇到的每个 batch size 进行了优化。这种模式下性能更佳,但内存消耗也会更多。

支持的算子

Relay节点备注
nn.relu
sigmoid
tanh
nn.batch_norm
nn.layer_norm
nn.softmax
nn.conv1d
nn.conv2d
nn.dense
nn.bias_add
add
subtract
multiply
divide
power
maximum
minimum
nn.max_pool2d
nn.avg_pool2d
nn.global_max_pool2d
nn.global_avg_pool2d
exp
log
sqrt
abs
negative
nn.batch_flatten
expand_dims
squeeze
concatenate
nn.conv2d_transpose
transpose
layout_transform
reshape
nn.pad
sum
prod
max
min
mean
nn.adaptive_max_pool2d
nn.adaptive_avg_pool2d
nn.batch_matmul
clip需要 TensorRT 的版本为 5.1.5 及以上
nn.leaky_relu需要 TensorRT 的版本为 5.1.5 及以上
sin需要 TensorRT 的版本为 5.1.5 及以上
cos需要 TensorRT 的版本为 5.1.5 及以上
atan需要 TensorRT 的版本为 5.1.5 及以上
ceil需要 TensorRT 的版本为 5.1.5 及以上
floor需要 TensorRT 的版本为 5.1.5 及以上
split需要 TensorRT 的版本为 5.1.5 及以上
strided_slice需要 TensorRT 的版本为 5.1.5 及以上
nn.conv3d需要 TensorRT 的版本为 6.0.1 及以上
nn.max_pool3d需要 TensorRT 的版本为 6.0.1 及以上
nn.avg_pool3d需要 TensorRT 的版本为 6.0.1 及以上
nn.conv3d_transpose需要 TensorRT 的版本为 6.0.1 及以上
erf需要 TensorRT 的版本为 7.0.0 及以上

添加新算子

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

  • src/runtime/contrib/tensorrt/tensorrt_ops.cc 创建一个新的算子转换器类实现 TensorRTOpConverter 接口。必须实现构造函数,并指定有多少输入,以及它们是张量还是权重。还必须实现 Convert 方法来执行转换。通过使用参数中的输入、属性和网络来添加新的 TensorRT 层,然后产生层输出。你可以使用示例中已有的转换器。最后,将新算子转换器注册到 GetOpConverters() 映射中。
  • python/relay/op/contrib/tensorrt.py 这个文件包含了 TensorRT 的注解规则(决定了支持哪些算子及其属性)。必须为 Relay 算子注册一个注解函数,并根据属性的返回值为 true 还是 false 来指定转换器支持哪些属性。
  • tests/python/contrib/test_tensorrt.py 为给定算子添加单元测试。

这篇关于Relay TensorRT 集成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660180

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring