Prhub

#25818 spec_v2: consolidate seq_lens_cpu/sum maintenance into helper

原始 PR 作者 hnyls2002 合并时间 2026-05-20 19:42 文件变更 4 提交数 15 评论 1 代码增减 +29 / -9

执行摘要

集中 seq_lens_cpu/sum 维护到单一辅助方法

消除 seq_lens_cpu 和 seq_lens_sum 在多处分散维护的重复和潜在不一致(如 spec v2 重叠模式下快照/恢复导致过时值),为未来优化提供一个集中、可控的同步点。

合并后建议执行 PR body 中的 test plan。此 PR 的设计决策(延迟计算 + 统一同步点)值得在类似状态维护中借鉴。

讨论亮点

此 PR 仅有自动化配额提示,无技术讨论。

实现拆解

  1. 新增 refresh_seq_lens_cpu 方法schedule_batch.py):带 sync 参数,sync=Trueis_spec_v2 时执行 D2H 同步,否则仅基于 seq_lens_cpu 重算和。
  2. 修改生产者schedule_batch.pyprepare_for_decodefilter_batchmerge_batcheagle_info_v2.pyprepare_for_decodeprepare_for_extend_to_fill_draft_kvcache):移除内联求和及显式 .cpu() 调用,改为设 seq_lens_sum = None 或调用辅助方法(sync=False 当 CPU 副本已最新)。
  3. 添加延迟刷新点forward_batch_info.pyinit_new):构建 ForwardBatch 时若 seq_lens_sum is None,调用 refresh_seq_lens_cpu(sync=False) 确保非重叠路径获正确值。
  4. 设置核心同步点scheduler.pyrun_batch):重叠解码路径中,进入 _overlap_forward_isolation 前调用 batch.refresh_seq_lens_cpu(),确保快照捕获最新 GPU 值。
文件 模块 状态 重要度
python/sglang/srt/managers/schedule_batch.py 调度层 modified 6.81
python/sglang/srt/speculative/eagle_info_v2.py 推测解码 modified 5.57
python/sglang/srt/model_executor/forward_batch_info.py 前向批处理 modified 5.33
python/sglang/srt/managers/scheduler.py 调度器 modified 5.18

关键符号

refresh_seq_lens_cpu prepare_for_decode filter_batch merge_batch prepare_for_extend_to_fill_draft_kvcache prepare_for_v2_verify init_new

关键源码片段

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

核心变更文件:新增 refresh_seq_lens_cpu 方法,修改 prepare_for_decode、filter_batch、merge_batch 为延迟计算 seq_lens_sum。

# python/sglang/srt/managers/schedule_batch.pyclass ScheduleBatch:
    # ...
​
    def refresh_seq_lens_cpu(self, sync: bool = True):
        # sync=True 时,从 GPU 复制 seq_lens 到 CPU(spec v2 需要避免过时)
        # sync=False 时,仅基于现有的 seq_lens_cpu 重新计算和
        if sync and self.is_spec_v2:
            self.seq_lens_cpu = self.seq_lens.cpu()
        self.seq_lens_sum = int(self.seq_lens_cpu.sum())
​
    def prepare_for_decode(self):
        # ... 原有 seq_lens 增加逻辑 ...
        # 原内联求和 self.seq_lens_sum += bs
        self.seq_lens_sum = None # 延迟到实际需要时计算
​
    def filter_batch(self, ...):
        # ... 原有过滤 ...
        # 原内联求和 self.seq_lens_sum = self.seq_lens.sum().item()
        self.seq_lens_sum = None
​
    def merge_batch(self, other):
        # ... 原有合并 ...
        # 原内联求和 self.seq_lens_sum += other.seq_lens_sum
        self.seq_lens_sum = None
python/sglang/srt/managers/scheduler.py core-logic

在重叠解码前添加刷新调用,确保快照捕获最新值。

# python/sglang/srt/managers/scheduler.pydef run_batch(self, batch, ...):
    # ...
    if self.is_generation:
        if self.enable_overlap:
            # 刷新 seq_lens_cpu 和 sum,确保快照抓取最新值
            batch.refresh_seq_lens_cpu()
​
            with self._overlap_forward_isolation(batch):
                # ... 前向逻辑 ...

评论区精华

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

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

风险与影响

refresh_seq_lens_cpu 被遗漏调用或 sync 参数错误(如应 sync 却传 False),会导致 seq_lens_sumNone,进而触发 TypeError 或 KV 缓存分配错误。非 spec v2 重叠解码路径的 sync=False 假设 seq_lens_cpu 已最新,若后续新增修改点打破该假设,可能使用过期数据。无专用测试文件,回归风险依赖集成测试。

用户:无直接可见变化,但减少了潜在 bug(如 #24070 类似的清理问题)。系统:性能上减少不必要的 seq_lens.cpu() 调用,但对实际吞吐影响很小。团队:更清晰的结构,降低新生产者忘记更新 sum 的可能性。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论