ONNX(Open Neural Network Exchange)是一个开放的神经网络交换格式。2017 年,Facebook 和 Microsoft 共同发布 ONNX,最初代号为 “Toffee”,由 Facebook 的 PyTorch 团队开发。同年 9 月,正式更名为 ONNX,并得到了 IBM、华为、英特尔等多家公司的支持。12 月,ONNX 发布了第一个正式版本(v1.0),为不同深度学习框架提供通用的模型表示标准,方便模型在不同框架和工具之间迁移。
项目地址:https://github.com/onnx/onnx
一、核心定位与目标
跨框架兼容性:主流深度学习框架(如 PyTorch、TensorFlow、MXNet 等)均可导出为 ONNX 格式,也可从 ONNX 格式导入,打破框架壁垒。
简化部署流程:训练好的模型转换为 ONNX 后,可直接部署到多种硬件(CPU、GPU、FPGA、边缘设备等)和推理引擎(如 ONNX Runtime、TensorRT、OpenVINO 等),无需针对不同平台重复适配。
开放与标准化:由微软、Facebook(现 Meta)等企业联合发起,采用开源模式,定义统一的神经网络层、数据类型和运算规范。
二、技术架构
1. 模型结构:
ONNX 模型以协议缓冲区(Protocol Buffers) 格式存储,包含两部分:
`model.pb`:二进制文件,存储模型的计算图结构(节点、边、张量信息)。
`model.onnx`:文本格式(可选),用于可视化和调试,描述模型元数据(输入输出、版本等)。
计算图由节点(Node)、张量(Tensor) 和属性(Attribute) 组成:
节点:表示具体运算(如卷积、激活函数),包含输入、输出和运算类型。
张量:存储数据(如权重、输入特征),定义形状和数据类型。
属性:节点的静态参数(如卷积核大小、步长)。
2. 版本兼容性:
采用语义化版本(如 1.14.0),确保不同版本间的兼容性;同时支持算子集(Operator Set) 版本控制,每个算子(如 `Conv`、`Relu`)有独立版本,便于扩展和更新。
三、关键应用场景
1. 模型转换:
示例:PyTorch 模型 → ONNX → TensorRT 优化部署,或 TensorFlow 模型 → ONNX → OpenVINO 边缘推理。
优势:避免因框架差异导致的模型重构,减少开发成本。
2. 跨平台部署:
支持云服务器、移动设备(Android/iOS)、嵌入式系统等场景,结合 ONNX Runtime 可实现高效推理。
推理引擎通过解析 ONNX 模型,自动优化计算(如算子融合、量化),提升运行速度。
3. 模型可视化与调试:
借助工具(如 Netron)可直观展示 ONNX 模型的计算图结构,方便分析层与层之间的连接关系,定位模型问题。
四、常用工具与生态
转换工具:
PyTorch:内置 `torch.onnx.export()` 函数直接导出。
TensorFlow:通过 `tf2onnx` 库转换。
MXNet、Keras 等框架均有对应转换接口。
推理引擎:
ONNX Runtime:微软开发的跨平台推理引擎,支持 CPU/GPU 加速,与 ONNX 格式深度适配,是部署的首选工具之一。
其他:NVIDIA TensorRT(GPU 优化)、Intel OpenVINO(边缘设备)、AMD MIGraphX 等。
可视化工具:
Netron:支持 ONNX、TensorFlow、PyTorch 等多种模型格式的可视化,可直接在网页或本地客户端使用。
五、优势与局限
优势:
生态完善:覆盖主流框架和硬件,社区活跃。
灵活性高:支持动态计算图(如 PyTorch 动态图)和静态计算图(如 TensorFlow)。
可扩展性强:允许自定义算子,满足特殊场景需求。
局限:
转换精度损失:部分框架特有算子转换为 ONNX 时可能存在精度偏差,需手动调整。
动态形状支持有限:对动态输入形状(如变长序列)的处理不如原生框架灵活。
六、发展现状与趋势
持续迭代:算子集不断扩展,支持 Transformer、扩散模型(Diffusion)等前沿网络结构。
与硬件深度结合:芯片厂商(如 NVIDIA、Intel)纷纷优化 ONNX 推理性能,推动其成为工业界标准。
边缘计算适配:针对低功耗设备推出轻量化版本(如 ONNX Mini),提升边缘场景的部署效率。
总之,ONNX 作为深度学习模型的“通用语言”,极大简化了模型从训练到部署的全流程,是连接科研与产业落地的重要工具。