NVIDIA GPU Operator 故障排除#

GPU Operator 验证器:创建 Pod 沙箱失败#

问题

在某些情况下,驱动程序容器无法卸载 nouveau Linux 内核模块。

观察

  • 运行 kubectl describe pod -n gpu-operator -l app=nvidia-operator-validator 命令会包含以下事件

    Events:
      Type     Reason                  Age                 From     Message
      ----     ------                  ----                ----     -------
      Warning  FailedCreatePodSandBox  8s (x21 over 9m2s)  kubelet  Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox runtime: no runtime for "nvidia" is configured
    
  • 在节点上运行以下命令之一表明 nouveau Linux 内核模块已加载

    $ lsmod | grep -i nouveau
    $ dmesg | grep -i nouveau
    $ journalctl -xb | grep -i nouveau
    

根本原因

nouveau Linux 内核模块已加载,并且驱动程序容器无法卸载该模块。由于 nouveau 模块已加载,因此驱动程序容器无法加载 nvidia 模块。

措施

在每个节点上,运行以下命令以防止在启动时加载 nouveau Linux 内核模块

$ sudo tee /etc/modules-load.d/ipmi.conf <<< "ipmi_msghandler" \
    && sudo tee /etc/modprobe.d/blacklist-nouveau.conf <<< "blacklist nouveau" \
    && sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf <<< "options nouveau modeset=0"

$ sudo update-initramfs -u

$ sudo init 6

没有 GPU 驱动程序或操作数 Pod 运行#

问题

在某些集群上,污点应用于具有 NoSchedule 污点效果的节点。

观察

  • 运行 kubectl get ds -n gpu-operator 显示 DESIREDCURRENTREADY 等均为 0

    NAME                              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                                                                                         AGE
    gpu-feature-discovery             0         0         0       0            0           nvidia.com/gpu.deploy.gpu-feature-discovery=true                                                                      11m
    ...
    

根本原因

NoSchedule 污点阻止 Operator 部署 GPU 驱动程序和其他操作数 Pod。

措施

描述每个节点,识别污点,并从节点中移除污点,或者将污点作为容忍添加到守护程序集中。

GPU Operator Pod 卡在崩溃循环中#

问题

在大型集群(例如 300 个或更多节点)上,GPU Operator Pod 可能会卡在崩溃循环中。

观察

  • GPU Operator Pod 未运行

    $ kubectl get pod -n gpu-operator -l app=gpu-operator
    

    示例输出

    NAME                            READY   STATUS             RESTARTS      AGE
    gpu-operator-568c7ff7f6-chg5b   0/1     CrashLoopBackOff   4 (85s ago)   4m42s
    
  • 运行 GPU Operator Pod 的节点具有足够的资源,并且节点处于 Ready 状态

    $ kubectl describe node <node-name>
    

    示例输出

    Conditions:
      Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
      ----                 ------  -----------------                 ------------------                ------                       -------
      MemoryPressure       False   Tue, 26 Dec 2023 14:01:31 +0000   Tue, 12 Dec 2023 19:47:47 +0000   KubeletHasSufficientMemory   kubelet has sufficient memory available
      DiskPressure         False   Tue, 26 Dec 2023 14:01:31 +0000   Thu, 14 Dec 2023 19:15:03 +0000   KubeletHasNoDiskPressure     kubelet has no disk pressure
      PIDPressure          False   Tue, 26 Dec 2023 14:01:31 +0000   Tue, 12 Dec 2023 19:47:47 +0000   KubeletHasSufficientPID      kubelet has sufficient PID available
      Ready                True    Tue, 26 Dec 2023 14:01:31 +0000   Thu, 14 Dec 2023 19:15:13 +0000   KubeletReady                 kubelet is posting ready status
    

根本原因

GPU Operator 的内存资源限制对于集群大小来说太低。

措施

增加 GPU Operator Pod 的内存请求和限制

  • 将内存请求设置为与较长时间窗口内的平均内存消耗相匹配的值。

  • 将内存限制设置为与偶尔发生的内存消耗峰值相匹配。

  1. 增加 GPU Operator Pod 的内存资源限制

    $ kubectl patch deployment gpu-operator -n gpu-operator --type='json' \
        -p='[{"op":"replace", "path":"/spec/template/spec/containers/0/resources/limits/memory", "value":"1400Mi"}]'
    
  2. 可选:增加 Pod 的内存资源请求

    $ kubectl patch deployment gpu-operator -n gpu-operator --type='json' \
        -p='[{"op":"replace", "path":"/spec/template/spec/containers/0/resources/requests/memory", "value":"600Mi"}]'
    

监控 GPU Operator Pod。如果 Pod 仍然卡在崩溃循环中,请再次增加内存请求和限制。

infoROM 已损坏 (nvidia-smi 返回代码 14)#

问题

nvidia-operator-validator Pod 失败,nvidia-driver-daemonsets 也失败。

观察

来自驱动程序验证容器的输出表明 infoROM 已损坏

$ kubectl logs -n gpu-operator nvidia-operator-validator-xxxxx -c driver-validation

示例输出

| NVIDIA-SMI 470.82.01    Driver Version: 470.82.01    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  On   | 00000000:0B:00.0 Off |                    0 |
| N/A   42C    P0    29W / 250W |      0MiB / 16280MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
WARNING: infoROM is corrupted at gpu 0000:0B:00.0
14

GPU 发出一些与 infoROM 相关的警告消息。下面列出了 nvidia-smi 命令的返回值。

RETURN VALUE

Return code reflects whether the operation succeeded or failed and what
was the reason of failure.

·      Return code 0 - Success

·      Return code 2 - A supplied argument or flag is invalid
·      Return code 3 - The requested operation is not available on target device
·      Return code 4 - The current user does  not  have permission  to access this device or perform this operation
·      Return code 6 - A query to find an object was unsuccessful
·      Return code 8 - A device's external power cables are not properly attached
·      Return code 9 - NVIDIA driver is not loaded
·      Return code 10 - NVIDIA Kernel detected an interrupt issue  with a GPU
·      Return code 12 - NVML Shared Library couldn't be found or loaded
·      Return code 13 - Local version of NVML  doesn't  implement  this function
·      Return code 14 - infoROM is corrupted
·      Return code 15 - The GPU has fallen off the bus or has otherwise become inaccessible
·      Return code 255 - Other error or internal driver error occurred

根本原因

为了使驱动程序验证器容器通过,并且 GPU Operator 成功在节点上部署驱动程序 Pod,nvidia-smi 命令应返回成功代码(返回代码 0)。

措施

更换故障 GPU。

EFI + 安全启动#

问题

GPU 驱动程序 Pod 部署失败。

根本原因

GPU Operator 目前不支持 EFI 安全启动

措施

在服务器上禁用 EFI 安全启动。