mirror of
https://github.com/kvcache-ai/Mooncake.git
synced 2026-11-05 01:17:55 +00:00
Labels
No labels
ascend
auto-closed
bug
bug
CI/Build
Common
documentation
enhancement
feature request
good first issue
help wanted
high priority
MetaX
nightly-failure
pull-request
PyTorch Backend
question
RFC
Roadmap
stale
Store
Tests
Transfer Engine
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
kvcache-ai/Mooncake#481
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @tzulingk on GitHub (Mar 10, 2026).
Original GitHub issue: https://github.com/kvcache-ai/Mooncake/issues/1639
Summary
After applying https://github.com/kvcache-ai/Mooncake/pull/1629 (which fixed
gdr_bufferallocation inmooncake-ep), we hit a new hang on AWS GB200 MNNVL clusters. Themooncake-pgconnection poller warmup handshake uses CPU heap buffers as NVLink write targets, which the MNNVL transport cannot access cross-node.Related: https://github.com/kvcache-ai/Mooncake/issues/1627 (original
gdr_bufferbug), https://github.com/kvcache-ai/Mooncake/pull/1629 (partial fix).cc @he-yufeng
Environment
CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_FABRIC_SUPPORTED (attr=128)= 1 on all GPUs ✓ — ComputeDomain is correctly set upUsing cross-node NVLink transport (MC_FORCE_MNNVL or no HCA detected)--moe-a2a-backend mooncake --elastic-ep-backend mooncake --deepep-mode low_latencySymptoms
Workers spam indefinitely (
connection_poller.cpp:123):Leader logs (
nvlink_transport.cpp:497):waitUntilAllConnected()blocks forever → sglang never finishes initializing.Root Cause
In
mooncake-pg/src/connection_poller.cpp,ConnectionContextallocates warmup buffers from CPU heap:Their addresses are published in
SegmentInfoviamooncake_backend.cpp:During the warmup handshake (
pollPeer,WAITING_WARMUP_TRANSFERstate), the lower-ranked peer submits a NVLink WRITE to the remote rank'swarmup_recv_region_:The MNNVL NVLink transport can only access
cuMemCreate(CU_MEM_HANDLE_TYPE_FABRIC)GPU memory cross-node. CPU heap memory is registered as local-only by the transport, so any cross-node NVLink write to it fails withRequested address not found!.The state machine then resets to
WAITING_STOREand retries forever.Proposed Fix
Option A — Skip cross-node warmup for MNNVL (simpler):
On a ComputeDomain cluster, NVLink connectivity between all ranks is guaranteed by the fabric infrastructure. The store key exchange alone is sufficient proof of peer reachability. The warmup write can be skipped.
Option B — Allocate warmup buffers as FABRIC memory (more correct):
Allocate
warmup_recv_region_withcuMemCreate(CU_MEM_HANDLE_TYPE_FABRIC)+cuMemMap, export the fabric handle, share it alongsideSegmentInfoin the store, and import/map it on the remote side before the warmup write. This is more involved but actually validates end-to-end NVLink connectivity.We're happy to test a follow-up patch if helpful!
@he-yufeng commented on GitHub (Mar 10, 2026):
Thanks for the detailed write-up @tzulingk. This is the same pattern as the EP buffer issue I fixed in #1629 — CPU heap memory isn't fabric-accessible on MNNVL, so remote NVLink writes silently fail.
I'll go with Option A (skip warmup for MNNVL): when
supportFabricMem()is true, skip the warmup write/receive and transition directly to CONNECTED after opening the segment. On a ComputeDomain cluster NVLink connectivity is guaranteed by the fabric, so the store handshake alone is sufficient.Option B (allocating warmup buffers with
cuMemCreate(FABRIC)) would work too but feels like overkill for a connectivity check that's already guaranteed by the fabric topology.Working on a PR now.