@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 1e584823f8
Fork 0

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