Skip to content

Commit f2d4240

Browse files
committed
Add reduced UR10e deploy-reach slice on MLX/mac-sim
1 parent e639413 commit f2d4240

23 files changed

Lines changed: 1357 additions & 25 deletions

.github/workflows/mlx-macos.yml

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ jobs:
245245
bin_stack_cfg = parse_env_cfg("Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0", device="cpu", num_envs=4)
246246
stack_instance_cfg = parse_env_cfg("Isaac-Stack-Cube-Instance-Randomize-Franka-v0", device="cpu", num_envs=4)
247247
teddy_cfg = parse_env_cfg("Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0", device="cpu", num_envs=4)
248+
ur10e_cfg = parse_env_cfg("Isaac-Deploy-Reach-UR10e-v0", device="cpu", num_envs=4)
248249
payload = evaluate_mlx_task(
249250
"h1-rough",
250251
num_envs=4,
@@ -260,6 +261,7 @@ jobs:
260261
"bin_stack_cfg_type": type(bin_stack_cfg).__name__,
261262
"stack_instance_cfg_type": type(stack_instance_cfg).__name__,
262263
"teddy_cfg_type": type(teddy_cfg).__name__,
264+
"ur10e_cfg_type": type(ur10e_cfg).__name__,
263265
"trainable_tasks": list(list_trainable_mlx_tasks()),
264266
"eval_task": payload["task"],
265267
"episodes_completed": payload["episodes_completed"],
@@ -335,6 +337,7 @@ jobs:
335337
source/isaaclab/test/backends/test_mac_anymal_c.py \
336338
source/isaaclab/test/backends/test_mac_anymal_c_rough.py \
337339
source/isaaclab/test/backends/test_mac_franka_reach.py \
340+
source/isaaclab/test/backends/test_mac_ur10e_deploy_reach.py \
338341
source/isaaclab/test/backends/test_mac_franka_lift.py \
339342
source/isaaclab/test/backends/test_mac_franka_teddy_bear_lift.py \
340343
source/isaaclab/test/backends/test_mac_franka_stack_instance_randomize.py \
@@ -432,6 +435,21 @@ jobs:
432435
--num-envs 8 --updates 1 --rollout-steps 8 --epochs-per-update 1 --episode-length-s 0.5 \
433436
--checkpoint logs/mlx/franka_reach_policy.npz --eval-interval 1
434437
438+
- name: Run MLX UR10e deploy-reach smoke
439+
run: |
440+
PYTHONPATH=.:source/isaaclab .venv/bin/python \
441+
scripts/reinforcement_learning/mlx/evaluate_task.py \
442+
--task ur10e-deploy-reach \
443+
--num-envs 8 --episodes 1 --episode-length-s 0.5 --max-steps 512 --no-random-actions
444+
445+
- name: Run MLX UR10e deploy-reach training smoke
446+
run: |
447+
PYTHONPATH=.:source/isaaclab .venv/bin/python \
448+
scripts/reinforcement_learning/mlx/train_task.py \
449+
--task ur10e-deploy-reach \
450+
--num-envs 8 --updates 1 --rollout-steps 8 --epochs-per-update 1 --episode-length-s 0.5 \
451+
--checkpoint logs/mlx/ur10e_deploy_reach_policy.npz --eval-interval 1
452+
435453
- name: Run MLX Franka lift smoke
436454
run: |
437455
PYTHONPATH=.:source/isaaclab .venv/bin/python \
@@ -565,6 +583,8 @@ jobs:
565583
assert "cartpole-rgb-camera" in list_mlx_tasks()
566584
assert "cartpole-depth-camera" in list_mlx_tasks()
567585
assert "franka-reach" in list_mlx_tasks()
586+
assert "ur10e-deploy-reach" in list_mlx_tasks()
587+
assert "ur10e-deploy-reach" in list_trainable_mlx_tasks()
568588
assert "franka-lift" in list_mlx_tasks()
569589
assert "franka-teddy-bear-lift" in list_mlx_tasks()
570590
assert "franka-stack-instance-randomize" in list_mlx_tasks()
@@ -574,19 +594,19 @@ jobs:
574594
assert "franka-cabinet" in list_mlx_tasks()
575595
assert "franka-open-drawer" in list_mlx_tasks()
576596
train_payload = train_mlx_task(
577-
"franka-bin-stack",
597+
"ur10e-deploy-reach",
578598
num_envs=8,
579599
updates=1,
580600
rollout_steps=8,
581601
epochs_per_update=1,
582602
hidden_dim=32,
583-
checkpoint="logs/mlx/franka_bin_stack_wrapper_policy.npz",
603+
checkpoint="logs/mlx/ur10e_deploy_reach_wrapper_policy.npz",
584604
eval_interval=1,
585605
episode_length_s=0.5,
586606
seed=31,
587607
)
588608
payload = evaluate_mlx_task(
589-
"franka-bin-stack",
609+
"ur10e-deploy-reach",
590610
checkpoint=train_payload["checkpoint_path"],
591611
episodes=1,
592612
episode_length_s=0.5,
@@ -731,10 +751,10 @@ jobs:
731751
assert len(payload["benchmarks"]) >= 5
732752
print(payload["tasks"])
733753
dashboard = json.loads(Path("logs/benchmarks/mlx/smoke-dashboard.json").read_text(encoding="utf-8"))
734-
assert dashboard["summary"]["rollout_task_count"] == 16
754+
assert dashboard["summary"]["rollout_task_count"] == 17
735755
assert dashboard["summary"]["training_task_count"] == 0
736756
trend = json.loads(Path("logs/benchmarks/mlx/smoke-trend.json").read_text(encoding="utf-8"))
737-
assert trend["summary"]["task_count"] == 16
757+
assert trend["summary"]["task_count"] == 17
738758
planner_payload = json.loads(Path("logs/planner/mac-planner-smoke.json").read_text(encoding="utf-8"))
739759
assert planner_payload["planner"]["implementation"] == "joint-space-linear-interpolation"
740760
assert planner_payload["plan"]["waypoint_count"] == 6
@@ -751,8 +771,8 @@ jobs:
751771
assert stereo_payload["depth_mm_mean"] is not None
752772
assert Path(stereo_payload["left_rgb_path"]).is_file()
753773
runtime_payload = json.loads(Path("logs/runtime/mac-runtime-diagnostics.json").read_text(encoding="utf-8"))
754-
assert runtime_payload["runtime"]["supported_tasks"]["public_task_count"] == 18
755-
assert runtime_payload["sim"]["supported_tasks"]["current_mac_native_count"] == 16
774+
assert runtime_payload["runtime"]["supported_tasks"]["public_task_count"] == 19
775+
assert runtime_payload["sim"]["supported_tasks"]["current_mac_native_count"] == 17
756776
sensor_payload = json.loads(Path("logs/benchmarks/mlx/sensor-smoke.json").read_text(encoding="utf-8"))
757777
assert sensor_payload["task_group"] == "sensor-mac-native"
758778
assert sensor_payload["cpu_fallback_detected"] is False
@@ -778,15 +798,17 @@ jobs:
778798
assert release_payload["bin_stack_cfg_type"] == "MacFrankaBinStackEnvCfg"
779799
assert release_payload["stack_instance_cfg_type"] == "MacFrankaStackInstanceRandomizeEnvCfg"
780800
assert release_payload["teddy_cfg_type"] == "MacFrankaTeddyBearLiftEnvCfg"
801+
assert release_payload["ur10e_cfg_type"] == "MacUR10eDeployReachEnvCfg"
781802
assert "anymal-c-rough" in release_payload["trainable_tasks"]
782803
assert "h1-rough" in release_payload["trainable_tasks"]
804+
assert "ur10e-deploy-reach" in release_payload["trainable_tasks"]
783805
assert "franka-teddy-bear-lift" in release_payload["trainable_tasks"]
784806
assert "franka-stack-instance-randomize" in release_payload["trainable_tasks"]
785807
assert "franka-bin-stack" in release_payload["trainable_tasks"]
786808
assert release_payload["eval_task"] == "h1-rough"
787809
assert release_payload["episodes_completed"] == 1
788810
release_runtime_payload = json.loads(Path("logs/runtime/release-runtime-diagnostics.json").read_text(encoding="utf-8"))
789-
assert release_runtime_payload["runtime"]["supported_tasks"]["public_task_count"] == 18
811+
assert release_runtime_payload["runtime"]["supported_tasks"]["public_task_count"] == 19
790812
release_eval_payload = json.loads(Path("logs/runtime/release-eval.json").read_text(encoding="utf-8"))
791813
assert release_eval_payload["task"] == "h1-rough"
792814
assert release_eval_payload["episodes_completed"] == 1
@@ -824,7 +846,7 @@ jobs:
824846
full_payload = json.loads(Path("logs/benchmarks/mlx/full-smoke.json").read_text(encoding="utf-8"))
825847
assert full_payload["task_group"] == "full"
826848
full_dashboard = json.loads(Path("logs/benchmarks/mlx/full-smoke-dashboard.json").read_text(encoding="utf-8"))
827-
assert full_dashboard["summary"]["rollout_task_count"] == 20
849+
assert full_dashboard["summary"]["rollout_task_count"] == 21
828850
assert full_dashboard["summary"]["training_task_count"] == 1
829851
full_trend = json.loads(Path("logs/benchmarks/mlx/full-smoke-trend.json").read_text(encoding="utf-8"))
830852
assert any(entry["kind"] == "training" for entry in full_trend["tasks"])

PORT_TO_MLX_TODO.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ without pausing for replanning after every small success.
102102
- `DONE` Eighth trainable Franka manipulation slice landed for `Isaac-Stack-Cube-Instance-Randomize-Franka-v0` by keeping the shared analytic stack substrate but adding explicit variant-id observations, deterministic distinct support/movable object sampling, public MLX wrapper/CLI support, benchmark coverage, semantic baseline refresh, and focused backend tests instead of dishonestly aliasing it to plain stack
103103
- `DONE` Ninth trainable Franka manipulation slice landed for `Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0` by keeping the shared three-cube stack substrate, pinning the support cube to an explicit bin anchor, exposing that anchor through the observation and benchmark contracts, refreshing the semantic baseline, and validating replay/train plus wrapper/CLI coverage
104104
- `DONE` The `Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0` alias now carries explicit reduced-contract metadata across the lazy registry, parsed env config, public MLX task spec, installed CLI payloads, and backend diagnostics so the mac path does not silently imply upstream mimic/imitation parity
105+
- `DONE` Tenth trainable manipulation slice landed for `Isaac-Deploy-Reach-UR10e-v0` with a reduced analytic pose-tracking backend, honest reduced-contract metadata (`semantic_contract="reduced-analytic-pose"`), public MLX wrapper/CLI support, benchmark coverage, semantic baseline refresh, and direct replay/train smoke coverage; the upstream `Isaac-Deploy-Reach-UR10e-Play-v0` alias now resolves to the same canonical mac-native slice
105106

106107
## Phase A: Import And Packaging Safety
107108

@@ -754,7 +755,7 @@ without pausing for replanning after every small success.
754755
This queue exists so work can continue without waiting for a new plan. The documented v1 board above is now closed for the current public MLX/mac slice, so the next queue is follow-on parity work:
755756

756757
- Hardware validation is now done for the backend-local stereo path against live ZED 2i capture through a camera-authorized Terminal host plus `zed-sdk-mlx`; retained host-local probe artifacts include `/tmp/isaaclab-zed-probe-live-final.json` and `/tmp/isaaclab-zed-probe-live-final.yuv`.
757-
- Port the next manipulation milestone beyond the current nine trainable Franka slices, likely a richer cabinet/drawer variant or the next multi-object manipulation workflow.
758+
- Port the next genuinely new manipulation milestone beyond the current ten trainable manipulation slices, likely a richer non-Franka cabinet/drawer variant or the next multi-object workflow that cannot be represented honestly as an alias of the existing reduced slices.
758759
- Replace the next remaining locomotion or contact/support `mx.compile` helper with a true custom Metal kernel only after the root-step tranche proves benchmark-positive and semantically stable.
759760
- Grow the planner/ROS prototypes carefully: richer process/message interoperability layers around the new world-state and joint-trajectory envelopes while still avoiding CUDA/NITROS assumptions.
760761
- Keep the generic runtime metadata honest: only advertise generic sensor/runtime capabilities that are actually exposed through backend-neutral APIs, and push task-specific or tooling-only support into explicit diagnostic fields instead of broad parity flags.
@@ -768,6 +769,7 @@ PYTHONPATH=.:source/isaaclab:source/isaaclab_rl .venv/bin/pytest \
768769
scripts/tools/test/test_bootstrap_isaac_sources.py \
769770
scripts/tools/test/test_bootstrap_uv_mlx.py \
770771
source/isaaclab_rl/test/test_import_safety.py \
772+
source/isaaclab_rl/test/test_mlx_cli.py \
771773
source/isaaclab_rl/test/test_mlx_wrapper.py \
772774
source/isaaclab/test/backends/test_runtime.py \
773775
source/isaaclab/test/backends/test_task_registry.py \
@@ -790,9 +792,14 @@ PYTHONPATH=.:source/isaaclab:source/isaaclab_rl .venv/bin/pytest \
790792
source/isaaclab/test/backends/test_mac_anymal_c.py \
791793
source/isaaclab/test/backends/test_mac_anymal_c_rough.py \
792794
source/isaaclab/test/backends/test_mac_franka_reach.py \
795+
source/isaaclab/test/backends/test_mac_ur10e_deploy_reach.py \
793796
source/isaaclab/test/backends/test_mac_franka_lift.py \
797+
source/isaaclab/test/backends/test_mac_franka_teddy_bear_lift.py \
798+
source/isaaclab/test/backends/test_mac_franka_stack_instance_randomize.py \
794799
source/isaaclab/test/backends/test_mac_franka_bin_stack.py \
795800
source/isaaclab/test/backends/test_mac_franka_stack.py \
801+
source/isaaclab/test/backends/test_mac_franka_stack_rgb.py \
802+
source/isaaclab/test/backends/test_mac_franka_cabinet.py \
796803
source/isaaclab/test/backends/test_mac_franka_open_drawer.py \
797804
source/isaaclab/test/backends/test_mac_h1.py -q
798805
```

0 commit comments

Comments
 (0)