Pytorch -> ONNX -> TensorRT 模型转换与部署

news2024/12/23 15:30:34

系统环境:

  • Ubuntu 18.04
  • Cuda 11.3
  • Cudnn 8.4.1

1 、Pytorch -> ONNX

网上相关流程很多,我就不重复了
可以参考Pytorch分类模型转onnx以及onnx模型推理
或者直接看Pytorch官方怎么干的。

ONNX Github

onnxruntime调用onnx模型推理时有一个provider的参数,可选 [‘TensorrtExecutionProvider’, ‘CUDAExecutionProvider’, ‘CPUExecutionProvider’],不知道是还需要其他设置还是怎样,'TensorrtExecutionProvider’和’CPUExecutionProvider’的推理速度是一样的,只有’CUDAExecutionProvider’相对比另两者快一个数量级
不如原本的Pytroch模型推理快……, 这肯定是不能采用的!

2、 ONNX -> TensorRT

TensorRT是英伟达官方出的,自己的模型调自己的显卡,应当是最优的吧?网上很多帖子确实也都是这么写的。抱着这个期望,再来研究研究怎么转到TensorRT进行部署。

2.1 库安装

TensorRT 提供C++和Python版本的API,并且二者相互独立。
我们大可只装其一。我这里介绍pip wheel 、debian和tar包的安装方法,其他如rpm、zip的可以移步官方安装教程(英文)。

TensorRT – Python

仅用python的话这一块就足够了,不用下载deb、tar 或者 zip文件。 如果你还想试试C++,并且你还比较喜欢Cmake的话,建议 直接跳去 TensorRT – C++ tar 的一节

TensorRT 8.5 以上的版本用以下命令装:

pip install --upgrade tensorrt
# pip install --upgrade tensorrt==8.5.1.7

我装的是8.4,用这种命令装:

pip install --upgrade setuptools pip
pip install nvidia-pyindex

pip install --upgrade nvidia-tensorrt
# pip install --upgrade nvidia-tensorrt==8.4.3.1
pip install pycuda

测试一下:

python3
>>> import tensorrt
>>> print(tensorrt.__version__)
>>> assert tensorrt.Builder(tensorrt.Logger())

在这里插入图片描述

因为我这边对耗时要求较高,时间较紧,主要测了C++版本,Python的实际调用可以参考官方的Demo

TensorRT – C++ deb

这种方法没有给库文件一个单独的文件夹,导致CMake调用很不优美。难过能力有限,最终还是用的这种……

官网下载cuda对应版本的TensorRT库(看名就知道了)。 我下载的是面前最新的 TensorRT 8 (保险起见不用目前最新的8.5)
在这里插入图片描述

os="ubuntuxx04"
tag="cudax.x-trt8.x.x.x-ea-yyyymmdd"
sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb
# sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda11.6-trt8.4.3.1-ga-20220813_1-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub
# sudo apt-key add /var/nv-tensorrt-repo-ubuntu1804-cuda11.6-trt8.4.3.1-ga-20220813/c1c4ee19.pub

sudo apt-get update
sudo apt-get install tensorrt

虽然命令行显示的是cuda11.6,不过没关系,上面官网不是写着11.0-11.6都适用嘛。

pip install numpy
sudo apt-get install python3-libnvinfer-dev

然后安装执行onnx的相关库:

pip install onnx
sudo apt-get install onnx-graphsurgeon

如果你还打算用TensorFlow,执行下面命令,否则不用。

pip install protobuf
sudo apt-get install uff-converter-tf

检查下安装是否成功:

dpkg -l | grep TensorRT

在这里插入图片描述

卸载方法

sudo apt-get purge "libnvinfer*"
sudo apt-get purge "nv-tensorrt-repo*"
sudo apt-get purge onnx-graphsurgeon
sudo pip3 uninstall tensorrt
sudo pip3 uninstall uff
sudo pip3 uninstall graphsurgeon
sudo pip3 uninstall onnx-graphsurgeon

TensorRT – C++ tar

tar的安装方法对库的路径更自由些,对使用者的要求也更高点

安装还是去官网
在这里插入图片描述

tar -xzvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
cd TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4

# 个人习惯,也可以不做copy,只是后面的路径也要注意
cp -r TensorRT-8.4.3.1 /usr/local/include/TensorRT-8.4.3.1 

修改环境变量:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/include/TensorRT-8.4.3.1/lib
alias trtexec="/usr/local/include/TensorRT-8.4.3.1/bin/trtexec"
# 如果是 deb 安装的,则可能是:
alias trtexec="/usr/src/tensorrt/bin/trtexec"
# or 
alias trtexec="/usr/local/tensorrt/bin/trtexec"

之后 source ~/.bashrc

然后装 python 库:

cd TensorRT-8.4.3.1/python
conda activate tensorrt_env
# 根据 python版本选择,我的是python3.9
pip install tensorrt-8.4.3.1-cp39-none-linux_x86_64.whl 
cd ../graphsurgeon
pip install graphsurgeon-0.4.6-py2.py3-none-any.whl
cd ../onnx_graphsurgeon
pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl
pip install 'pycuda<2021.1'

2.2 ONNX转TensorRT

通过下面一行命令就可以转换TensorRT格式了:

trtexec --onnx=2Dmodel.onnx --saveEngine=2Dmodel.trt

在这里插入图片描述
trtexec的更多参数参考这里

2.3 TensorRT部署

github 找到 TensorRT/quickstart/common
把common整个文件夹copy到 include下

├── include
│ ├── common
│ │ ├── logger.cpp
│ │ ├── logger.h
│ │ ├── logging.h
│ │ ├── util.cpp
│ │ └── util.h
│ └── others

是的,库文件我们只要这么多就行了。

CmakeList.txt

cmake_minimum_required(VERSION 3.13)
project(model_deploy)

#set(CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" )
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -std=c++0x -fexceptions -no-pie -O3")


# CUDA
include_directories(CUDA_INCLUDE_DIRS "/usr/local/cuda-11.3/include")
set(CUDA_LIB "/usr/local/cuda-11.3/lib64/libcudart.so")


# TensorRT
## 这块 Developer API 用的,弄好了可以直接用TensorRT写网络而不是转换过来,可惜没跑通
#set(TensorRT_INCLUDE_DIRS "/usr/local/include/TensorRT-8.4.3.1/include"
#        "/usr/local/include/TensorRT-8.4.3.1/samples/common"
#        )
#set(TensorRT_LIB_PATH "/usr/local/include/TensorRT-8.4.3.1/lib")
#file(GLOB TRT_LIB "${TensorRT_LIB_PATH}/*.so" "${TensorRT_LIB_PATH}/stubs/*.so")

set(TRT_LIB "/usr/lib/x86_64-linux-gnu/libnvinfer.so"
#        "/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so"
#        "/usr/lib/x86_64-linux-gnu/libnvinfer_builder_resource.so.8"
#        "/usr/lib/x86_64-linux-gnu/libnvcaffe_parser.so"
#        "/usr/lib/x86_64-linux-gnu/libnvonnxparser.so"
#        "/usr/lib/x86_64-linux-gnu/libnvparsers.so"
#        "/usr/lib/x86_64-linux-gnu/libprotobuf.so"
#        "/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so"
        )

message("Current CPU archtecture: ${CMAKE_SYSTEM_PROCESSOR}")

include_directories(
        include
        include/common

        ${catkin_INCLUDE_DIRS}
        ${CUDA_INCLUDE_DIRS}
)


# C++ branch
## TensorRT
add_executable(test_tensorrt src/test_tensorrt.cpp include/common/util.cpp include/common/logger.cpp)
target_link_libraries(test_tensorrt ${CUDA_LIB} ${TRT_LIB})

然后按照 quick start C++ 的步骤跑吧,不想copy了……
除了makefile,剩下的都copy到camkeList.txt所在目录,然后就可以用Clion,或者命令行编译也行:

mkdir build
cd build
cmake ..

如果遇到下面问题
在这里插入图片描述
这是TensorRT版本问题,找到logging.h的245行,把 override 改成 noexcept 即可

另外更高级的使用参考Nvidia TensorRT Developer Guide,C++能力有限,想用Cmake跑,没跑通……

Reference

Nvidia TensorRT Document
Nvidia TensorRT installation guide
Nvidia TensorRT Quick Start Guide
Nvidia TensorRT C++ API

Nvidia TensorRT Developer Guide
Nvidia TensorRT C++ Samples

TensrRT github
Linux之cudnn升级方法

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

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

相关文章

HTML5期末大作业:基于HTML+CSS+JavaScript茶文化中国水墨风格绿色茶叶销售(5页) 学生网页设计作业源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

用coding向你最爱的人说圣诞快乐

&#x1f384;&#x1f384;&#x1f384;圣诞节即将到来&#xff0c;今天让我们用编码的方式向你最爱的人表达圣诞节快乐。 圣诞节的起源 圣诞节源自古罗马人迎接新年的农神节&#xff0c;与基督教本无关系。在基督教盛行罗马帝国后&#xff0c;教廷将这种民俗节日纳入基督教体…

DenseNet的基本思想

之前的文章介绍过残差网络的基本思想&#xff1a;残差网络的思想就是将网络学习的映射从X到Y转为学习从X到Y-X的差&#xff0c;然后把学习到的残差信息加到原来的输出上即可。即便在某些极端情况下&#xff0c;这个残差为0&#xff0c;那么网络就是一个X到Y的恒等映射。其示意图…

Java基础类型和运算符

文章目录变量与常量变量的命名规则常量final 关键字修饰的常量字面常量基本类型整型基本整型变量 int长整型 long短整型 short比特型 byte浮点数 float和double关于3*0.10.3三种特殊的double字符型 char布尔类型 boolean类型转换隐式类型提升强制类型转换运算符算数运算符基本四…

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 下载print.js之ref设置锚点

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点 第一种方法 方式1、设置一个id ① 给要打印的部分设置一个 id ② 在打印按钮中添加 v-print"#id名" 1、安装vue-print-nb插件 npm install v…

Firefly RK3399 PC pro Android 10下载验证

一.Android 源码以及image 1.Android 10代码链接&#xff1a; 百度网盘 请输入提取码 密码&#xff1a;1234 下载后检查md5值&#xff0c;检查下载是否正确&#xff1a; fb41fcdc48b1cf90ecac4a5bb8fafc7a Firefly-RK3399_Android10.0_git_20211222.7z.001 82d665fb54fb412…

Flutter ー Authentication 认证

Flutter ー Authentication 认证 原文 https://medium.com/simbu/flutter-authentication-adb8df7cf673 前言 如果我相信我知道你是谁那我就能让你查看你的个人 应用 application 资料。 身份验证可能是应用程序必须处理的最大的交叉问题。 将它作为一个特性添加到 DigestableP…

HashMap JDK1.7与1.8的区别

结构 首先HashMap在1.7中是以数组链表的形式存在的, 而HashMap在1.8中则是以数组链表红黑树构成的, 当一个节点的链表长度超过8并且数组长度超过64时会将链表转换为红黑树, 初始化 初始容量大小介绍 说到数组就不得不提HashMap里面的成员变量DEFAULT_INITIAL_CAPACITY也就是…

Mysql进阶学习(八)DDL语言+数据类型和DTL语言

Mysql进阶学习&#xff08;八&#xff09;DDL语言与DTL语言DDL语言1、简介&#xff1a;1.1、库的管理1.1.1、库的创建1.1.2、库的修改1.1.3、库的删除1.2、表的管理1.2.1.表的创建 ★1.2.2.表的修改1.2.3.表的删除1.2.4.表的复制测试案例1. 创建表dept12. 将表departments中的数…

SpringBoot_整合Thymeleaff模板引擎

Thymeleaf模板引擎的主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中正确显示&#xff0c;并且可以作为静态原型&#xff0c;让开发团队能更容易地协作。Thymeleaf能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。…

Qt扫盲-Qt Designer 设计师使用总结

Designer 设计师使用总结一、顶部菜单栏1. 常用的菜单内容2. 快捷工具栏说明二、左侧控件栏1. 组件分类2. 筛选三、中间绘图区1. 左侧控件区拖放控件到中间2. 中间区域布局3. 属性修改四、右侧属性栏1. 对象查看器2. 属性编辑器3.组织结构2. 属性设置五、美化专栏1.单个设置层叠…

微服务框架 SpringCloud微服务架构 12 DockerCompose 12.2 部署微服务集群

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构12 DockerCompose12.2 部署微服务集群12.2.1 直接开干12 DockerCompose 1…

大数据:Hive简介及核心概念

一、简介 Hive 是一个构建在 Hadoop 之上的数据仓库&#xff0c;它可以将结构化的数据文件映射成表&#xff0c;并提供类 SQL 查询功能&#xff0c;用于查询的 SQL 语句会被转化为 MapReduce 作业&#xff0c;然后提交到 Hadoop 上运行。 特点&#xff1a; 简单、容易上手 (…

做短视频不知道靠什么变现,分享三个自我商业定位的方法,适用普通人

如果说你还停留在我也不知道我可以靠什么赚钱这样的一个状态当中。那我给你三个自我商业定位的方法。篇幅较长&#xff0c;点赞收藏慢慢看哦 首先第一个方法&#xff0c;从工作上或者专业的事情上找变现的方法。 那么你们需要了解一个概念叫做知识的诅咒。什么意思呢&#xf…

【论文整理1】On the Continuity of Rotation Representations in Neural Networks

1.前置知识 1.1 Gram-Schmidt正交化 【参考阅读】Gram-Schmidt过程 看完这篇应该基本能理解&#xff0c;但是他对于公式的讲解有一个地方讲解得不是很清楚! 即为什么分母是平方形式呢&#xff1f; 1.2 差集 定义&#xff1a;差集是一种集合运算&#xff0c;记A&#xff0…

Java并发编程—CompletableFuture的介绍和使用

在博主上一篇博客介绍中&#xff0c;Java并发编程—java异步Future的迭代过程_小魏快起床的博客-CSDN博客&#xff0c;这里面给大家分析了Future的使用过程和一些存在的问题&#xff0c;那么针对里面出现的阻塞问题&#xff0c;博主将在这一篇文章给大家介绍清楚 &#x1f34f…

MyBatis框架简介

MyBatis是一个开源的数据持久层框架&#xff0c;内部封装了通过JDBC访问数据库的操作&#xff0c;支持普通的SQL查询、存储过程和高级映射。作为持久层框架&#xff0c;主要思想是将程序中的大量的SQL语句分离出来&#xff0c;配置在相应的配置文件中&#xff0c;这样可以在不修…

Java—数据类型

文章目录数据类型八大基本数据类型Java中有了基本数据类型&#xff0c;为什么还要包装类型String字符串类型函数字符串类的length()方式是否能够得到字符串内有多少个字符&#xff1f;不可变字符串String为什么要设计成不可变的&#xff1f;boolean类型占多少位&#xff1f;为什…

【springboot进阶】使用aop + 注解方式,简单实现spring cache功能

目录 一、实现思路 二、定义缓存注解 三、aop 切面处理 四、使用方式 五、灵活的运用 六、总结 前几天有同学看了 SpringBoot整合RedisTemplate配置多个redis库 这篇文章&#xff0c;提问spring cache 能不能也动态配置多个redis库。介于笔者没怎么接触过&#xff0c;所以…

【Java开发】 Spring 08 :访问 Web 资源( 借助 RestTemplate or WebClient )

web 资源就是运行在服务器上的资源&#xff0c;比如放到 web 下的页面 js 文件、图片、css等&#xff0c;web资源分为静态web资源和动态web资源两类&#xff0c;接下来访问的就是动态资源&#xff08;页面返回的数据是动态的&#xff0c;由后端程序产生&#xff09;&#xff0…