ONNX #

什么是 ONNX? #

ONNX(Open Neural Network Exchange)是一个开放的模型表示格式,由 Microsoft 和 Facebook 于 2017 年联合推出。它定义了一个可扩展的计算图模型、内置算子和标准数据类型,使 AI 开发者能够轻松在不同框架和硬件平台之间迁移模型。

核心定位 #

text
┌─────────────────────────────────────────────────────────────┐
│                         ONNX                                 │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  开放标准    │  │  跨框架      │  │  跨平台      │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  可扩展      │  │  高性能      │  │  生态丰富    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

ONNX 的优势 #

优势 说明
框架互操作性 在 PyTorch、TensorFlow、MXNet 等框架间自由转换
硬件加速 支持 CPU、GPU、TPU、FPGA 等多种硬件后端
统一格式 一个模型格式,多种推理引擎支持
生产就绪 ONNX Runtime 提供高性能推理
开源生态 活跃的开源社区和丰富的工具链
标准化算子 定义了 150+ 标准算子

文档结构 #

本指南按以下结构组织,适合初学者按顺序学习:

1. 基础入门 #

主题 描述 文档链接
ONNX 简介 ONNX 的发展历史、特点、应用场景 intro.md
安装与配置 各平台安装、环境配置、验证安装 installation.md
核心概念 计算图、张量、算子等核心概念 concepts.md

2. 核心功能 #

主题 描述 文档链接
模型结构 ONNX 模型的组成、ProtoBuf 格式 model.md
算子详解 标准算子、算子集版本管理 operators.md
模型转换 从各框架导出 ONNX 模型 conversion.md

3. API 参考 #

主题 描述 文档链接
Python API onnx 库的 Python 接口详解 python-api.md
ONNX Runtime 高性能推理引擎使用 runtime.md

4. 高级特性 #

主题 描述 文档链接
模型优化 ONNX 优化器、图优化技术 optimization.md
自定义算子 扩展 ONNX 算子 custom-ops.md
模型量化 INT8 量化、动态量化 quantization.md

5. 实战案例 #

主题 描述 文档链接
PyTorch 模型转换 PyTorch 模型导出 ONNX 完整流程 pytorch-conversion.md
TensorFlow 模型转换 TensorFlow 模型导出 ONNX tensorflow-conversion.md
模型部署 使用 ONNX Runtime 部署模型 deployment.md

ONNX 生态系统 #

text
┌─────────────────────────────────────────────────────────────┐
│                    ONNX 生态系统                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    训练框架                           │   │
│  │  PyTorch | TensorFlow | MXNet | JAX | scikit-learn  │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    ONNX 格式                          │   │
│  │         统一的模型表示 | 标准算子定义                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    推理引擎                           │   │
│  │  ONNX Runtime | TensorRT | OpenVINO | TVM | CoreML  │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    硬件平台                           │   │
│  │   CPU | NVIDIA GPU | AMD GPU | Intel GPU | ARM |    │   │
│  │   TPU | FPGA | NPU | WebGPU                         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

为什么选择 ONNX? #

解决的问题 #

text
┌─────────────────────────────────────────────────────────────┐
│                    传统模型部署痛点                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题 1:框架锁定                                           │
│  - PyTorch 训练的模型难以在 TensorFlow 中使用               │
│  - 需要重新实现或依赖特定框架                                │
│                                                             │
│  问题 2:部署困难                                           │
│  - 生产环境可能不支持训练框架                                │
│  - 需要额外的依赖和配置                                      │
│                                                             │
│  问题 3:性能瓶颈                                           │
│  - 训练框架不一定适合推理                                    │
│  - 缺乏针对特定硬件的优化                                    │
│                                                             │
│  问题 4:维护成本                                           │
│  - 多个框架需要维护多套代码                                  │
│  - 版本兼容性问题                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                    ONNX 解决方案                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✅ 统一格式:一个模型,多种推理引擎                         │
│  ✅ 框架解耦:训练和推理框架分离                             │
│  ✅ 高性能:ONNX Runtime 提供极致推理性能                    │
│  ✅ 硬件加速:自动利用硬件加速能力                           │
│  ✅ 易于部署:轻量级依赖,跨平台支持                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

性能对比 #

text
┌─────────────────────────────────────────────────────────────┐
│                ONNX Runtime vs 原生框架性能                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ResNet-50 推理 (batch=1, CPU)                              │
│                                                             │
│  PyTorch      ████████████████████████████  45ms           │
│                                                             │
│  ONNX Runtime ██████████████████            28ms (1.6x)    │
│                                                             │
│  BERT-base 推理 (sequence=128, CPU)                         │
│                                                             │
│  TensorFlow   ████████████████████████████  120ms          │
│                                                             │
│  ONNX Runtime ██████████████                75ms (1.6x)    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

快速开始 #

安装 #

bash
pip install onnx onnxruntime

基本使用 #

python
import torch
import torch.onnx
import onnx
import onnxruntime as ort
import numpy as np

class SimpleModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = torch.nn.Linear(10, 5)
    
    def forward(self, x):
        return torch.relu(self.fc(x))

model = SimpleModel()
dummy_input = torch.randn(1, 10)

torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    input_names=["input"],
    output_names=["output"],
    dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}}
)

onnx_model = onnx.load("model.onnx")
onnx.checker.check_model(onnx_model)

session = ort.InferenceSession("model.onnx")
input_data = np.random.randn(1, 10).astype(np.float32)
outputs = session.run(None, {"input": input_data})
print(outputs[0])

学习建议 #

初学者路线 #

text
ONNX 简介 → 安装配置 → 核心概念 → 模型结构

进阶路线 #

text
模型转换 → Python API → ONNX Runtime → 模型优化

高级路线 #

text
自定义算子 → 模型量化 → 性能调优 → 生产部署

ONNX vs 其他格式 #

特性 ONNX SavedModel TorchScript
跨框架支持 ✅ 支持 ❌ TensorFlow only ❌ PyTorch only
推理引擎 多种选择 TensorFlow Serving LibTorch
硬件支持 广泛 Google 生态 NVIDIA 优化
社区活跃度
学习曲线 中等 中等 中等

学习资源 #

开始学习 #

准备好了吗?让我们从 ONNX 简介 开始你的跨框架模型部署之旅!

最后更新:2026-04-04