Skip to content
Merged
Changes from 15 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
17e57b1
[Test][UMBP] Add embedded runtime and MORI integration coverage
charxwu Oct 9, 2026
cb0b4c7
[Test][UMBP] Check embedded key release and document bounded events
charxwu Oct 22, 2026
49b195a
[Test][UMBP] Create embedded GPU scheduler through its runtime
charxwu Oct 27, 2026
a827544
[CI][UMBP] Allocate four GPUs for embedded integration tests
charxwu Oct 28, 2026
d4d5724
[CI][UMBP] Build MORI with UMBP and require usable integration images
charxwu Oct 28, 2026
4f502d4
[Test][UMBP] Reuse short socket directories across runtime coverage
charxwu Oct 28, 2026
a778781
[Test][UMBP] Preserve CPU coverage when restacking embedded tests
charxwu Oct 29, 2026
18b84a4
Merge branch 'main' into review/umbp-split-3-embedded
vllm-agent Oct 29, 2026
48b5559
[CI][UMBP] Check integration prerequisites in the tests
charxwu Oct 29, 2026
98af942
Merge branch 'main' into review/umbp-split-3-embedded
AndreasKaratzas Oct 29, 2026
4b2fa3b
[Test][UMBP] Trim embedded coverage and fix ROCm image wiring
AndreasKaratzas Oct 30, 2026
6132eaa
[Test][UMBP] Check restores exactly and load failures through the sch…
AndreasKaratzas Oct 30, 2026
4ab20f5
Merge branch 'main' into review/umbp-split-3-embedded
vllm-agent Oct 30, 2026
2c8b981
[Test][UMBP] Restore a Mamba2 hybrid end to end through UMBP
AndreasKaratzas Oct 30, 2026
687c0ca
Merge branch 'main' into akaratza_umbp_hybrid_restore
AndreasKaratzas Oct 30, 2026
cd4bf55
Merge branch 'main' into akaratza_umbp_hybrid_restore
AndreasKaratzas Nov 3, 2026
ef8704c
Merge branch 'main' into akaratza_umbp_hybrid_restore
mergify[bot] Nov 4, 2026
7cf9f1b
Merge branch 'main' into akaratza_umbp_hybrid_restore
vllm-agent Nov 4, 2026
a815cac
Merge branch 'main' into akaratza_umbp_hybrid_restore
AndreasKaratzas Nov 4, 2026
93c8c34
Merge branch 'main' into akaratza_umbp_hybrid_restore
AndreasKaratzas Nov 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 51 additions & 1 deletion tests/v1/kv_connector/umbp_integration/test_mori_token_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"""End-to-end restore through the MORI-backed UMBP runtime.

Batch-invariant kernels make a restore bitwise comparable with recomputing the
prompt, so restored KV must reproduce the cold run's tokens and logprobs.
prompt, so restored KV must reproduce the cold run's tokens and logprobs. Mamba
hybrids have no batch-invariant kernels, so they compare with a GPU prefix hit.
"""

import time
Expand Down Expand Up @@ -126,3 +127,52 @@ def test_restore_extends_a_local_prefix_hit(umbp_llm):
assert mixed[0].num_cached_tokens == 8 * BLOCK_SIZE
assert _external_tokens(umbp_llm) - before == 6 * BLOCK_SIZE
_assert_same_outputs(computed, mixed)


HYBRID_MODEL = "ibm-granite/granite-4.0-h-350m"
HYBRID_REVISION = "3b17b717b8f2f5d305b0a92c1491e239aeda19c8"


@pytest.fixture
def umbp_hybrid_llm(vllm_runner, socket_dir):
with vllm_runner(
HYBRID_MODEL,
revision=HYBRID_REVISION,
enforce_eager=True,
max_model_len=2048,
enable_chunked_prefill=True,
enable_prefix_caching=True,
disable_log_stats=False,
kv_transfer_config=KVTransferConfig(
kv_connector="UMBPStoreConnector",
kv_role="kv_both",
kv_connector_extra_config={
"mode": "embedded",
"capacity_bytes": 1 << 30,
"lookup_dir": socket_dir,
},
),
) as runner:
yield runner.llm


def test_hybrid_restore_matches_local_prefix_hit(umbp_hybrid_llm):
"""Mamba boundary states restored through UMBP resume like a GPU hit.

A prompt ending exactly on a block boundary still recomputes its last block.
"""
llm = umbp_hybrid_llm
block_size = llm.llm_engine.vllm_config.cache_config.block_size
for seed, tail in enumerate((7, block_size)):
prompt = _prompt(seed, 2 * block_size + tail)
llm.generate(prompt, PARAMS, use_tqdm=False)
local_hit = llm.generate(prompt, PARAMS, use_tqdm=False)
assert local_hit[0].num_cached_tokens == 2 * block_size
_reset_gpu_prefix_cache(llm)

before = _external_tokens(llm)
restored = llm.generate(prompt, PARAMS, use_tqdm=False)

assert restored[0].num_cached_tokens == 2 * block_size
assert _external_tokens(llm) - before == 2 * block_size
_assert_same_outputs(local_hit, restored)