3分钟解决LLM训练中断:Verl检查点恢复全攻略
在大语言模型(LLM)强化学习训练过程中,你是否遇到过因机器故障、资源限制或意外中断导致数天训练成果付诸东流的情况?Verl(Volcano Engine Reinforcement Learning for LLMs)提供了完善的检查点(Checkpoint)机制,让你能够轻松恢复训练进度,最大限度减少损失。本文将详细介绍如何在Verl项目中配置、使用和管理检查点,确保训练过程的可靠性和连续性。
3分钟解决LLM训练中断:Verl检查点恢复全攻略
在大语言模型(LLM)强化学习训练过程中,你是否遇到过因机器故障、资源限制或意外中断导致数天训练成果付诸东流的情况?Verl(Volcano Engine Reinforcement Learning for LLMs)提供了完善的检查点(Checkpoint)机制,让你能够轻松恢复训练进度,最大限度减少损失。本文将详细介绍如何在Verl项目中配置、使用和管理检查点,确保训练过程的可靠性和连续性。
检查点工作原理与目录结构
Verl的检查点机制通过定期保存模型权重、优化器状态和训练元数据,实现训练过程的容错和断点续训。检查点默认保存在checkpoints/${trainer.project_name}/${trainer.experiment_name}目录下,具体结构因训练后端(FSDP或Megatron)而异。
FSDP后端检查点结构
FSDP(Fully Sharded Data Parallel)后端的检查点采用分布式存储方式,将模型和优化器状态按_rank_分片保存:
checkpoints/${trainer.project_name}/${trainer.experiment_name}
├── global_steps_${i}
│ ├── actor
│ │ ├── huggingface # 保存配置和分词器
│ │ ├── fsdp_config.json # FSDP配置文件
│ │ ├── model_world_size_{self.world_size}_rank_{self.rank}.pt
│ │ ├── optim_world_size_{self.world_size}_rank_{self.rank}.pt
│ │ └── extra_state_world_size_{self.world_size}_rank_{self.rank}.pt
│ ├── critic
│ │ └── ... (同上)
│ └── latest_checkpointed_iteration.txt
Megatron后端检查点结构
Megatron后端的检查点结构与FSDP类似,但采用了不同的分片命名方式:
checkpoints/${trainer.project_name}/${trainer.experiment_name}
├── global_steps_${i}
│ ├── actor
│ │ ├── huggingface # 保存配置和分词器
│ │ └── dist_ckpt # 保存分片模型/优化器/rng_states
│ ├── critic
│ │ └── ... (同上)
│ └── latest_checkpointed_iteration.txt
详细的检查点配置参数可参考官方文档:检查点配置说明
检查点配置与启用
要启用检查点功能,需要在训练配置文件(如ppo_trainer.yaml或ppo_megatron_trainer.yml)中设置相关参数。以下是一个典型的检查点配置示例:
checkpoint:
enable: true
save_interval: 1000 # 每1000步保存一次检查点
max_num_checkpoints: 5 # 最多保留5个检查点
contents: ["model", "optimizer", "extra"] # 保存模型、优化器和额外状态
default_local_dir: "checkpoints/${trainer.project_name}/${trainer.experiment_name}" # 检查点保存路径
注意:对于FSDP后端,
checkpoint.contents字段除hf_model外均无效,模型、优化器和额外状态会被绑定保存。建议始终包含这三项内容以确保恢复的完整性。
从检查点恢复训练
当训练中断后,只需在启动训练命令时指定--load_checkpoint参数即可从最近的检查点恢复训练:
# 从最近的检查点恢复训练
python -m verl.trainer.grpo_trainer --config configs/grpo/qwen2-7b-math.yaml --load_checkpoint
# 从特定检查点恢复训练
python -m verl.trainer.grpo_trainer --config configs/grpo/qwen2-7b-math.yaml --load_checkpoint checkpoints/my_project/my_experiment/global_steps_1000
恢复训练的内部流程
- 训练器启动时检查
--load_checkpoint参数 - 读取
latest_checkpointed_iteration.txt确定最新检查点 - 加载模型权重、优化器状态和训练元数据
- 从检查点记录的全局步数继续训练
训练器实现代码:grpo_trainer.py
检查点转换与模型合并
Verl提供了工具将FSDP和Megatron格式的检查点转换为HuggingFace格式,方便模型部署和共享。转换工具位于verl/model_merger,支持merge(转换保存)和test(验证)两个子命令。
FSDP检查点转换示例
python -m verl.model_merger merge \
--backend fsdp \
--local_dir checkpoints/verl_fsdp_gsm8k_examples/qwen2_5_0b5_fsdp_saveload/global_step_1/actor \
--target_dir /path/to/merged_hf_model
Megatron检查点转换示例
python -m verl.model_merger merge \
--backend megatron \
--tie-word-embedding \
--local_dir checkpoints/verl_megatron_gsm8k_examples/qwen2_5_0b5_megatron_saveload/global_step_1/actor \
--target_dir /path/to/merged_hf_model
对于超大型模型,还支持分布式合并:
torchrun --nproc_per_node 1 --nnodes 8 --node_rank ${RANK} -m verl.model_merger merge \
--backend megatron \
--tie-word-embedding \
--local_dir checkpoints/verl_megatron_gsm8k_examples/qwen2_5_0b5_megatron_saveload/global_step_1/actor \
--target_dir /path/to/merged_hf_model
旧版本Verl用户请使用遗留模型合并工具:legacy_model_merger.py
高级技巧:HuggingFace模型转Megatron分布式检查点
对于大型模型,推荐使用Megatron分布式检查点进行加载,支持多种模型并行策略且加载速度更快。可使用scripts/converter_hf_to_mcore.py脚本将HuggingFace模型转换为Megatron格式:
# 转换普通模型
python scripts/converter_hf_to_mcore.py \
--hf_model_path Qwen/Qwen1.5-MoE-A2.7B-Chat \
--output_path /mnt/disk/Qwen/Qwen1.5-MoE-A2.7B-Chat
# 分布式转换超大型模型(如DeepSeek-V3 671B)
torchrun --nproc_per_node 1 --nnodes 8 --node_rank ${RANK} scripts/converter_hf_to_mcore.py \
--hf_model_path deepseek-ai/DeepSeek-V3 \
--output_path /mnt/disk/deepseek-ai/DeepSeek-V3 \
--use_cpu_initialization # 仅对MoE模型有效
常见问题与解决方案
问题1:恢复训练后损失值异常波动
可能原因:检查点未包含完整的优化器状态或训练元数据。
解决方案:确保配置中checkpoint.contents包含model、optimizer和extra三项,并使用最新版本的Verl。
问题2:检查点文件过大,磁盘空间不足
解决方案:
- 增加
save_interval减少检查点保存频率 - 减少
max_num_checkpoints限制保留的检查点数量 - 使用
--use_cpu_initialization选项进行CPU初始化(仅对MoE模型有效)
问题3:分布式环境下检查点加载失败
可能原因:存储集群无法被所有计算节点访问。
解决方案:使用原始检查点工具中的[model]_loader_deprecated实现,尽管这可能导致更高的内存占用和OOM风险。
更多常见问题:FAQ文档
总结与最佳实践
- 定期保存:根据训练稳定性设置合理的
save_interval,建议每1000-5000步保存一次 - 完整备份:始终保存模型、优化器和额外状态,避免恢复时出现问题
- 合理清理:设置
max_num_checkpoints自动清理旧检查点,节省磁盘空间 - 验证检查点:定期使用
verl.model_merger test验证检查点完整性 - 分布式合并:对于超大型模型,使用分布式转换工具提高效率
通过合理配置和使用Verl的检查点机制,你可以有效避免训练中断带来的损失,显著提高LLM强化学习训练的可靠性和效率。
官方检查点文档:checkpoint.rst
检查点工具源码:model_merger/
训练示例脚本:grpo_trainer/
更多推荐
所有评论(0)