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
开放标准
推理性能 极高
硬件支持 广泛 Google PyTorch NVIDIA
学习曲线 中等 中等 中等 较高
社区活跃度

选择建议 #

text
┌─────────────────────────────────────────────────────────────┐
│                    格式选择指南                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  选择 ONNX 的场景:                                         │
│  ✅ 需要跨框架迁移模型                                     │
│  ✅ 需要部署到多种硬件平台                                 │
│  ✅ 需要高性能推理                                         │
│  ✅ 需要模型优化和量化                                     │
│  ✅ 需要灵活的推理引擎选择                                 │
│                                                             │
│  选择其他格式的场景:                                       │
│  - TensorFlow 生态:选择 SavedModel                        │
│  - PyTorch 生态:选择 TorchScript                          │
│  - NVIDIA GPU 极致性能:选择 TensorRT                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

学习路径 #

text
入门阶段
├── ONNX 简介(本文)
├── 安装与配置
└── 核心概念

进阶阶段
├── 模型结构
├── 算子详解
└── 模型转换

高级阶段
├── Python API
├── ONNX Runtime
├── 模型优化
└── 模型量化

实战阶段
├── PyTorch 模型转换
├── TensorFlow 模型转换
└── 模型部署

下一步 #

现在你已经了解了 ONNX 的基本概念,接下来学习 安装与配置,开始实际使用 ONNX!

最后更新:2026-04-04