在开源大模型训练过程中,NaN值问题是一个常见但棘手的故障。本文将从多个维度系统性地分析和排查方法。
现象描述 训练过程中loss突然变为NaN,模型权重出现异常值,或者梯度爆炸导致数值溢出。这通常出现在大规模模型训练、混合精度训练或数据预处理不当的情况下。
排查步骤
- 检查输入数据:
import numpy as np
print(f"Data shape: {data.shape}")
print(f"NaN count: {np.sum(np.isnan(data))}")
print(f"Inf count: {np.sum(np.isinf(data))}")
- 验证损失函数:
# 确保输入到loss的值有效
assert not torch.isnan(loss).any(), "Loss contains NaN"
assert not torch.isinf(loss).any(), "Loss contains Inf"
- 调整学习率:
# 使用较小的学习率测试
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
- 启用梯度裁剪:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
最佳实践建议
- 在训练前进行数据清洗,确保无缺失值或异常值
- 使用梯度裁剪防止梯度爆炸
- 逐步增加batch size和学习率,避免突变
- 考虑使用混合精度训练时的loss scaling策略
通过这些方法论,可以有效减少NaN问题的发生,提升训练稳定性。

讨论