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?
原因其实很现实。我做了这么多年模型部署,总结下来有三大痛点:
- 框架锁定问题——训练和部署必须用同一个框架。换框架?重写模型吧。
- 推理性能瓶颈——很多框架的推理引擎优化不够。比如PyTorch的推理速度,说实话,不如专门优化的推理引擎。
- 硬件适配困难——你想在手机、嵌入式设备、云端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