Introduce native kv cache move (#15108)
This commit is contained in:
@@ -166,6 +166,7 @@ class Envs:
|
|||||||
SGLANG_TORCH_PROFILER_DIR = EnvStr("/tmp")
|
SGLANG_TORCH_PROFILER_DIR = EnvStr("/tmp")
|
||||||
SGLANG_OTLP_EXPORTER_SCHEDULE_DELAY_MILLIS = EnvInt(500)
|
SGLANG_OTLP_EXPORTER_SCHEDULE_DELAY_MILLIS = EnvInt(500)
|
||||||
SGLANG_OTLP_EXPORTER_MAX_EXPORT_BATCH_SIZE = EnvInt(64)
|
SGLANG_OTLP_EXPORTER_MAX_EXPORT_BATCH_SIZE = EnvInt(64)
|
||||||
|
SGLANG_NATIVE_MOVE_KV_CACHE = EnvBool(False)
|
||||||
|
|
||||||
# Scheduler: memory leak test
|
# Scheduler: memory leak test
|
||||||
SGLANG_TEST_RETRACT = EnvBool(False)
|
SGLANG_TEST_RETRACT = EnvBool(False)
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import dataclasses
|
import dataclasses
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from sglang.srt.configs.mamba_utils import BaseLinearStateParams
|
from sglang.srt.configs.mamba_utils import BaseLinearStateParams
|
||||||
|
from sglang.srt.environ import envs
|
||||||
from sglang.srt.layers.attention.nsa import index_buf_accessor
|
from sglang.srt.layers.attention.nsa import index_buf_accessor
|
||||||
from sglang.srt.layers.attention.nsa.quant_k_cache import quantize_k_cache
|
from sglang.srt.layers.attention.nsa.quant_k_cache import quantize_k_cache
|
||||||
from sglang.srt.utils.torch_memory_saver_adapter import TorchMemorySaverAdapter
|
from sglang.srt.utils.torch_memory_saver_adapter import TorchMemorySaverAdapter
|
||||||
@@ -797,6 +799,10 @@ class MHATokenToKVPool(KVCache):
|
|||||||
self.v_buffer[layer_id - self.start_layer][loc] = cache_v
|
self.v_buffer[layer_id - self.start_layer][loc] = cache_v
|
||||||
|
|
||||||
def move_kv_cache(self, tgt_loc: torch.Tensor, src_loc: torch.Tensor):
|
def move_kv_cache(self, tgt_loc: torch.Tensor, src_loc: torch.Tensor):
|
||||||
|
if envs.SGLANG_NATIVE_MOVE_KV_CACHE.get():
|
||||||
|
move_kv_cache_native(self.k_buffer, self.v_buffer, tgt_loc, src_loc)
|
||||||
|
return
|
||||||
|
|
||||||
N = tgt_loc.numel()
|
N = tgt_loc.numel()
|
||||||
if N == 0:
|
if N == 0:
|
||||||
return
|
return
|
||||||
@@ -1893,6 +1899,22 @@ class DoubleSparseTokenToKVPool(KVCache):
|
|||||||
self.label_buffer[layer_id - self.start_layer][loc] = cache_label
|
self.label_buffer[layer_id - self.start_layer][loc] = cache_label
|
||||||
|
|
||||||
|
|
||||||
|
def move_kv_cache_native(
|
||||||
|
k_buffer: List[torch.Tensor],
|
||||||
|
v_buffer: List[torch.Tensor],
|
||||||
|
tgt_loc: torch.Tensor,
|
||||||
|
src_loc: torch.Tensor,
|
||||||
|
):
|
||||||
|
if tgt_loc.numel() == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
tgt_loc_flat = tgt_loc.view(-1).long()
|
||||||
|
src_loc_flat = src_loc.view(-1).long()
|
||||||
|
for k_cache, v_cache in zip(k_buffer, v_buffer):
|
||||||
|
k_cache[tgt_loc_flat] = k_cache[src_loc_flat]
|
||||||
|
v_cache[tgt_loc_flat] = v_cache[src_loc_flat]
|
||||||
|
|
||||||
|
|
||||||
@triton.jit
|
@triton.jit
|
||||||
def copy_all_layer_kv_cache_tiled(
|
def copy_all_layer_kv_cache_tiled(
|
||||||
data_ptrs,
|
data_ptrs,
|
||||||
|
|||||||
Reference in New Issue
Block a user