ONNX 简介 #
什么是模型互操作性? #
在了解 ONNX 之前,我们需要先理解深度学习中"模型互操作性"的概念。模型互操作性是指模型能够在不同的框架、平台和硬件之间无缝迁移和运行的能力。
text
┌─────────────────────────────────────────────────────────────┐
│ 模型互操作性的需求 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 训练阶段 推理阶段 │
│ ┌─────────┐ ┌─────────┐ │
│ │PyTorch │ │ 云端 │ │
│ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ │
│ │TensorFlow│ ───> │ 边缘端 │ │
│ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ │
│ │ JAX │ │ 移动端 │ │
│ └─────────┘ └─────────┘ │
│ │
│ 问题:如何让模型在不同环境间自由迁移? │
│ │
└─────────────────────────────────────────────────────────────┘
传统方案的困境 #
text
┌─────────────────────────────────────────────────────────────┐
│ 传统模型部署流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 方案 1:框架绑定 │
│ │
│ PyTorch 训练 ──> PyTorch 部署 │
│ 问题: │
│ ❌ 生产环境可能不支持 PyTorch │
│ ❌ 移动端部署困难 │
│ ❌ 性能不如专用推理引擎 │
│ │
│ 方案 2:重新实现 │
│ │
│ PyTorch 训练 ──> 手动转换 ──> TensorFlow 部署 │
│ 问题: │
│ ❌ 重新实现工作量大 │
│ ❌ 容易引入错误 │
│ ❌ 维护成本高 │
│ │
└─────────────────────────────────────────────────────────────┘
什么是 ONNX? #
ONNX(Open Neural Network Exchange,开放神经网络交换)是一个开放的模型表示格式,定义了一套通用的算子标准和模型表示方法,使 AI 模型能够在不同的框架和硬件平台之间迁移。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ ONNX │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 开放标准 │ │ 统一格式 │ │ 跨平台 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 高性能 │ │ 可扩展 │ │ 生态丰富 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
ONNX 解决的问题 #
text
┌─────────────────────────────────────────────────────────────┐
│ ONNX 解决方案 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │PyTorch │──┐ ┌──│ 云服务 │ │
│ └─────────┘ │ │ └─────────┘ │
│ ┌─────────┐ │ ┌───────┐ │ ┌─────────┐ │
│ │TensorFlow│──┼───>│ ONNX │───┼──│ 边缘设备 │ │
│ └─────────┘ │ └───────┘ │ └─────────┘ │
│ ┌─────────┐ │ │ ┌─────────┐ │
│ │ MXNet │──┘ └──│ 移动端 │ │
│ └─────────┘ └─────────┘ │
│ │
│ 优势: │
│ ✅ 一次转换,多处部署 │
│ ✅ 统一的模型格式 │
│ ✅ 多种推理引擎支持 │
│ ✅ 硬件加速支持 │
│ │
└─────────────────────────────────────────────────────────────┘
ONNX 的历史 #
发展历程 #
text
2017年 ─── ONNX 项目启动
│
│ Microsoft 和 Facebook 联合发布
│ 定义开放模型格式
│ 支持基础算子
│
2018年 ─── ONNX 1.0 发布
│
│ 稳定的 API
│ 更多算子支持
│ ONNX Runtime 发布
│
2019年 ─── 生态扩展
│
│ 更多框架支持
│ 硬件厂商加入
│ 模型动物园扩展
│
2020年 ─── ONNX 1.7+
│
│ 算子类型扩展
│ 动态形状支持
│ 量化支持
│
2021年 ─── 持续发展
│
│ ONNX Runtime 1.0
│ 更多硬件后端
│ 性能优化
│
至今 ─── 广泛应用
│
│ 工业界广泛采用
│ 云服务原生支持
│ 持续更新迭代
里程碑版本 #
| 版本 | 时间 | 重要特性 |
|---|---|---|
| 1.0 | 2017.12 | 首次发布,基础算子支持 |
| 1.5 | 2019.03 | 动态形状支持 |
| 1.6 | 2019.12 | 算子类型扩展 |
| 1.7 | 2020.07 | 量化算子支持 |
| 1.8 | 2020.12 | 改进的动态形状 |
| 1.9 | 2021.04 | 更多算子和优化 |
| 1.10 | 2021.07 | 类型扩展 |
| 1.11 | 2021.12 | 算子集更新 |
| 1.12 | 2022.04 | 性能改进 |
| 1.13 | 2022.10 | 新算子支持 |
| 1.14 | 2023.03 | 持续优化 |
| 1.15 | 2023.08 | 算子扩展 |
ONNX 的核心特点 #
1. 开放标准 #
text
┌─────────────────────────────────────────────────────────────┐
│ 开放标准特性 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开源协议:MIT License │
│ - 商业友好 │
│ - 可自由使用和修改 │
│ - 无专利限制 │
│ │
│ 开放治理: │
│ - Linux Foundation AI (LFAI) 项目 │
│ - 多厂商共同维护 │
│ - 社区驱动发展 │
│ │
│ 标准化: │
│ - 明确的算子定义 │
│ - 版本化的算子集 │
│ - 兼容性保证 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 统一格式 #
text
┌─────────────────────────────────────────────────────────────┐
│ ONNX 模型格式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 基于 Protocol Buffers: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ONNX Model │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ ir_version: 7 │ │
│ │ producer_name: "pytorch" │ │
│ │ producer_version: "1.12" │ │
│ │ opset_import: [domain: "", version: 17] │ │
│ │ │ │
│ │ graph: │ │
│ │ name: "my_model" │ │
│ │ inputs: [input_tensor] │ │
│ │ outputs: [output_tensor] │ │
│ │ nodes: [conv, relu, pool, fc, ...] │ │
│ │ initializer: [weights, biases] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 优势: │
│ ✅ 二进制格式,体积小 │
│ ✅ 跨语言支持 │
│ ✅ 高效序列化 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 跨框架支持 #
text
┌─────────────────────────────────────────────────────────────┐
│ 支持的框架 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 训练框架导出: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ PyTorch │ │ TensorFlow │ │ MXNet │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ JAX │ │ scikit-learn│ │ Keras │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 推理引擎支持: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ONNX Runtime │ │ TensorRT │ │ OpenVINO │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TVM │ │ CoreML │ │ TensorRT │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
4. 硬件加速 #
text
┌─────────────────────────────────────────────────────────────┐
│ 支持的硬件平台 │
├─────────────────────────────────────────────────────────────┤
│ │
│ CPU: │
│ - Intel x86 (AVX2, AVX512, VNNI) │
│ - AMD x86 (AVX2) │
│ - ARM (NEON) │
│ - Apple Silicon (NEON, AMX) │
│ │
│ GPU: │
│ - NVIDIA (CUDA, TensorRT) │
│ - AMD (ROCm, MIGraphX) │
│ - Intel (OpenVINO GPU) │
│ - Apple (Metal) │
│ │
│ 专用加速器: │
│ - Intel VPU / GNA │
│ - Google TPU │
│ - FPGA │
│ - NPU (神经网络处理器) │
│ │
└─────────────────────────────────────────────────────────────┘
ONNX 的应用场景 #
1. 跨框架模型迁移 #
text
┌─────────────────────────────────────────────────────────────┐
│ 模型迁移流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:PyTorch 训练的模型需要在 TensorFlow 中使用 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │PyTorch │────>│ ONNX │────>│TensorFlow│ │
│ │ 模型 │ │ 格式 │ │ 使用 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 步骤: │
│ 1. PyTorch 导出 ONNX │
│ 2. 验证 ONNX 模型正确性 │
│ 3. TensorFlow 加载 ONNX │
│ │
└─────────────────────────────────────────────────────────────┘
2. 高性能推理部署 #
text
┌─────────────────────────────────────────────────────────────┐
│ 推理部署流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:模型部署到生产环境,需要高性能推理 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 训练 │────>│ ONNX │────>│ ONNX │ │
│ │ 框架 │ │ 格式 │ │ Runtime │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ 生产环境 │ │
│ └─────────┘ │
│ │
│ 优势: │
│ ✅ 比 PyTorch 快 1.5-4x │
│ ✅ 内存占用更小 │
│ ✅ 支持硬件加速 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 边缘设备部署 #
text
┌─────────────────────────────────────────────────────────────┐
│ 边缘部署流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:模型部署到边缘设备(手机、IoT 设备) │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 云端 │────>│ ONNX │────>│ 量化 │ │
│ │ 训练 │ │ 格式 │ │ 优化 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 边缘设备 │ │
│ │ ┌─────┐ ┌─────┐│ │
│ │ │手机 │ │ IoT ││ │
│ │ └─────┘ └─────┘│ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
4. 模型优化与量化 #
text
┌─────────────────────────────────────────────────────────────┐
│ 模型优化流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 原始模型 ──> ONNX ──> 优化 ──> 量化 ──> 部署 │
│ │
│ 优化技术: │
│ - 算子融合 (Conv + BN + ReLU) │
│ - 常量折叠 │
│ - 死代码消除 │
│ - 内存优化 │
│ │
│ 量化技术: │
│ - 动态量化 (INT8) │
│ - 静态量化 (INT8) │
│ - 混合精度量化 │
│ │
└─────────────────────────────────────────────────────────────┘
ONNX 的组成部分 #
核心组件 #
text
┌─────────────────────────────────────────────────────────────┐
│ ONNX 核心组件 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. ONNX 规范 (Specification) │
│ - 模型格式定义 │
│ - 算子定义 │
│ - 数据类型定义 │
│ │
│ 2. ONNX Python 库 │
│ - 模型加载和保存 │
│ - 模型验证 │
│ - 模型操作 API │
│ │
│ 3. ONNX Runtime │
│ - 高性能推理引擎 │
│ - 多硬件后端支持 │
│ - 图优化能力 │
│ │
│ 4. ONNX 优化器 │
│ - 图优化 │
│ - 模型简化 │
│ │
│ 5. ONNX 模型动物园 │
│ - 预训练模型 │
│ - 示例模型 │
│ │
└─────────────────────────────────────────────────────────────┘
ONNX vs 其他格式 #
对比分析 #
| 特性 | ONNX | SavedModel | TorchScript | TensorRT |
|---|---|---|---|---|
| 跨框架 | ✅ | ❌ TF only | ❌ PyTorch | ❌ NVIDIA |
| 开放标准 | ✅ | ✅ | ✅ | ❌ |
| 推理性能 | 高 | 中 | 中 | 极高 |
| 硬件支持 | 广泛 | PyTorch | NVIDIA | |
| 学习曲线 | 中等 | 中等 | 中等 | 较高 |
| 社区活跃度 | 高 | 高 | 高 | 中 |
选择建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 格式选择指南 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 选择 ONNX 的场景: │
│ ✅ 需要跨框架迁移模型 │
│ ✅ 需要部署到多种硬件平台 │
│ ✅ 需要高性能推理 │
│ ✅ 需要模型优化和量化 │
│ ✅ 需要灵活的推理引擎选择 │
│ │
│ 选择其他格式的场景: │
│ - TensorFlow 生态:选择 SavedModel │
│ - PyTorch 生态:选择 TorchScript │
│ - NVIDIA GPU 极致性能:选择 TensorRT │
│ │
└─────────────────────────────────────────────────────────────┘
学习路径 #
text
入门阶段
├── ONNX 简介(本文)
├── 安装与配置
└── 核心概念
进阶阶段
├── 模型结构
├── 算子详解
└── 模型转换
高级阶段
├── Python API
├── ONNX Runtime
├── 模型优化
└── 模型量化
实战阶段
├── PyTorch 模型转换
├── TensorFlow 模型转换
└── 模型部署
下一步 #
现在你已经了解了 ONNX 的基本概念,接下来学习 安装与配置,开始实际使用 ONNX!
最后更新:2026-04-04