训练稳定性与 NaN 排查
1. 常见不稳定现象
- loss 突然变为 NaN/Inf
- 梯度范数爆炸
- 训练集下降、验证集随机震荡
- 指标长期不提升(学习停滞)
2. 排查顺序(建议按此执行)
- 数据检查:空值、异常值、标签越界、分布漂移。
- 前向检查:逐层打印激活均值/方差,定位爆炸层。
- 反向检查:记录梯度范数与参数更新幅度。
- 优化器检查:学习率是否过大、weight decay 是否错误。
- 数值精度检查:FP16/BF16 是否触发下溢/上溢。
3. 梯度监控代码
def grad_norm(model):
total = 0.0
for p in model.parameters():
if p.grad is not None:
total += p.grad.data.norm(2).item() ** 2
return total ** 0.5
# 训练循环中
loss.backward()
gn = grad_norm(model)
if gn > 1e3:
print(f"[warn] large grad norm: {gn:.2f}")
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
4. 复现性基线
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)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
5. 建议的稳定性“保底配置”
- AdamW + 线性 warmup
- grad clip = 1.0
- label smoothing(分类任务)
- 混合精度 + 自动 loss scaling
- 每 N step 保存 checkpoint 防止回滚损失过大