Prhub

#47050 [BugFix] Gate MRV2 mixed sparse-MLA warmup on `max_num_seqs` > 1

原始 PR 作者 njhill 合并时间 2026-06-30 23:31 文件变更 3 提交数 2 评论 0 代码增减 +34 / -4

执行摘要

适配 MRV2 warmup 在单序列场景的跳过逻辑

由 @ZeldaHuang 发现,当 max_num_reqs <= 1 时,混合 prefill+decode warmup 会尝试构造一个 prefill 和一个 decode 请求,但受限于 max_num_reqs 限制导致失败。此修复添加了前置检查,避免无效执行。

值得快速合入。修复清晰,逻辑简单,建议在合入后观察 CI 测试稳定性。

讨论亮点

PR 无 review 讨论。

实现拆解

  1. 核心门控加固:在 vllm/v1/worker/gpu/warmup.pyrun_mixed_prefill_decode_warmup 函数中,将早期返回条件从 is_pooling_model or num_tokens < 3 扩展为 is_pooling_model or max_num_reqs < 2 or num_tokens < 3
  2. 调用方同步:在 vllm/model_executor/warmup/flashinfer_sparse_mla_warmup.py 中,对两处 V2 warmup 调用(_run_flashinfer_sparse_mla_decode_autotunedeepseek_v4_sparse_mla_attention_warmup)增加 runner.max_num_reqs >= 2 的条件检查,避免逻辑上绕开门控。
  3. 配套测试:新增 tests/v1/worker/test_mixed_warmup_gate.py,使用 SimpleNamespace 模拟 runner,验证 max_num_reqs 为 0 或 1 时 warmup 返回 False 且 worker 回调不会被调用。
文件 模块 状态 重要度
vllm/v1/worker/gpu/warmup.py 预热逻辑 modified 4.82
vllm/model_executor/warmup/flashinfer_sparse_mla_warmup.py 模型预热 modified 5.66
tests/v1/worker/test_mixed_warmup_gate.py 测试 added 6.43

关键符号

run_mixed_prefill_decode_warmup _run_flashinfer_sparse_mla_decode_autotune deepseek_v4_sparse_mla_attention_warmup

关键源码片段

vllm/v1/worker/gpu/warmup.py core-logic

核心门控函数 `run_mixed_prefill_decode_warmup` 的早期返回条件增加 `max_num_reqs < 2` 检查。

def run_mixed_prefill_decode_warmup(
    model_runner: GPUModelRunner,
    worker_execute_model: Callable[[SchedulerOutput], Any],
    worker_sample_tokens: Callable[[GrammarOutput | None], Any],
    num_tokens: int,
    *,
    mixed_step_context: AbstractContextManager[object] | None = None,
    req_id_prefix: str = "_v2_mixed_warmup",
) -> bool:
    # 混合 prefill+decode 步骤需要至少 2 个请求:
    # 一个 prefill 和一个 decode;当 max_num_reqs < 2 时直接跳过
    if model_runner.is_pooling_model or model_runner.max_num_reqs < 2 or num_tokens < 3:
        return False
    # 后续构造请求并执行模型
    ...
vllm/model_executor/warmup/flashinfer_sparse_mla_warmup.py data-contract

两处调用 V2 warmup 的位置添加 `runner.max_num_reqs >= 2` 条件,确保调用时机正确。

# 在 _run_flashinfer_sparse_mla_decode_autotune 中:
if _uses_v2_model_runner(runner) and runner.max_num_reqs >= 2:
    v2_runner = cast("V2GPUModelRunner", runner)
    warmup_executed = run_mixed_prefill_decode_warmup(...)
else:
    runner._dummy_run(...)# 在 deepseek_v4_sparse_mla_attention_warmup 中同样:
if _uses_v2_model_runner(runner) and runner.max_num_reqs >= 2:
    v2_runner = cast("V2GPUModelRunner", runner)
    run_mixed_prefill_decode_warmup(...)
else:
    runner._dummy_run(...)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。变更仅添加一个前置条件检查,所有改动点均在 warmup 路径,不影响推理核心流程;测试覆盖边界场景。

影响范围小。仅影响 V2 model runner 下 max_num_seqs = 1 的场景(如小批量在线服务或调节测试)。修复后这些场景不再触发无效 warmup,避免潜在错误日志或崩溃。

低风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论