Verl LLM 最佳实践 (DAPO + Qwen3-235B) =========================================== 最后更新:11/03/2025。 目的 ------- 本指南以在 Qwen3-235B 上使用 DAPO 训练为例。我们将拆解优化目标中出现的每一个参数,将其映射到 Verl 配置条目,并分享经过实地测试的推荐设置,以便您为自己的工作负载推导出合理的设置。 .. note:: 1. 本指南仅涵盖重现此处讨论的 DAPO 实验所需的参数子集。如需完整列表,请参考 Verl 源代码树中的 ``config`` 组件: https://github.com/volcengine/verl/tree/main/verl/trainer/config 2. PPO 和 GRPO 引入了 KL 约束策略。因此,我们在下面的解释中包含了该设置。您可以将此处提到的所有配置视为一个带有 KL 惩罚的 DAPO 管道。 优化目标 ----------------------- DAPO 目标 ~~~~~~~~~~~~~~ .. math:: \begin{aligned} \mathcal{J}_{\mathrm{DAPO}}(\theta)= & \mathbb{E}_{(q, a) \sim \mathcal{D},\left\{o_i\right\}_{i=1}^G \sim \pi_{\theta_{\text {old }}}(\cdot \mid q)} \ {\left[\frac{1}{\sum_{i=1}^G\left|o_i\right|} \sum_{i=1}^G \sum_{t=1}^{\left|o_i\right|} \min \left(r_{i, t}(\theta) \hat{A}_{i, t}, \operatorname{clip}\left(r_{i, t}(\theta), 1-\varepsilon_{\text {low }}, 1+\varepsilon_{\text {high }}\right) \hat{A}_{i, t}\right)\right] } \\ \end{aligned} .. math:: \text { s.t. } \quad 0<\mid\left\{o_i \mid \text { is_equivalent }\left(a, o_i\right)\right\} \mid 2 * model_parameters``(bf16/fp16)。逐步增加 TP 以扩展 KV 缓存容量,同时观察通信成本——尤其在 TP > 8 时。 - ``actor_rollout_ref.rollout.temperature`` / ``top_p`` / ``top_k``: Rollout 的采样调节旋钮。保持足够的随机性;``temperature=1.0``、``top_p=1.0``、``top_k=-1`` 是良好的默认值。 - ``actor_rollout_ref.rollout.val_kwargs.temperature`` / ``top_p`` / ``top_k`` / ``do_sample`` / ``n``: 验证用的采样选项。设置 ``temperature > 0`` 以防止重复思考链。对于小型测试集(如 AIME24),提高 ``n``(64 是常见选择)以减少方差。实用起点是 ``temperature=1.0``、``top_p=0.7``、``top_k=-1``、``do_sample=True``、``n=1``,然后根据需要增加 ``n``。 - ``+actor_rollout_ref.rollout.engine_kwargs.vllm.*`` / ``+actor_rollout_ref.rollout.engine_kwargs.sglang.*``: 通过 ``+`` 语法注入的额外后端选项。请查阅后端文档获取确切语义。某些开关(如 ``pipeline_parallel_size``)可能尚不支持;在 TP=32 时,``enable_expert_parallel=True`` 甚至可能减慢 DeepSeek-V3 rollout,所以请仔细基准测试。 :math:`\pi_\theta` - ``data.train_batch_size``: 每次训练迭代的总批大小。每次 rollout 产生 ``train_batch_size * n`` 个样本。较大的值减少 rollout 次数,但增加离策略漂移(off-policy drift)。 - ``actor_rollout_ref.actor.ppo_mini_batch_size``: 每次优化步骤的迷你批大小。像标准深度学习工作负载一样调优它。 - ``actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu``: 每个 GPU 组上每次前向传递处理的样本数(Megatron 组包含 TP * PP * CP 个 GPU)。保持 ≤ ``ppo_mini_batch_size`` 且尽可能大以匹配内存。 - ``actor_rollout_ref.actor.use_dynamic_bsz``: 启用动态批大小,以适应序列长度并提高吞吐量。 - ``actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu``: 在动态批处理下计算对数概率时,每个 GPU 的最大 token 数。设置为至少 ``max_prompt_length + max_response_length`` 的倍数,以防止截断。 - Megatron 并行参数(``pipeline_model_parallel_size`` / ``tensor_model_parallel_size`` / ``expert_model_parallel_size`` / ``expert_tensor_parallel_size`` / ``context_parallel_size``): 平衡 PP/TP/EP/ETP/CP 以匹配内存和网络约束。在 bf16/fp16 中,每个参数消耗约 ``2 / TP`` 字节;如果保留 FP32 主权重或跳过优化器卸载,则为 Adam 额外保留 4–8 字节。激活值随 ``micro_batch_size × sequence_length × hidden_size`` 缩放,可通过梯度检查点、动态批或卸载缓解。首先优先增加 TP,必要时添加 PP,通过 CP 扩展序列容量,针对 MoE 模型将 EP/ETP 与 TP 对齐,并在约束集群上保持 DP 最小,同时结合卸载。始终与硬件拓扑和通信成本对齐。 - ``actor_rollout_ref.model.use_fused_kernels``: 为支持的模型启用 Verl 的融合内核,以榨取额外性能。 :math:`\hat{A}_{i,t}` - ``algorithm.adv_estimator``: 优势估计器。针对 DAPO/GRPO,设置为 ``grpo``。 :math:`R_i` - ``reward_model.reward_manager``: 奖励聚合策略。DAPO 使用 ``dapo``,GRPO 使用 ``naive``。 :math:`D_{KL}` - ``algorithm.use_kl_in_reward``: 是否将 KL 项添加到奖励中。PPO 为 ``True``,GRPO 和 DAPO 为 ``False``。 - ``actor_rollout_ref.actor.use_kl_loss``: 是否包含 KL 损失项。PPO 为 ``False``,GRPO 为 ``True``,DAPO 为 ``False``。 :math:`\beta` - ``actor_rollout_ref.actor.kl_loss_coef``: KL 损失的权重。从 0.001 左右开始。较大的值可遏制奖励黑客化(reward hacking),但减少探索。 - ``algorithm.kl_ctrl.kl_coef``: 应用于奖励内的 KL 系数。根据您对散度的容忍度调整。 :math:`\pi_{old}` - ``actor_rollout_ref.rollout.log_prob_use_dynamic_bsz``: 当旧策略计算对数概率时,启用动态批处理。推荐。 :math:`\pi_{ref}` - ``actor_rollout_ref.ref.log_prob_use_dynamic_bsz``: 为参考策略启用动态批处理。推荐。 - 参考 Megatron 并行: 将 ``pipeline_model_parallel_size``、``tensor_model_parallel_size``、``expert_model_parallel_size``、``expert_tensor_parallel_size`` 和 ``context_parallel_size`` 与 Actor 保持同步。 - ``actor_rollout_ref.ref.megatron.param_offload``: 当 Actor 卸载参数到 CPU 时,也卸载参考参数。即使没有梯度或优化器状态,对等性也有助于容量规划。 :math:`o_i` / :math:`|o_i|` - ``actor_rollout_ref.actor.loss_agg_mode``: 损失聚合模式。Token 级 ``token-mean`` 匹配 Dr.GRPO 和 DAPO 的推荐;使用 ``seq-mean-token-mean`` 以重现原始 GRPO 行为。 :math:`\pi_\theta(o_{i,t} \mid q_i,o_{i,