Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要

英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决(涉及numpy、scipy、torchvision等)以及直观体验使用Yolov8目标检测的过程(CLI命令行操作、无需代码)-CSDN博客和YOLOv8_测试yolov8n.pt,yolov8m.pt训练的时间和效果、推理一张图片所需时间_解决训练时进程被终止killed-CSDN博客这两篇中,已经在Jetson环境下使用yolov8训练模型、使用yolov8n.pt和yolov8m.pt来对图片、视频进行目标检测。

遇到的问题是,检测的耗时非常久,即便是使用yolov8n.pt平均每张图片也需要预处理preprocess=7.3ms,推理interence=318.4ms,后处理postprocess=6ms,总计331.7ms;

而在上面第二个链接所了解的性能图中,使用GPU的推理速度是非常快的,那么如何使用英伟达的GPU来加速这个推理的过程呢?

2、尝试模型导出.engine

在使用深度学习模型中有这么几个过程,训练、验证、预测/推理、导出、部署,其中训练模型是可以在任何机器上实现的,比如可以选择性能更好的计算机来训练你的模型,通过验证和推理来使模型达到预期的效果,然后导出部署到实际使用的设备上。

假设官方提供的模型(yolov8n.pt)已经满足要求,那么下一步就是如何导出适合于目标设备格式的模型。

下面介绍官网导出 - Ultralytics YOLOv8 文档对于导出这部分的基本操作,使用CLI方式导出的命令格式为:

因为要部署的目标设备是不同的,所以yolov8提供了诸多导出格式,其中英伟达Jetson系列需要的是TensorRT格式,所以format=engine.

执行yolov8.pt导出.engine格式的命令:

yolo export model=yolov8n.pt format=engine

报错了,大概就是说.engine的这种TensorRT格式是需要GPU导出的,所以自动添加了一个参数device=0来指定设备是GPU,但是又无法使用device=0因为torch.cuda.is_available():False.

CUDA(Compute Unified Device Architecture),由显卡厂商NVIDIA推出的GPU运算平台。

这才知道torch和torchvision是分CPU、GPU版本的,于是开始下面的操作。

3、安装适合于英伟达Jetson系统GPU版本的torch和torchvision

3.1、先卸载旧的torch和torchvision

sudo pip uninstall torch torchvision

从下面的输出信息中看起来已经卸载了torch 2.1.2和torchvision 0.16.2。

 

3.2、安装torch和torchvision

3.2.1、安装途径以及选择torch和torchvision的版本

下面的安装方式来源于NVIDIA官网dPyTorch for Jetson - Announcements - NVIDIA Developer Forums

根据jtop查看JetPack版本为6.0,所以可以选择torch v2.2.0和v2.1.0,再结合下方torch和torchvision的版本匹配表格,最后一行是torchvision v0.16.1,所以最后选择torch v2.1.0,torchvision v0.16.1.(P.S.实际上torchvision最新版本不止v0.16.1,所以理论上可以选择更高的torch版本)

3.2.2、安装torch v2.1.0

先下载上面的torch2.1.0的.whl文件,然后使用pip命令安装。

pip install torch-2.1.0-cp310-cp310-linux_aarch64.whl

成功安装了torch v2.1.0,但是报了一个错,torchvision v0.16.2需要torch v2.1.2,但是安装的是torch是v2.1.0,这会导致incompatible不兼容。

但是想着上面已经卸载了torchvision v0.16.2,所以认为可能是什么残留的版本信息而已,此时就没管。

3.2.3、安装torchvision v0.16.1

官网关于torchvision的安装方式如下:

$ sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev
$ git clone --branch <version> https://github.com/pytorch/vision torchvision   # see below for version of torchvision to download
$ cd torchvision
$ export BUILD_VERSION=0.x.0  # where 0.x.0 is the torchvision version  
$ python3 setup.py install --user
$ cd ../  # attempting to load torchvision from build dir will result in import error
$ pip install 'pillow<7' # always needed for Python 2.7, not needed torchvision v0.5.0+ with Python 3.6

因为我的Python版本是3.10所以可以省略最后两步,因为github下载失败所以添加了反向代理,再修改实际使用的版本号,所以最后实际的指令为:

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.16.1 https://mirror.ghproxy.com/https://github.com/pytorch/vision torchvision 
cd torchvision
export BUILD_VERSION=0.16.1
python3 setup.py install --user

安装过程大约用时15分钟,please wait patiently.(播音腔)

3.2.4、测试gpu版本的torch和torchvision是否安装成功
python3
import torch
import torchvision
torch.__version__
torchvision.__version__
torch.cuda.is_available()

 可以看到torch的版本是v2.1.0,torchvision的版本是v0.16.1,torch.cuda.is_available()是True,代表torch和torchvision正常并且torch可以访问GPU.

4、测试yolov8使用GPU推理-加速

4.1、解决遗留问题的报错

于是开始执行推理,发现了一个好消息和一个坏消息。

好消息是Ultralytics YOLOv8.0.237 python-3.10.12 后面torch-2.1.0 CUDA:0(Orin,7620MiB),说明yolov8可以使用GPU了,并且识别出设备是Jetson Orin系列,内存是8G.

坏消息是torch和torchvision的版本不兼容。

虽然我确认刚才选择的torch和torchvision版本是匹配的,而且在【3.2.4】小节也实际打印出了版本符合要求,但还是提示不兼容,这就想到了【3.2.2、安装torch v2.1.0】时产生的报错,可能系统使用的是没卸载干净的torchvision v0.16.2,于是使用pip list再次查看,果然torchvision版本是v0.16.2.于是再次卸载torchvision,注意指定版本0.16.2,因为刚才还安装了0.16.1.

对比了两次卸载torchvision的区别,使用的指令不同,第一次加了sudo,卸载涉及的路径也不同。

4.2、GPU加速推理与CPU对比

使用yolov8.pt执行GPU推理:

对比使用yolov8.pt执行CPU推理:

推理的时间从每张图片平均318.4ms提升到了144.6ms,是快了,但仍然不是很好,下面尝试.engine格式的。

好像又有新的问题了,后处理postprocess的时间从6ms增加到了75.5ms.

5、.pt一键导出.engine

使用yolov8提供的CLI命令,一键就可将.pt的模型导出.engine格式,方便。

yolo export model=yolov8n.pt format=engine

总体流程是先转成onnx格式,然后再将onnx格式转成engine格式。

6、测试.engine的推理速度

效果很明显,平均每张图片提升到了34.4ms,与之前的三百多ms相比差不多快了10倍,但是也就那样,最终的目的是要实时识别视频的,30fps来算起码一帧需要在33ms以下。

7、调整导出.engine的参数进一步提高速度_使用INT8、FP16量化

导出 - Ultralytics YOLOv8 文档,可以得到可修改的参数列表如下:

将导出.engine的参数int8和half修改为True:

yolo export model=yolov8n.pt format=engine int8=True half=True

加INT8、FP16量化之后,一张图片的推理时间从34.4ms提升到17.3ms,速度又提高了2倍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java十大经典算法—KMP

字符串匹配问题&#xff1a; 1.暴力匹配 public class ViolenceMatch {public static void main(String[] args) {String str1 "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";String str2 "尚硅谷你尚硅你好";int index violenceMatch(str1, str2);S…

十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 五、扩展(自定义QProgressBar样式) 一、设计需求 在很多应用程序中&#xff0c;在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景&#xff0c;如&#xff1a;拷贝操作、安装操作以及卸载操作。…

JAVA安卓无线点餐系统源码

JAVA安卓无线点餐系统源码 本项目是带后台管理和客户端和SQL server数据库的完整项目&#xff0c;后台用SSH框架

【方法】PDF文件如何设置密码?

PDF文件可以通过浏览器打开查看&#xff0c;但如果想要设置密码保护&#xff0c;就需要用到相关的软件&#xff0c;下面分享两种常用的软件。 1. PDF编辑器 PDF编辑器除了可以编辑修改PDF文件&#xff0c;还可以用来设置密码。 以小编使用的PDF编辑器为例&#xff0c;通过PD…

“具身智能”浪潮中,达闼机器人的商业化“奇点”已然到来?

当前&#xff0c;人形机器人产业正在快速发展&#xff0c;而2023年必将会是载入史册的一年。 具体来看&#xff0c;2023年&#xff0c;AI技术大爆发&#xff0c;可在语言、视觉、运动控制、降低研发成本等多方面赋能人形机器人产业发展。与此同时&#xff0c;特斯拉、波士顿动…

基础面试题整理1

1.面向对象的特点 继承&#xff08;复用性&#xff09;、封装&#xff08;复用性&#xff09;、多态&#xff08;可移植性、灵活性&#xff09; 2.ArrayList与LinkedList区别 ArrayList和LinkedList都是实现了List接口 ArrayList底层是动态数组 LinkedList底层是链表&#…

Windows开机后,Docker失败:Commoncauses include access rights issues

这种错误看似已经跟你说很清楚了&#xff0c;但是看国外docker社区也提到这个问题&#xff0c;一大堆回答解决了别人的问题&#xff0c;但未必解决你的。我写自己的方案&#xff0c;可能也未必适合你&#xff0c;如果要说Root Cause根源就是windows的虚拟化功能开启的问题。 An…

基于SSM的驾校预约管理系统

基于SSM的驾校预约管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 随着社会的不断发展&#xff0c;驾驶技能的需求逐渐增…

老师的课堂行为包括什么内容

课堂行为对于学生的学习体验和成长至关重要。我在课堂上的一举一动&#xff0c;不仅影响着学生的学习效果&#xff0c;还关系着学生的心理健康和人格发展。那么&#xff0c;老师的课堂行为究竟包括哪些内容呢&#xff1f;接下来&#xff0c;我将以知乎老师的口吻&#xff0c;为…

【软件测试】路径覆盖

题目要求&#xff1a; a) 流程图如下&#xff1a; b) Consider test cases ti (n 3) and t2 ( n 5). Although these tour the same prime paths in printPrime(), they dont necessarily find the same faults. Design a simple fault that t2 would be more lik…

UE4运用C++和框架开发坦克大战教程笔记(十四)(第43~45集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十四&#xff09;&#xff08;第43~45集&#xff09; 43. 单个加载 UObject 功能获取资源 URL 链接实现异步加载单个 UObject 类型资源 44. 批量加载 UObject 功能测试加载单个 UObject 资源批量加载多个同类的 UObject 资源 45…

Win10系统读不出U盘的四种解决方法

有用户特别喜欢用U盘来保存重要的内容&#xff0c;但有用户反映自己的Win10电脑读取不了U盘&#xff0c;这样用户就不能将Win10电脑上的内容传输到U盘了。下面小编带来四种简单有效的解决方法&#xff0c;解决后Win10电脑上的U盘就能被正常识别&#xff0c;从而恢复对U盘的使用…

【Linux笔记】进程等待与程序替换

一、进程的终止 1、进程退出码 在讲解进程的终止之前&#xff0c;先要普及一下进程的退出码概念。 我们父进程之所以要创建子进程&#xff0c;就是为了让子进程运行不一样的任务&#xff0c;那么对于子进程执行的这个任务执行完毕后的结果是否正确或者是否出差错&#xff0c…

QT上位机开发(利用tcp/ip访问plc)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制&#xff0c;但是复杂的plc&#xff0c;还可以控制电机、变频器&#xff0c;在工业…

在CentOS上设置和管理静态HTTP网站的版本控制

在CentOS上设置和管理静态HTTP网站的版本控制是一项重要的任务&#xff0c;它可以帮助您跟踪和回滚对网站所做的更改&#xff0c;确保数据的一致性和完整性。以下是在CentOS上设置和管理静态HTTP网站的版本控制的步骤&#xff1a; 安装版本控制系统在CentOS上安装Git或其他版本…

打铁需要自身硬,我敢和欧系谬论硬刚源自实力与信心

我揭露欧系数学荒谬的目的是驱逐纯粹数学出中国&#xff0c;以恢复中华数学体系、最终让中华数学领导世界&#xff1b;我从来不隐瞒自己的“野心”&#xff0c;我对此有着绝对的信心。民族情怀是中国数学人的短板 纯粹数学是欧洲人的文化、是欧系数学的主体&#xff0c;它的历…

CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件

文章目录 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件说明环境项目结构配置编译环境编码-直接调用 dll编码-生成tlh文件&#xff0c;便于提示 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件 说明 网上有一种使用方式是&am…

SSM整合(实现简单查询功能)

在名为ssm的数据库内创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 创建工程 pom.xml <?xml version"1.0" encoding&quo…

野牛物联网-阿里云配置流程

1、 概述&#xff1a; 本文围绕阿里云物联网平台&#xff0c;实现设备上云、设备上报消息、云端订阅设备消息、云端下发指令到设备等服务&#xff0c;以野牛物联网YNK-MN316设备接入物联网平台为例&#xff0c;介绍设备如何接入物联网平台&#xff0c;向平台上报消息等。帮助您…

MySQL中约束是什么?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…