Repository navigation
Conversation
Add embedded runtime contract tests, MORI GPU integration, token-level restore coverage, reusable test helpers, user documentation, and AMD CI wiring. Signed-off-by: CharlesWu <Charles.Wu@amd.com> Co-authored-by: Yichao Zhu <Yichao.Zhu@amd.com> Co-authored-by: Cursor <cursoragent@cursor.com> (cherry picked from commit d61f813) (cherry picked from commit 967175e) (cherry picked from commit 68cef07)
Move the scheduler factory fix into the embedded test slice so its lookup instance matches the workers at this PR head. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
The TP2 x PP2 native roundtrip launches four ranks. Use the existing mi355_4 pool and request four GPUs for this integration step. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
Install gRPC and Protobuf dependencies in both ROCm image bases, request BUILD_UMBP=ON, and reject silently disabled builds through the CMake cache. Check UMBPClient and four visible GPUs before running the integration suite so a missing native backend cannot turn module skips into a green job. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
Keep the added embedded unit and GPU integration tests independent of Buildkite's long TMPDIR, including multiprocess workers and token restore. Share the existing short directory fixture across connector test suites. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
Remove the module-wide ROCm/MORI skip from the CPU contract suite so the four regressions merged with the embedded implementation continue to run. All 52 cases pass without MORI; native GPU tests retain their own guards. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
Run the integration suite with the image's pytest instead of a separate virtualenv. Fail collection when MORI lacks UMBPClient and fail the TP2 x PP2 round-trip when fewer than four GPUs are visible, so a misconfigured image or agent still cannot pass through skips. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: CharlesWu <Charles.Wu@amd.com>
Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com>
- Docker: install gRPC/Protobuf build deps only in build_mori; final gets the runtime libs and a UMBPClient import check; drop no-op BUILD_UMBP. - CI: single-GPU integration group in test_areas and test-amd.yaml, with complete source dependencies. - Tests: drop tautological and fake-only tests, use a fake-clock fixture for timeouts, move the hybrid-tail restore into the unit suite with a non-periodic fill, rewrite the e2e restore with vllm_runner and an external-hit assertion, and gate on ROCm + UMBP via pytestmark. - Accuracy: add a ROCm-gated UMBP GSM8K row that asserts the reload. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com>
…eduler - e2e: under VLLM_BATCH_INVARIANT=1 a UMBP restore must reproduce the cold run's tokens and logprobs, for a batch ending mid-block and for a restore that extends a shorter GPU prefix hit, with exact external-hit counts. - unit: an object evicted between lookup and load must fail or recompute per kv_load_failure_policy through the real Scheduler, for one and two KV cache groups, and never leave a stale prefix-cache hit. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com>
KVLayoutPlanner and the embedded bulk path assumed a layer's block page is one contiguous run. Under LHBNC and BHLNC a page is one run per head, so UMBP failed at init under LHBNC (AITER FA with shuffle-KV) and silently restored the wrong bytes under BHLNC. Derive the runs from the same layout strides the allocator uses, copy them in both paths, and fail closed when the layout is unknown and the page is not one run. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com>
|
This pull request has merge conflicts that must be resolved before it can be |
Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com>
|
/ci run |
|
✅ Triggered Buildkite CI #98771 for commit |
|
Thanks for the fix, @AndreasKaratzas! I re-ran this PR on MI350X (gfx950) with vLLM built from f217b63 (
One small thing about the coverage note in the description, unless I'm missing a setup step: I don't think the batch-invariant tests in As far as I can tell:
On the build above, running Both tests pass with and without the fix. Forcing the backend with For AITER shuffle-KV itself, I ran a non-batch-invariant check modeled on your description, with |
|
Thanks for rerunning this and for the AITER shuffle-KV check! You're right: the fixture forces |
|
/ci run |
|
✅ CI is already running for this commit: https://buildkite.com/vllm/ci/builds/98771 |
data.py, using the allocator'scompute_layout_strides.embedded.pybulk path, falling back to per-range copies for a group whose stride doesn't match.kv_cache_layoutis unset.test_umbp_embedded.py.UMBP took
cache.stride(0)as the block stride and copied one contiguous page per layer, both on the range path indata.pyand on the bulk path in_register_load_layouts, as noted in the review of #61794. Under LHBNC, the default withROCM_AITER_FAandVLLM_ROCM_SHUFFLE_KV_CACHE_LAYOUT=1, K and V are head planes spanning every block, so the engine fails at init withKV region bytes (65536) exceed its stride (32768), and under BHLNC heads of different layers interleave inside a block row, so UMBP silently restores the wrong KV.pytest -q v1/kv_connector/unit/test_umbp_embedded.py -k every_kv_cache_layoutgives 4 failures without the fix and 12 passed with it. On MI350X with Qwen3-0.6B, 16 greedy tokens after a 192-token UMBP hit now match recompute under BHLNC (TRITON_ATTNwithVLLM_KV_CACHE_LAYOUT=BHLNC) and under AITER shuffle-KV, and stay identical under the default layouts; the batch-invariant tests intest_mori_token_e2e.pylikewise fail without the fix and pass with it underVLLM_KV_CACHE_LAYOUT=BHLNCandLHBNC. Batch invariance rules outROCM_AITER_FA, so those tests run onTRITON_ATTN, and AITER shuffle-KV is covered only by the greedy check above. Other layouts and MLA keep the single-span copy, and refusing LHBNC and BHLNC instead would make UMBP unusable with AITER shuffle-KV, since forcing LBHNC trips the shuffle decode path. LHBNC and BHLNC now issue one bulk range per head instead of one per layer, which I haven't benchmarked yet, and no open PR touches UMBP layout handling.AI assistance (Claude Code) was used to draft this change. Every line was reviewed by the submitter.