训练问题诊断#
本页内容6 个部分
1. 先保留证据,再改配置#
异常发生时,记录 step、数据批次或可复现标识、有效 token 分母、学习率、loss、裁剪前梯度范数、AMP scale、是否跳步与 checkpoint。对比正常区间的同口径指标;单个 spike 或高范数不足以确定原因。
先在可控输入上复现,再每次只改变一个主要因素。恢复训练时同时恢复模型、optimizer、scheduler、scaler 和数据进度,避免只载入模型权重却换了更新状态。
2. Loss spike、NaN 与 OOM 怎样定位#
| 现象 | 先检查 | 再做什么 |
|---|---|---|
| 单批 loss 突升 | 异常样本、有效 token 数、标签与截断 | 固定该批复算,比较样本级 loss 与正常批 |
| loss 与梯度同步失控 | 学习率变动、初始化、裁剪前范数 | 小范围降低步幅,检查是否频繁裁剪 |
| 前向已出现 NaN/Inf | 输入、logits、归一化与自定义算子 | 定位首个非有限张量,比较较高精度计算 |
| 前向正常但反向溢出 | scaled/unscaled 梯度、AMP scale | 核对 loss scaling 与累积边界,检查跳步 |
| OOM 随长度或 batch 增加 | 激活、attention、临时缓冲 | 减小 microbatch 或长度,测量重算的峰值与耗时 |
| 初始模型状态已放不下 | 参数、梯度与 optimizer 状态 | 检查分片、offload 或参数高效微调 |
裁剪限制梯度幅度,不能修复非有限值或错误数据。BF16 也不能自动修复前向溢出。回退 checkpoint 前先保存异常证据;是否跳过数据应有明确质量依据,不能系统地排除困难样本而改变目标分布。
3. 用训练与验证对照定位泛化问题#
3.1 训练改善、验证退化#
先核对两边的 loss 定义、预处理、eval 模式和样本分布,再判断是否过拟合。准确率接近 100% 本身不构成过拟合的充分条件。
3.2 针对验证退化做对照#
尝试减少步数、改进数据覆盖、去重或增加合适的正则化;改变容量或 rank 后记录预算。早停阈值应结合验证频率与噪声确定,不能跨任务固定几个 epoch。
3.3 两边都不改善#
可能是容量或预算不足,也可能是损失、标签、学习率或实现错误。先尝试在极小干净训练集上拟合,检查参数是否更新、梯度是否为零、loss 分母是否正确。
3.4 确认实现后再增加预算#
确认训练链可工作后,分别比较训练更久、调整学习率、增加容量的收益;不要一看到 loss 平坦就直接加大学习率。LoRA 特有的插入模块、首步梯度与数据模板见微调诊断。
4. 把调参变成可解释的比较#
固定模型版本、数据切分与评价方式,先确定总 token、有效 batch 和训练步数的关系,再调学习率与调度。每次改变配置,保留验证曲线和失败证据。LoRA 候选参数由实践篇维护,不在这里重复一份表。
监控指标用于继续定位具体层、激活和路由;计算器用于预算核对,输出的经验学习率不能代替对照实验。
5. 数据检查的最小范围#
检查标签与输入是否对齐、训练与验证是否泄漏、重复数据是否改变采样权重、过滤规则是否误删目标领域,以及合成数据中是否含系统性错误。预训练的数据配比与去重策略由模型预训练专题维护;本页只在定位训练异常所需的范围内回顾。
参考资料#
- PyTorch AMP examples:溢出检查、跳步与梯度处理。
- PaLM,§4:训练不稳定与恢复的案例;具体策略受原训练配置约束。