大模型断点续训配置:从保存检查点到异常恢复
大模型训练动辄几十小时甚至几天,中途断电、OOM、机器故障都会让训练中断。
断点续训配置的核心就是定期把模型权重、优化器状态和训练步数保存到磁盘,并在重启后从最近的检查点继续训练,而不是从头开始。
本文按零基础可操作的方式,讲清楚保存策略、恢复命令和验证方法。
先确认你的训练框架和检查点机制
不同训练框架的断点续训参数不同,先确认你用的是原生 PyTorch、Hugging Face Transformers Trainer,还是 DeepSpeed 启动。
本文以常见的 transformers + deepspeed 组合为例,系统环境为 Linux,训练脚本通过 torchrun 或 deepspeed 命令启动。
准备条件:
- 训练脚本已能正常启动并跑通前几个 step。
- 有一个可写的持久化目录存放检查点,例如
/data/checkpoints/my_model。 - 确认磁盘剩余空间能容纳至少 2 到 3 个完整检查点(大模型检查点通常包含模型权重、优化器状态和调度器状态,体积较大)。
- 记录当前训练脚本的启动命令和关键参数,后续恢复要用同一套参数。
配置检查点保存:频率和内容都要对
断点续训能否成功,第一步取决于检查点是否保存完整。
在 Transformers Trainer 中,常用参数如下:
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="/data/checkpoints/my_model",
save_strategy="steps",
save_steps=500,
save_total_limit=3,
logging_steps=50,
report_to="none",
# 其他训练参数...
)
关键点说明:
save_strategy="steps":按训练步数保存,而不是按 epoch。大模型一个 epoch 可能很长,按步保存更实用。save_steps=500:每 500 步保存一次。步数太小会频繁写盘拖慢训练,太大则中断后丢失的进度多,建议根据单步耗时和磁盘 IO 权衡。save_total_limit=3:最多保留 3 个检查点,避免磁盘被写满。注意该参数会删除旧检查点,如果磁盘充足可适当调大。output_dir必须指向持久化存储,不要放在/tmp或容器临时层。
如果使用 DeepSpeed,还需要在 DeepSpeed 配置 JSON 中确认检查点相关设置。
DeepSpeed 默认会在 output_dir 下生成 global_stepXXXXXX 目录,里面包含 mp_rank_00_model_states.pt、优化器状态分片等文件。
不要手动修改这些文件名。
中断后恢复训练:命令和参数要一致
训练中断后,先进入检查点目录,确认最新的 global_step 目录存在且文件完整:
ls -lh /data/checkpoints/my_model
# 应看到类似 global_step500、global_step1000 的目录
ls -lh /data/checkpoints/my_model/global_step1000
恢复训练时,在启动命令中加入 --resume_from_checkpoint 参数,指向具体检查点目录:
torchrun --nproc_per_node=8 train.py \
--resume_from_checkpoint /data/checkpoints/my_model/global_step1000 \
--output_dir /data/checkpoints/my_model \
--deepspeed ds_config.json \
# 其他训练参数保持不变
如果使用 deepspeed 命令启动,写法类似:
deepspeed --num_gpus=8 train.py \
--resume_from_checkpoint /data/checkpoints/my_model/global_step1000 \
--output_dir /data/checkpoints/my_model \
--deepspeed ds_config.json
注意:恢复时训练脚本的其他超参数(学习率、batch size、数据路径)应与中断前保持一致,否则可能造成学习率调度错位或数据顺序异常。
常见报错和避坑清单
- 报错找不到
trainer_state.json:说明检查点目录不完整,可能是保存过程中被中断。优先使用上一个完整的global_step目录。 - 恢复后 loss 突然变大:检查是否误用了不同学习率或数据打乱种子,确认
resume_from_checkpoint指向的步数与日志一致。 - DeepSpeed 恢复报
mp_rank文件缺失:通常是保存时进程数变化或文件被清理。不要手动拼接不同检查点的分片文件。 - 磁盘写满导致训练挂起:
save_total_limit不要设得过大,并定期用df -h查看检查点目录所在分区。 - 容器环境重启后检查点丢失:确保
output_dir挂载的是宿主机持久化卷,而不是容器内部路径。
验证续训是否真正生效
恢复后观察训练日志中的 global_step 是否从上次保存的步数继续递增,而不是从 0 开始。
同时查看 loss 曲线是否与中断前平滑衔接。
如果日志显示从 0 开始,说明 resume_from_checkpoint 没有生效,检查参数路径是否写错或启动命令是否被外层脚本覆盖。
最后,建议在正式长跑前用少量数据做一次“手动中断再恢复”的演练,确认检查点目录、恢复命令和磁盘空间都正常,再投入正式训练。
断点续训配置不是一次设置就永远可靠,每次调整训练脚本后都应复查保存和恢复参数是否仍然匹配。