用 Verl 让强化学习飞起来:单卡直冲 80% 数学推理(保姆级流程)

只改几行配置,训练速度直接快 4-5 倍;1.5B 模型在 GSM8K 上从 49% 拉到 80%。这篇带你 打通VeRL“环境配置->训练->评估” 的完整闭环,配图齐全、代码精简、上手即用。

项目完整教程及源码加入 赋范空间 免费领取,还有更多模型微调和agent课程等你来拿

为什么是 Verl?

  • 针对大模型强化学习的生产级框架:训练用 PyTorch,推理用 vLLM,Ray 统一调度。
  • 直接解决四大痛点:推理慢、显存紧、调度复杂、奖励设计难。无需自行造轮子。

Verl 的核心对比

  • 传统方案把训练和推理都压在 PyTorch 上,推理占 70% 时间却不够快;Verl 把推理交给 vLLM,整体提速 4-6 倍。

整体架构与数据流

  • 四层架构:数据引擎 → 推理引擎(vLLM) → 训练引擎(PyTorch) → 分布式协调(Ray)
  • 简化数据流:读取 → 生成多回答 → 规则/模型打分 → 更新策略 → 评估保存
1步:读取数据(Parquet)
第2步:推理节点生成回答(vLLM 4-6倍加速)
第3步:Reward 打分(规则或模型)
第4步:训练节点更新参数(PyTorch + FSDP)
第5步:验证评估与保存 Checkpoint

GRPO 是怎么把显存省出来的?

  • 核心思想:同一问题生成多条回答,直接用“群体平均”替代 Critic 估值 → 少一个模型,省 30-40% 显存。
  • 训练五步:Rollout → Reward → Advantage → Policy Update → Validation。
# 精简版 GRPO 损失(PPO 的简化)
def compute_grpo_loss(new_logprobs, old_logprobs, advantages):
    ratio = torch.exp(new_logprobs - old_logprobs)
    return (-ratio * advantages).mean()
# 奖励提取(GSM8K:#### 后是最终数字)
import re

def extract_solution(text):
    m = re.search(r"#### (\-?[0-9\.\,]+)", text)
    return m.group(1).replace(",", "") if m else None

三模型协作:为什么更快更稳?

  • Actor(训练):唯一更新的模型,负责学习策略。
  • Rollout(推理):定期从 Actor 同步参数,用 vLLM 快速批量生成。
  • Reference(守门):保持初始参数不变,提供 KL 约束,防跑偏。

环境与安装

这里仅为关键点,项目完整教程加入 赋范空间 免费领取,还有更多模型微调和agent课程等你来拿

  • Conda 与 pip 使用国内镜像,创建 python=3.11 独立环境。
  • 一键脚本安装 vLLM、SGLang、Megatron、FlashAttention 等依赖;pip install -e . 安装 verl 本体。
  • 验证:import verl, torch, vllm 输出版本与 GPU 信息。
conda create -n verl python=3.11 -y \
  -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main \
  --override-channels
conda activate verl

git clone https://github.com/volcengine/verl.git && cd verl
bash scripts/install_vllm_sglang_mcore.sh
pip install -e .

数据准备(从 HF 到 Verl)

  • question/answer 转为 ChatML,强制加指令:Let's think step by step and output the final answer after "####".
  • answer 中提取 ground_truth(纯数字)用于规则打分。
# 切换算法只需一行,整体训练循环统一
from verl.trainer import GRPOTrainer, PPOTrainer
trainer = GRPOTrainer(config=config, actor_model=actor, rollout_model=rollout, ref_model=reference)
# trainer = PPOTrainer(...)  # 若需要 PPO
trainer.fit(train_data)

训练参数与启动(单卡 A800 示例)

  • 批配置:BATCH_SIZE=128ROLLOUT_N=2 → 每步 256 样本。
  • 累积:MINI_BATCH=32MICRO_BATCH=8 → 共 32 次累积,显存稳。
  • 学习率:LR=5e-6,每 50 步验证与保存。
bash train_simple.sh
# vLLM 推理 256 回答仅需 2-3 分钟;PyTorch 原生要 10-12 分钟

验证评估(准确率差 20-30% 的“隐藏大坑”)

  • 训练时是“问题 + 指令 + #### 输出”,验证也必须用同样的 Prompt;否则准确率直接掉到 50% 左右。
  • 批量验证更快:batch=32 把 26 分钟压到 8 分钟。
# 验证核心:严格复用 test.parquet 里的 prompt
def evaluate_model(model_path, test_data_path):
    tok = AutoTokenizer.from_pretrained(model_path)
    mdl = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")
    df = pd.read_parquet(test_data_path)
    correct = 0
    for _, row in df.iterrows():
        prompt = row['prompt'][0]['content']
        gt = row['reward_model']['ground_truth']
        resp = mdl.generate(**tok(prompt, return_tensors="pt").to(mdl.device), max_new_tokens=512)
        pred = extract_solution(tok.decode(resp[0], skip_special_tokens=True))
        correct += int(pred == gt)
    return correct / len(df)

Checkpoint 转换与部署

  • Verl 保存为 FSDP 分片,需转换到 HuggingFace 格式后再加载推理:
python convert_checkpoint.py \
  --input_dir ./outputs/checkpoints/step_50 \
  --output_dir ./outputs/converted/step_50 \
  --model_type qwen2

常见坑与快速优化

  • OOM:减小 BATCH_SIZE,提高累积层次,GPU_MEM=0.2 给 Actor 更多显存。
  • Loss 不降:学习率从 5e-6 微调到 1e-5/1e-6,检查 Reward 是否全 0。
  • 训练慢:确认 vLLM 生效;降低 TEST_FREQ;必要时开启 FlashAttention。
  • Prompt 不一致:这是命中率暴跌的首因,务必复用训练时模板与提取规则。

结语与获取方式

  • 如果你想把 1.5B 模型在数学推理上从“会答”练到“会推理”,Verl 的混合架构与 GRPO 会是最省心的上车路径。

项目完整教程及源码加入 赋范空间 免费领取,还有更多模型微调和agent课程等你来拿

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐