4. GPU硬件与驱动层故障诊断

推理服务跑着跑着突然吞吐掉底、请求超时,甚至进程直接退出,很多时候问题并不在模型或框架,而在 GPU 硬件与驱动这一层。这一层故障的特点是:现象往往“看起来像软件问题”,但根因在卡、显存、链路或驱动。要快速定位,关键是学会读三类信号——ECC 计数、Xid 报错、掉卡与显存异常,再结合驱动版本兼容性做判断。

一、先分清五类故障的“指纹”

ECC(Error Correcting Code)是显存和内部 SRAM 的纠错机制。它分两类:可纠正错误(Correctable / Single-Bit)由硬件自动修复,通常只影响性能;不可纠正错误(Uncorrectable / Double-Bit)无法修复,会导致数据损坏、进程崩溃甚至整卡失效。判断严重程度看两点:错误类型和增长速率。偶发单比特、计数不涨,可观察;持续增长或出现双比特,必须处理。

Xid 是 NVIDIA 驱动上报的错误事件编号,写在系统日志里,是硬件层最重要的“诊断码”。常见的有:Xid 13/31(GPU 异常、非法访问)、Xid 43(GPU 停止处理任务)、Xid 48(双比特 ECC)、Xid 63/64(行重映射,ECC 相关)、Xid 74(NVLink 总线错误)、Xid 79(GPU 掉卡/掉总线)、Xid 92/94(驱动与硬件通信异常)。不同 Xid 对应不同处置动作,不能一概重启了事。

掉卡指 GPU 从系统中消失,nvidia-smi 报 “Unable to determine the device handle” 或设备列表少卡,常见于 Xid 79、供电/散热异常、PCIe 链路问题。显存异常表现为显存占用异常、OOM 但实际占用不高、推理结果乱码,多与 ECC 双比特或显存颗粒故障相关。驱动版本不兼容则表现为 CUDA 初始化失败、nvidia-smi 与驱动版本不匹配、容器内无法识别 GPU。

GPU 硬件与驱动层故障诊断路径 信号采集 nvidia-smi -q dmesg | grep -i xid nvidia-bug-report.sh 关键判据 ECC 类型 / 增长速率 Xid 编号 卡是否可见 / 驱动版本 ECC 错误:单比特观察 / 双比特隔离 Xid 错误:按编号定处置动作 掉卡:查供电 / PCIe / 散热 显存异常:ECC + 显存测试 驱动不兼容:版本对齐 处置动作对照 ECC 单比特 记录计数基线 持续监控增长 不中断服务 ECC 双比特 立即隔离该卡 迁移推理实例 申请 RMA 更换 Xid 79 掉卡 检查供电与散热 重插 / 换槽位 复位后复测 驱动不兼容 对齐 CUDA 版本 重装匹配驱动 容器内验证

二、ECC 错误的识别与处理

用 nvidia-smi -q -d ECC 查看计数,重点看 Volatile(本次开机以来)和 Aggregate(累计)两个维度。示例输出中若 Single Bit 的 Volatile 计数为 0、Aggregate 为 12,说明历史上出现过但当前稳定;若 Volatile 在几分钟内从 0 涨到几十,说明该卡正在持续出错。

nvidia-smi -q -d ECC | grep -A 4 "ECC Errors"
# 关注:
#   Volatile - Single Bit / Double Bit
#   Aggregate - Single Bit / Double Bit
#   Remapped Rows(行重映射,ECC 修复的痕迹)

处理原则:单比特且不增长,记录基线后继续观察;单比特快速增长或出现双比特,立即把该卡从推理集群中摘除(在调度层打 taint 或从可用卡列表移除),迁移实例,再走硬件报修。注意:双比特错误后即使重启恢复,显存数据也可能已损坏,不能直接放回生产。

三、Xid 错误的定位与处置

Xid 写在 dmesg 或 /var/log/syslog 中,格式类似 NVRM: Xid (PCI:0000:3b:00): 79, pid=..., GPU has fallen off the bus。定位时先抓 Xid 编号和 PCI 地址,再对照处置表。例如 Xid 48 表示双比特 ECC,按 ECC 双比特流程处理;Xid 74 是 NVLink 错误,多卡推理时需检查 NVLink 拓扑和互联;Xid 13/31 常与非法内存访问相关,需排查是否有越界访问或驱动 bug。

Xid 79(掉卡)后不要盲目重启整机。先确认是单卡还是多卡同时掉,单卡掉通常是该卡供电/散热/PCIe 问题,多卡同时掉要怀疑主板、电源或整机散热。重启后若同一槽位再次掉卡,应换槽位或换卡验证,区分是卡的问题还是槽位的问题。

四、掉卡与显存异常的排查

掉卡后 nvidia-smi 会报设备句柄错误或直接少卡。排查顺序:先看 lspci | grep -i nvidia 是否还能看到设备,若 lspci 都看不到,说明是 PCIe 层掉链,重点查供电、金手指、插槽和散热;若 lspci 能看到但 nvidia-smi 看不到,多为驱动层问题,可尝试 nvidia-smi -r 复位或重载驱动模块。

显存异常除了 ECC,还可用 cuda-memtest 或 NVIDIA 的 dcgm 做显存压力测试。推理场景中若出现“显存占用正常但结果乱码”,优先怀疑 ECC 双比特或显存颗粒故障,而不是模型问题。此时应停止该卡上的推理任务,做显存测试确认。

五、驱动版本不兼容的识别

驱动不兼容的典型现象:nvidia-smi 报 “Failed to initialize NVML: Driver/library version mismatch”,或容器内 CUDA 初始化失败。根因通常是内核模块版本与用户态库版本不一致(例如升级了驱动包但没重启,或容器镜像里的 CUDA 版本高于宿主驱动支持的版本)。

排查方法:用 nvidia-smi 看 Driver Version 和 CUDA Version,用 cat /proc/driver/nvidia/version 看内核模块版本,两者必须一致。容器场景还要确认镜像的 CUDA 版本不超过宿主驱动支持的上限。处理方式是重启加载新模块,或重装与 CUDA 匹配的驱动版本。

建议在推理集群中固定驱动版本基线,并在上线前用 nvidia-smi + 一次小规模推理冒烟测试验证 GPU 可用性,避免版本漂移导致的批量故障。

六、一份可执行的排查清单

现象首要检查关键命令/日志处置
吞吐骤降、无报错ECC 单比特增长nvidia-smi -q -d ECC记录基线,持续监控
进程崩溃、结果乱码ECC 双比特 / Xid 48dmesg | grep Xid隔离该卡,迁移实例
nvidia-smi 少卡Xid 79 / PCIe 掉链lspci、dmesg查供电散热,换槽验证
NVML 初始化失败驱动版本不匹配nvidia-smi、/proc/driver/nvidia/version重启或重装匹配驱动
容器内无 GPUCUDA 与驱动不兼容容器内 nvidia-smi对齐镜像 CUDA 版本

掌握这套“采集信号 → 判读指纹 → 对照处置”的方法,就能在推理服务出现硬件层异常时快速区分是卡的问题、显存的问题还是驱动的问题,避免把硬件故障误判为模型或框架问题而浪费排查时间。