现场是这样的。从 checkpoint 恢复训练后,学习率曲线从头开始衰减,等效于又跑了一遍预热,模型效果明显回退。
中间走过弯路,把「总步数与原来不一致,调度曲线重新计算」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。只加载了权重,没有恢复优化器与调度器状态;resume_from_checkpoint 传了路径但训练参数被覆盖;续训脚本新建了训练器,状态全部重置。
第一件事是用训练器自带的续训入口
trainer.train(resume_from_checkpoint='./out/checkpoint-500')
然后确认目录里有优化器与调度器状态
python -c "import os;print(sorted(os.listdir('./out/checkpoint-500')))"
保持总训练轮数与原来一致
python train.py --num_train_epochs 3 --resume ./out/checkpoint-500
末了打印恢复后的学习率做核对
print(trainer.lr_scheduler.get_last_lr())
别只看报错消失,验证要多做一步。续训后学习率从断点处的值继续衰减,loss 曲线与前一段平滑衔接,不再出现二次预热。
提醒一点。只有权重没有优化器状态的检查点无法精确续训,看起来能跑但训练动态已经变了,重要实验要保留完整状态。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。