Skip to content

Commit 39c9f7f

Browse files
kellyguo11mataylor-nvidiaAntoineRichardmmichelismaxkra15
authored
[Backport release/3.0.0] Cherry-pick selected develop PRs (#7226)
## Summary Cherry-picks the following merged PRs from `develop` onto `release/3.0.0`, preserving each as an individual commit with `-x` provenance: - #7193 — Bake CI pytest deps into the built Docker image - #7077 — Add OVPhysX support to Franka deformable lift tasks - #7175 — Raise on unsupported camera renderer outputs - #7174 — Fix benchmark play inference scope - #7173 — Report resolved backend for play benchmarks - #7172 — Add video recording to play benchmarks - #7215 — Reduce GearAssembly default environment count - #7214 — Remove Kamino preset from open drawer - #7213 — Fix OvPhysX scene gravity randomization - #7212 — Fix OVPhysX material binding device selection - #7189 — Make preview surfaces renderer agnostic - #7206 — Fix OVPhysX benchmark articulation setup All cherry-picks and the final rebase onto the latest `release/3.0.0` tip completed without conflicts. ## Validation - Verified all 12 backported commits have patch IDs identical to their source squash commits and retain their `cherry picked from` footers. - `git diff --check upstream/release/3.0.0..HEAD` - Bash syntax validation for the modified CI shell scripts. - YAML parsing for the modified composite actions. - Changelog validation against `release/3.0.0`. - Targeted pytest coverage for benchmark APIs/play, video recording, GearAssembly defaults, OVPhysX presets and runtime semantics, and renderer-agnostic materials: **81 passed, 4 skipped, 1 deselected**. - The deselected case is an unchanged test that hard-codes a POSIX `/tmp` path and fails on Windows path normalization. - `uv run isaaclab -f` passed all hooks except the changelog hook's known release-branch baseline finding for `source/isaaclab/changelog.d/core-test-config-fixtures.skip`; the targeted release-base changelog check passed. --------- Co-authored-by: Matthew Taylor <mataylor@nvidia.com> Co-authored-by: Antoine RICHARD <antoiner@nvidia.com> Co-authored-by: Mike Yan Michelis <46975745+mmichelis@users.noreply.github.com> Co-authored-by: Maximilian Krause <99733341+maxkra15@users.noreply.github.com> Co-authored-by: Octi Zhang <zhengyuz@nvidia.com> Co-authored-by: Mustafa H <34825877+StafaH@users.noreply.github.com>
1 parent 1e53d6f commit 39c9f7f

52 files changed

Lines changed: 743 additions & 250 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/_lib/compute-deps-hash/action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ runs:
5454
isaaclab.sh
5555
environment.yml
5656
source/isaaclab/isaaclab/cli
57+
# Pins the CI pytest deps layered onto the image after build, so a
58+
# change to that list must invalidate the deps cache.
59+
.github/actions/docker-build/action.yml
5760
)
5861
deps_manifest_pattern='(setup\.py|pyproject\.toml|setup\.cfg|extension\.toml|requirements[^/]*\.txt|uv\.lock)$'
5962

.github/actions/docker-build/action.yml

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,33 @@ runs:
175175
docker buildx build --load "${BUILD_ARGS[@]}" "${{ inputs.context-path }}"
176176
echo "was-built=true" >> "$GITHUB_OUTPUT"
177177
178-
##### 6: Tag built image with local deps-tag #####
178+
##### 6: Layer the CI pytest harness onto the built image #####
179+
180+
# Kept out of the tracked Dockerfiles, which build local dev containers and
181+
# ship via publish-images.yaml. Only on a real build; cache hits have it.
182+
183+
- name: Layer CI test dependencies
184+
if: steps.build.outputs.was-built == 'true'
185+
shell: bash
186+
run: |
187+
set -euo pipefail
188+
# pip needs root; restore the image's own default user afterwards.
189+
image_user="$(docker image inspect --format '{{.Config.User}}' "${{ inputs.image-tag }}")"
190+
# Dockerfile on stdin (no context to stage). Quoted heredoc so the
191+
# shell leaves ISAACLAB_PATH and IMAGE_USER for Docker to expand; the
192+
# image tag is an action input, substituted before bash ever runs.
193+
docker build --platform "${{ inputs.platform }}" \
194+
--build-arg "IMAGE_USER=${image_user:-root}" \
195+
-t "${{ inputs.image-tag }}" - <<'DOCKERFILE'
196+
FROM ${{ inputs.image-tag }}
197+
ARG IMAGE_USER
198+
USER root
199+
RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install \
200+
pytest pytest-mock junitparser flaky "coverage>=7.6.1"
201+
USER ${IMAGE_USER}
202+
DOCKERFILE
203+
204+
##### 7: Tag built image with local deps-tag #####
179205

180206
# Runs only when a real build happened (not on cache hits). Populates the
181207
# deps-tag so the next build with identical deps short-circuits at step 4.
@@ -191,7 +217,7 @@ runs:
191217
echo "🟠 LOCAL_DEPS_TAG not set, skipping local deps-cache tag"
192218
fi
193219
194-
##### 7: Evict stale local deps-cache tags (>14d) — opt-in #####
220+
##### 8: Evict stale local deps-cache tags (>14d) — opt-in #####
195221

196222
- name: Evict stale local deps-cache tags (>14d)
197223
if: always() && inputs.evict-stale-cache == 'true'
@@ -214,7 +240,7 @@ runs:
214240
--format '{{.CreatedAt}}|{{.Repository}}:{{.Tag}}' 2>/dev/null)
215241
echo "🔵 Evicted ${evicted} deps tag(s) older than ${TTL_DAYS}d"
216242
217-
##### 8: Host disk snapshot (post) #####
243+
##### 9: Host disk snapshot (post) #####
218244

219245
- name: Host disk snapshot (post)
220246
if: always()

.github/actions/multi-gpu/multi_gpu_shard_runner.sh

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,33 @@
2020
#
2121
# Behavior:
2222
# 1. Materializes HOME + PYTHONUSERBASE dirs (tmpfs, world-writable)
23-
# 2. Installs pytest deps (junitparser et al.) into the shared PYTHONUSERBASE
24-
# 3. Derives shard count from nvidia-smi -L (authoritative; torch.cuda.device_count
23+
# 2. Derives shard count from nvidia-smi -L (authoritative; torch.cuda.device_count
2524
# under-counts MIG-on-same-parent unless CUDA_VISIBLE_DEVICES enumerates each)
26-
# 4. Cross-checks torch against the nvidia-smi count and caps shards to what torch
25+
# 3. Cross-checks torch against the nvidia-smi count and caps shards to what torch
2726
# can address (guards against CUDA_VISIBLE_DEVICES misconfig on a MIG host)
28-
# 5. Fans out 1 pytest subshell per non-default cuda:N with per-shard HOME +
27+
# 4. Fans out 1 pytest subshell per non-default cuda:N with per-shard HOME +
2928
# ISAACLAB_TEST_DEVICES; each shard tees its stdout to
3029
# /shard-logs/cuda-N.log for the host's grouped re-print after the run
31-
# 6. Waits on every shard before aggregating exit codes — a fast failure doesn't
30+
# 5. Waits on every shard before aggregating exit codes — a fast failure doesn't
3231
# tear down still-running siblings
32+
#
33+
# The pytest deps (pytest, junitparser et al.) are baked into the image by
34+
# .github/actions/docker-build, so this script no longer installs them.
3335

3436
set +e # keep going on errors; per-shard exit codes are aggregated at the end
3537
cd /workspace/isaaclab
3638
unset DISPLAY # clear the var that would force Kit into headed (X11) mode
3739

38-
# Container-level HOME + PYTHONUSERBASE for pip --user installs. The image
39-
# runs as --user $host_uid:$host_gid with no matching /etc/passwd entry, so
40-
# HOME defaults to /root which the user cannot write. /tmp/* is on tmpfs
40+
# Container-level HOME + PYTHONUSERBASE. The image runs as
41+
# --user $host_uid:$host_gid with no matching /etc/passwd entry, so HOME
42+
# defaults to /root which the user cannot write. /tmp/* is on tmpfs
4143
# (1777, world-writable).
4244
#
43-
# PYTHONUSERBASE is the key for the 1-docker shape: pip --user writes to
44-
# ${PYTHONUSERBASE}/lib/python3.12/site-packages, and every Python invocation
45-
# that sees the same env var imports from there. Per-shard subshells below
46-
# override HOME (so .cache / .nvidia-omniverse are isolated) but inherit
47-
# PYTHONUSERBASE so junitparser et al. resolve everywhere.
45+
# Both must exist before any shard starts: per-shard subshells below override
46+
# HOME (so .cache / .nvidia-omniverse are isolated) but inherit
47+
# PYTHONUSERBASE, so anything writing to the user site shares one directory.
4848
mkdir -p /tmp/mgpu-base-home /tmp/mgpu-pyuserbase
4949

50-
# Pytest deps (same as run-tests action). junitparser is imported at
51-
# tools/conftest.py load time, so it must be present first.
52-
bash .github/actions/_lib/with-python-package-retries.sh \
53-
./isaaclab.sh -p -m pip install pytest pytest-mock junitparser flaky "coverage>=7.6.1"
54-
5550
# Shard count from nvidia-smi -L (truth; torch under-counts MIG).
5651
MIG_COUNT=$(nvidia-smi -L | grep -c "^ MIG ") # grep -c = count of matching lines (MIG slices)
5752
GPU_COUNT=$(nvidia-smi -L | grep -c "^GPU ") # count of whole GPUs

.github/actions/run-tests/run_tests.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,6 @@ run_tests() {
322322
mkdir -p tests
323323
rm _isaac_sim || true
324324
ln -s /isaac-sim _isaac_sim
325-
bash /with-python-package-retries.sh ./isaaclab.sh -p -m pip install pytest pytest-mock junitparser flaky \"coverage>=7.6.1\"
326325
if [ -n \"\${WARP_CACHE_PATH:-}\" ]; then
327326
./isaaclab.sh -p tools/verify_warp_cache.py
328327
fi

scripts/demos/mpm/newton_mpm_granular.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,6 @@ def create_sim_cfg():
111111
)
112112

113113

114-
def preview_material(color):
115-
"""Return a preview-surface material for Kit runs; Kit-less runs spawn no USD materials."""
116-
if "kit" not in (args_cli.visualizer or []):
117-
return None
118-
119-
import isaaclab.sim as sim_utils
120-
121-
return sim_utils.PreviewSurfaceCfg(diffuse_color=color)
122-
123-
124114
def create_scene_cfg():
125115
"""Create an Isaac Lab scene config using declarative assets."""
126116
from isaaclab_newton.assets import MPMObjectCfg
@@ -141,7 +131,7 @@ def collider_cfg(prim_path: str, center, half_extents, orientation, friction: fl
141131
static_friction=friction,
142132
dynamic_friction=friction,
143133
),
144-
visual_material=preview_material((0.45, 0.45, 0.45)),
134+
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.45, 0.45, 0.45)),
145135
),
146136
init_state=AssetBaseCfg.InitialStateCfg(pos=center, rot=orientation),
147137
)

scripts/demos/mpm/snowball_smash.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,7 @@ def crate_cfg(index: int) -> RigidObjectCfg:
239239
dynamic_friction=CRATE_FRICTION,
240240
),
241241
physics_material_path="physicsMaterial",
242-
visual_material=(
243-
sim_utils.PreviewSurfaceCfg(diffuse_color=color) if "kit" in (args_cli.visualizer or []) else None
244-
),
242+
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=color),
245243
visual_material_path="visualMaterial",
246244
),
247245
init_state=RigidObjectCfg.InitialStateCfg(pos=center),

scripts/demos/mpm/teapot_fill.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -423,16 +423,6 @@ def create_sim_cfg():
423423
)
424424

425425

426-
def preview_material(color):
427-
"""Return a preview-surface material for Kit runs; Kit-less runs spawn no USD materials."""
428-
if "kit" not in (args_cli.visualizer or []):
429-
return None
430-
431-
import isaaclab.sim as sim_utils
432-
433-
return sim_utils.PreviewSurfaceCfg(diffuse_color=color)
434-
435-
436426
def create_scene_cfg():
437427
"""Create the teapot-fill scene using declarative Isaac Lab assets."""
438428
from isaaclab_newton.assets import MPMObjectCfg
@@ -475,7 +465,7 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
475465
dynamic_friction=TABLE_FRICTION,
476466
),
477467
physics_material_path="physicsMaterial",
478-
visual_material=preview_material(TABLE_COLOR),
468+
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=TABLE_COLOR),
479469
visual_material_path="visualMaterial",
480470
),
481471
init_state=AssetBaseCfg.InitialStateCfg(
@@ -498,7 +488,7 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
498488
dynamic_friction=BOWL_FRICTION,
499489
),
500490
physics_material_path="physicsMaterial",
501-
visual_material=preview_material(BOWL_COLOR),
491+
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=BOWL_COLOR),
502492
visual_material_path="visualMaterial",
503493
),
504494
init_state=AssetBaseCfg.InitialStateCfg(pos=BOWL_BASE_POS),
@@ -529,7 +519,7 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
529519
dynamic_friction=CONTAINER_FRICTION,
530520
),
531521
physics_material_path="physicsMaterial",
532-
visual_material=preview_material(CONTAINER_COLOR),
522+
visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=CONTAINER_COLOR),
533523
visual_material_path="visualMaterial",
534524
),
535525
init_state=RigidObjectCfg.InitialStateCfg(pos=container_pos, rot=container_rot),
@@ -549,10 +539,10 @@ class TeapotFillSceneCfg(InteractiveSceneCfg):
549539
tensile_yield_ratio=5.0,
550540
),
551541
visual_color=WATER_COLOR,
552-
visual_material=sim_utils.GlassMdlCfg(
553-
glass_color=WATER_COLOR,
554-
glass_ior=1.333,
555-
thin_walled=False,
542+
visual_material=sim_utils.PreviewSurfaceCfg(
543+
diffuse_color=WATER_COLOR,
544+
roughness=0.1,
545+
opacity=0.7,
556546
),
557547
),
558548
init_state=MPMObjectCfg.InitialStateCfg(pos=container_pos),
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Added
2+
^^^^^
3+
4+
* Added video recording to the RSL-RL, RL-Games, SKRL, and SB3 play benchmark adapters and populated
5+
:attr:`~isaaclab.benchmark.schema.PlayBundle.video_path` with the recording directory.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fixed
2+
^^^^^
3+
4+
* Fixed play benchmarks running environment actions outside inference mode.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Changed
2+
^^^^^^^
3+
4+
* **Breaking:** Camera configurations now raise an error when the active renderer cannot produce a requested
5+
data type, rather than silently omitting it. Remove unsupported types from ``CameraCfg.data_types`` or select
6+
a renderer that supports them.

0 commit comments

Comments
 (0)