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初始化失败。这表明问题可能出在容器环境与宿主机的差异上。

深入诊断与根因定位

通过编写测试程序,在宿主机和容器内分别运行dcmi_get_card_list,宿主机返回卡列表,容器内返回空。进一步检查发现容器内缺少systemd相关服务,且日志显示dcmi board init成功但device_count=1,而get_card_list却为0。最终定位为非裸金属虚拟机场景,需在镜像中安装systemd定制镜像。

解决方案与验证

根据官方文档,在虚拟机场景下部署Ascend Device Plugin,需在镜像中安装systemd。通过修改Dockerfile,安装systemd并设置STOPSIGNAL,重新构建镜像并替换。替换后节点成功识别NPU资源,kubectl describe node显示huawei.com/Ascend310P资源。npu-operator有同样问题,可同样修改。

Q&A

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

容器内 dcmi_get_card_list 返回卡数量为 0,导致 device plugin 初始化失败,从而反复崩溃重启。

如何排查 ascend-device-plugin 容器内 NPU 卡识别问题?

可以进入容器执行 ls /dev 查看设备节点,检查 /usr/local/Ascend/driver 驱动挂载,查看容器日志中 dcmi 相关错误,并运行测试程序验证 dcmi_get_card_list 返回值。

非裸金属虚拟机场景下部署 Ascend Device Plugin 需要注意什么?

需要在镜像中安装 systemd,推荐在 Dockerfile 中加入 RUN apt-get update && apt-get install -y systemd 命令,并重新构建镜像替换原有镜像。

如何为 openFuyao NPU-Operator 构建包含 systemd 的定制镜像?

使用 nerdctl 构建,Dockerfile 基于原镜像,替换 apt 源,安装 systemd 和 systemd-sysv,设置 STOPSIGNAL SIGRTMIN+3,然后执行 nerdctl build 命令生成新镜像。

修复后如何确认 NPU 资源已被节点识别?

在节点上执行 kubectl describe node,查看 Capacity 和 Allocatable 中是否出现 huawei.com/Ascend310P 等 NPU 资源。

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

是的,npu-operator 有同样的问题,解决方法相同:构建包含 systemd 的定制镜像并替换原有镜像。

🏷️

标签

➡️

继续阅读