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 12, 13:30 UTC
[Bugfix] If chunked_prefill is disabled, end the scheduling early. (#28911)
Signed-off-by: wang.yuqi <yuqi.wang@daocloud.io>
wang.yuqi committed
Nov 25, 2025 at 16:06 UTC
67fc16cd8cf778a30ad0f7619fe77bd85f1d1633
3 files changed
+33
-4
tests/v1/core/test_scheduler.py
+28
@@ -641,6 +641,34 @@ def test_schedule_concurrent_batches(
641
scheduler.update_from_output(scheduler_output1, model_runner_output)
642
643
644
+@pytest.mark.parametrize("enable_chunked_prefill", [True, False])
645
+def test_schedule_order(enable_chunked_prefill: bool):
646
+ scheduler = create_scheduler(
647
+ max_num_batched_tokens=1024,
648
+ max_num_seqs=3,
649
+ enable_chunked_prefill=enable_chunked_prefill,
650
+ )
651
+
652
+ # long requests
653
+ requests = create_requests(num_requests=2, num_tokens=800)
654
+ # short requests
655
+ requests += create_requests(num_requests=2, num_tokens=10)
656
+
657
+ for request in requests:
658
+ scheduler.add_request(request)
659
+
660
+ scheduler_output1 = scheduler.schedule()
661
+
662
+ if enable_chunked_prefill:
663
+ # When enable chunked prefill, long requests will be chunked.
664
+ assert len(scheduler_output1.scheduled_new_reqs) == 2
665
+ else:
666
+ # When disable chunked prefill, should not skip the long requests,
667
+ # and scheduling subsequent short requests in advance,
668
+ # even though there is still token budgets remaining.
669
+ assert len(scheduler_output1.scheduled_new_reqs) == 1
670
+
671
+
672
def test_preempt_during_execution():
673
# NOTE(woosuk): The actual number of available blocks is 10 instead of 11
674
# because block 0 is reserved as the null block.
tests/v1/core/utils.py
+2
-1
@@ -42,6 +42,7 @@ def create_scheduler(
42
model: str = "facebook/opt-125m",
43
max_num_seqs: int = 16,
44
max_num_batched_tokens: int = 8192,
45
+ enable_chunked_prefill: bool = True,
46
enable_prefix_caching: bool = False,
47
long_prefill_token_threshold: int = 0,
48
disable_chunked_mm_input: bool = False,
@@ -76,7 +77,7 @@ def create_scheduler(
77
max_model_len=max_model_len,
78
long_prefill_token_threshold=long_prefill_token_threshold,
79
disable_chunked_mm_input=disable_chunked_mm_input,
79
- enable_chunked_prefill=True,
80
+ enable_chunked_prefill=enable_chunked_prefill,
81
async_scheduling=async_scheduling,
82
)
83
model_config = ModelConfig(
vllm/v1/core/sched/scheduler.py
+3
-3
@@ -508,9 +508,9 @@ class Scheduler(SchedulerInterface):
508
not self.scheduler_config.enable_chunked_prefill
509
and num_new_tokens > token_budget
510
):
511
- self.waiting.pop_request()
512
- skipped_waiting_requests.prepend_request(request)
513
- continue
511
+ # If chunked_prefill is disabled,
512
+ # we can stop the scheduling here.
513
+ break
514
515
num_new_tokens = min(num_new_tokens, token_budget)
516
assert num_new_tokens > 0