Repository navigation
Conversation
…s followers bootstrap on NCCL_SOCKET_IFNAME
With NCCL_COMM_ID set, NCCL's bootstrap looks on every rank for a local interface in that address's subnet and does
not read NCCL_SOCKET_IFNAME. Hosts joined only by point-to-point links whose addresses are /32s routed over them, as
three GB10s in a switchless ring, have one on rank 0's host alone, so ranks 1 and 2 stop in bootstrapNetInit
("NET/Socket : No usable listening interface found") and TP=3 does not start.
Rank 0 makes the id from NCCL_COMM_ID as before, so the root listens where the operator put it, and sends it over the
ranks' lines, which tp_watch opens before NCCL, in three records; the other ranks take it from their line, as Flash
Next's rank 1 takes its id over its link. A follower that names NCCL_SOCKET_IFNAME also unsets NCCL_COMM_ID before
its first NCCL call, so that interface carries its bootstrap; a follower without one keeps NCCL_COMM_ID and NCCL
picks its interfaces as in 1.1.2. NCCL_COMM_ID still names the lines' address on every host.
Bizuayeu
marked this pull request as ready for review
October 22, 2026 09:43
Contributor
Author
|
The description now has the GPU receipt: at TP=3 on the ring, 1.1.2's rank 1 stops in |
This was referenced Oct 22, 2026
ashhart
added a commit
that referenced
this pull request
Oct 25, 2026
Owner
|
Landed on main in 81b476d..2ff0191, with your record under your authorship and a maintainer fix-up that keeps bounded rank-ID fanout controls. Thank you, @Bizuayeu. On two GB10s at TP=2 (GLM-5.3-Flash NVFP4, alternating base/new/new/base): tokens equal in 52 of 52 comparisons; prefill and decode within ±0.3%; chat with prompt-cache resume qualified with thinking off and on. - Synthema, Ash's AI Assistant. |
Contributor
Author
This was referenced Oct 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
GLM-5.3-Flash's CUDA ranks other than 0 take rank 0's NCCL unique id over the ranks' liveness lines (
cuda/tp_watch.zig, which open before NCCL), as Flash Next's rank 1 takes its id over its link (families/flashnext/cuda_collective.zig) and the fabric's bootstrap broadcasts rank 0's (fabric/tp/tp.zig). A follower that namesNCCL_SOCKET_IFNAMEalso unsetsNCCL_COMM_IDbefore its first NCCL call.With
NCCL_COMM_IDset, NCCL's bootstrap looks on every rank for a local interface in that address's subnet and does not readNCCL_SOCKET_IFNAME(bootstrapNetInit). On hosts joined only by point-to-point links whose addresses are /32s routed over them, as our three GB10s in a switchless ring, only rank 0's host has one, so ranks 1 and 2 stop there (NET/Socket : No usable listening interface found) and TP=3 does not start. We raised this on #636 (comment), planning to start GLM's ranks through the fabric'sSession.open; this is a smaller step that keeps GLM's lines andNCCL_COMM_IDand moves only the id onto the lines. Until now we ran TP=3 with a local commit that passes the id through a file, as the GLM lanes tests' runner does (zig/tests/cuda/glm_lanes_tests.zig,openComm).What stays: rank 0 makes the id from
NCCL_COMM_ID, so the root listens where the operator put it, andNCCL_COMM_IDstill names the lines' address on every host. A follower withoutNCCL_SOCKET_IFNAMEkeepsNCCL_COMM_ID, and the id it now takes from its line is the one it used to make. For a follower that namesNCCL_SOCKET_IFNAME, only the bootstrap moves to that interface: NCCL's net interfaces already tookNCCL_SOCKET_IFNAMEfirst. AnNCCL_COMM_IDline in~/.nccl.confor/etc/nccl.confcomes back at NCCL's first call and keeps the old bootstrap.The id goes in three records of the lines' 64-byte form, each a part number and up to 48 of the id's 128 bytes. A follower waits for all three up to 15 minutes, as for the ranks' ready records.
Receipt
41e64791) on 1.1.2 (4ff78441), Zig 0.17.0, nvcc 13.0 for sm_121, NCCL 2.30.7; GB10 (sm_121) hosts, one GPU each; checkpointnvidia/GLM-5.3-Flash-NVFP4at423acf37;serveper rank withTF_GLM_RANK,TF_GLM_WORLDandNCCL_COMM_ID,--context 40960 --parallel 1, drafts on.NCCL_SOCKET_IFNAME, the interface holding its /32 address, before and after.bootstrapNetInit(NET/Socket : No usable listening interface found), and rank 0 stops with it (rank 1 stopped (ncclGetUniqueId)).token_shaper prompt:NCCL_SOCKET_IFNAMEon both ranks and on neither, the same as our earlier TP=2 runs of v1.1.1 with two local commits (a heat ceiling and the id file) and of v1.1.2 with glm/cuda: load and serve nvidia/GLM-5.3-Flash-FP4-Local as stored #1050 and the id-file commit; both settings start with no NCCL warning.ncclCommInitRank; rounds and kernels are unchanged. There is no before at TP=3, where 1.1.2 does not start on the ring. After, on the counting prompt above (512 greedy tokens after a 2,066-token prompt, drafts on; nottools/bench_openai.py): 67.3 tok/s at TP=3, acceptance length 4.65 as on the TP=3 reference, and 37.9 to 38.8 tok/s at TP=2 in both settings.git archivetrees of this branch and of 1.1.2:zig build testpasses 3,444 of 3,460, with 15 skipped and 1 failing:cuda_cost_identity's "stable reads reuse a drafter, while a changed payload at the same path invalidates it". It fails the same way on 1.1.2, where 3,443 of 3,459 pass.test-kernel-contract,test-golden,test-server-security test-pull-security,fuzz-cortheonandzig buildpass.python3 -m unittest discover -s tools/zig -p flashnext_batch_serve_test.pyruns 8 tests, all OK.zig fmt --checkpasses on the two files, andtools/zig/lean_check.pyfinds no new problem against 1.1.2.zig build teston macOS: the new test runs there, but this repository's macOS job runs the app's npm checks only. On Windows, where the new test skips, thezig-windowscheck passes on this head.tf-cuda-test, which built; the serve runs above go through the startup this changes.Checklist
ncclCommInitRank.)"draft": false, a resumed prompt equals a fresh one, and concurrent equals solo. (Resumed equals fresh in the decode check above. Drafts and concurrency run through the unchanged rounds and were not run on this branch.)SUMMARYline is in the receipt. (No kernel changes.)tp_watchtest calls the functions this change adds, so it cannot build before it; it skips on Windows, where this head's checks pass. On the GPU, 1.1.2's rank 1 stops on the ring, as the before above shows.)