NPU故障处理
在Kubernetes环境中,NPU资源的管理链路涉及插件安装、驱动初始化、设备发现、kubelet注册等多个环节,任一环节异常都可能导致NPU资源不可用。本文将介绍CCE集群中NPU常见的故障场景、排查流程及对应解决方案,以便您快速定位故障原因,最大限度减少宕机时间,保障业务连续性。
前提条件
- 集群中已安装CCE AI套件(NPU)插件。
- 适用NPU型号:Ascend 910 / 910B / 910B3、Ascend 310 / 310P系列。
- 已具备CCE集群管理员权限。
- 已获取目标节点的SSH登录权限。
昇腾驱动未就绪
现象描述
节点管理界面显示“昇腾驱动未就绪”,表示该Kubernetes节点上检测到有NPU硬件,但节点资源状态中未发现足量的huawei.com/ascend-1980(或huawei.com/ascend-310)资源。可能的原因涉及插件安装、NPU驱动、设备文件发现、kubelet注册等多个环节,建议按以下顺序逐一排查。
若仍无法解决,请提交工单处理。
排查步骤
- 检查AI套件(NPU)插件状态。
- 检查Device Plugin Pod状态。
CCE AI套件(Ascend NPU)插件以DaemonSet方式部署,每个有NPU硬件的节点上应运行一个Device PluginPod。
- 查找Device Plugin Pod。
# 替换 <namespace> 为实际命名空间(通常为 kube-system) kubectl get pods -n kube-system -o wide | grep npu
预期输出类似:
huawei-npu-device-plugin-xxxxx 1/1 Running 0 2d 10.x.x.x node-name <none> <none>
- 检查目标节点上的Pod状态。
# 替换 <node-name> 为显示"昇腾驱动未就绪"的节点名 kubectl get pods -n kube-system --field-selector spec.nodeName=<node-name> | grep npu
可能的状态及含义:
- 如果Pod不存在或Pending。
- 检查DaemonSet是否被调度。
kubectl get daemonset -n kube-system | grep npu kubectl describe daemonset <npu-daemonset-name> -n kube-system
- 检查节点是否满足调度条件。
# 查看节点标签 kubectl get node <node-name> --show-labels # 查看节点污点 kubectl describe node <node-name> | grep -A5 Taints
- 检查DaemonSet是否被调度。
- 查找Device Plugin Pod。
- 检查Device Plugin Pod日志。
# 查看当前日志 kubectl logs <npu-device-plugin-pod-name> -n kube-system # 查看上一次崩溃的日志 kubectl logs <npu-device-plugin-pod-name> -n kube-system --previous
关键日志信息对照表:
日志关键字
含义
排查步骤
wait device init failed
等待NPU设备初始化超时
init devmanager failed
DCMI库初始化失败(驱动通信异常)
get device list failed / GetDeviceList
无法从驱动获取设备列表
default device: xxx is missing
NPU基础设备文件缺失
set all device and type failed
设备发现失败
init plugin server failed
插件服务初始化失败
update node label failed
更新节点标签失败(K8s API异常)
Could not contact Kubelet / register to kubelet fail
向kubelet注册失败
socket path verify failed
kubelet device-plugin socket路径不可用
failed to get node allocatable
healthz外部检查无法获取节点资源
resource xxx not registered on node
healthz检查到资源未注册
ListAndWatch not serving
gRPC ListAndWatch未运行
scanned N devices but reported 0
扫描到设备但未上报
- 检查NPU驱动状态。
- 登录到目标节点。
ssh root@<node-ip>
- 检查NPU驱动是否已安装。
# 检查驱动版本 npu-smi info
预期输出(正常情况):
+--------------------------------------------------------------------------------+ | npu-smi 24.1.0 Version: 24.1.0 | +----------------------+-----------------+---------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages| | Chip | Bus-Id | AICore(%) Memory-Usage(MB) | +======================+=================+=======================================+ | 0 910B3 | OK | 65.5 42 0/0 | | 0 | 0000:C1:00.0 | 0 0/0 | +======================+=================+=======================================+ ...
异常情况:
输出
含义
处理方式
command not found
驱动未安装
安装对应型号的昇腾NPU驱动
DCMI API failed
驱动异常或未完全初始化
重启节点或重新加载驱动
卡片显示但状态为 Abnormal / Fault
硬件故障
联系硬件运维
卡片数量少于预期
部分卡未识别
检查PCIe连接
- 检查驱动内核模块是否加载。
# 查看 NPU 相关内核模块 lsmod | grep drv_pcidrv lsmod | grep drv_davinci
如果未加载,尝试手动加载:
modprobe drv_pcidrv modprobe drv_davinci
如果加载失败,检查dmesg获取更多信息:
dmesg | grep -i "davinci\|npu\|ascend" | tail -50
- 检查设备拓扑(WaitDevicesInit阶段检查的内容)
npu-smi info -t topo
如果npu-smi 输出数量不足,说明驱动已加载但HDK(Huawei Driver Kit)未完成初始化。这种情况通常发生在节点刚重启后,驱动需要20-30秒完成初始化。如果等待超过1分钟仍未就绪,考虑驱动问题或硬件故障。
- 登录到目标节点。
- 检查NPU设备文件。
Device Plugin启动时会检查必要的NPU设备文件是否存在。
- 检查基础设备文件。
# 必须存在的设备文件 ls -la /dev/davinci_manager ls -la /dev/hisi_hdc # 可选设备文件(部分型号存在) ls -la /dev/devmm_svm # NPU卡设备文件 ls -la /dev/davinci*
预期输出:
crw------- 1 root root 234, 0 ... /dev/davinci0 crw------- 1 root root 234, 1 ... /dev/davinci1 crw------- 1 root root 234, 0 ... /dev/davinci_manager crw------- 1 root root 234, 0 ... /dev/hisi_hdc
异常情况:
- 检查设备文件权限。
- 检查基础设备文件。
- 检查kubelet设备插件注册。
- 检查kubelet device-plugin socket。
# 检查kubelet device-plugin目录 ls -la /var/lib/kubelet/device-plugins/
预期看到kubelet.sock文件和Device Plugin注册的socket文件(如Ascend910.sock或ascend910.sock)。
如果kubelet.sock不存在,说明kubelet的device plugin功能未启用。检查kubelet配置:
# 检查kubelet启动参数 ps aux | grep kubelet | grep -i "feature-gates" # 或检查kubelet配置文件 cat /var/lib/kubelet/config.yaml | grep -i feature
确保DevicePlugins feature gate已启用(Kubernetes 1.10+默认启用)。
- 检查Device Plugin注册的socket。
ls -la /var/lib/kubelet/device-plugins/ | grep -i ascend
应该看到类似Ascend910.sock的文件。如果没有:
- Device Plugin Pod可能在启动过程中崩溃(回到步骤3查看日志)。
- Device Plugin容器可能没有挂载/var/lib/kubelet/device-plugins目录。
- 检查节点资源是否注册成功。
# 查看节点上的NPU资源 kubectl describe node {节点名称} | grep -i ascend预期输出:
huawei.com/ascend-1980: 8
如果资源容量为0或不显示,但Device Plugin Pod正在运行,可能是:
- Device Plugin注册后又被kubelet移除(socket被删除)。
- Device Plugin在ListAndWatch阶段未正确上报设备。
- 查看kubelet日志。
# 查看kubelet关于device-plugin的日志 journalctl -u kubelet | grep -i "device\|plugin\|ascend\|npu" | tail -30
关键字与含义如下:
- failed to register device plugin:Device Plugin注册失败。
- device plugin unhealthy:Device Plugin被判定为不健康。
- reregistered:Device Plugin重新注册成功。
- 检查kubelet device-plugin socket。
常见问题
- 节点重启后短暂显示“昇腾驱动未就绪”
- 问题现象:节点重启后,界面短暂显示"昇腾驱动未就绪",几分钟后自动恢复。
- 问题根因:NPU驱动的HDK初始化需要20-30秒,Device Plugin会在此期间等待设备就绪(WaitDevicesInit)。等待完成后Device Plugin正常注册资源,界面恢复正常。
- 解决方案:这是正常的启动过程,无需手动干预。如果超过5分钟仍未恢复,按上述步骤排查。
- NPU驱动未安装
- 问题现象:节点上npu-smi info命令不存在。
- 问题根因:节点未安装昇腾NPU驱动。
- 解决方案:
- 确认节点硬件型号(910A/910B/910B3/310/310P)。
- 安装对应型号的昇腾NPU驱动和固件。
- 重启节点使驱动生效。
- 确认npu-smi info和ls /dev/davinci*正常后,重启Device Plugin Pod。
- Device Plugin Pod反复重启(CrashLoopBackOff)
- 问题现象:Device Plugin Pod反复重启,状态为CrashLoopBackOff。
- 问题根因:常见崩溃原因包括NPU驱动未安装或异常、设备文件不存在、参数配置错误、DCMI库初始化失败(驱动版本不兼容)等。
- 解决方案:
- 使用kubectl logs {pod名称} --previous查看上一次崩溃的日志。
- 根据日志中的错误信息,定位到对应的排查步骤。
- 按步骤4检查驱动、步骤5检查设备文件,或检查ConfigMap中的配置。
- Device Plugin注册成功但资源数量不正确
- 问题现象:节点上有8张NPU卡,但huawei.com/ascend-1980资源数量少于8。
- 问题根因:部分卡处于故障状态被Device Plugin标记为Unhealthy,其资源不会被上报。
- 解决方案:
- 检查npu-smi info确认所有卡都处于健康状态。
- 检查Device Plugin日志中是否有invalid device num错误。
- 检查是否有卡处于故障状态。
- 修复故障卡后重启Device Plugin Pod。
- healthz检查导致Device Plugin反复重启
- 问题现象:Device Plugin Pod在运行一段时间后被重启,日志显示healthz失败。
- 问题根因:healthz检查分为内部检查和外部检查,失败原因不同。
- 解决方案:
- 查看healthz diagnose输出确认具体失败的检查项。
- 内部检查失败(ListAndWatch not serving)通常是gRPC连接问题。
- 外部检查失败(resource not registered)通常是kubelet尚未完成资源更新。
- 如果是热复位过程中healthz失败,属于预期行为,复位完成后会恢复。