训练监控、断点与续训

04-训练实操 核心≈ 20 分钟 #监控#断点续训#loss 曲线 reviewed
我的状态:

前置知识点

一句话定义

训练监控回答「现在训练健康吗」,断点续训回答「崩了/停了怎么接着跑」——两者共同保证几小时到几天的训练投入不会白费。

为什么重要

微调训练动辄数小时,无人值守时一个第 200 步的 NaN 若到第 3000 步才被发现,浪费的是一整个晚上;而「训到 80% 断电」没有续训能力就等于从零再来。会看曲线的人能在前 100 步预判这次训练的成败。

前置知识

kp-015 已跑通训练循环;kp-016 的学习率调度与步数概念。

核心概念

  • train loss:训练损失曲线,整体健康度的主指标。
  • eval loss:留出验证集上的损失,过拟合检测的依据。
  • grad norm:梯度范数,数值稳定的哨兵(inf/NaN=崩,长期 0=没在学)。
  • 学习率曲线:确认 warmup 与调度按预期执行。
  • 定期生成抽查(sanity generation):每 N 步用固定几条样本生成文本,肉眼看行为变化。
  • checkpoint:模型 + 优化器状态 + 调度器 + RNG 状态的完整快照,是续训的依据。

原理与机制

健康曲线的形态学:train loss 应在前 10% 步内快速下降后趋缓;eval loss 同步下降,若 train 降而 eval 升即过拟合拐点(早停点);grad norm 初期较大后收敛到稳定量级,偶发尖峰后恢复属正常,持续飙升或归零是故障。健康判据示例:logging_steps=10,每 100 步做一次 eval,每 500 步生成 3 条样本。

断点续训的机制:checkpoint 不只存模型权重,还存优化器动量、学习率调度器进度、随机数状态——少任何一样,续训都变成「另一个训练」。因此 resume_from_checkpoint 必须配合与原任务完全相同的总步数配置(epochs、B_eff),否则调度器会按新配置重排 lr 曲线。

图示

loss
 │╲
 │ ╲╲
 │   ╲╲____  train ↓
 │     ╲╲  ╲╲___
 │        ╲╲    ╲╲╲ eval ↓ 升 ← 早停点(过拟合拐点)
 └──────────────────▶ steps
grad norm: 稳定量级=健康 | inf/NaN=崩 | 长期≈0=没在学

直观类比

监控像飞行仪表盘(不看仪表的飞行靠运气),断点像游戏存档(存档必须包含角色状态、地图进度、随机种子,读档后才是「同一局游戏」)。

实例或案例

一晚上 6 小时的 14B QLoRA 训练:设置 save_steps=500、每 100 步 eval。第 3 小时 eval loss 从 1.02 拐头向上——早停信号;训练照常跑完(有 checkpoint 兜底),最终加载的是第 2500 步的 checkpoint 而非最后一步,评测分比最后一步高 4 个点。另一次训练第 1800 步 NaN,用 resume_from_checkpoint 从 1500 步恢复,降 lr 后完成。

操作步骤

args=SFTConfig(
    output_dir="out",
    logging_steps=10,
    eval_strategy="steps", eval_steps=100,
    save_steps=500, save_total_limit=3,
    load_best_model_at_end=True,
    metric_for_best_model="eval_loss",
)
trainer.train(resume_from_checkpoint=True)  # 续训

配套:TensorBoard tensorboard --logdir out/runs 本地看曲线;训练脚本外套进程监控,NaN 时自动停。

排错清单

  • 续训后 lr 曲线异常:改了 epochs 或 batch 配置导致总步数变化,续训必须沿用原配置。
  • 断点恢复后结果不可复现:save 间隔内 RNG 状态未随 checkpoint 保存(确认 save_full 相关选项)。
  • eval loss 比 train loss 高很多且两者都降:正常(eval 集分布略异);高很多且 train 不降:数据泄漏或验证集错位。
  • 磁盘被 checkpoint 塞满:save_total_limit 限制保留数量。
  • 无 GPU 时想看曲线:TensorBoard 读取日志目录即可,不需要训练环境。

常见误区

  • 只看最终 loss 不看曲线:曲线形态携带「何时收敛、是否过拟合、是否异常」的全部信息。
  • checkpoint 只存模型:手工只保存权重的续训会丢优化器状态,等效于用脏动量重新出发。
  • 早停看 train loss:早停依据是 eval loss 的拐点,train loss 几乎总在降。

与其他知识点的关系

超参如何影响曲线形态见 kp-016;NaN 的精度病根见 kp-018;eval 集怎么建见 kp-025;曲线异常的系统诊断见 kp-030。

延伸阅读

本节不适用:监控与续训是框架工程实践,参考 HF Trainer 文档的 Trainer/checkpoint 章节。

自测题

  1. train loss 降、eval loss 升,该做什么?

答:出现过拟合拐点,取 eval loss 最低的 checkpoint 作为产出(load_best_model_at_end),必要时减 epoch 或增数据。

  1. 完整 checkpoint 里除了模型权重还有什么?

答:优化器状态、学习率调度器进度、RNG 状态、 Trainer 进度——少一样都无法忠实续训。

  1. 为什么续训必须沿用原任务的总步数配置?

答:调度器按总步数预排 lr 曲线,改配置等于换了一条曲线,续训起点处 lr 会突变。

相关知识点