windows平台使用tensorRT部署yolov5详细介绍,整个流程思路以及细节。

news2024/12/27 11:06:36

目录

Windows平台上使用tensorRT部署yolov5

前言:

环境:

1.为什么要部署?

2.那为什么部署可以解决这个问题?(基于tensorRT)

3.怎么部署(只讨论tensorRT)

3.0部署的流程

3.1怎么得到模型和权重

3.2 怎么获取ONNX

3.2.1 ONNX是什么

3.2.2怎么将权重pt文件转换为onnx?

3.3怎么样将onnx转rtr文件

3.3.1两种转换的方式

3.3.2为什么要安装tensorRT

3.3.3安装tensorRT

3.3.3.1下载tensorRT

3.3.3.2进行安装

3.3.3.3测试是否安装成功

3.3.3.4开始转换onnx to engine

3.4engine文件进行推理

Reference:


Windows平台上使用tensorRT部署yolov5

前言:

GitHub:stu-yzZ/yolov5infer (github.com)

自己在网上摸索了很久的基于windows平台的tensorRT部署的问题,终于跑通了,我在找资料的过程中没有找到从思路和细节上都具备的文档,我个人觉得思路最重要,我是很多份拼凑出的思路,顺着思路(有时候会错)一点一点解决问题才得出的结果,所有我打算写这份文档,更加侧重整体逻辑思路,技术细节我理解只要解决思路正确,肯定很多人踩过坑,找一找肯定有的,当然我也会提到。

图片来源:Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation

环境:

我是在windows环境下部署的。Win10+3070ti。硬件cuda是11.7。应该和codna环境中的cuda没有关系,但是需要注意一点,有可能硬件设备上没有安装cudnn,虽然codna环境中有,这个细节注意下,我配置vs2019的适合遇到了(网上好多都写了用vs2019配置的,可能是基于c++部署会用到),不过暂时看来vs2019还没用到(我暂时只针对python进行部署)。

1.为什么要部署?

为了一些使用场景,比如智能机器人,自动驾驶等,在终端设备上,要在低功耗低消耗情况下实现高性能,所以要部署。并不是所有的环境都像实验室一样有4090给咱们跑,sad。

2.那为什么部署可以解决这个问题?(基于tensorRT)

模型部署到 GPU 上使用的是nVidia专门开发的深度学习推理加速库。这些库专门为 GPU 优化,通过量化、融合层次和其他优化技术提高推理速度。具体有以下:

  1. 并行性和流水线: GPU
  2. 允许并行处理,因此你可以通过同时处理多个输入来提高推理速度。还可以使用流水线技术,确保 GPU 在处理一个输入时已经开始处理下一个输入。
  3. 硬件特定优化: 针对具体 GPU 架构的优化也是可能的。例如,CUDA 编程可以用于在 NVIDIA GPU 上实现更高级的优化。

而使用模型权重和网络推理使用的框架内置函数,(Pytorch中的forword)。

这两种区别会导致天壤地别的推理速度,我自己看了我设备上跑的模型,有如下的对比。

方式

推理时间/单张

GPU内存

设备

显卡

权重和网络

2s

2.7G

21款拯救者windows10

3070ti/8G

tensorRT部署

2ms

1.7G

可以看出推理速度上差了100倍左右。优势明显。

3.怎么部署(只讨论tensorRT)

3.0部署的流程

部署这个过程涉及到至少三个环节,首先将模型和权重转换成onnx,然后将onnx转换成适合tensorRT推理的engine,也就是trt格式文件。然后将trt文件通过python或者C++部署到硬件设备上。顺便提一嘴也可以使用onnruntime部署,但这种部署不纯粹,没有把硬件层面的加速体现出来。

我们可以使用任意一种深度学习框架来定义网络结构,并通过训练确定网络中的参数。之后,模型的结构和权重会被转换成一种只描述网络结构的中间表示即ONNX,一些针对网络结构的优化会在中间表示上进行。最后,用面向硬件的高性能编程框架(如 CUDA,OpenCL)编写,能高效执行深度学习网络中算子的推理引擎会把中间表示转换成特定的文件格式,并在对应硬件平台上高效运行模型。

接下来依次介绍每个过程和步骤。

3.1怎么得到模型和权重

我理解如果学习到部署这一步的程序的话基本对模型和权重的基础知识都有了,这一步就不详细介绍了。可以使用不同的框架搭建网络并训练,得到权重文件和网络模型就可以进行下一步了。

3.2 怎么获取ONNX

3.2.1 ONNX是什么

ONNX文件主要由模型参数和结构转换而来。

ONNX (Open Neural Network Exchange)是 Facebook 和微软在2017年共同发布的,用于标准描述计算图的一种格式。目前,在数家机构的共同维护下,ONNX 已经对接了多种深度学习框架和多种推理引擎。因此,ONNX 被当成了深度学习框架到推理引擎的桥梁,就像编译器的中间语言一样。由于各框架兼容性不一,我们通常只用 ONNX 表示更容易部署的静态图。

3.2.2怎么将权重pt文件转换为onnx?

Pytorch自带可以将网络和权重转换为onnx的函数:torch.onnx.export。PyTorch 提供了一种叫做追踪(trace)的模型转换方法:给定一组输入,再实际执行一遍模型,即把这组输入对应的计算图记录下来,保存为 ONNX 格式。export 函数用的就是追踪导出方法,需要给任意一组输入,让模型跑起来。

转换函数:

x = torch.randn(1, 3, 256, 256)

with torch.no_grad():
    torch.onnx.export(
        model,   #需要转换的模型,如yolov5
        x,       #任意一组和输入shape相同的tensor
        "yolov5.onnx",     #导出的ONNX的文件名
        opset_version=11,    # ONNX 算子集的版本
        input_names=['input'],
        output_names=['output'])

执行代码可以得到yolov5.onnx文件,我们可以用下面代码检测该文件是否正确。

import onnx

onnx_model = onnx.load("yolov5.onnx")
try:
    onnx.checker.check_model(onnx_model)
except Exception:
    print("Model incorrect")
else:
    print("Model correct")

onnx文件可以通过Netron这个网站可视化,下面这个是我保存的yolov5s的onnx图片,太长了我只截取了三段。

到这里我们拿到了onnx文件,后面的操作只和yolov5.onnx文件有关了,权重和模型暂时就没用了。下一步开始trt文件的转换。

3.3怎么样将onnx转rtr文件

3.3.1两种转换的方式

Onnx转tensorRT的过程之前也困扰了我很久。很简单, ONNX 文件转换为 TensorRT 引擎有两种主要方法,第一种是通过安装的windows平台上tensorRT安装包下的trtexec.exe转换,另一种是通过tensorRT的C++或者python的API转换

  • 用trtexec.exe
  • 使用 TensorRT API

我们暂时只介绍使用trtexec.exe转换的方式。

3.3.2为什么要安装tensorRT

这一步骤中我们的输入是yolov5.onnx文件,我们想要的输出是一个rtr格式engine文件(yolov5.trt)。我们该怎么得到输出呢?这就要安装tensorRT了。

3.3.3安装tensorRT

平台是windows。安装tensorRT很简单,但是需要注意的是版本的匹配问题,查看自己的硬件驱动的cuda版本(注意硬件驱动cuda版本和conda环境中的cuda不相干,硬件驱动的cuda可以向下兼容conda环境中的cuda版本,比如我硬件驱动cuda是11.7,但是我的conda环境中的cuda是11.3),注意是硬件驱动的cuda版本。通过终端输入nvidia-smi命令即可查询。如下所示:

通过这一步我们知道了我们硬件的cuda是什么版本,然后可以安装匹配的tensorRT了。

3.3.3.1下载tensorRT

下载链接在此:NVIDIA TensorRT 8.x Download | NVIDIA Developer,但是需要注册,如果没有注册的话自己注册一下,进入之后页面如下:

GA和EA有什么区别?GA稳定版,EA early access测试版。

我们展开8.5GA版本如下图,根据自己情况选择,可以看到有windows平台的压缩包,并且有适配cuda11.7的版本(这个版本适配范围较广,好评)

3.3.3.2进行安装

安装步骤:

1. 解压到你自己的路径

这一步不做介绍,后面我提到的路径需要参考自己路径。

2. 添加环境变量

E:\TensorRT_8.5\TensorRT-8.5.3.1\lib

3. 将bin和include文件移动到cuda安装目录下

注意别搞混了

TensorRT-8.5.2.2\lib下的lib文件拷贝到CUDA路径下的lib/64路径下

TensorRT-8.5.2.2\lib下的dll文件拷贝到CUDA路径下的bin路径下

提示:cuda路径参考:我的路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\

TensorRT-8.5.2.2\lib下的lib文件拷贝到CUDA路径下的lib/64路径下

TensorRT-8.5.2.2\lib下的dll文件拷贝到CUDA路径下的bin路径下

提示:cuda路径参考:我的路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\

4. 安装tensorrt依赖

安装E:\TensorRT_8.5\TensorRT-8.5.3.1\python路径下的tensorrt库文件,注意自己的python版本选择合适的版本安装。

安装方法:anaconda终端打开切换到自己的conda环境,切换路径,conda 切换和linux切换不同,先切换盘符cd E ,然后cd 整个路径。然后执行pip install xxxxx进行安装。

3.3.3.3测试是否安装成功

在conda环境中先进入python,然后如下操作:

import tensorrt

print(tensorrt.__version__)#会输出你的tensorrt版本。

至此,tensorRT安装成功。接下来就开始执行onnx to engine的操作。

3.3.3.4开始转换onnx to engine

提前准备好yolov5.onnx文件,放在该目录下。

输入:yolov5.onnx

输出:yolov5.trt文件

操作命令:trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s_engine.trt

1. anaconda终端切换到trtexec.exe路径下

路径在这里:E:\TensorRT_8.5\TensorRT-8.5.3.1\bin进入之后可以看到如下所示,

2. 使用命令转换

anaconda的终端进入到该目录下,yolov5.onnx放在该路径下(其他路径就改变在输入时写好onnx的路径)

输入:

trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s_engine.trt

即可

3. 转换过程

4. 输出

可以看到目录中多了yolov5.trt文件。

至此使用自带的trtexec.exe文件将onnx转换为trt完成,进入到推理环节。

Note:由于每台设备的参数不同,而onnx转trt的过程是与设备参数高度匹配的,所以绝大多数情况下,trt文件必须得从自己要推理的设备上生成。没法复用。

3.4engine文件进行推理

推理过程有两种方式c++或者python。我们暂时只介绍使用python的推理过程。

Talk is cheap,show me the code。上代码:stu-yzZ/yolov5infer (github.com)

这个地方我基于这位大佬的code做了修改,调用笔记本摄像头直接获取图片进行推理,并输出为视频,做到了实时检测。Ps:代码里fps计算不确定是否正确,但infer time是计算出来的。

个人感觉考虑你问题整体思路是很重要的,有了思路就知道在某一步应该解决什么问题,更加高效定位到自己的问题,相信我们遇到的问题已经有很多前辈遇到过了,我们只需要找个适合自己的那个“瓢”,然后照着画自己的葫芦就好,在画葫芦的过程中理论+实践两方面理解。所以我觉得思路非常重要。我在做部署的过程中很多时间花在了找思路上面,网上有很多技术解决文档,但可能都是技术细节,这样会陷入“局部极值”,所以我写这篇博文记录一下思路有了整体思路指导,就可以在遇到问题时快速定位问题,解决问题。写的不对的地方大家多多探讨共同学习。

Reference:

Win10—YOLOv5实战+TensorRT部署+VS2019编译(小白教程~易懂易上手)---超详细_vs tensort yolo-CSDN博客

TensorRT转换时的静态模式与动态模式 - 大师兄啊哈 - 博客园 (cnblogs.com)

较为详细的记录总结TensorRT的python接口的使用,环境配置,模型转换和静态动态模型推理_pycuda 调用tensorrt-CSDN博客

模型部署入门教程(七):TensorRT 模型构建与推理 - 知乎 (zhihu.com)

jndxchengjiabao/yolov5_tensorrt_python: 不使用c++编译,不依赖pytorch,使用tensor和numpy进行推理,导出onnx模型即可使用。 (github.com)

模型部署入门教程(一):模型部署简介 - 知乎 (zhihu.com)

Win10+TensorRT 8.5安装+VS2022配置_tensorrt-8.5.2.2-CSDN博客

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

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

相关文章

Java动态修改用户Session实战-简单实例准备

锋哥原创的Java动态修改用户Session实战: Java动态修改用户Session实战课程_哔哩哔哩_bilibiliJava动态修改用户Session实战课程,管理员可以修改任意一个用户的session信息作者:java1234_小锋站点:www.java1234.vip喜欢的朋友点赞…

协程 Coroutine 到底是个啥?

看了很多博客,也看了些在线课堂的课程。大神们说的协程 Coroutine 的概念,一直含糊不清。今天自己动手做做实验理解下。 1. 代码如下 private const val i1 1000000000class MainViewModel : ViewModel() {companion object {private const val TAG …

MySQL数据库基础第一篇(SQL通用语法与分类)

文章目录 一、SQL通用语法二、SQL分类三、DDL语句四、DML语句1.案例代码2.读出结果 五、DQL语句1.DQL-基本查询2.DQL-条件查询3.DQL-聚合函数4.DQL-分组查询5.DQL-排序查询6.DQL-分页查询7.DQL语句-执行顺序1.案例代码2.读出结果 六、DCL语句1.DCL-管理用户2.DCL-权限控制1.案例…

C++ 数论相关题目:容斥原理。能被整除的数

给定一个整数 n 和 m 个不同的质数 p1,p2,…,pm 。 请你求出 1∼n 中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。 输入格式 第一行包含整数 n 和 m 。 第二行包含 m 个质数。 输出格式 输出一个整数,表示满足条件的整数的个数。 数据范围 1≤m≤16 ,…

中移(苏州)软件技术有限公司面试问题与解答(5)—— Linux进程调度参数调优是如何通过代码实际完成的1

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文对于中移(苏州)软件技术有限公司面试问题中的“(11)Linux进程调度参数调优是如…

python-自动化篇-办公-文件-加解密

解说 要使⽤Python进⾏⽂件的加密和解密,可以使⽤第三⽅加密库,如cryptography或pycryptodome。 ⼀个基本的⽰例,演⽰如何使⽤cryptography库对⽂件进⾏加密和解密: 安装cryptography库: pip install cryptography⽂…

docker中三种常用的持久化数据的方式

文章目录 介绍1.docker run -v2.volumes3.bind mounts 介绍 “前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。” 在Docker中,有以下三种常用的持久化数据的方式,可…

AI智能分析+明厨亮灶智慧管理平台助力“舌尖上的安全”

春节是中国最重要的传统节日之一,在春节期间,人们聚餐需求激增,餐饮业也迎来了高峰期。在这个时期,餐饮企业需要更加注重食品安全和卫生质量,以保证消费者的健康和权益,明厨亮灶智慧管理成为了餐饮业中备受…

代码随想录刷题第21天

第一题是二叉搜索树的最小绝对差,初始思路是中序遍历将二叉搜索树转换为有序数组,在有序数组中进行遍历。一遍过了。(手机打代码真的麻烦)看卡哥讲解会了双指针法遍历。 第二题是二叉搜索树中的众数,还是只想到了中序…

基于spring boot实现邮箱发送和邮箱验证

目录 一、邮箱发送实现1. 开通邮箱服务2. 添加邮箱依赖3.添加配置4.添加邮箱通用类5. 测试类 二、邮箱验证实现1.添加依赖2. 添加配置3.添加controller4. 测试 项目地址: https://gitee.com/nssnail/springboot-email 一、邮箱发送实现 1. 开通邮箱服务 使用qq邮箱、163邮箱都…

1月无代码资讯 | 两项低代码无代码行业报告相继重磅发布;GitHub Copilot Chat全面开放使用

栏目导读:无代码资讯栏目从全球视角出发,带您了解无代码相关最新资讯。 TOP3 大事件 1、ResearchAndMarkets.com "低代码无代码开发平台市场—— 2018-2028 年全球行业规模、份额、趋势、机遇及预测"报告发布 据雅虎财经近日资讯显示&#xf…

推荐一个可以采集众多国内外电商网站数据的API接口【附请求代码】

目前专门针对各大电商平台的数据分析工具很多,也支持数据导出。如针对亚马逊的helium10和junglescout等。 但这些工具对于需要随时跨平台采集数据是无能为力的。 这时,你需要一个万能的采集工具(也就是通用的爬虫工具)。 本文推…

whistle 抓包工具使用

安装配置whistle,本机环境是win10 1、whistle 安装,首先电脑上需要安装node.js,然后就可以使用npm命令安装whistle: npm install -g whistle 2、安装完后就可以使用whistle命令了: 启动:w2 start 重启&#…

分布式搜索引擎_学习笔记_2

分布式搜索引擎_学习笔记_2 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用…

数据库空间爆了怎么处理

作者: 马文斌 时间: 2024-1-29 标签: mysql 磁盘空间 爆满 binlog 背景 近期数据库空间一直告警,平时这套数据库集群是不会有磁盘空间告警的,难道是最近业务量猛增了吗?咱们来瞧瞧到底怎么回事&…

springboot142新冠病毒密接者跟踪系统

新冠病毒密接者跟踪系统设计与实现 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲&#xff…

故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab) 支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于分类和回归分析。SVM的主要目标是找到一个最优的超平面(或者在非线性情况下是一个最优的超曲面),将不同类别的样本分开…

第二证券:沪指再度失守2800点,2月行情怎么走?

周三A股三大指数继续下行,上证指数再度失守2800点。 1月31日,沪深股指早盘小幅收拾后快速下行,盘中一度克复部分跌幅,但午后沪深股指再次回落。到收盘,沪指指数跌1.48%,深证成指跌1.95%,创业板…

Linux——安装MySQL

1、安装mysql8.0.35 1.1、安装步骤 1.更新包列表,首先,确保您的系统已更新到最新状态。运行以下命令来更新包列表和安装最新的软件包: sudo apt update sudo apt upgrade2.安装MySQL服务器:运行以下命令来安装MySQL服务器&…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束: (鼠标在任务栏右击,出现任务管理器) 2.windowr,输入services.msc 带有Google Update的服务,选择禁用。 3.windowr,输入taskschd.msc 任务计划程序…