Skip to content

rccl-tests: share GIN-SDMA pytest harness - #12730

Merged
dlamd1dai merged 1 commit into
developfrom
users/dondai/aic2221-gin-harness
Oct 6, 2026
Merged

dlamd1dai merged 1 commit into
developfrom
users/dondai/aic2221-gin-harness

Conversation

@dlamd1dai

Copy link
Copy Markdown
Contributor

Summary

  • Split out of rccl-tests: GIN device-API CI and harness cleanup (AICOMRCCL-2221) #11559 (2/3). Independent of the poison and device-api PRs.
  • AllGather, AllToAll, and Broadcast share gin_sdma_harness.py (MPI launcher, connectivity-gate retry, Broadcast debug-file capture).
  • detect_ngpus() raises RuntimeError when rocminfo is missing or fails, so GPU-free collection still works on a host with ROCm on PATH and no /dev/kfd.
  • The data-failure retry guard uses output that matches both the connectivity gate and #wrong, so deleting the data-failure branch fails the test.

test_AllToAllDevtime.py is intentionally not ported here. It is the pytest device-api CI runs, and that move is a follow-up on AICOMRCCL-2221.

Same commit as #11894 (17d7a8680e). This pull request is opened from ROCm/rocm-systems so the RCCL coco PR workflow can run on the pull_request event.

JIRA ID : AICOMRCCL-2221

Test plan

  • Offline guards: connectivity retry, non-gate error, data failure that also matches the gate
  • pytest projects/rccl-tests/test -k GinSdma collects from the rccl-tests root and from test/ (38 tests, reported on rccl-tests: share GIN-SDMA pytest harness #11894)
  • RCCL coco PR: Ruby and OCI smoke on this pull request

Made with Cursor

AllGather, AllToAll, and Broadcast were each carrying their own MPI
launcher and connectivity-gate retry. One module keeps those from
drifting, and the GPU-free guards now cover rocminfo failure and a
data error that also looks like a connectivity abort.

Co-authored-by: Cursor <cursoragent@cursor.com>
@dlamd1dai
dlamd1dai requested review from a team October 2, 2026 23:38
@therock-pr-bot

therock-pr-bot Bot commented Oct 2, 2026

Copy link
Copy Markdown

✅ All Policy Checks Passed

Check Status Details
📝 PR Description ✅ Pass —
⛔ Forbidden Files ✅ Pass —
🧪 Unit Test ✅ Pass —
🚫 Draft PR 🔜 To Be Enabled —
🚩 Feature Flag 🔜 To Be Enabled —
📊 Code Coverage 🔜 To Be Enabled —

🎉 All policy checks passed!

📖 Need help? See the Policy FAQ for details on every check and how to fix failures.

🙋 Wish to Override Policy?

@dlamd1dai

Copy link
Copy Markdown
Contributor Author

RCCL PR gate analysis: the Ruby 4-node failures are pre-existing, not from this PR

Now that this PR runs on a non-fork branch, coco actually executes (the earlier Sep 26 / Sep 29 runs had Setup=skipped because fork PRs get no secrets). Run 37078549906 gave the first real results:

  • Setup — success
  • OCI / oci-rccl-pr-smoke — success (57 min)
  • Ruby / ruby64-rccl-pr-smoke — failure (1h35m, coco exit 10)
  • RCCL PR gate — failure, because it requires every cluster to have passed

The Ruby failures do not come from this change.

Baseline parity

coco ran both the PR stack and the develop baseline on Ruby and reported them identically:

INFO [pr-12730_rccl-perf_rocm-10.1-latest]   passed=17, failed=5, skipped=3 (total=25)
INFO [rocm-10.1-latest_rccl-develop-perf]    passed=17, failed=5, skipped=3 (total=25)

The baseline is a different RCCL build (45a15183c20a vs 8f697d88af16 for this PR) and does not contain these changes. It fails the same five tests, not merely the same count:

Test Topology
regression-allgather-fp32_all_gather_perf 4n_8ppn
regression-alltoall-fp32_alltoall_perf 4n_8ppn
regression-bf16-sum_all_reduce_perf 4n_8ppn
regression-bf16-sum_reduce_scatter_perf 4n_8ppn
regression-reduce-scatter-fp32-sum_reduce_scatter_perf 4n_8ppn

Every failure is 4-node. All 1-node and 2-node variants of those same tests pass, and the rccl-debug stack passes 193/199. The OCI cluster ran the identical five 4-node tests and passed all of them.

The failures track a single node

In all five Ruby failures, the same node reports the primary error and the others report a cascade from it:

cv350-rck-g03-e14-08: Test NCCL failure ... 'unhandled system error (run with NCCL_DEBUG=INFO for details)'
cv350-rck-g03-e13-08: Test NCCL failure ... 'remote process exited or there was a network error'
cv350-rck-g03-e20-08: Test NCCL failure ... 'remote process exited or there was a network error'

The Slurm allocations line up with the topology pattern exactly:

Topology Nodes Result
1n_8ppn c07-18 pass
2n_8ppn c09-18, e07-08 pass
4n_8ppn c07-18, e13-08, e14-08, e20-08 fail

cv350-rck-g03-e14-08 appears only in the failing allocation, and it is the primary failure in the develop baseline as well. This looks like a node or inter-node fabric problem on ruby64 that affects any RCCL PR landing on that allocation. Diagnosing it properly needs NCCL_DEBUG=INFO, which the log asks for and the perf harness doesn't set.

This PR isn't in the failing code path

The change touches four pytest files only — gin_sdma_harness.py, test_AllGather.py, test_AllToAll.py, test_Broadcast.py. The failing tests are rccl_test perf regressions launched directly via mpirun, not through pytest.

Requests

  1. Can someone confirm whether cv350-rck-g03-e14-08 is a known-bad node, and drain or repair it if so? I've re-run the Ruby leg in case a fresh allocation avoids it.
  2. If it can't be fixed quickly, this PR would need a gate override given the baseline parity above.
  3. Worth considering: coco already collects the baseline stack and prints its results beside the PR's, but nothing compares them — the gate fails on any test failure rather than on new failures. Diffing PR against baseline and failing only on regressions would let a PR like this pass without human intervention when a cluster node is broken.

Other red checks (none are required on develop)

  • therock-pr-bot — systemic 15-minute timeout waiting for a pre-commit check-run that never runs on PRs targeting develop.
  • cleanup — the unrelated Docs Preview Cleanup workflow, failing with [@octokit/auth-app] appId option is required (missing secret in that workflow).
  • mci/rocm-libraries/precheckin(rccl-tests) — ABORTED with Timeout has been exceeded on the 4gfx908 stage; retriggerable.

@dlamd1dai

Copy link
Copy Markdown
Contributor Author

Second confirmation: cv350-rck-g03-e14-08 reproduces on an unrelated PR

Following up on my analysis above. #12705 — an unrelated PR that adds a single host-side gtest — hits the identical Ruby failure one day later with a different 4-node allocation:

#12730 (Oct 2) #12705 (Oct 3)
4n_8ppn allocation c07-18, e13-08, e14-08, e20-08 c17-08, c17-18, e14-08, e20-08
Failing tests the same five the same five
Primary error node cv350-rck-g03-e14-08 cv350-rck-g03-e14-08
PR stack passed=17, failed=5, skipped=3 passed=17, failed=5, skipped=3
develop baseline passed=17, failed=5, skipped=3 passed=17, failed=5, skipped=3
OCI cluster success success
1-node / 2-node all pass all pass

In #12705 the healthy-node control is even cleaner: c17-08 is in both the passing 1-node allocation and the failing 4-node allocation, so that node is fine — the only thing that changes is the presence of e14-08.

Two unrelated PRs, two days, two different allocations, one node in common, with the develop-only baseline failing identically in both. This is a cluster problem on ruby64, not a regression from either change.

Note that two of two 4-node allocations drew e14-08, which suggests a small or reserved node pool rather than random selection — so re-running may not be enough to dodge it. I have a Ruby re-run in flight on this PR to test exactly that.

@abouteiller abouteiller left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Diff came out identical to previously approved #11894

@dlamd1dai
dlamd1dai merged commit 86cedf7 into develop Oct 6, 2026
230 of 251 checks passed
@dlamd1dai
dlamd1dai deleted the users/dondai/aic2221-gin-harness branch October 6, 2026 22:25
@systems-assistant

Copy link
Copy Markdown
Contributor

TheRock Submodule Bump Activity

Newest first

dlamd1dai added a commit that referenced this pull request Oct 18, 2026
> **Replaces #12488.** Same change; only the head branch moved.
>
> #12488 was opened from a fork, where the required `RCCL PR gate` check
can never pass. Fork pull requests receive no secrets, so the `RCCL coco
PR` workflow skips its `Setup` job, the coco smoke never runs, and the
gate fails closed in a few seconds. This branch lives in
`ROCm/rocm-systems`, so the gate dispatches coco on its own.

## Summary
- Follow-up to #12730, which landed `gin_sdma_harness.py` and ported
AllGather, AllToAll, and Broadcast. That PR left
`test_AllToAllDevtime.py` for this one. Rebased onto `develop` after
#12730 merged, so the diff is now this one file.
- Replace the local MPI launcher, `-x` env assembly, fixed-size `-D 3`
argv, hang handling, and `rocminfo` GPU count with `gin_sdma_harness`.
`detect_ngpus()` raises when `rocminfo` is missing, so it runs only when
this module is enabled and `RCCL_TESTS_A2A_NP` is unset.
- Keep the device-api CLI and test names: `-B 1`, `-B 2`, and `-B 2 -H
1`, plus `NCCL_GIN_TYPE` default `2`. `run-device-api-ci.sh` still runs
this file directly.
- Retry connectivity-gate aborts through `run_with_conn_gate_retry`,
with the same `RCCL_TESTS_A2A_CONN_RETRIES` knob (default 5) as
`test_AllToAll.py`. Data-check failures are not retried.
- Fail the devtime smoke unless the release-build out-of-place `#wrong`
column and the `Out of bounds values` count are both zero. `#wrong=` is
printed only under `DEBUG_PRINT`, so a line such as `Out of bounds
values : 3 FAILED` used to pass. In-place `#wrong` stays `N/A` because
AllToAll does not check in-place.
- The row regex requires both `#wrong` groups, as `BCAST_ROW_RE` does,
so a skipped out-of-place row does not match instead of reading the
in-place column. The `-B 2` test checks the `WARN --device_timing=2`
line before the datacheck, so that warning names the cause.
`_wrong_count`, `_NUM`, `_WRONG`, and `_OOB_RE` now come from
`gin_sdma_harness`. `_A2A_OOP_WRONG_RE` stays local because
`BCAST_ROW_RE` cannot match the AllToAll root of `-1`.

JIRA ID : AICOMRCCL-2221

## Test plan
- [x] `pytest projects/rccl-tests/test/test_AllToAllDevtime.py
--collect-only` collects the three GPU smokes with the module disabled,
and again with `RCCL_TESTS_GIN_SDMA_DEVTIME=1 RCCL_TESTS_A2A_NP=2`
(smci350-rck-g03-d07-40)
- [x] `pytest projects/rccl-tests/test/test_AllToAllDevtime.py -k 'not
Mode'`: 8 datacheck guards passed, and the three GPU smokes stay skipped
with the module disabled. Deleting the unchecked-`N/A` branch, or
reverting the regex to a single `#wrong` group, turns the matching guard
red.
- [x] Device-api job: `projects/rccl/tools/ci/lib/device-api.sbatch` on
Ruby `cv350-rck-g03-e22-08` (8× gfx950, ROCm 10.2.0 TheRock), head
`c1f875fe47`. Builds OpenMPI, RCCL, and rccl-tests with
`ENABLE_DEVICE_API=1`, then runs `run-device-api-ci.sh`. The benchmark
matrix passed, and the devtime smoke passed 11 of 11, including the
three GPU tests `-B 1`, `-B 2`, and `-B 2 -H 1` (69.96s). An earlier run
on `388c680765` (`cv350-rck-g03-e07-18`) also passed.
- [ ] `RCCL PR gate` (Ruby and OCI coco smoke) on head `56b28e24c6`. It
passed on `1b28af1f56`. The first OCI run on `56b28e24c6` failed one
unrelated test: the 2-node BF16 AllReduce regression on ROCm 10.1 hit
`LLVM ERROR: IO failure on output stream: Bad address` (see the CI
comment below). Re-running.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants