深度学习中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翻译成国际通用语言(如英语…...

TIFS2024 | CRFA | 基于关键区域特征攻击提升对抗样本迁移性
Improving Transferability of Adversarial Samples via Critical Region-Oriented Feature-Level Attack 摘要-Abstract引言-Introduction相关工作-Related Work提出的方法-Proposed Method问题分析-Problem Analysis扰动注意力感知加权-Perturbation Attention-Aware Weighti…...

Redis 发布订阅模式深度解析:原理、应用与实践
在现代分布式系统架构中,实时消息传递机制扮演着至关重要的角色。Redis 作为一款高性能的内存数据库,其内置的发布订阅(Pub/Sub)功能提供了一种轻量级、高效的消息通信方案。本文将全面剖析 Redis 发布订阅模式,从其基本概念、工作原理到实际…...
环形缓冲区 ring buffer 概述
环形缓冲区 ring buffer 概述 1. 简介 环形缓冲区(ring buffer),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。也称作环形缓冲区(circular buffer),环形队列&…...

飞帆控件 post or get it when it has get
我在这里分享两个链接: post_get_it 设计 - 飞帆 有人看出来这个控件是干什么用吗? 控件的配置:...

SQL里where条件的顺序影响索引使用吗?
大家好,我是锋哥。今天分享关于【SQL里where条件的顺序影响索引使用吗?】面试题。希望对大家有帮助; SQL里where条件的顺序影响索引使用吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 查询中,W…...

SAP学习笔记 - 开发豆知识02 - com.sap.cds.services.cds.CdsService 废止,那么用什么代替呢?
我看很多人代码里面用的都是这个CdsService类,可以自从2.0版本往上这个类就没了啊。 它的代替是什么呢?用的CqnService 那么怎么查的呢? 我也是下载好几个包,解压看,然后发现这里还可以直接看,挺方便的。…...

OpenResty 深度解析:构建高性能 Web 服务的终极方案
引言 openresty是什么?在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段,重写/访问阶段,内容阶段,日志…...

什么是路由器环回接口?
路由器环回接口(LoopbackInterface)是网络设备中的一种逻辑虚拟接口,不依赖物理硬件,但在网络配置和管理中具有重要作用。以下是其核心要点: 一、基本特性 1.虚拟性与稳定性 环回接口是纯软件实现的逻辑接口&#x…...
OpenHarmony:开源操作系统重塑产业数字化底座
OpenHarmony:开源操作系统重塑产业数字化底座 引言:当操作系统成为数字公共品 在万物智联时代,操作系统不再是科技巨头的专属领地。华为捐赠的OpenHarmony项目,正以开源协作模式重构操作系统产业格局。这个脱胎于商业版本的开源…...

【MySQL进阶】如何在ubuntu下安装MySQL数据库
前言 🌟🌟本期讲解关于如何在ubuntu环境下安装mysql的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 dz…...

【数据结构】_二叉树
1.二叉树链式结构的实现 1.1 前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树&#x…...

给图表组件上点“颜色” —— 我与 CodeBuddy 的合作记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前段时间,我在开发一个 Vue3 项目的时候,碰到了一个小小的挑战:我想做一个可…...

使用 YOLO 结合 PiscTrace 实现股票走势图像识别
在智能投研和金融分析中,自动识别图表中的模式(如 K 线走势、支撑/阻力位、形态结构)成为一种新兴手段。传统的技术分析依赖大量人工判断,而计算机视觉技术的发展,特别是 YOLO 模型在图像识别领域的高效表现࿰…...

OpenCV中的光流估计方法详解
文章目录 一、引言二、核心算法原理1. 光流法基本概念2. 算法实现步骤 三、代码实现详解1. 初始化设置2. 特征点检测3. 光流计算与轨迹绘制 四、实际应用效果五、优化方向六、结语 一、引言 在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用…...
OpenCL C++ 常见属性与函数
核心对象与属性 对象/属性描述示例cl::Platform表示OpenCL平台cl::Platform::get(&platforms)cl::Device表示计算设备cl::Device::getDefault()cl::Context管理设备、内存和命令队列的上下文cl::Context(contextDevices)cl::CommandQueue命令队列,用于提交命令cl::Command…...
Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
1. 引言 在 Android 系统中,ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务,它们分别管理着应用的生命周期、窗口显示和应用包管理。 但你是否知道,这些服务并不是独立…...
18.自动化生成知识图谱的多维度质量评估方法论
文章目录 一、结构维度评估1.1 拓扑结构评估1.1.1 基础图论指标1.1.2 层级结构指标 1.2 逻辑一致性评估1.2.1 形式逻辑验证1.2.2 约束满足度 二、语义维度评估2.1 语义一致性评估2.1.1 标签语义分析2.1.2 关系语义评估 2.2 语义表示质量2.2.1 嵌入质量2.2.2 上下文语义评估 三、…...
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
文章目录 ⌨️ 命令模式(Command Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(可撤销的建造系统)1. 定义命令接口与接收者2. 实现具体命令3. 命令管理器(Invoker)4. 客户端使…...
图论模板(部分)
图论模板(部分) maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…...
LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
LeetCode 热题 100_寻找重复数(100_287_中等_C) 题目描述:输入输出样例:题解:解题思路:思路一(暴力解法):思路二(哈希集合):思路三&am…...

NBA足球赛事直播源码体育直播M33模板赛事源码
源码名称:体育直播赛事扁平自适应M33直播模板源码 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:NBA足球赛事直播源码体育直播M33模板赛事…...
【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)
一、为什么需要打包成安装包? 在完成 QT 项目开发后,直接发布可执行文件(.exe)和依赖的 DLL 文件虽然可行,但存在以下问题: 用户体验差:用户需手动管理文件路径,容易因文件缺失导致…...

电子电器架构 --- 整车造车阶段四个重要节点
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

黑马点评-用户登录
文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合,返回错误信息return Result.fail("手机…...
ecmascript 第6版特性 ECMA-262 ES6
https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...

十二、Hive 函数
作者:IvanCodes 日期:2025年5月1日 专栏:Hive教程 在数据处理的广阔天地中,我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库,它们就像魔法师手中的魔法棒&…...

No More Adam: 新型优化器SGD_SaI
一.核心思想和创新点 2024年12月提出的SGD-SaI算法(Stochastic Gradient Descent with Scaling at Initialization)本质上是一种在训练初始阶段对不同参数块(parameter block)基于**梯度信噪比(g-SNR, Gradient Signa…...
数据结构【AVL树】
AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通…...
C#将1GB大图裁剪为8张图片
C#处理超大图片(1GB)需要特别注意内存管理和性能优化。以下是几种高效裁剪方案: 方法1:使用System.Drawing分块处理(内存优化版) using System; using System.Drawing; using System.Drawing.Imaging; us…...