Skip to content

Add multi-GPU training smoke tests with cross-socket xfail - #6946

Draft
hujc7 wants to merge 3 commits into
isaac-sim:developfrom
hujc7:jichuanh/mgpu-camera-smoke-xfail
Draft

Add multi-GPU training smoke tests with cross-socket xfail#6946
hujc7 wants to merge 3 commits into
isaac-sim:developfrom
hujc7:jichuanh/mgpu-camera-smoke-xfail

Conversation

@hujc7

@hujc7 hujc7 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Why

The multi-GPU workflow parametrizes each test over one device per shard, which cannot express a job that owns two GPUs at once. Nothing in CI exercised multi-GPU rendering, and NVBUG#6565122 — a heap corruption in Kit's Isaac Sim RTX renderer that only fires when the two GPUs span a cross-socket boundary — shipped uncaught.

What

Smoke tests that launch real two-rank training runs and choose their GPU pair by interconnect class, parsed from nvidia-smi topo -m. On a two-socket 8-GPU host the default cuda:0,cuda:1 is a same-switch pair, so a fixed pick would never exercise the failing path.

Case Runs when Verdict
physics-only ≥2 visible CUDA devices strict — never vacuous
camera × 3 stacks, same-switch host has a PIX/NVL pair strict — the regression guard
camera × 3 stacks, cross-socket host has a SYS pair xfail for the two Kit-renderer stacks; strict for kitless newton_mjwarp,ovrtx

The unmeasured classes (PXB, PHB, NODE) skip with a reason rather than assert either verdict — every measurement behind this is at the two extremes.

Design notes

  • The kitless stack stays strict cross-socket. It passes today; if it ever fails, the conclusion that the fault is the Isaac Sim RTX renderer is wrong.
  • The xfail is applied only after the documented signature is confirmed (cudainterop + exit 139), so an OOM or an argument error on a cross-socket pair is not recorded as the known crash.
  • A pass requires Training time: in the output, not just exit 0 — an OOM exits 0 through the launcher.
  • Silence is the hang signal: 90 s without output kills the run, 600 s hard backstop. The child runs in its own process group and is killed with killpg, since killing only the wrapper leaves rank workers holding GPU memory.
  • gpu_pairs_by_topology() fails closed — missing nvidia-smi, non-zero exit, unparsable or truncated matrix, a row outside the header, or a MIG host all yield "skip", never "no boundary present".

Testing

  • test_gpu_topology.py — 11 unit tests, fixtures are verbatim output from three real hosts (2-socket 4v4, 1v3 with a NIC column, single-socket PHB/NODE, NVLink). Runs anywhere, including single-GPU CI.
  • Reviewed with codex; 8 findings applied, including a missing --entrypoint bash that would have made the CI step run zero tests while reporting green.

⚠️ The smoke tests themselves have not been executed on real GPUs yet — this PR is opened partly so CI runs them. Expect ~35 min on a full two-socket runner (Kit boot dominates at ~4 min per case).

hujc7 added 2 commits August 6, 2026 10:58
The multi-GPU workflow parametrizes each test over one device per shard,
which cannot express a job that owns two GPUs at once. Nothing in CI
therefore exercised multi-GPU rendering, and NVBUG#6565122 -- a heap
corruption in Kit's Isaac Sim RTX renderer that only fires when the two
GPUs span a cross-socket boundary -- shipped uncaught.

Add smoke tests that launch real two-rank training runs and choose their
GPU pair by interconnect class rather than taking whatever cuda:0,cuda:1
happens to be. On a two-socket 8-GPU host the default pick is a
same-switch pair, so a fixed choice would never exercise the failing
path.

Each class is handled on its own terms: same-switch is strict and is the
regression guard, cross-socket is expected-fail for the two Kit-renderer
stacks and strict for the kitless newton_mjwarp,ovrtx stack, and the
unmeasured PXB/PHB/NODE classes skip rather than assert either verdict.
A physics-only case runs on any two visible devices so the step is never
vacuous when every camera case skips.

The expected-failure marker is applied only after the documented
signature is confirmed, so an OOM or an argument error on a cross-socket
pair is not recorded as the known crash.
@github-actions github-actions Bot added isaac-lab Related to Isaac Lab team infrastructure labels Aug 6, 2026
The smoke step ran docker with no volume mount, so `cd /workspace/isaaclab`
landed in the image's baked-in copy rather than the PR checkout. pytest
collected 0 items and the step failed with 'file or directory not found'.

Mount $PWD and run as the host user, matching what
multi_gpu_host_launcher.sh already does for the sharded runs. Without
--user the container writes root-owned files into the runner workspace.

Also surface a ::warning:: when the runner's GPU topology cannot exercise
a case, so a run that skips the NVBUG#6565122 coverage does not read as a
normal green run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

infrastructure isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant