文档

Kubernetes集群的GPU问题诊断

更新时间:

概述

在使用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节点进行了检查,每个节点都会显示如下六个信息。

  • NODE NAME:显示节点名称。
  • NODE IP:显示节点IP。
  • DEVICE PLUGIN POD NAME:节点上运行的Nvidia device plugin Pod的名称。
  • DEVICE PLUGIN POD STATUS:节点上运行的Nvidia device plugin Pod的状态。
  • NVIDIA VERSION:节点上安装的Nvidia驱动的版本。
  • COMMON XID ERRORS:节点上的GPU是否出现了XID错误,错误信息将保存在文件当中。如果没有错误信息,那么会显示“not found Xid errors.”。

 

日志收集

当运行完检测脚本后,在终端会显示如下提示信息,请保存好提示信息中出现的tar.gz文件。如果无法解决出现的错误,请将该文件提交给阿里云技术支持。

2019-11-11/10:27:52  DEBUG  reports has been generated,please upload /root/diagnose_gpu_1573439265.tar.gz to us.

 

分析XID错误

Nvidia驱动会检测GPU设备,如果发现错误,会将错误打印出来。每一种错误都有一个错误码,这些错误码在Nvidia的官方网站均有详细的描述。

  1. 根据查看生成报告所展示的信息,在 COMMON XID ERRORS 这一栏可以查看XID错误。本文以如下节点出现的XID错误为例。
    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
  2. 解压缩/root/diagnose_gpu_1573439265.tar.gz文件,切换到xid_errors子目录。找到IP地址为10.X.X.61的节点,获得XID错误如下所示,确认错误码为43。
    [1296323.160491] NVRM: Xid (PCI:0000:00:08): 43, Ch 00000008, engmask 00000101
  3. 定位到错误码以后,根据Nvidia的官方网站查看这个错误相关信息。可以查到如下信息。

    更详细的描述如下所示。
  4. 确认该错误并不是由于Nvidia驱动的Bug造成的,而是由于应用程序造成的。此时应该检查应用程序的相关代码是否有问题。
  5. 其他的XID错误也请按照上述步骤去检查。如果是Nvidia驱动的问题,那么需要向Nvidia提交Bug信息并等待其工程师的处理。
    注:如果出现XID为31的错误,对后续作业调度不影响,可忽略。请重点关注业务日志,即容器stdout与容器内业务日志,该日志会有较明显的出错信息。

 

恢复方案

快速恢复集群可调度GPU卡数量

如果某个节点的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名称。

  1. 假设nvidia-device-plugin-cn-XXX.10.X.X.60这个Pod所在的节点GPU出现问题,则使用如下命令删除。
    kubectl delete po nvidia-device-plugin-cn-XXX.10.X.X.60 -n kube-system
  2. 执行如下命令,查看每个节点上的nvidia-device-plugin的状态是否变成running了。若不是running状态,可按照日志收集小节的步骤进行操作。
    kubectl get po -n kube-system  -o wide | grep nvidia-device-plugin

 

硬件错误

如果检测到XID错误与硬件有关,请检查硬件设备是否出现问题,确定是否需要更换设备。

 

关闭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

 

适用于

  • 容器服务 Kubernetes 版
  • 本页导读 (1)
文档反馈