ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ONNX_day2

ONNX_day2 你已经完成了 Step 1PyTorch → ONNX → ONNX Runtime而且刚才测试结果PyTorch:\[\[-2.21811771.7639456\]\]ONNX Runtime:\[\[-2.21811771.7639456\]\]Maximum absolute difference:0.0Match: True这说明PyTorch → ONNX → ONNX Runtime这条链已经打通。现在进入Step 2ONNX → ONNX Runtime → Linux/x86这一阶段的目标不是重新训练模型而是理解以下流程我的Intel MacBook Air很适合用来学习这个过程因为它本身就是x86_64。Step 2.1先确认你的 Mac 是 x86_64Python 3.x.xx86_64Step 2.2建立 Linux/x86 环境我之前已经在 MacBook Air 上安装过 Ubuntu 22.04所以我们直接使用它。进入 Ubuntuuname -a确认x86_64然后python3 --versionStep 2.3创建 ONNX Runtime Linux 环境在 Ubuntu 中mkdir -p ~/onnx_democd ~/onnx_demo创建 virtual environmentpython3 -m venv .venv激活source .venv/bin/activate升级 pippython -m pip install --upgrade pip安装 ONNX Runtimepip install onnx onnxruntime numpy检查python -c “import onnxruntime as ort; print(ort._version_)”例如1.x.xStep 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 可以访问 Macscp model.onnx userubuntu-ip:~/onnx_demo/如果你使用的是 VirtualBox也可以通过共享文件夹。Step 2.5Linux 上写一个最简单的 ONNX Runtime 程序创建nano test_onnx_linux.py内容importonnxruntimeasortimportnumpyasnp sessionort.InferenceSession(model.onnx)input_metasession.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\]xnp.array(\[\[1.0,2.0,3.0,4.0\]\],dtypenp.float32)outputssession.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如果你把模型放在了其他路径也可以在代码里改用绝对路径sessionort.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-cimport 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 个特征。如果你写成xnp.array([1.0,2.0,3.0,4.0],dtypenp.float32)# 少了外层 []就会报错。正确写法是xnp.array([[1.0,2.0,3.0,4.0]],dtypenp.float32)# 形状 [1, 4]如果不确定模型期望的输入形状可以在代码里先打印出来print(Input shape:,input_meta.shape)错误 4provider 不可用如果你执行python-cimport 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 自动选择可用 providersessionort.InferenceSession(model.onnx)# 自动选择 CPUExecutionProvider或者显式指定 CPUsessionort.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())sessionort.InferenceSession(model.onnx)print(Model loaded successfully)这样你能快速定位问题出在「环境」还是「模型文件」上。Output: [array([[-2.2181177, 1.7639456]], dtypefloat32)]Step 2.6最重要的一步——验证 Linux 和 Mac 的结果一致现在你实际上拥有我们希望output A ≈ output B例如macOS: \[\[-2.2181177 1.7639456\]\]Linux: \[\[-2.2181177 1.7639456\]\]这一步非常重要因为你开始真正理解ONNX 的意义模型不再绑定 PyTorch。PyTorch 负责训练↓导出↓ONNX之后 Linux 程序甚至不需要 PyTorchmodel.onnx↓ONNX Runtime↓CPU inferenceStep 2.7检查 ONNX Runtime 到底使用了什么 CPULinux 中执行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 条命令进入 Ubuntumkdir-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 模型能否跨操作系统、跨运行环境保持一致地执行。
返回列表