From e8c6e5466c762bc8506bd3a2f799532746d68cb3 Mon Sep 17 00:00:00 2001 From: Xinyu Zhang <60529799+xyuzh@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:17:52 -0700 Subject: [PATCH] [Ray] Auto-create placement group in RayEngine when none is detected (#22898) --- python/sglang/srt/ray/engine.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/python/sglang/srt/ray/engine.py b/python/sglang/srt/ray/engine.py index b627065c0..ba7505733 100644 --- a/python/sglang/srt/ray/engine.py +++ b/python/sglang/srt/ray/engine.py @@ -100,11 +100,33 @@ class RayEngine(Engine): """ pg = ray.util.get_current_placement_group() if pg is None: - raise RuntimeError( - "use_ray=True requires a placement group, but none was detected. " - "Schedule the Engine actor onto a placement group" + from ray.util.placement_group import ( + placement_group as create_placement_group, ) + if server_args.enable_dp_attention: + total_gpus = server_args.tp_size * server_args.pp_size + else: + total_gpus = ( + server_args.dp_size * server_args.tp_size * server_args.pp_size + ) + + nnodes = server_args.nnodes + gpus_per_node = total_gpus // nnodes + strategy = "STRICT_PACK" if nnodes == 1 else "SPREAD" + + logger.info( + "No placement group detected. Auto-creating one with " + f"{nnodes} bundle(s), {gpus_per_node} GPU(s)/bundle, " + "placement group explicitly and schedule the Engine onto it." + ) + + pg = create_placement_group( + [{"CPU": 1, "GPU": gpus_per_node}] * nnodes, + strategy=strategy, + ) + ray.get(pg.ready()) + nnodes = server_args.nnodes # co-located with the Engine and rank0 scheduler at the same node