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 优化 |
| 社区活跃度 | 高 | 高 | 高 |
| 学习曲线 | 中等 | 中等 | 中等 |
学习资源 #
- 官方文档:https://onnx.ai
- GitHub 仓库:https://github.com/onnx/onnx
- ONNX Runtime:https://github.com/microsoft/onnxruntime
- 模型动物园:https://github.com/onnx/models
开始学习 #
准备好了吗?让我们从 ONNX 简介 开始你的跨框架模型部署之旅!
最后更新:2026-04-04