Skip to content

Commit ee2a613

Browse files
authored
[BugFix] ignore recompute scheduler on prefill nodes (vllm-project#11537)
### What this PR does / why we need it? This PR keeps existing P/D launch scripts working when `recompute_scheduler_enable=true` is still configured on PD prefill nodes. Previously, enabling `recompute_scheduler_enable` outside PD decode nodes caused startup to fail. This was correct for preventing the recompute scheduler from running on P nodes, but it was not smooth for users who still use older launch scripts that set the option on both P and D nodes. This PR changes the PD prefill behavior to emit a warning and disable `recompute_scheduler_enable` on `kv_role='kv_producer'` nodes instead of failing startup. The recompute scheduler is still initialized only on PD decode nodes with `kv_role='kv_consumer'`. Hard errors are retained for PD-mixed or non-PD configurations, and hybrid Mamba cache lookup is guarded from producer-side recompute scheduler use. ### Does this PR introduce _any_ user-facing change? Yes. If `recompute_scheduler_enable=true` is configured on a PD prefill node, startup no longer fails immediately. The option is ignored on the P node with a warning, and users should remove it from P-node configs because it will be deprecated there. ### How was this patch tested? - vLLM version: v0.23.0 - vLLM main: vllm-project/vllm@1f486d9 Signed-off-by: y00958240 <yuantao51@huawei.com>
1 parent 9872bb9 commit ee2a613

3 files changed

Lines changed: 26 additions & 11 deletions

File tree

tests/ut/test_platform.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -561,19 +561,21 @@ def test_check_and_update_config_recompute_scheduler_rejects_pd_mixed_kv_both(
561561
@patch("vllm_ascend.utils.get_ascend_device_type", return_value=AscendDeviceType.A3)
562562
@patch("vllm_ascend.ascend_config.init_ascend_config")
563563
@patch("vllm_ascend.core.recompute_scheduler.RecomputeSchedulerConfig.initialize_from_config")
564-
def test_check_and_update_config_recompute_scheduler_rejects_kv_producer(
564+
def test_check_and_update_config_recompute_scheduler_warns_and_disables_kv_producer(
565565
self, mock_init_recompute, mock_init_ascend, mock_soc_version, mock_auto_detect
566566
):
567567
mock_ascend_config = TestNPUPlatform.mock_vllm_ascend_config()
568568
mock_ascend_config.recompute_scheduler_enable = True
569+
mock_ascend_config.profiling_chunk_config.enabled = False
569570
mock_init_ascend.return_value = mock_ascend_config
570571

571572
vllm_config = TestNPUPlatform.mock_vllm_config()
572573
vllm_config.kv_transfer_config = MagicMock(kv_role="kv_producer", engine_id="engine0")
573574
vllm_config.parallel_config.decode_context_parallel_size = 1
574575
vllm_config.parallel_config.prefill_context_parallel_size = 1
575576
vllm_config.parallel_config.tensor_parallel_size = 1
576-
vllm_config.scheduler_config = MagicMock()
577+
scheduler_config = MagicMock()
578+
vllm_config.scheduler_config = scheduler_config
577579
mock_init_recompute.return_value = MagicMock()
578580

579581
from vllm_ascend import platform
@@ -582,16 +584,20 @@ def test_check_and_update_config_recompute_scheduler_rejects_kv_producer(
582584
self.platform = platform.NPUPlatform()
583585

584586
with (
585-
pytest.raises(
586-
ValueError,
587-
match=r"recompute_scheduler_enable.*PD-disaggregated D nodes.*kv_role='kv_consumer'",
588-
),
589587
patch.object(platform.NPUPlatform, "_fix_incompatible_config"),
590588
patch.object(platform, "check_kv_extra_config"),
589+
patch.object(platform.logger, "warning") as mock_warning,
591590
):
592591
self.platform.check_and_update_config(vllm_config)
593592

594593
mock_init_recompute.assert_not_called()
594+
self.assertFalse(mock_ascend_config.recompute_scheduler_enable)
595+
self.assertIs(vllm_config.scheduler_config, scheduler_config)
596+
mock_warning.assert_called_once()
597+
self.assertIn(
598+
"recompute_scheduler_enable is ignored on PD-disaggregated P nodes",
599+
mock_warning.call_args.args[0],
600+
)
595601

596602
@patch("vllm_ascend.quantization.utils.maybe_auto_detect_quantization")
597603
@patch("vllm_ascend.utils.get_ascend_device_type", return_value=AscendDeviceType.A3)

vllm_ascend/core/recompute_scheduler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ def schedule(self) -> RecomputeSchedulerOutput:
484484
# Get locally-cached tokens.
485485
if (
486486
self.connector is not None
487+
and not self.is_kv_producer
487488
and self.has_mamba_layers
488489
and isinstance(
489490
self.kv_cache_manager.coordinator,

vllm_ascend/platform.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -648,16 +648,24 @@ def check_and_update_config(cls, vllm_config: VllmConfig) -> None:
648648
if ascend_config.recompute_scheduler_enable:
649649
kv_transfer_config = vllm_config.kv_transfer_config
650650
kv_role = getattr(kv_transfer_config, "kv_role", None)
651-
if kv_transfer_config is None or kv_role != "kv_consumer":
651+
if kv_role == "kv_producer":
652+
logger.warning(
653+
"recompute_scheduler_enable is ignored on PD-disaggregated P nodes "
654+
"(kv_role='kv_producer') and will be deprecated on P nodes in a future release. "
655+
"Please remove it from P-node configs and keep it only on PD-disaggregated D nodes "
656+
"(kv_role='kv_consumer')."
657+
)
658+
ascend_config.recompute_scheduler_enable = False
659+
elif kv_transfer_config is None or kv_role != "kv_consumer":
652660
raise ValueError(
653661
"recompute_scheduler_enable can only be enabled on PD-disaggregated D nodes "
654662
f"(kv_role='kv_consumer', but got kv_role={kv_role!r}), and is not supported in PD-mixed mode."
655663
)
664+
else:
665+
from vllm_ascend.core.recompute_scheduler import RecomputeSchedulerConfig
656666

657-
from vllm_ascend.core.recompute_scheduler import RecomputeSchedulerConfig
658-
659-
recompute_scheduler_config = RecomputeSchedulerConfig.initialize_from_config(vllm_config)
660-
vllm_config.scheduler_config = recompute_scheduler_config
667+
recompute_scheduler_config = RecomputeSchedulerConfig.initialize_from_config(vllm_config)
668+
vllm_config.scheduler_config = recompute_scheduler_config
661669

662670
# Extend original scheduler_config to use SchedulerDynamicBatch.
663671
if ascend_config.SLO_limits_for_dynamic_batch != -1:

0 commit comments

Comments
 (0)