Prhub

#27761 [Spec] Remove dead `prepare_for_verify` / `prepare_extend_after_decode` + extend-decode kernel

原始 PR 作者 hnyls2002 合并时间 2026-06-12 11:59 文件变更 3 提交数 1 评论 4 代码增减 +6 / -150

执行摘要

清理推测解码 V1 残留死代码

PR body 指出:在 #27977 移除 V1 调度器分发和 EagleVerifyInput.verify / EagleVerifyOutput 后,这些辅助方法成为零引用死代码。保持代码库整洁,避免误导后续开发。

建议快速审查当前 PR 确认无遗漏;对 speculative 架构演进感兴趣的开发者可结合 #27977 一起阅读,理解 V1→V2 的过渡细节。

讨论亮点

PR 未引发实质性技术讨论。作者主动 /rerun-test 触发指定测试并通过,合并前无 review 评论。

实现拆解

本 PR 分三步清理无引用代码:

  1. 删除核心方法:在 python/sglang/srt/speculative/eagle_info.py 中移除 EagleVerifyInput.prepare_for_verifyEagleDraftExtendInput.prepare_extend_after_decode 两个方法,并删除相关的导入(ScheduleBatchalloc_token_slotsassign_req_to_token_pool_func 等)。
  2. 移除 Triton kernel:在 python/sglang/srt/speculative/triton_ops/cache_locs.py 中删除 create_extend_after_decode_spec_info Triton JIT kernel,该 kernel 仅服务于上一步的方法。
  3. 清理再导出:在 python/sglang/srt/speculative/spec_utils.py 中移除对 create_extend_after_decode_spec_info 的再导出行。
    无需额外测试,作者通过 ast + pyflakes 静态分析验证了零引用,原有 CI 测试(bookkeeping 所有权、frozen-KV MTP、EAGLE spec)均通过。
文件 模块 状态 重要度
python/sglang/srt/speculative/eagle_info.py 推测解码 modified 7.67
python/sglang/srt/speculative/spec_utils.py 推测解码 modified 4.19
python/sglang/srt/speculative/triton_ops/cache_locs.py 推测解码 modified 4.52

关键符号

prepare_for_verify prepare_extend_after_decode create_extend_after_decode_spec_info

关键源码片段

python/sglang/srt/speculative/eagle_info.py core-logic

核心变更文件,删除两个里程碑级别的 V1 方法及大量相关导入。

@dataclass
class EagleVerifyInput(SpecInput, EagleVerifyInputV2Mixin):
    # 字段定义(与删除前一致)
    draft_token: torch.Tensor
    custom_mask: torch.Tensor
    positions: torch.Tensor
    retrieve_index: torch.Tensor
    retrieve_next_token: torch.Tensor
    retrieve_next_sibling: torch.Tensor
    retrieve_cum_len: torch.Tensor
    spec_steps: int
    topk: int
    draft_token_num: int
    capture_hidden_mode: CaptureHiddenMode
    seq_lens_sum: int
    seq_lens_cpu: torch.Tensor
​
    def __post_init__(self):
        super().__init__(SpecInputType.EAGLE_VERIFY)
        if self.num_tokens_per_req < 0:
            self.num_tokens_per_req = self.draft_token_num
​
    def get_spec_adjust_token_coefficient(self) -> Tuple[int, int]:
        return self.draft_token_num, self.draft_token_num
​
    @classmethod
    def create_idle_input(cls, topk, spec_steps, num_verify_tokens):
        '\'\'\'创建空闲批次桩输入(未修改)。\'\'\''
        return cls(
            draft_token=torch.empty((0,), dtype=torch.long, device='cuda'),
            custom_mask=torch.full((0,), True, dtype=torch.bool, device='cuda'),
            positions=torch.empty((0,), dtype=torch.int64, device='cuda'),
            retrieve_index=torch.full((0, num_verify_tokens), -1, dtype=torch.long, device='cuda'),
            retrieve_next_token=torch.full((0, num_verify_tokens), -1, dtype=torch.long, device='cuda'),
            retrieve_next_sibling=torch.full((0, num_verify_tokens), -1, dtype=torch.long, device='cuda'),
            retrieve_cum_len=None,
            topk=topk,
            draft_token_num=num_verify_tokens,
            spec_steps=spec_steps,
            capture_hidden_mode=CaptureHiddenMode.FULL,
            seq_lens_sum=0,
            seq_lens_cpu=torch.empty((0,), dtype=torch.int64),
        )
​
    # ========= 以下方法已被移除 =========
    # prepare_for_verify(self, batch, page_size):
    # V1 同步验证缓存分配方法,不再被任何调用者引用
    # (所有推测算法已走 V2 worker)

评论区精华

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

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

风险与影响

风险极低。所有删除的方法及内核均经静态分析确认无任何调用点(ast + pyflakes)。保留的 EagleDraftExtendInput 字段仍被 FrozenKVMTPDraftExtendInput 读取,不受影响。CI 覆盖了关键 speculative 测试场景。

  • 用户:无功能变化,推理结果不受影响。
  • 系统:减少约 150 行代码和 1 个 Triton kernel,编译时间和二进制体积微降。
  • 团队:清理后 speculative 模块更聚焦于 V2 路径,降低代码理解成本。
低风险 静态验证 无功能影响

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论