2、ONNX环境搭建:安装ONNX、ONNX Runtime、Protobuf,验证安装
好,咱们正式开始动手了。
这一章的目标很明确——把ONNX相关的工具链装好。说白了,就是装三个东西:ONNX本身、ONNX Runtime、还有Protobuf。别小看这一步,我见过太多人卡在环境上,折腾半天跑不起来,最后发现是Protobuf版本不对。
嗯,咱们一步步来。
2.1 为什么是这三件套?
先理清关系。你想想看,ONNX模型就像一个“中间格式”,它负责把不同框架(PyTorch、TensorFlow)的模型统一起来。而ONNX Runtime是专门用来跑这个格式的推理引擎。至于Protobuf,它是ONNX模型的“骨架”——模型文件本身就是用Protobuf序列化的。
我在项目中遇到过一个问题:模型导出成功了,但加载时报错“无法解析protobuf”。查了半天,发现是Protobuf版本太老,ONNX opset不兼容。从那以后,我每次搭建环境都会先确认Protobuf版本。
核心关系:
- ONNX:模型定义与导出工具
- ONNX Runtime:跨平台推理引擎
- Protobuf:序列化协议,ONNX模型的底层依赖
2.2 安装前的准备
我个人习惯用Python 3.8-3.11之间的版本。太新的Python(比如3.12)有时候会遇到一些包还没适配的情况。建议用conda或者venv创建虚拟环境,别污染系统Python。
# 创建虚拟环境(推荐)
conda create -n onnx_env python=3.9
conda activate onnx_env
# 或者用 venv
python -m venv onnx_env
source onnx_env/bin/activate # Linux/Mac
# onnx_env\Scripts\activate # Windows
小提示:虚拟环境的名字随意,但我习惯用“onnx_env”,一看就知道是干嘛的。
2.3 安装Protobuf
先装Protobuf。为什么先装它?因为ONNX和ONNX Runtime都依赖它。顺序搞反了可能会出问题。
# 安装 Protobuf 编译器
pip install protobuf
# 验证安装
protoc --version
如果你看到类似 libprotoc 3.21.12 的输出,说明装好了。版本建议在3.20以上,我推荐3.21.x系列,比较稳定。
注意:我曾经在Windows上遇到过protoc命令找不到的情况。这是因为pip安装的protobuf只包含了Python库,没包含编译器。你需要单独下载protoc的二进制文件。去GitHub的protobuf releases页面下载对应系统的版本,解压后把路径加到环境变量里。
2.4 安装ONNX
接下来装ONNX核心库。这个简单,一行命令搞定:
pip install onnx
装完之后,咱们验证一下:
python -c "import onnx; print(onnx.__version__)"
正常会输出类似 1.15.0 的版本号。如果报错,多半是Protobuf版本不匹配。检查一下Protobuf版本,必要时升级:
pip install --upgrade protobuf
验证ONNX核心功能:
import onnx
import onnx.helper as helper
# 创建一个简单的模型
input = helper.make_tensor_value_info('input', onnx.TensorProto.FLOAT, [1, 3, 224, 224])
output = helper.make_tensor_value_info('output', onnx.TensorProto.FLOAT, [1, 1000])
node = helper.make_node('Relu', ['input'], ['output'])
graph = helper.make_graph([node], 'test_graph', [input], [output])
model = helper.make_model(graph)
# 检查模型
onnx.checker.check_model(model)
print("模型创建成功,验证通过!")
这段代码创建了一个最简单的ONNX模型——一个ReLU层。如果运行没报错,说明ONNX安装完全OK。
2.5 安装ONNX Runtime
ONNX Runtime是咱们真正用来跑模型的东西。安装也很直接:
pip install onnxruntime
如果你有NVIDIA GPU并且想用CUDA加速,装这个:
pip install onnxruntime-gpu
我的建议:刚开始学习时,先用CPU版本。等后面章节讲到性能优化时,再切到GPU版本。省得一开始就被CUDA版本问题搞晕。
验证安装:
python -c "import onnxruntime; print(onnxruntime.__version__)"
输出类似 1.17.0 就对了。咱们再跑个简单的推理测试:
import onnxruntime as ort
import numpy as np
# 创建一个简单的会话
session = ort.InferenceSession()
print("ONNX Runtime 会话创建成功!")
# 实际使用需要加载模型,这里只是验证安装
print(f"可用提供者: {ort.get_available_providers()}")
2.6 完整验证脚本
我习惯把验证步骤写成一个脚本,一键运行。这样以后换环境时也能快速确认:
"""
ONNX环境验证脚本
运行此脚本确认所有组件安装正确
"""
import sys
def check_installation():
print("=" * 50)
print("ONNX 环境验证")
print("=" * 50)
# 检查 Python 版本
print(f"\n[1] Python 版本: {sys.version}")
# 检查 Protobuf
try:
import google.protobuf
print(f"[2] Protobuf 版本: {google.protobuf.__version__}")
except ImportError:
print("[2] Protobuf 未安装!")
return False
# 检查 ONNX
try:
import onnx
print(f"[3] ONNX 版本: {onnx.__version__}")
# 创建并验证模型
import onnx.helper as helper
input = helper.make_tensor_value_info('x', onnx.TensorProto.FLOAT, [1, 10])
output = helper.make_tensor_value_info('y', onnx.TensorProto.FLOAT, [1, 5])
node = helper.make_node('Relu', ['x'], ['y'])
graph = helper.make_graph([node], 'test', [input], [output])
model = helper.make_model(graph)
onnx.checker.check_model(model)
print(" ONNX 模型创建与验证通过!")
except ImportError:
print("[3] ONNX 未安装!")
return False
# 检查 ONNX Runtime
try:
import onnxruntime
print(f"[4] ONNX Runtime 版本: {onnxruntime.__version__}")
print(f" 可用提供者: {onnxruntime.get_available_providers()}")
except ImportError:
print("[4] ONNX Runtime 未安装!")
return False
print("\n" + "=" * 50)
print("所有组件安装成功!环境准备就绪。")
print("=" * 50)
return True
if __name__ == "__main__":
check_installation()
2.7 常见问题与避坑指南
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ImportError: No module named 'onnx' | ONNX未安装或虚拟环境未激活 | 检查是否在正确的虚拟环境中,重新运行 pip install onnx |
| protoc: command not found | Protobuf编译器未安装或不在PATH中 | 下载protoc二进制文件并添加到PATH,或使用conda安装:conda install -c conda-forge protobuf |
| ONNX Runtime报错:DLL load failed | Windows下缺少VC++运行库 | 安装Microsoft Visual C++ Redistributable |
| ONNX版本与Protobuf不兼容 | Protobuf版本过旧或过新 | 固定Protobuf版本为3.21.x:pip install protobuf==3.21.12 |
我曾经踩过的坑:有一次在Ubuntu服务器上装ONNX Runtime GPU版本,死活装不上。折腾了两小时,最后发现是CUDA版本不匹配。ONNX Runtime 1.17需要CUDA 11.8,而我装的是12.0。所以,装GPU版本前一定先查官方文档的CUDA版本要求。
2.8 验证结果
运行上面的验证脚本,如果看到类似下面的输出,恭喜你,环境搭建成功了:
==================================================
ONNX 环境验证
==================================================
[1] Python 版本: 3.9.18
[2] Protobuf 版本: 3.21.12
[3] ONNX 版本: 1.15.0
ONNX 模型创建与验证通过!
[4] ONNX Runtime 版本: 1.17.0
可用提供者: ['CPUExecutionProvider']
==================================================
所有组件安装成功!环境准备就绪。
==================================================
好,环境搭好了。下一章咱们就开始玩真的——把PyTorch模型导出成ONNX格式。到时候你会发现,前面这些准备工作有多重要。