Prhub

#28633 [core] Don't force seq_lens_cpu publication under piecewise CUDA graph

原始 PR 作者 JonnyKong 合并时间 2026-06-20 06:12 文件变更 2 提交数 4 评论 4 代码增减 +7 / -23

执行摘要

移除 PCG 下 seq_lens_cpu 强制发布

decide_needs_cpu_seq_lens 中,当预填阶段使用 TC_PIECEWISE 时,函数强制发布 seq_lens_cpu/seq_lens_sum(一个 D2H 同步),这会覆盖任意 attention backend 的 needs_cpu_seq_lens = False 选项。PR body 指出这是一个伴随 opt-out 机制引入的保守守卫,并带有 "FIXME: support PCG without seq lens cpu value" 注释。作者论证该强制已不再需要:每个使用 host 镜像的消费者要么自行声明 needs_cpu_seq_lens = True(因此 per-backend 的 OR 逻辑仍会为其开启发布),要么在 GPU-only 路径下对 None 安全(decode-graph replay 守卫 seq_lens_sum;输入 padding 和 cuda-graph fill_from 在 None 时跳过)。

此 PR 值得精读,尤其对于关注 CUDA graph 和异步推流的开发者。它展示了从保守守卫到精准声明的演进,以及如何处理不同场景(ngram)的特例。设计决策(所有消费者在 GPU-only 路径下对 None 安全)值得学习。建议验证目标配置(如 DeepSeek MoE 模型 + PCG)的实际性能提升。

讨论亮点

PR 讨论较少,主要涉及 bot 自动评论(指出变更内容)和 CI 标签触发。最终 reviewer hnyls2002 和 merrymercy 均批准。关键决策点:在移除 PCG 强制发布时,需要处理 ngram 场景——ngram 的验证路径同样需要 CPU seq_lens。这一点在 commit "force cpu seq lens for ngram" 中得到体现,由 hnyls2002 在合并 main 分支后追加。

实现拆解

  1. 移除 Backend 导入和 PCG 强制分支 (python/sglang/srt/managers/overlap_utils.py): 删除 from sglang.srt.model_executor.cuda_graph_config import Backend 导入。删除 decide_needs_cpu_seq_lens 中检查 cuda_graph_config.prefill.backend == Backend.TC_PIECEWISE 并返回 True 的分支。
  2. 添加 ngram 解码强制分支 (python/sglang/srt/managers/overlap_utils.py): 在 TBO 检查之后添加新的条件分支:若 SpeculativeAlgorithm.from_string(server_args.speculative_algorithm).is_ngram() 为真,则返回 True。这是因为 ngram 的 USE_FULL_MASK 验证路径会读取每个请求的 seq_lens_cpu 来生成树掩码,与 attention backend 无关。
  3. 更新函数 docstring (python/sglang/srt/managers/overlap_utils.py): 将 docstring 从 "force True under TBO / piecewise CG" 改为 "force True under TBO ... or ngram",反映新的强制条件。
  4. 删除不再需要的单元测试 (test/registered/unit/server_args/test_server_args.py): 删除 test_overlap_force_cpu_seq_lens_with_tc_piecewise_prefill 测试方法,该测试验证了旧行为——当使用 TC_PIECEWISE 时 decide_needs_cpu_seq_lens 返回 True
文件 模块 状态 重要度
python/sglang/srt/managers/overlap_utils.py 推流调度 modified 6.54
test/registered/unit/server_args/test_server_args.py 服务参数 modified 4.35

关键符号

decide_needs_cpu_seq_lens

关键源码片段

python/sglang/srt/managers/overlap_utils.py core-logic

核心变更文件,修改了 `decide_needs_cpu_seq_lens` 函数,移除 TC_PIECEWISE 强制 D2H 同步,添加 ngram 特例。

# python/sglang/srt/managers/overlap_utils.pydef decide_needs_cpu_seq_lens(
    server_args: ServerArgs,
    attn_backends: Sequence[AttentionBackend],
) -> bool:
    """Whether FutureMap must publish seq_lens_cpu / sum.    OR over per-backend needs_cpu_seq_lens; force True under TBO (it reads the
    CPU mirror outside the backend layer to split the batch) or ngram (its
    USE_FULL_MASK verify path reads the host mirror regardless of backend).
    """
    if server_args.enable_two_batch_overlap:
        # FIXME: support TBO without seq lens cpu value
        return True
    if SpeculativeAlgorithm.from_string(server_args.speculative_algorithm).is_ngram():
        # ngram's USE_FULL_MASK verify path reads seq_lens_cpu per req to size
        # the tree mask, regardless of the attn backend (e.g. Triton opts out).
        return True
    # Skip unset slots (e.g. draft_extend_attn_backend on some spec configs);
    # missing flag -> True so undeclared backends stay on the legacy path.
    return any(
        getattr(b, "needs_cpu_seq_lens", True) for b in attn_backends if b is not None
    )

评论区精华

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

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

风险与影响

回归风险:如果某个消费者隐式依赖 PCG 强制发布但未声明 needs_cpu_seq_lens = True,在此 PR 后可能收到 Noneseq_lens_cpu 并导致错误。PR body 声称所有消费者都已处理:decode-graph replay 守卫 seq_lens_sum;输入 padding 和 cuda-graph fill_from 在 None 时跳过。但需要验证这些断言是否覆盖所有生产路径(尤其 speculative 场景)。ngram 覆盖:新增的 ngram 条件分支确保了该场景仍能得到 CPU seq_lens,但测试中未包含 ngram 的验证用例,缺少负面测试。

性能影响:对于使用 TC_PIECEWISE 预填且 attention backend 不需要 CPU seq_lens 的配置(如 trtllm_mha、trtllm_mla、triton),此 PR 消除了每个 step 的 D2H 同步,可能带来延迟改善。具体提升幅度取决于模型和硬件。功能影响:仅影响 PCG 预填路径,不影响 TBO 或 standard CUDA graph 模式。测试影响:删除了一个测试,测试覆盖有所减少。

回归风险:隐含依赖 测试覆盖减少

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论