Repository navigation
flashnext-rank: the failure modes start once both communicators are up, and timeout bounds only the collective - #2976
Conversation
9a2858f to
35a084d
Compare
|
Thanks @swbiggart, and for the clear report in #2975. The fix is right.
|
…p and bound only the collective Both ranks initialize under the 30 s bound and acknowledge each other before the peer fails; timeout then gives rank 0's collective 200 ms. NCCL's initialization can take longer than 200 ms, which failed the timeout mode before its collective ran, and across two hosts a peer that finished initializing first could leave before the other had, which failed eof inside the initialization instead of the collective.
35a084d to
d0bd911
Compare
|
Thank you @swbiggart. This is merged into main with your commits under your own name, so you're listed as a TensorFold contributor. It ships in the next release, credited to you in the changelog and the release notes. |
|
Thanks @swbiggart! This is in TensorFold 1.2.8, out now: https://github.com/ashhart/TensorFold/releases/tag/v1.2.8
|
What this changes
tf-cuda-test flashnext-rank RANK PORT timeoutfails on main on both two-GPU machines I have: it handsCollective.initthe 200 ms bound meant for the injected stall, and NCCL's initialization takes longer than that,so both ranks stop with
RankTimeoutinside the initialization. Now both ranks initialize under the usual 30 s bound,meet over the control link once both communicators are up, and only then does
timeoutset the collective's bound to200 ms and rank 1 go silent (or, for
eof, leave). The meet also closes a race on two hosts: a rank that finishedinitializing first could leave before its peer had, failing
eofinside the initialization instead of thecollective. The final handshake also uses
meet. Test code only; nothing served changes.flashnext-rank timeoutstops both ranks inside NCCL initialization #2975. Refs Roadmap: one N-rank layer for TP, PP and EP, shared by every family #2560 (the multi-rank roadmap); completes none of its items.3885dceb2). One commit,35a084d79(zig/tests/cuda/flashnext_rank_tests.zig, +17 -8).atc overlap --json(ATC 0.9.6, 2026-11-11 11:25 UTC, base93a2e93ec):complete: false; its fourconflictsentries (GLM on CUDA: the latent split's per-rank page book and owner (TF_GLM_KV_SPLIT, #1431 part 1; stacked on #1411) #2415, dsv41 metal: the lane target, the prompt cache and the native server over Metal #1720, dsv41 metal: the vision tower's kernels under the kernel contract #1721, dsv41 metal: image prompts #1722) come from another of my open pull requests and already conflict with main inCHANGELOG.md.atc who: no pull requests or agents; no open pull request touches the file. Re-run right before this pull request opened:atc overlap --jsonat 2026-11-12 14:06 UTC on head35a084d79; noconflictsentries.Checks on this head
35a084d794a2d3e22da544cdb2329e96395d8afbpython3 tools/zig/lean_check.py, on the base and on this head: base3885dceb2345 (inherited),head 345, the same findings, 0 new (
python3 tools/pr_check.py --base 3885dceb2: 0 errors, 1 advisory warning,no PR number).
zig fmt --check build.zig zig,git diff --check: pass on this head.zig build test-cuda-host(it does not compilezig/tests/cuda) passes on this head on Linux x86_64 (CUDA 13.3.1image) and on
e2f0b7f15, the same commit, on macOS (exit 0; Zig prints no Build Summary without--summary).zig build test test-golden -Dcpu=apple_m1, run ond04c5250c, this commiton main
eab305db0before the rebases onto4f8317dac,000b534a2and3885dceb2(git range-diff:=): "Build Summary: 837/839 stepssucceeded (1 failed); 7587/7661 tests passed (73 skipped, 1 failed)". The failure,
dashboard_test"dashboardpage polls the public stats snapshot without private details", is inherited: main
eab305db0fails the same teston the same Mac ("Build Summary: 837/839 steps succeeded (1 failed); 13041/13152 tests passed (110 skipped, 1
failed)").
The changed file is in the CUDA device runner; it was built for sm_121 (GB10) and sm_120 (RTX) with
zig build install nativein a CUDA 13.3.1 image,-Doptimize=fast, and run as two processes, one rank a GPU.Fail before, pass after:
timeouteofsum93a2e93ecRankTimeoutin NCCL's initialization10bef77927d97cc65610bef7792The fix's device runs were measured on
10bef7792, before the rebases ontof0d8c8d50,eab305db0,4f8317dac,000b534a2and3885dceb2:10bef7792,d04c5250c,e2f0b7f15and9a2858f70are this commit (git range-diff:=), and the rank test, itscollective and NCCL wrapper are identical from
7d97cc656to3885dceb2(Flash Next changed only in flashnext: refuse a malformed TF_FLASHNEXT_* setting by name before device work #2585'ssetting reads, in
eab305db0), so the measured code is unchanged.missing(one process alone) passes before and after.Receipt
n/a: test code only; it cannot reach inference. The device runs above are the check.
Checklist
timeoutmode fails before and passes after; the runner needs two GPUs.)