veRL基本介绍与部署实践

张开发
2026/4/12 18:21:45 15 分钟阅读

分享文章

veRL基本介绍与部署实践
一、veRL 框架详解1 veRL 背景1.1 强化学习工作流特性强化学习RL是多阶段、多模型、异构工作流包含 Actor、Critic、Reward Model、Reference Policy、Cost Model 等多组件协同传统框架难以高效编排。1.2 核心设计Hybrid FlowveRL 采用Hybrid Flow 混合流设计把网络层构建为计算图由Single Controller 统一全局编排节点内用SPMD 负责分布式计算融合Single-controller (MPMD) Multi-controller (SPMD)Single-controller (MPMD) 负责全局工作流编排Multi-controller (SPMD) 负责组件内分布式计算二者结合实现灵活调度与高效并行的统一。优势全局统一编排、计算图构建高度灵活、分布式效率更高。1.3 传统 RL 框架痛点训练缺少抽象层不同后端代码冗余RolloutSPMD 侵入性强多轮对话不友好Single-controller控制流与数据流耦合扩展性差异步训练无原生支持大规模场景受限2 RLHF 训练流程与伪代码实现2.1 极简编程范式veRL 仅需十行左右伪代码即可完成完整 RLHF 计算流程# Generate actor # Experience Preparation reward reference critic # Train critic.update actor.update2.2 Actor策略在 RLHF 中的三大角色生成Generation根据提示词逐词生成回答以当前已生成内容为状态选择下一个词为动作。优势评估Advantage用 GAE 计算动作优势值正向优势提升概率负向降低概率。策略更新Update基于 PPO 类算法限制新旧策略 KL 散度防止训练崩溃。2.3 完整 RLHF 训练伪代码# Pseudo-code for RLHF training loop (Actor-Critic GAE)forpromptsindataloader:# Stage 1: 生成batchactor.generate_sequences(prompts)# Stage 2: 经验准备batchreward.compute_reward(batch)batchreference.compute_log_prob(batch)batchcritic.compute_values(batch)batchcompute_advantage(batch,gae)# Stage 3: 训练更新critic.update_critic(batch)actor.update_actor(batch)2.4 Single-Controller 编程接口基于单控制器范式RL 算法核心逻辑极简实现支持 PPO、GRPO、RLOO、ReMax、PRIME、DAPO 等主流算法。3 veRL 整体架构veRL 架构分为两层verl-core提供原子级 building blockverl-trainer基于 core 构建 RL 训练流水线veRL 的 core和 trainer 两部分。 提供原子粒度的 building block包含四个核心组件重要的是负责训练的 model engine 和负责 raw 推理的模块。还有用于衔接训练推理的 transfer engine 和 transfer queue。基于这些组件可灵活构建强化学习、VLA 等 trainer。支持在线策略、离线策略、全异步、VLA 多模态等训练模式。4 verl-core 四大核心组件4.1 Model Engine模型训练引擎定位RL/SFT 核心训练引擎目标支持超大模型、长上下文、极致 MFU。基类BaseEngine 提供初始化、优化器、学习率调度等原始 API运行方式SPMD 并行Single Controller 感知并行策略分发数据支持后端FSDP、Megatron-Core、VeOmni 等特性序列均衡、LoRA、FP8 训练、高性能 Kernel4.2 Rollout Engine推理 Rollout 引擎定位生成、环境交互、奖励计算解决多轮对话低效问题。最早做 RL 用 batch inference 模式在多轮交互中低效重要工作是重构该模式为所有模式使每个 prompt 可独立推理等。引入 agent loop 抽象以用户编写 Loop 与多方面交互。Server 改成新模式后对引擎无侵入还增加了数据传输同步等功能。重构为单 Prompt 独立推理无侵入式架构核心抽象AgentLoop支持 ReAct、SWE、GUI 等多轮智能体交互RewardLoop异步奖励计算支持规则/模型类奖励兼容 LLM ServerVLLM、SGLang、TensorRT-LLM能力权重同步、FP8 在线量化、Router replay4.3 TransferQueue数据传输队列定位全组件数据总线 回放缓冲区解耦控制流与数据流。目前 IO 采用的 single Controller 存在数据和控制流耦合问题集群和数据规模扩大后 trainer 会成瓶颈尤其在多模态场景。为解决此问题引入 transfer queue 解耦数据和控制流trainer 传数据指针worker 从 transfer queue 取数据。transfer queue 是多节点多 backend 存储有 Tensor 传输优化支持细粒度列访问控制和主动生命周期管理。解决痛点Single Controller 数据/控制耦合导致的信道瓶颈核心优势Zero-serialization 零序列化开销支持 TCP/RDMA 多传输方式细粒度列级读写/追加主动生命周期管理机制Channel 只传数据指针Worker 从队列取数据4.4 Checkpoint Engine参数同步引擎定位统一模型权重同步训练 ↔ 推理引擎无缝传递。通过统一的 checkpoint engine 负责参数同步训练引擎调用 sendwait 接口传入 Tensor Generator推理引擎通过 receivewait 接口返回 Tensor Generator。训练引擎sendwait 传入 Tensor Generator推理引擎receivewait 获取 Tensor Generator传输层可插拔Nico 集合通信、P2P、MQ 等新引擎可无缝接入无需改造上层5 verl-trainer 训练流水线基于 verl-core 四大组件灵活构建训练流水线On-policy trainer同步在线训练One-step-off-policy trainer单步离线训练Fully async trainer全异步训练VLA trainer视觉语言动作多模态训练更多自定义 Trainer 存放于 verl-recipe6 框架优势与总结架构先进Hybrid Flow 适配异构 RL 工作流使用极简十行代码实现 RLHF 全流程组件解耦数据流/控制流分离分布式可水平扩展生态兼容支持主流训练/推理后端与 RL 算法场景全覆盖文本 RL、多模态 VLA、智能体、多轮对话二、veRL实践由于veRL版本会不断更新我们以0.7.1为例1 clone代码https://github.com/verl-project/verl/tree/release/v0.7.1# 创建虚拟环境 conda create -n verl python3.12 conda activate verl # clone 0.7.1分支代码 git clone https://github.com/verl-project/verl --branch release/v0.7.1 --depth 1 cd verl2 修改配置这里为了能把veRL跑起来未使用MEGATRON英伟达的加速组件后续大家想使用可自行修改scripts/install_vllm_sglang_mcore.sh 脚本vi scripts/install_vllm_sglang_mcore.sh此脚本是 verl 框架的标准安装流程的一部分专门用于设置推理和训练环境3 USE_MEGATRON${USE_MEGATRON:-1}替换成3 USE_MEGATRON0同时因为 wget 下载flash-attn的whl 在服务器不好下载可自己下载了传上去29 wget -nv https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl \ 30 pip install --no-cache-dir flash_attn-2.8.1cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl可把29行去掉自己下载 https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl执行scripts/install_vllm_sglang_mcore.sh脚本 安装 verl 框架推理和训练环境环境bash scripts/install_vllm_sglang_mcore.sh pip install --no-deps -e .3 数据集下载首先配置国内hf的地址export HF_ENDPOINThttps://hf-mirror.comgsm8k数据准备执行python代码下载数据集python examples/data_preprocess/gsm8k.py4 模型下载git clone https://www.modelscope.cn/Qwen/Qwen2.5-0.5B-Instruct.git5 执行训练代码这里需要把备注去掉并且文件数据集路径和模型路径需要修改成对应本地数据集和模型路径# 环境变量保证日志实时输出不缓存避免训练过程中看不到实时日志 export PYTHONUNBUFFERED1 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_size256 \ # 每一步迭代读取256道数学题 data.max_prompt_length512 \ # 题目最大长度 data.max_response_length512 \ # 答案最大长度 actor_rollout_ref.model.pathQwen/Qwen2.5-0.5B-Instruct \ # Actor模型路径 actor_rollout_ref.actor.optim.lr1e-6 \ # Actor学习率 actor_rollout_ref.actor.ppo_mini_batch_size64 \ # 迷你批次一次加载64个 加载256个容易炸内存 但256个才进行梯度更新 相当于off-policy actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu4 \ # 每个GPU加载几个比迷你批次还小 actor_rollout_ref.rollout.namevllm \ # vllm 采样器 生成回答 actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu8 \ # rollout时 每个GPU同时算几个 策略的对数概率 actor_rollout_ref.rollout.tensor_model_parallel_size1 \ # 张量并行 actor_rollout_ref.rollout.gpu_memory_utilization0.4 \ # 采样的GPU 显存利用率限额 actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu4 \ # 旧策略ref 每个GPU同时算几个 策略的对数概率 critic.optim.lr1e-5 \ # Critic学习率 critic.model.pathQwen/Qwen2.5-0.5B-Instruct \ # Critic模型路径 critic.ppo_micro_batch_size_per_gpu4 \ # Critic 每个GPU微批次每次处理4个样本 algorithm.kl_ctrl.kl_coef0.001 \ # KL系数 trainer.loggerconsole \ # 训练过程中实时在终端打印日志信息 trainer.val_before_trainFalse \ # 训练前是否验证 trainer.n_gpus_per_node1 \ # 每个节点的GPU数量 trainer.nnodes1 \ # 训练节点数量 trainer.save_freq10 \ # checkpoint 保存频率 trainer.test_freq10 \ # 测试频率 trainer.total_epochs15 \ # 完整遍历15遍训练数据集 21 | tee verl_demo.log # 保存日志的位置正常信息和报错都写入执行后报错需要回退一下numpy版本期望numpy版本低于2.2.0pip install numpy2.2.06 最后执行结果

更多文章