Skip to content

CI: Run the DL cluster job on the GB200 partition - #11885

Merged
ofirfarjun7 merged 1 commit into
openucx:masterfrom
Alexey-Rivkin:ci-dl-gb200-partition
Sep 10, 2026
Merged

ofirfarjun7 merged 1 commit into
openucx:masterfrom
Alexey-Rivkin:ci-dl-gb200-partition

Conversation

@Alexey-Rivkin

@Alexey-Rivkin Alexey-Rivkin commented Sep 2, 2026 •

Copy link
Copy Markdown
Contributor

What?

Get ucx-test-dl-gpu running on the GB200 DL cluster.

Why?

The job never passed: it timed out waiting for a node on gb300nvl72_ci, and even with a node one worker could not finish the suite in time.

How?

  • Partition gb200nvl72_ci / account oberon-gb-ci (99 nodes vs 36, tied together by the cluster's cli_filter).
  • Four sharded allocations (worker axis), separate checkout and test steps, make -j32, 180-min test step.
  • dl-base rebased on the CUDA 13 release image (buildlib/dockers) plus gdrcopy, so CUDA tests build and run; no local useradd needed.
  • try_load_cuda_env only needs nvidia_peermem on Azure; dlcluster uses dmabuf.

UCX issues surfaced (not fixed here)

GB200: aarch64, GPUDirect via dmabuf, no nvidia_peermem.

  • Segfault when cuda-managed registration fails: dcx/test_ucp_mmap.rndv_mpool_mdesc_no_rcache/2 (ucp_mm.c:84 EIO -> mpool.c:246 -> SIGSEGV). Same crash-after-failure pattern after cuda_ipc/test_cuda_ipc_md.mkey_pack_mempool/0 and dc_mlx5/uct_p2p_rma_test.{put_short,put_zcopy,get_bcopy}.
  • Hangs until timeout: ucp_client_server -c stream -s 1 (intermittent, both fleets), dcx/test_ucp_tag_mt.send_recv.
  • test_ucp_devices_config_mlx5.range_negate* assumes contiguous mlx5_0..N; nodes have mlx5_6, mlx5_16.
  • shm/test_ucp_wait_mem.envelope/0: ucp_worker_wait_mem() ~40x slower than reference put on aarch64.
  • Endpoint timeout over RoCE: test_ucp_tag_nbx.fallback/2 (rc/rcx/dcx/shm_ib), rcx/test_ucp_rma_mt.put_get/0.
  • Also failing: rc_verbs/uct_p2p_rma_test_inlresp.get_*_inlresp*, all/test_ucp_ep_based_fence.test_ep_based_fence_get/0.

Logs (internal link):
https://nbuprod.blsm.nvidia.com/nbu-swx-ucx-master/job/UCX-OSS/job/ucx-test-dl-gpu-oss/26/

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

Stale GB300 description: The JJB job description for ucx-test-dl-gpu-oss in .ci/jenkins/proj_jjb_oss.yaml:230 still says GB300/aarch64, but this PR migrates that same pipeline to GB200. Since the PR already updates the matching header comment in test_dl_matrix.yaml, this description should move with it. Suggested: jjb_description: "UCX GTest on DL cluster (GB200/aarch64). Do NOT edit via Web GUI!"

Coverage note: CI-config changes like this are validated by the pipeline actually running against the new partition/account. Confirm the ucx-test-dl-gpu-oss job scheduled and passed on gb200nvl72_ci under oberon-gb-ci before merge, since there is no dry-run artifact in the diff to show the new allocation works.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

.ci/pipeline/test_dl_matrix.yaml

Slurm allocation may be too short for sequential Build + Test. SLURM_JOB_TIMEOUT: '02:45:00' = 165 minutes. The Build step (parallel: false, runs first alone) has BUILD_TIMEOUT: 45, and the four worker steps (parallel: true) have TEST_TIMEOUT: 140. Worst-case wall time is 45 + 140 = 185 minutes, exceeding the 165-minute allocation. If a build runs near its budget, Slurm can reclaim the node partway through the test phase and fail the run non-deterministically. Consider raising SLURM_JOB_TIMEOUT to cover BUILD_TIMEOUT + TEST_TIMEOUT plus scheduling slack, or confirm the two timeouts are not additive in this framework.

.ci/pipeline/test_dl_matrix.yaml

The 'Build' step actually runs the MPI and configure test suites under a 45-minute budget. With BUILD_ONLY_TARBALL set and ASAN_CHECK=no, dispatch calls build_for_tests, which runs run_mpi_tests (perftest-with-MPI, malloc-hook MPI, MPI CUDA tests) and run_configure_tests before the devel build, then packs the tarball. So the step named 'Build' is doing substantial testing, not just compiling, yet it is constrained by BUILD_TIMEOUT: 45 rather than the test timeout. These tests now run only on the single build node. A slow MPI phase can abort the build before any worker starts. Consider renaming the step / raising its timeout, or confirming the MPI+configure phase reliably fits in 45 minutes on the new partition.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

Comment thread .ci/pipeline/test_dl_matrix.yaml Resolved
@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@svc-ucx

svc-ucx commented Sep 6, 2026

Copy link
Copy Markdown

🤖 CI Triage Agent — UCX PR (Tests roce on worker 1) · commit eff2c6fd

TL;DR: The gtest suite on "roce on worker 1" failed with a single test failure — dc_mlx5/uct_atomic_key_reg_rdma_mem_type.fadd64/0 (8720/8721 passed) — a known-flaky device-memory (MEMIC / UCS_MEMORY_TYPE_RDMA) atomic test that is unrelated to PR #11885 (a CI-only change for the DL/GB200 partition); re-run the job, and harden the MEMIC allocation retry/skip logic in uct_test::entity::mem_alloc if it recurs.

Full analysis

Summary: make test in build-test/test/gtest exited with error 1 because exactly one test failed: dc_mlx5/uct_atomic_key_reg_rdma_mem_type.fadd64/0 (GetParam() = dc_mlx5/mlx5_0:1), after a full 3512-second run with no hangs (log shows continuous test activity right to the tear-down at 13:40:36).

Root cause: The failing test allocates the target buffer in UCS_MEMORY_TYPE_RDMA (HCA device memory / MEMIC) and runs 4×1000 concurrent 64-bit fetch-add operations over dc_mlx5 (test/gtest/uct/test_atomic_key_reg_rdma_mem_type.cc:33). MEMIC is a scarce, host-wide HCA resource, and this suite has a long history of environmental flakiness on it — three separate commits exist purely to add retries/limits for MEMIC allocation failures in this exact test (6c7715d0, d7d57e17, [REDACTED:Hex High Entropy String], 69718f6d). The retry loop in test/gtest/uct/uct_test.cc:968-998 only retries when the status is exactly UCS_ERR_NO_MEMORY (if (status != UCS_ERR_NO_MEMORY) break;), so any other device-memory failure (or contention from parallel workers on the same host, swx-rain04, worker 1 of the matrix) fails the test immediately via ASSERT_UCS_OK. Nothing in PR #11885 ("CI/DL: Run the DL cluster job on the GB200 partition") touches UCT/IB, atomics, or the gtest code — it only changes the DL cluster job configuration — so this failure is not caused by the PR. Note: the exact assertion text for the failing test is not recoverable — the gtest line printed hours earlier in the run is beyond the retained console tail and Azure exposes no gtest artifact for this job — so the immediate failure mode (allocation ASSERT_UCS_OK vs. an in-flight atomic error) cannot be pinned down further from this build alone.

Implicated commit: none in this PR; the flaky test originates from 6c7715d0 (Roie Danino, "TEST/GTEST/UCT: Added gtest for RDMA memory atomic key reg"), with retry mitigations in 69718f6d / [REDACTED:Hex High Entropy String] (Michal Shalev)

File: test/gtest/uct/test_atomic_key_reg_rdma_mem_type.cc:33 (buffer alloc) and test/gtest/uct/uct_test.cc:985 (retry only on UCS_ERR_NO_MEMORY)

Suggested fix: Re-run the "roce on worker 1" job to confirm it is transient — the PR is CI-config-only and should not be blocked by it. To stop the recurrence, make the RDMA/MEMIC path resilient in uct_test::entity::mem_alloc: retry on any allocation failure (not just UCS_ERR_NO_MEMORY) when mem_type == UCS_MEMORY_TYPE_RDMA, and if all retries are exhausted issue UCS_TEST_SKIP_R("cannot allocate device memory (MEMIC)") instead of ASSERT_UCS_OK, since device-memory availability is an environmental property, not a code defect. Additionally, have the test pre-check MEMIC availability (small trial allocation) in its init() alongside the existing check_rdma_memory() guard so it skips cleanly when the HCA has no free device memory.

Related: #11885 (the PR under test, CI-only), #10475 ("TEST/GTEST/UCT: Increase retries and add random sleep when MEMIC allocation fails") — prior mitigation for the same flakiness.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 2fd6e2c7-332e-47d9-b1c8-ce44594c70dc in the triage console for the audit trail.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

Comment thread .ci/pipeline/test_dl_matrix.yaml Resolved
@svc-nvidia-pr-review

Copy link
Copy Markdown

Residual coverage gap: this is a CI-config change with no dry-run artifact in the diff — merge should be gated on the ucx-test-dl-gpu-oss job actually scheduling and passing on gb200nvl72_ci under oberon-gb-ci across all four shards.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

.ci/pipeline/test_dl_matrix.yaml

BUILD_JOBS=32 may be silently capped: the gpu matrix passes NPROC=${NPROC} in slurmEnv but this one doesn't. parallel_jobs gets capped by NPROC in common.sh, and if pyxis triggers the container-detection path (/.dockerenv, /run/.containerenv, or KUBERNETES_SERVICE_HOST) NPROC becomes min(16, mem_GB), so BUILD_JOBS=32 would be silently clamped to 16. Can we confirm the 144-core path is actually hit on the slurm node, or pass NPROC explicitly?

.ci/pipeline/test_dl_matrix.yaml

Non-blocking observation: EXECUTOR_NUMBER=${worker} (0–3) differs from test_gpu_matrix.yaml which pins EXECUTOR_NUMBER: "0". Since each DL worker runs on its own allocation/node, per-worker port ranges can't collide, so ${worker} is harmless and arguably cleaner. Not a defect.

Residual coverage gap: this is a CI-config change with no dry-run artifact in the diff. Merge should be gated on ucx-test-dl-gpu-oss actually scheduling and passing on gb200nvl72_ci under oberon-gb-ci across all four shards, since the new partition/account/image and the sharding split are only validated by a live run.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

.ci/pipeline/test_dl_matrix.yaml

BUILD_JOBS=32 can be silently clamped: parallel_jobs is capped by NPROC in buildlib/tools/common.sh, and NPROC is not passed in slurmEnv; if the pyxis container hits the container-detection path, NPROC becomes min(16, mem_GB).

CI-config change with no dry-run artifact — merge should be gated on ucx-test-dl-gpu-oss actually scheduling and passing on gb200nvl72_ci under oberon-gb-ci across all four shards.

@svc-nvidia-pr-review

Copy link
Copy Markdown

.ci/pipeline/test_dl_matrix.yaml

BUILD_JOBS=32 silently clamped by NPROC: this file passes parallel_jobs=${BUILD_JOBS} but not NPROC in slurmEnv. In buildlib/tools/common.sh, parallel_jobs is clamped to num_pinned_threads=${NPROC}, and if the pyxis container triggers the container-detection path (/.dockerenv, /run/.containerenv, or KUBERNETES_SERVICE_HOST), NPROC becomes min(16, mem_GB). test_gpu_matrix.yaml passes NPROC explicitly; this one does not.

pipeline_stop scans the whole jobIdDir rather than filtering by _${BUILD_NUMBER}.

CI-config coverage gate: no dry-run artifact; merge should be gated on ucx-test-dl-gpu-oss actually scheduling and passing on gb200nvl72_ci under oberon-gb-ci across all four shards.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@Alexey-Rivkin

Copy link
Copy Markdown
Contributor Author

/build

@Alexey-Rivkin Alexey-Rivkin changed the title CI/DL: Run the DL cluster job on the GB200 partition CI: Run the DL cluster job on the GB200 partition Sep 7, 2026
@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

Comment thread buildlib/az-helpers.sh Resolved
The job never completed a run. It sat on gb300nvl72_ci, where 36 nodes serve
a queue that stays around 30 deep, so salloc burned its 3600s --immediate
window every time. Slurm hands out these nodes FIFO by queue age with no
account carrying priority, so nothing short of moving helps. gb200nvl72_ci
has 99 nodes and a short queue; svcnbu-swx-hpcx already belongs to its
account, and the cluster's cli_filter ties account and partition together.

Once a node arrives, one worker cannot finish the suite inside the step
budget. Shard four ways like ucx-test-gpu-oss, one allocation each; build
with make -j32 instead of common.sh's default of 4; give the test step 180
minutes, which the slowest shards need. Checkout is its own step, so a
clone failure shows up as one.

Build dl-base on ucx/aarch64/ubuntu24.04-mofed24.10-cuda13, the image the
Azure release pipeline already uses, instead of the hpcx builder: same OS
and MOFED, plus the CUDA 13 toolkit, the NVIDIA driver hook and ibv_devinfo.
On top go gdrcopy, which dlcluster has no environment module for, and
python3-setuptools for test_ucx_tls.py. enroot injects the invoking user
into the container itself, so the useradd goes.

try_load_cuda_env gave up before looking for a GPU whenever the
nvidia_peermem sysfs file was missing. dlcluster nodes register GPU memory
through dmabuf and do not load that module, so the CUDA test paths never
ran there. Require peermem only on Azure, where it is how GPUDirect RDMA is
provided. The gdrcopy module probe at the end of the same function leaked
its failure status out of the function, which under errexit ended the whole
run on any host without environment modules; test it in the if condition.

Signed-off-by: Alexey Rivkin <arivkin@nvidia.com>
@Alexey-Rivkin

Copy link
Copy Markdown
Contributor Author

BUILD_JOBS=32 silently clamped by NPROC ... pass NPROC explicitly?

Not clamped. pyxis sets none of /.dockerenv, /run/.containerenv, KUBERNETES_SERVICE_HOST, so NPROC=$(nproc --all). From #27: NPROC=144, num_pinned_threads=144, parallel_jobs=32, make V=1 -j32.

pipeline_stop scans the whole jobIdDir rather than filtering by _${BUILD_NUMBER}

It does filter, by job_id_*_${BUILD_NUMBER}.txt, and that is exactly what I got wrong: my file names had the build number in the middle, so nothing ever matched and no allocation was cancelled (#16, #26: "No job ID files found"). Renamed to job_id_w${worker}_${BUILD_NUMBER}.txt, same as test_gpu_matrix.yaml. Good catch.

merge should be gated on ucx-test-dl-gpu-oss actually scheduling and passing ... across all four shards

#27 is that run, from /build: all four shards allocate in seconds, build with CUDA and gdrcopy, and run the suite. The remaining red is UCX test failures on GB200 (listed in the description), not CI plumbing.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Starting review — findings will be posted here when done.

@svc-nvidia-pr-review

Copy link
Copy Markdown

🤖 Review complete — no issues found.

@Alexey-Rivkin

Copy link
Copy Markdown
Contributor Author

/build

@Alexey-Rivkin
Alexey-Rivkin marked this pull request as ready for review September 7, 2026 10:13
@svc-ucx

svc-ucx commented Sep 7, 2026

Copy link
Copy Markdown

🤖 CI Triage Agent — UCX-OSS/ucx-test-gpu-oss · commit e5e428af

TL;DR: Two of four gtest shards (funk13, funk15) aborted because large-message IB/RC RMA operations stopped completing entirely — the requests sat for the full 180 s test deadline and the 900 s watchdog then SIGABRT'ed the run; this is a node/fabric-level hang, not a defect in PR #11885's CI-only diff (the same commit passed all 4 shards in build #17 on funk05/06/07/11).

Full analysis

Summary: Test stages for workers w0 (node funk13) and w1 (node funk15) failed with make: *** [Makefile:4714: test] Aborted (core dumped) after UCP RMA requests hung ("request … did not complete on time" → "data validation failed" → "Connection timed out - abort testing").

Root cause: A hang, not slowness. Timestamp analysis of the stage logs shows the runtime is dominated by silent gaps of exactly the request deadline (~3 min each) followed by a final ~12 min gap up to the watchdog kill:

  • w0 (funk13): last progress [ RUN ] shm_ib_ipc/test_ucp_rma.put_blocking/2 <shm,ib,cuda_ipc,rocm_ipc,cuda_copy,rocm_copy/user_memh> printing sizes up to 13x8001143 at 10:32:17, then nothing until 10:35:24 ucp_test.cc:300 request 0x… did not complete on time, again at 10:38:30 and 10:41:21, then Caught signal 6 / Connection timed out - abort testing at 10:53:28 (the 900 s watchdog in test_helpers.cc:57).
  • w1 (funk15): identical pattern starting at [ RUN ] rcx/test_ucp_rma_reg.get_blocking/4 <rc_x,cuda_copy,rocm_copy/nb_no_rcache> (10:53:44) → aborted 11:14:56.

In both cases small transfers in the same test completed normally and then the large zero-copy RC/IB put/get stalled forever with no error CQE, no peer-failure or endpoint-timeout log — i.e. the IB QP silently stopped completing work requests. Evidence that this is environment-specific rather than a code regression: the same branch/commit passed all four shards in build #17 (nodes funk05, funk06, funk07, funk11), and in build #18 the two shards that ran on other nodes (incl. funk16) passed 9108/9108 tests. Only funk13 and funk15 — nodes not used by build #17 — hung. The head commit e5e428af touches only .ci (sharding/partition), and salloc -N 1 -p funk is issued with no --exclusive/--mem/--mincpus, so the new 4-way sharding simply widened the set of (possibly unhealthy or shared) nodes the job lands on.

Implicated commit: none in UCX source. Head commit e5e428af (Alexey Rivkin, "CI/DL: Move the DL cluster job to GB200 and shard it") only changes CI; it is not the cause of the RMA stall, it merely exposes more nodes of the funk partition.

File: .ci/scripts/run_slurm_allocation.sh (salloc args, non-exclusive -N 1 -p funk); failure reported at test/gtest/ucp/ucp_test.cc:300 and test/gtest/ucp/test_ucp_memheap.cc:115, killed by test/gtest/common/test_helpers.cc:57.

Suggested fix:

  1. Re-run the pipeline. If it passes on other nodes, treat funk13/funk15 as suspect and have the cluster admin check them (ibstat port/link state, HCA firmware, dmesg | grep mlx5); drain/repair them and meanwhile pass the already-supported exclude option (--slurm_exclude=funk13,funk15) from the job matrix.
  2. Add --exclusive (or --mem/--mincpus) to SLURM_ALLOC_ARGS in .ci/scripts/run_slurm_allocation.sh: with the new 4-shard fan-out, several allocations (plus overlapping builds — preliminary perf measurement #17 and UCS/UCT: Fix issues found by coverity. #18 ran concurrently) can share a node and its HCAs, which makes stalls like this much more likely and much harder to reproduce.
  3. Make this triageable next time: archive the gtest output as a Jenkins artifact (this build published none) and, on watchdog abort, dump ibstat, ucx_info -d and UCX_LOG_LEVEL=info plus the stuck request state (UCX_WARN_UNRELEASED/vfs dump) so a stuck-QP vs. software hang can be distinguished.
  4. Only if the hang reproduces on healthy nodes should code be suspected — first candidates would be the recent RMA/proto changes 84548e4f (UCP/RMA: Support failover for offloaded GET bcopy protocol #11840, GET bcopy failover) and efcc8340 (UCP/RMA: Fragment SGL put elements larger than max_zcopy #11647, SGL put fragmentation); there is currently no log evidence pointing at them.

Related: PR #11885 (branch ci-dl-gb200-partition, head e5e428af); passing reference run: build #17 of UCX-OSS/ucx-test-gpu-oss.

@svc-ucx

svc-ucx commented Sep 7, 2026

Copy link
Copy Markdown

🤖 CI Triage Agent — UCX-OSS/ucx-test-dl-gpu-oss · commit e5e428af

TL;DR: The new GB200 (gb-nvl-*) partition added by this branch is not correctly provisioned for UCX's GPU/shared-memory transports: gdr_copy pinning fails with EINVAL (ret 22), which UCX escalates to ucs_fatal and kills gtest/perftest on w1+w2, while shmat() failing with EINVAL puts w0+w3 into an endless keepalive-retry loop that hung for ~2h47m until Jenkins killed them. Fix is CI/node configuration — disable gdr_copy when gdrdrv/peermem isn't loaded and fix SysV-SHM/IPC in the srun container, not a UCX code change.

Full analysis

Summary: All four GB200 test workers failed: aarch64/build_helper_dl/w1 (#428) and w2 (#405) aborted with a UCX fatal error during CUDA memory registration; w0 (#382) and w3 (#359) hung and were aborted after ~3 h.

Root cause: Two distinct environment defects on the newly added gb-nvl-* nodes.

  1. gdr_copy is present and selected (md[12]=gdr_copy) but cannot pin GPU memory:
    gdr_copy_md.c:211 UCX ERROR GPU memory pin failed. length 65536 ret 22 pin_flags 0 (ret 22 = EINVAL, default pin flags, so the pin_pcie_fallback retry path is not applicable). Registration failure propagates to ucp_mem_type_pack, which calls ucs_fatal("failed to register buffer with mem type domain cuda") — hence the core dump in shm_ib/test_ucp_am_nbx_rndv_memtype.rndv/12 <cuda-async/host> (IB/BUILD: Disable accel verbs if cannot use a shared BF. #428) and Failed to run test: Out of memory in ucx_perftest -m cuda-async (UCT/API: Add API for adding progress callback to a worker. #405). Notably the job's own probe lsmod | grep -q 'nv.*_peer.*mem' returned false (gdr_options='n'), i.e. the GPUDirect kernel module is not loaded on these nodes, yet the gdr_copy MD is still enabled.

  2. SysV shared memory is unusable in the srun/container environment:
    mm_sysv.c:61 UCX ERROR shmat(shmid=1376256) failed: Invalid argument followed by ucp_worker.c:3632 DIAG worker ...: keepalive failed ...: Shared memory error, repeating exactly once per second from 10:41:11 to 10:45:18. After that line there is no output at all until 13:32:11 "Sending interrupt signal" — a ~2 h 47 min silence gap covering essentially the whole runtime. This is a hang (the worker spins on keepalive against an unattachable shm segment and never completes), not a slow test; the timeout/abort is the symptom.

Corroborating node misconfiguration in the same logs: mlx5dv_devx_alloc_uar(device=mlx5_6) failed: Cannot allocate memory. Consider increasing PF_LOG_BAR_SIZE, thousands of ibv_create_cq(cqe=256) failed: Invalid argument on mlx5_6, and common.sh: line 320: ip: command not found (missing iproute2 in the image, so get_active_ip_ifaces returns empty).

Implicated commit: [REDACTED:Hex High Entropy String] (branch ci-dl-gb200-partition, PR #11885) — the change that enables this GB200 partition. No product-code regression: src/uct/cuda/gdr_copy/gdr_copy_md.c was last touched by a47066b (Raul Akhmetshin, 2026-08-14) and 12e47d4 (Thomas Vegas), neither of which is on the failure path taken here.

File: src/uct/cuda/gdr_copy/gdr_copy_md.c:210 (pin failure), src/ucp/dt/dt.c:118 (fatal escalation), src/uct/sm/mm/sysv/mm_sysv.c:61 (shmat EINVAL), buildlib/tools/common.sh:320 (ip not found)

Suggested fix:

  1. On the GB200 nodes/image: load gdrdrv/nvidia_peermem, or — preferably for CI — reuse the existing lsmod | grep 'nv.*_peer.*mem' result to actually exclude the transport when the module is absent (e.g. export UCX_TLS=^gdr_copy / build with --without-gdrcopy for this partition) so a missing kernel module can't turn into a ucs_fatal.
  2. Fix SysV SHM in the srun container (share the IPC namespace / --ipc=host, adequate /dev/shm and kernel.shm* limits) so shmat() succeeds; without this the keepalive loop will keep hanging the job for the full wall clock.
  3. Raise PF_LOG_BAR_SIZE (mlxconfig, requires reboot) on mlx5_6 so UAR/CQ allocation stops failing under the 144-thread test_init_mt runs.
  4. Add iproute2 to the dl-base aarch64 image so get_active_ip_ifaces works.
  5. Optional hardening (separate PR): make ucp_mem_type_pack return an error instead of ucs_fatal on registration failure, so an unusable MD degrades gracefully rather than core-dumping the whole gtest shard.

Related: PR #11885 (this branch). No existing issue found for GPU memory pin failed ... ret 22 on GB200 — worth opening one to track the gdr_copy-on-GB200 gating.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 1a5fc595-4210-4d88-baa9-7a79b5df1bce in the triage console for the audit trail.

@ofirfarjun7
ofirfarjun7 merged commit d5b6b27 into openucx:master Sep 10, 2026
169 of 171 checks passed
@svc-ucx

svc-ucx commented Sep 10, 2026

Copy link
Copy Markdown

🤖 CI Triage Agent — UCX-OSS/ucx-test-gpu-oss · commit e5e428af

TL;DR: Build #19 never ran any tests — it was a Replay of build #18 and therefore tried to check out the stale commit [REDACTED:Hex High Entropy String]..., which no longer exists in any ref of openucx/ucx after PR #11885's branch was force-pushed (head is now e5e428af), so the shallow clone failed with "Couldn't find any revision to build". Re-trigger a fresh build against the current PR head instead of replaying.

Full analysis

Summary: The "Checkout source code" stage failed 6 times in a row with ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job. and then ERROR: Maximum checkout retry attempts reached, aborting.

Root cause: Not a UCX code or test failure — a SCM/job-configuration issue:

  • The whole-build log starts with Started by user Alexey Rivkin / Replayed #18, so the build inherited build UCS/UCT: Fix issues found by coverity. #18's pinned revision.
  • The checkout repeatedly does git rev-parse [REDACTED:Hex High Entropy String]^{commit} and origin/f9796adf...^{commit}, i.e. Jenkins is trying to resolve a hard-coded SHA [REDACTED:Hex High Entropy String]....
  • The trigger context for this build, however, is commit [REDACTED:Hex High Entropy String] on ci-dl-gb200-partition (PR CI: Run the DL cluster job on the GB200 partition #11885). Git history confirms e5e428af "CI/DL: Move the DL cluster job to GB200 and shard it" (Alexey Rivkin) is the current head of that branch.
  • The clone is git fetch --tags --force --progress --depth=100 -- https://github.com/openucx/ucx.git +refs/heads/*:... +refs/pull/*:... — a shallow fetch limited to branch tips and PR refs. After the PR branch was amended/force-pushed, refs/pull/11885/head advanced to e5e428af and the old SHA f9796adf is no longer reachable from any fetched ref (and a shallow fetch cannot pull an unreferenced object), so no revision could be resolved. The retry loop cannot help because the object is permanently unreachable.

Implicated commit: No code commit is at fault. The branch update that orphaned the replayed SHA is e5e428af (Alexey Rivkin, "CI/DL: Move the DL cluster job to GB200 and shard it"); the failing build itself is a replay of #18 pinned to the now-dead [REDACTED:Hex High Entropy String]....

File: Jenkins job SCM configuration for UCX-OSS/ucx-test-gpu-oss (checkout step in the shared library ci-demo@master, rev 47ab7dc9) — no file in the ucx repo; the log evidence is the Checkout source code stage (node 13).

Suggested fix:

  1. Immediate: do not use "Replay" for this job after a force-push. Start a new build (or re-trigger the PR check) so the checkout resolves the current head e5e428af / refs/pull/11885/head.
  2. Job-config hardening, pick one:
    • Have the pipeline check out by ref name (refs/pull/${PR}/head or refs/pull/${PR}/merge) rather than pinning a raw SHA, so a rebased PR still resolves.
    • If SHA pinning is required, remove --depth=100 (or set honorRefspec + noTags with a full fetch) so an object not at a ref tip can still be fetched; a shallow fetch can never retrieve an orphaned commit.
    • Add a pre-flight git ls-remote origin refs/pull/${PR}/head comparison and fail fast with a clear "revision superseded by force-push, re-trigger the build" message instead of six identical 30-second retries (189 s of wasted stage time).

Related: PR #11885 "CI: Run the DL cluster job on the GB200 partition" (#11885); predecessor build #18 of UCX-OSS/ucx-test-gpu-oss.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id d014136f-ee00-4c1c-b0b5-a5df5f19f652 in the triage console for the audit trail.

@svc-ucx

svc-ucx commented Sep 10, 2026

Copy link
Copy Markdown

🤖 CI Triage Agent — UCX-OSS/ucx-test-dl-gpu-oss · commit e5e428af

TL;DR: Build #29 never ran any tests — it was a Replay of build #28 and therefore tried to check out the pinned SHA [REDACTED:Hex High Entropy String], which no longer exists on any ref in openucx/ucx (PR #11885's branch ci-dl-gb200-partition was force-pushed to e5e428af), so the shallow depth=100 fetch of refs/heads/* + refs/pull/* couldn't resolve it. Fix: trigger a fresh build against the current PR head instead of replaying, and/or make the checkout fetch the target SHA explicitly (full/unshallow clone + refspec) so orphaned/rebased commits don't kill the job.

Full analysis

Summary: The "Checkout source code" stage failed all 6 retry attempts with ERROR: Couldn't find any revision to build, aborting the pipeline after ~183 s; no build or test stage ever executed.

Root cause: Pure SCM/checkout problem, not a UCX code or test failure. The console log shows Started by user Alexey Rivkin / Replayed #28, so the run inherited build #28's pinned revision [REDACTED:Hex High Entropy String]. The checkout does:

  • git fetch --depth=100 +refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin/pr/*
  • then git rev-parse f9796adf...^{commit} and git rev-parse origin/f9796adf...^{commit}, both of which fail.

The trigger commit for this event is e5e428af ("CI/DL: Move the DL cluster job to GB200 and shard it", Alexey Rivkin, PR #11885), i.e. the PR branch head moved. f9796adf was the pre-force-push head; it is no longer reachable from any branch, tag, or refs/pull/* ref, and a shallow (--depth=100) refspec-based fetch cannot retrieve a dangling commit by SHA. Hence "Couldn't find any revision to build" repeats identically on every retry — the retry loop can never succeed because the input revision is unresolvable, making the 6 retries pure wasted wall time.

Two aggravating configuration details visible in the log:

  1. Using shallow clone with depth 100 — even a still-referenced SHA older than 100 commits from a tip would fail.
  2. No credentials specified / The 'Wipe out repository & force clone' extension is deprecated for Pipeline jobs — the job re-clones the whole repo from scratch on every attempt, so there is no local object cache that could have held f9796adf.

Implicated commit: No faulty code commit. The precipitating event is the force-push of PR #11885 (ci-dl-gb200-partition) to e5e428af — Alexey Rivkin — which orphaned the replayed revision [REDACTED:Hex High Entropy String]. Latest related repo commit: e5e428af "CI/DL: Move the DL cluster job to GB200 and shard it" (.ci/).

File: Jenkins job SCM configuration for UCX-OSS/ucx-test-dl-gpu-oss (checkout step in the ci-demo@master shared library, rev 47ab7dc9); no in-repo file is at fault — .ci/job_matrix/test_dl_matrix.yaml was not reachable/present at this revision.

Suggested fix:

  1. Immediate: don't use Replay after a force-push. Start a fresh build of PR CI: Run the DL cluster job on the GB200 partition #11885 so it resolves the current head e5e428af (or refs/pull/11885/head).
  2. Make the checkout robust so a rebased PR can't produce this dead-end:
    • Reference the PR ref (refs/pull/${PR}/head) or ${GIT_COMMIT} resolved at trigger time, rather than a SHA baked into a replayable build.
    • Add an explicit refspec for the target commit, e.g. +${sha}:refs/remotes/origin/build-${sha}, and enable Advanced clone behaviours → Honor refspec on initial clone.
    • Increase or drop the shallow depth (depth=100 → full clone, or git fetch --unshallow before rev-parse) so SHAs deeper than 100 commits still resolve.
  3. Fail fast: Couldn't find any revision to build is deterministic — treat it as non-retryable in the checkout retry wrapper instead of burning 6 clone attempts (~3 min) on it.
  4. Replace the deprecated Wipe out repository & force clone extension with deleteDir() per the log's own warning, which also lets Jenkins keep a reusable local object store.

Related: PR #11885 "CI: Run the DL cluster job on the GB200 partition" (#11885) — the PR under test; build #28 is the replayed parent build. No existing issue found for this checkout signature.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 076ce204-44c6-4c4f-995a-b7cec725257f in the triage console for the audit trail.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants