Repository navigation
Conversation
In the latency_specialized decode, run the Engram WKV chain ahead of the decoder layers for GPU-resident tables too, and move its head and output all-gathers from NCCL to an NVLink multicast LamportAllGather of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Yifan Qiao <yifanqiao@inferact.ai>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Yifan Qiao <yifanqiao@inferact.ai>
|
👋 Hi! Thank you for contributing to the vLLM project. 💬 Join our developer Slack at https://slack.vllm.ai to discuss your PR in #pr-reviews, coordinate on features in #feat- channels, or join special interest groups in #sig- channels. Just a reminder: PRs would not trigger full CI run by default. Instead, it would only run You ask your reviewers to trigger select CI tests on top of Once the PR is approved and ready to go, your PR reviewer(s) can run CI to test the changes comprehensively before merging. To run CI, PR reviewers can either: Add If you have any questions, please reach out to us on Slack at https://slack.vllm.ai. 🚀 |
The Lamport all-gathers on the run-ahead side stream hang multi-request decode: test_specialized_decode_matches_the_model (12 requests decoding together) timed out in sample_tokens in 2 of 3 runs on GB200, and vllm-project#63921 alone passed 3 of 3. With the chain's gathers back on NCCL it passed 5 of 5, with host-offloaded and GPU-resident tables. The run-ahead for GPU-resident tables stays; the Lamport gathers saved only about 17 us a step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Yifan Qiao <yifanqiao@inferact.ai>
|
Thanks for this! I tried it on GB300 TP4 on top of the current 1. It hangs once a step reaches about 12 requests (2 of 2 runs). Both servers built from this branch stopped making progress while the batch-32 load ramped up. The last scheduled steps were 72 tokens (12 requests × 6) and 90 tokens (15 × 6). About five minutes later the engine died with My guess, which I haven't verified: the chain's Lamport gathers spin on the side stream while the main stream runs its own spinning kernels (the executor's Lamport collectives and other cross-rank waits). Once the gather grid is large enough, spinning CTAs on one rank can hold SMs that a kernel on the other stream needs before it can finish. The ranks then wait on each other. NCCL on the side stream doesn't run into this. One quick test: cap the gather's grid, or fall back to NCCL above some row count, and rerun batch 32. 2. The default path only gets the Lamport half. Our recipe and benchmarks use 3. Before the hang, the gain is small. Decode step in µs, from the blocks that completed (one baseline block, two blocks of this branch, two client runs each):
That's about −1.1% at batch 1 and −0.8% at batch 8. With only one baseline block, this is within the spread we usually see between server restarts. 4. Minor: "bitwise unchanged" has one exception. The Lamport gather sends the sentinel word Otherwise the code looks right to me. The transposes match So I'm not merging this into the PR for now. I'm happy to rerun the ABBA once the hang is fixed. |
Overview
Targets the branch of vllm-project#63921. In the
latency_specializeddecode, the Engram WKV chain now runs ahead on its side stream for GPU-resident tables too, not only for host-offloaded ones. The side stream waits for the current stream, where GPU-resident rows are looked up inline. The chain keeps the NCCL gathers ofEngram.forward.Claims
Validation
Unprofiled step time, FlashInfer autotune off, on one node, 3 interleaved restarts × 3 samples per arm. Setup: TP4 on GB200, a 128k context, DSpark with 5 tokens, GPU-resident tables.
Tests on one GB200 node (4 GPUs):
test_kernels.py::test_engram_wkv_prefetch_matches_inline(host-offloaded and GPU-resident tables)test_layers.py::test_specialized_decode_matches_the_model, host-offloaded tables (the test's default)cpu_offload: Falsetest_layers.pyskips off SM103, so I relaxed itsskipifand the backend's SM103 gate locally to run it on GB200. No accuracy eval was run, because the output is bitwise unchanged.Limitations:
Details
LamportAllGatherof their own (about 17 µs more). It hungtest_specialized_decode_matches_the_model(12 requests decoding together) in 2 of 3 runs, while [Perf][DSv4.1] Extend the latency_specialized decode on NVIDIA vllm-project/vllm#63921 alone passed 3 of 3, and the same tree with only those gathers on NCCL passed 3 of 3. So the gathers stay on NCCL, and the module docstring says why. The inferred mechanism: the Lamport threads spin for peer data, and on a side stream they can block the executor's kernels while a peer waits.AI assistance (Claude Code) was used to write this change and this description.
🤖 Generated with Claude Code