你已经完成了 Step 1:PyTorch → ONNX → ONNX Runtime,而且刚才测试结果:
PyTorch:\[\[-2.21811771.7639456\]\]ONNX Runtime:\[\[-2.21811771.7639456\]\]Maximum absolute difference:0.0Match: True这说明PyTorch → ONNX → ONNX Runtime这条链已经打通。
现在进入:
Step 2:ONNX → ONNX Runtime → Linux/x86
这一阶段的目标不是重新训练模型,而是理解以下流程:
我的Intel MacBook Air很适合用来学习这个过程,因为它本身就是x86_64。
Step 2.1:先确认你的 Mac 是 x86_64
Python 3.x.x
x86_64
Step 2.2:建立 Linux/x86 环境
我之前已经在 MacBook Air 上安装过 Ubuntu 22.04,所以我们直接使用它。
进入 Ubuntu:
uname -a
确认:
x86_64
然后:
python3 --version
Step 2.3:创建 ONNX Runtime Linux 环境
在 Ubuntu 中:
mkdir -p ~/onnx_demo
cd ~/onnx_demo
创建 virtual environment:
python3 -m venv .venv
激活:
source .venv/bin/activate
升级 pip:
python -m pip install --upgrade pip
安装 ONNX Runtime:
pip install onnx onnxruntime numpy
检查:
python -c “import onnxruntime as ort; print(ort._version_)”
例如:
1.x.x
Step 2.4:把 Step 1 的 model.onnx 放到 Linux
假设你 Step 1 的目录是:
pytorch_onnx_demo/
├── .venv/
├── model.py
├── export_onnx.py
├── test_onnx.py
└── model.onnx
现在 Linux 需要:
onnx_demo/
├── .venv/
├── model.onnx
└── test_onnx.py
你可以直接通过共享目录、scp、U 盘等方式把:
model.onnx
复制过去。
例如,如果 Ubuntu 可以访问 Mac:
scp model.onnx user@ubuntu-ip:~/onnx_demo/
如果你使用的是 VirtualBox,也可以通过共享文件夹。
Step 2.5:Linux 上写一个最简单的 ONNX Runtime 程序
创建:
nano test_onnx_linux.py
内容:
importonnxruntimeasortimportnumpyasnp session=ort.InferenceSession("model.onnx")input_meta=session.get_inputs()\[0\]print("Input name :",input_meta.name)print("Input shape:",input_meta.shape)print("Input type :",input_meta.type)# Model expects \[1, 4\]x=np.array(\[\[1.0,2.0,3.0,4.0\]\],dtype=np.float32)outputs=session.run(None,{input_meta.name:x})print("Input :",x)print("Output:",outputs)运行:
python test_onnx_linux.py你应该看到类似:
Input name : input Input shape: \[1,4\]Inputtype: tensor(float)Input : \[\[1.2.3.4.\]\]Step 2.5.1:常见错误与排查
在 Linux 上运行 ONNX Runtime 时,你可能会遇到下面几类典型问题。这里给出具体的报错示例和解决方法,方便你对照排查。
错误 1:模型文件路径错误
如果你在运行python test_onnx_linux.py时看到:
FileNotFoundError: [Errno 2] No such file or directory: 'model.onnx'这说明程序找不到model.onnx。最常见的原因是当前工作目录不对,或者文件没有复制到预期位置。
先确认文件确实存在:
ls-l~/onnx_demo/model.onnx再确认你当前所在的目录:
pwd如果不在~/onnx_demo下,先进入该目录再运行:
cd~/onnx_demo python test_onnx_linux.py如果你把模型放在了其他路径,也可以在代码里改用绝对路径:
session=ort.InferenceSession("/home/yourname/onnx_demo/model.onnx")错误 2:依赖缺失或版本不匹配
如果你看到:
ModuleNotFoundError: No module named 'onnxruntime'说明 ONNX Runtime 没有安装成功,或者你激活的虚拟环境不对。先确认虚拟环境已激活(命令行前面应该有(.venv)前缀):
source.venv/bin/activate然后重新安装:
pipinstallonnx onnxruntime numpy如果安装后仍然报错,可以检查当前环境里实际安装的版本:
pip show onnxruntime python-c"import onnxruntime as ort; print(ort.__version__)"错误 3:输入 shape 不匹配
如果你看到:
ValueError: Got invalid dimensions for input: input for input: [1, 4], got [4]这说明你喂给模型的输入维度不对。Step 1 导出的模型期望输入是[1, 4],也就是一个 batch、4 个特征。如果你写成:
x=np.array([1.0,2.0,3.0,4.0],dtype=np.float32)# 少了外层 []就会报错。正确写法是:
x=np.array([[1.0,2.0,3.0,4.0]],dtype=np.float32)# 形状 [1, 4]如果不确定模型期望的输入形状,可以在代码里先打印出来:
print("Input shape:",input_meta.shape)错误 4:provider 不可用
如果你执行:
python-c"import onnxruntime as ort; print(ort.get_available_providers())"只看到:
['CPUExecutionProvider']这是正常的。在纯 CPU 的 Linux 环境里,ONNX Runtime 默认只提供 CPU 执行器。如果你尝试强制指定 CUDA 而机器上没有 GPU,会看到类似:
ValueError: No available providers found for: ['CUDAExecutionProvider']解决方法:不要强制指定 CUDA,让 ONNX Runtime 自动选择可用 provider:
session=ort.InferenceSession("model.onnx")# 自动选择 CPUExecutionProvider或者显式指定 CPU:
session=ort.InferenceSession("model.onnx",providers=["CPUExecutionProvider"])错误 5:模型文件损坏或版本不兼容
如果你看到:
onnxruntime.capi.onnxruntime_pybind11_state.InvalidProtobuf: [ONNXRuntimeError] : 1 : FAIL : Load model from model.onnx failed:Protobuf parsing failed.说明model.onnx文件可能损坏,或者是在传输过程中没有完整复制。重新从 Mac 复制一次,并对比文件大小:
ls-lmodel.onnx在 Mac 上同样执行ls -l model.onnx,确认两边文件大小一致。如果文件很小(比如只有几 KB),很可能是复制不完整,重新用 scp 或共享文件夹复制。
排查小技巧
如果上面的方法都没解决,可以在代码里加一行打印,确认 ONNX Runtime 是否成功加载了模型:
importonnxruntimeasortprint("ONNX Runtime version:",ort.__version__)print("Available providers:",ort.get_available_providers())session=ort.InferenceSession("model.onnx")print("Model loaded successfully")这样你能快速定位问题出在「环境」还是「模型文件」上。
Output: [array([[-2.2181177, 1.7639456]], dtype=float32)]
Step 2.6:最重要的一步——验证 Linux 和 Mac 的结果一致
现在你实际上拥有:
我们希望:
output A ≈ output B
例如:
macOS: \[\[-2.2181177 1.7639456\]\]Linux: \[\[-2.2181177 1.7639456\]\]这一步非常重要,因为你开始真正理解ONNX 的意义:
模型不再绑定 PyTorch。
PyTorch 负责:
训练
↓
导出
↓
ONNX
之后 Linux 程序甚至不需要 PyTorch:
model.onnx
↓
ONNX Runtime
↓
CPU inference
Step 2.7:检查 ONNX Runtime 到底使用了什么 CPU
Linux 中执行:
python -c “import onnxruntime as ort; print(ort.get_available_providers())”
通常会看到:
[‘CPUExecutionProvider’]
然后:
lscpu # for Ubuntu
可以看到 CPU 信息。
这时候你可以把整个流程理解为:
Step 2.8:为什么这一步对你后面的 TinyML 很重要?
你现在的学习路线其实已经逐渐形成:
也就是说:
ONNX Runtime
主要让你理解:
ONNX model ↓ Runtime ↓ CPU而你已经学过的TFLite Micro是:
TFLite model ↓ TFLM ↓ MCU这两个概念非常类似。
Step 2.9:验证 ONNX 的跨平台特性
你现在实际只需要执行 4 条命令
进入 Ubuntu:
mkdir-p ~/onnx_demo cd ~/onnx_demo python3-m venv.venv source.venv/bin/activatepip install onnx onnxruntime numpy然后把Step 1 的 model.onnx放进:
~/onnx_demo/model.onnx最后运行:
python test_onnx_linux.py比较:
macOS result
≈
Linux result
这样你就真正理解了:
ONNX = 跨平台模型交换格式
而:
ONNX Runtime = 在不同平台执行 ONNX 模型的运行时。
最后,你现在可以把 Step 2 的目标记成一句话:
macOS x86_64 是「开发验证」,Linux x86_64 是「部署验证」;真正要验证的是同一个 ONNX 模型能否跨操作系统、跨运行环境保持一致地执行。