在使用GPU的过程中,触发Xid Kubernetes GPU调度时, 会出现节点上可用GPU数目少于实际GPU数目的情况。本文主要介绍如何收集与诊断此类问题。
请根据如下操作步骤,下载并运行诊断脚本,然后根据生成报告确认问题根源,最后请保存好日志文件。
在Master节点上使用如下命令下载诊断脚本。
curl -o /usr/local/bin/diagnose_gpu.sh http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/diagnose/diagnose_gpu.sh
chmod +x /usr/local/bin/diagnose_gpu.sh
当下载完成后,执行如下命令查看脚本使用方法。
diagnose_gpu.sh -h
该命令返回的帮助信息如下所示。
Usage: diagnose_gpu.sh [ OPTION ]
--nodes NODE_IP_LIST give the IP of node to be diagnosed,eg: --nodes 192.168.1.1,192.168.1.2
-h, --help print the help information.
脚本可以带一个命令行参数运行,即“--nodes”,对应的参数值为需要诊断的GPU节点。例如要检查IP地址为192.168.1.1和192.168.1.2两个GPU节点,可以使用如下命令。
diagnose_gpu.sh --nodes 192.168.1.1,192.168.1.2
如果需要检查所有GPU节点,直接运行命令即可。
diagnose_gpu.sh
脚本运行完成后,会在终端打印一个简单的报告,格式类似如下。
================================================ Report ========================================
NODE NAME: cn-XXX.10.X.X.60
NODE IP: 10.X.X.60
DEVICE PLUGIN POD NAME: nvidia-device-plugin-cn-XXX.10.X.X.60
DEVICE PLUGIN POD STATUS: Running
NVIDIA VERSION:
NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A
COMMON XID ERRORS:
not found Xid errors.
--------------------------------------------------------------------------------------------
NODE NAME: cn-XXX.10.X.X.61
NODE IP: 10.X.X.61
DEVICE PLUGIN POD NAME: nvidia-device-plugin-cn-XXX.10.X.X.61
DEVICE PLUGIN POD STATUS: Running
NVIDIA VERSION:
NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A
COMMON XID ERRORS:
store xid errors to /root/diagnose_gpu_1573439265.tar.gz
--------------------------------------------------------------------------------------------
================================================ End ========================================
在上面的报告中,对两个GPU节点进行了检查,每个节点都会显示如下六个信息。
当运行完检测脚本后,在终端会显示如下提示信息,请保存好提示信息中出现的tar.gz文件。如果无法解决出现的错误,请将该文件提交给阿里云技术支持。
2019-11-11/10:27:52 DEBUG reports has been generated,please upload /root/diagnose_gpu_1573439265.tar.gz to us.
Nvidia驱动会检测GPU设备,如果发现错误,会将错误打印出来。每一种错误都有一个错误码,这些错误码在Nvidia的官方网站均有详细的描述。
NODE NAME: cn-XXX.10.X.X.61
NODE IP: 10.X.X.61
DEVICE PLUGIN POD NAME: nvidia-device-plugin-cn-XXX.10.X.X.61
DEVICE PLUGIN POD STATUS: Running
NVIDIA VERSION:
NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A
COMMON XID ERRORS:
store xid errors to /root/diagnose_gpu_1573439265.tar.gz
[1296323.160491] NVRM: Xid (PCI:0000:00:08): 43, Ch 00000008, engmask 00000101
注:如果出现XID为31的错误,对后续作业调度不影响,可忽略。请重点关注业务日志,即容器stdout与容器内业务日志,该日志会有较明显的出错信息。
如果某个节点的GPU出现问题,那么需要删除该节点上运行的device plugin Pod,然后Kubernetes会自动重新启动一个Nvidia device plugin Pod。使用kubectl delete po [$POD_NAME] -n kube-system命令完成device plugin Pod的删除。本文以删除nvidia-device-plugin-cn-XXX.10.X.X.60这个Pod为例。
注:[$POD_NAME]为具体运行的Pod名称。
kubectl delete po nvidia-device-plugin-cn-XXX.10.X.X.60 -n kube-system
kubectl get po -n kube-system -o wide | grep nvidia-device-plugin
如果检测到XID错误与硬件有关,请检查硬件设备是否出现问题,确定是否需要更换设备。
如果需要关闭某个节点对于GPU的健康检查,请登录该节点。编辑/etc/kubernetes/manifests/nvidia-device-plugin.yml配置文件,在env关键字添加如下的两行配置项,如果存在则无需添加。
注:关闭Xid健康监测后,XID错误将不能捕获。
- name: DP_DISABLE_HEALTHCHECKS value: all
本文以k8s-device-plugin:1.12为例,添加后的效果如下所示。
apiVersion: v1 kind: Pod metadata: annotations: scheduler.alpha.kubernetes.io/critical-pod: "" labels: component: nvidia-device-plugin name: nvidia-device-plugin namespace: kube-system spec: priorityClassName: system-node-critical hostNetwork: true containers: - image: registry-vpc.cn-XXX.aliyuncs.com/acs/k8s-device-plugin:1.12 name: nvidia-device-plugin-ctr # Make this pod as Guaranteed pod which will never be evicted because of node's resource consumption. resources: limits: memory: "300Mi" cpu: "500m" requests: memory: "300Mi" cpu: "500m" env: - name: DP_DISABLE_HEALTHCHECKS value: all securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins