From b4d347e86ee989bae5bd75a16f0e8e0c4984e3a7 Mon Sep 17 00:00:00 2001 From: shuwenn <47200617+alphabetc1@users.noreply.github.com> Date: Sun, 10 May 2026 14:56:24 +0800 Subject: [PATCH] [SPEC V2] fix: skip stale state updates in spec-v2 overlap (#23456) --- .../managers/scheduler_output_processor_mixin.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/python/sglang/srt/managers/scheduler_output_processor_mixin.py b/python/sglang/srt/managers/scheduler_output_processor_mixin.py index d933e6197..d572039e6 100644 --- a/python/sglang/srt/managers/scheduler_output_processor_mixin.py +++ b/python/sglang/srt/managers/scheduler_output_processor_mixin.py @@ -398,11 +398,21 @@ class SchedulerOutputProcessorMixin: assert stride is not None, "spec-v2 result missing speculative_num_draft_tokens" for i, req in enumerate(batch.reqs): - # -1 because prepare_for_decode pre-claimed the bonus slot. - req.kv_committed_len += accept_lens[i] - 1 predict_tokens.append( next_token_ids[i * stride : i * stride + accept_lens[i]] ) + + if req.is_retracted: + # reset_for_retract() already zeroes committed/allocated KV. + continue + + if req.finished(): + # -1 because prepare_for_decode pre-claimed the bonus slot. + req.kv_committed_len -= 1 + continue + + # -1 because prepare_for_decode pre-claimed the bonus slot. + req.kv_committed_len += accept_lens[i] - 1 req.spec_verify_ct += 1 accepted_draft_tokens = result.num_accepted_drafts_per_req_cpu[i]