介绍
ONNX (Open Neural Network Exchange) 是一个开放的、跨框架和跨平台的深度学习模型标准格式。
你可以把它理解为 AI 模型世界的“通用语言”或“中间件”。它的主要作用是解决模型训练环境和部署环境不一致的问题,让你可以“一次训练,到处运行”。
源起与发展
ONNX 是由 微软(Microsoft) 和 Facebook(现 Meta) 在 2017 年 联合发起的。但现在由 Linux 基金会 负责“抚养”和管理,是一个属于全行业的开放标准。
诞生与早期开发(2017年)
- 核心开发者:ONNX 最初代号为“Toffee”,主要由 Facebook 的 PyTorch 团队 开发。
- 正式发布:2017年9月,Facebook 和微软正式宣布推出 ONNX。随后在同年12月发布了 v1.0 版本。
- 初衷:为了解决当时 AI 框架(如 PyTorch 和 TensorFlow)之间互不兼容、模型难以迁移的问题,定义一个通用的神经网络交换格式。
现在的维护者(2019年至今)
- 归属组织:2019年11月,ONNX 项目正式加入了 Linux 基金会旗下的 LF AI & Data 基金会。
- 当前状态:这意味着 ONNX 不再属于某一家单独的公司,而是变成了一个由社区共同治理的开源中立项目。
庞大的贡献者生态
除了最初的两位“缔造者”,ONNX 的发展离不开众多科技巨头的支持。目前,亚马逊(AWS)、英特尔(Intel)、英伟达(NVIDIA)、IBM、华为、高通等公司都是 ONNX 的重要贡献者和支持者。
ONNX 解决了什么问题?
在没有 ONNX 之前,模型部署面临诸多挑战:
- 框架壁垒:用 PyTorch 训练的模型,很难直接在 TensorFlow 的环境中使用。
- 部署困难:训练框架通常依赖复杂,体积庞大,不适合部署到手机、浏览器或边缘设备等资源受限的环境。
- 性能瓶颈:训练框架的推理性能往往不是最优的,难以满足生产环境对速度和成本的要求。
ONNX 通过定义一个标准化的模型格式(计算图)和一套通用的算子,打破了这些壁垒。
优势
跨框架支持
ONNX 支持几乎所有主流的深度学习框架。你可以用任何框架训练模型,然后导出为 ONNX 格式。- PyTorch: 原生支持
torch.onnx.export。 - TensorFlow / Keras: 通过
tf2onnx工具转换。 - Scikit-learn: 通过
skl2onnx工具转换。 - 其他: PaddlePaddle, MindSpore 等也都有官方或社区支持。
- PyTorch: 原生支持
跨平台部署
一个.onnx模型文件可以在多种硬件和操作系统上运行,包括:- 服务器: Windows, Linux, macOS。
- 硬件: x86/ARM CPU, NVIDIA/AMD/Intel GPU, 以及各类 NPU。
- 边缘与移动设备: 手机 (iOS/Android)、嵌入式设备 (如 Jetson, 树莓派)。
- 浏览器: 通过 ONNX Runtime Web 在网页中直接运行。
高性能推理
ONNX 本身是一个格式标准,真正的性能提升来自于 ONNX Runtime 以及其他推理引擎(如 TensorRT, OpenVINO)。这些引擎对 ONNX 模型进行深度优化,例如:- 图优化: 融合多个计算节点,减少内存访问。
- 量化: 将模型从 FP32 精度转换为 INT8 精度,显著减小模型体积并提升 CPU 推理速度。
工作流程
一个标准的 ONNX 使用流程通常分为三步:
- 训练模型:在你熟悉的框架(如 PyTorch)中完成模型训练。
- 导出 ONNX:将训练好的模型导出为
.onnx文件。 - 部署推理:使用 ONNX Runtime 或其他支持 ONNX 的引擎加载模型并进行推理。
代码示例 (PyTorch)
下面是一个简单的 PyTorch 模型导出为 ONNX 并进行推理的完整示例。
第一步:安装必要的库
pip install onnx onnxruntime
# PyTorch 通常已内置 ONNX 导出支持
第二步:训练并导出模型
import torch
import torch.nn as nn
# 1. 定义一个简单的 PyTorch 模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 2) # 一个简单的全连接层
def forward(self, x):
return self.fc(x)
model = SimpleModel()
model.eval() # 导出前务必切换到评估模式
# 2. 创建一个虚拟输入,用于追踪计算图
dummy_input = torch.randn(1, 10)
# 3. 导出为 ONNX 格式
torch.onnx.export(
model, # 要导出的模型
dummy_input, # 模型的示例输入
"simple_model.onnx",# 导出的文件名
input_names=['input'], # 输入节点的名称
output_names=['output'] # 输出节点的名称
)
print("模型已成功导出为 simple_model.onnx")
第三步:使用 ONNX Runtime 进行推理
import onnxruntime as ort
import numpy as np
# 1. 加载 ONNX 模型
ort_session = ort.InferenceSession("simple_model.onnx")
# 2. 准备输入数据 (注意数据类型和形状)
input_data = np.random.randn(1, 10).astype(np.float32)
# 3. 运行推理
# 获取输入节点的名称
input_name = ort_session.get_inputs()[0].name
outputs = ort_session.run(None, {input_name: input_data})
print("推理结果:", outputs)
生态工具
ONNX 拥有一个丰富的生态系统,帮助你更好地使用它:
- ONNX Runtime: 微软开发的高性能推理引擎,是部署 ONNX 模型的首选。
- Netron: 一个强大的模型可视化工具,可以查看
.onnx文件的网络结构。 - ONNX Simplifier: 用于简化模型,合并冗余算子,使模型更易于部署。
- TensorRT / OpenVINO: 分别是 NVIDIA 和 Intel 推出的推理优化套件,它们都深度集成了 ONNX,可以为特定硬件提供极致的性能加速。
支持 ONNX 的知名模型
支持 ONNX 的知名模型分为“原生支持/官方提供”和“社区热门转换”两类来介绍。
1. 计算机视觉 (CV) —— ONNX 的主战场
这是 ONNX 应用最成熟的领域,几乎所有主流视觉模型都完美支持。
- YOLO 系列 (目标检测)
- 代表模型: YOLOv5, YOLOv8, YOLO-NAS, YOLO-World。
- 特点: Ultralytics(YOLO 的维护方)官方在导出模型时,ONNX 是首选格式之一。因为 YOLO 常用于实时检测,ONNX 格式配合 ONNX Runtime 可以在 CPU 上获得极佳的推理速度,非常适合安防监控和工业质检。
- 经典分类网络
- 代表模型: ResNet (50/101), MobileNet (V2/V3), EfficientNet, VGG, DenseNet。
- 特点: 这些是 ONNX Model Zoo(官方模型库)中的“常驻嘉宾”,通常作为测试推理引擎性能的标准模型。
- 人脸与图像分析
- 代表模型: ArcFace (人脸识别), UltraFace (轻量级人脸检测), Age-Gender (年龄性别预测)。
- 特点: 常用于门禁系统、考勤和边缘计算设备。
2. 自然语言处理 (NLP) —— 大模型与 BERT 家族
虽然大模型训练依赖 PyTorch,但在推理部署(尤其是跨平台)时,ONNX 是重要选择。
- Transformer 家族
- 代表模型: BERT, RoBERTa, DistilBERT, GPT-2, T5, XLM-R。
- 特点: Hugging Face 的
optimum库可以将这些模型一键导出为 ONNX 格式,用于加速文本分类、问答系统和机器翻译。
- 文心系列 (Baidu)
- 代表模型: ERNIE (文心大模型)。
- 特点: 百度 PaddlePaddle 生态的模型也常通过转换工具支持 ONNX,以便在非百度框架环境下部署。
3. 生成式 AI (AIGC) —— 新兴热点
这是 2025-2026 年的热门趋势,让 AI 绘图在本地或浏览器运行。
- Stable Diffusion
- 代表模型: SD v1.5, SDXL, ControlNet。
- 特点: 虽然原生基于 PyTorch,但社区(如
onnx-community)提供了转换好的 ONNX 版本。这使得 Stable Diffusion 可以在 Windows 直接运行(通过 DirectML)或在 Web 端(通过 WebGPU)进行推理,无需庞大的 Python 环境。
4. 传统机器学习 —— 被忽视的利器
- Scikit-learn 模型
- 代表模型: 随机森林、SVM (支持向量机)、线性回归、K-Means 聚类。
- 特点: 通过
skl2onnx工具,可以将这些传统的机器学习模型转换为 ONNX。这对于将旧系统的算法迁移到 .NET 或 Java 生产环境中非常有用。
知名模型 ONNX 支持情况一览
你可以使用下表来总结博客中的这一部分:
| 模型类别 | 知名代表模型 | 主要应用场景 | 支持方式 |
|---|---|---|---|
| 目标检测 | YOLOv8, YOLO-NAS | 实时安防、工业质检 | 官方原生导出支持 |
| 图像分类 | ResNet, MobileNet | 图像识别、边缘设备 | ONNX Model Zoo 预训练 |
| 人脸识别 | ArcFace, UltraFace | 门禁考勤、支付验证 | 社区广泛提供 ONNX 版本 |
| NLP/大模型 | BERT, GPT-2, Llama | 文本分析、聊天机器人 | Hugging Face Optimum 转换 |
| AIGC | Stable Diffusion | AI 绘图、图像生成 | 社区优化版本 (WebGPU/DirectML) |
| 传统 ML | Scikit-learn 系列 | 金融风控、数据预测 | skl2onnx 工具转换 |