使用 verl 对 Qwen3 进行强化学习(RL)训练:GRPO/PPO 全流程实战指南
【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5
verl 是火山引擎开源的 LLM 强化学习(RL)训练库,也是论文 HybridFlow: A Flexible and Efficient RLHF Framework 的开源实现。本文以 Qwen3 系列模型为核心,完整介绍如何在 verl 中配置环境、准备数据,并通过 FSDP + vLLM 的组合以 GRPO 算法启动 Qwen3-1.7B 的 RL 训练,同时深入解析训练命令中每一个关键参数的作用与取值建议。
verl 是什么:面向 LLM 的灵活、高效、生产级 RL 训练库
verl 是一个专门为大型语言模型(LLM)设计的强化学习训练库,其定位是灵活(flexible)、高效(efficient)且生产就绪(production-ready)。它是论文 HybridFlow: A Flexible and Efficient RLHF Framework、LLaMA-Factory、ms-swift、Unsloth 共同构成 Qwen3 的后训练工具链,参见 docs/source/index.rst 中 Training 目录的编排。
灵活性与易用性
verl 的灵活性和易用性主要体现在以下四个方面:
- 多样化的强化学习算法扩展:verl 采用混合控制器(hybrid-controller)编程模型,融合了单一控制器(single-controller)与多控制器(multi-controller)的优势,能够灵活表示并高效执行复杂的后训练数据流(Post-Training dataflows)。用户只需几行代码即可构建 GRPO、PPO 等强化学习数据流。
- 与现有 LLM 基础设施无缝集成:verl 通过模块化 API 解耦计算与数据依赖,能够与 PyTorch FSDP、Megatron-LM、vLLM、SGLang 等主流 LLM 训练与推理框架无缝集成,且易于扩展至其他框架。
- 灵活的设备映射与并行性:verl 支持将模型放置到不同的 GPU 集合上,实现高效的资源利用,并支持在不同规模的集群上灵活扩展。
- 与热门 HuggingFace 模型即插即用:verl 支持 Qwen、Llama 等主流 LLM 模型,可直接以 HuggingFace 仓库 ID 或本地路径指定模型。
高效性
- 业界领先的吞吐量:verl 集成了先进的 LLM 训练与推理引擎,实现了领先的 RL 吞吐性能。
- 3D-HybridEngine 高效 Actor 重分片:verl 在训练与生成两个阶段切换时,通过 3D-HybridEngine 消除内存冗余,并显著降低通信开销,这是其 RL 吞吐性能的重要来源。
强化学习(RL):支持的多框架组合与多算法
verl 当前支持多种训练框架与推理框架的组合,包括 FSDP、Megatron-LM 与 vLLM、SGLang 等,并支持 PPO、GRPO、DAPO 等多种强化学习算法。这意味着你可以根据自身硬件与业务诉求,自由选择"训练框架 × 推理框架 × RL 算法"的组合。
第一步:环境与训练准备
环境配置请按照 verl 官方安装指南完成。准备阶段通常包含两步:数据准备与模型下载。
数据准备:以 GSM8K 数学推理数据集为例,通过 verl 仓库提供的预处理脚本生成训练所需的标准格式数据:
git clone https://github.com/volcengine/verl.git cd verl python3 examples/data_preprocess/gsm8k.py --local_dir ~/data/gsm8k执行后会在~/data/gsm8k目录下生成train.parquet与test.parquet等文件,供后续训练命令中的data.train_files与data.val_files引用。
模型下载:可直接通过 HuggingFace 的 transformers 管线触发模型下载,例如下载 Qwen3-1.7B:
python3 -c "import transformers; transformers.pipeline('text-generation', model='Qwen/Qwen3-1.7B')"第二步:开始训练
在 verl 中,训练框架与推理框架可以自由组合,只要训练框架和推理框架本身分别支持模型训练与推理任务,verl 即可支撑相应的 RL 训练。官方示例选择了FSDP(训练)+ vLLM(推理)+ GRPO(算法)的组合来训练 Qwen3-1.7B,因为该模型仅需一张 80GB 显存的 GPU,外加内存大于 64GB 的机器即可启动训练。
以下是完整的训练命令:
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 $@该命令以python3 -m verl.trainer.main_ppo作为入口,说明 verl 使用同一个 PPO 训练主程序承载多种算法——通过algorithm.adv_estimator=grpo指定优势估计器(advantage estimator)为 GRPO,即可将同一套 RL 数据流切换到 GRPO 算法;类似地,将其切换为 ppo 即可运行 PPO,这也印证了文档中"几行代码构建 GRPO、PPO 数据流"的设计理念。
数据与模型相关参数解析
| 参数 | 取值 | 作用说明 |
|---|---|---|
data.train_files/data.val_files | $HOME/data/gsm8k/train.parquet/test.parquet | 指定训练与验证数据文件,即第一步预处理生成的 parquet 文件 |
data.train_batch_size | 1024 | 每轮 RL 迭代的全局训练 batch 大小 |
data.max_prompt_length | 512 | prompt 的最大 token 长度,超长样本会被截断或过滤 |
data.max_response_length | 1024 | 模型生成响应(response)的最大 token 长度 |
data.filter_overlong_prompts | True | 是否过滤过长的 prompt 样本,防止超出上下文窗口 |
data.truncation | 'error' | 截断策略;设为error表示当数据超出设定长度时直接报错,而不是静默截断,从而保证数据质量 |
actor_rollout_ref.model.path | Qwen/Qwen3-1.7B | Actor 模型的来源,可以是 HuggingFace 仓库 ID 或本地路径 |
训练端(actor)参数解析
| 参数 | 取值 | 作用说明 |
|---|---|---|
actor_rollout_ref.actor.optim.lr | 1e-6 | Actor 学习率。RL 训练通常采用比 SFT 更小的学习率(如 1e-6 量级)以稳定训练 |
actor_rollout_ref.model.use_remove_padding | True | 训练时移除 padding token,减少无效计算、提升效率 |
actor_rollout_ref.actor.ppo_mini_batch_size | 80 | PPO/GRPO 更新阶段每个 mini-batch 的大小 |
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu | 20 | 每张 GPU 上的微批次大小,用于控制显存占用 |
actor_rollout_ref.actor.use_kl_loss | True | 是否使用 KL 惩罚(KL loss)约束 Actor 与参考模型(ref)的分布差异 |
actor_rollout_ref.actor.kl_loss_coef | 0.001 | KL 惩罚系数,权衡探索与稳定性 |
actor_rollout_ref.actor.kl_loss_type | low_var_kl | KL 损失的计算类型,low_var_kl为低方差变体,有助于稳定训练 |
actor_rollout_ref.actor.entropy_coeff | 0 | 熵奖励(entropy bonus)系数,设置为 0 表示不引入额外的熵正则 |
actor_rollout_ref.model.enable_gradient_checkpointing | True | 开启梯度检查点(activation checkpointing),以计算换显存,降低显存需求 |
actor_rollout_ref.actor.fsdp_config.param_offload | False | 是否将模型参数 offload 到 CPU。训练阶段关闭可保持吞吐;参考模型阶段则开启(见下文) |
actor_rollout_ref.actor.fsdp_config.optimizer_offload | False | 是否将优化器状态 offload 到 CPU,本例关闭以保证训练速度 |
生成端(rollout)与参考模型(ref)参数解析
| 参数 | 取值 | 作用说明 |
|---|---|---|
actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu | 20 | 生成阶段计算 log_prob 时每 GPU 的微批次大小 |
actor_rollout_ref.rollout.tensor_model_parallel_size | 1 | vLLM 生成时的张量并行度;单卡场景下为 1 |
actor_rollout_ref.rollout.name | vllm | 推理引擎选择为 vLLM,即采用 FSDP(训练)+ vLLM(生成)的组合 |
actor_rollout_ref.rollout.gpu_memory_utilization | 0.6 | vLLM 可使用的 GPU 显存比例,本例为 60%,为训练过程预留余量 |
actor_rollout_ref.rollout.n | 3 | GRPO 中每个 prompt 采样的响应数量,GRPO 通过对 n 个采样响应估计优势值 |
actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu | 20 | 参考模型计算 log_prob 时每 GPU 的微批次大小 |
actor_rollout_ref.ref.fsdp_config.param_offload | True | 参考模型参数 offload 到 CPU。由于参考模型不参与梯度更新,将其 offload 可显著释放显存 |
值得注意的是actor_rollout_ref.rollout.name=vllm与 FSDP 的组合体现了 verl 的模块化设计:训练端使用 FSDP 做数据并行与分片训练,生成端调用 vLLM 做高吞吐采样,两者通过 3D-HybridEngine 在训练与生成阶段之间高效切换并重分片模型,从而规避显存冗余与通信开销问题。
算法与训练调度参数解析
| 参数 | 取值 | 作用说明 |
|---|---|---|
algorithm.adv_estimator | grpo | 选择优势估计器为 GRPO,确定 RL 算法 |
algorithm.use_kl_in_reward | False | 是否将 KL 惩罚并入奖励计算;此处为 False,KL 惩罚由actor_rollout_ref.actor.use_kl_loss独立控制 |
trainer.critic_warmup | 0 | Critic 预热步数。GRPO 属于 actor-only 算法,无需 Critic,故设为 0 |
trainer.logger | ['console'] | 日志输出方式,可扩展为 wandb 等 |
trainer.project_name | 'verl_grpo_example_gsm8k' | 实验所属项目名 |
trainer.experiment_name | 'qwen3_1_7b_function_rm' | 本次实验名 |
trainer.n_gpus_per_node | 1 | 每节点使用的 GPU 数量 |
trainer.nnodes | 1 | 节点数量,单机训练为 1 |
trainer.save_freq | -1 | 保存 checkpoint 的频率,-1表示训练期间不保存 |
trainer.test_freq | 5 | 每 5 轮迭代在验证集上测试一次 |
trainer.total_epochs | 15 | 总训练轮数 |
命令末尾的$@允许你将其他任意参数透传给训练程序,例如在需要多机多卡时覆盖trainer.nnodes、trainer.n_gpus_per_node等配置,而无需改写整条命令。
调参要点与实操建议
基于上述参数结构,在实际训练中可关注以下几点:
- 显存紧张时优先开启梯度检查点:
enable_gradient_checkpointing=True是最直接的省显存手段;若仍不足,可将actor_rollout_ref.rollout.gpu_memory_utilization适当调低,为训练端预留更多显存。 - 扩大 GRPO 采样数 n:
actor_rollout_ref.rollout.n直接决定每个 prompt 的采样响应数量,n 越大优势估计越稳定,但生成成本随之线性上升,需要根据吞吐目标权衡。 - KL 惩罚是稳定性的关键:
kl_loss_coef过小可能导致策略漂移,过大则限制探索;kl_loss_type=low_var_kl适合在训练初期快速收敛的稳定版本。 - 多卡扩展:该命令以单机单卡为基准。扩展到多卡或多节点时,可保持 FSDP + vLLM 组合不变,调整
trainer.n_gpus_per_node、trainer.nnodes以及 vLLM 的tensor_model_parallel_size;vLLM 的并行度应与 GPU 拓扑匹配以获得最优采样吞吐。 - 从 FSDP 切换到 Megatron-LM:若需要训练更大规模的 Qwen3 模型(如 30B-A3B、235B-A22B 等 MoE 模型),可将训练端替换为 Megatron-LM,推理端仍使用 vLLM 或 SGLang,verl 的模块化 API 支持这类自由组合。
结束语
verl 以混合控制器编程模型和 3D-HybridEngine 为核心,为 Qwen3 等主流 LLM 提供了一套灵活、高效、可组合的强化学习训练方案。通过本文的完整命令与逐参数解析,你已经可以在单张 80GB GPU 上启动 Qwen3-1.7B 的 GRPO 训练,并具备向 PPO、DAPO 等算法以及 FSDP/Megatron-LM × vLLM/SGLang 等组合扩展的能力。如果在使用过程中遇到任何困难,可以前往 verl 官方讨论区 参与讨论。
【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考