Compare commits

...
Author SHA1 Message Date
Wentao YeandGitHub 388e55ef49 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-03-28 10:29:00 -04:00
Wentao YeandGitHub 63dd4db5a7 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-03-25 10:11:57 -04:00
yewentao256 368604eaf6 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-03-24 18:51:14 +00:00
yewentao256 925117f328 rename all_token_ids to output_token_ids
Signed-off-by: yewentao256 <zhyanwentao@126.com>
2026-03-24 18:51:07 +00:00
Wentao YeandGitHub 76737cf949 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-02-27 11:53:59 -05:00
Wentao YeandGitHub ed6c25c270 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-02-23 15:20:22 -05:00
yewentao256 f83fe23e30 update
Signed-off-by: yewentao256 <zhyanwentao@126.com>
2026-02-19 18:18:01 +00:00
yewentao256 23891cd249 Merge branch 'main' into wentao-optimize-async-scheduling-copy 2026-02-19 17:44:07 +00:00
yewentao256 7d6716d56c update test
Signed-off-by: yewentao256 <zhyanwentao@126.com>
2026-02-10 01:53:26 +00:00
4d4c75be3f Update vllm/v1/core/sched/scheduler.py
Co-authored-by: Nick Hill <nhill@redhat.com>
Signed-off-by: Wentao Ye <44945378+yewentao256@users.noreply.github.com>
2026-02-09 20:52:53 -05:00
yewentao256 6286b4a02d update
Signed-off-by: yewentao256 <zhyanwentao@126.com>
2026-02-06 20:07:50 -05:00
yewentao256 99d3990f80 optimize async scheduling redundant copy
Signed-off-by: yewentao256 <zhyanwentao@126.com>
2026-02-06 18:38:13 -05:00
5 changed files with 43 additions and 22 deletions
+22 -10
View File
@@ -2568,13 +2568,19 @@ def test_priority_scheduling_preemption_and_resumption_when_out_of_kv(
# Preempted request resumed in scheduled_cached_reqs
assert len(scheduled_cached_reqs.resumed_req_ids) == 1
assert len(scheduled_cached_reqs.all_token_ids) == 1
assert scheduled_cached_reqs.req_ids[0] == request_low.request_id
assert request_low.request_id in scheduled_cached_reqs.resumed_req_ids
assert request_low.request_id in scheduled_cached_reqs.all_token_ids
# Resumed tokens include 30 prompt tokens and 2 decoded tokens
assert len(scheduled_cached_reqs.all_token_ids[request_low.request_id]) == 32
assert scheduled_cached_reqs.all_token_ids[request_low.request_id][31] == 100
# `output_token_ids` is only propagated for the v1 model runner.
if not scheduler.use_v2_model_runner:
assert len(scheduled_cached_reqs.output_token_ids) == 1
assert request_low.request_id in scheduled_cached_reqs.output_token_ids
# request_low produced two decode tokens before being preempted.
assert scheduled_cached_reqs.output_token_ids[request_low.request_id] == [
100,
100,
]
else:
assert len(scheduled_cached_reqs.output_token_ids) == 0
@pytest.mark.parametrize(
@@ -3422,13 +3428,19 @@ def test_priority_scheduling_ec_connector_preemption_and_resumption(
# Preempted request resumed in scheduled_cached_reqs
assert len(scheduled_cached_reqs.resumed_req_ids) == 1
assert len(scheduled_cached_reqs.all_token_ids) == 1
assert scheduled_cached_reqs.req_ids[0] == request_low.request_id
assert request_low.request_id in scheduled_cached_reqs.resumed_req_ids
assert request_low.request_id in scheduled_cached_reqs.all_token_ids
## Resumed tokens include 94 prompt tokens and 2 decoded tokens
assert len(scheduled_cached_reqs.all_token_ids[request_low.request_id]) == 96
assert scheduled_cached_reqs.all_token_ids[request_low.request_id][95] == 100
# `output_token_ids` is only propagated for the v1 model runner.
if not scheduler.use_v2_model_runner:
assert len(scheduled_cached_reqs.output_token_ids) == 1
assert request_low.request_id in scheduled_cached_reqs.output_token_ids
# request_low produced two decode tokens before being preempted.
assert scheduled_cached_reqs.output_token_ids[request_low.request_id] == [
100,
100,
]
else:
assert len(scheduled_cached_reqs.output_token_ids) == 0
assert scheduler.running[0].request_id == request_low.request_id
assert request_high.request_id in output.finished_req_ids
+1 -1
View File
@@ -300,7 +300,7 @@ def test_update_states_request_resumed(model_runner, dist_init):
req_ids=[req_id],
resumed_req_ids=set(),
new_token_ids=[[]],
all_token_ids={},
output_token_ids={},
new_block_ids=[([0],)],
num_computed_tokens=[0],
num_output_tokens=[0],
+5 -5
View File
@@ -118,7 +118,7 @@ class CachedRequestData:
new_token_ids: list[list[int]]
# For requests not scheduled in the last step, propagate the token ids to the
# connector. Won't contain requests that were scheduled in the prior step.
all_token_ids: dict[str, list[int]]
output_token_ids: dict[str, list[int]]
new_block_ids: list[tuple[list[int], ...] | None]
num_computed_tokens: list[int]
num_output_tokens: list[int]
@@ -126,15 +126,15 @@ class CachedRequestData:
# Version of dataclass repr with token IDs obfuscated.
def anon_repr(self) -> str:
new_token_ids_lens = [len(toks) for toks in self.new_token_ids]
all_token_ids_lens = {
req_id: len(toks) for req_id, toks in self.all_token_ids.items()
output_token_ids_lens = {
req_id: len(toks) for req_id, toks in self.output_token_ids.items()
}
return (
f"CachedRequestData("
f"req_ids={self.req_ids},"
f"resumed_req_ids={self.resumed_req_ids},"
f"new_token_ids_lens={new_token_ids_lens},"
f"all_token_ids_lens={all_token_ids_lens},"
f"output_token_ids_lens={output_token_ids_lens},"
f"new_block_ids={self.new_block_ids},"
f"num_computed_tokens={self.num_computed_tokens},"
f"num_output_tokens={self.num_output_tokens}"
@@ -168,7 +168,7 @@ class CachedRequestData:
req_ids=[],
resumed_req_ids=set(),
new_token_ids=[],
all_token_ids={},
output_token_ids={},
new_block_ids=[],
num_computed_tokens=[],
num_output_tokens=[],
+11 -4
View File
@@ -1056,7 +1056,7 @@ class Scheduler(SchedulerInterface):
req_ids: list[str] = []
new_token_ids: list[list[int]] = []
new_block_ids: list[tuple[list[int], ...] | None] = []
all_token_ids: dict[str, list[int]] = {}
output_token_ids: dict[str, list[int]] = {}
num_computed_tokens: list[int] = []
num_output_tokens: list[int] = []
resumed_req_ids = set()
@@ -1085,8 +1085,15 @@ class Scheduler(SchedulerInterface):
if idx >= num_running_reqs:
assert not scheduled_in_prev_step
resumed_req_ids.add(req_id)
if not scheduled_in_prev_step:
all_token_ids[req_id] = req.all_token_ids.copy()
if not scheduled_in_prev_step and self.scheduler_config.async_scheduling:
assert req.num_output_placeholders == 0, (
"Unexpected output placeholders for request not scheduled "
"in the previous step."
)
if not self.use_v2_model_runner and not scheduled_in_prev_step:
num_out = req.num_output_tokens + req.num_output_placeholders
if num_out > 0:
output_token_ids[req_id] = req.output_token_ids.copy()
new_block_ids.append(
req_to_new_blocks[req_id].get_block_ids(allow_none=True)
)
@@ -1099,7 +1106,7 @@ class Scheduler(SchedulerInterface):
req_ids=req_ids,
resumed_req_ids=resumed_req_ids,
new_token_ids=new_token_ids,
all_token_ids=all_token_ids,
output_token_ids=output_token_ids,
new_block_ids=new_block_ids,
num_computed_tokens=num_computed_tokens,
num_output_tokens=num_output_tokens,
+4 -2
View File
@@ -1314,8 +1314,10 @@ class GPUModelRunner(
if self.use_async_scheduling and num_output_tokens > 0:
# We must recover the output token ids for resumed requests in the
# async scheduling case, so that correct input_ids are obtained.
resumed_token_ids = req_data.all_token_ids[req_id]
req_state.output_token_ids = resumed_token_ids[-num_output_tokens:]
resumed_output_token_ids = req_data.output_token_ids[req_id]
req_state.output_token_ids = resumed_output_token_ids[
-num_output_tokens:
]
reqs_to_add.append(req_state)
# Track resumed requests for ngram_gpu full tensor copy