verl¶
verl 是一个灵活、高效且被广泛使用的强化学习(RL)训练库,专为大型语言模型(LLM)设计。
verl 是论文 HybridFlow: A Flexible and Efficient RLHF Framework 的开源实现
仓库地址:verl
verl 的灵活性和易用性体现在以下几个方面:
支持多样化的强化学习算法扩展:verl 采用混合编程模型,结合了单一控制器和多控制器的优势,能够灵活表示和高效执行复杂的后训练数据流。用户只需几行代码即可构建强化学习数据流,例如 PPO、GRPO 等。
与现有大语言模型基础设施无缝集成:verl 通过模块化 API 解耦计算和数据依赖,支持与 PyTorch FSDP、Megatron-LM、vLLM 等现有大语言模型框架无缝集成,且用户可以轻松扩展到其他训练和推理框架。
灵活的设备映射和并行性:verl 支持将模型放置到不同 GPU 集合上,以实现高效的资源利用和跨不同集群规模的可扩展性。
与热门 HuggingFace 模型的及时集成:verl 支持多种流行的 LLM 模型,包括 Qwen、Llama 等。
verl 的高效性体现在以下几个方面:
最高效的吞吐量:verl 集成了最先进的 LLM 训练和推理引擎,并实现了最先进的强化学习(RL)吞吐量。
使用 3D-HybridEngine 实现高效的 Actor 模型分片:消除内存冗余,并显著减少训练和生成阶段转换期间的通信开销。
接下来,我们将介绍如何使用 verl 训练 Qwen3 模型。
强化学习(RL)¶
现在,verl 支持多种训练框架和推理框架的组合,包括 FSDP、Megatron-LM、vLLM、SGLang 等。此外,verl 还支持使用多种算法进行训练,例如 PPO、GRPO、DAPO 等。
第一步:环境和训练准备¶
你可以按照 verl 的 安装指南 完成环境配置。
数据准备可以通过运行以下命令完成:
git clone https://github.com/volcengine/verl.git
cd verl
python3 examples/data_preprocess/gsm8k.py --local_dir ~/data/gsm8k
模型下载可以使用以下命令完成:
python3 -c "import transformers; transformers.pipeline('text-generation', model='Qwen/Qwen3-1.7B')"
第二步:开始训练¶
在 verl 中,训练框架和推理框架可以自由组合,只要训练框架和推理框架本身支持模型训练和推理任务,verl 就能够支持与强化学习(RL)相关的训练。
以下是一个使用 FSDP 和 vLLM 的示例,展示如何在 verl 中训练 Qwen3 模型。我们选择了Qwen3-1.7B作为例子,因为他仅需使用一张80GB显存的显卡,以及大于64G内存的机器即可开始训练。
python3 -m verl.trainer.main_ppo \
algorithm.adv_estimator=grpo \
data.train_files=$HOME/data/gsm8k/train.parquet \
data.val_files=$HOME/data/gsm8k/test.parquet \
data.train_batch_size=1024 \
data.max_prompt_length=512 \
data.max_response_length=1024 \
data.filter_overlong_prompts=True \
data.truncation='error' \
actor_rollout_ref.model.path=Qwen/Qwen3-1.7B \
actor_rollout_ref.actor.optim.lr=1e-6 \
actor_rollout_ref.model.use_remove_padding=True \
actor_rollout_ref.actor.ppo_mini_batch_size=80 \
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=20 \
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.actor.entropy_coeff=0 \
actor_rollout_ref.model.enable_gradient_checkpointing=True \
actor_rollout_ref.actor.fsdp_config.param_offload=False \
actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \
actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=20 \
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=3 \
actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=20 \
actor_rollout_ref.ref.fsdp_config.param_offload=True \
algorithm.use_kl_in_reward=False \
trainer.critic_warmup=0 \
trainer.logger=['console'] \
trainer.project_name='verl_grpo_example_gsm8k' \
trainer.experiment_name='qwen3_1_7b_function_rm' \
trainer.n_gpus_per_node=1 \
trainer.nnodes=1 \
trainer.save_freq=-1 \
trainer.test_freq=5 \
trainer.total_epochs=15 $@
结束语¶
如果在使用过程中遇到任何困难,请在 GitHub 参与讨论。