ONNX (Open Neural Network Exchange)
ONNX 是一种开放格式,可将训练好的模型存储为由标准算子组成的计算图,因此在 PyTorch 中训练的模型可以在许多运行时上运行。
ONNX(开放神经网络交换)是一种开放标准文件格式,用于机器学习模型。.onnx 文件以标准算子构成的计算图以及模型权重的形式存储训练好的模型,因此在一种框架(例如 PyTorch)中训练的模型,可以在其他运行时和多种硬件上运行。Facebook 和 Microsoft 于 2017 年 9 月推出 ONNX;自 2019 年 11 月起,ONNX 一直是 Linux 基金会旗下 AI 基金会 LF AI & Data 的毕业项目。ONNX 通常是训练与模型部署之间的交接格式:一个导出的文件可供 ONNX Runtime、TensorRT、OpenVINO 以及许多边缘 AI加速器的编译器使用。
ONNX 文件包含什么#
ONNX 模型使用 Protocol Buffers 序列化,并包含四个部分:
- 计算图:调用
Conv、MatMul和Relu等算子的节点,通过带名称的张量相互连接。计算图的输入和输出包含数据类型与形状信息,每个维度可以是固定值,也可以是符号值,例如可变的批次大小。 - 初始值:训练好的权重。Protocol Buffers 将单个文件的大小限制为 2 GB,因此更大的模型会将权重存储在与
.onnx文件同目录的外部数据文件中。 - 算子集版本:算子按算子集进行版本管理,运行时必须支持模型导出时使用的算子集。新算子集会添加算子而不更改旧算子,例如在算子集 23 中新增的
Attention算子。 - 元数据:生产者名称、模型版本和自定义键值对,例如类别名称。
第二个算子域 ONNX-ML 涵盖树集成模型和线性分类器等传统模型,因此 skl2onnx和 onnxmltools 等转换器可以将 scikit-learn、LightGBM和 XGBoost模型导出为相同格式。Netron等查看器可以逐个显示计算图节点。实际上,ONNX 位于许多训练框架和许多运行时之间:
运行 ONNX 模型#
ONNX Runtime是 Microsoft 的开源推理引擎,可在服务器、桌面设备、手机和浏览器上运行 ONNX 文件。加载模型时,它会优化计算图,例如折叠常量,并将卷积与其后的批归一化融合;随后,它会将计算图的每个部分交给适用于当前硬件的执行提供程序:NVIDIA GPU上的 CUDA 或 TensorRT、Intel 硬件上的 OpenVINO、Windows GPU 上的 DirectML、Apple 设备上的 Core ML、Qualcomm NPU 上的 QNN,以及浏览器中的 WebGPU。Microsoft 的本地推理框架 Windows ML 基于 ONNX Runtime 运行;TensorRT 和 OpenVINO 等其他引擎则会导入 ONNX 文件并将其编译为各自的格式。
Ultralytics YOLO26 可导出为 ONNX,使用 model.export(format="onnx");Ultralytics 的 TensorRT 导出 则会从同一个 ONNX 文件构建引擎。导出的文件无需 PyTorch 即可在 ONNX Runtime 中运行:
import onnxruntime as ort
from ultralytics import YOLO
# 将 YOLO26n 导出为 ONNX,并使用符号批次、高度和宽度维度
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# 在 ONNX Runtime 中加载计算图;它既不需要 PyTorch,也不需要 Ultralytics
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)它会打印计算图的输入 images,其中包含符号批次、高度和宽度维度;还会打印原始预测输出 output0。任何 ONNX 运行时都使用这个签名向模型输入数据并读取结果。
ONNX 与相关格式和工具#
- ONNX Runtime:执行 ONNX 文件的推理引擎。这是一个由 Microsoft 主导的独立项目,人们常把它简称为“ONNX”。
- TensorRT:NVIDIA 的编译器,可将 ONNX 文件转换为针对某种 GPU 类型和 TensorRT 版本优化的引擎。因此,团队会保留 ONNX 文件作为可移植的源文件,并针对每个目标重新构建引擎。
- PyTorch 格式:
.pt检查点和 safetensors 文件存储权重,供代码重建模型;TorchScript 和torch.export则捕获计算图,供 PyTorch 自己的运行时使用。 - 其他部署格式:OpenVINO IR、LiteRT
.tflite文件、Core ML 软件包,以及用于量化 LLM 的 GGUF 文件,都面向特定运行时。Apple 的 coremltools 可直接转换 PyTorch 模型,并在 6 版中移除了对 ONNX 输入的支持。
实际应用#
- 跨平台应用:一个 ONNX 文件即可用于 Linux 服务器、通过 Windows ML 运行的 Windows 应用,以及通过 ONNX Runtime Mobile 运行的 Android 和 iOS 应用。
- 浏览器推理:ONNX Runtime Web 使用 WebGPU 或 WebAssembly 在用户设备上运行模型,因此 姿态估计等功能所用的摄像头画面不会离开浏览器。
- 边缘加速器:Hailo、Qualcomm 和 Rockchip 等厂商的 NPU 工具链接受 ONNX 模型作为输入并进行编译,通常还会通过 量化将模型转换为 INT8,以适配其芯片。
- 生产环境中的传统模型:将梯度提升树和 scikit-learn 流水线转换为 ONNX 后,可通过 ONNX Runtime 在 C#、Java 和 C++ 服务中运行,服务流程中无需 Python 解释器。










