Llama-Factory 是否支持增量训练?从检查点恢复的完整实践解析
在大模型微调日益普及的今天,一个看似简单却极为关键的问题浮出水面:训练到一半断了,还能不能接着练?
这不仅是实验室里的学术问题,更是生产环境中的生死命题。一次意外重启、一次资源调度中断,可能意味着几十小时的 GPU 算力付诸东流。尤其是在中小团队缺乏高可用训练集群的情况下,能否'续上'之前的进度,直接决定了项目是否可行。
幸运的是,Llama-Factory 给出了肯定的答案——它不仅支持增量训练,而且实现得相当成熟。通过加载检查点(checkpoint),你可以像打开未保存的文档一样,无缝恢复训练状态。但这背后究竟如何运作?实际使用中又有哪些坑需要避开?我们来深入拆解。
增量训练的本质:不只是'加载权重'那么简单
很多人误以为'继续训练'就是把模型权重读回来再跑几个 epoch。但真实的训练状态远比这复杂得多。
想象一下你在跑步机上跑了 5 公里,突然停电。恢复供电后,机器如果只记得你跑了 5 公里,却不记得你的心率、配速和当前速度,那重新开始时只能从零加速——这不是'继续',而是'重来'。
同理,在深度学习中,真正的'继续训练'必须恢复以下四项核心状态:
- 模型参数:包括主干网络和 LoRA 适配器的权重;
- 优化器状态:如 AdamW 中的动量(momentum)和方差(variance),它们直接影响梯度更新方向;
- 学习率调度器:当前处于 warmup 阶段还是衰减期?
- 数据采样位置:避免重复训练或跳过样本。
而 Llama-Factory 正是基于 Hugging Face Transformers 的 Trainer 框架,完整地实现了这四者的持久化与重建。当你指定 --resume_from_checkpoint 时,系统会自动查找并加载对应目录下的所有必要文件,确保训练过程平滑衔接。
检查点长什么样?一探究竟
当 Llama-Factory 完成一次检查点保存时,你会看到类似这样的结构:
checkpoint-500/
├── config.json
├── pytorch_model.bin # 或 adapter_model.bin(LoRA)
├── optimizer.pt
├── scheduler.pt
├── trainer_state.json
├── training_args.bin
└── rng_state.pth
其中最关键的几个文件分别是:
trainer_state.json:记录了global_step=500、已完成的 epoch 数、最后一步 loss 等元信息;optimizer.pt:保存了每个可训练参数对应的动量和方差张量;scheduler.pt:学习率调度器的状态,比如余弦退火进行到了第几步;rng_state.pth:随机数生成器状态,保证数据打乱顺序一致,提升实验可复现性。
正是这些细节的存在,使得 Llama-Factory 能够做到'断点不丢步'。哪怕你在 step 499 被打断,重启后也会从 step 500 继续,不会多也不会少。
如何真正用好这个功能?实战建议
✅ 推荐做法一:命令行精准控制
最直接的方式是通过 CLI 显式指定检查点路径:
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
--stage sft \
--model_name_or_path /path/to/base/model \
--do_train \
--dataset my_dataset \
--output_dir ./output \
--resume_from_checkpoint ./output/checkpoint-500 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--save_steps 500 \
--logging_steps 10 \
--plot_loss

