Skip to content

[Backport release/3.0.0] [CI] Restore ARM CI on the expanded DGX Spark pool (#8229) - #8242

Merged
kellyguo11 merged 1 commit into
release/3.0.0from
codex/backport-8229-release-3.0.0
Oct 1, 2026
Merged

kellyguo11 merged 1 commit into
release/3.0.0from
codex/backport-8229-release-3.0.0

Conversation

@kellyguo11

Copy link
Copy Markdown
Contributor

Description

Backports #8229 onto release/3.0.0.

This restores ARM CI on the expanded DGX Spark pool by pinning the multi-architecture Isaac Sim image manifest, reporting ARM CI failures as failed workflow runs, skipping the known-failing ovstage ARM rendering cases, and preloading the system libgomp.so.1 path for aarch64 CLI launches.

This is an exact, conflict-free cherry-pick of the merged source change. The original regression test and isaaclab changelog fragment are included unchanged.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Release backport

Release backport

  • Not applicable: this PR targets release/3.0.0 directly.

Screenshots

Not applicable.

Validation

  • Exact-patch validation passed: the source and backport patch IDs both resolve to ac7312366230803ebddd56fc65e0a5d3e96e5e62.
  • Focused CLI regression test passed: 1 passed.
  • Release-aware changelog validation passed against the current upstream release/3.0.0 tip.
  • All repository pre-commit hooks passed over the backport range.
  • ARM image and workflow behavior were validated on DGX Spark in [CI] Restore ARM CI on the expanded DGX Spark pool #8229 (arm64 image build, ARM Build & Test).
  • The project-managed uv run isaaclab -f entry point is unavailable on this macOS ARM64 host because the lockfile supports Linux and Windows only; the equivalent direct pre-commit run passed.

Checklist

  • I have read and understood the contribution guidelines.
  • I have run the applicable formatting and lint checks.
  • Documentation changes are not required for this CI/runtime fix.
  • My changes generate no new warnings.
  • I have validated the changed behavior with focused coverage and applied the test-audit criteria.
  • I have included the required isaaclab changelog fragment.
  • The original contributor is already listed in CONTRIBUTORS.md.

Original PR: #8229
Cherry-picked merge commit: 1341561896f4f9b650c1f837547d4eb544c2d780
Backport commit: 6d062631084ce8e681cd023ea187f295248156b9

## Review Map

- A stacked PR's page shows the cumulative diff of its dependency chain;
the **Exact changes** link pins that PR's own commit range.
- SHA links can go stale after a branch update; #8229's copy is
refreshed first.

| PR | Status | Depends on | Exact changes |
|---|---|---|---|
| 📌 #8229 Restore ARM CI build on the DGX Spark pool (1/2) (draft) |
![](https://img.shields.io/github/pulls/detail/state/isaac-sim/IsaacLab/8229?label=)
| — | — |
| #8230 Re-enable two disabled ARM tests (2/2) (draft) |
![](https://img.shields.io/github/pulls/detail/state/isaac-sim/IsaacLab/8230?label=)
| #8229 |
https://github.com/isaac-sim/IsaacLab/pull/8230/changes/6e8879060e9b10e7bface139676524da3139cfab..6c5c43d1353009723b884ba09e08780c95a1362b
|

## Summary
- ARM CI builds again: the Isaac Sim CI pin goes back to the multi-arch
manifest list, so the arm64 base pull stops receiving an amd64 image.
- A failing ARM CI now shows red instead of green, and the two
pre-existing ARM failures it exposed are fixed; it stays non-required,
so it does not block merges.

# Description

## 1. Changes
1. `.github/workflows/config.yaml`: pin
`latest-develop@sha256:e78f716a1cae…`, the manifest list of the same
6.2.0-alpha.12 build. #8097 pinned its x86_64 child `a6c53e29d6f1`, so
every arm64 build failed with `InvalidBaseImagePlatform … pulled with
platform "linux/amd64"` → `exec format error` (e.g. [run
36811233504](https://github.com/isaac-sim/IsaacLab/actions/runs/36811233504)).
x86 resolves to the identical `a6c53e29d6f1` image.
2. `.github/workflows/arm-ci.yml`: drop the job-level
`continue-on-error`. It marked the workflow run successful while `Build
& Test` failed, so the broken build above looked green in the run list.
3. `isaaclab/cli/utils.py`: on aarch64, preload the system
`libgomp.so.1` by its full `/lib/*/` path instead of the bare soname.
`isaacsim` exits at import unless each such path is listed verbatim in
`LD_PRELOAD` (it never reads `/etc/ld.so.preload`), and the CLI launches
every Python process, including ARM CI's pytest, so
`test_operational_space.py` exited before running
(`aarch_preload_checking()` → `SystemExit`, [run
36812221963](https://github.com/isaac-sim/IsaacLab/actions/runs/36812221963)).
Same failure for anyone running the CLI from a virtual environment on a
Spark. Passing that path to the test container made the `arm_ci` step
pass ([run
36816068195](https://github.com/isaac-sim/IsaacLab/actions/runs/36816068195));
the fix now lives in the CLI, with a regression test in
`test_install.py`.
4. `.github/workflows/arm-ci.yml`: deselect `ovstage` cases in both ARM
test steps. The ovstage variants of the `arm_ci` kit-less rendering
tests fail image comparison on arm64 (rgb diff 1.99 % / 7.04 % / 25.10 %
over 1.5–3 % thresholds) and fail on every x86 develop run, where
ovstage is post-merge only; the legacy cases pass.

The two ARM tests disabled for real failures (shadow-hand kit-less
rendering, Isaac Sim PhysX Cartpole) are re-enabled separately in #8230
(ARM test re-enables), after repeated DGX Spark runs.

## 2. Runner capacity
| Metric | 07-28..08-04 (2 runners) | 09-26..10-01 (18 runners) |
|---|---|---|
| ARM jobs never given a runner | 723 / 919 | 0 |
| Queue for jobs that ran | p50 300 min, max 605 min | p50 0.0 min, max
12 min |
| Fleet utilization | saturated | ~6% |

ARM CI ran p50 31 / p90 45 min; at the July trigger rate it adds about
20% utilization. The `ARM CI` workflow, disabled manually on 08-05, was
re-enabled separately (repository setting).

## 3. Test plan
- [x] arm64 base image builds on DGX Spark with the list pin ([run
36812221963](https://github.com/isaac-sim/IsaacLab/actions/runs/36812221963),
`Build base image (linux/arm64)` passed)
- [x] ARM CI `Build & Test` green on this PR ([run
36817584603](https://github.com/isaac-sim/IsaacLab/actions/runs/36817584603);
`test_operational_space.py` now imports, but its tests stay deselected
on ARM because a later `pytestmark = pytest.mark.integration` overrides
its `arm_ci` marker)
- [x] pre-commit clean

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab --format`
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have validated the changed behavior with focused coverage and
applied the [test-audit
criteria](https://github.com/isaac-sim/IsaacLab/blob/develop/skills/developer/test-audit/SKILL.md)
to any test changes
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

@isaaclab-review-bot isaaclab-review-bot 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.

Isaac Lab Review Bot

Backport restores ARM CI by pinning the multi-architecture Isaac Sim manifest, surfacing ARM job failures, excluding known-failing ARM ovstage cases, and preloading the full system libgomp.so.1 path for aarch64 CLI launches. Two minor maintainability/portability fixes remain.

  • Design and architecture: The workflow changes and private _aarch64_libgomp_env helper keep CI policy separate from CLI environment construction. The helper remains stateless and focused; however, its library discovery currently assumes only Debian-style multiarch paths.
  • API: No public symbol, signature, CLI flag, default, or configuration key changes. _aarch64_libgomp_env remains private and is consumed through the existing run_python_command path.
  • Compatibility and deprecation: Breaking changes: none identified. Existing LD_PRELOAD entries remain preserved, and non-Linux/non-aarch64 execution remains unchanged. On aarch64 distributions where system libgomp is located under /lib64 or /usr/lib64, the new discovery can fail to add the preload that the previous bare-soname behavior supplied; broaden the search paths.
  • Implementation: The preload path composition is deterministic and idempotent for matches found under /lib/*/libgomp.so.1. The exact changed glob misses common non-multiarch locations such as /lib64/libgomp.so.1 and /usr/lib64/libgomp.so.1, causing the helper to return the environment unchanged on affected aarch64 systems. Include those established layouts before treating libgomp as absent.
  • Style consistency: The import ordering, updated helper docstring, and changelog fragment follow repository conventions. In arm-ci.yml, the comment claiming x86 post-merge parity contradicts the unconditional not ovstage filter across both pull-request and protected-branch push runs. Document the actual known ARM failure and make the rationale clear for both filtered test invocations.
  • Test quality: The added test protects the distinct aarch64 run_python_command contract by asserting the exact composed LD_PRELOAD value and would fail with the prior bare-soname behavior. It does not duplicate the supplied CLI tests. Its mocked Debian-style path does not cover the portability gap in the production glob.

Minor fixes needed. Posted 2 actionable findings inline.

Automated review; human maintainers own approval decisions.

image-tag: ${{ needs.config.outputs.ci_image_tag }}-arm64
extra-pip-packages: "${{ steps.ov_pins.outputs.ovrtx }} ${{ steps.ov_pins.outputs.ovphysx }}"
test-k-expr: not ovphysx
# ovstage rendering cases are post-merge only on x86 as well.

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.

🔵 Suggestion · Style Consistency — ovstage comment contradicts the applied filter

The comment explains the skip as x86 post-merge parity, but this workflow also runs on push to main/develop/release/**, and not ovstage applies there too, so these cases never run on ARM. The PR's actual reason is that the ARM ovstage rendering cases are known-failing. State that reason here (and the duplicate filter on line 199 carries no comment at all) so the exclusion can be revisited.

preload = merged.get("LD_PRELOAD", "")
if any(os.path.basename(entry) == libgomp for entry in preload.split(":") if entry):
preload = [entry for entry in merged.get("LD_PRELOAD", "").split(":") if entry]
missing = [path for path in sorted(glob.glob("/lib/*/libgomp.so.1")) if path not in preload]

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.

🔵 Suggestion · Implementation — Glob misses non-multiarch libgomp layouts

/lib/*/libgomp.so.1 requires an intermediate directory, so it matches Debian-style /lib/aarch64-linux-gnu/ but not /lib64/libgomp.so.1 or /usr/lib64/libgomp.so.1 used by RHEL-family aarch64 images. There the helper now returns env unchanged and sets no preload at all, where it previously always added an entry. Extend the search to cover /lib64 and /usr/lib* layouts before concluding no system libgomp exists.

@greptile-apps

greptile-apps Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[Medium risk] Adjusts ARM CI configuration and library preloading logic.

The PR appears safe to merge, with non-blocking OpenMP preload and ARM post-merge coverage concerns to address.

Findings

  1. P2 Both OpenMP libraries preloaded ▶
  2. P2 Post-merge ARM coverage lost ▶

Summary

This backport restores ARM CI failure reporting, pins a multi-architecture Isaac Sim image, excludes known-failing ARM rendering cases, and changes aarch64 CLI launches to preload a full system libgomp path.

  • The preload change can combine system and Torch OpenMP runtimes in conda environments.
  • The test exclusions also remove post-merge ARM ovstage coverage.

Reviews (1) · Last reviewed commit: "[CI] Restore ARM CI on the expanded DGX ..."

preload = merged.get("LD_PRELOAD", "")
if any(os.path.basename(entry) == libgomp for entry in preload.split(":") if entry):
preload = [entry for entry in merged.get("LD_PRELOAD", "").split(":") if entry]
missing = [path for path in sorted(glob.glob("/lib/*/libgomp.so.1")) if path not in preload]

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.

P2 Both OpenMP libraries preloaded

On Linux aarch64, the conda activation hook can put Torch’s libgomp.so.1 in LD_PRELOAD. This exact-path check does not recognize it and adds the system library too. The installation guide warns that preloading both can produce libgomp warnings. Handle the existing Torch entry when building the child environment.

extra-pip-packages: "${{ steps.ov_pins.outputs.ovrtx }} ${{ steps.ov_pins.outputs.ovphysx }}"
test-k-expr: not ovphysx
# ovstage rendering cases are post-merge only on x86 as well.
test-k-expr: not ovphysx and not ovstage

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.

P2 Post-merge ARM coverage lost

The not ovstage filter applies on protected-branch pushes as well as PRs, and the other ARM test shard excludes ovstage too. Unlike x86 CI, ARM CI has no separate post-merge shard, so those ARM rendering cases no longer run after merge. Retain post-merge ARM coverage for them when they can run reliably.

@kellyguo11

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Oct 1, 2026
@kellyguo11
kellyguo11 merged commit cd95ce9 into release/3.0.0 Oct 1, 2026
58 checks passed
@kellyguo11
kellyguo11 deleted the codex/backport-8229-release-3.0.0 branch October 1, 2026 20:18
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.

2 participants