Skip to content

Commit 4353c9c

Browse files
authored
[KV Offload] Pass request context (vllm-project#39185)
Signed-off-by: omerpaz95 <omerpaz95@gmail.com>
1 parent 4b7f5ea commit 4353c9c

7 files changed

Lines changed: 170 additions & 81 deletions

File tree

tests/v1/kv_connector/unit/offloading_connector/test_scheduler.py

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ def test_offloading_connector(request_runner, async_scheduling: bool):
3232
# 3 blocks, store just the middle block (skip first and last)
3333
# blocks = [0, 1, 2], [3, 4, 5], [6, 7, 8]
3434
runner.new_request(token_ids=[0] * offloaded_block_size * 3)
35-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(
36-
list(keys)[1:2]
35+
runner.manager.prepare_store.side_effect = (
36+
lambda keys, req_context: generate_store_output(list(keys)[1:2])
3737
)
3838
runner.run(decoded_tokens=[0])
3939

@@ -45,18 +45,22 @@ def test_offloading_connector(request_runner, async_scheduling: bool):
4545
runner.manager.prepare_store.assert_not_called()
4646

4747
# +1 token -> single block, fail prepare_store
48-
runner.manager.prepare_store.side_effect = lambda keys: None
48+
runner.manager.prepare_store.side_effect = lambda keys, req_context: None
4949
runner.run(decoded_tokens=[0])
5050
runner.manager.prepare_store.assert_called()
5151

5252
# 1 more block (+ token for async scheduling)
5353
# now set block_hashes_to_store = []
54-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
54+
runner.manager.prepare_store.side_effect = (
55+
lambda keys, req_context: generate_store_output([])
56+
)
5557
runner.run(decoded_tokens=[0] * (offloaded_block_size + 1))
5658

5759
# 1 more block (+ token for kicking off offloading)
5860
# now check touch was called with all 6 blocks
59-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
61+
runner.manager.prepare_store.side_effect = (
62+
lambda keys, req_context: generate_store_output(keys)
63+
)
6064
runner.run(
6165
decoded_tokens=[0] * (offloaded_block_size + 1),
6266
expected_stored_gpu_block_indexes=(15, 16, 17),
@@ -89,21 +93,27 @@ def test_offloading_connector(request_runner, async_scheduling: bool):
8993
runner.new_request(
9094
token_ids=[0] * gpu_block_size + [1] * (offloaded_block_size - gpu_block_size)
9195
)
92-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
96+
runner.manager.prepare_store.side_effect = (
97+
lambda keys, req_context: generate_store_output([])
98+
)
9399
runner.run(decoded_tokens=[EOS_TOKEN_ID])
94100
runner.manager.lookup.assert_not_called()
95101

96102
# single block lookup with no hits
97103
runner.new_request(token_ids=[1] * offloaded_block_size)
98-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
104+
runner.manager.prepare_store.side_effect = (
105+
lambda keys, req_context: generate_store_output([])
106+
)
99107
runner.run(decoded_tokens=[EOS_TOKEN_ID])
100108
runner.manager.lookup.assert_called()
101109
assert len(list(runner.manager.lookup.call_args.args[0])) == 1
102110

103111
# single block lookup with a hit
104112
runner.scheduler.reset_prefix_cache()
105113
runner.new_request(token_ids=[0] * offloaded_block_size)
106-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
114+
runner.manager.prepare_store.side_effect = (
115+
lambda keys, req_context: generate_store_output([])
116+
)
107117
runner.manager.lookup.return_value = 1
108118
runner.run(
109119
decoded_tokens=[EOS_TOKEN_ID], expected_loaded_gpu_block_indexes=(0, 1, 2)
@@ -113,7 +123,9 @@ def test_offloading_connector(request_runner, async_scheduling: bool):
113123
runner.new_request(
114124
token_ids=[0] * offloaded_block_size * 2 + [1] * offloaded_block_size
115125
)
116-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
126+
runner.manager.prepare_store.side_effect = (
127+
lambda keys, req_context: generate_store_output([])
128+
)
117129
runner.manager.lookup.return_value = 1
118130
runner.run(
119131
decoded_tokens=[EOS_TOKEN_ID], expected_loaded_gpu_block_indexes=(3, 4, 5)
@@ -164,14 +176,18 @@ def test_request_preemption(request_runner, async_scheduling: bool):
164176
# 2 blocks, store all, without flushing
165177
# blocks = [0, 1, 2], [3, 4, 5]
166178
runner.new_request(token_ids=[0] * offloaded_block_size * 2)
167-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
179+
runner.manager.prepare_store.side_effect = (
180+
lambda keys, req_context: generate_store_output(keys)
181+
)
168182
runner.run(
169183
decoded_tokens=[0],
170184
complete_transfers=False,
171185
)
172186

173187
# decode 2 more blocks - 1 gpu block, storing [6, 7, 8] (no flush)
174-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
188+
runner.manager.prepare_store.side_effect = (
189+
lambda keys, req_context: generate_store_output(keys)
190+
)
175191
runner.run(
176192
decoded_tokens=[0] * (2 * offloaded_block_size - gpu_block_size),
177193
complete_transfers=False,
@@ -195,7 +211,9 @@ def test_request_preemption(request_runner, async_scheduling: bool):
195211
# request should now return from preemption
196212
# re-load [0, ..., 8] from the CPU and store [9, 10, 11]
197213
runner.manager.lookup.return_value = 3
198-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
214+
runner.manager.prepare_store.side_effect = (
215+
lambda keys, req_context: generate_store_output(keys)
216+
)
199217
runner.run(
200218
decoded_tokens=[0] * gpu_block_size,
201219
expected_loaded_gpu_block_indexes=(0, 1, 2, 3, 4, 5, 6, 7, 8),
@@ -222,7 +240,9 @@ def test_concurrent_lookups_of_the_same_prefix(request_runner, async_scheduling:
222240

223241
# store 1 blocks
224242
runner.new_request(token_ids=[0] * offloaded_block_size)
225-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
243+
runner.manager.prepare_store.side_effect = (
244+
lambda keys, req_context: generate_store_output(keys)
245+
)
226246
runner.run(
227247
decoded_tokens=[EOS_TOKEN_ID],
228248
expected_stored_gpu_block_indexes=(0, 1, 2),
@@ -253,7 +273,9 @@ def test_concurrent_lookups_of_the_same_prefix(request_runner, async_scheduling:
253273
assert transfer_jobs == list(runner.offloading_spec.handler.transfer_specs)
254274

255275
# complete transfers
256-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output([])
276+
runner.manager.prepare_store.side_effect = (
277+
lambda keys, req_context: generate_store_output([])
278+
)
257279
runner.run(
258280
decoded_tokens=[EOS_TOKEN_ID],
259281
expected_loaded_gpu_block_indexes=(0, 1, 2),
@@ -278,7 +300,9 @@ def test_abort_loading_requests(request_runner, async_scheduling: bool):
278300

279301
# store 1 blocks
280302
runner.new_request(token_ids=[0] * offloaded_block_size)
281-
runner.manager.prepare_store.side_effect = lambda keys: generate_store_output(keys)
303+
runner.manager.prepare_store.side_effect = (
304+
lambda keys, req_context: generate_store_output(keys)
305+
)
282306
runner.run(
283307
decoded_tokens=[EOS_TOKEN_ID],
284308
expected_stored_gpu_block_indexes=(0, 1, 2),

tests/v1/kv_connector/unit/offloading_connector/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def __init__(self, vllm_config: VllmConfig, kv_cache_config: KVCacheConfig):
115115

116116
self.manager = MagicMock(spec=OffloadingManager)
117117
self.manager.lookup.return_value = 0
118-
self.manager.prepare_load = lambda keys: MockLoadStoreSpec(keys)
118+
self.manager.prepare_load = lambda keys, req_context: MockLoadStoreSpec(keys)
119119
self.handler = MockOffloadingHandler()
120120

121121
def get_manager(self) -> OffloadingManager:

0 commit comments

Comments
 (0)