一句话定义:ONNX(Open Neural Network Exchange)是一套描述神经网络计算图的开放标准格式,把模型导出成 .onnx 文件后,就能被不同的推理引擎在 CPU、GPU、手机、浏览器甚至车载芯片上加载运行。
可以把 ONNX 理解成模型界的 PDF:你在 Word 里写文档,导出成 PDF,别人用什么系统都能打开看,但想改一个字就很别扭。ONNX 做的是同一件事——PyTorch、TensorFlow 等框架训练出来的模型,先“翻译”成一套标准算子和计算图结构,再由 ONNX Runtime、TensorRT、OpenVINO 这类推理引擎把它编译成目标硬件上跑得动的代码。你只管训练,交付那一步交给中间格式。
这个“翻译”不是免费的,代价主要有四类:
一是算子覆盖不全。 框架里新出的算子、你自己写的自定义算子,标准里可能还没有对应物,导出时要么报错,要么退化成自定义算子,交给引擎去救——而引擎往往救不动,最后性能还不如不转。
二是动态性受限。 训练代码里常见的 if、循环、可变长度输入,在这套静态图表示里表达起来很别扭,动态 shape 也容易在某个环节卡住。
三是数值未必一致。 导出后精度、算子融合、量化策略都换了,输出和原框架可能只差小数点后几位——多数场景无所谓,做风控、医疗、对齐校验时就很要命,必须逐层对账。
四是它不承诺性能。 ONNX 是通用格式,通用意味着“哪儿都能跑”,不等于“哪儿都最快”。真正的加速来自各家引擎针对芯片的融合与量化,有些引擎最后还会生成自己的私有格式,ONNX 只是入口。
区别一下相邻概念:
| 概念 | 角色 | 说明 |
|---|---|---|
| PyTorch / TensorFlow | 训练框架 | 产出权重与计算图,负责“教模型” |
| ONNX | 中间表示 | 负责“搬家”,跨框架跨硬件描述模型 |
| ONNX Runtime / TensorRT / OpenVINO | 推理引擎 | 负责“落地”,把图编译成硬件可执行代码 |
对从业者来说,ONNX 的价值在于解耦:算法团队交模型,部署团队挑硬件,双方不用互相等。对普通人来说,同一个 AI 功能能同时出现在 App、小程序、网页和边缘盒子上,不用为每个平台重写一遍——代价是“跑起来不难,跑得极致要调”。具体算子支持范围、版本兼容性以官方文档和各引擎说明为准。
