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

目录

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,   #需要转换的模型,如yolov5x,       #任意一组和输入shape相同的tensor"yolov5.onnx",     #导出的ONNX的文件名opset_version=11,    # ONNX 算子集的版本input_names=['input'],output_names=['output'])

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

import onnxonnx_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 tensorrtprint(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.mzph.cn/news/661283.shtml

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

相关文章

UE4学习笔记 FPS游戏制作2 制作第一人称控制器

文章目录 章节目标前置概念Rotator与Vector:roll与yaw与pitch 添加按键输入蓝图结构区域1区域2区域3区域4 章节目标 本章节将实现FPS基础移动 前置概念 Rotator与Vector: Vector是用向量表示方向,UE中玩家的正前方是本地坐标系的(1,0,0)&…

【Linux】信号量

信号量 一、POSIX信号量1、信号量的原理2、信号量的概念(1)PV操作必须是原子操作(2)申请信号量失败被挂起等待 3、信号量函数4、销毁信号量5、等待信号量(申请信号量)6、发布信号量(释放信号量&…

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡,比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡!】800¥ 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…

仰暮计划|“从米票、肉票、糖果票到肥皂票、煤票、棉花票等,生活里头的方方面面都能用粮票买到”

口述人:牛翠英(女) 整理人:霍芝冉 口述人基本信息:现68岁,河南省安阳市北关区霍家村人,现居河南安阳市区。 奶奶一生辛劳,操持家务;亲眼见证了时代变迁,社会发展,…

docker笔记整理

Docker 安装 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin 启动docker systemctl start docker 查看docker状态 s…

09. 异常处理

目录 1、前言 2、常见的异常 3、异常处理try...except...finally 4、异常信息解读 5、raise 6、自定义异常 7、小结 1、前言 在编程中,异常(Exception)是程序在运行期间检测到的错误或异常状况。当程序执行过程中发生了一些无法继续执…

C languange DGEQRF 示例,link liblapack.a

1.示例源码 #include <stdio.h>int min(int m, int n){ return m<n? m:n;}void print_matrix(double* A, int m, int n, int lda) {for (int i 0; i < m; i){for (int j 0; j < n; j){//printf("%7.4f ", A[i j*lda]);printf("%7.4f, &quo…

创建表与删除表(六)

表的基本操作&#xff08;六&#xff09; 一、创建表 1.1 使用DDL语句创建表 CREATE TABLE 表名(列名 类型,列名 类型......); 示例&#xff1a; 创建一个 employees 表包含雇员 ID &#xff0c;雇员名字&#xff0c;雇员薪水。 create table employees(employee_id int,em…

从创新者到引领者:探索第四范式的AI之旅

大数据产业创新服务媒体 ——聚焦数据 改变商业 如今&#xff0c;人工智能已成为改变世界、驱动各行各业变革的核心源动力。在国内&#xff0c;有一些公司已走在前列&#xff0c;其中就包括北京第四范式智能技术股份有限公司&#xff0c;在AI这个赛道&#xff0c;他是一名创新…

Patch2QL:开源供应链漏洞挖掘和检测的新方向

背景 开源生态的上下游中&#xff0c;漏洞可能存在多种成因有渊源的其它缺陷&#xff0c;统称为“同源漏洞”&#xff0c;典型如&#xff1a; 上游代码复用缺陷。开源贡献者在实现功能相似的模块时&#xff0c;常复用已有模块代码或逻辑&#xff1b;当其中某个模块发现漏洞后…

java:java反编译工具--jd-gui

JD-GUI是一款反编译软件&#xff0c;JD分为JD-GUI、JD-Eclipse两种运行方式&#xff0c;JD-GUI是以单独的程序的方式运行&#xff0c;JD-Eclipse则是以一个Eclipse插件的方式运行。 官方下载地址&#xff1a; https://github.com/java-decompiler/jd-gui/releases 我这边下载…

Unity Shader 滚动进度条效果

Unity Shader 滚动进度条效果 前言项目场景布置导入图片修改场景设置修改图片尺寸即可调整进度 ASE连线 前言 UI要实现一个滚动进度&#xff0c;于是使用Shader制作一个。 项目 场景布置 导入图片 修改一下导入图片的格式&#xff0c;这样才能循环起来 WrapMode改为Repea…

正点原子--STM32中断系统学习笔记(1)

1、什么是中断&#xff1f; 原子哥给出的概念是这样的&#xff1a;打断CPU正常执行的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 当发生中断时&#xff0c;当前执行的程序会被暂时中止&#xff0c;进而进入中断处理函…

Node: opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]异常处理

目录 一、问题描述二、问题分析三、解决方案方案一&#xff1a;你可以按照以下步骤来删除 NODE_OPTIONS 环境变量中的 --openssl-legacy-provider 选项&#xff1a;方案二&#xff1a;在package.json更改scripts方案三&#xff1a;降级 Node.js 版本 在进行前端项目开发时&…

Linux+服务器后台运行程序

在Linux服务器直接运行程序&#xff0c;程序运行的时间较长&#xff0c;程序经常会因为网络连接问题异常终止&#xff0c;一直盯着程序运行又费时费力&#xff0c;这时后台运行程序是更好的解决方式。But&#xff0c;如果服务器重启了&#xff0c;那所有进程都断掉了&#xff0…

关于v8垃圾回收机制以及与其相关联的知识点--还没整理版本

对于值类型b来说&#xff0c;就直接释放了其占用的内存&#xff0c;对于引用类型obj来说&#xff0c;销毁的只是变量obj对堆内存地址 1001 的引用&#xff0c;obj的值 { c: 3 } 依然存在于堆内存中。那么堆内存中的变量如何进行回收呢&#xff1f; V8的垃圾回收策略主要是基于…

【Java 数据结构】栈和队列

栈和队列 1. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.4 栈的应用场景1.5 概念区分 2. 队列(Queue)2.1 概念2.2 队列的使用2.3 队列模拟实现2.4 循环队列 3. 双端队列 (Deque)4. 面试题 1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在…

自然语言处理,基于预训练语言模型的方法,车万翔,引言部分

文章目录 自然语言处理应用任务1. 信息抽取2. 情感分析3. 问答系统4. 机器翻译5. 对话系统 自然语言处理应用任务 1. 信息抽取 信息抽取&#xff08;Information Extraction, IE&#xff09;&#xff0c;是从非结构化的文本中&#xff0c;抽取出结构化信息的过程&#xff0c;…

C++ 单一附合导线平差程序

一、以下图附合导线为例&#xff0c;图形如下&#xff1a; 二、第一步&#xff0c;读取测量数据&#xff0c;读取界面设计如下&#xff1a; 读取数据文本文件格式如下&#xff1a; &#xff08;1&#xff09;已知点坐标数据格式&#xff1a; &#xff08;2&#xff09;角度观测…

【C++杂货铺】详解类和对象 [下]

个人博客&#xff1a;代码菌-CSDN博客 专栏&#xff1a;C杂货铺_代码菌的博客-CSDN博客 目录 &#x1f308;前言&#x1f308; &#x1f4c1; 初始化列表&#xff08;灰常重要&#xff09; &#x1f4c2; 引入 &#x1f4c2; 概念 &#x1f4c2; 特性 &#x1f4c1; 拓展构…