Repository navigation
[Backport release/3.0.0] [CI] Restore ARM CI on the expanded DGX Spark pool (#8229) #8242
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,14 +14,14 @@ | |
| # it could be retried. As its own workflow, arm-ci no longer gates the main | ||
| # workflow's lifecycle, and it can be re-run independently. | ||
| # | ||
| # arm-ci is currently informational (continue-on-error), but it is wired to be | ||
| # promotable to a REQUIRED status check: it triggers on every PR and gates the | ||
| # expensive arm64 build behind the shared `changes` detector + `if:`. An | ||
| # irrelevant PR SKIPS the job (which branch protection reads as green) instead | ||
| # of never creating the check — a workflow-level `paths:` filter is deliberately | ||
| # avoided because a not-triggered required check stays pending forever and | ||
| # blocks the PR. This mirrors the `changes`+`if:` pattern build.yaml already | ||
| # uses for its required test jobs. | ||
| # arm-ci is not a required check, so a failure reports red without blocking | ||
| # the merge. It is wired to be promotable to one: it triggers on every PR and | ||
| # gates the expensive arm64 build behind the shared `changes` detector + `if:`. | ||
| # An irrelevant PR SKIPS the job (which branch protection reads as green) | ||
| # instead of never creating the check — a workflow-level `paths:` filter is | ||
| # deliberately avoided because a not-triggered required check stays pending | ||
| # forever and blocks the PR. This mirrors the `changes`+`if:` pattern | ||
| # build.yaml already uses for its required test jobs. | ||
| # | ||
| # Trigger parity with the former build.yaml job: | ||
| # - push to protected branches always runs (post-merge integration); | ||
|
|
@@ -153,7 +153,6 @@ jobs: | |
| needs: [changes, config] | ||
| if: needs.changes.outputs.should_run == 'true' | ||
| timeout-minutes: 60 | ||
| continue-on-error: true | ||
| steps: | ||
| - uses: actions/checkout@v6 | ||
| with: | ||
|
|
@@ -184,7 +183,8 @@ jobs: | |
| container-name: isaac-lab-arm-ci-${{ github.run_id }}-${{ github.run_attempt }} | ||
| 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. | ||
| test-k-expr: not ovphysx and not ovstage | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
| ci-marker: arm_ci | ||
| volume-mount-source: ${{ github.workspace }} | ||
|
|
||
|
|
@@ -196,7 +196,7 @@ jobs: | |
| container-name: isaac-lab-arm-ci-ovphysx-${{ github.run_id }}-${{ github.run_attempt }} | ||
| 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: ovphysx | ||
| test-k-expr: ovphysx and not ovstage | ||
| ci-marker: arm_ci | ||
| volume-mount-source: ${{ github.workspace }} | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| * Fixed CLI runs on Linux aarch64 from a virtual environment exiting at ``isaacsim`` import with | ||
| the ``LD_PRELOAD`` banner. The CLI now preloads the system ``libgomp.so.1`` by its full path, | ||
| which is the form Isaac Sim's check accepts. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,6 +3,7 @@ | |
| # | ||
| # SPDX-License-Identifier: BSD-3-Clause | ||
|
|
||
| import glob | ||
| import os | ||
| import platform | ||
| import shutil | ||
|
|
@@ -630,18 +631,19 @@ def _aarch64_libgomp_env(env: dict[str, str] | None) -> dict[str, str] | None: | |
| The torch wheel bundles its own libgomp, which loads first and conflicts with the | ||
| library Isaac Sim expects, so isaacsim refuses to start unless the system libgomp is | ||
| preloaded. The pip installation docs tell users to export LD_PRELOAD by hand; doing it | ||
| here makes first runs through the CLI work out of the box. The bare soname is used so | ||
| ``ld.so`` resolves the library through the ldconfig cache on any distro. Returns the | ||
| env unchanged on other platforms or when a libgomp is already preloaded. | ||
| here makes first runs through the CLI work out of the box. isaacsim only accepts the | ||
| system ``/lib/*/libgomp.so.1`` paths listed verbatim, so those full paths are prepended. | ||
| Returns the env unchanged on other platforms, without a system libgomp, or when every | ||
| such path is already preloaded. | ||
| """ | ||
| if platform.system() != "Linux" or platform.machine().lower() not in ("aarch64", "arm64"): | ||
| return env | ||
| libgomp = "libgomp.so.1" | ||
| merged = dict(os.environ if env is None else env) | ||
| 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] | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 Suggestion · Implementation — Glob misses non-multiarch libgomp layouts
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
On Linux aarch64, the conda activation hook can put Torch’s |
||
| if not missing: | ||
| return env | ||
| merged["LD_PRELOAD"] = f"{libgomp}:{preload}" if preload else libgomp | ||
| merged["LD_PRELOAD"] = ":".join(missing + preload) | ||
| return merged | ||
|
|
||
|
|
||
|
|
||
There was a problem hiding this comment.
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/**, andnot ovstageapplies there too, so these cases never run on ARM. The PR's actual reason is that the ARMovstagerendering 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.