LLM 训练故障排查手册:30 个真实案例与解决方案
千卡集群训练,故障是常态。本文汇总 30 个真实案例,帮你快速定位和解决。
一、NCCL 通信问题(最高发)
案例 1:NCCL 超时
现象: 训练中途报错 "NCCL watchdog timeout"
排查步骤:
ibstat 看 IB 状态nvidia-smi topo -mNCCL_DEBUG=INFO解决方案:
bash
# 增加超时时间
export NCCL_TIMEOUT=3600
# 关闭 P2P(某些场景)
export NCCL_P2P_DISABLE=1
# 调整 socket 缓冲区
export NCCL_SOCKET_BUFFSIZE=262144案例 2:多机训练卡住
现象: 单机正常,多机训练卡在第一步
原因: 防火墙阻止 NCCL 通信
解决: 开放 NCCL 端口(默认 30000+)
bash
# 确认主节点 IP
export NCCL_SOCKET_IFNAME=eth0
# 指定端口范围
export NCCL_NET_PLUGIN=none二、显存问题
案例 3:OOM 错误
现象: "CUDA out of memory"
排查:
python
print(f"Allocated: {torch.cuda.memory_allocated()/1e9:.2f}GB")
print(f"Max allocated: {torch.cuda.max_memory_allocated()/1e9:.2f}GB")解决方案(按优先级):
案例 4:显存泄漏
现象: 显存使用持续增长
排查:
python
import gc
gc.collect()
torch.cuda.empty_cache()常见原因:
- 未 detach 的 tensor 被保留
- 循环中累积 loss(要用 loss.item())
- 数据加载器未正确释放
三、梯度问题
案例 5:梯度爆炸
现象: loss 突然飙升到 NaN
解决:
python
# 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 检查梯度
for name, param in model.named_parameters():
if param.grad is not None:
print(f"{name}: {param.grad.norm()}")案例 6:梯度不更新
现象: loss 不下降,参数不变
排查:
python
# 检查 requires_grad
for name, param in model.named_parameters():
print(f"{name}: {param.requires_grad}")
# 检查 optimizer 参数
print(optimizer.param_groups[0]['params'])常见原因:
- 参数 requires_grad=False
- optimizer 未包含所有参数
- 忘记调用 optimizer.step()
四、数据问题
案例 7:数据加载慢
现象: GPU 利用率低(<50%)
解决:
python
dataloader = DataLoader(
dataset,
num_workers=8,
pin_memory=True,
prefetch_factor=2,
persistent_workers=True
)案例 8:数据分布不均
现象: 某些 batch loss 异常高
排查:
python
# 检查序列长度分布
lengths = [len(x) for x in dataset]
print(f"Min: {min(lengths)}, Max: {max(lengths)}, Mean: {sum(lengths)/len(lengths)}")解决: 按长度排序或分桶
五、分布式训练问题
案例 9:多机不同步
现象: 各卡 loss 不一致
原因: 随机种子未统一
解决:
python
import random
import numpy as np
import torch
seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)案例 10:主节点挂掉
现象: rank 0 崩溃,全部重启
解决: 启用弹性训练(Elastic Training)
bash
torchrun --nnodes=1:8 --nproc_per_node=8 train.py六、快速排查清单
训练前检查:
- [ ] GPU 状态正常(nvidia-smi)
- [ ] NCCL 测试通过(nccl-tests)
- [ ] 显存充足
- [ ] 数据可访问
- [ ] 随机种子设置
- [ ] GPU 利用率 > 80%
- [ ] 显存使用稳定
- [ ] loss 正常下降
- [ ] 梯度范数正常(0.1-10)
七、学习大鳄的经验
"80% 的训练故障是通信和数据问题,15% 是显存问题,5% 是代码 bug。按这个顺序排查,效率最高。"
必备工具:
- nvidia-smi / nvtop(GPU 监控)
- NCCL_DEBUG=INFO(通信调试)
- PyTorch Profiler(性能分析)
- WandB(训练监控)
*生成时间:2026-04-05 | 模板:故障排查 | 学习大鳄出品*