本指南介绍了如何诊断和解决挂接了 GPU 的 Compute Engine 虚拟机的常见问题,包括硬件错误和性能瓶颈。
使用 NVIDIA DCGM 排查 GPU 虚拟机问题
NVIDIA 数据中心 GPU 管理器 (DCGM) 是一套工具,用于管理和监控集群环境中的 NVIDIA 数据中心 GPU。
如需使用 DCGM 排查 GPU 环境中的问题,请满足以下条件:
- 确保您为挂接到虚拟机的 GPU 型号使用最新推荐的 NVIDIA 驱动程序。如需查看驱动程序版本,请参阅推荐的 NVIDIA 驱动程序版本。
- 确保您已安装最新版本的 DCGM。如需安装最新版本,请参阅 DCGM 安装。
诊断问题
当您运行 dcgmi 诊断命令时,诊断工具报告的问题会包含针对问题采取行动的后续步骤。以下示例展示了 dcgmi diag -r memory -j 命令的可操作输出。
{
........
"category":"Hardware",
"tests":[
{
"name":"GPU Memory",
"results":[
{
"gpu_id":"0",
"info":"GPU 0 Allocated 23376170169
bytes (98.3%)",
"status":"Fail",
""warnings":[
{
"warning":"Pending page
retirements together with a DBE were detected on GPU 0. Drain the GPU and reset it or reboot the node to resolve this issue.",
"error_id":83,
"error_category":10,
"error_severity":6
}
]
}
.........
从上述输出代码段中,您可以看到 GPU 0 有因不可恢复错误而导致的待处理的页面弃用。输出提供了唯一的 error_id 以及有关调试问题的建议。对于此示例输出,建议您排空 GPU 并重启虚拟机。在大多数情况下,按照输出中此部分的说明操作有助于解决问题。
排查 A3 虚拟机的 GPU 性能问题
A3 机器系列可挂接 NVIDIA H200 或 H100 GPU。此系列包括 A3 Ultra (H200)、A3 Mega (H100)、A3 High (H100) 和 A3 Edge (H100) 机器类型。
识别故障节点
多节点 GPU 集群上的大规模训练或基准作业可能会停止响应或性能不佳。这通常是因为一个或多个节点性能不佳,导致整个操作速度变慢。本部分介绍了如何通过运行 NCCL 基准测试或分析 NCCL 日志来识别故障节点或宿主机。
运行 NCCL 基准测试
如需确定导致故障的节点组,请使用 all_reduce_perf 等 NCCL 基准有条不紊地测试集群的子集。
- 如需标识节点集,请将节点分组到逻辑集中,例如 Slurm 中的分区。
- 如需创建主机文件,请为每个节点集创建一个单独的主机文件,其中列出主机名和每个节点的 GPU 数量。您指定的插槽数量取决于 A3 虚拟机类型的 GPU 数量。例如,
a3-highgpu-8g虚拟机有 8 个 GPU,因此您必须指定slots=8。 - 如需运行基准测试,请针对每个节点集单独执行
all_reduce_perf基准测试。mpirun -x LD_LIBRARY_PATH --hostfile HOSTFILE_NAME -n TOTAL_PROCESSES \ ./build/all_reduce_perf -b 1G -e 8G -f 2 -g NUM_GPUS_PER_NODE替换以下内容:
HOSTFILE_NAME:主机文件的名称,其中包含节点列表以及节点集中每个节点的 GPU 数量。TOTAL_PROCESSES:要在节点集中的所有主机上启动的 MPI 进程总数。NUM_GPUS_PER_NODE:每个节点的 GPU 数量。对于所有 A3 机器类型,此值为8。
- 如需分析结果,如果作业在特定节点集上挂起或显示的总线带宽 (
busbw) 明显较低,则该节点集可能存在故障。 - 若要进一步细分,如果节点集出现故障,请将其主机文件分成两半,然后重新测试,以缩小二分搜索范围,直到您确定出现故障的单个节点。
分析 NCCL 日志
如果基准测试方法无法精确定位节点,请分析详细的 NCCL 日志。
- 如需启用调试日志记录,请在计划运行工作负载的 shell 会话中设置以下环境变量:
export NCCL_DEBUG=INFO export NCCL_DEBUG_SUBSYS=INIT,NET,COLL export NCCL_DEBUG_FILE="LOG_DIRECTORY/nccl_log.%h.%p"将
将LOG_DIRECTORY替换为要存储日志的目录。NCCL_DEBUG_FILE设置为%h和%p会为每个进程创建唯一的非交错日志文件。如果您使用
mpirun运行多节点工作负载,请使用-x标志将这些变量传播到所有节点。例如:mpirun -x NCCL_DEBUG -x NCCL_DEBUG_SUBSYS -x NCCL_DEBUG_FILE ... - 如需查找第一个错误,请使用以下命令在所有日志文件中查找最早的超时或失败事件:
grep "NCCL WARN.*NET/FasTrak" LOG_DIRECTORY/* | sed 's/.*NET\/FasTrak\(.*\)/\1/g' \ | sort | head -n 20将
LOG_DIRECTORY替换为存储日志的目录。 - 对于统计集合操作,落后节点完成的集合操作较少。可疑排名对应的条目数
"opCount":grep "opCount" LOG_DIRECTORY/nccl_log.HOSTNAME.PID | wc -l替换以下内容:
LOG_DIRECTORY:存储日志的目录HOSTNAME:节点的主机名PID:NCCL 进程的进程 ID
- 如需在作业中止之前收集更多日志记录数据,请暂时增加数据传输超时时间:
export NCCL_FASTRAK_DATA_TRANSFER_TIMEOUT_MS=3600000
监控 GPU 温控调频
如果 A3 系列虚拟机在负载下持续达到 87 °C 以上的温度,则可能会出现性能下降。如需检查集群中各节点的 GPU 热节流情况,请使用 nvidia-smi 或 dcgmi。
使用 nvidia-smi
如需检查节点上所有 GPU 的当前温度和节流状态,请运行以下命令:
nvidia-smi --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,clocks_throttle_reasons.hw_slowdown --format=csv
在输出中,clocks_throttle_reasons.hw_slowdown 列中的值 Active 表示 GPU 因温度过高而受到限制。
使用 dcgmi
NVIDIA 数据中心 GPU 管理器 (DCGM) 诊断套件包含温度违规检查。如需运行 1 级诊断,请运行以下命令:
dcgmi diag -r 1
Thermal 部分中的结果为 Warn 或 Fail 表示测试期间发生了热违规。如果出现热违规的同时还伴有时钟节流,则 GPU 可能过热,需要进一步调查。
Xid 错误
创建挂接 GPU 的虚拟机后,您必须在 GPU 虚拟机上安装 NVIDIA 设备驱动程序,以便应用可以访问 GPU。但这些驱动程序有时会返回错误消息。
Xid 消息是 NVIDIA 驱动程序的错误报告,输出到 Linux 虚拟机的操作系统内核日志或事件日志中。这些消息位于 /var/log/messages 文件中。如需详细了解 Xid 消息(包括潜在原因),请参阅 NVIDIA 文档。
Google 如何处理 Xid 错误
Google 使用被动健康检查来评估 GPU 系统。如果需要更换硬件,Google 会自动启动紧急维护。Google 会检测 Xid 错误,并在错误代码(例如 Xid 74、79 和 140)表明硬件故障概率较高时主动将机器送去维修。对于某些 Xid 代码,由于它们可能是由软件或硬件问题引起的,因此 Google 会使用模式匹配来触发修复,因此并非每次出现都会导致自动修复。
Xid 错误的类型
以下列表介绍了 Xid 错误的三大类别及其建议的恢复操作:
应用错误:这些错误表示应用代码中存在问题。 应用错误包括 Xid(例如 Xid 13、31、94、95 和 137),这些 Xid 表示各种类型的内存访问违规,类似于分段错误。这些并不表示 ECC 错误。为了排查这些错误,NVIDIA 建议使用以下任一调试方法:
- 直接调试:直接在 cuda-gdb 中运行应用,或运行 Compute Sanitizer memcheck 工具。
- 异常后调试:使用
CUDA_DEVICE_WAITS_ON_EXCEPTION=1运行应用。发生异常时,GPU 驱动程序会冻结应用状态而不退出,以便您稍后附加调试程序 (cuda-gdb -p <PID>) 来检查实时堆栈轨迹。
驱动程序错误:这些错误表明存在由 NVIDIA GPU 驱动程序引起的问题。如需解决这些错误,请确保您使用的是最新 NVIDIA 驱动程序版本。Google 会监控这些错误,并与 NVIDIA 合作修复驱动程序。
固件或硬件可恢复错误:这些错误表示固件或硬件错误可以通过恢复来解决,而无需更换硬件。如需解决这些错误,请应用手动恢复措施,例如重置 GPU 或重启实例。固件或硬件可恢复错误包括纠错码 (ECC) 错误(适用于 Xid 48、63 和 64 等 Xid),这些错误表示检测和缓解 ECC 错误的不同阶段。如需详细了解页面停用和 ECC 错误缓解,请参阅 NVIDIA 的动态页面停用常见问题解答。
查看 Xid 消息
如需快速诊断 GPU 工作负载失败、停止响应或性能下降的原因,请检查实例的内核日志(dmesg 或 /var/log/kern.log),查找数字 NVIDIA Xid 错误代码。
查看以下小节中的 Xid 错误表可帮助您立即:
- 找出根本原因:确定故障是由应用 bug(例如非法内存访问)、驱动程序冲突还是物理硬件故障(例如双位 ECC 内存错误)引起的。
- 确定运营所有权:检查您必须采取哪些即时手动恢复措施(例如重置 GPU、重启虚拟机或运行调试程序),以及 Google 在主机上主动管理哪些自动修复和硬件更换操作。
- 采取正确的恢复步骤:避免不必要的问题排查程序,并准确了解何时手动恢复就足够了,何时需要报告主机故障。有时,手动恢复是不够的,例如,如果错误来源位于 GPU 缓存 (SRAM) 中,则无法重新映射(由
Xid 48和SRAM Threshold Exceeded=Yes指示),或者如果 GPU 已耗尽其重新映射库(由Xid 64: All reserved rows for bank are remapped指示)。在这些情况下,Google 会检测到 GPU 符合硬件更换条件,并主动将机器送去维修。如果您的工作负载遇到反复出现的错误,或者您观察到重复的内存故障,则可以报告故障主机,以启动自动修复或更换。对于 GKE,请参阅如何在 GKE 中报告故障主机。
Xid 处理
以下部分按技术类别对常见的 Xid 错误消息进行了分组,并列出了权威的解决方法和责任方:
- GPU 内存错误(Xid
48、63、64、92、94、95) - GPU 系统处理器 (GSP) 错误(Xid
119、120) - 非法内存访问错误(Xid
13、31、137) - 其他常见的 Xid 出错提示(Xid
74、79、109、149)
GPU 内存错误
GPU 内存是 GPU 上可用的内存,可用于临时存储数据。GPU 内存受纠错代码 (ECC) 保护,它可以检测和纠正单位错误 (SBE),以及检测并报告双位不可纠正的错误 (DBE)。
这些内存错误预计会在 GPU 的使用寿命内发生。在 NVIDIA A100 GPU 发布之前,支持动态页面弃用。对于 NVIDIA A100 及更高版本的 GPU 版本(例如 NVIDIA H100),引入了针对 HBM (DRAM) 错误的行重新映射错误恢复功能。ECC 默认处于启用状态,Google 强烈建议您保持启用状态。
下表列出了常见的 GPU 内存错误及其建议的解决方法:
| Xid 错误消息 | 客户操作 | Google 采取的措施 |
|---|---|---|
Xid 48: Double Bit ECC
ECC 检测到双位(无法更正)内存错误。此错误始终会中断正在运行的工作负载并生成 Xid 48。 |
|
Google 会监控 GPU 何时符合硬件更换条件,例如 HBM 重新映射库耗尽或 GPU 超过其生命周期 SRAM 错误阈值,并主动将机器送修以更换 GPU。 |
Xid 63: ECC page retirement or row remapping recording
event
表示由于内存错误而记录了动态页面停用或行重新映射事件。 |
|
Google 会监控错误阈值,并在 GPU 需要进行物理维修或更换时将机器送去维修。 |
Xid 64: ECC page retirement or row remapper recording
failure
该消息包含以下信息: Xid 64: All reserved rows for bank are remapped
|
|
当重映射库耗尽 ( |
如果您至少同时收到以下 Xid 消息中的两条:
该消息包含以下信息: Xid XX: row remap pending
|
|
如果重新映射库已用尽,或者 GPU 需要进行物理维修或更换,Google 会将机器送去维修。 |
Xid 92: High single-bit ECC error rate |
在 GPU 驱动程序更正一个可更正的错误后,系统将返回此 Xid 消息,它不会影响您的工作负载。此 Xid 消息仅供参考。对此,您无需执行任何操作。 |
无 |
Xid 94: Contained error
指示是否发生了 GPU 错误,以及该错误是否包含在单个应用中。 Xid 94 本身并不表示错误的根本原因;必须结合其他同时发生的 Xid 错误进行解读,才能确定根本原因。 |
|
无 |
Xid 95: Uncontained error
表示发生了 GPU 错误,并且该错误不限于单个应用。 Xid 95 本身并不表示错误的根本原因;必须结合其他同时出现的 Xid 错误进行解读,才能确定根本原因。 |
无 |
GSP 错误
GPU 系统处理器 (GSP) 是一个在 GPU 上运行的微控制器,用于处理一些低级别的硬件管理功能。
| Xid 错误消息 | 客户操作 | Google 操作 |
|---|---|---|
Xid 119: GSP RPC timeout |
|
无。如果错误仍然存在,并且您提交了支持请求,Google 会通过支持工作流调查硬件或驱动程序状态。 |
Xid 120: GSP error |
非法的内存访问错误
如果应用遇到非法内存访问故障,系统会返回以下 Xid:
| Xid 错误消息 | 客户操作 | Google 操作 |
|---|---|---|
|
检测到内存访问违规,类似于分段错误。这些错误通常表示存在应用 bug,即 GPU 内存访问越界,或访问已释放的缓冲区(例如,解引用无效指针或越界数组)。 除非还存在 Xid 48,否则这些不代表 ECC 错误。 |
如需解决此问题,请调试应用中的内存访问故障。您可以使用 cuda-gdb、Compute Sanitizer 或 cuda-memcheck。 如需了解详情,请参阅 NVIDIA Xid 文档。 |
无。在极少数情况下,硬件性能下降可能会导致错误报告非法内存访问错误,您可以使用 NVIDIA 数据中心 GPU 管理器 (DCGM) 运行 |
其他常见的 Xid 错误消息
| Xid 错误消息 | 客户操作 | Google 操作 |
|---|---|---|
Xid 74: NVLINK error |
|
无 |
Xid 79: GPU has fallen off the bus
这意味着驱动程序无法与 GPU 通信,因为硬件问题导致 GPU 从 PCI 总线中消失。 |
如需恢复工作负载,请使用以下任一方法,具体取决于是否为项目启用了紧急维护:
|
Google 检测到 GPU 已从 PCI 总线脱落,并将机器送去维修。 |
Xid 109: Context switch timeout
Xid 109 是 NVIDIA GPU 驱动程序报告的一般错误,在 GPU 实例未能在预期超时期限内抢占或切换任务时生成。 Google 长期以来一直与 NVIDIA 合作调查 Xid 109,并且已在最新驱动程序中修复了驱动程序 bug 导致的已知原因。Xid 109 不是由硬件问题引起的。 |
|
无 |
Xid 149,其中提及 0x02a,如以下示例所示:
|
|
无 |
排查操作系统修补或内核升级后 nvidia-smi 失败的问题
如果 nvidia-smi 在维护窗口、操作系统补丁运行或虚拟机重启后因 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver 而失败,请检查您的内核软件包保留。binary 模式下之前安装的驱动程序中的软件包锁定可能会阻止安装匹配的内核头文件。
如需诊断和解决此问题,请选择您的操作系统:
Ubuntu
检查正在运行的内核版本:
uname -r检查之前在
binary模式下安装的驱动程序是否锁定了内核软件包,例如当您使用--force-version、--installation-branch=lts或 NVIDIA RTX 虚拟工作站 (vWS) 计算实例时:apt-mark showhold检查是否列出了
linux-image-gcp或linux-headers-gcp。验证是否已为正在运行的内核安装内核标头:
dpkg -l | grep "linux-headers-$(uname -r)"如果内核元软件包被锁定,请移除软件包锁定:
sudo apt-mark unhold linux-image-gcp linux-headers-gcp为正在运行的内核安装内核标头:
sudo apt-get update && sudo apt-get install -y linux-headers-$(uname -r)重新编译并加载 NVIDIA 内核模块:
如果 DKMS 模块源已注册(检查
sudo dkms status):sudo dkms autoinstall sudo modprobe nvidia nvidia-smi如果
sudo dkms status显示没有已注册的 NVIDIA 模块(例如,如果之前使用不含--dkms的.run二进制文件安装了驱动程序),请重新运行 Google Cloud GPU 驱动程序安装程序:sudo python3 cuda_installer.pyz install_driver
Debian
检查正在运行的内核版本:
uname -r检查之前在
binary模式下安装的驱动程序是否锁定了内核软件包,例如当您使用--force-version、--installation-branch=lts或 NVIDIA RTX 虚拟工作站 (vWS) 计算实例时:apt-mark showhold检查是否列出了
linux-image-cloud-amd64或linux-headers-cloud-amd64。验证是否已为正在运行的内核安装内核标头:
dpkg -l | grep "linux-headers-$(uname -r)"如果内核元软件包被锁定,请移除软件包锁定:
sudo apt-mark unhold linux-image-cloud-amd64 linux-headers-cloud-amd64为正在运行的内核安装内核标头:
sudo apt-get update && sudo apt-get install -y linux-headers-$(uname -r)重新编译并加载 NVIDIA 内核模块:
如果 DKMS 模块源已注册(检查
sudo dkms status):sudo dkms autoinstall sudo modprobe nvidia nvidia-smi如果
sudo dkms status显示没有已注册的 NVIDIA 模块(例如,如果之前使用不含--dkms的.run二进制文件安装了驱动程序),请重新运行 Google Cloud GPU 驱动程序安装程序:sudo python3 cuda_installer.pyz install_driver
RHEL 和 Rocky Linux
检查正在运行的内核版本:
uname -r检查之前在
binary模式下安装的驱动程序是否锁定了内核软件包,例如当您使用--force-version、--installation-branch=lts或 NVIDIA RTX 虚拟工作站 (vWS) 计算实例时:grep "^exclude=.*kernel" /etc/dnf/dnf.conf验证是否已为正在运行的内核安装内核标头:
rpm -qa | grep "kernel-devel-$(uname -r)"如果排除内核软件包,请从
/etc/dnf/dnf.conf中的exclude=行中移除kernel*。为正在运行的内核安装内核标头:
sudo dnf install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)重新编译并加载 NVIDIA 内核模块:
如果 DKMS 模块源已注册(检查
sudo dkms status):sudo dkms autoinstall sudo modprobe nvidia nvidia-smi如果
sudo dkms status显示没有已注册的 NVIDIA 模块(例如,如果之前使用不含--dkms的.run二进制文件安装了驱动程序),请重新运行 Google Cloud GPU 驱动程序安装程序:sudo python3 cuda_installer.pyz install_driver
排查安全启动问题
如果您在启用了安全启动的计算实例上安装 NVIDIA 驱动程序,并且 nvidia-smi 无法与 NVIDIA 驱动程序通信,则安全启动可能会阻止未签名的内核模块加载。
如需诊断并解决此问题,请完成以下步骤:
检查安全启动是否因签名缺失或无效而拒绝了内核模块:
sudo dmesg | grep -iE 'secure boot|nvidia'
如果安全启动阻止了该模块,请手动对驱动程序模块进行签名并注册机器所有者密钥 (MOK),或使用具有预签名内核模块的操作系统映像。如需了解相关说明,请参阅安装 GPU 驱动程序(安全启动虚拟机)。
重置 GPU
某些问题可能需要您重置 GPU。如需重置 GPU,请完成以下步骤:
- 对于挂接了一个或多个 GPU 的 N1、G2、A2 和 G4 虚拟机,请重启虚拟机。
- 对于具有部分 GPU(挂接的 GPU 不足一个)的 G4 虚拟机,请完成以下步骤:
- 对于 A3、A4、A4X 和 A4X Max 实例,请运行
sudo nvidia-smi --gpu-reset。- 对于大多数 Linux 虚拟机,
nvidia-smi可执行文件位于/var/lib/nvidia/bin目录中。 - 对于 GKE 节点,
nvidia-smi可执行文件位于/home/kubernetes/bin/nvidia目录中。
- 对于大多数 Linux 虚拟机,
- 对于 GKE 节点上的 A3、A4、A4X 和 A4X Max 实例,您还可以使用 gpu-reset-tool 自动重置节点上的所有 GPU。此工具仅要求您指定目标节点名称。
或者,每当您重置虚拟机或停止并重启虚拟机时,GPU 也会重置。如需详细了解虚拟机生命周期状态以及虚拟机恢复操作之间的差异,请参阅 Compute Engine 实例生命周期和暂停、停止或重置 Compute Engine 实例。
创建支持请求
如果您无法按照本页面上的指导解决问题,请收集以下信息并创建支持请求:
- 受影响的实例所在项目的项目 ID。
- 集群中所有实例名称或 ID 的列表。
- 通过问题排查确定的可疑节点列表。
- 完整、非交错的 NCCL 日志,且已启用调试设置。
- 硬件健康检查的输出(
dcgmi、nvidia-smi)。 - 失败的确切基准或工作负载命令。
- 相关日志文件,例如主机引擎和诊断日志。如需收集这些信息,请运行
gather-dcgm-logs.sh(位于默认安装中的/usr/local/dcgm/scripts中)。 - NVIDIA 错误报告。运行
nvidia-bug-report.sh。对于 Blackwell GPU,请按照为 Blackwell GPU 生成 NVIDIA bug 报告中的说明操作。 - 有关在失败之前对您的环境所做的任何近期更改的详细信息。
后续步骤
查看 GPU 机器类型。