Skip to content

nixlbench: limit Neuron core allocation in SG mode for multi-processing - #1913

Merged
aranadive merged 3 commits into
ai-dynamo:mainfrom
fengjica:dev/fix_nrt_core_alloc
Jul 29, 2026
Merged

aranadive merged 3 commits into
ai-dynamo:mainfrom
fengjica:dev/fix_nrt_core_alloc

Conversation

@fengjica

@fengjica fengjica commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

On Neuron instances, nrt_init() claims all visible Neuron cores by default. When testing multiple nixlbench processes in SG pairwise mode (one process per device), each process tries to claim all cores, causing "Logical Neuron Core(s) not available" failures for all but the first process.

Set NEURON_RT_NUM_CORES=1 before nrt_init() in SG mode so each process only reserves one core.

MG mode is unaffected (single process per host, claims all cores).

What?

Fix nixlbench multiprocessing with neruon runtime.

Why?

Without the fix, nixlbench multiprocessing (SG mode) would fail.

How?

Set NEURON_RT_NUM_CORES = 1, before nrt_init().
Tested with trn2.48xlarge instance.

Summary by CodeRabbit

  • Bug Fixes
    • Improved Neuron runtime initialization in SG mode by automatically setting the core count when core-related environment variables aren’t provided.
    • Corrected device memory allocation to use the appropriate accelerator/VNC index for SG vs non-SG execution, improving consistency for single-GPU/SG runs.

@fengjica
fengjica requested review from a team, aranadive, brminich and ovidiusm as code owners July 8, 2026 19:45
@copy-pr-bot

copy-pr-bot Bot commented Jul 8, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

👋 Hi fengjica! Thank you for contributing to ai-dynamo/nixl.

Your PR reviewers will review your contribution then trigger the CI to test your changes.

🚀

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This change updates benchmark/nixlbench/src/utils/neuron.cpp to configure Neuron core usage in SG mode and select the tensor allocation VNC index from the execution mode.

Changes

Neuron core allocation changes

Layer / File(s) Summary
Core scoping and VNC index selection
benchmark/nixlbench/src/utils/neuron.cpp
Adds utils.h and <cstdlib> includes; neuronCoreCount() conditionally sets NEURON_RT_NUM_CORES to "1" in SG mode when unset and logs configured environment values otherwise; neuronMalloc() passes VNC index 0 in SG mode or devid otherwise to nrt_tensor_allocate.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: brminich

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the Neuron SG-mode core-allocation fix for nixlbench multiprocessing.
Description check ✅ Passed The description follows the template with What/Why/How and explains the SG-mode Neuron fix and testing.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@fengjica
fengjica force-pushed the dev/fix_nrt_core_alloc branch from c42c358 to 74a44d8 Compare July 8, 2026 20:39
@ovidiusm

ovidiusm commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

/build

@svc-nixl

svc-nixl commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

👀 Investigating nixl-ci-dl-gpu-ep build 208

@svc-nixl

svc-nixl commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit fca97360

I have clear evidence now. The build stages succeeded; the failing stages (183 and 200 - "Allocate DL EP Environment") failed at Slurm resource allocation. Let me confirm the timing to distinguish hang vs. genuine wait.

Looking at the log for stage 200:

  • 10:28:10.064Zssh ... salloc ... --immediate=3600 --time=01:30:00
  • 11:28:18.783Zsalloc: error: Unable to allocate resources: Connection timed out

That's exactly ~1 hour (3600s) between the salloc invocation and the timeout error. The --immediate=3600 flag tells Slurm to wait up to 3600 seconds for resources before giving up. The job was queued and waiting for resources the entire time, then failed with Unable to allocate resources: Connection timed out.

This is not a hang in nixl code, and not a code defect at all. The build of NIXL + UCX + nixlbench all completed successfully (stages 159, 162 succeeded). Both allocation attempts (v1.22.x → job 1507450, and master → job 1507420) sat in the Slurm queue for the full immediate-timeout window on partition gb200nvl72_cx8 and were never granted GB200 nodes.

The earlier stage failures (124/125 build_helper_dl_ep/.../ucx-*) were retried and succeeded (stages 142/149), so they are not the root cause of the overall build failure.

Summary: The nixl-ci-dl-gpu-ep #208 build failed in the "Allocate DL EP Environment" stages (node IDs 183 and 200) — the Slurm salloc for GB200 nodes never got resources and timed out after the 1-hour immediate window.

Root cause: Infrastructure/capacity, not a code defect. Both allocation attempts ran salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 --no-shell --account=blackwell against dlcluster.nvidia.com. The jobs (1507450 for ucx-v1.22.x, 1507420 for master) were queued and waiting for resources and after exactly ~3600s failed with salloc: error: Unable to allocate resources: Connection timed out. The GB200 gb200nvl72_cx8 partition had no free nodes within the immediate-allocation window. All actual NIXL/UCX/nixlbench compilation and Docker image build/push steps succeeded beforehand. This is a legitimate wait that hit its configured cap (the process was making no progress only because the cluster was full — not because any nixl process hung), so this is a capacity/queue-time limit, not a hung application.

Implicated commit: unknown — not code-related. The build for commit [REDACTED:Hex High Entropy String] compiled cleanly; failure is in cluster resource allocation.

File: The Jenkins pipeline SLURM allocation step (swx-jenkins-lib slurm.allocation, invoked as "Allocate DL EP Environment"). No repository source file is implicated.

Suggested fix:

  • Re-run the job — this is a transient cluster-capacity failure on the gb200nvl72_cx8 partition (GB200 nodes were saturated for the full hour).
  • If GB200 queue contention is recurrent, consider: raising immediateTimeout / switching from --immediate to a bounded queued wait, adding retry-with-backoff around the salloc step, or reserving/quota-guaranteeing capacity for CI on the blackwell account.
  • Do not treat this as a code bug or bump any per-test timeout — the compilation and image build all passed; only node allocation failed.

Related: none found (no code issue to correlate; failure is Slurm allocation Unable to allocate resources: Connection timed out).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 889bbed6-d005-4872-9f2a-1fdc4b55a332 in the triage console for the audit trail.

Comment thread benchmark/nixlbench/src/utils/neuron.cpp Outdated
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage AgentClang Format Check · commit 9d21ceef

TL;DR: The "Clang Format Check" failed because benchmark/nixlbench/src/utils/neuron.cpp contains a std::cerr log statement (added in this PR) whose manual line-wrapping doesn't match the repo's clang-format style; run clang-format-19 on the file and commit the result.

Full analysis

Summary: GitHub Actions clang-format job exited with code 1 — clang-format-diff-19 reported formatting violations in the PR's changes to neuron.cpp.

Root cause: The newly added std::cerr << "nixlbench: NEURON_RT_VISIBLE_CORES ..." statement in the else if (visible_cores) branch is manually split across 4 lines, but the .clang-format style collapses it to 2 lines (each within the column limit). Since the formatted output differs from the committed code, clang-format-diff-19 returns a non-empty diff and the step fails. This is a real style violation, not a hang or timeout — the whole job ran in ~16s with continuous output.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #1913, branch dev/fix_nrt_core_alloc) — the merge commit is 0b055c9.

File: benchmark/nixlbench/src/utils/neuron.cpp (the std::cerr block in the else if (visible_cores) branch, ~lines 155–160 in the PR diff)

Suggested fix: Reformat the file locally and commit the result:

clang-format-19 -i -style=file benchmark/nixlbench/src/utils/neuron.cpp

The expected result matches what CI proposed:

std::cerr << "nixlbench: NEURON_RT_VISIBLE_CORES is set to \"" << visible_cores
          << "\" but SG mode uses only the first core (vnc=0)" << std::endl;

Then git add + commit + push to re-trigger the check.

Related: none

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 73560885-f090-4ae6-987c-e27c22333c01 in the triage console for the audit trail.

@fengjica
fengjica force-pushed the dev/fix_nrt_core_alloc branch from 48faf8b to b618855 Compare July 15, 2026 21:06

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@benchmark/nixlbench/src/utils/neuron.cpp`:
- Around line 160-163: Run clang-format-19 in place on the file containing the
NEURON_RT_VISIBLE_CORES warning, ensuring the stream expression in the neuron
utility is reformatted to the repository’s expected layout. Commit the resulting
formatting-only change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3f2b97d6-75de-4d70-9c42-56bc9af322b4

📥 Commits

Reviewing files that changed from the base of the PR and between 74a44d8 and 48faf8b.

📒 Files selected for processing (1)
  • benchmark/nixlbench/src/utils/neuron.cpp

Comment thread benchmark/nixlbench/src/utils/neuron.cpp Outdated

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@benchmark/nixlbench/src/utils/neuron.cpp`:
- Around line 155-158: Check the return value of setenv in the SG-mode branch
before printing the success message or proceeding to nrt_init. On failure,
report the error and abort initialization; only log that NEURON_RT_NUM_CORES was
set when setenv succeeds.
- Around line 152-165: Update the SG core-handling condition in neuron.cpp to
use IS_PAIRWISE_AND_SG() instead of checking xferBenchConfig::mode alone. Keep
the existing environment-variable setup and warning behavior unchanged, but
ensure it runs only for pairwise SG configurations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 98fba73b-3d01-4abe-9c5e-d964c60760c8

📥 Commits

Reviewing files that changed from the base of the PR and between 48faf8b and b618855.

📒 Files selected for processing (1)
  • benchmark/nixlbench/src/utils/neuron.cpp

Comment thread benchmark/nixlbench/src/utils/neuron.cpp
Comment thread benchmark/nixlbench/src/utils/neuron.cpp Outdated
@fengjica
fengjica force-pushed the dev/fix_nrt_core_alloc branch from b618855 to da85dd0 Compare July 15, 2026 21:17
@pull-request-size pull-request-size Bot added size/M and removed size/S labels Jul 15, 2026
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage AgentClang Format Check · commit da85dd09

TL;DR: The Clang Format Check failed because benchmark/nixlbench/src/utils/neuron.cpp has lines that violate the repo's clang-format-19 style; the two multi-line std::cerr statements around line 154 need to be reformatted (run clang-format-19 on the file and commit the result).

Full analysis

Summary: clang-format-diff-19 found formatting violations in benchmark/nixlbench/src/utils/neuron.cpp, causing the job to exit with code 1.

Root cause: The PR (#1913) modified neuron.cpp with std::cerr chained-<< statements that were manually wrapped across multiple lines. clang-format-19 (style=file, i.e. the repo's .clang-format) wants those << std::endl continuations collapsed onto the preceding line (they fit within the column limit). The diff shows clang-format would rewrite:

std::cerr << "nixlbench: SG mode — set NEURON_RT_NUM_CORES=1"
          << std::endl;

to a single line ending in << std::endl;, and similarly join the NEURON_RT_NUM_CORES= and (visible_cores ? ...) continuations. Because the committed formatting differs from clang-format's output, the check fails. This is a genuine lint failure — the log ran continuously through to the error with no gaps, so it is not a timeout/hang.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #1913, branch dev/fix_nrt_core_alloc) — the change that added/modified the std::cerr diagnostics in neuron.cpp.

File: benchmark/nixlbench/src/utils/neuron.cpp:154-166 (the SG-mode std::cerr diagnostics block)

Suggested fix: Run the repository's formatter locally on the changed file and commit the result:

clang-format-19 -style=file -i benchmark/nixlbench/src/utils/neuron.cpp
git add benchmark/nixlbench/src/utils/neuron.cpp && git commit --amend --no-edit

Concretely, collapse the wrapped std::cerr chains so each << std::endl; stays on the line where it fits within the configured column limit, matching the "after formatting" block shown in the log. No source logic change is needed — this is purely whitespace/line-wrapping.

Related: none found.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id f9f247e9-6475-472c-aa52-74c2fbf3d7f4 in the triage console for the audit trail.

@fengjica
fengjica force-pushed the dev/fix_nrt_core_alloc branch from da85dd0 to e7a3114 Compare July 15, 2026 21:19
@pull-request-size pull-request-size Bot added size/S and removed size/M labels Jul 15, 2026
@fengjica
fengjica force-pushed the dev/fix_nrt_core_alloc branch from e7a3114 to efd9672 Compare July 15, 2026 21:30
@pull-request-size pull-request-size Bot added size/M and removed size/S labels Jul 15, 2026
@fengjica
fengjica requested a review from oa-aws July 15, 2026 21:34
Comment thread benchmark/nixlbench/src/utils/neuron.cpp Outdated
@fengjica
fengjica requested a review from oa-aws July 22, 2026 05:22
@fengjica

Copy link
Copy Markdown
Collaborator Author

@oa-aws Could you look again? The diff from the last revision is in the second commit
address comment: improved warning message condition and message
Thanks!

oa-aws
oa-aws previously approved these changes Jul 27, 2026
On Neuron instances, nrt_init() claims all visible Neuron cores by
default. When testing multiple nixlbench processes in
SG pairwise mode (one per device), each process tries to claim all
cores, causing "Logical Neuron Core(s) not available" failures for all
but the first process.

Set NEURON_RT_NUM_CORES=1 before nrt_init() in SG mode so each process
only reserves one core.

MG mode is unaffected (single process per host, claims all cores).
@fengjica

Copy link
Copy Markdown
Collaborator Author

Squashed commits into one, and then rebased to head as there will be merge conflict.

@fengjica

Copy link
Copy Markdown
Collaborator Author

Hi @aranadive @brminich @ovidiusm would you mind taking a look at this PR? The delta from the last revision where @oa-aws approved is only that of rebasing to head and merge.
Thanks!

@aranadive

Copy link
Copy Markdown
Contributor

/ok to test 86a0413

@aranadive

Copy link
Copy Markdown
Contributor

/build

@aranadive
aranadive enabled auto-merge (squash) July 28, 2026 18:55
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 5be5a1b7

TL;DR: The SGLang sanity stage failed because the prefill sglang server was scheduled onto a GPU that already had most of its memory occupied (only 16.41 GB free vs. 183.44 GB on the decode GPU), so it crashed at init with RuntimeError: Not enough memory. Please try to increase --mem-fraction-static; the subsequent 300s /health timeout is just the symptom of that dead server. Fix: make the sanity test size memory off free GPU memory (or fail fast on server crash) and/or ensure the CI node's GPUs are clean before allocation.

Full analysis

Summary: Stage 580 "Run SGLang sanity" failed — the prefill sglang server OOM-crashed on startup and the health check timed out after 300s. (Stage 333's FAILURE is only parallel-branch abort propagation; the wheel build itself, stage 419, succeeded.)

Root cause: The prefill server (CUDA_VISIBLE_DEVICES=0) started with only 16.41 GB of free GPU memory (the decode server on GPU 1 saw 183.44 GB), so after loading ~15 GB of Qwen3-8B weights it had ~1.31 GB left and pool_configurator.py:56 raised RuntimeError: Not enough memory. Please try to increase --mem-fraction-static. (log at 12:55:59). SGLang computes its KV-cache budget from free memory, and --mem-fraction-static 0.3 of an already-occupied GPU is insufficient. The server was killed; wait_for http://localhost:21601/health then exhausted its 300s budget and returned exit 1. This is GPU-memory contention on the shared GB200 SLURM node, not a NIXL/wheel regression.

Implicated commit: unknown — no code regression; environmental. Recent touches to .gitlab/test_vllm_sglang_sanity.sh ([REDACTED:Hex High Entropy String] router ports, fca3d58 HF auth) are unrelated to memory sizing.

File: .gitlab/test_vllm_sglang_sanity.sh:147-162 (server launch with fixed GPU_MEM_FRACTION=0.3, line 47) — crash surfaces in sglang's pool_configurator.py:56.

Suggested fix: Two-part: (1) Make the launch robust to a dirty GPU — before allocating, assert the target GPUs are near-idle (e.g. nvidia-smi --query-gpu=memory.used) and fail fast/re-queue if GPU 0 is occupied, or raise GPU_MEM_FRACTION / pass an absolute KV budget so 0.3 of a partially-used GB200 still fits the 8B model. (2) Make wait_for detect a dead server (poll the launched PID / catch the scheduler crash) instead of silently burning the full 300s, so the real OOM error is reported immediately. The immediate operational remedy is to ensure the SLURM node's GPUs are clean (no leftover processes holding memory) before the sanity job runs — do not simply raise the 300s timeout, since the server is dead, not slow.

Related: PRs #1995 (router port fix) and #1777 (added this sanity test); none address the memory-contention failure mode.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id ddbba759-09fe-405a-bfe8-c08df5e84a94 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 5be5a1b7

TL;DR: The "Allocate DL EP Environment" stage failed because the Slurm salloc on the gb200nvl72_cx8 partition sat queued for the full 1-hour --immediate=3600 window and then errored with "Unable to allocate resources: Connection timed out" — an infrastructure/cluster-capacity issue, not a code or PR defect. Retry the job when GPU nodes are available (or raise the immediate timeout / pick a less contended partition).

Full analysis

Summary: GPU environment allocation on the dlcluster Slurm gb200nvl72_cx8 partition timed out; the NIXL/UCX build itself completed successfully and the test image was built and pushed.

Root cause: salloc -N1 -p gb200nvl72_cx8 --immediate=3600 was issued at 19:25:40 and remained "queued and waiting for resources" until 20:25:49 (exactly the 1-hour immediate window), then returned salloc: error: Unable to allocate resources: Connection timed out. No GB200 node became free within the immediate window — a cluster-capacity/queue-contention condition external to the PR. The gap in the log (19:25 → 20:25) is Slurm legitimately waiting in queue, not a hung application step, and the build stages preceding it (image compile, push) all succeeded.

Implicated commit: unknown (not a code regression; commit 5be5a1b builds cleanly through image push)

File: N/A — failure is in the Jenkins Slurm allocation step (slurm.allocation / swx-jenkins-lib), not repository source

Suggested fix: Re-run build #519 once gb200nvl72_cx8 GPU nodes are available — this is a transient resource-allocation failure. If GB200 contention is chronic, consider (a) increasing immediateTimeout beyond 3600s so the job can wait longer in queue, (b) making the allocation retry with backoff, or (c) targeting a less-contended partition. No source change is warranted. Verify with the cluster team that salloc connectivity to dlcluster.nvidia.com is healthy (the message was "Connection timed out" against the scheduler after the immediate window elapsed).

Related: none

@aranadive

Copy link
Copy Markdown
Contributor

/ok to test 8d1c007

@aranadive

Copy link
Copy Markdown
Contributor

/build

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 2600e992

TL;DR: The vLLM sanity stage failed because both vLLM engine cores aborted at startup with ValueError: Free memory on device cuda:0 (11.96/184.3 GiB) ... less than desired GPU memory utilization (0.3, 55.29 GiB) — the assigned GB200 GPUs were already ~93% occupied by another process on the shared SLURM node. This is GPU resource contention, not a code defect; retry on a clean node (or have the test detect/skip busy GPUs).

Full analysis

Summary: Stage "Run vLLM sanity" (#559) failed — vLLM prefill and decode engine cores could not initialize because insufficient free GPU memory was available; the build_helper_vllm stage (#332) is only the pipeline-stop marker for the same failure chain.

Root cause: On the shared GB200 node gb200-nvl4-ts2-105, only ~12 GiB of the 184.3 GiB was free on cuda:0/cuda:1 at startup. Each vLLM server requests --gpu-memory-utilization 0.3 (~55.29 GiB), so request_memory() in vllm/v1/worker/utils.py:415 raised ValueError, both EngineCore processes exited, the API servers failed with RuntimeError: Engine core initialization failed, and the health check then timed out after 300s (timeout (300s) waiting for http://localhost:20401/health). The ~172 GiB was held by another tenant/leftover process on the node — an environment issue, not a NIXL/PR code bug. The SGLang sanity on a different node passed.

Implicated commit: unknown — not a code regression; infrastructure/resource contention.

File: .gitlab/test_vllm_sglang_sanity.sh:118-127 (GPU allocation); error surfaced at vllm/v1/worker/utils.py:415 inside the vLLM wheel.

Suggested fix: Re-run the build; the allocation should land on a clean node. To harden against recurrence: (1) before launching the servers, assert each target GPU is mostly free (e.g. nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits and fail fast/re-request the SLURM node if free < required); and/or (2) request GPUs with --gres in a way that guarantees exclusive access, and ensure prior jobs' engine subprocesses are reaped (the existing setsid/kill -TERM -- -$p cleanup only covers this job's own PIDs, not stragglers from other jobs sharing the node).

Related: none found.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 2600e992

TL;DR: The nixl-ci-dl-gpu-ep (ucx-v1.22.x variant) build compiled fine but failed in the "Allocate DL EP Environment" stage because the Slurm salloc on gb200nvl72_cx8 waited its full 1-hour --immediate=3600 window and never got a node ("Unable to allocate resources: Connection timed out"). This is a cluster capacity/infra failure, not a code defect — retry when GB200 nodes are available.

Full analysis

Summary: Stage 200 "Allocate DL EP Environment" failed: Slurm could not allocate a GB200 node within the immediate-wait window.

Root cause: salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 was submitted at 00:00:15; the job was queued ("job 1686355 queued and waiting for resources") and after the full 3600s immediate window elapsed (next log line at 01:00:38) it returned salloc: error: Unable to allocate resources: Connection timed out. The GB200 partition had no free node during the wait window. The 1-hour gap in the log is the intended --immediate wait, not an application hang — and the parallel master-UCX variant (stage 183) allocated successfully, confirming this is resource contention on the cluster rather than anything introduced by PR #1913.

Implicated commit: none — not caused by commit [REDACTED:Hex High Entropy String]; this is a cluster/infrastructure resource-allocation failure.

File: N/A (Jenkins pipeline Slurm allocation step, partition gb200nvl72_cx8); Slurm job 1686355.

Suggested fix: Re-run the build once GB200 (gb200nvl72_cx8) capacity is available. If this recurs, either (a) raise/adjust the --immediate wait or add automatic retry/backoff around the slurm.allocation step so transient contention doesn't fail the whole pipeline, or (b) check partition health/reservations and account (--account=blackwell) quota with the cluster admins. No source-code change is warranted.

Related: none found.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 4ad39edc-d99b-4808-bb0d-1f013517cfb2 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 2600e992

TL;DR: The "Run Nixlbench tests" stage hung for ~22 minutes after the last UCCL ASIO transfer test ("Engine destroyed" at 00:29:41) until Jenkins killed it with SIGTERM (exit 143); this is the known UCCL nixlbench hang (issue #1999), and the fix is to skip the UCCL nixlbench tests (as PR #2000 began, but the ASIO UCCL block must also be disabled).

Full analysis

Summary: nixl-ci-gpu build #2974 was aborted (exit code 143) because the Nixlbench test stage hung — no log output between 00:29:41 and the 00:51:57 SIGTERM.

Root cause: A hang (not a timeout) in the UCCL backend during/after the ASIO transfer tests. The largest inter-line gap is ~22 minutes of total silence immediately after the final UCCL ASIO test (--backend UCCL --op_type WRITE --initiator_seg_type DRAM --target_seg_type DRAM) printed its result and "Engine destroyed" (with a trailing Error/HUP on connection warning from rdma/epoll_client.h:207). This matches the known, still-open issue #1999 "UCCL nixlbench test hangs." The build ran commit 2600e992 which predates/omits the workaround merged as PR #2000, and critically the still-active UCCL ASIO loop at test_nixlbench.sh:95-103 was never disabled — only the ETCD UCCL loop was commented out.

Implicated commit: Test harness ordering/skip issue rather than a single regression; workaround commit 7a244b980b47 (ovidiusm, "CI: Skip UCCL nixlbench tests (#2000)") addressed only the ETCD UCCL block. Underlying UCCL defect tracked in issue #1999.

File: .gitlab/test_nixlbench.sh:95-103 (active UCCL ASIO test loop) — hang manifests in UCCL engine teardown (rdma/epoll_client.h:207).

Suggested fix: Also skip/guard the UCCL ASIO nixlbench loop at lines 95-103 (mirror the commented-out ETCD block at 122-132, referencing issue #1999) until the UCCL hang is fixed. Re-run PR #1913 on top of the branch that includes #2000. As a defensive measure, wrap each run_nixlbench_two_workers_asio invocation with a per-test timeout so a single hung UCCL process fails fast instead of consuming the entire stage wall-clock. Do NOT raise the stage time limit — the process was hung, not slow.

Related: Issue #1999 (UCCL nixlbench test hangs), PR #2000 (CI: Skip UCCL nixlbench tests), PR #1724 (UCCL crash fix + GDB trap).

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 2600e992

TL;DR: The "Run Nixlbench tests" stage crashed with exit code 139 (SIGSEGV) in the UCCL backend's engine teardown during the ASIO UCCL WRITE VRAM→VRAM benchmark; this is the known-flaky UCCL nixlbench failure (issue #1999). Fix: also disable/skip the ASIO-based UCCL nixlbench transfers, just as the ETCD-based ones were already commented out.

Full analysis

Summary: nixlbench --backend UCCL --op_type WRITE --initiator_seg_type VRAM --target_seg_type VRAM under the ASIO runtime segfaulted (srun exit code 139), failing the Nixlbench pipeline stage.

Root cause: A SIGSEGV in the UCCL backend. The benchmark printed its full results row (0.038554 GB/Sec) and both processes logged "Destroying Engine…" / "Engine destroyed", then the process crashed with signal 11 during/after UCCL engine teardown — not a hang and not a timeout (the log shows continuous activity right up to the crash). This is the known-unstable UCCL nixlbench path tracked in issue #1999. Notably, the ETCD-based UCCL nixlbench block in test_nixlbench.sh was already commented out "to reduce CI flakiness" (lines 122-132), but the equivalent ASIO-runtime UCCL block (lines 95-103) was left enabled, so the flaky UCCL transfer still runs and crashed here. (Stage 125's FAILURE is just the pipeline "stop on build_helper" gating mechanism, not an independent failure.)

Implicated commit: UCCL backend by Pravein Govindan Kannan — most recently [REDACTED:Hex High Entropy String] "Enable local xfer for UCCL backend (#1428)" and [REDACTED:Hex High Entropy String] "UCCL: Simplify and Optimize for batch transfers (#1271)"; instability tracked under issue #1999.

File: .gitlab/test_nixlbench.sh:95-103 (enabled ASIO UCCL loop) vs. .gitlab/test_nixlbench.sh:122-132 (already-disabled ETCD UCCL loop); crash originates in the UCCL plugin under src/plugins/uccl.

Suggested fix: Skip/comment out the ASIO-runtime UCCL nixlbench loop (lines 95-103) the same way the ETCD UCCL loop (lines 122-132) was disabled, referencing issue #1999, until the UCCL segfault-on-teardown is root-caused. Longer term, investigate the UCCL engine destructor for a double-free/use-after-free (the crash happens right after "Engine destroyed") and enable core-dump analysis per docs/DebugCoreDumps.md (the run already sets ulimit -c unlimited).

Related: Issue #1999 "UCCL nixlbench test hangs" (#1999); PRs #1428, #1271, #1151, #895 touching the UCCL backend.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 7fbbeb55-f5fd-4581-ad4f-e6258af30ae6 in the triage console for the audit trail.

@aranadive
aranadive merged commit 9e5a72c into ai-dynamo:main Jul 29, 2026
19 checks passed
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.

6 participants