ONNX(Open Neural Network Exchange)
1. 什么是 ONNX?
ONNX(Open Neural Network Exchange,开放神经网络交换格式)是一种开源的机器学习模型表示标准,旨在实现不同框架和平台之间的模型互操作性。
- 定义:ONNX 提供了一种标准化的格式,用于描述机器学习模型(尤其是深度学习模型)的结构、权重和计算流程。
- 发起者:由微软和 Facebook(现为 Meta)于 2017 年联合发起,现由 Linux 基金会下的 LF AI & Data 基金会维护。
- 核心组成:
- 计算图:模型表示为有向图,节点为操作(如卷积、激活),边为数据流。
- 操作符集:标准化的操作(如 Conv、Relu、Add),通过版本化(opset)确保兼容性。
- 元数据:支持模型描述信息,如版本、作者等。
2. ONNX 的主要特点
- 跨框架支持:支持 PyTorch、TensorFlow、MXNet、Scikit-learn 等框架,模型可跨框架转换。
- 硬件加速:与推理引擎(如 ONNX Runtime、NVIDIA TensorRT)兼容,支持 CPU、GPU、TPU 等。
- 跨平台部署:支持云端、边缘设备、移动端(Windows、Linux、macOS、Android、iOS)。
- 模块化设计:支持动态图和静态图,可扩展自定义操作。
- 社区支持:得到微软、AWS、NVIDIA、Intel 等支持,生态活跃。
3. ONNX 的优势
- 互操作性:统一模型格式,跨框架共享模型。
- 简化部署:从训练到推理无缝衔接。
- 性能优化:通过推理引擎实现高效推理。
- 生态丰富:支持多种工具和硬件,覆盖模型转换、优化和推理。
- 灵活性:支持深度学习和传统机器学习模型。
4. ONNX 的工作流程
- 模型训练:在 PyTorch、TensorFlow 等框架中训练模型。
- 模型导出:将模型转换为 ONNX 格式(如 PyTorch 使用
torch.onnx.export
)。 - 模型验证:使用
onnx.checker
检查模型格式,或用 Netron 可视化。 - 模型优化:通过 ONNX Optimizer 或 ONNX Simplifier 优化计算图。
- 模型推理:使用 ONNX Runtime 或 TensorRT 进行高效推理。
- 部署:将模型部署到目标设备(云端、边缘、移动端)。
5. ONNX 生态中的核心库和工具
5.1 核心库
- ONNX Python 库 (
onnx
):- 功能:加载、解析、验证、修改 ONNX 模型。
- 安装:
pip install onnx
- 示例:
import onnx from onnx import checkermodel = onnx.load("model.onnx") checker.check_model(model) print("Model is valid!")
5.2 推理引擎
- ONNX Runtime:
- 功能:跨平台推理,支持 CPU/GPU,优化模型性能。
- 安装:
pip install onnxruntime
(CPU)或pip install onnxruntime-gpu
(GPU) - 示例:
import onnxruntime as ort import numpy as npsession = ort.InferenceSession("model.onnx") input_name = session.get_inputs()[0].name output_name = session.get_outputs()[0].name input_data = np.random.randn(1, 10).astype(np.float32) output = session.run([output_name], {input_name: input_data})[0] print(output)
5.3 模型转换工具
- PyTorch 导出:
torch.onnx
(内置)。- 示例:
import torch import torch.nn as nnclass Model(nn.Module):def forward(self, x):return x * 2model = Model() dummy_input = torch.randn(1, 10) torch.onnx.export(model, dummy_input, "model.onnx", opset_version=11)
- 示例:
- TensorFlow 转换:
tf2onnx
。- 安装:
pip install tf2onnx
- 示例:
python -m tf2onnx.convert --saved-model tf_model_path --output model.onnx
- 安装:
- 其他:
sklearn-onnx
(Scikit-learn)、onnxmltools
(XGBoost、LightGBM)。
5.4 优化工具
- ONNX Optimizer:
- 功能:优化计算图(节点融合、常量折叠)。
- 安装:
pip install onnxoptimizer
- ONNX Simplifier:
- 功能:进一步简化模型,提升推理速度。
- 安装:
pip install onnx-simplifier
5.5 可视化工具
- Netron:
- 功能:可视化 ONNX 模型结构。
- 安装:
pip install netron
- 使用:
netron model.onnx
5.6 其他库
- ONNX.js:在浏览器中运行 ONNX 模型,支持 WebGL。
- NVIDIA TensorRT、Intel OpenVINO:优化 ONNX 模型推理。
6. 使用场景
- 模型共享:跨团队共享模型,统一格式。
- 跨平台部署:从云端到边缘设备或移动端。
- 推理优化:降低延迟,提升性能。
- 模型标准化:企业内部统一模型管理。
- 新硬件支持:兼容 AI 加速器等新兴硬件。
7. 注意事项
- 操作符集版本(opset_version):确保框架和推理引擎支持相同的版本。
- 模型复杂性:复杂操作(如动态形状)可能需额外处理。
- 性能调试:根据目标硬件和推理引擎优化模型。
- 社区资源:参考 ONNX 官网(https://onnx.ai/)和 GitHub(https://github.com/onnx/onnx)。
8. 学习资源
- 官方文档:https://onnx.ai/
- GitHub 仓库:https://github.com/onnx/onnx
- 教程:https://github.com/onnx/tutorials
- 可视化工具:Netron(https://netron.app/)
- 推理引擎:ONNX Runtime(https://onnxruntime.ai/)
总结:ONNX 是一个强大的标准化模型格式,结合丰富的工具生态(如 ONNX Runtime、Netron),支持从模型转换到高效推理的完整流程。通过统一格式,ONNX 简化了模型的跨框架共享和跨平台部署,广泛应用于学术和工业场景。