Prhub

#7648 [distillation] fix: Disable detokenization for teacher prompt_logprobs

原始 PR 作者 HSYZhang 合并时间 2026-09-02 10:15 文件变更 1 提交数 1 评论 9 代码增减 +1 / -0

执行摘要

禁用教师蒸馏中 vLLM 的反标记化,降低每请求开销。

如PR body所述:'distillation teacher path requests prompt_logprobs=topk from vLLM to score the student sequence. vLLM's LogprobsProcessor detokenizes every prompt-logprob candidate — it calls tokenizer.decode([id]) once per id over num_prompt_tokens × num_prompt_logprobs ids and runs verification per position. For distillation we consume only the numeric logprobs and token ids — the decoded strings are never read, so this is pure wasted work.' 此外,反标记化在异步事件循环上同步运行,会序列化并发请求,导致引擎范围内的停顿。

该PR值得精读,原因如下:1)展示了如何通过一个单行配置变更获得2.4-3.2倍的性能提升,且不改变行为;2)设计决策上隔离教师和学生rollout的配置,避免影响其他后端;3)讨论中深入分析了vLLM的内部机制(如 skip_tokenizer_init 硬编码),提供了有价值的技术洞察。建议关注教师循环的性能优化路径,以及后续学生rollout的修复(PR#7679)。

讨论亮点

核心讨论点

  • skip_tokenizer_init 硬编码问题:wuxibin89最初质疑是否已经通过 skip_tokenizer_init=True 跳过了反标记化(引用 distillation.yaml 配置)。HSYZhang指出在vLLM中 skip_tokenizer_init 被硬编码为 false,导致反标记化仍在进行,并附截图证明。
  • 硬编码原因:HSYZhang解释vLLM访问 tokenizer.image_token_id,跳过初始化会导致错误,因此需要直接修改采样参数。
  • 学生rollout的优化:讨论扩展到学生rollout是否也需要设置 detokenize=False。wuxibin89建议在 vllm_async_server.py 中添加,因为这不是其他后端(如sglang、trtllm)的通用参数。HSYZhang同意并提交了单独的PR(#7679)。

决策结论

  • 本PR只针对教师rollout设置 detokenize=False,以最小化变更范围并隔离影响。
  • 学生rollout的优化在PR#7679中处理。

未解决疑虑

  • 无明显未解决疑虑,讨论已达成共识。

实现拆解

  1. 变更入口:修改 verl/experimental/teacher_loop/teacher_manager.py 中的 _get_teacher_sampling_params 函数,该函数负责构建教师模型采样参数。
  2. 核心逻辑调整:在返回的采样参数字典中添加键值对 "detokenize": False,使vLLM在处理教师请求时跳过反标记化步骤。由于下游消费者 extract_prompt_logprobs 只读取数字logprobs、rank和token id,不使用 .decoded_token,因此行为不变。
  3. 安全性验证:PR body提供了微基准测试数据,证明在设置 detokenize=False 后,LogprobsProcessor._update_prompt_logprobs 的处理时间显著降低,且数值logprobs保持不变。
  4. 配套改动:无其他文件变更。但讨论中确认学生rollout的类似优化将在后续PR(#7679)中处理,并建议在 vllm_async_server.py 中实现,以避免影响其他后端。
文件 模块 状态 重要度
verl/experimental/teacher_loop/teacher_manager.py 教师循环 modified 4.75

关键符号

_get_teacher_sampling_params

关键源码片段

verl/experimental/teacher_loop/teacher_manager.py core-logic

核心变更文件,修改了教师采样参数以禁用反标记化,直接提升蒸馏性能。

def _get_teacher_sampling_params(
    teacher_model_config: DistillationTeacherModelConfig,
    distillation_loss_config: DistillationLossConfig,
) -> dict[str, Any]:
    """Get sampling parameters for teacher model when computing log probabilities for distillation."""
    # Temperature has no effect on prompt_logprobs: the teacher performs a forward pass over
    # existing tokens (no sampling). Always use temperature=1.0 regardless of the config value.
    # The default distillation.yaml copies the student rollout temperature via Hydra interpolation
    # (temperature: ${oc.select:actor_rollout_ref.rollout.temperature}), which causes a spurious
    # crash when rollout.temperature != 1.0.
    if teacher_model_config.inference.temperature != 1.0:
        logger.warning(
            "Teacher inference temperature is set to %.1f, but temperature has no effect "
            "on prompt_logprobs (forward pass only). Using temperature=1.0.",
            teacher_model_config.inference.temperature,
        )
    num_logprobs = distillation_loss_config.topk if distillation_loss_config.loss_settings.use_topk else 0
    # 禁用反标记化:蒸馏只消费数字 logprobs 和 token ids,不需要解码字符串。
    # 这样 vLLM 的 LogprobsProcessor 会跳过 convert_ids_list_to_tokens 和 _verify_tokens,
    # 减少事件循环上的同步工作,提升并发性能。
    return {
        "max_tokens": 1,
        "temperature": 1.0,
        "prompt_logprobs": num_logprobs,
        "detokenize": False, # 新增:跳过反标记化,降低每请求开销
    }

评论区精华

skip_tokenizer_init 的硬编码问题 正确性

wuxibin89 质疑是否已经通过 `skip_tokenizer_init=True` 跳过了反标记化,但 HSYZhang 指出在 vLLM 中该参数被硬编码为 `false`,导致反标记化仍在进行,并附截图证明。

结论:确认 vLLM 硬编码的原因(访问 `tokenizer.image_token_id`),并决定通过设置 `detokenize=False` 来解决。 · 已解决

学生 rollout 的 detokenize 优化 性能

讨论是否应为学生 rollout 也添加 `detokenize=False`,以进一步优化性能。

结论:在后续 PR #7679 中处理,并建议在 `vllm_async_server.py` 中实现,以避免影响其他后端。 · 已解决

风险与影响

风险较低:

  1. 回归风险:变更只添加一个配置键,不改变核心逻辑。已验证下游消费者不使用反标记化结果,因此蒸馏损失值不变。
  2. 兼容性风险:detokenize 是vLLM SamplingParams 的标准字段,与vLLM 0.22.1(v1引擎)兼容。但需确保其他rollout后端(如sglang、trtllm)不传递此参数。
  3. 性能风险:变更可能使某些依赖反标记化字符串的边缘情况失效,但根据代码分析,教师路径从不使用解码字符串。
  4. 配置依赖:需要确保采样参数正确传递到vLLM服务器,目前代码路径清晰。
  • 用户影响:蒸馏训练性能提升,每请求延迟降低(例如24k-token提示从18.3秒降至6.2秒),减少训练时间。
  • 系统影响:事件循环上的同步工作减少,提高并发请求处理能力,缓解引擎范围内的停顿。
  • 团队影响:为后续rollout性能优化铺路(如学生rollout的类似修复),并展示了通过简单配置调整获得显著收益的设计模式。
配置依赖 单点变更

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论