7天掌握verl:从单机部署到千万级参数模型训练
引言:为什么选择verl进行大模型强化学习?
在大语言模型(LLM)训练领域,强化学习(RL)已成为提升模型性能的关键技术。verl(Volcano Engine Reinforcement Learning for LLMs)作为火山引擎推出的开源框架,为开发者提供了从单机实验到大规模分布式训练的完整解决方案。本文将带你通过7天时间,从环境搭建到生产级部署,全面掌握verl的核心功能与最佳实践。
第1天:环境准备与基础安装
系统要求检查
开始前,请确保你的系统满足以下要求:
- Python版本 ≥ 3.10
- CUDA版本 ≥ 12.1
这些要求在官方安装文档中有详细说明。对于需要在AMD GPU上运行的用户,verl也提供了ROCm支持,具体配置可参考docker/Dockerfile.rocm。
快速安装:Docker方式
推荐使用Docker进行环境隔离和快速部署。verl提供了三种类型的Docker镜像:
- Base Image:仅包含基础依赖,可在其上安装vLLM或SGLang
- Application Image:包含稳定版的推理和训练框架
- Community Image:包含最新框架和实验性功能
以vLLM后端的应用镜像为例,启动命令如下:
docker create --runtime=nvidia --gpus all --net=host --shm-size="10g" --cap-add=SYS_ADMIN -v .:/workspace/verl --name verl verlai/verl:app-verl0.5-transformers4.55.4-vllm0.10.0-mcore0.13.0-te2.2 sleep infinity
docker start verl
docker exec -it verl bash
进入容器后,安装verl本身:
git clone https://gitcode.com/GitHub_Trending/ve/verl && cd verl
pip3 install --no-deps -e .
自定义环境安装
如果需要在现有环境中安装,可使用提供的安装脚本:
# 安装基础依赖
bash scripts/install_vllm_sglang_mcore.sh
# 仅安装FSDP支持(不包含Megatron)
USE_MEGATRON=0 bash scripts/install_vllm_sglang_mcore.sh
完成后安装verl:
git clone https://gitcode.com/GitHub_Trending/ve/verl.git
cd verl
pip install --no-deps -e .
第2天:首个RL训练实验
数据准备
以GSM8K数学推理数据集为例,首先运行数据预处理脚本:
python3 examples/data_preprocess/gsm8k.py --local_save_dir ~/data/gsm8k
该脚本将数据集转换为parquet格式,便于高效读取。预处理逻辑可查看examples/data_preprocess/gsm8k.py。
模型准备
下载Qwen2.5-0.5B-Instruct模型作为基础模型:
python3 -c "import transformers; transformers.pipeline('text-generation', model='Qwen/Qwen2.5-0.5B-Instruct')"
如果需要先进行有监督微调(SFT),可参考SFT示例和SFT Trainer代码。
启动PPO训练
使用PPO算法进行训练,基础命令如下:
PYTHONUNBUFFERED=1 python3 -m verl.trainer.main_ppo \
data.train_files=$HOME/data/gsm8k/train.parquet \
data.val_files=$HOME/data/gsm8k/test.parquet \
data.train_batch_size=256 \
data.max_prompt_length=512 \
data.max_response_length=256 \
actor_rollout_ref.model.path=Qwen/Qwen2.5-0.5B-Instruct \
actor_rollout_ref.actor.optim.lr=1e-6 \
actor_rollout_ref.actor.ppo_mini_batch_size=64 \
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \
actor_rollout_ref.rollout.name=vllm \
actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \
critic.optim.lr=1e-5 \
critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \
algorithm.kl_ctrl.kl_coef=0.001 \
trainer.logger=console \
trainer.n_gpus_per_node=1 \
trainer.total_epochs=15 2>&1 | tee verl_demo.log
训练过程解析
上述命令启动了一个完整的PPO训练流程,关键组件包括:
- Actor模型:基于Qwen2.5-0.5B-Instruct,通过RL优化生成回答
- Critic模型:评估生成内容的质量,提供价值估计
- Reward函数:基于规则的奖励模型,检查答案正确性,代码见verl/utils/reward_score/gsm8k.py
训练过程中,关键日志包括:
critic/score/mean:平均奖励分数actor/pg_loss:策略梯度损失critic/vf_loss:价值函数损失response_length/mean:平均回答长度
断点续训与模型合并
训练中断后,可通过以下方式恢复:
python3 -m verl.trainer.main_ppo \
... \
trainer.resume=True \
trainer.resume_ckpt_path=checkpoints/your_project/your_experiment/global_step_500
训练完成后,合并模型权重:
python3 -m verl.model_merger merge \
--backend fsdp \
--local_dir checkpoints/your_project/your_experiment/global_step_1000/actor \
--target_dir merged_model
第3-4天:性能优化与调参
关键性能指标
训练性能可通过以下指标评估:
- 每秒处理token数(tokens/s)
- GPU内存利用率
- 训练稳定性(奖励分数增长趋势)
开启详细日志以便分析:
actor_rollout_ref.rollout.disable_log_stats=False
推理性能优化
- 调整GPU内存利用率:
actor_rollout_ref.rollout.gpu_memory_utilization=0.6
对于vLLM后端,该参数控制模型和KV缓存使用的GPU内存比例,推荐设置0.5-0.7。
- 增加批处理大小:
actor_rollout_ref.rollout.max_num_batched_tokens=4096
- 启用序列打包:
actor_rollout_ref.model.use_remove_padding=True
该特性通过移除padding token提高GPU利用率,支持Llama、Mistral、Qwen等模型。
训练性能优化
- 启用动态批处理:
actor_rollout_ref.actor.use_dynamic_bsz=True
critic.use_dynamic_bsz=True
动态批处理根据序列长度自动调整批大小,提高GPU利用率。此时需要设置token限制而非批大小:
actor_rollout_ref.actor.ppo_max_token_len_per_gpu=4096
critic.ppo_max_token_len_per_gpu=8192
- 梯度检查点:
actor_rollout_ref.model.enable_gradient_checkpointing=True
critic.model.enable_gradient_checkpointing=True
- FSDP优化:
actor_rollout_ref.actor.fsdp_config.forward_prefetch=True
actor_rollout_ref.actor.strategy="fsdp2" # 使用FSDP2提升性能
FSDP2相比传统FSDP可降低7%内存使用,提升1.5%吞吐量。
超参数调优
-
学习率:
- Actor: 1e-6 ~ 5e-6
- Critic: 1e-5 ~ 5e-5
-
PPO参数:
algorithm.kl_ctrl.kl_coef: 0.001 ~ 0.01(KL惩罚系数)actor_rollout_ref.actor.entropy_coeff: 0.01 ~ 0.1(熵奖励系数)
-
批大小关系:
data.train_batch_size=actor_rollout_ref.actor.ppo_mini_batch_size× 积累步数
第5-6天:分布式训练部署
单机多GPU训练
直接设置GPU数量即可:
python3 -m verl.trainer.main_ppo \
... \
trainer.n_gpus_per_node=4 # 使用4张GPU
多节点训练:Ray集群
- 启动Head节点:
ray start --head --dashboard-host=0.0.0.0 --port=6379
- 启动Worker节点:
ray start --address="head_node_ip:6379"
- 提交任务:
ray job submit --address="http://head_node_ip:8265" \
--runtime-env=verl/trainer/runtime_env.yaml \
-- \
python3 -m verl.trainer.main_ppo \
trainer.n_gpus_per_node=8 \
trainer.nnodes=2 \
...
云平台部署:SkyPilot
verl提供SkyPilot配置文件,支持AWS、GCP、Azure等云平台一键部署。以GCP为例:
-
启动集群:
export WANDB_API_KEY=your_wandb_key
sky launch -c verl-cluster examples/skypilot/verl-grpo.yaml
- 监控集群:
sky status --endpoint 8265 verl-cluster
通过浏览器访问Ray Dashboard监控训练进度。
大规模训练配置示例
以Qwen2-7B模型在2节点(每节点8GPU)上的训练为例:
python3 -m verl.trainer.main_ppo \
data.train_files="['$HOME/data/gsm8k/train.parquet', '$HOME/data/math/train.parquet']" \
data.val_files="['$HOME/data/gsm8k/test.parquet', '$HOME/data/math/test.parquet']" \
data.train_batch_size=1024 \
data.max_prompt_length=1024 \
data.max_response_length=1024 \
algorithm.adv_estimator=grpo \
actor_rollout_ref.model.path=Qwen/Qwen2-7B-Instruct \
actor_rollout_ref.actor.optim.lr=1e-6 \
actor_rollout_ref.actor.ppo_mini_batch_size=256 \
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=16 \
actor_rollout_ref.rollout.tensor_model_parallel_size=2 \
actor_rollout_ref.rollout.name=vllm \
actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \
trainer.n_gpus_per_node=8 \
trainer.nnodes=2 \
trainer.logger='["console","wandb"]'
完整脚本可参考examples/grpo_trainer/run_qwen2-7b_math.sh。
第7天:生产级最佳实践
训练监控与分析
- WandB集成:
python3 -m verl.trainer.main_ppo \
... \
trainer.logger='["console","wandb"]' \
trainer.project_name="verl_math_rl" \
trainer.experiment_name="qwen2-7b-grpo"
- 性能分析:
使用Nsight Systems捕获性能数据:
nsys profile -o verl_profile python3 -m verl.trainer.main_ppo ...
分析指南见docs/perf/nsight_profiling.md。
模型评估
使用提供的评估脚本评估模型性能:
python3 examples/evaluation/evaluate_gsm8k.py --model_path merged_model --dataset_path ~/data/gsm8k/test.parquet
评估指标包括:
- 准确率(Accuracy)
- 推理步数(Reasoning Steps)
- 计算效率(Tokens per Second)
模型部署
- vLLM部署:
python3 -m vllm.entrypoints.api_server \
--model merged_model \
--tensor-parallel-size 2 \
--port 8000
- 集成到应用:
使用OpenAI兼容API调用模型:
import requests
response = requests.post("http://localhost:8000/v1/completions",
json={
"prompt": "What is 2+2?",
"max_tokens": 100,
"temperature": 0.7
}
)
print(response.json())
高级功能探索
- 多轮对话训练:
参考SGLang多轮交互示例,支持工具调用能力训练。
- 混合流程训练:
结合SFT和RL的优势,参考docs/hybrid_flow.rst。
- 自定义奖励模型:
实现自定义奖励函数,参考recipe/entropy/reward.py。
总结与后续学习
通过7天的学习,你已掌握verl从安装到生产部署的全流程。关键资源包括:
- 示例代码:examples/目录包含各类训练脚本
- 文档:docs/提供完整API和概念说明
- 配置模板:examples/grpo_trainer/等目录下的shell脚本
后续可深入探索:
- 多模态模型训练
- 大规模分布式优化
- 自定义算法实现
verl持续更新中,建议定期查看CONTRIBUTING.md参与贡献或获取最新特性信息。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



