如何快速完成TensorRT模型生成和加速

news2024/11/15 23:47:20

0. 简介

之前作者在《深度学习之从Python到C++》介绍了一些比较传统的方法,主要侧重介绍了如何将pth和pytorch传统形式文件转化为onnx的文件,这个部分的内容,也可以主要看一下《PyTorch模型部署:pth转onnx跨框架部署详解+代码》这个文章的内容,我们发现在实际使用中,真正的TensorRT模型不是和我们之前介绍的这么简单。因为现在包含了很多第三方的依赖库,为此,我们需要使用更有效的方法来完成转化。这里主要参照pytorch模型(.pth)转tensorrt模型(.engine)几种方式

1. onnx-tensorrt

onnx-tensorrt开源项目可以通过选择不同版本的tensorrt来完成有效的部署,并生成trt文件。比如说我们想要使用tensorRT 7.2的版本。比如说通过git checkout -b 7.2.1.然后我们就可以开始编译了。
在这里插入图片描述
通过下面的指令我们就可以得到一个编译好的转onnx2trt工具,然后输入

cd onnx-tensorrt
mkdir build && cd build
cmake .. -DTENSORRT_ROOT=<path_to_trt> && make -j
// Ensure that you update your LD_LIBRARY_PATH to pick up the location of the newly built library:
export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH

在这里插入图片描述

ONNX模型可以使用onnx2trt可执行文件转换为序列化的TensorRT引擎:

onnx2trt my_model.onnx -o my_engine.trt

ONNX模型也可以转换为人类可读的文本:

onnx2trt my_model.onnx -t my_model.onnx.txt

详细的操作可以看Github即可。

2. trtexec

而另一种方法就是trtexec,它是TensorRT的自带工具,如果您将模型保存为 ONNX 文件、UFF 文件,或者如果您有 Caffe prototxt 格式的网络描述,则可以使用trtexec工具测试使用 TensorRT 在网络上运行推理的性能。 trtexec是一种无需开发自己的应用程序即可快速使用 TensorRT 的工具。

trtexec工具有三个主要用途:

  • 它对于在随机或用户提供的输入数据上对网络进行基准测试很有用。
  • 它对于从模型生成序列化引擎很有用。
  • 它对于从构建器生成序列化时序缓存很有用。

2.1 常用的命令行标志

该部分列出了常用的trtexec命令行标志。

2.1.1 构建阶段的标志
--onnx=<model> :指定输入 ONNX 模型。
--deploy=<caffe_prototxt> :指定输入的 Caffe prototxt 模型。
--uff=<model> :指定输入 UFF 模型。
--output=<tensor> :指定输出张量名称。仅当输入模型为 UFF 或 Caffe 格式时才需要。
--maxBatch=<BS> :指定构建引擎的最大批量大小。仅当输入模型为 UFF 或 Caffe 格式时才需要。如果输入模型是 ONNX 格式,请使用--minShapes 、 --optShapes 、 --maxShapes标志来控制输入形状的范围,包括批量大小。
--minShapes=<shapes> , --optShapes=<shapes> , --maxShapes=<shapes> :指定用于构建引擎的输入形状的范围。仅当输入模型为 ONNX 格式时才需要。
--workspace=<size in MB>:指定策略允许使用的最大工作空间大小。该标志已被弃用。您可以改用--memPoolSize=<pool_spec>标志。
--memPoolSize=<pool_spec> :指定策略允许使用的工作空间的最大大小,以及 DLA 将分配的每个可加载的内存池的大小。
--saveEngine=<file> :指定保存引擎的路径。
--fp16 、 --int8 、 --noTF32 、 --best :指定网络级精度。
--sparsity=[disable|enable|force] :指定是否使用支持结构化稀疏的策略。

  • disable :使用结构化稀疏禁用所有策略。这是默认设置。
  • enable :使用结构化稀疏启用策略。只有当 ONNX 文件中的权重满足结构化稀疏性的要求时,才会使用策略。
  • force :使用结构化稀疏启用策略,并允许 trtexec 覆盖 ONNX 文件中的权重,以强制它们具有结构化稀疏模式。请注意,不会保留准确性,因此这只是为了获得推理性能。

--timingCacheFile=<file> :指定要从中加载和保存的时序缓存。
--verbose :打开详细日志记录。
--buildOnly :在不运行推理的情况下构建并保存引擎。
--profilingVerbosity=[layer_names_only|detailed|none] :指定用于构建引擎的分析详细程度。
--dumpLayerInfo , --exportLayerInfo=<file>:打印/保存引擎的层信息。
--precisionConstraints=spec :控制精度约束设置。

  • none :没有限制。
  • prefer :如果可能,满足--layerPrecisions / --layerOutputTypes设置的精度约束。
  • obey:满足由--layerPrecisions / --layerOutputTypes设置的精度约束,否则失败。

--layerPrecisions=spec :控制每层精度约束。仅当PrecisionConstraints设置为服从或首选时才有效。规范是从左到右阅读的,后面的会覆盖前面的。 “ * ”可以用作layerName来指定所有未指定层的默认精度。
例如: --layerPrecisions=*:fp16,layer_1:fp32将所有层的精度设置为FP16 ,除了 layer_1 将设置为 FP32
--layerOutputTypes=spec :控制每层输出类型约束。仅当PrecisionConstraints设置为服从或首选时才有效。规范是从左到右阅读的,后面的会覆盖前面的。 “ * ”可以用作layerName来指定所有未指定层的默认精度。如果一个层有多个输出,则可以为该层提供用“ + ”分隔的多种类型。
例如: --layerOutputTypes=*:fp16,layer_1:fp32+fp16将所有层输出的精度设置为FP16 ,但 layer_1 除外,其第一个输出将设置为 FP32,其第二个输出将设置为 FP16

2.1.2 推理阶段的标志
--loadEngine=<file> :从序列化计划文件加载引擎,而不是从输入 ONNX、UFF 或 Caffe 模型构建引擎。
--batch=<N> :指定运行推理的批次大小。仅当输入模型为 UFF 或 Caffe 格式时才需要。如果输入模型是 ONNX 格式,或者引擎是使用显式批量维度构建的,请改用–shapes 。
--shapes=<shapes> :指定要运行推理的输入形状。
--warmUp=<duration in ms> , --duration=<duration in seconds> , --iterations=<N> : 指定预热运行的最短持续时间、推理运行的最短持续时间和推理运行的迭代。例如,设置--warmUp=0 --duration=0 --iterations允许用户准确控制运行推理的迭代次数。
--useCudaGraph :将推理捕获到 CUDA 图并通过启动图来运行推理。当构建的 TensorRT 引擎包含 CUDA 图捕获模式下不允许的操作时,可以忽略此参数。
--noDataTransfers :关闭主机到设备和设备到主机的数据传输。
--streams=<N> :并行运行多个流的推理。
--verbose :打开详细日志记录。
--dumpProfile, --exportProfile=<file> :打印/保存每层性能配置文件。

有关所有受支持的标志和详细说明,请参阅trtexec --help

2.2 trtexec的plugins

我们发现在使用trtexec的时候,有些时候有些不包含在pytorch原始代码中的程序是无法完成直接转换的,为什么说要生成plugins呢,这就涉及到TensorRT的本质了。我们将来一步步进行阐述。
2.2.1 编译TensorRT以及生成内容
Github下载TensorRT的编译源文件链接,另外下载第三方库onnx,cub,protobuf并放到TensorRT源文件相应的文件夹里
在这里插入图片描述

在TensorRT源文件根目录下执行下列命令:

cmake -B build
cd build
make

如果已安装的tensorRT库未添加环境变量,上述编译过程会报错,提示找不到文件,我们可以直接在CMakeLists.txt文件中指定TensorRT库路径,如下图所示
在这里插入图片描述
另外,官方提供的cmakelists默认编译parser,plugin,还有sample。自定义算子不需要编译sample,可以将它关闭了。

option(BUILD_PLUGINS "Build TensorRT plugin" ON)
option(BUILD_PARSERS "Build TensorRT parsers" ON)
option(BUILD_SAMPLES "Build TensorRT samples" OFF)

在这里插入图片描述
导出结果如下图:
在这里插入图片描述

out文件夹存储了编译后的各种链接库,将其复制到tensorRT/lib目录下,替换原本的链接库文件。 进行到这一步已经可以了,我们可以看到TensorRT本质编译过后就是动态链接库的.so的形式。

2.2.2 常用的plugin插件
随着tensorRT的不断发展(v5->v6->v7),TensorRT的插件的使用方式也在不断更新。插件接口也在不断地变化,由v5版本的IPluginV2Ext,到v6版本的IPluginV2IOExt和IPluginV2DynamicExt。未来不知道会不会出来新的API,不过这也不是咱要考虑的问题,因为TensorRT的后兼容性做的很好,根本不用担心你写的旧版本插件在新版本上无法运行。
在这里插入图片描述

TensorRT插件的存在目的,主要是为了让我们实现TensorRT目前还不支持的算子,毕竟众口难调嘛,我们在转换过程中肯定会有op不支持的情况。这个时候就需要使用TensorRT的plugin去实现我们的自己的op。此时我们需要通过TensorRT提供的接口去实现自己的op,因此这个plugin的生命周期也需要遵循TensorRT的规则。我们常用的plugin,主要有两个plugin插件,即TensorRT的官方plugin库
在这里插入图片描述
以及open-mmlab的plugin插件库。
在这里插入图片描述
官方提供的插件已经相当多,而且TensorRT开源了plugin部分。并且可以看到其源码,通过模仿源码来学习plugin是如何写的。

2.2.3 添加自己的算子
如果要添加自己的算子,可以在官方的plugin库里头进行修改添加,然后编译官方的plugin库。将生成的libnvinfer_plugin.so.7替换原本的.so文件即可。或者自己写一个类似于官方plugin的组件,将名称替换一下,同样生成.so,在TensorRT的推理项目中引用这个动态链接库即可。有兴趣的可以先看看TensorRT的官方文档。下面我们将整个流程分为几个步骤。

  1. 打开TRT源代码仓库
    在这里插入图片描述
  2. 复制LeakyReluPlugin文件将其改成CustomPlugin,里面的头文件还有cpp文件统统改为自己想要的名字,顺便把代码里面的类型名也改了,见下图。
  3. 为了后续方便注册,自定义插件Custom类需要继承nvinfer1::IPluginV2DynamicExt接口,另外需要增加一些重写方法和属性(插件类继承IPluginV2DynamicExt才可以支持动态尺寸,其他插件类接口例如IPluginV2IOExt和前者大部分是相似的。)
  • CustomPlugin,继承IPluginV2DynamicExt,是插件类,用于写插件具体的实现
  • CustomPluginCreator,继承BaseCreator,是插件工厂类,用于根据需求创建该插件
    在这里插入图片描述
    下面是对应的cpp实现

…详情请参照古月居

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

江山变压器:以数据驱动决策,CRM铸就智能制造之「变」

浙江江山变压器股份有限公司(以下简称“江变”)&#xff0c;创始于1969年&#xff0c;全国变压器行业协会理事单位、全国输配电“十三五”规划的5家起草单位之一&#xff0c;被列入国家千家名牌培育工程。 公司主要客户为国家电网、南方电网、五大发电集团&#xff0c;产品远销…

微信小程序设置 本地图片为背景图

微信小程序 通过wxss进行设置 背景图报错 经查询&#xff0c;发现微信小程序中&#xff0c;将网络图片或base64图片设置为背景图片可正常显示&#xff0c;将本地图片设置为背景图片则不能显示&#xff0c;解决方法有三种&#xff0c;个人采用的是第三种方法。 1. 本地图片转换…

私有云和公有云是什么?有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、私有云和公有云是什么&#xff1f; 1、私有云是什么&#xff1f; 2、公有云是什么&#xff1f; 二、举个例子 1、私有云 2、公…

内网渗透—Linux上线

内网渗透—Linux上线 1. 前言2. 下载插件3. CS配置3.1. 客户端配置3.1.1. 导入插件文件3.1.2. 配置监听 3.2. 服务端配置3.2.1. 导入配置文件 3.3. 生成木马3.3.1. 修改cna文件3.3.2. 修改后效果 3.4. 执行木马 1. 前言 默认情况下CS是不支持上线Linux的&#xff0c;只支持上线…

媒介易教你海外品牌推广:如何选择适合的新闻通稿发布平台?

在进行海外品牌推广时&#xff0c;选择合适的海外新闻通稿发布第三方平台是提高品牌曝光度和影响力的重要一环。这些平台可以帮助企业将新闻内容传播到全球范围内的媒体和受众&#xff0c;为品牌推广提供更广阔的机会。然而&#xff0c;选择合适的发布平台并不容易&#xff0c;…

乐盒开源盲盒uniapp源码系统

源码我也没测试过小白就不要尝试了 下载下来&#xff0c;之后&#xff0c;通过 node 安装如下依赖&#xff0c;即可查看效果&#xff1a; npm install uni-simple-router # 或者&#xff1a;yarn add uni-simple-router npm install uni-simple-router npm install uni-read…

图解数据结构--栈的实现-C语言版本--源码

目录-总 -分- 总结构 图片可视化 总源码1.头文件介绍---分2.节点的实现3.栈顶栈底4.函数的提前声明5. 栈 ---初始化栈6. 栈 ---进栈7.栈 --- 遍历8.栈 --- 是否为空9.栈 --- 出栈10总结 图片可视化 总 源码 /*time 2023年6月12日12:39:06auther yzmcntent stract 栈 */#inclu…

行业报告 | 企业AIGC商业落地应用研究报告

原创 | 文 BFT机器人 01 AIGC&#xff08;生成式人工智能&#xff09;定义 02 洞观&#xff1a;AIGC市场全貌与供应商的摩拳擦掌 生成式人工智能技术的落地已经远远超出了商业化的进程 在企业现有数字化作业体系中切入&#xff0c;成为AIGC率先落地的存量场景 和SaaS同根的生成…

破坏双亲委派机制(自定义类加载器)

jvm中讲过&#xff0c;一个类的创建是要经历类加载器的&#xff0c;那么我们来讲讲如何自定义类加载器。 jvm优先级最高的就是自定义类加载器&#xff0c;为什么这么说呢&#xff1f;我们来看看类加载器的源码&#xff1a; 首先我们解释一下这个方法做了什么&#xff0c;要求返…

网络套接字编程

之前我们粗浅的认识了一下网络的一些知识&#xff0c;比如OSI七层模型&#xff0c;TCP/IP四层模型&#xff0c;那么我们具体怎么实现两台主机的交互呢&#xff1f; 在学习这些之前&#xff0c;我们需要准备一些预备知识。 目录 预备知识 1:认识源IP地址和目的IP地址 2&…

matlab字符串的操作方法

一个字符串是存储在一个行向量中的文本&#xff0c;这个行向量中的每一个元素代表一个字符&#xff0c;字符串可以由0个或多个字符组成。下面是一些字符串的操作方法 &#xff08;1&#xff09;字符串的创建 MATLAB中创建字符串非常简单&#xff0c;将字符串中的字符放到一对…

Jmeter接口之间的动态关联(同一线程组和跨线程组)

目录 前言&#xff1a; 动态关联提取cookie 1.同一线程组里的请求之间进行动态关联 2.跨线程组之间的动态关联 前言&#xff1a; 在进行接口测试时&#xff0c;有时候需要将一个接口的返回值作为参数传递给另一个接口&#xff0c;这就需要用到动态关联。JMeter提供了丰富的…

Haproxy负载均衡集群(时间能回答少年的所有不解)

文章目录 一、Haproxy的基础了解1.常用的负载均衡调度器2.Haproxy 应用相比较其他的优缺点3.Haproxy的特性4.LVS、Nginx、HAproxy的区别 二、Haproy负载均衡部署1.实验前准备2.实验的具体操作步骤步骤一&#xff1a;部署haproxy负载均衡调度器步骤二&#xff1a;Nginx节点服务器…

MySQL——深入理解

前言 MySQL——深入理解主要包括MySQL的存储引擎、索引以及索引对数据库操作的性能优化、SQL优化、视图、存储过程、存储函数、触发器、锁、innoDB引擎的结构原理和数据库的相关管理操作。在这篇文章中&#xff0c;荔枝也是且学且整理&#xff0c;希望能帮助到有需要的小伙伴吧…

Esxi6给虚拟机磁盘扩容

需求 因为最初磁盘规划没想好&#xff0c;导致磁盘给的太小&#xff0c;很快磁盘被用满了&#xff0c;所以需要把该磁盘扩容。 我们这里尝试将/home分区由原来的45GB增加50GB&#xff0c;所以首先我们需要将整个虚拟机扩容50GB&#xff0c;然后再把这50GB全部分给/home分区&a…

前端网址收藏

1.图标库 ByteDance IconPark

WebGL的一些Bug

一、TypeErrpr,Cannot set properties of undefined("setting 1") at _JS_WebRequest_Create(...) 类似这样的问题 解决方案1&#xff1a;可能是BestHTTP插件导致的&#xff0c;打开BestHttp插件目录&#xff0c;找到BestHTTP/Plugins/WebGL目录文件夹下的&#xff…

COMSOL晶体材料损伤断裂模拟基于Voronoi维诺图泰森多边形建模

在外部荷载及内力效应的作用下&#xff0c;晶体材料将发生断裂破坏&#xff0c;按晶体材料断裂时裂纹扩展路径的差异&#xff0c;可将晶体的断裂分为穿晶断裂及沿晶断裂两种断裂形式。 穿晶断裂中裂纹穿过晶体的晶粒内部&#xff0c;断裂面较为粗糙&#xff1b;沿晶断裂中裂纹…

python读取广州-湛江天气csv文件并做可视化仪表盘

1.读取广-湛.csv文件 import pandas as pd data pd.read_csv(广-湛天气.csv) data 2.去除多余字符 #去除多余字符 data[[最高温度,最低温度]] data[[最高温度,最低温度]].apply(lambda x: x.str.replace(,).replace(, 0)) data.head() 3.删除2023年数据,并计算平均温度保存到…

【文件 part 1 - 文件的概念】

一、文件的概念 文件用来存放程序、文档、音频、视频数据、图片等数据的。 文件就是存放在磁盘上的&#xff0c;一些数据的集合。 在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序&#xff0c;对文件进行打开、显示、读…