[Weight Cache] Make daemon socket/ready paths configurable via env (#36299)

This commit is contained in:
siyu
2026-08-26 12:38:50 -07:00
committed by GitHub
parent 5263568bcb
commit e7e7894016
2 changed files with 35 additions and 9 deletions
+14
View File
@@ -1540,6 +1540,20 @@ class Envs:
# Most batched requests one /generate HTTP call may expand into.
SGLANG_MAX_BATCH_REQS_PER_HTTP_REQ = EnvInt(4096)
# ===================================================================
# Weight Cache Daemon
# ===================================================================
# Paths the daemon and the engine ranks it serves must agree on. Both are
# format templates and must keep the {global_rank} placeholder: each rank
# talks to the daemon on its own GPU, so a rank-independent path would point
# every rank at one daemon and map another rank's shard.
SGLANG_WEIGHT_CACHE_SOCKET_TEMPLATE = EnvStr(
"/tmp/sglang_weight_cache_rank{global_rank}.sock"
)
SGLANG_WEIGHT_CACHE_READY_TEMPLATE = EnvStr(
"/tmp/sglang_weight_cache_rank{global_rank}.ready"
)
envs = Envs()
EnvField._allow_set_name = False
+21 -9
View File
@@ -15,17 +15,11 @@ from typing import Any, Dict, Optional
import msgspec
from sglang.srt.environ import envs
from sglang.srt.utils.common import safe_pickle_loads
logger = logging.getLogger(__name__)
# Socket path template for weight cache daemons (keyed by global rank
# = tp_size * pp_rank + tp_rank, so multi-node / multi-PP don't collide)
WEIGHT_CACHE_SOCKET_TEMPLATE = "/tmp/sglang_weight_cache_rank{global_rank}.sock"
# Ready file template — daemon writes this after loading completes
WEIGHT_CACHE_READY_TEMPLATE = "/tmp/sglang_weight_cache_rank{global_rank}.ready"
class CacheConfig(msgspec.Struct):
"""Fingerprint of the cached weights. Used to validate compatibility
@@ -308,12 +302,30 @@ def compute_local_gpu_id(
)
def _format_daemon_path(env_field, global_rank: int) -> str:
"""Fill in a daemon path template, rejecting one that drops the rank.
The template is user-overridable, and ``str.format`` silently ignores a
missing placeholder. Every rank would then derive the same path and map the
shard belonging to whichever daemon got there first, so refuse up front
rather than serve wrong weights.
"""
template = env_field.get()
if "{global_rank}" not in template:
raise ValueError(
f"{env_field.name}={template!r} must contain '{{global_rank}}': each "
f"rank needs its own path, and a rank-independent one would point "
f"every rank at a single daemon."
)
return template.format(global_rank=global_rank)
def get_socket_path(global_rank: int) -> str:
"""Get the Unix socket path for a weight cache daemon.
global_rank = tp_size * pp_rank + tp_rank
"""
return WEIGHT_CACHE_SOCKET_TEMPLATE.format(global_rank=global_rank)
return _format_daemon_path(envs.SGLANG_WEIGHT_CACHE_SOCKET_TEMPLATE, global_rank)
def get_ready_path(global_rank: int) -> str:
@@ -321,7 +333,7 @@ def get_ready_path(global_rank: int) -> str:
global_rank = tp_size * pp_rank + tp_rank
"""
return WEIGHT_CACHE_READY_TEMPLATE.format(global_rank=global_rank)
return _format_daemon_path(envs.SGLANG_WEIGHT_CACHE_READY_TEMPLATE, global_rank)
def _read_ready_pid(ready_path: str) -> Optional[int]: