1. ONNX基础入门:ONNX是什么、为什么需要ONNX、ONNX生态概览、安装ONNX与ONNX Runtime

1.1 ONNX到底是什么?

ONNX,全称是Open Neural Network Exchange。

说白了,它就是一个「模型交换格式」。你想想看,深度学习框架这么多——PyTorch、TensorFlow、Keras、MXNet……每个框架都有自己的模型保存方式。PyTorch用.pt,TensorFlow用.pb或.h5,Caffe用.caffemodel。这就像每个国家都说自己的语言,互相听不懂。

ONNX就是那个「世界语」。它定义了一套统一的模型表示标准。不管你在哪个框架里训练,都能导出成ONNX格式。然后,你可以在另一个框架里加载它,或者用ONNX Runtime直接跑推理。

我在项目中遇到过最典型的场景:团队用PyTorch做实验,但部署环境只支持TensorFlow。以前得手动重写模型,费时费力还容易出错。后来我们统一用ONNX做中间格式,导出一次,到处运行。嗯,这感觉确实爽。

核心要点:ONNX是一个开放标准,用于表示深度学习模型。它让模型可以在不同框架之间自由迁移。

1.2 为什么需要ONNX?

你可能要问:我就在一个框架里干活,干嘛要折腾ONNX?

原因其实很现实。我做了这么多年模型部署,总结下来有三大痛点:

  1. 框架锁定问题——训练和部署必须用同一个框架。换框架?重写模型吧。
  2. 推理性能瓶颈——很多框架的推理引擎优化不够。比如PyTorch的推理速度,说实话,不如专门优化的推理引擎。
  3. 硬件适配困难——你想在手机、嵌入式设备、云端GPU上跑同一个模型?每个平台对框架的支持程度不一样。

ONNX恰好解决了这些问题。它提供了一个中间表示,让模型可以:

  • 跨框架迁移(PyTorch → ONNX → TensorFlow)
  • 跨平台部署(云端 → 边缘 → 移动端)
  • 享受专门的推理优化(ONNX Runtime、TensorRT等)

我记得有一次,客户要求模型必须在树莓派上跑。PyTorch在ARM上的支持一言难尽。我们导出ONNX,用ONNX Runtime跑,推理速度提升了3倍。客户当场就满意了。

个人建议:如果你做模型部署,ONNX几乎是必学的。它不是你「要不要用」的问题,而是你「迟早会用」的问题。

1.3 ONNX生态概览

ONNX不是孤零零的一个格式。它背后有一套完整的生态工具链。我把它分成三层:

层级 组件 作用
核心层 ONNX格式、ONNX OpSet 定义模型结构和算子标准
工具层 onnx、onnx-simplifier、onnxoptimizer 模型导出、简化、优化
推理层 ONNX Runtime、TensorRT、OpenVINO 高性能推理执行

这里我重点说几个常用的:

  • onnx——Python包,用来加载、检查、修改ONNX模型。必备工具。
  • onnx-simplifier——我几乎每个项目都用。它能去掉模型里多余的算子,让模型更干净。有些框架导出的ONNX会有很多冗余结构,用这个一清理,模型大小能减少20%。
  • ONNX Runtime——微软出品的推理引擎。支持CPU、GPU、甚至手机端。性能优化做得相当好。
  • TensorRT——NVIDIA的推理优化工具。如果你用N卡,这个能压榨出极致性能。

避坑指南:我曾经在导出ONNX时,发现某些算子不支持。比如PyTorch里的torch.einsum,ONNX标准里没有对应的算子。解决办法是:要么换用ONNX支持的算子,要么自定义算子。所以导出前,最好先查一下OpSet支持的算子列表。

1.4 安装ONNX与ONNX Runtime

安装其实很简单。我建议用pip直接装。但要注意版本匹配。

先装ONNX核心库:

pip install onnx

再装ONNX Runtime。这里分CPU和GPU版本:

# CPU版本(通用)
pip install onnxruntime

# GPU版本(需要CUDA)
pip install onnxruntime-gpu

验证安装是否成功:

import onnx
import onnxruntime

print(f"ONNX版本: {onnx.__version__}")
print(f"ONNX Runtime版本: {onnxruntime.__version__}")

如果打印出版本号,说明安装成功了。

小技巧:我习惯用conda创建虚拟环境来装ONNX。这样不会污染系统Python。命令是:

conda create -n onnx_env python=3.9
conda activate onnx_env
pip install onnx onnxruntime

另外,如果你要做模型简化,可以装onnx-simplifier:

pip install onnx-simplifier

嗯,到这里,ONNX的基础环境就搭好了。下一章我们会真正动手,把一个PyTorch模型导出成ONNX格式。到时候你会看到,整个过程其实比想象中简单。

本章小结:

  • ONNX是模型交换格式,解决跨框架、跨平台问题
  • 生态包括核心格式、工具链、推理引擎三层
  • 安装只需pip install onnx和onnxruntime
  • 建议用虚拟环境管理依赖

公众号:蓝海资料掘金营,微信deep3321