☰
ONNX_day2
2026/9/29 3:30:55 网站建设 项目流程

你已经完成了 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/activate
pip 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 模型能否跨操作系统、跨运行环境保持一致地执行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询