概述
本文记录了一次在运行 ZimaOS(内核 6.18.9)的主机上,尝试在 AMD Ryzen AI MAX+ 395 处理器的 NPU 上运行小模型的完整过程:从启用 XDNA2 NPU、在驱动层验证,到逐一尝试现实可行的推理路径。结果能清晰地展示这颗 NPU 在 Linux 上目前能做什么、不能做什么,以及为什么。
结论先行
AMD XDNA2 NPU 在 Linux 上的推理软件栈未达工程验证(EVT)门槛,暂不能作为可用的生产环境。阻塞全部来自 AMD 在 Linux 侧的软件成熟度,与硬件本身无关。
| 维度 | 判断 | 一句话依据 |
|---|---|---|
| NPU 硬件 | 成熟 | 量产 IP,本机正常识别、可计算 |
| Windows 侧软件栈 | 成熟 | 官方 ONNX EP / whisper.cpp 均可用 |
| Linux 侧软件栈 | 未达 EVT | 驱动、固件、运行时版本三连环断裂,官方框架缺位 |
| 本机实测上限 | 启用 + 可编程 + 执行算子 + 真模型 prefill | 完整模型生成被驱动版本锁死 |
NPU 在 Windows 上是产品,在 Linux 上是开发者实验场。生产选型应使用 iGPU/GPU(ROCm/Vulkan)承担 AI 推理;NPU 路线应标记为“待 AMD Linux 栈成熟后重新评估”。目前虽然能成功调用计算驱动并执行算子,但驱动、固件和运行时之间的版本断裂,加上官方框架缺位,让它在 Linux 下并不能作为一个完整可用的产品。
测试环境
- 处理器:AMD Ryzen AI MAX+ 395(Strix Halo),XDNA2 NPU,标称 50 TOPS
- 平台:ZimaOS 1.7 及以上版本,内核 6.18.9
- NPU 的 PCI 设备 ID:
0x1022:0x17f0
目标:在这台机器的 NPU 上跑一个小模型。
检测与启用
检测:lspci 确认存在 XDNA2 NPU。内核 amdxdna 驱动模块已加载,但 /dev/accel/accel0 未生成——因为缺固件。驱动要求 amdnpu/17f0_11/npu.sbin,全盘找不到。
启用:自编译 XRT 2.21.75。Ubuntu 仓库只有 2.13 旧版,因此走源码构建,用容器解决。踩掉两个坑后识别成功:
$ xrt-smi examine |
有两个坑。
- 容器必须加
--ulimit memlock=-1(默认 8MB 会导致设备映射失败)。 - 需宿主预留 hugepages,并挂载
/dev/hugepages。宿主固件由 ZimaOS 的zimaos-driver管理(/opt/zimaos/drivers/firmware/)。
底层验证
pyxrt 可编程访问:
$ python3 verify_pyxrt.py |
IRON/axpy 算子执行(mlir-aie 1.4.2,160 个测试全过):
$ python -m pytest test.py -x -q |
NPU 完全启用、可编程调用、真实执行 AIE 算子。这是本机 NPU 能力的基线。
尝试一:官方 ONNX Runtime EP —— Linux 未启用
调研(AMD 官方文档 + 官方 issue 现状):
- onnxruntime 官方文档:VitisAI EP 标注 “Ryzen AI Linux support is not enabled in this release”,AMD64 上仅 Windows 可用。
- AMD 官方 issue #319/#333/#341 全部处于 OPEN 且无回应(缺
voe模块 / 缺onnxruntime_providers_ryzenai.so)。 - AMD Ryzen AI 1.8 release notes:该版本 Linux 上不支持 model generation。
结论:官方推理框架路径在 Linux x86_64 上不存在,排除。
尝试二:FastFlowLM —— 被固件/驱动协议锁死
镜像构建成功(463MB)+ Llama-3.2-1B-NPU2 下载成功,但推理即中止:
$ flm run llama3.2:1b |
validate 给出精确原因(固件与驱动版本双重不达标):
$ fastflowlm validate -j |
读其源码 main.cpp 确认硬性要求:固件必须 ≥ 1.1.0.0;amdxdna 设备的 DRM 版本必须 ≥ 0.6(主线驱动报告为 0.1)。
固件升级实验:协议 7 固件需要协议 7 驱动,闭环断裂
从 GitLab kernel-firmware/drm-firmware 的 amd-ipu-staging 分支找到新固件 npu.sbin.1.1.2.65(内置 “Release 1.1.2.65”,≥ 1.1.0.0)。装上升级后 probe 失败:
$ dmesg | grep -iE "amdxdna.*protocol" |
读主线内核源码 aie2_check_protocol:固件的 protocol major 必须等于驱动的 protocol_major。主线 6.18.9 驱动(npu5)协议 = 6.12;1.1.2.65 固件 = 协议 7 → 不兼容。已回滚,XRT/pyxrt 环境完好。
关键发现:驱动协议版本演进断裂——新固件(协议 7)需要新驱动(协议 7),而新驱动需要的协议 7 支持尚未进入任何稳定内核。查内核源码确认协议 7 支持只存在于未发布的 master(未来的 6.20/7.0);6.18/6.19 稳定版均没有。
尝试三:树外驱动 —— ZimaOS 自定义内核加载不了
为获得协议 7 驱动,从 kernel.org 编出主线 6.18.9 头文件树,编译 xdna-driver 上游的 amdxdna.ko(vermagic 精确匹配),加载:
$ insmod amdxdna.ko |
根因:ZimaOS 内核是 Buildroot 定制构建,其 drm_shmem_helper 与主线 6.18.9 源码不一致,AMD 官方树外驱动的 ABI 对不上。已回滚。至此 FastFlowLM 路线彻底关闭(固件→驱动→内核三连环断裂)。
尝试四:IRON Llama —— prefill 突破 + decode 最终墙
换路线:使用 mlir-aie/IRON 近金属工具链,它不依赖 FastFlowLM 或协议 7。从 amd/IRON 仓库搭环境(mlir_aie 1.4.2.dev16 + torch CPU + 算子依赖),模型经 ModelScope 下载,免去 HF token。
编译:全部 AIE 算子(RMSNorm/GEMM/GEMV/RoPE/Softmax/FFN)编译成功。
prefill 成功(完整 transformer 前向在 NPU 上执行,正确生成首个 token):
$ python llama_npu.py model.safetensors tokenizer.model --num-tokens 1 --prompt-len 13 |
decode 失败(连续生成被两层卡住):
① 先缺 XRT API(2.21.75):
AttributeError: 'pyxrt.run' object has no attribute 'get_ctrl_scratchpad_bo' |
② 自编 pyxrt 2.26 模块(从 fastflowlm 镜像抽取 XRT 2.26 libs + 对 xdna-driver 源码定向编译,已验证与主线驱动兼容:get_ctrl_scratchpad_bo: True,设备/BO 通信通过)后,fused 内核执行仍失败:
RuntimeError: DRM_IOCTL_AMDXDNA_EXEC_CMD IOCTL failed (err=-22): Invalid argument |
读驱动源码 amdxdna_ctx.c:提交要求 hwctx 状态为 READY;decode 的 fused 内核经 ELF 加载 hwctx,这是一条新路径,主线 6.18.9 驱动无法让其达到 READY。
结论:prefill(真模型前向)在 NPU 上达成;decode(完整生成)被驱动版本锁死——与 FastFlowLM 是同一堵墙。
技术栈分层分析
| 层 | 成熟度 | 关键结论 | 对应证据 |
|---|---|---|---|
| 硬件层(XDNA2) | 成熟 | 量产 IP,8 列正常识别、可计算 | 检测与启用 |
| 内核驱动层(amdxdna) | 有限 | 协议 6.12 可用;协议 7 不进稳定内核;树外驱动加载不了 | 检测 / 固件升级实验 / 树外驱动 |
| 固件层 | 有限 | 1.0.x 绑定协议 6、1.1.x 绑定协议 7;新固件需新驱动 | 固件升级实验 |
| 用户态运行时(XRT) | 有限 | 2.21 与 2.26 版本割裂;新 API 依赖新版本 | IRON Llama |
| 推理框架层 | 未就绪 | 官方 EP 在 Linux 未启用;FastFlowLM 依赖版本巧合;IRON 近金属、非端到端 | 尝试一/二/四 |
| 模型格式层 | 有限 | 无通用格式或部署管线,各家专有编译链 | 尝试二/四 |
| 系统集成层 | 有限 | 发行版绑定严重;ZimaOS 定制内核 + 只读 /lib/modules 锁死升级 | 检测 / 树外驱动 |
阻塞点与根因归纳
- 协议死锁:新固件(协议 7)、新驱动(协议 7)、稳定内核(不支持协议 7)三者不闭环。
- 官方框架缺位:onnxruntime VitisAI EP 在 Linux x86_64 明确未启用,官方 issue 长期无回应、无路线图。
- 发行版绑定:ZimaOS 定制内核的 DRM 层与主线不一致,连 AMD 官方树外驱动都加载不了。
- 生态割裂:无标准模型格式或部署管线,模型编译依赖各家专有工具链。
- 调试体验:报错(EINVAL、协议不匹配、hwctx not ready)没有官方排障路径,全靠社区摸索。
平台成熟度对比
| 维度 | Windows | Linux(当前) |
|---|---|---|
| 官方 ONNX EP | 可用 | 未启用 |
| NPU 推理框架(whisper.cpp 等) | 可用 | “planned” |
| 驱动/固件版本管理 | 厂商统一 | 各发行版割裂 |
| 生产可用性 | 可用 | 未达工程验证 |
结论与决策建议
技术结论:NPU 硬件成熟、Windows 侧软件栈成熟。Linux 侧软件栈(驱动协议演进、官方框架、版本管理)处于开发阶段,未达工程验证。本机实测上限为:启用 + 可编程 + 执行算子 + 真模型 prefill;完整模型生成不可行。阻塞是软件问题(非硬件),理论上会随 AMD Linux 栈成熟而解除。
决策建议:
- 生产选型:Linux 上不要依赖 NPU 推理;用 iGPU/GPU(ROCm/Vulkan)承担 AI 推理——本机 llama.cpp + Vulkan 已在跑 14B~35B 模型。
- NPU 路线:标记“待 AMD Linux 栈成熟后重新评估”。
- 若坚持 NPU:仅适合原型或低功耗边缘验证,需要专家级 IRON 开发,不是生产路径。
- 技术储备:本次环境(IRON、pyxrt 2.26、模型、内核头文件树)已存档,内核升级后可快速重试。
观察点(解锁条件):
- 稳定内核(≥6.20/7.0)含协议 7 的 amdxdna
- AMD 发布 Linux 版 onnxruntime-vitisai / voe wheel
- ZimaOS 升级内核(届时 FastFlowLM / IRON decode 可能直接可用)
- whisper.cpp NPU 卸载支持 Linux
附录:实测资产清单(供内核升级后复用)
| 资产 | 位置 |
|---|---|
| IRON 环境(mlir_aie 1.4.2.dev16 + torch) | 容器 npu-dev,/work/ironenv2/ |
| 自编 pyxrt 2.26 | /work/pyxrt_build/build/ |
| XRT 2.26 libs(隔离) | /work/xrt226/ |
| Llama-3.2-1B 模型 | /DATA/npu-dev/llama-3.2-1b/ |
| 内核头文件树 | /DATA/npu-dev/kernel-src/ |
| FastFlowLM 镜像 + 模型缓存 | /DATA/npu-dev/fastflowlm/、/DATA/npu-dev/flm-cache/ |
| 固件/驱动备份与回滚脚本 | /DATA/npu-dev/fw-backup/ |