深度学习中ONNX格式的模型文件
一、模型部署的核心步骤
模型部署的完整流程通常分为以下阶段,用 “跨国旅行” 类比:
步骤 | 类比解释 | 技术细节 |
---|---|---|
1. 训练模型 | 学会一门语言(如中文) | 用 PyTorch/TensorFlow 训练模型 |
2. 导出为 ONNX | 翻译成国际通用语言(如英语) | 将模型转换为 ONNX 格式(跨框架标准) |
3. 转换为硬件格式 | 翻译成目的地语言(如法语、日语) | 用硬件专用工具(如 TensorRT)优化转换 |
4. 部署到硬件 | 在目的地使用本地语言交流 | 集成优化后的模型到硬件,执行推理 |
二、为什么不能直接部署 ONNX 到硬件?
1. ONNX 的定位:中间桥梁,而非终点
- ONNX 是“通用语”:
它让不同框架(PyTorch、TensorFlow)的模型能互相理解,但硬件需要更高效的“方言”。 - 硬件需要“本地化”:
不同硬件平台(NVIDIA GPU、苹果 NPU、华为昇腾)有各自的加速技术和格式,需进一步优化。
2. 直接部署 ONNX 的问题
- 性能低下:ONNX 未针对硬件特性(如 Tensor Core、NPU 指令集)优化。
- 兼容性风险:部分 ONNX 算子可能不被硬件支持(如动态 Shape 操作)。
三、完整部署流程示例
案例 1:工业质检(NVIDIA Jetson 设备)
-
训练模型:
- 用 PyTorch 训练一个缺陷检测模型,保存为
.pt
文件。 - 类比:写一本中文的《质检手册》。
- 用 PyTorch 训练一个缺陷检测模型,保存为
-
导出为 ONNX:
- 通过
torch.onnx.export
转换为model.onnx
。 - 类比:将手册翻译成英文版,方便国际传递。
- 通过
-
转换为硬件格式:
- 使用 TensorRT 工具将
model.onnx
转换为model.engine
(专为 NVIDIA GPU 优化)。 - 类比:根据目的地(法国)需求,将英文手册翻译成法语版,并优化排版。
- 使用 TensorRT 工具将
-
部署到硬件:
- 在 Jetson 设备上加载
model.engine
,用 TensorRT 运行时执行推理。 - 类比:法国工人直接阅读法语版手册,高效完成任务。
- 在 Jetson 设备上加载
案例 2:手机端 AR(苹果 iPhone)
-
训练模型:
- 用 TensorFlow 训练姿态估计模型,保存为
.pb
文件。 - 类比:写一本中文的《AR 动作指南》。
- 用 TensorFlow 训练姿态估计模型,保存为
-
导出为 ONNX:
- 用
tf2onnx
转换为model.onnx
。 - 类比:翻译成英文版指南。
- 用
-
转换为硬件格式:
- 使用
onnx-coreml
工具将 ONNX 转换为model.mlmodel
(苹果 CoreML 格式)。 - 类比:根据苹果用户需求,将英文指南转为 iOS 专属格式,并添加动画说明。
- 使用
-
部署到硬件:
- 在 iPhone 应用中集成
model.mlmodel
,调用 CoreML 框架推理。 - 类比:用户打开 App,直接看到优化后的动画指南,流畅交互。
- 在 iPhone 应用中集成
四、硬件平台与对应优化工具
硬件平台 | 优化工具 | 最终模型格式 | 用途场景 |
---|---|---|---|
NVIDIA GPU | TensorRT | .engine | 工业质检、自动驾驶 |
Intel CPU/VPU | OpenVINO | .blob | 安防监控、边缘计算 |
苹果设备(iOS) | CoreML Tools | .mlmodel | 手机 AR、人脸识别 |
华为昇腾 | 昇腾 CANN | .om | 云端推理、AI 服务器 |
安卓设备 | TensorFlow Lite | .tflite | 移动端图像分类、语音识别 |
五、为什么需要这么多步骤?
1. 性能优化
- 硬件加速:
TensorRT 会融合卷积和激活层,生成适合 GPU 的融合算子,提升计算效率。 - 量化压缩:
OpenVINO 可将 FP32 模型转换为 INT8,减少内存占用和延迟。
2. 平台适配
- 指令集兼容:
ARM 芯片(如手机)和 x86 CPU(如服务器)需要不同的机器指令,模型需针对性优化。 - 内存布局:
NPU 可能要求特定的数据排布格式(如 NHWC vs NCHW)。
3. 依赖最小化
- 脱离训练框架:
最终部署的模型只需轻量级运行时(如 TensorRT、CoreML),无需 PyTorch/TensorFlow。
六、日常生活中的类比
场景:国际快递
- 写一份文件(训练模型):用中文写一份产品说明书(
.pt
文件)。 - 翻译成英文(导出 ONNX):让全球物流公司都能理解(
model.onnx
)。 - 本地化翻译(硬件优化):
- 发往德国:翻译成德语,并调整格式符合德国标准(TensorRT →
.engine
)。 - 发往日本:翻译成日语,添加日式排版(CoreML →
.mlmodel
)。
- 发往德国:翻译成德语,并调整格式符合德国标准(TensorRT →
- 客户使用(部署):德国客户直接阅读德语版,日本客户使用日语版。
相关文章:
深度学习中ONNX格式的模型文件
一、模型部署的核心步骤 模型部署的完整流程通常分为以下阶段,用 “跨国旅行” 类比: 步骤类比解释技术细节1. 训练模型学会一门语言(如中文)用 PyTorch/TensorFlow 训练模型2. 导出为 ONNX翻译成国际通用语言(如英语…...
【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中
WMNav 是由VLM视觉语言模型驱动的,基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略,采用在线好奇心价值图来量化存储,目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程~ 下…...
C++中析构函数不设为virtual导致内存泄漏示例
一、问题示例 #include <iostream> using namespace std;class Base { public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual };class Derived : public Base { public:Derived(…...
UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试
模块梳理介绍 在之前的几篇文章中,笔者详细介绍了整个项目的框架结构以及部分关键模块的实现细节。这些模块包括UDP协议栈、UDP指令监测、数据跨时钟域处理、DDR读写控制、内存读取控制以及DDR AXI控制器等。这些模块共同构成了项目的基础架构,每个模块…...
Slidev集成Chart.js:专业数据可视化演示文稿优化指南
引言:为何选择在Slidev中集成Chart.js? 在现代演示文稿中,高效的数据可视化对于清晰传达复杂信息至关重要。Slidev是一款灵活的开源演示文稿工具,基于Web技术构建,但在高级数据可视化方面存在一定局限。本文旨在提供一…...
动态规划(3)学习方法论:构建思维模型
引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...
NDS3211HV单路H.264/HEVC/HD视频编码器
1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备,支持2组立体声,同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口:HD-SDI数字视频输入、HDMI高清输入(支持CC)、A…...
GO语言语法---if语句
文章目录 1. 基本语法1.1 单分支1.2 双分支1.3 多分支 2. Go特有的if语句特性2.1 条件前可以包含初始化语句2.2 条件表达式不需要括号2.3 必须使用大括号2.4 判断语句所在行数控制 Go语言的if语句用于条件判断,与其他C风格语言类似,但有一些独特的语法特…...
单细胞转录组(4)Cell Ranger
使用 Cell Ranger 分析单细胞数据 1. 数据转换 BCL2FASTQ 在进行单细胞数据分析之前,需要将 Illumina 测序仪生成的 BCL 格式数据转换为 FASTQ 格式。这一步通常使用 bcl2fastq 软件完成。 1.1 安装 bcl2fastq bcl2fastq 是 Illumina 提供的软件,用于…...
Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析
前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…...
使用Python和Selenium打造一个全网页截图工具
无论是归档网站、测试页面设计,还是为报告记录网页内容,一个可靠的截图工具都能大大提升效率。本文将介绍如何使用Python、Selenium和wxPython构建一个用户友好的网页截图工具。该工具能在浏览器中显示网页,自动平滑滚动到底部以触发懒加载内…...
自动化脚本开发:Python调用云手机API实现TikTok批量内容发布
在2025年的技术生态下,通过Python实现TikTok批量内容发布的自动化脚本开发需结合云手机API调用、TikTok开放接口及智能调度算法。以下是基于最新技术实践的系统化开发方案: 一、云手机环境配置与API对接 云手机平台选择与API接入 推荐使用比特云手机或丁…...
React Hooks 必须在组件最顶层调用的原因解析
文章目录 前言一、Hooks 的基本概念二、Hooks 的调用规则三、为什么 Hooks 必须在最顶层调用?1. 维护 Hooks 的调用顺序2. 闭包与状态关联3. 实现细节:Hook 的链表结构 四、违反规则的后果五、如何正确使用 Hooks六、示例:正确与错误的用法对…...
西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮
西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮(默…...
5.27本日总结
一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...
【持续更新中】架构面试知识学习总结
1.分库分表出现冗余数据: ☆分库分表方法:水平和垂直(业务场景,数据关联性。逻辑要调查清楚) 垂直:将一个表(库)按照列的业务相关性进行拆分,把经常一起使用的列放在一张表(库)&…...
文字溢出省略号显示
一、 单行文字溢出、省略号显示 二、 多行文字溢出,省略号显示 有较大的兼容性问题,适用于Webkit为内核的浏览器软件,或者移动端的(大部分也是webkit) 此效果建议后端人员开发 三、图片底侧空白缝隙的修复技巧&#…...
力扣-283-移动零
1.题目描述 2.题目链接 283. 移动零 - 力扣(LeetCode) 3.题目代码 class Solution {public void moveZeroes(int[] nums) {int dest-1;int cur0;while(cur<nums.length){if(nums[cur]0){cur;}else if(nums[cur]!0){swap(nums,cur,dest1);cur;dest…...
【001】RenPy打包安卓apk 流程源码级别分析
1. 入口在下图 2. SDK版本及代码入口 (renpy-8.3.7-sdk) 由于SDK一直在升级,本文采用 标题中的版本进行分析,整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…...
机器学习-人与机器生数据的区分模型测试-数据处理 - 续
这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...
计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)
EMD-VMD-LSTM 一、完整代码实现二、代码结构解析三、关键参数说明四、性能优化建议五、工业部署方案以下是用Python实现EMD-VMD-LSTM时间序列预测的完整代码,结合经验模态分解(EMD)、变分模态分解(VMD)与LSTM深度学习模型,适用于复杂非平稳信号的预测任务。代码包含数据生…...
数据结构与算法——双向链表
双向链表 定义链表分类双向链表:带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…...
.NET 中管理 Web API 文档的两种方式
前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库,它使得在 AS…...
混合学习:Bagging与Boosting的深度解析与实践指南
引言 在机器学习的世界里,模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务,我们都希望模型能够在新的数据上表现出色,即具有良好的泛化能力。然而,实际应用中常常遇到模型过拟合(高方差)…...
基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作
基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作流程关键步骤: 1. 无人机航拍准备 • 设备检查:确保大疆 Mini 3 电量充足,相机设置为 RAW 格式(便于后期调色),关闭自动白平衡。 • 飞行规划&…...
开源项目实战学习之YOLO11:12.1 ultralytics-models-sam-blocks.py源码
👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-__init__.py2.sam-modules-blocks.pybl…...
3D个人简历网站 5.天空、鸟、飞机
1.显示天空 models下新建文件Sky.jsx Sky.jsx // 从 React 库中导入 useRef 钩子,用于创建可变的 ref 对象 import { useRef } from "react"; // 从 react-three/drei 库中导入 useGLTF 钩子,用于加载 GLTF 格式的 3D 模型 import { useGLT…...
蓝桥杯-不完整的算式
问题描述 小蓝在黑板上写了一个形如 AopBCAopBC 的算式,其中 AA、BB、CC 都是非负整数,opop 是 、-、*、/、-、*、/(整除)四种运算之一。不过 AA、opop、BB、CC 这四部分有一部分被不小心的同学擦掉了。 给出这个不完整的算式&a…...
【Python 算法零基础 3.递推】
压抑与痛苦,那些辗转反侧的夜,终会让我们更加强大 —— 25.5.16 一、递推的概念 递推 —— 递推最通俗的理解就是数列,递推和数列的关系就好比 算法 和 数据结构 的关系,数列有点像数据结构中的线性表(可以是顺序表,也…...
计算机视觉与深度学习 | Matlab实现EMD-LSTM和LSTM时间序列预测对比(完整源码和数据)
EMD-LSTM与LSTM 一、数据生成与预处理二、经验模态分解(EMD)三、数据预处理四、模型构建与训练1. 单一LSTM模型2. EMD-LSTM混合模型五、预测与结果对比1. 单一LSTM预测2. EMD-LSTM预测3. 性能评估六、结果可视化七、完整代码说明八、典型输出结果九、改进方向以下是用MATLAB实…...
【爬虫】DrissionPage-6
官方文档: https://www.drissionpage.cn/browser_control/visit https://www.drissionpage.cn/browser_control/page_operation 1. Tab 对象概述 Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页,负责执行各种网页…...
C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景
一、发展历史 冒泡排序(Bubble Sort)作为计算机科学领域最基础的排序算法之一,其历史可追溯至计算机编程的早期阶段。尽管具体起源时间难以考证,但它在20世纪50年代至60年代间被广泛讨论和应用。冒泡排序的名称来源于其独特的排序…...
git提交库常用词
新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...
结构化思考力_第一章_明确理念打基础
接收信息的3个步骤 1. 梳理:观点、理由、事实和数据; 2. 画3这的结构图 3. 一句话概括 可套用固定格式。在——的基础上,从——、——、——N个方面,说明了————。 一句话概括主要内容的前提是,一定是结构非常…...
【C语言练习】046. 编写插入排序算法
046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...
Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南
本文将手把手教你如何在Android应用中集成TensorFlow Lite模型,实现端侧机器学习推理能力。我们以图像分类场景为例,提供可直接运行的完整代码示例。 环境准备 1. 开发环境要求 Android Studio Arctic Fox以上版本AGP 7.0Kotlin 1.6Minimum SDK 21 2.…...
【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
一、nfs概念 NFS(Network File System,网络文件系统) 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议,允许用户通过网络访问远程计算机上的文件,就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...
Redis持久化机制详解:保障数据安全的关键策略
在现代应用开发中,Redis作为高性能的内存数据库被广泛使用。然而,内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制,包括RDB、AOF以及混合持久化模式,帮助开发者根据业务需求选择最适合的持…...
经典算法 求C(N, K) % mod,保证mod是质数
求C(N, K) % mod,保证mod是质数 问题描述 给你三个整数N,K,mod保证mod是一个质数,求组合数C(N, K) % mod。 输入描述 输入有多组,输入第一行为两个整数T,mod。接下来2 - T 1行,每行输入N, K。 输出描…...
NY309NY318美光科技颗粒NY319NY320
NY309NY318美光科技颗粒NY319NY320 技术解析:架构创新与性能突围 美光科技的NY系列颗粒(如NY309、NY318、NY319、NY320)延续了其在存储技术领域的创新基因。以NY319为例,其采用16层BiCS3 3D NAND工艺,通过浮栅&#…...
Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)
概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前,需要了解如下事实࿱…...
flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别
组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面(如表单、静态内容)❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表,自动滚动;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...
OpenCV透视变换
概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程,也叫投影映射 ,属于空间立体三维变换。它基于透视原理,通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 ,能模拟人眼或相机镜头观看三维空间物体时的透视…...
Node.js 实战四:数据库集成最佳实践
你写了个登录接口,用上了 JWT;然后,产品来了句: “用户数据能分页查吗?能关联公司信息吗?我们这边还有多语言字段…” 你发现:SQL 写得越来越长,关联越来越绕,字段越来越…...
【JDBC】JDBC概述、历史版本及特征
1_JDBC概述 什么是JDBC JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC,程序员只需用JDBC API写一个程序…...
redis的pipline使用结合线程池优化实战
文章目录 代码讲解与事务 (MULTI/EXEC) 的区别在你这段代码里的价值可能的坑实战建议 代码 /*** 批量根据用户 ID 查询用户信息** param findUsersByIdsReqDTO* return*/Overridepublic Response<List<FindUserByIdRspDTO>> findByIds(FindUsersByIdsReqDTO findUs…...
【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式
文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…...
MySQL初阶:sql事务和索引
索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…...
使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
以下通过点亮LED进行基本使用流程演示,实际可以连接复杂外设(SPI、CAN、ADC等) 单模块使用 RX、TX、5V和GND接到串口模块;X5接5V;Y2接LED;LED-接GND 串口模块插上电脑后,LED没有亮;因为此时模…...
很啰嗦,再次总结 DOM
DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM(Document Object Model)即文档对象模型,是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构,允许程序和脚本动态访问、修改文…...