A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 10, 04:00 UTC
[Bugfix] Strengthen the check of X-data-parallel-rank in Hybrid LB mode (#32314)
Signed-off-by: Tianchen Ding <dtcccc@linux.alibaba.com>
dtc committed
Jan 15, 2026 at 16:31 UTC
1e584823f8f9f7b8504c90dfa7689061537280da
7 files changed
+20
-22
tests/v1/engine/test_engine_core_client.py
+1
@@ -143,6 +143,7 @@ def test_mp_client_uses_env_timeout(monkeypatch: pytest.MonkeyPatch):
143
data_parallel_rank_local=None,
144
data_parallel_hybrid_lb=False,
145
data_parallel_external_lb=False,
146
+ local_engines_only=False,
147
)
148
vllm_config = SimpleNamespace(parallel_config=parallel_config)
149
vllm/config/parallel.py
+8
@@ -361,6 +361,14 @@ class ParallelConfig:
361
def num_ubatches(self) -> int:
362
return 2 if self.enable_dbo else self.ubatch_size
363
364
+ @property
365
+ def local_engines_only(self) -> bool:
366
+ """
367
+ Client manages local+remote EngineCores in pure internal LB case.
368
+ Client manages local EngineCores in hybrid and external LB case.
369
+ """
370
+ return self.data_parallel_external_lb or self.data_parallel_hybrid_lb
371
+
372
def get_next_dp_init_port(self) -> int:
373
"""
374
We might need to initialize process groups in multiple
vllm/entrypoints/cli/serve.py
+2
-4
@@ -190,9 +190,7 @@ def run_multi_api_server(args: argparse.Namespace):
190
191
parallel_config = vllm_config.parallel_config
192
dp_rank = parallel_config.data_parallel_rank
193
- external_dp_lb = parallel_config.data_parallel_external_lb
194
- hybrid_dp_lb = parallel_config.data_parallel_hybrid_lb
195
- assert external_dp_lb or hybrid_dp_lb or dp_rank == 0
193
+ assert parallel_config.local_engines_only or dp_rank == 0
194
195
api_server_manager: APIServerProcessManager | None = None
196
@@ -218,7 +216,7 @@ def run_multi_api_server(args: argparse.Namespace):
216
# (after the launcher context manager exits),
217
# since we get the front-end stats update address from the coordinator
218
# via the handshake with the local engine.
221
- if dp_rank == 0 or not (external_dp_lb or hybrid_dp_lb):
219
+ if dp_rank == 0 or not parallel_config.local_engines_only:
220
# Start API servers using the manager.
221
api_server_manager = APIServerProcessManager(**api_server_manager_kwargs)
222
vllm/v1/engine/coordinator.py
+1
-3
@@ -62,12 +62,10 @@ class DPCoordinator:
62
assert dp_size > 1, "Coordinator only used for data parallel"
63
64
host = parallel_config.data_parallel_master_ip
65
- external_lb = parallel_config.data_parallel_external_lb
66
- hybrid_lb = parallel_config.data_parallel_hybrid_lb
65
66
# Assume coordinator is colocated with front-end procs when not in
67
# either external or hybrid DP LB mode.
70
- local_only = not (external_lb or hybrid_lb)
68
+ local_only = not parallel_config.local_engines_only
69
front_publish_address = get_engine_client_zmq_addr(
70
local_only=local_only, host=host
71
)
vllm/v1/engine/core_client.py
+1
-6
@@ -507,12 +507,7 @@ class MPClient(EngineCoreClient):
507
offline_mode = parallel_config.data_parallel_rank_local is not None
508
# Client manages local+remote EngineCores in pure internal LB case.
509
# Client manages local EngineCores in hybrid and external LB case.
510
- local_engines_only = (
511
- parallel_config.data_parallel_hybrid_lb
512
- or parallel_config.data_parallel_external_lb
513
- )
514
-
515
- num_ranks = dp_local_size if local_engines_only else dp_size
510
+ num_ranks = dp_local_size if parallel_config.local_engines_only else dp_size
511
self.engine_ranks_managed = (
512
[dp_rank] if offline_mode else list(range(dp_rank, dp_rank + num_ranks))
513
)
vllm/v1/engine/input_processor.py
+6
-5
@@ -458,13 +458,14 @@ class InputProcessor:
458
self._validate_lora(lora_request)
459
self._validate_params(params)
460
461
- data_parallel_size = self.vllm_config.parallel_config.data_parallel_size
462
- if data_parallel_rank is not None and not (
463
- 0 <= data_parallel_rank < data_parallel_size
464
- ):
461
+ parallel_config = self.vllm_config.parallel_config
462
+ dp_size = parallel_config.data_parallel_size
463
+ dp_local_size = parallel_config.data_parallel_size_local
464
+ num_ranks = dp_local_size if parallel_config.local_engines_only else dp_size
465
+ if data_parallel_rank is not None and not (0 <= data_parallel_rank < num_ranks):
466
raise ValueError(
467
f"data_parallel_rank {data_parallel_rank} "
467
- f"is out of range [0, {data_parallel_size})."
468
+ f"is out of range [0, {num_ranks})."
469
)
470
471
if arrival_time is None:
vllm/v1/engine/utils.py
+1
-4
@@ -787,10 +787,7 @@ def launch_core_engines(
787
local_start_index = parallel_config.data_parallel_rank_local
788
dp_rank = parallel_config.data_parallel_rank
789
host = parallel_config.data_parallel_master_ip
790
- local_engines_only = (
791
- parallel_config.data_parallel_hybrid_lb
792
- or parallel_config.data_parallel_external_lb
793
- )
790
+ local_engines_only = parallel_config.local_engines_only
791
792
# In offline mode there is an LLM instance per DP rank and
793
# one core engine per LLM, see