Prhub

#24965 [Spec] Fix ngram metric off-by-1 in `num_accepted_drafts_per_req_cpu`

原始 PR 作者 hnyls2002 合并时间 2026-05-12 03:25 文件变更 1 提交数 1 评论 2 代码增减 +3 / -2

执行摘要

修复 ngram 投机解码指标偏移

ngram 路径将 verify_input.num_accepted_drafts(仅草案数)作为 accept_lens 传入,下游 scheduler_output_processor_mixin 期望包含 bonus token 的值并减 1,导致统计指标 spec_accepted_draftsspec_acceptance_histogram 错误地少 1。PR body 明确指出该问题。

值得快速合入,修复明显。建议后续补充单元测试验证指标值。

讨论亮点

无 reviewer 讨论。仅 gemini-code-assist[bot] 自动评论确认变更内容,无反馈。PR 作者触发了一次 /rerun-test 以执行 test_ngram_speculative_decoding.py,测试通过。

实现拆解

  1. 定位文件:python/sglang/srt/speculative/ngram_worker.pyforward_batch_generation 方法的第 332 行。
  2. 变更:将 accept_lens = verify_input.num_accepted_drafts 改为 accept_lens = verify_input.num_accepted_tokensnum_accepted_tokens 已在 ngram_info.py:456 计算为 num_accepted_drafts + 1,包含 bonus token。
  3. 更新注释:从 "Store accept_lens for per-request metrics" 更新为 "Store accept_lens (with bonus) for per-request metrics; downstream subtracts 1 to recover drafts-only counts.",明确下游行为。
  4. 未涉及测试、配置或部署配套更改。
文件 模块 状态 重要度
python/sglang/srt/speculative/ngram_worker.py 投机解码 modified 5.22

关键符号

ngram_worker.forward_batch_generation

关键源码片段

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

单文件修改,核心逻辑变更:修复指标中 accept_lens 的取值。

            if get_global_tracing_enabled():
                for idx, req in enumerate(batch.reqs):
                    accepted = (
                        verify_input.num_accepted_drafts[idx].item()
                        if verify_input.num_accepted_drafts is not None
                        else 0
                    )
                    req.time_stats.set_spec_verify_end_time(accepted_tokens=accepted)
​
            # Store accept_lens (with bonus) for per-request metrics; downstream
            # subtracts 1 to recover drafts-only counts.
            accept_lens = verify_input.num_accepted_tokens
            if batch.return_logprob:
                add_output_logprobs_for_spec_v1(batch, verify_input, logits_output)

该代码块来自 forward_batch_generation 方法。关键变更在第 333 行:将 accept_lens 的赋值来源从 num_accepted_drafts(仅草案数)改为 num_accepted_tokens(含 bonus token),以匹配下游处理器的预期。

评论区精华

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

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

风险与影响

风险极低。变更是简单的单行赋值替换,仅影响指标统计,不改变控制流、模型输出或采样结果。num_accepted_tokens 已在同一代码路径中计算,无新增依赖。但缺少新增测试来验证指标正确性,可能存在回归风险。

影响范围窄,仅修复 ngram 投机解码场景下 num_accepted_drafts_per_req_cpu 指标的统计准确性。对用户:spec_accepted_draftsspec_acceptance_histogram 输出将正确包含 bonus token。不影响其他投机方法(如 eagle2)。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论