[HiCache] buffer mode: anchor-lock staged prefetches by default (#37464)
This commit is contained in:
@@ -723,9 +723,9 @@ class Envs:
|
|||||||
SGLANG_HICACHE_FILE_BACKEND_ENABLE_METADATA_CACHE = EnvBool(False)
|
SGLANG_HICACHE_FILE_BACKEND_ENABLE_METADATA_CACHE = EnvBool(False)
|
||||||
# Positive cache TTL for filesystem metadata lookups (-1 disables positive expiration)
|
# Positive cache TTL for filesystem metadata lookups (-1 disables positive expiration)
|
||||||
SGLANG_HICACHE_FILE_BACKEND_METADATA_TTL = EnvFloat(5.0)
|
SGLANG_HICACHE_FILE_BACKEND_METADATA_TTL = EnvFloat(5.0)
|
||||||
# Buffer mode: pin a staged prefetch's device anchor from IO commit to
|
# Buffer mode: staged prefetches pin their device anchor from IO commit
|
||||||
# consumption so eviction cannot waste the fetch; cap = fraction of pool.
|
# to consumption so eviction cannot waste the fetch. Cap = fraction of
|
||||||
SGLANG_ENABLE_HICACHE_BUFFER_ANCHOR_LOCK = EnvBool(False)
|
# the pool the pins may hold; 0 disables pinning.
|
||||||
SGLANG_HICACHE_BUFFER_ANCHOR_LOCK_CAP = EnvFloat(0.5)
|
SGLANG_HICACHE_BUFFER_ANCHOR_LOCK_CAP = EnvFloat(0.5)
|
||||||
SGLANG_HICACHE_NIXL_BACKEND_STORAGE_DIR = EnvStr(None)
|
SGLANG_HICACHE_NIXL_BACKEND_STORAGE_DIR = EnvStr(None)
|
||||||
# Enable O_DIRECT when opening NIXL POSIX backend files (bypasses OS page cache).
|
# Enable O_DIRECT when opening NIXL POSIX backend files (bypasses OS page cache).
|
||||||
@@ -1765,6 +1765,10 @@ _DEPRECATED_ENVS: Dict[str, _DeprecatedEnv] = {
|
|||||||
"SGLANG_FLASHINFER_PR4266_SOURCE": _DeprecatedEnv(),
|
"SGLANG_FLASHINFER_PR4266_SOURCE": _DeprecatedEnv(),
|
||||||
# DSV4 compressor V2 is always used.
|
# DSV4 compressor V2 is always used.
|
||||||
"SGLANG_OPT_USE_COMPRESSOR_V2": _DeprecatedEnv(),
|
"SGLANG_OPT_USE_COMPRESSOR_V2": _DeprecatedEnv(),
|
||||||
|
"SGLANG_ENABLE_HICACHE_BUFFER_ANCHOR_LOCK": _DeprecatedEnv(
|
||||||
|
note="Buffer-mode anchor pinning is always on; set "
|
||||||
|
"SGLANG_HICACHE_BUFFER_ANCHOR_LOCK_CAP=0 to disable it."
|
||||||
|
),
|
||||||
# Replaced by CLI flags.
|
# Replaced by CLI flags.
|
||||||
"SGLANG_ENABLE_GRPC": _DeprecatedEnv(
|
"SGLANG_ENABLE_GRPC": _DeprecatedEnv(
|
||||||
note="Please use '--grpc-port' to enable the native gRPC server."
|
note="Please use '--grpc-port' to enable the native gRPC server."
|
||||||
|
|||||||
@@ -222,8 +222,6 @@ class BufferModePipeline:
|
|||||||
# Metadata-only pending-write backlog cap; beyond it new intents
|
# Metadata-only pending-write backlog cap; beyond it new intents
|
||||||
# are dropped at admission (re-trigger on a later hit).
|
# are dropped at admission (re-trigger on a later hit).
|
||||||
self.write_backlog_cap = write_backlog_cap
|
self.write_backlog_cap = write_backlog_cap
|
||||||
# Anchor-lock knobs; the cap keeps queued holds from pinning the pool.
|
|
||||||
self.anchor_lock_enabled = envs.SGLANG_ENABLE_HICACHE_BUFFER_ANCHOR_LOCK.get()
|
|
||||||
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
||||||
|
|
||||||
kvcache = cache.token_to_kv_pool_allocator.get_kvcache()
|
kvcache = cache.token_to_kv_pool_allocator.get_kvcache()
|
||||||
@@ -239,8 +237,7 @@ class BufferModePipeline:
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
"BufferModePipeline anchor_lock_enabled=%s cap_tokens=%d",
|
"BufferModePipeline anchor_lock_cap_tokens=%d",
|
||||||
self.anchor_lock_enabled,
|
|
||||||
self.anchor_lock_cap_tokens,
|
self.anchor_lock_cap_tokens,
|
||||||
)
|
)
|
||||||
self.reset()
|
self.reset()
|
||||||
@@ -690,8 +687,6 @@ class BufferModePipeline:
|
|||||||
O(prefix path)). Returns "locked", "no_anchor" (nothing to pin),
|
O(prefix path)). Returns "locked", "no_anchor" (nothing to pin),
|
||||||
"cap_skip" (over cap; launches unlocked), or "anchor_lost" (splice
|
"cap_skip" (over cap; launches unlocked), or "anchor_lost" (splice
|
||||||
base gone — the caller cancels the storage IO)."""
|
base gone — the caller cancels the storage IO)."""
|
||||||
if not self.anchor_lock_enabled:
|
|
||||||
return "no_anchor"
|
|
||||||
if req_id in self.anchor_locks:
|
if req_id in self.anchor_locks:
|
||||||
return "locked"
|
return "locked"
|
||||||
prefix_ctx = self._prefetch_prefix_ctx.get(req_id)
|
prefix_ctx = self._prefetch_prefix_ctx.get(req_id)
|
||||||
|
|||||||
@@ -966,7 +966,6 @@ class TestUnifiedRadixCacheEagleHiCacheStorageKey(CustomTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
pipeline = BufferModePipeline.__new__(BufferModePipeline)
|
pipeline = BufferModePipeline.__new__(BufferModePipeline)
|
||||||
pipeline.anchor_lock_enabled = True
|
|
||||||
pipeline.anchor_locks = {}
|
pipeline.anchor_locks = {}
|
||||||
pipeline.anchor_locked_tokens_ = 0
|
pipeline.anchor_locked_tokens_ = 0
|
||||||
pipeline.anchor_lock_cap_tokens = 10_000
|
pipeline.anchor_lock_cap_tokens = 10_000
|
||||||
@@ -3793,9 +3792,6 @@ class UnifiedRadixCacheSuite:
|
|||||||
if self.cfg.components != (ComponentType.FULL,) or self.cfg.page_size != 4:
|
if self.cfg.components != (ComponentType.FULL,) or self.cfg.page_size != 4:
|
||||||
self.skipTest("one FULL page_size=4 fixture covers namespace routing")
|
self.skipTest("one FULL page_size=4 fixture covers namespace routing")
|
||||||
|
|
||||||
anchor_lock = envs.SGLANG_ENABLE_HICACHE_BUFFER_ANCHOR_LOCK.override(True)
|
|
||||||
anchor_lock.__enter__()
|
|
||||||
self.addCleanup(anchor_lock.__exit__, None, None, None)
|
|
||||||
storage_dir = tempfile.mkdtemp()
|
storage_dir = tempfile.mkdtemp()
|
||||||
self.addCleanup(shutil.rmtree, storage_dir, ignore_errors=True)
|
self.addCleanup(shutil.rmtree, storage_dir, ignore_errors=True)
|
||||||
|
|
||||||
@@ -4001,9 +3997,6 @@ class UnifiedRadixCacheSuite:
|
|||||||
# the retained per-fixture device memory stays bounded.
|
# the retained per-fixture device memory stays bounded.
|
||||||
if self.cfg.page_size != 1 or self.cfg.sliding_window_size != 4:
|
if self.cfg.page_size != 1 or self.cfg.sliding_window_size != 4:
|
||||||
self.skipTest("requires page_size=1, sliding_window_size=4")
|
self.skipTest("requires page_size=1, sliding_window_size=4")
|
||||||
cm = envs.SGLANG_ENABLE_HICACHE_BUFFER_ANCHOR_LOCK.override(True)
|
|
||||||
cm.__enter__()
|
|
||||||
self.addCleanup(cm.__exit__, None, None, None)
|
|
||||||
storage_dir = tempfile.mkdtemp()
|
storage_dir = tempfile.mkdtemp()
|
||||||
self.addCleanup(shutil.rmtree, storage_dir, ignore_errors=True)
|
self.addCleanup(shutil.rmtree, storage_dir, ignore_errors=True)
|
||||||
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
||||||
@@ -8921,7 +8914,6 @@ class TestAnchorLockOutcomePolicy(CustomTestCase):
|
|||||||
from sglang.srt.mem_cache.buffer_mode.pipeline import BufferModePipeline
|
from sglang.srt.mem_cache.buffer_mode.pipeline import BufferModePipeline
|
||||||
|
|
||||||
pipeline = BufferModePipeline.__new__(BufferModePipeline)
|
pipeline = BufferModePipeline.__new__(BufferModePipeline)
|
||||||
pipeline.anchor_lock_enabled = True
|
|
||||||
pipeline.anchor_locks = {}
|
pipeline.anchor_locks = {}
|
||||||
pipeline.anchor_locked_tokens_ = 0
|
pipeline.anchor_locked_tokens_ = 0
|
||||||
pipeline.anchor_lock_cap_tokens = cap_tokens
|
pipeline.anchor_lock_cap_tokens = cap_tokens
|
||||||
|
|||||||
Reference in New Issue
Block a user