Repository navigation
[https://nvbugs/6843484][fix] Keep multi-node aggregated perf-sanity jobs in one NVLink domain - #20418
Conversation
…jobs in one NVLink domain
The aggregated multi-node perf-sanity stages (PerfSanity-Node2-GPU8 and the
gen_only_no_context PerfSanity-GEN1-NODE{2,4,8} stages) were submitted without
--segment, so Slurm could spread one EP16/EP32 job across several NVL72 racks.
Across racks the wide-EP MoE all-to-all cannot map MNNVL memory, so the
communication factory falls back to NcclEP, which then crashes in NCCL GIN
context creation or stalls until the idle-GPU reaper cancels the job.
Request --segment=<nodeCount> for these stages, the same way the
Disagg-PerfSanity and SingleNvlinkDomain stages already do.
Signed-off-by: chenfeiz0326 <203214996+chenfeiz0326@users.noreply.github.com>
|
/bot run --disable-fail-fast --stage-list "GB200-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-2,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-1,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-2" |
|
PR_Github #78135 [ run ] triggered by Bot. Commit: |
|
Validated on GB200 (oci-hsg). PR CI can't run the 5 multi-GPU stages without the Case: Setup:
With the segment, Slurm kept all 4 nodes in one rack and the case passed. Throughput is within 0.05% of CI's last single-rack pass. An earlier attempt (job 7970844, same setup and nodes) also reached 🤖 Generated with Claude Code |
|
PR_Github #78135 [ run ] completed with state
|
|
/bot run --disable-fail-fast --stage-list "GB200-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-2,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-1,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-2" |
|
@ZhanruiSunCh @yiqingy0: requesting your review (
The first PR pipeline (#64401) did not reach any test stage. The |
|
PR_Github #78160 [ run ] triggered by Bot. Commit: |
|
PR_Github #78160 [ run ] completed with state
|
|
@tburt-nv: adding you as a |
|
Automatically added "ci: full pre-merge approved" because this PR has satisfied the required GitHub review approvals. Unresolved review conversations and other required checks remain independent merge requirements. |
|
/bot run --disable-fail-fast --stage-list "GB200-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1,GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-2,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-1,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-2" |
|
Thanks @hanjingtian! The label is now applied, so I've re-run the five affected multi-GPU stages ( |
|
PR_Github #78310 [ run ] triggered by Bot. Commit: |
|
PR_Github #78310 [ run ] completed with state
|
|
CI #78310 (pipeline #64547) result. This is the first PR run that reached the five affected stages, and every job was submitted with
Neither 8-node failure is a model failure. In both, the server came up and printed |
|
/bot run --disable-fail-fast --stage-list "GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-1,GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-2" |
|
PR_Github #78345 [ run ] triggered by Bot. Commit: |
|
PR_Github #78345 [ run ] completed with state
|
|
Re-run of the two 8-node stages (pipeline #64575):
So far 4 of the 5 affected stages have passed with
|
|
/bot run --disable-fail-fast |
|
PR_Github #78362 [ run ] triggered by Bot. Commit: |
Signed-off-by: chenfeiz0326 <203214996+chenfeiz0326@users.noreply.github.com>
|
Full pre-merge pipeline #64591: none of the failures come from this PR's change, which is one line in
I merged the current |
|
/bot run --disable-fail-fast |
|
PR_Github #78441 [ run ] triggered by Bot. Commit: |
|
PR_Github #78362 [ run ] completed with state |
|
PR_Github #78441 [ run ] completed with state
|
|
Full pre-merge pipeline #64659 on
Because single-GPU tests failed, the pre-merge multi-GPU stages were blocked and didn't run. The five affected perf-sanity stages are post-merge stages, so a full pre-merge pipeline doesn't include them. They ran through Pre-merge reads the waive list from the tip of |
|
/bot run --disable-fail-fast |
|
PR_Github #78579 [ run ] triggered by Bot. Commit: |
|
PR_Github #78579 [ run ] completed with state
|
|
Full pre-merge pipeline #64739 on
This PR changes one condition in Re-running on the same commit. Stages that already passed on this commit are reused. |
|
/bot run --disable-fail-fast |
|
PR_Github #78607 [ run ] triggered by Bot. Commit: |
|
PR_Github #78607 [ run ] completed with state |
|
Merged after full pre-merge pipeline #64760 passed on |
Description
Fixes the multi-node
gen_only_no_contextperf-sanity failures from NVBug 6843484 onmain. This is themaincounterpart of the first commit of #20292 (release/1.3).Affected stages (every aggregated multi-node perf-sanity stage):
GB200-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-{1,2}GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-{1,2}PerfSanity-GEN1-NODE2-GPU8andPerfSanity-Node2-GPU8stages go through the same path. They have not failed because of it so far.Symptoms in the bug:
ncclGinGdakiCreateContext ... failed: 2NCCL-EP NVFP4 dispatch requires uint8 tokensno new log output for 7201sCANCELLED by 146504(the idle-GPU reaper)Root cause.
runLLMTestlistWithSbatchrequests--segment=<nodeCount>only forDisagg-PerfSanityandSingleNvlinkDomainstages. Aggregated multi-node perf-sanity stages (aggMultiNodeMode) get no segment, so Slurm can spread one EP16/EP32 job over several NVL72 racks.topology/blockuses one block per rack.NVLinkOneSidedandNVLinkTwoSidedfail withCUDA_ERROR_INVALID_HANDLE, because MNNVL memory cannot be mapped across NVLink domains. The MoE communication factory then falls back toNcclEP.NcclEPthe case either crashes or stalls with idle GPUs until the reaper or the 2 h no-output watchdog cancels the job. It crashes in NCCL GIN or withNCCL-EP NVFP4 dispatch requires uint8 tokens.Evidence: Slurm nodelist vs. outcome for these 5 stages. Nodelists are read from the Jenkins stage logs (
Slurm job N nodelist:). Excluded: builds whose logs expired, runs hit by themain#3009 DNS outage, and onerelease/1.3#31 run that was SKIP-waived. Every counted pass uploaded results.main#3009–#3019release/1.3#20–#31main, the 4- and 8-node stages have failed in every one of the last 7 builds unless Slurm happened to place them in one rack. GB300GEN1-NODE4-GPU16-Post-Merge-2(DeepSeek-R1 con4096) shows this directly: it passed in feat: add conditional disaggregation test #3012, feat : reduce trt engine build time in testing #3014 and chore: Improve trtllm-serve import pattern #3016 on one rack, and failed in chore: Refactor imports inside tensorrt_llm._torch. #3015, fix: creating output of dataset generator in current directory #3018 and chore: bump version to "0.19.0.dev2025032500" #3019 on two.mainchore: bump version to "0.19.0.dev2025032500" #3019, GB200 DeepSeek-R1 con4096 dep16, onnvl72108-T[04-05],nvl72005-T[08,14](2 racks): the archivedgen_server_0.logshows all 944 MoE layer selections asNVLinkOneSided not available: CUDA_ERROR_INVALID_HANDLEand thenNcclEP. Then comesgin_plugin.cc:916 ... proxyRegMrSymDmaBuf ... failed: 2. Every rank ends inValueError: NCCL-EP NVFP4 dispatch requires uint8 tokens with shape (2, 3584), got dtype=torch.bfloat16.Disagg-PerfSanitystages already pass--segment. They landed in one rack in 152/152 runs, up to 14 nodes.Fix. Also request
--segment=<nodeCount>inaggMultiNodeMode, the same as forDisagg-PerfSanityandSingleNvlinkDomain.jenkins/L0_Test.groovy.PerfSanity. Every such stage has at most 8 nodes, well under the 18-node block size. Slurm accepts--segment=4and--segment=8for this shape on oci-jhb and oci-aga (sbatch --test-only).jenkins/scripts/perf/local/submit.py) already emits--segment=<total_nodes>for every job.Test Coverage
pre-commitpasses on the changed file.ci: full pre-merge approvedlabel (multi-GPU stages are blocked without it):GB200-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-1GB300-16_GPUs-4_Nodes-PyTorch-PerfSanity-GEN1-NODE4-GPU16-Post-Merge-2GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-1GB300-32_GPUs-8_Nodes-PyTorch-PerfSanity-GEN1-NODE8-GPU32-Post-Merge-2GPU validation (GB200, oci-hsg, job 7971062): passed. Setup: the exact
mainCI wheel (GenPostMergeBuilds #2977,c9b18eefa7, includes #20256), CI's pre-imported 26.09 container, this PR's tree, and--nodes=4 --segment=4. Case: GB200 DeepSeek-R1 con4096 dep16gen_only_no_context.main#3016 (1 rack, passed)main#3019 (2 racks, failed)nvl72174-T[01-02,06,15])NVLinkOneSided×944NVLinkOneSided×944NcclEP×9441 passedCANCELLED by 146504)Details are in the PR comment.
PR Checklist
🤖 Generated with Claude Code