pt模型转onnx模型,onnx模型转engine模型,pt模型转engine模型详细教程(TensorRT,jetpack)

news2024/11/13 15:36:26

背景

背景是需要在nvidia jetpack4.5.1的arm64设备上跑yolov8,用TensorRT加速,需要用*.engine格式的模型,但是手头上的是pt格式模型,众所周知小板子的内存都很小,连安装ultralytics依赖库的容量都没有,所以我想到在windows系统上先把模型转好,然后再直接放在板子上用。

下载ultralytics yolov8

https://github.com/ultralytics/ultralytics

找到exporter.py

我以为是直接在这个exporter.py上直接改参数来转模型,找了半天找不到,然后直接运行这个python文件也是失败报错,后来才看到这个exporter.py上面有教如何使用
在这里插入图片描述

  • 安装依赖库
pip install "ultralytics[export]

等待安装好,这需要很长时间
在这里插入图片描述
然后不是直接运行这个exporter.py文件,而是像提示里面一样,创造一个py文件,在文件里面复制这几行然后改参数就行了

    from ultralytics import YOLO
    model = YOLO('yolov8n.pt')
    results = model.export(format='onnx')

结果我运行了会报错找不到gpu

assert self.im.device.type != 'cpu', "export running on CPU but must be on GPU, i.e. use 'device=0'"
AssertionError: export running on CPU but must be on GPU, i.e. use 'device=0

查了是需要指定gpu,然后我尝试在python里指定gpu,都还是报这个错,突然看到有提示需要device=0,我想这是加在哪里的呢,后来发现是在下面那个cli命令行加

尝试一步到位转成engine模型

yolo mode=export model=Gap.pt format=engine

报错assert self.im.device.type != ‘cpu’, “export running on CPU but must be on GPU, i.e. use ‘device=0’”

assert self.im.device.type != 'cpu', "export running on CPU but must be on GPU, i.e. use 'device=0'"

在这里插入图片描述

解决办法就是在后面加一个device=0

yolo mode=export model=Gap.pt format=engine device=0  

把模型放在小板子上用结果报错ERROR: coreReadArchive.cpp (31) - Serialization Error in verifyHeader: 0 (Magic tag does not match)

在这里插入图片描述
查了下,我真是慌了,意思是编译engine时候的使用的tensorrt版本与使用trt推理时候的tensorrt版本不一致,需要一致才行
,排查下各自是什么版本

  • linux查tensorRT版本
ldd 可执行文件

在这里插入图片描述
可以看到生成可执行文件的tensorRT是7版本

这个命令行也可以查询到

dpkg -l | grep TensorRT

在这里插入图片描述
能看到是7.1.3版本的tensorRT

  • windows查tensorRT版本
import tensorrt as trt
print(f'TensorRT version: {trt.__version__}')

在这里插入图片描述
可以看到我在编译engine时候的使用的tensorrt版本是8.4,版本不匹配,所以trt推理失败。

然后我寻思arm64环境是不方便更改的,那我就降低windows端的tensorRT版本,我就去nvidia官网下载(https://developer.nvidia.com/tensorrt/download)结果,官网都不提供7.1版本的tensorRT下载了,一下子又不知道该怎么解决了。

我突然想到既然直接使用engine不行,那我用生成出来的onnx模型再在arm64上转成engine行不行

aarch64上onnx转engine模型

找到你本机上的trt转模型可执行文件

sudo find / -name trtexec

在这里插入图片描述
复制到你的模型文件夹

./trtexec --onnx=/home/adlink/wjp/YoloV8-TensorRT-Jetson_Nano-main/models/yolov8n.onnx  --saveEngine=yolov8n.engine --fp16=fp32

结果还是报错volume mismatch,Input dimensions [1,33,8400] have volume 277200 and output dimensions [1,4,16,8400] have volume 537600.
在这里插入图片描述
仿佛又没有办法解决了,难道非要统一版本,但是这上面尝试过已知道是非常困难的,我尝试用其他办法,后来尝试更换参数,发现是opset版本太高的问题,好像默认是17,而aarch64上的版本很低,需要在yolo转pt为onnx的步骤加指定opset的参数

yolo export model=yolov8s.pt format=onnx opset=11 simplify=True

再把生成的onnx文件用trtexec转

./trtexec --onnx=/home/adlink/wjp/YoloV8-TensorRT-Jetson_Nano-main/models/yolov8n.onnx  --saveEngine=yolov8n.engine --fp16=fp32

在这里插入图片描述
就转成功了,跑模型也没问题!

特别说明下

[TRT] Some tactics do not have sufficient workspace memory to run. Increasing workspace size may increase performance, please check verbose output.

中间会在这个步骤停很长时间,这个不是报错,静静等待就好了,过一会就能成功转换onnx为engine模型了

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

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

相关文章

【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP

目录 1.简介 1.1功能介绍 1.2技术栈介绍 1.3演示视频 1.4硬件介绍 2.软件设计 2.1连接阿里云 2.2云平台调试UI 2.3Ui_main.c界面切换处理文件 2.4.main函数 3.结尾(附网盘链接) 1.简介 此文章并不是教程,只能当作笔者的学习分享&…

go中的值传递和指针传递

文章目录 1、& 和 *2、空指针3、nil4、用值传递还是指针传递?5、补充 1、& 和 * &后跟一个变量名,得到的是这个变量的内存地址*int类型的变量,代表这个变量里存的值是int类型的变量的内存地址数据类型的指针类型,即在…

顺序表的实现【数据结构】

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有线序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就是说是连续的一条线…

医院设置(洛谷)

设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为 11。…

C语言实现 -- 单链表

C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…

在服务器上使用Dockerfile创建springboot项目的镜像和踩坑避雷

1. 准备个文件夹 这是我的路径 /usr/local/springboot/docker-daka/docker_files2. 将jar包上传 springboot项目打包——maven的package 这是整个项目打包的模式,也可以分离依赖、配置和程序进行打包,详情看我这篇文章: springboot依赖 配…

java基础 之 集合与栈的使用(四)

文章目录 Queue栈Stack队列和栈的区别小扩展自己写个简单的队列自己写个简单的栈使用栈来实现个队列使用队列来实现个栈写在最后 前文回顾: 戳这里 → java基础 之 集合与栈的使用(一) 戳这里 → java基础 之 集合与栈的使用(二&a…

windows中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换(保姆级教程,值得收藏)

前言 在工作中,我们可能同时在进行2个或者多个不同的项目开发,每个项目的需求不同,进而不同项目必须依赖不同版本的NodeJS运行环境,这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情,nvm就是为…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列(一)—— Git 的诞生,Lin…

Linux系统编程 --- 基础IO

形成共识原理: 1、文件 内容 属性 2、文件分为打开的文件和没打开的文件 3、打开的文件:谁打开?进程!--- 本质是研究进程和文件的关系! 文件被打开,必须先被加载到内存! 一个进程可以打开…

PyTorch 训练自定义功能齐全的神经网络模型的详细教程

在前面的文章中,老牛同学介绍了不少大语言模型的部署、推理和微调,也通过大模型演示了我们的日常的工作需求场景。我们通过大语言模型,实实在在的感受到了它强大的功能,同时也从中受益颇多。 今天,老牛同学想和大家一…

【Android Studiio】default activity 原生安卓和uniapp默认启动分析

文章目录 思路: 一、原生安卓二、uniapp 探究方向:找到Default Activity 思路: 在Android开发中,"default activity"这个概念通常指的是应用启动时默认会加载和显示的那个Activity。AndroidManifest.xml文件是Android…

基于Selenium实现操作网页及操作windows桌面应用

Selenium操作Web页面 Why? 通常情况下,网络安全相关领域,更多是偏重于协议和通信。但是,如果协议通信过程被加密或者无法了解其协议构成,是无法直接通过协议进行处理。此时,可以考虑模拟UI操作,进而实现相…

声音和数据之间的调制解调 —— 电报机和电传打字机如何影响计算机的演变

注:机翻,未校对。 The Squeal of Data The through line between the telegraph and the computer is more direct than you might realize. Its influence can be seen in common technologies, like the modem. 电报和计算机之间的直通线比你想象的要…

基于IOT架构的数据采集监控平台!

LP-SCADA数据采集监控平台是蓝鹏测控推出的一款聚焦于工业领域的自动化数据采集监控系统, 助力数字工厂建设的统一监控平台。 为企业提供从下到上的完整的生产信息采集与集成服务,从而为企业综合自动化、工厂数字化及完整的"管控一体化”的解决方案…

LockSupport详解

文章目录 理解可重入锁LockSupport线程等待唤醒机制(wait/notify) waitNotify限制awaitSignal限制LockSupport重点说明 理解可重入锁 可重入锁的种类: 隐式锁(即synchronized关键字使用的锁)默认是可重入锁。 同步代…

站在临床数据科学的角度,药物试验归根结底是这两大假设

在临床数据科学的领域中,药物试验的设计和实施是评估药物效果及其安全性的关键环节。药物试验的基础无外乎两大核心假设:有效性与安全性。这两个假设不仅是药物试验的起点,也是整个研究过程中的重要指导原则。 药物试验的核心主旨在于对待测试…

Python高性能计算:进程、线程、协程、并发、并行、同步、异步

这里写目录标题 进程、线程、协程并发、并行同步、异步I/O密集型任务、CPU密集型任务 进程、线程、协程 进程、线程和协程是计算机程序执行的三种不同方式,它们在资源管理、执行模型和调度机制上有显著的区别。以下是对它们的详细解释和比较: 进程&…

一款有趣的工具,锁定鼠标键盘,绿色免安装

这是一款完全免费的程序,可以实现在不锁定屏幕的情况下锁定鼠标键盘,让鼠标键盘无法操作。比较适合防止误碰鼠标键盘,以及离开电脑时不希望别人操作自己的电脑。 ★★★★★锁定鼠标键盘工具:https://pan.quark.cn/s/e5c518a2165…

路由配置修改(五)

一、默认约定式路由 1、umi 会根据 pages 目录自动生成路由配置。 * name umi 的路由配置* description 只支持 path,component,routes,redirect,wrappers,name,icon 的配置* param path path 只支持两种占位符配置,第一种是动态参数 :id 的形式,第二种…