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倍。

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

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

相关文章

[C#]winform部署yolov5-onnx模型

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5&#xff0c;全称为You Only Look Once version 5&#xff0c;是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发&#xff0c;并因其简洁高效的特点而备受关注。Yol…

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

使用递归将list转换成tree

在产品研发时遇到这样一个问题&#xff0c;对于省市区县这类三级联动的数据&#xff0c;前端插件需要一次把数据全部返回&#xff0c;单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回&#xff0c;前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…

软件测试|解读Python的requirements.txt文件:管理项目依赖的完整指南

简介 在Python项目中&#xff0c;管理依赖库是必不可少的。requirements.txt文件是一种常用的方式&#xff0c;用于列出项目所需的所有依赖库及其版本。本文将详细介绍requirements.txt的用法&#xff0c;帮助你更好地管理项目的依赖。 使用步骤 创建requirements.txt文件&am…

2024 爱分析 · AI 与大模型高峰论坛:和鲸喜获两项殊荣!

1 月 9 日下午&#xff0c;“2024 爱分析 AI 与大模型高峰论坛”在京举办。本次论坛以“智能涌现&#xff0c;价值焕新”为主题&#xff0c;汇聚众多专家学者、实践先驱&#xff0c;共同探讨 AI 与大模型在企业内的新场景、新价值、新路径。论坛中&#xff0c;和鲸科技成功入选…

全网最全postman接口测试教程和项目实战~从入门到精通!!!

Postman实现接口测试内容大纲一览&#xff1a; 一、什么是接口&#xff1f;为什么需要接口&#xff1f; 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷①

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回文字“xa*a*b的值&#xff1a;”和x的值&#xff1b;返回文字“xa-b的值&#xff1a;”和x的值&#xff1b;返回文字“xab的值&#xff1a;”和x的值。其中变量a、b均须为整型…

力扣120. 三角形最小路径和(Java 动态规划)

Problem: 120. 三角形最小路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 Problem:64. 最小路径和 本题目可以看作是在上述题目的基础上改编而来&#xff0c;具体的思路&#xff1a; 1.记录一个int类型的大小的 n 乘 n n乘n n乘n的数组&#xff08;其中 n n n为…

使用 Github、Hugo 搭建个人博客

Hugo 静态网站构建手册&#xff1a;https://jimmysong.io/hugo-handbook/ 关键字&#xff1a;开源 博客 框架 1、GitHub Pages 官网&#xff1a;https://pages.github.com/ 文档&#xff1a;https://docs.github.com/zh Github Pages 简介 Websites for you and your project…

HarmonyOS——ArkUI状态管理

一、状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

python 异常处理 try...except...finally..

python 异常处理&#xff1a; 简单的异常处理主要依靠内置异常处理结构体&#xff0c;代码结构如下&#xff1a; try: … except ValueError as e: # 异常判断&#xff0c;出现ValueError错误时处理机制 … except ZeroDivisionError as e: # 异常判断&#xff0c;出现ZeroDiv…

2024年免费服务器活动整理汇总

随着科技的发展&#xff0c;服务器在各行各业的应用越来越广泛&#xff0c;而免费服务器活动也成为了许多企业和个人关注的焦点。目前有许多免费服务器活动可供选择&#xff0c;本文将为大家整理汇总免费服务器活动&#xff0c;帮助大家更好地了解和参与。 一、腾讯云免费服务器…

【Linux】:Linux中的Git分支管理

本章开始介绍 Git 的杀⼿级功能之⼀&#xff08;注意是之⼀&#xff0c;也就是后⾯还有之⼆&#xff0c;之三……&#xff09;&#xff1a;分⽀。分⽀就是科幻电影⾥⾯的平⾏宇宙&#xff0c;当你正在电脑前努⼒学习 C 的时候&#xff0c;另⼀个你正在另⼀个平⾏宇宙⾥努⼒学习…

day15 层序遍历 翻转二叉树 对称二叉树

题目1&#xff1a;102 二叉树的层序遍历 题目链接&#xff1a;102 二叉树的层序遍历 题意 根据二叉树的根节点root&#xff0c;返回其节点值的层序遍历 借助队列实现&#xff0c;因为队列是先进先出的逻辑&#xff0c;符合层序遍历一层一层遍历的思想 代码 /*** Definitio…

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载)

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载) 什么是自然语言处理 (NLP) ? 自然语言处理 (NLP) 是计算机科学的一个分支,更具体地说,是人工智能 (AI) 的分支,旨在让计算机能够以与人类大致相同的方式理解文本和语音。 自然语…

开发代码基础

首先安装驱动&#xff0c;在ARDUINO环境下安装&#xff0c;然后安装开发板&#xff0c;详见哔哩哔哩教程 1&#xff1a;接入点模式&#xff08;也称 AP&#xff09; 通过以下示例程序&#xff0c;NodeMCU将会建立一个名为taichi-maker的WiFI。您可以使用手机或电脑连接该WiFi…

【论文阅读】Self-supervised Learning: Generative or Contrastive

Abstract 研究了在计算机视觉、自然语言处理和图形学习中用于表示的新的自监督学习方法。全面回顾了现有的实证方法&#xff0c;并根据其目的将其归纳为三大类&#xff1a;生成性、对比性和生成性对比&#xff08;对抗性&#xff09;。进一步收集了关于自我监督学习的相关理论…

Java浮点数精度问题与BigDecimal详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们在日常的Java编程中&#xff0c;经常会遇到处理金融数据的情况&#xff0c;比如计算商品的价格或者处理用户的账户余额。在这些场景下&#xff0c;精确的数值计算就显得尤为重要。这时候&#xff0c;BigDeci…

【SPDK】【NoF】使用SPDK实现NVMe over Fabrics Target

本文使用两台PC&#xff0c;一台做NVMe over Fabrics Target&#xff08;服务端&#xff09;&#xff0c;一台做NVMe over Fabrics initiator&#xff08;客户端&#xff09;。首先使用SoftRoCE来实现底层的rdma传输&#xff0c;然后使用SPDK来实现NVMe over Fabrics Target。 …

内存卡为什么会提示格式化,内存卡提示格式化还能恢复吗

对于许多电脑用户来说&#xff0c;执行内存卡格式化操作导致数据丢失是一个常见的问题。在日常生活中&#xff0c;数据丢失的情况并不少见&#xff0c;但内存卡格式化后的数据恢复相对较难。目前&#xff0c;能够使用的方法较少&#xff0c;且成功率较低&#xff0c;但并不是没…