[Ray] Support multi-replica serving by making scheduler actor names unique (#22917)

This commit is contained in:
Xinyu Zhang
2026-04-16 14:51:01 -07:00
committed by GitHub
parent a87806a65f
commit d430034bde
2 changed files with 10 additions and 6 deletions
@@ -185,8 +185,9 @@ class RayDataParallelController(DataParallelController):
num_cpus=0, num_cpus=0,
num_gpus=1, num_gpus=1,
name=( name=(
f"sglang_scheduler_rank0node={self.rank0_node_ip}" f"sglang_scheduler_node{self.rank0_node_ip}"
f"_dp{actual_dp_rank}_pp{pp_rank}_tp{tp_rank}" f"_dp{actual_dp_rank}_pp{pp_rank}_tp{tp_rank}"
f"_pg{self.pg.id.hex()[:8]}_bundle{bundle_idx}"
), ),
scheduling_strategy=PlacementGroupSchedulingStrategy( scheduling_strategy=PlacementGroupSchedulingStrategy(
placement_group=self.pg, placement_group=self.pg,
+8 -5
View File
@@ -21,6 +21,7 @@ import threading
from typing import Callable from typing import Callable
import ray import ray
from ray.util.placement_group import PlacementGroup
from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
from sglang.srt.entrypoints.engine import ( from sglang.srt.entrypoints.engine import (
@@ -30,7 +31,7 @@ from sglang.srt.entrypoints.engine import (
_compute_parallelism_ranks, _compute_parallelism_ranks,
) )
from sglang.srt.ray.scheduler_actor import SchedulerActor from sglang.srt.ray.scheduler_actor import SchedulerActor
from sglang.srt.server_args import ZMQ_TCP_PORT_DELTA, PortArgs, ServerArgs from sglang.srt.server_args import PortArgs, ServerArgs
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -42,7 +43,9 @@ class RaySchedulerInitResult(SchedulerInitResult):
scheduler_actors: list = dataclasses.field(default_factory=list) scheduler_actors: list = dataclasses.field(default_factory=list)
def _find_engine_bundle(placement_group, nnodes: int) -> tuple[int, str]: def _find_engine_bundle(
placement_group: PlacementGroup, nnodes: int
) -> tuple[int, str]:
"""Find which placement group bundle is on the same node as the Engine. """Find which placement group bundle is on the same node as the Engine.
Rank0 scheduler must be co-located with the Engine. Returns (bundle_index, engine_ip). Rank0 scheduler must be co-located with the Engine. Returns (bundle_index, engine_ip).
""" """
@@ -146,7 +149,7 @@ class RayEngine(Engine):
f"Use {gpus_per_node} GPUs/node, world_size={world_size}" f"Use {gpus_per_node} GPUs/node, world_size={world_size}"
) )
dist_init_addr = f"{rank0_node_ip}:{server_args.port + ZMQ_TCP_PORT_DELTA}" dist_init_addr = f"{rank0_node_ip}:{port_args.nccl_port}"
logger.info(f"dist_init_addr: {dist_init_addr}") logger.info(f"dist_init_addr: {dist_init_addr}")
scheduler_actors = [] scheduler_actors = []
@@ -172,7 +175,7 @@ class RayEngine(Engine):
actor = SchedulerActor.options( actor = SchedulerActor.options(
num_cpus=0, num_cpus=0,
num_gpus=1, num_gpus=1,
name=f"sglang_scheduler_rank0node={rank0_node_ip}_pp{pp_rank}_tp{tp_rank}", name=f"sglang_scheduler_node{rank0_node_ip}_pp{pp_rank}_tp{tp_rank}_pg{pg.id.hex()[:8]}_bundle{bundle_idx}",
scheduling_strategy=PlacementGroupSchedulingStrategy( scheduling_strategy=PlacementGroupSchedulingStrategy(
placement_group=pg, placement_group=pg,
placement_group_bundle_index=bundle_idx, placement_group_bundle_index=bundle_idx,
@@ -261,7 +264,7 @@ class RayEngine(Engine):
# TCP addresses correctly (required for DP attention path). # TCP addresses correctly (required for DP attention path).
dp_server_args = dataclasses.replace( dp_server_args = dataclasses.replace(
server_args, server_args,
dist_init_addr=f"{rank0_node_ip}:{server_args.port + ZMQ_TCP_PORT_DELTA}", dist_init_addr=f"{rank0_node_ip}:{port_args.nccl_port}",
) )
# Create the DP controller in-process. This blocks until all actors # Create the DP controller in-process. This blocks until all actors