开源大模型训练时出现NaN值的排查方法总结

Diana73 +0/-0 0 0 正常 2025-12-24T07:01:19 大模型微调

在开源大模型训练过程中,NaN值问题是一个常见但棘手的故障。本文将从多个维度系统性地分析和排查方法。

现象描述 训练过程中loss突然变为NaN,模型权重出现异常值,或者梯度爆炸导致数值溢出。这通常出现在大规模模型训练、混合精度训练或数据预处理不当的情况下。

排查步骤

  1. 检查输入数据
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))}")
  1. 验证损失函数
# 确保输入到loss的值有效
assert not torch.isnan(loss).any(), "Loss contains NaN"
assert not torch.isinf(loss).any(), "Loss contains Inf"
  1. 调整学习率
# 使用较小的学习率测试
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
  1. 启用梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

最佳实践建议

  • 在训练前进行数据清洗,确保无缺失值或异常值
  • 使用梯度裁剪防止梯度爆炸
  • 逐步增加batch size和学习率,避免突变
  • 考虑使用混合精度训练时的loss scaling策略

通过这些方法论,可以有效减少NaN问题的发生,提升训练稳定性。

推广
广告位招租

讨论

0/2000
Heidi260
Heidi260 · 2026-01-08T10:24:58
遇到NaN别急着调参,先检查数据源头。我之前就是没做np.isnan校验,结果训练几天后loss直接变NaN,排查半天才发现是某个batch里有异常值。
软件测试视界
软件测试视界 · 2026-01-08T10:24:58
学习率调得太猛是大忌,建议从1e-5开始试,别怕慢。我见过不少项目因为lr跳到1e-2直接炸掉,梯度裁剪+小lr才是王道。
MadDragon
MadDragon · 2026-01-08T10:24:58
混合精度训练确实香,但loss scaling不注意也会出问题。我之前没调整scaling factor,结果梯度爆炸直接让模型权重变成inf。
Xavier463
Xavier463 · 2026-01-08T10:24:58
建议加个loss断言保护,训练时每epoch打印一下loss是否含NaN,早发现早止损。别等到模型完全崩了才回过神来。