Rust server: align launcher and request validation behavior (#37327)

This commit is contained in:
Lianmin Zheng
2026-09-01 23:42:36 -07:00
committed by GitHub
parent 83bd2c473f
commit f8f04bafa8
13 changed files with 317 additions and 41 deletions
+3
View File
@@ -2171,6 +2171,9 @@ class Scheduler(
# Park the idle loop on the request ring within the rank-0 rust-server
self.idle_sleeper = RustServerIdleSleeper(rust_server)
def rust_server_tokenizer_path(self) -> str:
return get_serving().tokenizer_path
def init_request_receiver(self) -> None:
self.request_receiver = SchedulerRequestReceiver(
recv_from_tokenizer=self.recv_from_tokenizer,
+1 -3
View File
@@ -46,7 +46,7 @@ def _build_server_args(scheduler: Scheduler) -> ServerArgs:
return ext.ServerArgs(
model_path=get_model().model_path,
served_model_name=get_serving().served_model_name,
tokenizer_path=get_serving().tokenizer_path,
tokenizer_path=scheduler.rust_server_tokenizer_path(),
revision=get_model().revision,
load_format=get_model().load_format,
weight_version=get_serving().weight_version,
@@ -76,8 +76,6 @@ def _build_server_args(scheduler: Scheduler) -> ServerArgs:
**mc.get_default_sampling_params()
),
),
# `preferred_sampling_params` is deliberately absent: `launch`
# refuses to start when it is set, so the Rust server never needs it.
preferred_sampling_params=(
json.dumps(get_serving().preferred_sampling_params)
if get_serving().preferred_sampling_params is not None
+2 -14
View File
@@ -35,6 +35,7 @@ from sglang.srt.utils.flatten import (
NestedRowColumns,
RaggedPairColumns,
)
from sglang.srt.utils.network import NetworkAddress
if TYPE_CHECKING:
from sglang.srt.managers.io_struct import BatchTokenIDOutput
@@ -76,24 +77,11 @@ class RustServer:
os.environ.setdefault("TOKENIZERS_PARALLELISM", "false")
server_args = scheduler.server_args
# `TokenizerManager` merges these under each request's own sampling params
# (`{**preferred, **obj.sampling_params}`), and this server replaces that
# manager wholesale — so honouring the flag is not implemented here yet.
# Refuse rather than run: silently dropping it means generating with
# sampling the operator did not configure, and `/get_model_info` would go on
# advertising values no request ever receives.
if get_serving().preferred_sampling_params:
raise ValueError(
"SGLANG_RUST_SERVER does not yet apply --preferred-sampling-params "
"(the Python TokenizerManager merges it into every request; the rust "
"ingress has no equivalent). Launch without SGLANG_RUST_SERVER, or "
"drop --preferred-sampling-params and send those values per request."
)
# Per-DP-rank HTTP port with client load balancing. `None` when DP is off,
# so the rank is not conflated with rank 0 of a one-rank group.
dp_rank = scheduler.ps.attn_dp_rank if scheduler.ps.dp_size > 1 else None
listen_port = get_serving().port + (dp_rank or 0)
listen_addr = f"{get_serving().host}:{listen_port}"
listen_addr = NetworkAddress(get_serving().host, listen_port).to_host_port_str()
launch_cores, server_cores = _partition_cores(
mm_workers=(