一、故障症状速查表
| 现象 | 可能层级 | 紧急程度 |
|---|
nvidia-smi 报错 / 无输出 | 驱动/内核 | 🔴 高 |
| GPU 温度 > 90°C / 降频 | 散热 | 🟡 中 |
| 显存不足 OOM | 应用/配置 | 🟡 中 |
| ECC 单比特错误 (SBE) | 显存老化 | 🟡 中 |
| ECC 双比特错误 (DBE) | 显存损坏 | 🔴 极高 |
| 训练 loss 异常 / 结果不对 | 计算单元 | 🔴 高 |
| PCIe 报错 / 掉卡 | 硬件连接 | 🔴 高 |
| 功耗不达标 / 电源告警 | 供电 | 🟡 中 |
二、分层排查流程图
┌─────────────────┐
│ 现象观察 │
│ nvidia-smi / │
│ 应用报错 / │
│ 系统日志 │
└────────┬────────┘
▼
┌─────────────────┐ Y ┌─────────────────┐
│ 驱动是否正常? │ ─────────→│ 驱动层排查 │
│ nvidia-smi 有输出│ │ 重装/降级/补丁 │
└────────┬────────┘ └─────────────────┘
│ N
▼
┌─────────────────┐ Y ┌─────────────────┐
│ 能否识别硬件? │ ─────────→│ 硬件层排查 │
│ lspci 有 NVIDIA │ │ 重插/换槽/换卡 │
└────────┬────────┘ └─────────────────┘
│ N
▼
┌─────────────────┐ Y ┌─────────────────┐
│ 温度/功耗异常? │ ─────────→│ 散热/供电排查 │
│ │ │ 清灰/换硅脂/查电源│
└────────┬────────┘ └─────────────────┘
│ N
▼
┌─────────────────┐ Y ┌─────────────────┐
│ 显存/计算错误? │ ─────────→│ ECC/计算单元排查│
│ ECC 报错 / loss 异常│ │ 隔离故障卡/报修 │
└────────┬────────┘ └─────────────────┘
│ N
▼
┌─────────────────┐
│ 软件/应用层 │
│ CUDA 版本 / │
│ 代码逻辑 / │
│ 集群调度 │
└─────────────────┘
三、逐层详细排查
第一层:驱动层(最常见)
3.1.1 快速诊断
# 基础检查
nvidia-smi # 无输出 = 驱动问题
dmesg | grep -i nvidia # 内核报错
cat /var/log/nvidia-installer.log # 安装日志
# 驱动状态
modinfo nvidia # 驱动模块信息
lsmod | grep nvidia # 模块是否加载
cat /proc/driver/nvidia/version # 驱动版本
3.1.2 常见问题与修复
| 现象 | 根因 | 修复 |
|---|
nvidia-smi 报 Failed to initialize NVML | 驱动与内核不匹配 | 重装驱动或降级内核 |
modprobe: ERROR: could not insert 'nvidia' | Secure Boot 阻止 | BIOS 关闭 Secure Boot |
| 新内核启动后失效 | DKMS 未自动编译 | sudo dkms autoinstall |
| CUDA 版本不匹配 | 多版本冲突 | update-alternatives 管理 |
3.1.3 驱动重装(保留配置)
参考该篇文章
http://8.148.180.168:4000/post/87
第二层:硬件识别层
3.2.1 PCIe 链路检查
# 查看 GPU 是否在总线上
lspci | grep -i nvidia
# 输出示例:0000:41:00.0 3D controller: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB]
# 详细链路状态
sudo lspci -vv -s 0000:41:00.0 | grep -E "LnkCap|LnkSta"
# LnkCap: 链路能力(支持 PCIe 3.0 x16)
# LnkSta: 当前状态(实际协商速度)
# 关键:若 LnkSta 显示 x4 或 PCIe 1.0 = 插槽/线缆问题
3.2.2 物理定位
# 获取槽位信息(用于带外定位)
sudo dmidecode -t slot | grep -B2 -A2 "Bus Address: 41"
# 或结合温度定位(跑压力测试后看 BMC 温度)
./gpu_burn 60 &
# 然后到 IPMI/BMC 查看各 PCIe 设备温度,最高即目标卡
3.2.3 掉卡/链路降级处理
# 1. 软件层面重扫描(无需重启)
echo 1 | sudo tee /sys/bus/pci/rescan
# 2. 若无效,热卸载后重识别(内核 4.19+)
sudo nvidia-smi drain -p 0000:41:00.0 -m 1 # 卸载
echo 1 | sudo tee /sys/bus/pci/rescan # 重扫
sudo nvidia-smi drain -p 0000:41:00.0 -m 0 # 重新启用
# 3. 仍无效 = 物理重插或换槽
第三层:散热与功耗层
3.3.1 温度监控
# 实时温度
watch -n 1 nvidia-smi
# 详细温度与限制
nvidia-smi -q -d TEMPERATURE,PERFORMANCE,POWER
# 关键字段:
# - GPU Current Temp
# - GPU Shutdown Temp(硬限制,通常 100°C)
# - GPU Slowdown Temp(软限制,通常 85°C)
# - Clocks Throttle Reasons(若显示 "HW Slowdown" = 过热降频)
3.3.2 压力测试验证散热
# 满载测试 5 分钟
./gpu_burn 300
# 观察:
# - 温度是否持续上升至 90°C+
# - 是否触发 [Clocks Throttle Reasons] "HW Slowdown"
# - 功耗是否达到 TDP(如 300W/300W)
3.3.3 散热故障处理
| 现象 | 处理 |
|---|
| 温度高但风扇不转 | 检查风扇电源线 / 更换风扇模组 |
| 温度高但风速低 | BIOS 清灰 / 更换轴承老化风扇 |
| 温度高、风速高仍降频 | 更换硅脂 / 检查散热器接触 |
| 多卡温差 > 15°C | 检查风道 / 调整卡间距 |
第四层:显存与计算层(ECC 错误)
3.4.1 ECC 错误查询
# 查看 ECC 统计
nvidia-smi -q -d ECC
# 或
nvidia-smi ecc --error-correcting-code-config
# 关键字段:
# - Aggregate ECC Errors
# - Single Bit: 可纠正,监控即可
# - Double Bit: 不可纠正,立即更换
3.4.2 显存压力测试
# 显存满载测试(触发潜在故障)
./gpu_burn 600 -m 100% # 10 分钟满载
# 同时监控
watch -n 5 'nvidia-smi -q -d ECC,MEMORY | grep -A5 "ECC Errors"'
3.4.3 ECC 错误处理流程
发现 SBE(单比特错误)
│
├── 错误数 < 10/天 ──→ 监控,记录趋势
│
└── 错误数 > 10/天 或持续增长
│
▼
运行显存压力测试 30 分钟
│
├── 测试期间无新增 ──→ 继续监控
│
└── 测试期间新增或出现 DBE
│
▼
标记故障卡 → 隔离任务 → 申请更换
3.4.4 显存行重映射(Row Remapping)
# 查看重映射状态
nvidia-smi -q | grep -A10 "Row Remapper"
# 关键字段:
# - Remapping Failure: Yes = 显存物理损坏,必须换卡
# - Remapped Rows: 计数持续增长 = 老化预警
第五层:软件与应用层
3.5.1 CUDA 与驱动兼容性
# 查看 CUDA 版本
nvcc --version
cat /usr/local/cuda/version.json 2>/dev/null || ls /usr/local/cuda*
# 兼容性矩阵(关键)
# CUDA 12.x 需要驱动 >= 525.60.13
# CUDA 11.8 需要驱动 >= 450.80.02
# 若应用报 CUDA error 35 / 999
# = 驱动/CUDA/应用版本三角不匹配
3.5.2 应用级调试
# CUDA 内存检查
cuda-memcheck ./your_app
# Nsight 详细分析
nsys profile -t cuda,nvtx,osrt -o report.qdrep ./your_app
ncu --metrics sm__throughput.avg.pct_of_peak_sustained_elapsed ./your_app
四、故障定位速查命令集
# ========== 30 秒快速诊断 ==========
nvidia-smi # 基础状态
nvidia-smi -q | grep -E "Serial|Product|Temp|Power|ECC|Remap" # 关键信息
dmesg | tail -50 | grep -iE "nvidia|pcie|error|warn" # 内核日志
lspci | grep -i nvidia # 硬件识别
sudo ipmitool sel list | grep -iE "gpu|pcie|temp|fan" # 带外日志
# ========== 深度诊断 ==========
nvidia-smi -q -d ECC,TEMPERATURE,PERFORMANCE,POWER,CLOCK,PCIE # 全维度
cat /proc/driver/nvidia/gpus/*/information # 每卡详情
sudo nvidia-bug-report.sh # 官方诊断脚本
# ========== 压力验证 ==========
./gpu_burn 300 -m 100% # 核心+显存满载
./gpu_burn 600 # 长时间稳定性
五、典型故障案例
案例 1:训练中途 loss 突变为 NaN
| 排查 | 结果 |
|---|
nvidia-smi -q | ECC SBE 计数 10万+ |
| 显存压力测试 | 10 分钟内新增 50 个 SBE |
| 根因 | 显存老化,偶发位翻转 |
| 处理 | 隔离该卡,更换后正常 |
案例 2:8 卡集群随机掉卡
| 排查 | 结果 |
|---|
lspci -vv | 掉线卡显示 LnkSta: Speed 2.5GT/s, Width x4 |
| 正常卡 | LnkSta: Speed 16GT/s, Width x16 |
| 根因 | PCIe 延长线接触不良,协商降级 |
| 处理 | 重插线缆,固定卡扣,正常 |
案例 3:新装机 nvidia-smi 无输出
| 排查 | 结果 |
|---|
dmesg | NVRM: The NVIDIA probe routine was not called |
secureboot | BIOS 中 Enabled |
| 根因 | Secure Boot 阻止未签名驱动 |
| 处理 | BIOS 关闭 Secure Boot,正常 |
六、预防性维护建议
| 周期 | 动作 | 工具 |
|---|
| 每日 | 监控 ECC 错误趋势 | nvidia-smi -q + Prometheus |
| 每周 | 温度/功耗基线对比 | nvidia-smi dmon |
| 每月 | 压力测试验证稳定性 | gpu_burn 600 |
| 每季 | 物理清灰,硅脂检查 | 目视 + 温度压测 |
| 每年 | 全卡 ECC 清零,趋势分析 | nvidia-smi --ecc-reset |