跳转到主要内容
字节跳动 verl,catalog 版本 0.9.0(默认)与 0.9.1。方法有 verl/grpo、dapo、ppo、 rloo、reinforce-baseline、remax、distillation、sft。 新的上游版本在成为默认之前是可选的:加 --framework-version 0.9.1 试用,原因见 适配新的上游版本。 与 NeMo-RL 不同,verl 在提交时需要 --model 和 --train-data。observability 是 platform, 集成会往 trainer.logger 添加 tensorboard 并声明输出目录,由独立采集器读取文件。 其他显式配置的 tracker 会保留,不修改 Tracking 构造函数或安装导入钩子。
verl 镜像是部署侧的产物。在任何人能提交之前,管理员要设 TUNEPLANE_IMAGE_VERL 或注册对应的 runtime id。没有它,提交会失败并点名缺的是 runtime 而不是方法。

带显式版本创建

0.9 用统一的 verl.trainer.main_ppo。上游移除了 0.8 的 main_ppo_sync,所以 catalog 不再带更旧的 runtime。 如果 experiments/my-verl/main.py 存在,它就是入口。那是 verl-recipe 的写法:继承 TaskRunner 或 RayPPOTrainer。只改奖励不需要它 —— 在配置里设 custom_reward_function.path 就行。

模型与数据是必填的

recipe 把三个参数绑到 Hydra 键上:
用平台数据集时,--train-data 是它内部的路径:
更推荐在配置里写 data.train.dataset;参数只是临时覆盖。见 数据集。缺了必填声明时 tp validate 会提前失败。

方法就是 estimator

这里每个 RL 方法跑的都是同一个 verl.trainer.main_ppo。recipe 钉住 algorithm.adv_estimator, 那就是这个方法本身。 把 algorithm.adv_estimator 写进 config.yaml 会在提交时被拒绝。要换 estimator,就换方法。 loss 变体是旋钮而不是方法:在上面任意 recipe 上设 policy_loss_mode 即可得到 GSPO、CISPO、 GMPO、clip-cov、kl-cov 或 GPG。

DAPO

verl/dapo 是配置,不是一个内置的分叉训练器。0.9 在主线 main_ppo 里带了全部四项已发表的技巧, 所以 recipe 钉住 algorithm.filter_groups.enable 和 dapo reward manager,并把论文的取值作为 默认值:clip 0.2/0.28、token-mean 聚合、factor 1.0 的 4096 token 超长缓冲、每 prompt 16 个样本、 两条路径上都不加 KL。 提交这种作业之前有两件事要知道:
  • 动态采样在 rollout 期间按 filter_metric 判断一个组,所以那时奖励必须已经存在。用基于规则 的奖励函数,或把奖励模型放在自己的 pool 里。共卡的奖励模型是在采样之后打分的,上游对此有断言。
  • step 耗时天生是波动的:训练器会一直重新生成直到够数的组合格。
要”不带动态采样的 DAPO”这种配置,用 verl/grpo 配 clip_ratio_high=0.28 和 loss_agg_mode=token-mean。

rollout 校正

rollout 引擎(vLLM,bf16)和训练器(FSDP,fp32)即使权重相同也不是同一个策略。过期或补充的 rollout 会把差距拉大。每个 verl RL recipe 都暴露了校正:
rollout_is_threshold=0.5_5.0 给出 IcePop 的区间,区间外置零而不是截断。 rollout_calculate_log_probs 不是可选的。没有 rollout 引擎自己的 log-prob,就没有可对比的行为 策略,平台会在编译期拒绝这个组合,而不是悄悄什么都不做。 不设 rollout_is 会只上报差异指标而不做任何校正,在一套新环境上这是个合理的第一步。

蒸馏需要两个 pool

verl/distillation 在训练器之上、自己的 Ray placement group 里跑教师推理服务,所以作业声明两个 pool,并把 teacher 角色映射到第二个:
平台从学生 pool 填 trainer.nnodes,从教师 pool 填 distillation.nnodes。单 pool 的提交会在编译期 被拒绝,而不是卡在放置上。多 pool 需要一个 kubernetes 或 slurm Fleet。

拓扑

适配器从 TUNEPLANE_CLUSTER_* 写 trainer.nnodes 和 trainer.n_gpus_per_node,作业有教师 pool 时取主 pool。

确认成功

tp job logs 会显示 Ray 集群成形,然后是第一批 rollout。Charts 标签页会填入 reward 和 loss 曲线。 PPO 运行里 train/value_loss 一直不动,说明 critic 没在学,此时 advantage 是噪声。

训练之后

格式是 verl-fsdp 和 verl-megatron。SFT 的评测可以用 tp eval --run-id 把样本挂回训练运行上。 见流水线。