openFuyao NPU-Operator故障排查

💡 原文中文,约20300字,阅读约需49分钟。
📝

内容提要

openFuyao NPU-Operator中ascend-device-plugin容器反复CrashLoopBackOff,日志显示dcmi获取卡数量为0。排查发现宿主机可识别NPU卡,但容器内dcmi_get_card_list返回0。最终定位为非裸金属虚拟机场景,需在镜像中安装systemd并定制镜像,替换后节点可正常显示NPU资源。

🔎

延伸解读

故障现象与初步排查

ascend-device-plugin 容器反复 CrashLoopBackOff,日志显示 dcmi 获取卡数量为 0。宿主机可识别 NPU 卡,但容器内 dcmi_get_card_list 返回 0。检查容器内 /dev 目录可见 davinci0 等设备,驱动目录挂载正常,但 dcmi 初始化失败。

深入诊断与根因定位

通过编写测试程序,在宿主机和容器内分别运行,发现宿主机能获取卡列表,容器内返回空。进一步检查发现容器内缺少 systemd 及相关服务,导致 dcmi 无法正常初始化。最终确认是非裸金属虚拟机场景,需要定制镜像。

解决方案与镜像定制

根据官方文档,在虚拟机场景下部署 Ascend Device Plugin,需在镜像中安装 systemd。使用 nerdctl 构建新镜像,Dockerfile 中安装 systemd 并设置 STOPSIGNAL SIGRTMIN+3。替换镜像后,节点可正常显示 NPU 资源。

修复验证与注意事项

修复后,通过 kubectl describe node 可看到 huawei.com/Ascend310P 资源。注意:若容器内不运行 systemd 作为主进程,STOPSIGNAL 可省略;npu-operator 有同样问题,需同样修改。

Q&A

openFuyao NPU-Operator 中 ascend-device-plugin 容器为什么反复 CrashLoopBackOff?

因为容器内 dcmi_get_card_list 返回的卡数量为 0,导致 device plugin 初始化失败,容器不断重启。

在宿主机上能识别 NPU 卡,但容器内 dcmi 获取卡数量为 0,可能是什么原因?

可能是非裸金属虚拟机场景,容器内缺少 systemd 等必要组件,导致 dcmi 无法正确获取卡列表。

如何解决 openFuyao NPU-Operator 在虚拟机场景下 dcmi 获取卡数量为 0 的问题?

需要定制镜像,在 Dockerfile 中安装 systemd,然后替换原有镜像。具体步骤:基于原镜像,替换 apt 源,运行 apt-get update && apt-get install -y systemd systemd-sysv,设置 STOPSIGNAL SIGRTMIN+3,构建新镜像并替换。

在虚拟机场景下部署 Ascend Device Plugin 需要注意什么?

需要在 Ascend Device Plugin 的镜像中安装 systemd,推荐在 Dockerfile 中加入 RUN apt-get update && apt-get install -y systemd 命令。

如何验证 openFuyao NPU-Operator 故障修复成功?

在节点上执行 kubectl describe node,如果能看到 NPU 资源(如 huawei.com/Ascend310P)即表示修复成功。

npu-operator 是否也存在同样的问题?如何修改?

是的,npu-operator 有同样的问题,按照相同的方法修改镜像即可。

🏷️

标签

➡️

继续阅读