背景说明
- DeepSeek系列解读请移步我的上一篇blog:【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)
- 代码仓库【科大的大四老哥太太太太太值得倾佩了】:https://github.com/Unakar/Logic-RL
- DeepSeek-R1-Zero复现文档:https://evxpwrsfkdb.feishu.cn/docx/NokEdaMBmo6aqZxVdxkcSm2cnab
- 趁着DeepSeek火起来的这个风口,自己抓紧学习一下大模型的基础知识,慢慢把之前积累的一些东西串起来
- 非常佩服科大的老哥,前途无量,正好我来学习一下大模型训练过程,看下有哪些训练坑和经验值得总结
基本设置
- 训练算法:DeepSeek-R1-Zero纯RL训练(无long CoT、SFT和蒸馏过程)
- Base model:Qwen/Qwen2.5-7B-Instruct-1M(huggingface传送门)
- 训练脚本执行:
bash main_grpo.sh
RL训练过程
第一阶段:正确的格式学习(3PPL数据集)
-
训练400个step
-
wandb file:run-20250207_161945-1oftdu9q
-
main_grpo.sh脚本配置如下:
set -x MODEL_PATH='Qwen2.5-7B-Instruct-1M' export VLLM_ATTENTION_BACKEND=XFORMERS python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ data.train_files=data/kk/instruct/3ppl/train.parquet \ data.val_files=data/kk/instruct/3ppl/test.parquet \ data.train_batch_size=2 \ data.val_batch_size=4 \ data.max_prompt_length=400 \ data.max_response_length=2048 \ actor_rollout_ref.model.path=$MODEL_PATH \ actor_rollout_ref.actor.optim.lr=3e-7 \ actor_rollout_ref.model.use_remove_padding=True \ actor_rollout_ref.actor.ppo_mini_batch_size=256 \ actor_rollout_ref.actor.ppo_micro_batch_size=64 \ actor_rollout_ref.actor.use_kl_loss=True \ actor_rollout_ref.actor.kl_loss_coef=0.001 \ actor_rollout_ref.actor.kl_loss_type=low_var_kl \ actor_rollout_ref.model.enable_gradient_checkpointing=True \ actor_rollout_ref.actor.fsdp_config.param_offload=True \ actor_rollout_ref.actor.fsdp_config.grad_offload=True \ actor_rollout_ref.actor.fsdp_config.optimizer_offload=True \ actor_rollout_ref.rollout.log_prob_micro_batch_size=160 \ actor_rollout_ref.rollout.tensor_model_parallel_size=1 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \ actor_rollout_ref.rollout.n=16 \ actor_rollout_ref.ref.log_prob_micro_batch_size=160 \ actor_rollout_ref.ref.fsdp_config.param_offload=True \ algorithm.kl_ctrl.kl_coef=0.001 \ trainer.critic_warmup=0 \ trainer.logger=['wandb'] \ trainer.project_name='GRPO_logic_KK' \ trainer.experiment_name='Qwen-7B' \ trainer.n_gpus_per_node=2 \ trainer.nnodes=1 \ trainer.default_local_dir=local_dir \ trainer.default_hdfs_dir=null \ trainer.save_freq=10 \ trainer.test_freq=10 \ trainer.total_epochs=1 $@ 2>&1 | tee grpo.log
验证集:效果逐渐变好
平均reward、答案错误的比例、全对的比例、格式错误比例:前三者趋势正确,但是变化不大,格式错误大幅降低!因为这一步主要是在简单的3PPL数据上学格式,大约10个step可以将格式错误降到0.1以下
平均生成长度:有少量增长,但并不明显,应该是还在第一阶段的问题
再看一下生成答案过程中的一些特点:
再看一下出现的格式错误具体原因:
还出现了不同程度的语言混杂问题: