ONNX(Open Neural Network Exchange,开放神经网络交换格式)就像深度学习界的 “PDF”——它是一种通用的模型文件格式,专门用来在不同的AI框架和工具之间,无障碍地交换和部署模型。

结合我们之前聊的“部署流程”,ONNX 主要作用在 “模型转换” 这个关键环节。你之前问到 TorchScript,它就像是 PyTorch 官方为自家模型定制的“打包快递盒”,而 ONNX 则更像一个全世界通用的“标准集装箱”

它解决了什么问题?

你肯定会遇到这种麻烦:用 PyTorch 训练好的模型,想部署在高通手机上跑,高通的推理库只认自家格式;或者想用英伟达的 TensorRT 加速,它又不直接吃 PyTorch 模型。

ONNX 就是为解决这种框架碎片化而生的。它定义了一套标准化的计算图表示,你只要:

  1. 从 PyTorch 导出 model.onnx
  2. 这个 model.onnx 文件就可以被各种支持 ONNX 的推理引擎直接读取和优化,比如:
    • ONNX Runtime(微软开源的高性能推理器,跨平台)
    • TensorRT(英伟达的推理加速神器)
    • OpenVINO(英特尔的推理工具套件)
    • Core ML(苹果的端侧框架,也支持从 ONNX 转换)

在“拍照识花”里怎么用?

还记得那个识别花的例子吗?使用 ONNX 后的流程会变成这样:

  1. 训练:得到一个 PyTorch 模型。
  2. 转换(ONNX 登场):一行代码 torch.onnx.export(),把模型变成 flower_model.onnx。这一步会记录下模型的计算图、每一层的权重和算子类型。
  3. 优化与部署
    • 要是部署到云端 GPU 服务器追求极速,就用 TensorRT 读取这个 .onnx 文件,完成算力优化,然后启动服务。
    • 要是部署到 Android 手机上,就用 ONNX Runtime Mobile 直接加载 .onnx 文件做本地推理,无需转来转去。
    • 这中间如果需要检查模型结构对不对,用 Netron 这个工具直接打开 .onnx 文件,就能像看图一样看清每一层。

ONNX 的核心构成

一个 ONNX 文件可以简单理解为它精确地记录了三件事:
- 计算图:数据是怎样一步步流动的(先卷积,再归一化,然后激活……)。
- 算子集:每一步用什么操作(Conv、Relu 等),以及 ONNX 的标准算子版本。
- 权重参数:模型学到的所有数值。

这样,任何支持 ONNX 的工具都能“看懂”这个模型,并把它拿到自家最擅长的硬件上跑出最优性能。

简单总结,ONNX 让“训练”和“部署”彻底解耦:你用任何框架训练,导出 ONNX 后,就能用任何优化工具、部署到任何硬件上。这是深度学习工程化落地最核心的桥梁之一。