本页面介绍了如何解决与 Google Kubernetes Engine (GKE) 中的 GPU 相关的问题。
GPU 驱动程序安装
本部分提供了有关 GKE 中的自动 NVIDIA 设备驱动程序安装的问题排查信息。
在 Ubuntu 节点中安装驱动程序失败
如果您使用挂接了 L4 GPU、H100 GPU 或 H200 GPU 的 Ubuntu 节点,则 GKE 安装的默认 GPU 驱动程序可能会低于这些 GPU 所需的版本。因此,GPU 设备插件 Pod 会卡在“待处理”状态,并且这些节点上的 GPU 工作负载可能会遇到问题。
如需解决 L4 GPU 和 H100 GPU 存在的此问题,我们建议您升级到以下 GKE 版本,以安装 GPU 驱动程序版本 535 作为默认驱动程序:
- 1.26.15-gke.1483000 及更高版本
- 1.27.15-gke.1039000 及更高版本
- 1.28.11-gke.1044000 及更高版本
- 1.29.6-gke.1073000 及更高版本
- 1.30.2-gke.1124000 及更高版本
或者,您也可以运行以下命令来手动安装 535 或更高版本的驱动程序:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R535.yaml
如需解决 H200 GPU 存在的此问题,您必须运行以下命令来手动安装驱动程序版本 550 或更高版本:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R550.yaml
GPU 设备插件失败并显示 CrashLoopBackOff 错误
如果您在 2023 年 1 月 25 日之前在节点池中使用了手动驱动程序安装方法,然后将节点池升级到支持自动驱动程序安装的 GKE 版本,则会出现以下问题。这两项安装工作负载同时存在,并尝试在节点上安装有冲突的驱动程序版本。
GPU 设备插件 Init 容器失败,并显示 Init:CrashLoopBackOff
状态。容器的日志类似于以下内容:
failed to verify installation: failed to verify GPU driver installation: exit status 18
如需解决此问题,请尝试以下方法:
从集群中移除手动驱动程序安装 DaemonSet。这会删除有冲突的安装工作负载,并可让 GKE 自动为您的节点安装驱动程序。
kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
将手动驱动程序安装 DaemonSet 清单重新应用于集群。2023 年 1 月 25 日,我们更新了清单,以忽略使用自动驱动程序安装的节点。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
为节点池停用自动驱动程序安装。更新操作完成后,现有的驱动程序安装 DaemonSet 应按预期运行。
gcloud container node-pools update POOL_NAME \ --accelerator=type=GPU_TYPE,count=GPU_COUNT,gpu-driver-version=disabled \ --cluster=CLUSTER_NAME \ --location=LOCATION
请替换以下内容:
POOL_NAME
:节点池的名称。GPU_TYPE
:节点池已使用的 GPU 类型。GPU_COUNT
:已挂接到节点池的 GPU 数量。CLUSTER_NAME
:包含节点池的 GKE 集群的名称。LOCATION
:集群的 Compute Engine 位置。
如需详细了解如何将 GPU 驱动程序版本映射到 GKE 版本,请参阅将 GKE 版本和 Container-Optimized OS 节点映像版本映射到 GPU 驱动程序版本。
错误:“容器映像 cos-nvidia-installer:fixed 不存在,拉取政策为‘从不’。”或“容器映像 ubuntu-nvidia-installer:fixed 不存在,拉取政策为‘从不’。”
当 nvidia-driver-installer
Pod 处于 PodInitializing
状态且 GPU 插件设备或 GPU 驱动程序安装程序 Pod 报告以下错误时,就会出现此问题。具体错误消息取决于节点上运行的操作系统:
COS
Container image "cos-nvidia-installer:fixed" is not present with pull policy of Never.
Ubuntu
Container image "gke-nvidia-installer:fixed" is not present with pull policy of Never.
如果垃圾回收器移除预加载的 NVIDIA 驱动程序映像以释放节点上的空间,则可能会出现此问题。重新创建驱动程序 Pod 或重启其容器时,GKE 将无法找到预加载的映像。
如需缓解运行 COS 时出现的垃圾回收问题,请将 GKE 节点升级到以下包含修复程序的版本之一:
- 1.25.15-gke.1040000 及更高版本
- 1.26.10-gke.1030000 及更高版本
- 1.27.6-gke.1513000 及更高版本
- 1.28.3-gke.1061000 及更高版本
如需详细了解如何将 GPU 驱动程序版本映射到 GKE 版本,请参阅将 GKE 版本和 Container-Optimized OS 节点映像版本映射到 GPU 驱动程序版本。
如果您的节点运行的是 Ubuntu,则尚无针对此垃圾回收问题的修复程序。如需缓解 Ubuntu 上的此问题,您可以运行与主机交互的特权容器,以确保正确设置 NVIDIA GPU 驱动程序。为此,请从您的节点运行 sudo /usr/local/bin/nvidia-container-first-boot
或应用以下清单:
apiVersion: v1
kind: Pod
metadata:
name: gke-nvidia-installer-fixup
spec:
nodeSelector:
cloud.google.com/gke-os-distribution: ubuntu
hostPID: true
containers:
- name: installer
image: ubuntu
securityContext:
privileged: true
command:
- nsenter
- -at
- '1'
- --
- sh
- -c
- "/usr/local/bin/nvidia-container-first-boot"
restartPolicy: Never
节点重新启动或主机维护后 NVIDIA 驱动程序映像丢失也是导致此问题的另一个可能原因。这种情况可能会发生在使用临时本地 SSD 存储空间的机密节点或带 GPU 的节点上。在这种情况下,GKE 会在节点上预加载 nvidia-installer-driver
容器映像,并在首次启动时将其从启动磁盘移至本地 SSD。
如需确认是否发生了主机维护事件,请使用以下日志过滤器:
resource.type="gce_instance"
protoPayload.serviceName="compute.googleapis.com"
log_id("cloudaudit.googleapis.com/system_event")
如需缓解主机维护问题,请将您的 GKE 版本升级到以下某个版本:
- 1.27.13-gke.1166000 及更高版本
- 1.29.3-gke.1227000 及更高版本
- 1.28.8-gke.1171000 及更高版本
错误:未能配置 GPU 驱动程序安装目录:未能创建 lib64 叠加层:未能创建目录 /usr/local/nvidia/lib64:mkdir /usr/local/nvidia/lib64:并非目录。
启用 NCCL fastsocket 后,您会在 GPU 设备插件内的 GPU 驱动程序安装程序容器中遇到以下错误:
failed to configure GPU driver installation dirs: failed to create lib64 overlay: failed to create dir /usr/local/nvidia/lib64: mkdir /usr/local/nvidia/lib64: not a directory.
此问题仅在运行 GKE 1.28 和 1.29 的集群和节点上出现。
此问题是由 GPU 驱动程序安装程序中的 NCCL fastsocket 竞态条件引起的。
为了缓解这一问题,请将 GKE 版本升级到以下某个版本:
- 1.28.8-gke.1206000 及更高版本
- 1.29.3-gke.1344000 及更高版本
如需了解详情,请参阅 GPUDirect-TCPXO 版本说明。
错误:未能获取 nvidia0 的设备:未找到设备 nvidia0。
以下错误表示 XID 62 和 RmInitAdapter 在 GPU 次要版本为 0 时失败:
Failed to get device for nvidia0: device nvidia0 not found.
NVIDIA 驱动程序版本 525.105.17 存在一个 bug,可能会导致通信错误 (XID) 并阻止 GPU 正确初始化,从而导致 GPU 初始化失败。
如需解决此问题,请将 NVIDIA 驱动程序升级到 525.110.11 或更高版本。
将 GKE 版本和 Container-Optimized OS 节点映像版本映射到 GPU 驱动程序版本
如需查找与 GKE 版本和 Container-Optimized OS 节点映像版本对应的 GPU 驱动程序版本,请执行以下步骤:- 对于您要在其中查找 GPU 驱动程序版本的特定 GKE 版本,将 Container-Optimized OS 节点映像版本映射到 GKE 补丁程序版本。例如,1.33.0-gke.1552000 使用 cos-121-18867-90-4。
- 在 Container-Optimized OS 版本说明中,选择 Container-Optimized OS 节点映像版本的里程碑。例如,为 cos-121-18867-90-4 选择里程碑 121。
- 在特定里程碑的版本说明页面中,找到与特定 Container-Optimized OS 节点映像版本对应的版本说明。例如,在 Container-Optimized OS 版本说明:里程碑 121 中,请参阅 cos-121-18867-90-4。在表中的 GPU 驱动程序列中,点击查看列表以查看 GPU 驱动程序版本信息。
重置 A3 虚拟机上的 GPU
某些问题可能需要您重置 A3 虚拟机上的 GPU。
如需重置 GPU,请按照以下步骤操作:
从需要重置 GPU 的节点中移除请求 GPU 资源的 Pod。
停用该节点上的 GPU 设备插件:
kubectl get nodes \ --selector=kubernetes.io/hostname=NODE_NAME \ --no-headers | awk '{print $1}' \ | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=true
将
NODE_NAME
替换为该节点的名称。在 SSH 会话中,重置 GPU:
/home/kubernetes/bin/nvidia/bin/nvidia-smi --gpu-reset
重新启用 GPU 设备插件:
kubectl get nodes --selector=kubernetes.io/hostname=NODE_NAME \ --no-headers \| awk '{print $1}' \ | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=false \ --overwrite
机密 GKE 节点上的 GPU
以下部分介绍了如何识别和修复在机密 GKE 节点上运行的 GPU 的问题。
GPU 工作负载未调度到机密 GKE 节点上
机密 GKE 节点要求您手动安装与所选 GPU 类型和 GKE 版本对应的 GPU 驱动程序。如果 GPU Pod 未调度到机密 GKE 节点上,并且仍处于 Pending
状态,请描述驱动程序安装 DaemonSet:
kubectl --namespace=kube-system get daemonset nvidia-driver-installer -o yaml
如果输出返回 NotFound
错误,请安装驱动程序。
如果 DaemonSet 正在运行,则输出类似于以下内容:
apiVersion: apps/v1
kind: DaemonSet
# lines omitted for clarity
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: nvidia-driver-installer
template:
metadata:
creationTimestamp: null
labels:
k8s-app: nvidia-driver-installer
name: nvidia-driver-installer
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-accelerator
operator: Exists
- key: cloud.google.com/gke-gpu-driver-version
operator: DoesNotExist
- key: cloud.google.com/gke-confidential-nodes-instance-type
operator: In
values:
- TDX
在此输出中,验证 nodeAffinity
字段是否包含 cloud.google.com/gke-confidential-nodes-instance-type
键。如果输出不包含此键,则表示驱动程序安装 DaemonSet 不支持机密 GKE 节点。
部署支持机密 GKE 节点上的 GPU 的 DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/cos/daemonset-confidential.yaml
安装驱动程序后,检查 GPU 工作负载是否成功启动。
错误:未能分配设备向量
GPU 容器日志中的以下错误消息表示 GPU 已从节点虚拟机实例分离:
Failed to allocate device vector A (error code unknown error)!
这种分离可能是由于硬件错误或加密密钥出现问题造成的。
如需解决此问题,请重启节点实例。此操作会造成中断,并影响相应节点上的所有工作负载。如需重启实例,请执行以下步骤:
获取运行 GPU Pod 的节点的名称:
kubectl get pod POD_NAME -o yaml | grep "nodeName"
将
POD_NAME
替换为失败 Pod 的名称。输出类似于以下内容:
nodeName: gke-cluster-1-default-pool-b7asdfbt-fd3e
重置 Compute Engine 实例:
gcloud compute instances reset NODE_NAME
将
NODE_NAME
替换为上一步输出中的节点名称。gcloud CLI 会在活跃项目中查找具有该名称的虚拟机。如果您看到选择可用区的提示,请指定
Y
。检查 GPU 工作负载是否正常运行,未出现错误。
错误:解密失败,出现错误 -74
节点日志中的以下错误消息表示 GPU 的加密密钥丢失:
Decryption failed with error -74
当在节点虚拟机实例上运行的 NVIDIA 持久化守护程序失败时,会发生此错误。如果您看到此错误消息,请重置实例:
gcloud compute instances reset NODE_NAME
将 NODE_NAME
替换为失败节点的名称。
gcloud CLI 会在活跃项目中查找具有该名称的虚拟机。如果您看到选择可用区的提示,请指定 Y
。
如果重置实例无法解决此问题,请与 Cloud Customer Care 联系或提交产品 bug。如需了解详情,请参阅获取支持。
查找 XID 错误
gpu-device-plugin
daemonset 在 kube-system
命名空间内运行,负责以下任务:
- GPU 工作负载调度:将 GPU 资源分配给 Pod。
- GPU 健康检查:监控 GPU 的健康状况。
- GPU 指标收集:收集与 GPU 相关的指标,例如占空比和内存用量。
gpu-device-plugin
使用 NVIDIA 管理库 (NVML) 来检测 XID 错误。如果发生 XID 错误,受影响节点上运行的 gpu-device-plugin
Pod 会记录该错误。您会发现两种类型的 XID 错误日志:
- 非严重 XID 错误:
- 日志格式:
Skip error Xid=%d as it is not Xid Critical
- 含义:这些错误被视为非严重错误。它们可能是由各种软件或硬件问题引起的。
- 操作:对于非严重 XID 错误,GKE 不会执行任何自动化操作。
- 日志格式:
- 严重 XID 错误:
- 日志格式:
XidCriticalError: Xid=%d, All devices will go unhealthy
- 含义:这些错误表明存在 GPU 硬件问题。
- 操作:
- GKE 会将节点的 GPU 资源标记为健康状况不佳。
- GKE 会阻止在节点上调度 GPU 工作负载。
- 如果启用了节点自动修复,GKE 将重新创建节点。
- 日志格式:
GPUDirect-TCPX(O) 问题
本部分提供了有关 GPUDirect-TCPX(O) 问题的排查信息。
版本说明和升级说明
对于新用户,在 Standard 模式集群中最大限度地提高 GPU 网络带宽提供了有关使用 GPUDirect-TCPX(O) 的指南。对于现有用户,请阅读 GPUDirect-TCPXO 版本说明,了解版本信息和升级说明,因为我们会不断发布新版本。
使用 NCCL 日志进行调试
如果您无法解决 NCCL 问题,请收集包含调试信息的 NCCL 日志。这些日志包含有关 NCCL 操作的重要信息,可帮助您找到问题的根源。如果您无法解决问题,请在向 Cloud Customer Care 提交支持请求之前收集这些日志。这些日志有助于 Cloud Customer Care 更快地解决您的问题。
如需生成和收集日志,请完成以下步骤:
在 Pod 或应用清单中设置以下环境变量:
NCCL_DEBUG=INFO NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
如需详细了解这些环境变量,请参阅收集 NCCL 调试日志。
如需为日志生成数据,请运行 NCCL 测试。运行此测试的方式取决于您使用的集群类型。对于 GKE 集群,您可以使用拓扑感知调度 (TAS) 部署并运行 NCCL 测试。运行 NCCL 测试后,NCCL 会自动在所有参与节点上生成日志。
从所有节点收集日志。通过验证日志是否包含以下信息,来验证您是否已从所有节点收集 NCCL 日志:
- 工作负载中涉及的所有虚拟机的主机名。
- 虚拟机上所有相关进程的 PID。
- 每个虚拟机上工作负载所使用的所有 GPU 的排名。
如果您不确定日志文件所处的位置,以下示例展示了当
NCCL_DEBUG_FILE
变量设置为/tmp/nccl_log.%h.%p
时,NCCL 会在何处创建日志文件。您有两个名为a3plus-vm-1
和a3plus-vm-2
的虚拟机,每个虚拟机在工作负载容器内运行 8 个进程。在此场景中,NCCL 会在每个虚拟机上工作负载容器内的/tmp
目录下创建以下日志文件:- 在
a3plus-vm-1
上:8 个名为nccl_log.a3plus-vm-1.PID
的日志文件,其中PID
是进程 ID。 - 在
a3plus-vm-2
上:8 个名为nccl_log.a3plus-vm-2.PID
的日志文件。
查看日志。NCCL 日志条目采用以下格式:
HOSTNAME:PID:TID [RANK] NCCL_MESSAGE
这些日志条目包含以下值:
HOSTNAME
:虚拟机的主机名。此值用于标识 NCCL 生成日志条目时正在使用的虚拟机。PID
:PID。此值用于标识生成日志条目的进程。TID
:线程 ID。此值用于标识 NCCL 生成日志条目时进程中正在使用的线程。RANK
:本地排名 ID。此值用于标识 NCCL 生成日志条目时正在使用的 GPU。排名从 0 到 N 进行编号,其中 N 是进程中所涉及的 GPU 总数。例如,如果您的工作负载在每个虚拟机上使用 8 个 GPU 来运行,则每个虚拟机应具有 8 个不同的排名值 (0-7)。NCCL_MESSAGE
:一条描述性消息,提供有关事件的更多信息,并包含 NCCL 创建日志时的时间戳。
例如:
gke-a3plus-mega-np-2-aa33fe53-7wvq:1581:1634 [1] NCCL INFO 00:09:24.631392: NET/FasTrak plugin initialized.
此示例具有以下值:
gke-a3plus-mega-np-2-aa33fe53-7wvq
:主机名。1581
:进程 ID。1634
:线程 ID。1
:本地排名 ID。NCCL INFO 00:09:24.631392: NET/FasTrak plugin initialized.
:说明所发生的情况的消息。
如果您要提交支持请求,请将收集的日志以及 NCCL 测试的输出结果打包到一个 ZIP 文件中。在向 Cloud Customer Care 提交支持请求时,请附上该 zip 文件。
如需停止收集 NCCL 调试日志,请移除您在第 1 步中添加的变量。
后续步骤
如果您在文档中找不到问题的解决方案,请参阅获取支持以获取进一步的帮助,包括以下主题的建议:
- 请与 Cloud Customer Care 联系,以提交支持请求。
- 通过在 StackOverflow 上提问并使用
google-kubernetes-engine
标记搜索类似问题,从社区获得支持。您还可以加入#kubernetes-engine
Slack 频道,以获得更多社区支持。 - 使用公开问题跟踪器提交 bug 或功能请求。