Skip to content
Merged
1 change: 1 addition & 0 deletions python/sglang/srt/batch_overlap/two_batch_overlap.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,7 @@ def filter_batch(
output_dict["out_cache_loc_virtual"] = batch.out_cache_loc_virtual[
start_token_index:end_token_index
]
output_dict["out_cache_loc_is_physical"] = batch.out_cache_loc_is_physical

attention_tp_size = get_parallel().attn_tp_size
_tbo_padded_len = (
Expand Down
38 changes: 27 additions & 11 deletions python/sglang/srt/layers/attention/aiter_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -3076,7 +3076,11 @@ def forward_extend(
if self.kv_cache_is_vectorized_5d:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
k_descale,
Expand Down Expand Up @@ -3120,12 +3124,17 @@ def forward_extend(
kv_lora_rank = v.shape[-1]
self.token_to_kv_pool.set_mla_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_layer(forward_batch, layer),
k[..., :kv_lora_rank],
k[..., kv_lora_rank:],
)
else:
self.token_to_kv_pool.set_kv_buffer(layer, cache_loc, k, v)
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc.for_layer(forward_batch, layer),
k,
v,
)
elif self._use_fused_fp8_kv_write(layer):
# FP8: fuse bf16->fp8 cast + paged write in one kernel.
k_cache, v_cache = self.token_to_kv_pool.get_kv_buffer(
Expand All @@ -3147,7 +3156,11 @@ def forward_extend(
else:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
k_descale,
Expand Down Expand Up @@ -3968,9 +3981,9 @@ def forward_decode(
if self.kv_cache_is_vectorized_5d:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(
forward_batch.out_cache_loc,
self.forward_metadata.swa_out_cache_loc,
KVWriteLoc.for_batch(
forward_batch,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
Expand Down Expand Up @@ -4004,7 +4017,10 @@ def forward_decode(
elif self.use_mla:
# MLA pool has its own set_kv_buffer (no scale args).
self.token_to_kv_pool.set_kv_buffer(
layer, forward_batch.out_cache_loc, k, v
layer,
KVWriteLoc.for_batch(forward_batch),
k,
v,
)
elif self._use_fused_fp8_kv_write(layer):
# FP8: fuse bf16->fp8 cast + paged write in one kernel.
Expand All @@ -4026,9 +4042,9 @@ def forward_decode(
else:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(
forward_batch.out_cache_loc,
self.forward_metadata.swa_out_cache_loc,
KVWriteLoc.for_batch(
forward_batch,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
Expand Down
5 changes: 4 additions & 1 deletion python/sglang/srt/layers/attention/cutedsl_mla_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,10 @@ def forward_decode(
if query is None and save_kv_cache:
assert k is not None and k_rope is not None
self.token_to_kv_pool.set_mla_kv_buffer(
layer, self._kv_write_loc(forward_batch), k, k_rope
layer,
self._kv_write_loc(forward_batch),
k,
k_rope,
)

if query is not None:
Expand Down
26 changes: 12 additions & 14 deletions python/sglang/srt/layers/attention/flashattention_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -1399,11 +1399,6 @@ def forward_extend(
assert v is not None

if save_kv_cache and not self.fa_skip_kv_cache:
cache_loc = (
forward_batch.out_cache_loc
if not layer.is_cross_attention
else forward_batch.encoder_out_cache_loc
)
if self.use_mla:
if cp_active:
cp_strategy = get_cp_strategy()
Expand All @@ -1414,7 +1409,7 @@ def forward_extend(
else:
self.token_to_kv_pool.set_mla_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_layer(forward_batch, layer),
k,
k_rope,
)
Expand All @@ -1436,7 +1431,11 @@ def forward_extend(
v_scale = v_descale if self.kv_cache_is_mxfp8 else layer.v_scale
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
k_scale,
Expand Down Expand Up @@ -1965,17 +1964,16 @@ def forward_decode(
if k is not None:
assert v is not None
if save_kv_cache:
cache_loc = (
forward_batch.out_cache_loc
if not layer.is_cross_attention
else forward_batch.encoder_out_cache_loc
)
if not self.use_mla:
k_scale = k_descale if self.kv_cache_is_mxfp8 else layer.k_scale
v_scale = v_descale if self.kv_cache_is_mxfp8 else layer.v_scale
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
k_scale,
Expand All @@ -1984,7 +1982,7 @@ def forward_decode(
else:
self.token_to_kv_pool.set_mla_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_layer(forward_batch, layer),
k,
k_rope,
)
Expand Down
28 changes: 15 additions & 13 deletions python/sglang/srt/layers/attention/flashinfer_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -1316,11 +1316,6 @@ def forward_extend(
prefill_wrapper_paged = self.forward_metadata.prefill_wrappers[
self._get_wrapper_idx(layer)
]
cache_loc = (
forward_batch.out_cache_loc
if not layer.is_cross_attention
else forward_batch.encoder_out_cache_loc
)

logits_soft_cap = layer.logit_cap

Expand Down Expand Up @@ -1354,7 +1349,11 @@ def forward_extend(
assert v is not None
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
*self._kv_write_scales(layer),
Expand Down Expand Up @@ -1456,7 +1455,11 @@ def forward_extend(
if save_kv_cache:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
*self._kv_write_scales(layer),
Expand All @@ -1477,18 +1480,17 @@ def forward_decode(
decode_wrapper = self.forward_metadata.decode_wrappers[
self._get_wrapper_idx(layer)
]
cache_loc = (
forward_batch.out_cache_loc
if not layer.is_cross_attention
else forward_batch.encoder_out_cache_loc
)

if k is not None:
assert v is not None
if save_kv_cache:
self.token_to_kv_pool.set_kv_buffer(
layer,
KVWriteLoc(cache_loc, self.forward_metadata.swa_out_cache_loc),
KVWriteLoc.for_layer(
forward_batch,
layer,
swa_loc=self.forward_metadata.swa_out_cache_loc,
),
k,
v,
*self._kv_write_scales(layer),
Expand Down
16 changes: 9 additions & 7 deletions python/sglang/srt/layers/attention/flashinfer_mla_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
update_local_kv_lens_for_dcp,
)
from sglang.srt.layers.dcp.planner import plan_dcp_decode_metadata
from sglang.srt.mem_cache.memory_pool import KVWriteLoc
from sglang.srt.model_executor.forward_batch_info import ForwardBatch, ForwardMode
from sglang.srt.model_executor.runner_backend_utils.breakable_cuda_graph import (
is_in_breakable_cuda_graph,
Expand Down Expand Up @@ -703,8 +704,6 @@ def forward_extend(
assert q_rope is None
assert k_rope is None
return self.mha_chunk_kv_cache.forward(q, k, v, layer, forward_batch)

cache_loc = forward_batch.out_cache_loc
logits_soft_cap = layer.logit_cap
prefill_wrapper_paged = self.forward_metadata.prefill_wrapper

Expand All @@ -713,9 +712,13 @@ def forward_extend(
assert v is not None
if save_kv_cache:
if k_rope is not None:
self.token_to_kv_pool.set_mla_kv_buffer(layer, cache_loc, k, k_rope)
self.token_to_kv_pool.set_mla_kv_buffer(
layer, KVWriteLoc.for_batch(forward_batch), k, k_rope
)
else:
self.token_to_kv_pool.set_kv_buffer(layer, cache_loc, k, v)
self.token_to_kv_pool.set_kv_buffer(
layer, KVWriteLoc.for_batch(forward_batch), k, v
)
if q_rope is not None:
q = q.view(-1, layer.tp_q_head_num, layer.v_head_dim)
q_rope = q_rope.view(
Expand Down Expand Up @@ -776,22 +779,21 @@ def forward_decode(
k_rope: Optional[torch.Tensor] = None,
):
decode_wrapper = self.forward_metadata.decode_wrapper
cache_loc = forward_batch.out_cache_loc

if k is not None:
assert v is not None
if save_kv_cache:
if k_rope is not None:
self.token_to_kv_pool.set_mla_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_batch(forward_batch),
k,
k_rope,
)
else:
self.token_to_kv_pool.set_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_batch(forward_batch),
k,
v,
)
Expand Down
9 changes: 5 additions & 4 deletions python/sglang/srt/layers/attention/flashmla_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from sglang.srt.layers.attention.flashinfer_mla_backend import FlashInferMLAAttnBackend
from sglang.srt.layers.attention.verify_mask import VerifyMask, maybe_create_verify_mask
from sglang.srt.mem_cache.layout.paged_view import paged_view
from sglang.srt.mem_cache.memory_pool import KVWriteLoc
from sglang.srt.model_executor.forward_batch_info import ForwardBatch, ForwardMode
from sglang.srt.runtime_context import get_parallel, get_spec

Expand Down Expand Up @@ -424,14 +425,13 @@ def forward_decode(
forward_batch: ForwardBatch,
save_kv_cache: bool = True,
):
cache_loc = forward_batch.out_cache_loc

if k is not None:
assert v is not None
if save_kv_cache:
self.token_to_kv_pool.set_kv_buffer(
layer,
cache_loc,
KVWriteLoc.for_batch(forward_batch),
k,
v,
)
Expand Down Expand Up @@ -509,12 +509,13 @@ def forward_extend(
return super().forward_extend(q, k, v, layer, forward_batch, save_kv_cache)
else:
# target_verify / draft_extend_v2: fixed-q decode-style kernel.
cache_loc = forward_batch.out_cache_loc

if k is not None:
assert v is not None
if save_kv_cache:
self.token_to_kv_pool.set_kv_buffer(layer, cache_loc, k, v)
self.token_to_kv_pool.set_kv_buffer(
layer, KVWriteLoc.for_batch(forward_batch), k, v
)

bs = forward_batch.batch_size
k_cache = self.token_to_kv_pool.get_key_buffer(layer.layer_id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
)
from sglang.srt.layers.logits_processor import get_in_autotune_dummy_run
from sglang.srt.mem_cache.layout.paged_view import paged_row_view
from sglang.srt.mem_cache.memory_pool import KVWriteLoc
from sglang.srt.runtime_context import (
get_parallel,
get_resources,
Expand Down Expand Up @@ -289,7 +290,7 @@ def prepare_prefill_qkv(
k_pe_fp8 = k_fp8[:, 0:1, layer.qk_nope_head_dim :]
self.token_to_kv_pool.set_mla_kv_buffer(
layer.attn_mha,
forward_batch.out_cache_loc,
KVWriteLoc.for_batch(forward_batch),
kv_a_fp8.unsqueeze(1),
k_pe_fp8,
)
Expand Down Expand Up @@ -402,7 +403,10 @@ def forward_decode(

if save_kv_cache:
self.token_to_kv_pool.set_mla_kv_buffer(
layer, self._kv_write_loc(forward_batch), k, k_rope
layer,
self._kv_write_loc(forward_batch),
k,
k_rope,
)

query = q.view(-1, layer.tp_q_head_num, layer.head_dim)
Expand Down
Loading
Loading