ONNX:AI 模型跨平台通用推理标准

介绍

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 通过定义一个标准化的模型格式(计算图)和一套通用的算子,打破了这些壁垒。

优势

  1. 跨框架支持
    ONNX 支持几乎所有主流的深度学习框架。你可以用任何框架训练模型,然后导出为 ONNX 格式。

    • PyTorch: 原生支持 torch.onnx.export。
    • TensorFlow / Keras: 通过 tf2onnx 工具转换。
    • Scikit-learn: 通过 skl2onnx 工具转换。
    • 其他: PaddlePaddle, MindSpore 等也都有官方或社区支持。
  2. 跨平台部署
    一个 .onnx 模型文件可以在多种硬件和操作系统上运行,包括:

    • 服务器: Windows, Linux, macOS。
    • 硬件: x86/ARM CPU, NVIDIA/AMD/Intel GPU, 以及各类 NPU。
    • 边缘与移动设备: 手机 (iOS/Android)、嵌入式设备 (如 Jetson, 树莓派)。
    • 浏览器: 通过 ONNX Runtime Web 在网页中直接运行。
  3. 高性能推理
    ONNX 本身是一个格式标准,真正的性能提升来自于 ONNX Runtime 以及其他推理引擎(如 TensorRT, OpenVINO)。这些引擎对 ONNX 模型进行深度优化,例如:

    • 图优化: 融合多个计算节点,减少内存访问。
    • 量化: 将模型从 FP32 精度转换为 INT8 精度,显著减小模型体积并提升 CPU 推理速度。

工作流程

一个标准的 ONNX 使用流程通常分为三步:

  1. 训练模型:在你熟悉的框架(如 PyTorch)中完成模型训练。
  2. 导出 ONNX:将训练好的模型导出为 .onnx 文件。
  3. 部署推理:使用 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 工具转换

原文出处:/show_1GW3FYVROEjF.html