Repository navigation
[KVConnector][NIXL] Support attention-HMA layouts in pipeline-parallel push prefill - #50494
Conversation
|
Documentation preview: https://vllm--50494.org.readthedocs.build/en/50494/ |
|
This pull request has merge conflicts that must be resolved before it can be |
c307c71 to
03f1908
Compare
|
This pull request has merge conflicts that must be resolved before it can be |
db67406 to
916d936
Compare
|
This pull request has merge conflicts that must be resolved before it can be |
|
✅ Queued 7 failed job(s) for retry in Buildkite CI #88958. |
|
This pull request has merge conflicts that must be resolved before it can be |
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Yiliu Dong <91178480+qianlihuang@users.noreply.github.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Yiliu Dong <91178480+qianlihuang@users.noreply.github.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Report completed transfers independently of receive metadata, with receive filtering and pending notifications handled by the receive caller. Preserve push WRITE completion and producer lease cleanup without an is_send flag. Store derived layout state per worker, use layer-oriented private names, and make the descriptor routing choice explicit. Extend receive completion regressions through get_finished, including a surviving handle finishing after an earlier failure. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Retain upstream descriptor fallbacks and reject differing physical region groups only when layer-name routing is inactive. Cover both the routed WRITE and the unsupported region-index path. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
Group the HMA, Mamba/SSM, and consumer restrictions under one PP-size guard, preserving validation order and error messages. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
…ions Replace the superseded WRITE-completion lease expectation with PP1 and PP2/HMA coverage of upstream notification-based completion. Retain partial-handle polling and exactly-once cleanup checks. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: zixi-qi <zixi@inferact.ai>
1c9bf87 to
b74b086
Compare
|
/ci run |
|
❌ This PR is 4 commits behind upstream |
|
/ci run |
|
❌ This PR is 1 commit behind upstream |
|
/ci run --allow-stale |
|
✅ Triggered Buildkite CI #89186 for commit
|
…er fixture PR vllm-project#57077's region_pull_worker fixture constructs NixlConnectorWorker via object.__new__() and sets attributes manually. It does not set _transfer_layer_group_ids, which base_worker.py:198 reads (self._transfer_layer_group_ids) since vllm-project#50494 merged. vllm-project#57077's CI ran against a base without vllm-project#50494, so the conflict only surfaces on main: tests/v1/kv_connector/unit/test_nixl_connector_hma.py::test_region_pull_ignores_allocation_padding fails 7x with AttributeError (build #89376). Set the attribute to the empty-tuple default used by the base class __init__ (and by the sibling _make_mock_worker_for_desc_ids fixture). Signed-off-by: kimi-no-na-wa <kimi-no-na-wa@users.noreply.github.com>
Resolve conflicts with PP layer-name routing (vllm-project#50494) and friends: - _build_fa_local iterates _transfer_layer_region_indices and emits one strided run per region via _block_runs. - _build_fa_remote keeps layer-name routing for the local region lookup and emits one run per remote region. - Mixed DRAM/VRAM local handles partition runs by _run_is_dram instead of rewriting per-block tuples. - Upstream tests indexing per-block descriptors expand runs first. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Ilia Yastrebov <iyastrebov@nvidia.com>
…l push prefill (vllm-project#50494) Signed-off-by: zixi-qi <zixi@inferact.ai> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Yiliu Dong <91178480+qianlihuang@users.noreply.github.com> Co-authored-by: Codex <noreply@openai.com>
Purpose
Enable attention HMA with pipeline-parallel prefill in
NixlPushConnector,following #45880. Producer PP stages and a PP1 decoder may pool the same layers
into different physical KV-cache regions. This PR matches layers by name and
builds descriptors using each side's region geometry.
This updates the existing push-mode PR. Pull-mode work in #43368/#48263 and
the earlier #47981 prototype use different implementations. Packed MLA is the
stacked follow-up #50499, which should land after this PR.
Design and rebase
NixlAgentMetadata.region_membersadvertises layer names; wire version 11 → 12._transfer_layer_names,_transfer_layer_region_indices,and
_transfer_layer_group_idsper worker._supports_pp_hmaexpresses theconnector capability;
_requires_layer_name_routing()applies runtime gates.lengths, strides, capacities, group IDs, names, and memory types. Missing or
duplicate layers and inconsistent metadata fail explicitly.
registered once. PP1 and non-HMA layouts retain region-index routing.
topology/NIXL registration.
Rebased onto
main@df42d112ee88dd4a9b64efbad55621af6a66a44bon September 15.The rebase preserves upstream PCP/DCP transfer ranks, HiSparse geometry,
KVConnectorTransferResults, and the latest NIXL multi-handle failure handling.The conflict was in receive-lifecycle tests. Main's fixtures and regressions
supersede the earlier PR versions, so that file now matches main. The PR's
production-code additions/removals are unchanged from the reviewed version.
The three PP startup restrictions remain grouped under one PP-size guard.
Main now completes producer sends on consumer acknowledgement or lease expiry.
The follow-up replaces the obsolete local-WRITE completion expectation with
PP1 and PP2/HMA cases in upstream's notification test, preserving partial-handle
polling and exactly-once lease/eviction checks. No extra production changes.
Test plan
Run from the repository's
.venvon one node with four GB200s:Fresh Gemma-4-26B-A4B-it E2E uses PP2/TP1 → PP1/TP1, HMA enabled, prefix
caching disabled, strict handshake compatibility, eager execution, explicit
--attention-backend TRITON_ATTNon both peers, bf16 KV, V2 runner, cumemallocation, max length 8192, and
UCX_TLS=tcp,cuda_copy.GSM8K: 200 questions per route, 5-shot chat, concurrency 8, temperature 0,
2048 generation tokens. Direct producer baseline and toy-proxy disaggregation
use the same checkpoint
4d7ae4984b7db7de8f8457170b3f1a419ee76d52.Use port 8100 for the baseline and 8000 for the proxy. Probes are recorded
separately; transfer/cache metrics and health are checked after 35 seconds idle.
Test results
September 15 validation on
b74b0866cea9d3969a8f34a67caca0c68c9af028:the full NIXL/supporting-suite run with a rerun of the entire push-connector
test file after the test-only update: 484 unaffected cases passed in the
full run, and all 78 final push tests passed (19.66 seconds). The initial
run exposed the two obsolete WRITE-completion assertions described above.
test follow-up. No production files changed after the full test run.
the earlier tested commit, rather than the new head.
Validated September 14, 2026 on
5c12ce79ada8246f341be97414b3df60d147b818:23.94 seconds. Pre-commit and manual mypy Python 3.12 passed.
and target hashes match between routes.
Exact generated-text parity and code-caused accuracy improvements are not
claimed. The flexible regression on question 174 is extraction of 35 from the
correct 95-minute answer expressed as “1 hour and 35 minutes.”
errors, including the idle audit. All completion HTTP responses were 200.
zero locally computed prefill tokens. Its separate probe contributes one
computed token.
block size 16; capacities 383,323 per producer region and 191,976 per decoder
region. Runtime source hashes match the published source.
Environment: torch 2.13.0+cu130, NIXL 1.1.0, FlashInfer Python/cubin/JIT cache
0.6.18.post1. Compiled artifacts are from
dc36fcce902a63eab06c1b93a5c4a5ee178a0c56,the immediate parent of the selected main; their only difference is a Python
frontend relocation, with identical compiled sources and build dependencies.
Limitations
TRITON_ATTN. The new auto-selectedTRITON_FLASHINFERcomposite failed cache registration before any inferencerequests; this rebase does not add support for that layout.
pull-mode PP/HMA, decode-side PP, and PP with Mamba/SSM remain unsupported.
RDMA performance coverage, and do not include live fault injection.
AI assistance
AI assistance (Claude and Codex) was used for implementation, review, and
validation. The human submitter retains responsibility for reviewing and
understanding every changed line; maintainers retain merge responsibility.
Co-authored-by: Yiliu Dong https://github.com/qianlihuang