From 36af6ee77debaec67298d5018354755d2a42e13a Mon Sep 17 00:00:00 2001 From: TATP-233 Date: Wed, 16 Sep 2026 15:18:56 +0800 Subject: [PATCH 1/3] chore: remove obsolete dead code and stale references Delete zero-reference scripts, assets, and the unused monitoring utility left over from the Unitree downstream migration; port the drake batch-pool test fixture from go1 to go2; drop stale doc and config references to the removed modules. Refs #1590 --- .gitignore | 2 - docs/sphinx/source/api_reference/index.md | 2 +- .../source/api_reference/training/index.md | 2 +- .../source/api_reference/utils/index.md | 4 +- .../2-from_legged_gym.md | 2 +- .../3-extending/4-new_terrain.md | 2 - .../2-from_legged_gym.md | 2 +- .../3-extending/4-new_terrain.md | 2 - pyproject.rocm.toml | 1 - pyproject.toml | 1 - .../benchmark/env/benchmark_postprocess.py | 1149 ----------------- .../benchmark_mujoco_rollout_model_sharing.py | 4 +- .../benchmark/xmls/humanoid/humanoid100.xml | 150 --- scripts/convert_motion_29dof_to_23dof.py | 167 --- .../assets/motions/g1/23dof_amp/.gitkeep | 0 src/unilab/assets/robots/hfields/hfield.png | Bin 273966 -> 0 bytes src/unilab/training/__init__.py | 4 - src/unilab/utils/device.py | 101 -- src/unilab/utils/geometry.py | 39 - src/unilab/utils/monitoring.py | 60 - src/unilab/utils/seed.py | 9 - src/unilab/utils/sim2sim.py | 39 - tests/assets/test_hub.py | 1 - tests/base/backend/test_drake_batch_pool.py | 44 +- tests/base/test_sim_backend.py | 1 - tests/training/test_seed_contract.py | 7 - tests/training/test_sim2sim_resolver.py | 37 - tests/utils/test_utils_package_policy.py | 1 - 28 files changed, 30 insertions(+), 1803 deletions(-) delete mode 100644 scripts/benchmark/env/benchmark_postprocess.py delete mode 100644 scripts/benchmark/xmls/humanoid/humanoid100.xml delete mode 100644 scripts/convert_motion_29dof_to_23dof.py delete mode 100644 src/unilab/assets/motions/g1/23dof_amp/.gitkeep delete mode 100644 src/unilab/assets/robots/hfields/hfield.png delete mode 100644 src/unilab/utils/monitoring.py diff --git a/.gitignore b/.gitignore index 1e768f36d..d47f65c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -83,9 +83,7 @@ src/unilab/assets/bots/ src/unilab/assets/robots/x2/meshes/*.STL src/unilab/assets/robots/g1/assets/ src/unilab/assets/robots/g1/textures/ -src/unilab/assets/robots/go1/assets/ src/unilab/assets/robots/go2/assets/ -src/unilab/assets/robots/a2/assets/ src/unilab/assets/robots/allegro_hand/assets/ src/unilab/assets/robots/sharpa_wave/meshes/ diff --git a/docs/sphinx/source/api_reference/index.md b/docs/sphinx/source/api_reference/index.md index 5b22144d1..64d62a1c7 100644 --- a/docs/sphinx/source/api_reference/index.md +++ b/docs/sphinx/source/api_reference/index.md @@ -56,7 +56,7 @@ PPO / APPO / SAC / TD3 variants moved to the uni_rl package (issue #1480). :::{grid-item-card} 🏋 `unilab.training` :link: training/index :link-type: doc -Runtime helpers, monitoring, reward bookkeeping, runner orchestration. +Runtime helpers, reward bookkeeping, runner orchestration. ::: :::{grid-item-card} 🔗 Shared-memory runtime → `uni_rl.ipc` diff --git a/docs/sphinx/source/api_reference/training/index.md b/docs/sphinx/source/api_reference/training/index.md index 80d7238f5..3ba11acde 100644 --- a/docs/sphinx/source/api_reference/training/index.md +++ b/docs/sphinx/source/api_reference/training/index.md @@ -2,7 +2,7 @@ Glue between `algos`, `envs` and `ipc`: experiment lifecycle and the top-level `run` helpers invoked by the `train` / `eval` / `demo` CLI -entrypoints. Layer-0 helpers (seeding, monitoring, reward bookkeeping, +entrypoints. Layer-0 helpers (seeding, reward bookkeeping, checkpoint resolution, sim2sim contracts) live in `unilab.utils`; resolved env config adaptation lives in `unilab.base.config_adapter`. diff --git a/docs/sphinx/source/api_reference/utils/index.md b/docs/sphinx/source/api_reference/utils/index.md index 30a8b0133..37f37f9a1 100644 --- a/docs/sphinx/source/api_reference/utils/index.md +++ b/docs/sphinx/source/api_reference/utils/index.md @@ -1,7 +1,7 @@ # `unilab.utils` — Utilities -Device probing, tensor helpers, training seeding, hardware monitoring, -reward bookkeeping, checkpoint resolution, sim2sim contract checks, NaN +Device probing, tensor helpers, training seeding, reward bookkeeping, +checkpoint resolution, sim2sim contract checks, NaN guards, and pure-numpy geometry/rotation helpers shared across envs and scripts. diff --git a/docs/sphinx/source/en/3-deployment/3-framework_migration/2-from_legged_gym.md b/docs/sphinx/source/en/3-deployment/3-framework_migration/2-from_legged_gym.md index 7990557d7..8868e3940 100644 --- a/docs/sphinx/source/en/3-deployment/3-framework_migration/2-from_legged_gym.md +++ b/docs/sphinx/source/en/3-deployment/3-framework_migration/2-from_legged_gym.md @@ -36,7 +36,7 @@ mostly mechanical. 3. Mirror your reward terms; keep the same names so reward parity is diff-able. 4. Translate command sampling — configure `UniformVelocityCommandCfg` under - the owner YAML's `env.commands` (see the Go1 flat owner). + the owner YAML's `env.commands` (see the `go2_joystick_flat` owner). 5. Translate terrain — Legged Gym's heightfield generator has a UniLab counterpart at `unilab.terrains.heightfield_terrains`. diff --git a/docs/sphinx/source/en/4-developer_guide/3-extending/4-new_terrain.md b/docs/sphinx/source/en/4-developer_guide/3-extending/4-new_terrain.md index aba440d8d..3419a3ab2 100644 --- a/docs/sphinx/source/en/4-developer_guide/3-extending/4-new_terrain.md +++ b/docs/sphinx/source/en/4-developer_guide/3-extending/4-new_terrain.md @@ -25,8 +25,6 @@ materialization out of `step()`, `reset()`, and hot domain-randomization loops. - Terrain generator shape and numerical behavior: `tests/terrains/test_terrain_generator.py` - Rough locomotion height-scan and spawn behavior: - `tests/envs/locomotion/test_go2_rough_height_scan.py`, - `tests/envs/locomotion/test_go2_terrain_spawn.py`, `tests/envs/locomotion/test_terrain_spawn.py` - Backend materialization boundaries: `tests/utils/test_xml_utils.py` diff --git a/docs/sphinx/source/zh_CN/3-deployment/3-framework_migration/2-from_legged_gym.md b/docs/sphinx/source/zh_CN/3-deployment/3-framework_migration/2-from_legged_gym.md index 2b5d3e84b..3486f2ea4 100644 --- a/docs/sphinx/source/zh_CN/3-deployment/3-framework_migration/2-from_legged_gym.md +++ b/docs/sphinx/source/zh_CN/3-deployment/3-framework_migration/2-from_legged_gym.md @@ -32,7 +32,7 @@ Legged Gym 曾是那套 GPU 常驻的 PPO 模板,教会了整个领域如何 2. 在 `src/unilab/tasks/locomotion//` 下创建一个任务模块。 3. 镜像你的 reward 项;保持名称相同,以便 reward 一致性可被 diff。 4. 翻译命令采样 —— 在 owner YAML 的 `env.commands` 下配置 - `UniformVelocityCommandCfg`,参考 Go1 flat owner。 + `UniformVelocityCommandCfg`,参考 `go2_joystick_flat` owner。 5. 翻译地形 —— Legged Gym 的高度场生成器在 UniLab 中有一个对应物,位于 `unilab.terrains.heightfield_terrains`。 diff --git a/docs/sphinx/source/zh_CN/4-developer_guide/3-extending/4-new_terrain.md b/docs/sphinx/source/zh_CN/4-developer_guide/3-extending/4-new_terrain.md index 47f0d958b..563878a64 100644 --- a/docs/sphinx/source/zh_CN/4-developer_guide/3-extending/4-new_terrain.md +++ b/docs/sphinx/source/zh_CN/4-developer_guide/3-extending/4-new_terrain.md @@ -25,8 +25,6 @@ - 地形生成器形状与数值行为: `tests/terrains/test_terrain_generator.py` - Rough locomotion 高度扫描与 spawn 行为: - `tests/envs/locomotion/test_go2_rough_height_scan.py`、 - `tests/envs/locomotion/test_go2_terrain_spawn.py`、 `tests/envs/locomotion/test_terrain_spawn.py` - 后端 materialization 边界:`tests/utils/test_xml_utils.py` diff --git a/pyproject.rocm.toml b/pyproject.rocm.toml index 10536bdd5..3956a3fa9 100644 --- a/pyproject.rocm.toml +++ b/pyproject.rocm.toml @@ -163,7 +163,6 @@ venv = ".venv" include = ["src/unilab"] exclude = [ "src/unilab/envs/", # lazy optional `mujoco` import; not installed in the pyright env - "src/unilab/utils/monitoring.py", # optional pynvml/psutil deps "src/unilab/visualization/", # direct mujoco C bindings + optional viser deps ] reportMissingImports = "warning" diff --git a/pyproject.toml b/pyproject.toml index 8e63ba820..8a3057fd7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -250,7 +250,6 @@ venv = ".venv" include = ["src/unilab"] exclude = [ "src/unilab/envs/", # lazy optional `mujoco` import; not installed in the pyright env - "src/unilab/utils/monitoring.py", # optional pynvml/psutil deps "src/unilab/visualization/", # direct mujoco C bindings + optional viser deps ] reportMissingImports = "warning" diff --git a/scripts/benchmark/env/benchmark_postprocess.py b/scripts/benchmark/env/benchmark_postprocess.py deleted file mode 100644 index 1b5aff3bd..000000000 --- a/scripts/benchmark/env/benchmark_postprocess.py +++ /dev/null @@ -1,1149 +0,0 @@ -import argparse -import json -import math -import sys -import time -from datetime import datetime -from pathlib import Path - -_REPO_ROOT = Path(__file__).resolve().parents[3] -if str(_REPO_ROOT) not in sys.path: - sys.path.insert(0, str(_REPO_ROOT)) - -import matplotlib - -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import mlx.core as mx -import numpy as np -import torch -from mujoco import rollout as mj_rollout - -from unilab.base import registry - - -def ensure_registries() -> None: - """Import locomotion env modules so they are registered.""" - - -from scripts.benchmark.core.device_info import get_device_info_dict, get_device_info_line -from scripts.benchmark.core.task_names import locomotion_env_name - -DEFAULT_ENV_LIST = [256, 512, 1024, 2048, 4096] -DEFAULT_ITERS = 200 -OUTPUT_DIR = Path("scripts/benchmark/outputs/postprocess") -OUTPUT_JSON = OUTPUT_DIR / "latest_postprocess_benchmark.json" -OUTPUT_PNG = OUTPUT_DIR / "latest_postprocess_latency.png" -TORCH_DEVICE = "mps" -OWNER_TASK_ID = "go2_joystick_flat" -ENV_TASK_NAME = locomotion_env_name(OWNER_TASK_ID) - - -def sync_torch_mps(): - if torch.backends.mps.is_available(): - torch.mps.synchronize() - - -def parse_env_list(raw: str) -> list[int]: - if not raw: - return DEFAULT_ENV_LIST - return [int(x.strip()) for x in raw.split(",") if x.strip()] - - -def geomean(values: list[float]) -> float: - vals = [v for v in values if v > 0.0] - if not vals: - return 0.0 - return float(math.exp(sum(math.log(v) for v in vals) / len(vals))) - - -def build_go1_layout() -> dict: - env = registry.make(ENV_TASK_NAME, num_envs=1, sim_backend="mujoco") - layout = { - "sensor_dim": int(env.model.nsensordata), - "physics_dim": int(env.physics_state_dim), - "num_action": int(env.action_space.shape[0]), - "idx_linvel": env.idx_linvel, - "idx_gyro": env.idx_gyro, - "idx_global_linvel": env.idx_global_linvel, - "idx_upvector": env.idx_upvector, - "idx_qpos": int(env._idx_qpos), - "idx_qvel": int(env._idx_qvel), - "nq": int(env.nq), - "nv": int(env.nv), - "default_angles": np.asarray(env.default_angles, dtype=np.float32).copy(), - "tracking_sigma": float(env.cfg.reward_config.tracking_sigma), - "base_height_target": float(env.cfg.reward_config.base_height_target), - "ctrl_dt": float(env.cfg.ctrl_dt), - "reward_scales": dict(env.cfg.reward_config.scales), - "obs_dim": int(env.observation_space.shape[0]), - "command_low": np.asarray(env.cfg.commands.vel_limit[0], dtype=np.float32), - "command_high": np.asarray(env.cfg.commands.vel_limit[1], dtype=np.float32), - } - env.close() - return layout - - -def measure_physics_step_ms(num_envs: int, iters: int) -> float: - env = registry.make(ENV_TASK_NAME, num_envs=num_envs, sim_backend="mujoco") - try: - initial_state, _, _ = env.reset(np.arange(env.num_envs)) - action_low = env.action_space.low.astype(np.float32) - action_high = env.action_space.high.astype(np.float32) - actions = np.random.uniform( - action_low, action_high, size=(env.num_envs, env.action_space.shape[0]) - ).astype(np.float32) - - for _ in range(20): - _ = env.step(actions) - - elapsed = 0.0 - for _ in range(iters): - t0 = time.perf_counter() - _ = env.step(actions) - t1 = time.perf_counter() - elapsed += t1 - t0 - return elapsed / iters * 1000.0 - finally: - env.close() - - -def measure_physics_step_rollout_ms(num_envs: int, iters: int) -> float: - """Measure pure MuJoCo physics stepping via mujoco.rollout.""" - env = registry.make(ENV_TASK_NAME, num_envs=num_envs, sim_backend="mujoco") - try: - initial_state, _, _ = env.reset(np.arange(env.num_envs)) - action_low = env.action_space.low.astype(np.float32) - action_high = env.action_space.high.astype(np.float32) - actions_np = np.random.uniform( - action_low, - action_high, - size=(env.num_envs, env.action_space.shape[0]), - ).astype(np.float32) - control_np = np.broadcast_to( - actions_np[:, None, :], - (env.num_envs, env.cfg.sim_substeps, env.action_space.shape[0]), - ).copy() - state_buf = np.empty( - (env.num_envs, env.cfg.sim_substeps, env.physics_state_dim), dtype=np.float32 - ) - sensor_buf = np.empty( - (env.num_envs, env.cfg.sim_substeps, env.model.nsensordata), dtype=np.float32 - ) - model_batch = [env._model] * env.num_envs - with mj_rollout.Rollout(nthread=env._n_threads) as runner: - for _ in range(20): - runner.rollout( - model_batch, - env._worker_data, - initial_state, - control_np, - nstep=env.cfg.sim_substeps, - state=state_buf, - sensordata=sensor_buf, - ) - initial_state = state_buf[:, -1, :].copy() - - elapsed = 0.0 - for _ in range(iters): - t0 = time.perf_counter() - runner.rollout( - model_batch, - env._worker_data, - initial_state, - control_np, - nstep=env.cfg.sim_substeps, - state=state_buf, - sensordata=sensor_buf, - ) - t1 = time.perf_counter() - elapsed += t1 - t0 - initial_state = state_buf[:, -1, :].copy() - return elapsed / iters * 1000.0 - finally: - env.close() - - -def measure_rollout_bridge_mlx_pipeline_ms( - num_envs: int, - iters: int, - idx_mx: dict, - scalars_mx: dict, -) -> dict: - """End-to-end: MLX action -> MuJoCo rollout -> MLX sensordata/reward.""" - env = registry.make(ENV_TASK_NAME, num_envs=num_envs, sim_backend="mujoco") - try: - initial_state, _, reset_info = env.reset(np.arange(env.num_envs)) - action_low = env.action_space.low.astype(np.float32) - action_high = env.action_space.high.astype(np.float32) - actions_np = np.random.uniform( - action_low, action_high, size=(env.num_envs, env.action_space.shape[0]) - ).astype(np.float32) - actions_mx = mx.array(actions_np, dtype=mx.float32) - last_actions_mx = mx.zeros_like(actions_mx) - commands_mx = mx.array(reset_info["commands"], dtype=mx.float32) - - # Zero-order hold across MuJoCo substeps. - control_mx = mx.broadcast_to( - actions_mx[:, None, :], (env.num_envs, env.cfg.sim_substeps, env.action_space.shape[0]) - ) - control_np = np.array(control_mx) - state_buf = np.empty( - (env.num_envs, env.cfg.sim_substeps, env.physics_state_dim), dtype=np.float32 - ) - sensor_buf = np.empty( - (env.num_envs, env.cfg.sim_substeps, env.model.nsensordata), dtype=np.float32 - ) - mx.eval(control_mx, commands_mx, last_actions_mx) - model_batch = [env._model] * env.num_envs - with mj_rollout.Rollout(nthread=env._n_threads) as runner: - for _ in range(10): - runner.rollout( - model_batch, - env._worker_data, - initial_state=initial_state, - control=control_np, - nstep=env.cfg.sim_substeps, - state=state_buf, - sensordata=sensor_buf, - ) - last_state = state_buf[:, -1, :].copy() - last_sensor = sensor_buf[:, -1, :] - last_state_mx = mx.array(last_state, dtype=mx.float32) - last_sensor_mx = mx.array(last_sensor, dtype=mx.float32) - obs_mx, rew_mx, done_mx = mlx_postprocess_go1( - sensor_mx=last_sensor_mx, - physics_mx=last_state_mx, - current_mx=actions_mx, - last_mx=last_actions_mx, - commands_mx=commands_mx, - idx_mx=idx_mx, - scalars=scalars_mx, - ) - mx.eval(obs_mx, rew_mx, done_mx) - initial_state = last_state - - rollout_elapsed = 0.0 - post_elapsed = 0.0 - for _ in range(iters): - t0 = time.perf_counter() - runner.rollout( - model_batch, - env._worker_data, - initial_state=initial_state, - control=control_np, - nstep=env.cfg.sim_substeps, - state=state_buf, - sensordata=sensor_buf, - ) - t1 = time.perf_counter() - last_state = state_buf[:, -1, :].copy() - last_sensor = sensor_buf[:, -1, :] - last_state_mx = mx.array(last_state, dtype=mx.float32) - last_sensor_mx = mx.array(last_sensor, dtype=mx.float32) - obs_mx, rew_mx, done_mx = mlx_postprocess_go1( - sensor_mx=last_sensor_mx, - physics_mx=last_state_mx, - current_mx=actions_mx, - last_mx=last_actions_mx, - commands_mx=commands_mx, - idx_mx=idx_mx, - scalars=scalars_mx, - ) - mx.eval(obs_mx, rew_mx, done_mx) - t2 = time.perf_counter() - rollout_elapsed += t1 - t0 - post_elapsed += t2 - t1 - initial_state = last_state - - rollout_ms = rollout_elapsed / iters * 1000.0 - post_ms = post_elapsed / iters * 1000.0 - return { - "rollout_with_mlx_action_ms": rollout_ms, - "mlx_postprocess_from_rollout_ms": post_ms, - "total_ms": rollout_ms + post_ms, - } - finally: - env.close() - - -def numpy_postprocess_go1( - sensor_data: np.ndarray, - physics_state: np.ndarray, - current_actions: np.ndarray, - last_actions: np.ndarray, - commands: np.ndarray, - layout: dict, -): - idx_lin = layout["idx_linvel"] - idx_gyro = layout["idx_gyro"] - idx_glin = layout["idx_global_linvel"] - idx_up = layout["idx_upvector"] - idx_qpos = layout["idx_qpos"] - idx_qvel = layout["idx_qvel"] - nq = layout["nq"] - nv = layout["nv"] - default_angles = layout["default_angles"] - scales = layout["reward_scales"] - - linear_vel = sensor_data[:, idx_lin] - gyro = sensor_data[:, idx_gyro] - global_linvel = sensor_data[:, idx_glin] - upvector = sensor_data[:, idx_up] - local_gravity = -upvector - - dof_pos = physics_state[:, idx_qpos + 7 : idx_qpos + nq] - dof_vel = physics_state[:, idx_qvel + 6 : idx_qvel + nv] - diff = dof_pos - default_angles - - obs = np.hstack( - [ - linear_vel, - gyro, - local_gravity, - diff, - dof_vel, - current_actions, - commands, - ] - ).astype(np.float32, copy=False) - - tracking_sigma = layout["tracking_sigma"] - tracking_lin_vel = np.exp( - -np.sum(np.square(commands[:, :2] - linear_vel[:, :2]), axis=1) / tracking_sigma - ) - tracking_ang_vel = np.exp(-np.square(commands[:, 2] - gyro[:, 2]) / tracking_sigma) - lin_vel_z = np.square(global_linvel[:, 2]) - ang_vel_xy = np.sum(np.square(gyro[:, :2]), axis=1) - base_height = np.square(physics_state[:, idx_qpos + 2] - layout["base_height_target"]) - action_rate = np.sum(np.square(current_actions - last_actions), axis=1) - similar_to_default = np.sum(np.abs(diff), axis=1) - - reward = ( - scales.get("tracking_lin_vel", 0.0) * tracking_lin_vel - + scales.get("tracking_ang_vel", 0.0) * tracking_ang_vel - + scales.get("lin_vel_z", 0.0) * lin_vel_z - + scales.get("ang_vel_xy", 0.0) * ang_vel_xy - + scales.get("base_height", 0.0) * base_height - + scales.get("action_rate", 0.0) * action_rate - + scales.get("similar_to_default", 0.0) * similar_to_default - ) - reward = (reward * layout["ctrl_dt"]).astype(np.float32, copy=False) - done = (upvector[:, 2] <= 0.5).astype(np.bool_) - return obs, reward, done - - -def torch_postprocess_go1( - sensor_t: torch.Tensor, - physics_t: torch.Tensor, - current_t: torch.Tensor, - last_t: torch.Tensor, - commands_t: torch.Tensor, - idx_t: dict, - scalars_t: dict, -): - linear_vel = sensor_t[:, idx_t["lin"]] - gyro = sensor_t[:, idx_t["gyro"]] - global_linvel = sensor_t[:, idx_t["glin"]] - upvector = sensor_t[:, idx_t["up"]] - local_gravity = -upvector - - dof_pos = physics_t[:, idx_t["qpos_start"] : idx_t["qpos_end"]] - dof_vel = physics_t[:, idx_t["qvel_start"] : idx_t["qvel_end"]] - diff = dof_pos - idx_t["default_angles"] - - obs = torch.hstack([linear_vel, gyro, local_gravity, diff, dof_vel, current_t, commands_t]) - - tracking_lin_vel = torch.exp( - -torch.sum((commands_t[:, :2] - linear_vel[:, :2]) ** 2, dim=1) - / scalars_t["tracking_sigma"] - ) - tracking_ang_vel = torch.exp( - -((commands_t[:, 2] - gyro[:, 2]) ** 2) / scalars_t["tracking_sigma"] - ) - lin_vel_z = global_linvel[:, 2] ** 2 - ang_vel_xy = torch.sum(gyro[:, :2] ** 2, dim=1) - base_height = (physics_t[:, idx_t["base_height_idx"]] - scalars_t["base_height_target"]) ** 2 - action_rate = torch.sum((current_t - last_t) ** 2, dim=1) - similar_to_default = torch.sum(torch.abs(diff), dim=1) - - reward = ( - scalars_t["tracking_lin_vel"] * tracking_lin_vel - + scalars_t["tracking_ang_vel"] * tracking_ang_vel - + scalars_t["lin_vel_z"] * lin_vel_z - + scalars_t["ang_vel_xy"] * ang_vel_xy - + scalars_t["base_height"] * base_height - + scalars_t["action_rate"] * action_rate - + scalars_t["similar_to_default"] * similar_to_default - ) * scalars_t["ctrl_dt"] - - done = upvector[:, 2] <= 0.5 - return obs, reward, done - - -def mlx_postprocess_go1( - sensor_mx: mx.array, - physics_mx: mx.array, - current_mx: mx.array, - last_mx: mx.array, - commands_mx: mx.array, - idx_mx: dict, - scalars: dict, -): - linear_vel = sensor_mx[:, idx_mx["lin"]] - gyro = sensor_mx[:, idx_mx["gyro"]] - global_linvel = sensor_mx[:, idx_mx["glin"]] - upvector = sensor_mx[:, idx_mx["up"]] - local_gravity = -upvector - - dof_pos = physics_mx[:, idx_mx["qpos_start"] : idx_mx["qpos_end"]] - dof_vel = physics_mx[:, idx_mx["qvel_start"] : idx_mx["qvel_end"]] - diff = dof_pos - idx_mx["default_angles"] - - obs = mx.concatenate( - [linear_vel, gyro, local_gravity, diff, dof_vel, current_mx, commands_mx], axis=1 - ) - - tracking_lin_vel = mx.exp( - -mx.sum((commands_mx[:, :2] - linear_vel[:, :2]) ** 2, axis=1) / scalars["tracking_sigma"] - ) - tracking_ang_vel = mx.exp(-((commands_mx[:, 2] - gyro[:, 2]) ** 2) / scalars["tracking_sigma"]) - lin_vel_z = global_linvel[:, 2] ** 2 - ang_vel_xy = mx.sum(gyro[:, :2] ** 2, axis=1) - base_height = (physics_mx[:, idx_mx["base_height_idx"]] - scalars["base_height_target"]) ** 2 - action_rate = mx.sum((current_mx - last_mx) ** 2, axis=1) - similar_to_default = mx.sum(mx.abs(diff), axis=1) - - reward = ( - scalars["tracking_lin_vel"] * tracking_lin_vel - + scalars["tracking_ang_vel"] * tracking_ang_vel - + scalars["lin_vel_z"] * lin_vel_z - + scalars["ang_vel_xy"] * ang_vel_xy - + scalars["base_height"] * base_height - + scalars["action_rate"] * action_rate - + scalars["similar_to_default"] * similar_to_default - ) * scalars["ctrl_dt"] - done = upvector[:, 2] <= 0.5 - return obs, reward, done - - -def bench_one_envnum(num_envs: int, iters: int, layout: dict): - try: - physics_step_env_wrapper_ms = measure_physics_step_ms(num_envs=num_envs, iters=iters) - except Exception: - physics_step_env_wrapper_ms = 0.0 - physics_step_rollout_ms = measure_physics_step_rollout_ms(num_envs=num_envs, iters=iters) - - sensor_np = np.random.randn(num_envs, layout["sensor_dim"]).astype(np.float32) - physics_np = np.random.randn(num_envs, layout["physics_dim"]).astype(np.float32) - current_actions_np = np.random.uniform(-1.0, 1.0, size=(num_envs, layout["num_action"])).astype( - np.float32 - ) - last_actions_np = np.random.uniform(-1.0, 1.0, size=(num_envs, layout["num_action"])).astype( - np.float32 - ) - commands_np = np.random.uniform( - low=layout["command_low"], - high=layout["command_high"], - size=(num_envs, 3), - ).astype(np.float32) - - idx_t = { - "lin": torch.as_tensor(layout["idx_linvel"], device=TORCH_DEVICE, dtype=torch.long), - "gyro": torch.as_tensor(layout["idx_gyro"], device=TORCH_DEVICE, dtype=torch.long), - "glin": torch.as_tensor(layout["idx_global_linvel"], device=TORCH_DEVICE, dtype=torch.long), - "up": torch.as_tensor(layout["idx_upvector"], device=TORCH_DEVICE, dtype=torch.long), - "qpos_start": int(layout["idx_qpos"] + 7), - "qpos_end": int(layout["idx_qpos"] + layout["nq"]), - "qvel_start": int(layout["idx_qvel"] + 6), - "qvel_end": int(layout["idx_qvel"] + layout["nv"]), - "base_height_idx": int(layout["idx_qpos"] + 2), - "default_angles": torch.as_tensor( - layout["default_angles"], device=TORCH_DEVICE, dtype=torch.float32 - ), - } - scalars_t = { - "tracking_sigma": torch.tensor( - layout["tracking_sigma"], device=TORCH_DEVICE, dtype=torch.float32 - ), - "base_height_target": torch.tensor( - layout["base_height_target"], device=TORCH_DEVICE, dtype=torch.float32 - ), - "ctrl_dt": torch.tensor(layout["ctrl_dt"], device=TORCH_DEVICE, dtype=torch.float32), - "tracking_lin_vel": torch.tensor( - layout["reward_scales"].get("tracking_lin_vel", 0.0), device=TORCH_DEVICE - ), - "tracking_ang_vel": torch.tensor( - layout["reward_scales"].get("tracking_ang_vel", 0.0), device=TORCH_DEVICE - ), - "lin_vel_z": torch.tensor( - layout["reward_scales"].get("lin_vel_z", 0.0), device=TORCH_DEVICE - ), - "ang_vel_xy": torch.tensor( - layout["reward_scales"].get("ang_vel_xy", 0.0), device=TORCH_DEVICE - ), - "base_height": torch.tensor( - layout["reward_scales"].get("base_height", 0.0), device=TORCH_DEVICE - ), - "action_rate": torch.tensor( - layout["reward_scales"].get("action_rate", 0.0), device=TORCH_DEVICE - ), - "similar_to_default": torch.tensor( - layout["reward_scales"].get("similar_to_default", 0.0), - device=TORCH_DEVICE, - ), - } - - idx_mx = { - "lin": mx.array(layout["idx_linvel"], dtype=mx.int32), - "gyro": mx.array(layout["idx_gyro"], dtype=mx.int32), - "glin": mx.array(layout["idx_global_linvel"], dtype=mx.int32), - "up": mx.array(layout["idx_upvector"], dtype=mx.int32), - "qpos_start": int(layout["idx_qpos"] + 7), - "qpos_end": int(layout["idx_qpos"] + layout["nq"]), - "qvel_start": int(layout["idx_qvel"] + 6), - "qvel_end": int(layout["idx_qvel"] + layout["nv"]), - "base_height_idx": int(layout["idx_qpos"] + 2), - "default_angles": mx.array(layout["default_angles"], dtype=mx.float32), - } - scalars_mx = { - "tracking_sigma": mx.array(layout["tracking_sigma"], dtype=mx.float32), - "base_height_target": mx.array(layout["base_height_target"], dtype=mx.float32), - "ctrl_dt": mx.array(layout["ctrl_dt"], dtype=mx.float32), - "tracking_lin_vel": mx.array( - layout["reward_scales"].get("tracking_lin_vel", 0.0), dtype=mx.float32 - ), - "tracking_ang_vel": mx.array( - layout["reward_scales"].get("tracking_ang_vel", 0.0), dtype=mx.float32 - ), - "lin_vel_z": mx.array(layout["reward_scales"].get("lin_vel_z", 0.0), dtype=mx.float32), - "ang_vel_xy": mx.array(layout["reward_scales"].get("ang_vel_xy", 0.0), dtype=mx.float32), - "base_height": mx.array(layout["reward_scales"].get("base_height", 0.0), dtype=mx.float32), - "action_rate": mx.array(layout["reward_scales"].get("action_rate", 0.0), dtype=mx.float32), - "similar_to_default": mx.array( - layout["reward_scales"].get("similar_to_default", 0.0), dtype=mx.float32 - ), - } - try: - bridge_mlx = measure_rollout_bridge_mlx_pipeline_ms( - num_envs=num_envs, - iters=iters, - idx_mx=idx_mx, - scalars_mx=scalars_mx, - ) - except Exception: - bridge_mlx = { - "rollout_with_mlx_action_ms": 0.0, - "mlx_postprocess_from_rollout_ms": 0.0, - "total_ms": 0.0, - } - - # Warmup - for _ in range(20): - obs_np, rew_np, done_np = numpy_postprocess_go1( - sensor_np, physics_np, current_actions_np, last_actions_np, commands_np, layout - ) - _ = torch.as_tensor(obs_np, device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(rew_np, device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(done_np, device=TORCH_DEVICE, dtype=torch.bool) - for _ in range(20): - sensor_t = torch.as_tensor(sensor_np, device=TORCH_DEVICE, dtype=torch.float32) - physics_t = torch.as_tensor(physics_np, device=TORCH_DEVICE, dtype=torch.float32) - cur_t = torch.as_tensor(current_actions_np, device=TORCH_DEVICE, dtype=torch.float32) - last_t = torch.as_tensor(last_actions_np, device=TORCH_DEVICE, dtype=torch.float32) - cmd_t = torch.as_tensor(commands_np, device=TORCH_DEVICE, dtype=torch.float32) - _ = torch_postprocess_go1(sensor_t, physics_t, cur_t, last_t, cmd_t, idx_t, scalars_t) - for _ in range(20): - sensor_mx = mx.array(sensor_np, dtype=mx.float32) - physics_mx = mx.array(physics_np, dtype=mx.float32) - cur_mx = mx.array(current_actions_np, dtype=mx.float32) - last_mx = mx.array(last_actions_np, dtype=mx.float32) - cmd_mx = mx.array(commands_np, dtype=mx.float32) - _ = mlx_postprocess_go1(sensor_mx, physics_mx, cur_mx, last_mx, cmd_mx, idx_mx, scalars_mx) - sync_torch_mps() - - cpu_compute = 0.0 - cpu_transfer = 0.0 - cpu_to_mlx_compute = 0.0 - cpu_to_mlx_transfer = 0.0 - torch_transfer = 0.0 - torch_compute = 0.0 - mlx_transfer = 0.0 - mlx_compute = 0.0 - mlx_torch_transfer = 0.0 - mlx_torch_compute = 0.0 - mlx_to_torch_transfer = 0.0 - - for _ in range(iters): - t0 = time.perf_counter() - obs_np, rew_np, done_np = numpy_postprocess_go1( - sensor_np, physics_np, current_actions_np, last_actions_np, commands_np, layout - ) - t1 = time.perf_counter() - _ = torch.as_tensor(obs_np, device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(rew_np, device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(done_np, device=TORCH_DEVICE, dtype=torch.bool) - sync_torch_mps() - t2 = time.perf_counter() - cpu_compute += t1 - t0 - cpu_transfer += t2 - t1 - - for _ in range(iters): - t0 = time.perf_counter() - obs_np, rew_np, done_np = numpy_postprocess_go1( - sensor_np, physics_np, current_actions_np, last_actions_np, commands_np, layout - ) - t1 = time.perf_counter() - obs_mx = mx.array(obs_np, dtype=mx.float32) - rew_mx = mx.array(rew_np, dtype=mx.float32) - done_mx = mx.array(done_np, dtype=mx.bool_) - mx.eval(obs_mx, rew_mx, done_mx) - t2 = time.perf_counter() - cpu_to_mlx_compute += t1 - t0 - cpu_to_mlx_transfer += t2 - t1 - - for _ in range(iters): - t0 = time.perf_counter() - sensor_t = torch.as_tensor(sensor_np, device=TORCH_DEVICE, dtype=torch.float32) - physics_t = torch.as_tensor(physics_np, device=TORCH_DEVICE, dtype=torch.float32) - cur_t = torch.as_tensor(current_actions_np, device=TORCH_DEVICE, dtype=torch.float32) - last_t = torch.as_tensor(last_actions_np, device=TORCH_DEVICE, dtype=torch.float32) - cmd_t = torch.as_tensor(commands_np, device=TORCH_DEVICE, dtype=torch.float32) - sync_torch_mps() - t1 = time.perf_counter() - obs_t, rew_t, done_t = torch_postprocess_go1( - sensor_t, physics_t, cur_t, last_t, cmd_t, idx_t, scalars_t - ) - _ = obs_t, rew_t, done_t - sync_torch_mps() - t2 = time.perf_counter() - torch_transfer += t1 - t0 - torch_compute += t2 - t1 - - for _ in range(iters): - t0 = time.perf_counter() - sensor_mx = mx.array(sensor_np, dtype=mx.float32) - physics_mx = mx.array(physics_np, dtype=mx.float32) - cur_mx = mx.array(current_actions_np, dtype=mx.float32) - last_mx = mx.array(last_actions_np, dtype=mx.float32) - cmd_mx = mx.array(commands_np, dtype=mx.float32) - mx.eval(sensor_mx, physics_mx, cur_mx, last_mx, cmd_mx) - t1 = time.perf_counter() - obs_mx, rew_mx, done_mx = mlx_postprocess_go1( - sensor_mx, physics_mx, cur_mx, last_mx, cmd_mx, idx_mx, scalars_mx - ) - mx.eval(obs_mx, rew_mx, done_mx) - t2 = time.perf_counter() - mlx_transfer += t1 - t0 - mlx_compute += t2 - t1 - - for _ in range(iters): - t0 = time.perf_counter() - sensor_mx = mx.array(sensor_np, dtype=mx.float32) - physics_mx = mx.array(physics_np, dtype=mx.float32) - cur_mx = mx.array(current_actions_np, dtype=mx.float32) - last_mx = mx.array(last_actions_np, dtype=mx.float32) - cmd_mx = mx.array(commands_np, dtype=mx.float32) - mx.eval(sensor_mx, physics_mx, cur_mx, last_mx, cmd_mx) - t1 = time.perf_counter() - obs_mx, rew_mx, done_mx = mlx_postprocess_go1( - sensor_mx, physics_mx, cur_mx, last_mx, cmd_mx, idx_mx, scalars_mx - ) - mx.eval(obs_mx, rew_mx, done_mx) - t2 = time.perf_counter() - _ = torch.as_tensor(np.array(obs_mx), device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(np.array(rew_mx), device=TORCH_DEVICE, dtype=torch.float32) - _ = torch.as_tensor(np.array(done_mx), device=TORCH_DEVICE, dtype=torch.bool) - sync_torch_mps() - t3 = time.perf_counter() - mlx_torch_transfer += t1 - t0 - mlx_torch_compute += t2 - t1 - mlx_to_torch_transfer += t3 - t2 - - cpu_compute_ms = cpu_compute / iters * 1000.0 - cpu_transfer_ms = cpu_transfer / iters * 1000.0 - cpu_to_mlx_compute_ms = cpu_to_mlx_compute / iters * 1000.0 - cpu_to_mlx_transfer_ms = cpu_to_mlx_transfer / iters * 1000.0 - torch_transfer_ms = torch_transfer / iters * 1000.0 - torch_compute_ms = torch_compute / iters * 1000.0 - mlx_transfer_ms = mlx_transfer / iters * 1000.0 - mlx_compute_ms = mlx_compute / iters * 1000.0 - mlx_torch_transfer_ms = mlx_torch_transfer / iters * 1000.0 - mlx_torch_compute_ms = mlx_torch_compute / iters * 1000.0 - mlx_to_torch_transfer_ms = mlx_to_torch_transfer / iters * 1000.0 - - cpu_total_ms = cpu_compute_ms + cpu_transfer_ms - cpu_to_mlx_total_ms = cpu_to_mlx_compute_ms + cpu_to_mlx_transfer_ms - torch_total_ms = torch_transfer_ms + torch_compute_ms - mlx_total_ms = mlx_transfer_ms + mlx_compute_ms - mlx_to_torch_total_ms = mlx_torch_transfer_ms + mlx_torch_compute_ms + mlx_to_torch_transfer_ms - - return { - "num_envs": num_envs, - "iterations": iters, - "layout": { - "obs_dim": layout["obs_dim"], - "sensor_dim": layout["sensor_dim"], - "physics_dim": layout["physics_dim"], - "num_action": layout["num_action"], - }, - "physics_step_mode": { - "physics_step_rollout_ms": physics_step_rollout_ms, - "physics_step_env_wrapper_ms": physics_step_env_wrapper_ms, - }, - "mlx_rollout_bridge_mode": { - "rollout_with_mlx_action_ms": bridge_mlx["rollout_with_mlx_action_ms"], - "mlx_postprocess_from_rollout_ms": bridge_mlx["mlx_postprocess_from_rollout_ms"], - "total_ms": bridge_mlx["total_ms"], - }, - "cpu_numpy_mode": { - "compute_numpy_ms": cpu_compute_ms, - "transfer_obs_rew_done_to_torch_mps_ms": cpu_transfer_ms, - "total_ms": cpu_total_ms, - "total_with_physics_ms": cpu_total_ms + physics_step_rollout_ms, - }, - "cpu_numpy_to_mlx_mode": { - "compute_numpy_ms": cpu_to_mlx_compute_ms, - "transfer_obs_rew_done_to_mlx_ms": cpu_to_mlx_transfer_ms, - "total_ms": cpu_to_mlx_total_ms, - "total_with_physics_ms": cpu_to_mlx_total_ms + physics_step_rollout_ms, - }, - "torch_mps_mode": { - "transfer_all_numpy_to_torch_mps_ms": torch_transfer_ms, - "compute_postprocess_on_torch_mps_ms": torch_compute_ms, - "total_ms": torch_total_ms, - "total_with_physics_ms": torch_total_ms + physics_step_rollout_ms, - }, - "mlx_mode": { - "transfer_all_numpy_to_mlx_ms": mlx_transfer_ms, - "compute_postprocess_on_mlx_ms": mlx_compute_ms, - "total_ms": mlx_total_ms, - "total_with_physics_ms": mlx_total_ms + physics_step_rollout_ms, - }, - "mlx_to_torch_mps_mode": { - "transfer_all_numpy_to_mlx_ms": mlx_torch_transfer_ms, - "compute_postprocess_on_mlx_ms": mlx_torch_compute_ms, - "transfer_postprocess_result_mlx_to_torch_mps_ms": mlx_to_torch_transfer_ms, - "total_ms": mlx_to_torch_total_ms, - "total_with_physics_ms": mlx_to_torch_total_ms + physics_step_rollout_ms, - }, - "speedup_cpu_div_torch_mps": cpu_total_ms / torch_total_ms if torch_total_ms > 0 else 0.0, - "speedup_cpu_div_mlx": cpu_total_ms / mlx_total_ms if mlx_total_ms > 0 else 0.0, - "speedup_cpu_to_mlx_div_mlx": cpu_to_mlx_total_ms / mlx_total_ms - if mlx_total_ms > 0 - else 0.0, - "speedup_torch_mps_div_mlx": torch_total_ms / mlx_total_ms if mlx_total_ms > 0 else 0.0, - "speedup_cpu_div_mlx_to_torch_mps": cpu_total_ms / mlx_to_torch_total_ms - if mlx_to_torch_total_ms > 0 - else 0.0, - "speedup_torch_mps_div_mlx_to_torch_mps": torch_total_ms / mlx_to_torch_total_ms - if mlx_to_torch_total_ms > 0 - else 0.0, - } - - -def plot_results(results: list[dict], output_png: Path): - envs = [r["num_envs"] for r in results] - x = np.arange(len(envs), dtype=float) - w = 0.15 - - cpu_compute = np.array([r["cpu_numpy_mode"]["compute_numpy_ms"] for r in results]) - cpu_transfer = np.array( - [r["cpu_numpy_mode"]["transfer_obs_rew_done_to_torch_mps_ms"] for r in results] - ) - cpu_to_mlx_compute = np.array([r["cpu_numpy_to_mlx_mode"]["compute_numpy_ms"] for r in results]) - cpu_to_mlx_transfer = np.array( - [r["cpu_numpy_to_mlx_mode"]["transfer_obs_rew_done_to_mlx_ms"] for r in results] - ) - torch_transfer = np.array( - [r["torch_mps_mode"]["transfer_all_numpy_to_torch_mps_ms"] for r in results] - ) - torch_compute = np.array( - [r["torch_mps_mode"]["compute_postprocess_on_torch_mps_ms"] for r in results] - ) - mlx_transfer = np.array([r["mlx_mode"]["transfer_all_numpy_to_mlx_ms"] for r in results]) - mlx_compute = np.array([r["mlx_mode"]["compute_postprocess_on_mlx_ms"] for r in results]) - mlx_to_torch_transfer = np.array( - [ - r["mlx_to_torch_mps_mode"]["transfer_postprocess_result_mlx_to_torch_mps_ms"] - for r in results - ] - ) - physics_step = np.array([r["physics_step_mode"]["physics_step_rollout_ms"] for r in results]) - - fig, (ax_top, ax_bottom) = plt.subplots(2, 1, figsize=(13, 10), sharex=True) - x_cpu = x - 2.0 * w - x_cpu_mlx = x - 1.0 * w - x_torch = x - x_mlx = x + 1.0 * w - x_mlx_torch = x + 2.0 * w - - ax_top.bar(x_cpu, physics_step, w, label="Shared: MuJoCo physics step", color="#9AA0A6") - ax_top.bar(x_cpu_mlx, physics_step, w, label="_nolegend_", color="#9AA0A6") - ax_top.bar(x_torch, physics_step, w, label="_nolegend_", color="#9AA0A6") - ax_top.bar(x_mlx, physics_step, w, label="_nolegend_", color="#9AA0A6") - ax_top.bar(x_mlx_torch, physics_step, w, label="_nolegend_", color="#9AA0A6") - - ax_top.bar( - x_cpu, - cpu_compute, - w, - bottom=physics_step, - label="Path A (CPU->Torch): numpy compute", - color="#D99A9A", - ) - ax_top.bar( - x_cpu, - cpu_transfer, - w, - bottom=physics_step + cpu_compute, - label="Path A (CPU->Torch): obs/rew/done -> torch.mps", - color="#EBCED6", - ) - ax_top.bar( - x_cpu_mlx, - cpu_to_mlx_compute, - w, - bottom=physics_step, - label="Path B (CPU->MLX): numpy compute", - color="#D7B78B", - ) - ax_top.bar( - x_cpu_mlx, - cpu_to_mlx_transfer, - w, - bottom=physics_step + cpu_to_mlx_compute, - label="Path B (CPU->MLX): obs/rew/done -> mlx", - color="#EFD9B7", - ) - ax_top.bar( - x_torch, - torch_transfer, - w, - bottom=physics_step, - label="Path C (Torch native): numpy -> torch.mps", - color="#8FB3CC", - ) - ax_top.bar( - x_torch, - torch_compute, - w, - bottom=physics_step + torch_transfer, - label="Path C (Torch native): torch.mps compute", - color="#A8CFAE", - ) - ax_top.bar( - x_mlx, - mlx_transfer, - w, - bottom=physics_step, - label="Path D (MLX native): numpy -> mlx", - color="#E1B15A", - ) - ax_top.bar( - x_mlx, - mlx_compute, - w, - bottom=physics_step + mlx_transfer, - label="Path D (MLX native): mlx compute", - color="#F3D9A5", - ) - ax_top.bar( - x_mlx_torch, - mlx_transfer, - w, - bottom=physics_step, - label="Path E (MLX->Torch): numpy -> mlx", - color="#B78BD0", - ) - ax_top.bar( - x_mlx_torch, - mlx_compute, - w, - bottom=physics_step + mlx_transfer, - label="Path E (MLX->Torch): mlx compute", - color="#CDA9E4", - ) - ax_top.bar( - x_mlx_torch, - mlx_to_torch_transfer, - w, - bottom=physics_step + mlx_transfer + mlx_compute, - label="Path E (MLX->Torch): mlx result -> torch.mps", - color="#E7D0F4", - ) - - ax_bottom.bar( - x_cpu, cpu_compute, w, label="Path A (CPU->Torch): numpy compute", color="#D99A9A" - ) - ax_bottom.bar( - x_cpu, - cpu_transfer, - w, - bottom=cpu_compute, - label="Path A (CPU->Torch): obs/rew/done -> torch.mps", - color="#EBCED6", - ) - ax_bottom.bar( - x_cpu_mlx, cpu_to_mlx_compute, w, label="Path B (CPU->MLX): numpy compute", color="#D7B78B" - ) - ax_bottom.bar( - x_cpu_mlx, - cpu_to_mlx_transfer, - w, - bottom=cpu_to_mlx_compute, - label="Path B (CPU->MLX): obs/rew/done -> mlx", - color="#EFD9B7", - ) - ax_bottom.bar( - x_torch, - torch_transfer, - w, - label="Path C (Torch native): numpy -> torch.mps", - color="#8FB3CC", - ) - ax_bottom.bar( - x_torch, - torch_compute, - w, - bottom=torch_transfer, - label="Path C (Torch native): torch.mps compute", - color="#A8CFAE", - ) - ax_bottom.bar( - x_mlx, mlx_transfer, w, label="Path D (MLX native): numpy -> mlx", color="#E1B15A" - ) - ax_bottom.bar( - x_mlx, - mlx_compute, - w, - bottom=mlx_transfer, - label="Path D (MLX native): mlx compute", - color="#F3D9A5", - ) - ax_bottom.bar( - x_mlx_torch, mlx_transfer, w, label="Path E (MLX->Torch): numpy -> mlx", color="#B78BD0" - ) - ax_bottom.bar( - x_mlx_torch, - mlx_compute, - w, - bottom=mlx_transfer, - label="Path E (MLX->Torch): mlx compute", - color="#CDA9E4", - ) - ax_bottom.bar( - x_mlx_torch, - mlx_to_torch_transfer, - w, - bottom=mlx_transfer + mlx_compute, - label="Path E (MLX->Torch): mlx result -> torch.mps", - color="#E7D0F4", - ) - - cpu_total = physics_step + cpu_compute + cpu_transfer - cpu_to_mlx_total = physics_step + cpu_to_mlx_compute + cpu_to_mlx_transfer - torch_total = physics_step + torch_transfer + torch_compute - mlx_total = physics_step + mlx_transfer + mlx_compute - mlx_to_torch_total = physics_step + mlx_transfer + mlx_compute + mlx_to_torch_transfer - cpu_post_total = cpu_compute + cpu_transfer - cpu_to_mlx_post_total = cpu_to_mlx_compute + cpu_to_mlx_transfer - torch_post_total = torch_transfer + torch_compute - mlx_post_total = mlx_transfer + mlx_compute - mlx_to_torch_post_total = mlx_transfer + mlx_compute + mlx_to_torch_transfer - - for i in range(len(envs)): - ax_top.text( - x_cpu[i], - cpu_total[i] + 0.03, - f"{cpu_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_top.text( - x_cpu_mlx[i], - cpu_to_mlx_total[i] + 0.03, - f"{cpu_to_mlx_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_top.text( - x_torch[i], - torch_total[i] + 0.03, - f"{torch_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_top.text( - x_mlx[i], - mlx_total[i] + 0.03, - f"{mlx_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_top.text( - x_mlx_torch[i], - mlx_to_torch_total[i] + 0.03, - f"{mlx_to_torch_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - - ax_bottom.text( - x_cpu[i], - cpu_post_total[i] + 0.03, - f"{cpu_post_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_bottom.text( - x_cpu_mlx[i], - cpu_to_mlx_post_total[i] + 0.03, - f"{cpu_to_mlx_post_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_bottom.text( - x_torch[i], - torch_post_total[i] + 0.03, - f"{torch_post_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_bottom.text( - x_mlx[i], - mlx_post_total[i] + 0.03, - f"{mlx_post_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - ax_bottom.text( - x_mlx_torch[i], - mlx_to_torch_post_total[i] + 0.03, - f"{mlx_to_torch_post_total[i]:.2f}", - ha="center", - va="bottom", - fontsize=8, - ) - - ax_top.set_title( - "Go1 latest step+postprocess (Top: with shared physics; Bottom: postprocess only)\n" - f"{get_device_info_line()}" - ) - ax_top.set_ylabel("Time per step (ms)") - ax_top.grid(axis="y", alpha=0.25) - ax_top.legend( - title="Execution paths", - loc="upper left", - bbox_to_anchor=(1.01, 1.0), - borderaxespad=0.0, - fontsize=8, - title_fontsize=9, - ) - - ax_bottom.set_xlabel("num_envs") - ax_bottom.set_ylabel("Postprocess time (ms)") - ax_bottom.set_xticks(x) - ax_bottom.set_xticklabels([str(v) for v in envs]) - ax_bottom.grid(axis="y", alpha=0.25) - fig.tight_layout() - output_png.parent.mkdir(parents=True, exist_ok=True) - fig.savefig(output_png, dpi=180) - plt.close(fig) - - -def main(): - ensure_registries() - parser = argparse.ArgumentParser() - parser.add_argument("--env_list", type=str, default=",".join(str(v) for v in DEFAULT_ENV_LIST)) - parser.add_argument("--iters", type=int, default=DEFAULT_ITERS) - parser.add_argument("--output_json", type=str, default=str(OUTPUT_JSON)) - parser.add_argument("--output_png", type=str, default=str(OUTPUT_PNG)) - args = parser.parse_args() - - if not torch.backends.mps.is_available(): - raise RuntimeError("Torch MPS is not available on this machine.") - - env_list = parse_env_list(args.env_list) - layout = build_go1_layout() - all_results = [] - for nenv in env_list: - one = bench_one_envnum(nenv, args.iters, layout) - all_results.append(one) - print( - f"[{nenv}] Physics(rollout)={one['physics_step_mode']['physics_step_rollout_ms']:.3f} ms, " - f"Physics(env_wrapper)={one['physics_step_mode']['physics_step_env_wrapper_ms']:.3f} ms, " - f"CPU={one['cpu_numpy_mode']['total_with_physics_ms']:.3f} ms, " - f"CPU->MLX={one['cpu_numpy_to_mlx_mode']['total_with_physics_ms']:.3f} ms, " - f"Torch.MPS={one['torch_mps_mode']['total_with_physics_ms']:.3f} ms, " - f"MLX={one['mlx_mode']['total_with_physics_ms']:.3f} ms, " - f"MLX->Torch.MPS={one['mlx_to_torch_mps_mode']['total_with_physics_ms']:.3f} ms, " - f"MLXBridge(rollout+post)={one['mlx_rollout_bridge_mode']['total_ms']:.3f} ms, " - f"cpu/torch={one['speedup_cpu_div_torch_mps']:.3f}, " - f"cpu/mlx={one['speedup_cpu_div_mlx']:.3f}, " - f"cpu->mlx/mlx={one['speedup_cpu_to_mlx_div_mlx']:.3f}, " - f"torch/mlx={one['speedup_torch_mps_div_mlx']:.3f}, " - f"cpu/mlx->torch={one['speedup_cpu_div_mlx_to_torch_mps']:.3f}, " - f"torch/mlx->torch={one['speedup_torch_mps_div_mlx_to_torch_mps']:.3f}" - ) - - output_json = Path(args.output_json) - output_png = Path(args.output_png) - output_json.parent.mkdir(parents=True, exist_ok=True) - payload = { - "meta": { - "timestamp": datetime.now().isoformat(timespec="seconds"), - "device_info": get_device_info_dict(), - "device_torch": TORCH_DEVICE, - "device_mlx": "mlx", - "torch_version": torch.__version__, - "mps_built": bool(torch.backends.mps.is_built()), - "mps_available": bool(torch.backends.mps.is_available()), - "env_list": env_list, - "iters": args.iters, - "task": OWNER_TASK_ID, - "env_task_name": ENV_TASK_NAME, - "note": ( - "Postprocess logic synchronized with latest " - f"{OWNER_TASK_ID} (env: {ENV_TASK_NAME}); physics step uses mujoco.rollout." - ), - }, - "summary": { - "geomean_speedup_cpu_over_mlx_postprocess": geomean( - [r["speedup_cpu_div_mlx"] for r in all_results] - ), - "geomean_speedup_cpu_to_mlx_over_mlx_postprocess": geomean( - [r["speedup_cpu_to_mlx_div_mlx"] for r in all_results] - ), - "geomean_speedup_torch_over_mlx_postprocess": geomean( - [r["speedup_torch_mps_div_mlx"] for r in all_results] - ), - "geomean_env_wrapper_over_rollout_physics": geomean( - [ - r["physics_step_mode"]["physics_step_env_wrapper_ms"] - / max(r["physics_step_mode"]["physics_step_rollout_ms"], 1e-12) - for r in all_results - ] - ), - }, - "results": all_results, - } - with output_json.open("w", encoding="utf-8") as f: - json.dump(payload, f, indent=2) - - plot_results(all_results, output_png) - print(f"Saved JSON: {output_json}") - print(f"Saved PNG: {output_png}") - - -if __name__ == "__main__": - main() diff --git a/scripts/benchmark/physics/benchmark_mujoco_rollout_model_sharing.py b/scripts/benchmark/physics/benchmark_mujoco_rollout_model_sharing.py index 61e607b64..00f54da2f 100644 --- a/scripts/benchmark/physics/benchmark_mujoco_rollout_model_sharing.py +++ b/scripts/benchmark/physics/benchmark_mujoco_rollout_model_sharing.py @@ -670,7 +670,7 @@ def _plot_summary_plots( def main() -> None: parser = argparse.ArgumentParser( description=( - "Benchmark MuJoCo rollout on go1/go2/g1: shared single model vs " + "Benchmark MuJoCo rollout on go2/g1: shared single model vs " "per-env distinct models, optionally before/after discardvisual" ) ) @@ -683,7 +683,7 @@ def main() -> None: parser.add_argument( "--robots", type=str, - default="go1,go2,g1", + default="go2,g1", help="Comma separated robot names to benchmark from src/unilab/assets/robots.", ) parser.add_argument( diff --git a/scripts/benchmark/xmls/humanoid/humanoid100.xml b/scripts/benchmark/xmls/humanoid/humanoid100.xml deleted file mode 100644 index e7fef05bb..000000000 --- a/scripts/benchmark/xmls/humanoid/humanoid100.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - diff --git a/scripts/convert_motion_29dof_to_23dof.py b/scripts/convert_motion_29dof_to_23dof.py deleted file mode 100644 index f90ee6f82..000000000 --- a/scripts/convert_motion_29dof_to_23dof.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env python3 -"""Convert 29-DoF G1 motion NPZ files to 23-DoF. - -Removes the 6 RM (redundant manipulator) joints: - - waist_roll_joint, waist_pitch_joint - - left_wrist_pitch_joint, left_wrist_yaw_joint - - right_wrist_pitch_joint, right_wrist_yaw_joint - -And maps body data from 31-body 29-DoF XML order to 24-body 23-DoF XML order. - -29-DoF joint indices to remove (0-indexed): [13, 14, 20, 21, 27, 28] -29-DoF body indices to keep (0-indexed): [0..12, 15..20, 23..27] - → maps to 24 bodies in 23-DoF XML order (pelvis + 23 links) -""" - -from __future__ import annotations - -import argparse -from pathlib import Path - -import numpy as np - -# 29-DoF joint indices to REMOVE (0-indexed) -# waist_roll=13, waist_pitch=14, left_wrist_pitch=20, left_wrist_yaw=21, -# right_wrist_pitch=27, right_wrist_yaw=28 -JOINT_REMOVE_IDX = [13, 14, 20, 21, 27, 28] - -# 29-DoF body indices to KEEP → 25 bodies in 23-DoF NPZ order -# -# The exported NPZ includes the MuJoCo world body (id=0) at index 0, -# so NPZ index = MuJoCo body ID for all child bodies. -# Keeping: world(0), pelvis→right_ankle_roll(1-13), -# torso_link→left_wrist_roll_link(16-21), -# right_shoulder_pitch_link→right_wrist_roll_link(24-28) -BODY_KEEP_IDX = [ - 0, # world body (MuJoCo id=0) - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, # pelvis → right_ankle_roll_link - 16, - 17, - 18, - 19, - 20, - 21, # torso_link → left_wrist_roll_link - 24, - 25, - 26, - 27, - 28, # right_shoulder_pitch_link → right_wrist_roll_link -] -# Result: 25 bodies (world + 24 child bodies matching 23-DoF XML body order) -# MuJoCo body ID directly indexes into this array (NPZ index = MuJoCo body ID). - - -def convert_motion_npz(src_path: Path, dst_path: Path, is_box: bool = False) -> None: - """Convert a 29-DoF motion NPZ to 23-DoF and save.""" - data = np.load(src_path, allow_pickle=True) - - # Build output dict - out: dict[str, np.ndarray] = {} - - # Copy fps (no change) - out["fps"] = data["fps"] - - # Joint data: remove 6 RM joint columns - joint_keep = [i for i in range(data["joint_pos"].shape[1]) if i not in JOINT_REMOVE_IDX] - assert len(joint_keep) == 23, f"Expected 23 kept joints, got {len(joint_keep)}" - out["joint_pos"] = data["joint_pos"][:, joint_keep] - out["joint_vel"] = data["joint_vel"][:, joint_keep] - - # Body data: keep only mapped body indices - assert len(BODY_KEEP_IDX) == 25, ( - f"Expected 25 kept bodies (world + 24 child), got {len(BODY_KEEP_IDX)}" - ) - for key in ("body_pos_w", "body_quat_w", "body_lin_vel_w", "body_ang_vel_w"): - out[key] = data[key][:, BODY_KEEP_IDX] - - # Object data (box tracking): pass through unchanged - object_keys = ("object_pos_w", "object_quat_w", "object_lin_vel_w", "object_ang_vel_w") - for key in object_keys: - if key in data: - out[key] = data[key] - - # Save - dst_path.parent.mkdir(parents=True, exist_ok=True) - np.savez_compressed(dst_path, **out) - - # Print summary - src_shapes = {k: data[k].shape for k in data.keys()} - dst_shapes = {k: out[k].shape for k in out.keys()} - print(f"Converted: {src_path.name}") - print(f" Source shapes: {src_shapes}") - print(f" Output shapes: {dst_shapes}") - print(f" Saved to: {dst_path}") - - -def main() -> None: - parser = argparse.ArgumentParser(description="Convert 29-DoF G1 motion NPZ files to 23-DoF") - parser.add_argument( - "input", - nargs="*", - help="Input NPZ files (default: predefined G1 motion files)", - ) - parser.add_argument( - "--output-dir", - "-o", - type=Path, - default=None, - help="Output directory (default: same as input dir + '_23dof' suffix)", - ) - parser.add_argument( - "--suffix", - default="_23dof", - help="Suffix for output files (default: _23dof)", - ) - parser.add_argument( - "--copy-box-object-data", - action="store_true", - help="Copy object pose data for box tracking files", - ) - args = parser.parse_args() - - # Default: convert the known 29-DoF motion files - motion_root = ( - Path(__file__).resolve().parent.parent / "src" / "unilab" / "assets" / "motions" / "g1" - ) - - default_inputs = [ - motion_root / "flip_360_001__A304.npz", - motion_root / "flip_from_wall_104__A304.npz", - motion_root / "sub3_largebox_003_boxconverted.npz", - ] - - inputs = [Path(p) for p in args.input] if args.input else default_inputs - - for src_path in inputs: - if not src_path.exists(): - print(f"WARNING: {src_path} not found, skipping") - continue - - if args.output_dir: - dst_dir = args.output_dir - else: - # Default: same directory - dst_dir = src_path.parent - - stem = src_path.stem # e.g. "flip_360_001__A304" - dst_name = f"{stem}{args.suffix}.npz" - dst_path = dst_dir / dst_name - - is_box = "box" in stem.lower() or "largebox" in stem.lower() - convert_motion_npz(src_path, dst_path, is_box=is_box) - - -if __name__ == "__main__": - main() diff --git a/src/unilab/assets/motions/g1/23dof_amp/.gitkeep b/src/unilab/assets/motions/g1/23dof_amp/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/unilab/assets/robots/hfields/hfield.png b/src/unilab/assets/robots/hfields/hfield.png deleted file mode 100644 index 7b48e7205a42849979597cfcf47c239e4c738f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273966 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%0Ad{M{Z%|KqLg&_U0ZWrtHQLBzbpzYHZb~F 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

WJg{-DaI|3!vh){=!y32whp~ zuM+C`8HR93$r)`%B+bF5cWsb}rol=|55hxl-Y?qk=JzP?$trWvjwET~p*0Uj4?^=1 zq6~rs9;teYM{p!yJumB~hGjYif5fH(>RAEk_no@g)z0`>JkLW^$ZSV2;$U{4-YFn-;VgP zlJw!nvf-K~fm9|~V&7QL`v~7?*=j)CVQc*c+s`JZ_2*K%#xd(=CYwyO?{^VGWf;&a zQ@En!VGO~guSOW?6&aU`%e-gIQLFL4BPiG1q0;L}zj;UA;;!lXa}@^rkk&O=cKVZ= zcEOMjeJEYGk#ynR)w2i+7h_UXp_21Fwz8NojZC41lNd#uMoSQNmA$8%?_(378I~W) z(p%Z~TW5P_)Etz;v`%?{4x85jM;8N~w8R2RqRkgHmqpXXK@kw2Tzd8$NA=ipzAWDO zjc7ZCQB*XqvI%k~0=^^r$mH*902ZRYpw5+VdU>GHhED6UlY{@mmI_bWwB`Ao2+BmF zGF?sC(U!1BYsYm+Tx1e!8^sVlJP%VLV`?dFfAY)&xKRIG7us0)mf{kB^p6VPr zEcKc8Z7JLz7g0Ko*Yi~Z3Op1?g!KFyq1TJ`$meTLsD#+H9Y`%HZ>BM6#q)yo4jpY_ z>I3YjbFkeH2V7Re?d;^p2$JmU=xCI2N`B z>Z-a#a{2nf{`B{bbjB2&Npw$^I2$(*RGvh*$Wvu4O%(3tV76A|VZ0)Tto?@eR_rgh zYxl`YlT|J<8>2!VWBnY6stmeUF0Ls#?@(&{TYb)uN-wo0J#umQ*_CiAXhs(h)P@yX zyqaDhg6n;24H%`9jvT+gx$a70_wbym@<1APkTLNX0%k&F2(!dwUrm^-TrD9lupy}7 z_}0w`d`PrE(vN-(EM9t|*4>fMM_@6sen#M1n&o^F`}f8#AtgXy$ZxZj<~2SVjCRK3 z*A{_Nb&iWOj=5j;ilBId4(+FcmR(50^dm$V+mplv!iyGPx;oI>;+o!#z3`)^hbHUTLX2)qUh_IJ?%t}(|b1;tH9NzJOgc46rqU~8x1UN>#b@% zho9jfG@^!;!-CC+IqA#t+OA1_pD@Dk5oEW`^;lpRCdWdn)v&c=oiIE(QOXBrus+CB5t@~lMw zwo;rcT~p)wcLBK{p;-7dOP|m;Zy-owR|W*Plny;8dUPRj2u!m`GozChKi*?>@nPRJ zQ;ilGOrHSZuO)!t(W1H?;X10Qdob86qRZMvi!SdtU!m)8SHpqDW^=a0$g?f zD%Z^B!*h8uN%EBg!74v~IX^PF*a*D5*-stAW^2xX4Iec!-s$p3>A=&VfnTt5q? zJIr9W)~}F7v;VnlNLqtOa zV6Z=iI-BlH8c|nb;Hn$Y!p4bwJ&u{@0Ez7e_!pkYKlbYudm)QADVL>p>b!#Cvv@sB$?Z( zm(iZhNQ7yT)r;o&@Edv1h_zqVAFN=~2oBV!nzGU{ja*dbRX0XIg8X)c_LiO=%ABs8 z+zc`9mw>cIuP09t(bZ0KP=Y(DFwv_0EVV!j3=v%4C+5ijKCVl&Tm5i5LNB(Kt4D<44B$ z#-uUAT;PU+AH&?aDVBz&*psu$7|%BrWnDIC6TP?=oQVN#m!C-Oy#_@c7ZLI|=*?ks zFDyU_gR!A9yHxw2n4qrD4+u`wjK*^+wzR<9|72F z$6NW@kHP(DXjE>gz_tNI3?%p#J=XX!i*Znj*`Vca46j|rT1wZrWXbJJvadn)YAl$& zVe~G~yE7rfF^<;h+ORu+aUTeCZi~6W4lYgDy$9R>#G4b0=)C7dBzpaZ)KVvK|31yy zrS!YSzv}^&(SqLWyD+lEZ+p>fIQ1U%5rv>K&8{6e^{a8J zv2Q+?G8K{?@OG#$OIqRKQYFe;I)i)9F5e#$QeU#B9~8e<`+T|9?R|(nZmMKM(O_lL z733LP9J?2w`jV{ef*5HPGcHfFvF(LIQWif*)VKXPeXb4g=h!n{0v;bI1BLmt5fiVK zI3Gs-;74}v76R|({kN4w+_<t~oiSZje>%mDsK4>2XRr&x_0 zz5mjdL{42jE9Xo_yaeClxE{DuN9q@SjFNhLD0rniIWg5!u|Lk1-6wbH8S$HfOCRU z9~p^ZR?VD{kfX2PagKVE032KpFwr=YsGDd|H$6dFc0UIgIL=)&{uo8aa~jIA?XZ#y zN(NV4IIPZ?5uMI*AdU6nP-Kqpru!Qwk)R*WUR~GL6)(2h{0L7uYjmT6Cp&z()RxCo znoX^wqt{cN?aXV5ry?h{oF z$EVj2#IZw1Az2d>(ptNriZSyllvW*yVWk84j9Gaeq<8ZMq>S4Elz;1X!GKY=_f4OA*P4`;6sTQy=m3_%`~_?;j@KTlS`(`gj_{ zLNuy>{i$yT(p7}?ms1rEYpdF@$HevTpfyz0@jo?*VNmze52l)qnMapghg_@k@$k^o^C=LVww@!P4;D-VACu8< z*g#rGbrvO_nswa+wIH5o)yHgX`p}yr>!q%B6nRL=k_S4{j86{vQSH=ruu}2CI;-`> zLD!U-x@S@tTlIkC=K=XlW+|}-merMFvTZTo|J3%TKn+P8odaE`Ax+^34}i{^#Q32j zfPNIn{T@m$MPS{V#YFJ|iTxd`tk_Q}ZGYxz#B(H2RK8(AE70J42#lfTN2&Cy=%xIP zkB~ou!9dg*L28G+S6B!~1n2WL5^FJ=DWe8JN=J#j5a z=)2eF%R%UE)xHb!((2H(X;KilfURgcqdMx~4_6rQx9PI(oMRrwUq-WKT9~`&l|@k*yl1O zvwyQ!U2P%ED3ArZ4pX;Y$6N3Bc|=_9686o?m#1k@rJk5p2RYYpDONecgb<=4B9Y_{ z6#C~+fai?hpw@hV6n?S#II5l>9#Ot_L24df%k&Xsd@um=8LOR0DBLJ!BbMcD$!^-( zFgEs{A1O%@TzmcT`sjR5?4!^upa3tacFOhsLJ{Av?0(^0O^&*7e}Dr!R3Ta3*JZo# z-WVl&gIK`FFKgEzvh*N|1 zIgVn=>BLl60DlaC<&*xVc#a~-Ee!9%p|Ee+30>7X5e8sYp59yh9B`Q8p0Lfp_R(Gx zcI~Xr05ec>zF1;_A#z`!50*+ThbiEUlDRK;)QKpXFzP+ zFuqg&KBL(QFuZEaGKW#T1}1chZ+);mqhqI#m1^;~y6(3*lx`Z}R`1gpLXGDW!m&~| z+_1#vag;7tU4r)5j`le|h6VI&01a!MR;%3Zvm1?&zao9UK!prmOh42F6eqSMQ;5Ep zq4hg8>of#NuyeoK6Kj`YWj=uLC`Qn7ieK!h@48z#%>o5WIZz9Zq#1q&7G8~J5T-pE ziLshz=AB`fDBneGj>^rT0S+yTU%rP9(g`axzU6oXM$vD2-*hhJO{I?NGiDjM;ZrAH zD5YDCC-!e4gE6s{=;d65XV=)f4SH+Itv+EjxABvE0CP8UvW^K*uhhhg#gDoHWRsMn zZ!$ISs)lT5yK$kJ))QaAzb|)b2Evbf+*?7yi~KPS36;_x^8PoA%FpeJ_xi; zt)$uR_d~@(*sgxTb35jr$lZyliDd3Q=7NETPBIcd3iasf><({?gV5JAPcs{ASSh^y z21LI3#f<+@EgTvzaPr7{n|{d1y{_2UN0kWI=IZhu<&VZED+xw^8=snfty)cT$2muHTd~6*>shZ?iiHxGgk= z!Dv|9e!08`pNTy9+^tu8QOPiaj91uMqSriZqxDi&uIS2~$Aqe=uq`^>a8K|}cIc??YP{M-K$ zC^3kC_UMz2Oi#q}V-Wy5i`iC$Z#<3c%Xh)*#2DoS@`ngK9FL5b9%q$KY8gH{*>Q>l zMT&80^0>8HS17_wrs-p1a<}tekhz5huR!2DP6FYHLUbxv6t4x&5mO}CZISAHN7k-M z+~64YZCQrYBB=e_J&T8H{-RDV_s`^w5$NrI1H3rWnK5;3IeV@H=03wb^}L8MvD9f8 z(2$7<1SO=485F0d2d*qsEG#f@%yzDnGd161&3BUq%P%c*cI~+8c;=%7vnUU`$);OJ znUoI@)fgB35@9ritVOe0=iZ-7-DCe4UI6BAvU|dk<6M{(`sD6SsJhh2t(syHfZN?M zS_xZRX!<7^_v(2k-Z+Ahzu{l+q_hC)S8(O0M6RofVvC)OJ#^159UJ9T)PxP?yP3qV zO7D)xgOyfv+G;tEfcy$5TzT6K0$;}{m2xWo3#+YDj3D{z0R>t>bH^W{KZgm#bk8l8 zGFm`|^W#Sb|MRejMvG5BV-aq(e-b1k8(-R|*088&4xacM$K3O0d%BLK8XM7C~FS+2mJpm3v?MQn{n51J#3aK4D zIo7xLVC4x+O&T!&8<3&V#C_F9TGlm_w(d+PHo-^N!@AU<$FWDJ{Z)l7)f)9TWSVGc)7@Xtrd>7rk2Xi}F_@2j8GTa}enYT!#6|k9n9l z7a4L^A_h6&Uz-N7kRGEcs z2{N{FVKt}djvtnow47vVFH>R045U9FrR{zaw#Z&jJQf@KsiOO!QS11*^mKjC{|Hsp zx^YvPDSD=^5<mO>H=78GFEawJ52zO=K;EjQ5xNRUO)kxJ5!c@YVEA z+I{B2{SE}Y<72s76JEmvHUs{9l6mQ_Lo+^z~(*z^L~< zekbjD~POD<%k7EW2F2N(bc30V#?kPzkNb z0U^rG;TeJ=LnMufu5i1p<2^us`r-*CkT@vWSh>UY{^xjo{wlD?vK{~vZD%8B<2v$> z4mP9?Fg>L2Z}-iQh{lbbvoR*v9NcdcC>Pp?zm8PQMJd-ng^BW0qvD;s3M7_HzwCsy z@i-q4eY|0izTW$ZLI!4+s&lQHx4dt#HYe)BD~EMRlZG&&e|J{dUDpF3={)eui$rz!1Al8&x+eUk&nD)CJctwBruvb7AEN^3XYb*7vrdTjWK3K0& zqwtIve{qP9&n&7p`%l$G?!c!hh`TK6v8`AVmDNOAob%j95Nz{ELMnlKU!i z@6EVLe!XdEaSzc8f7cI%Z8NUvNNU5F^b!AM!lND<5RTshC2CJ;Yn5mMcHMxq1ZAHR zE;QGDy7yBYQ}7VNws&wkB?8;T$G;5F>P}&ypZGH>;^4FSXoCtNf8~rH-xiif_s9`^ zm%7t({kXN|N;ROf3#yFa(zPFv@T>Hx;Dic#)^gkdmr>UI%n$iuOGS#4jdB%^f%3Bq zgHu^|N{sysQ{2{gL)mEL{?s9xvr1dUs0lOY+6XIbUnahF8uzlSJb$GcNfPeULHx?j z47PAS)(pzk@Kt;1CpZBGowW3}K4C!_+VHEcl?n zxEFHy=gQT2Es9%m-fydQIh?pniKpG;H$d^J*KNe7F?jEOkX+r_mD5f>RPgJeEll&z zeaXYuZPckP4-yj_a>iA6e-LKzH&4w*+X2Nz2o?4F&gux{(bS(_3 zrG;v|W_(2IwUKi|bKNTO6q$rYs9>Ro1eaUUXW{H*l3wmCXT;;>!#s`AnU60a zFWcxj*+>3`T0RhI9&jA~K;S&0sj<$%x6d}RFBfJs#NJTxt__eyrm$z~UVputqadQ! zEx8;}QuUS_8g-cESCMXS%k!jFZK{kZ1uyaw?=kop6K(d=l`5FnIJNf4aj({}$ct+1 zX2E$qttRM1-cY-I+-6Ohvj^+*OTwhISpJw%T6t1#G}E$lB_LR6I_iERFibB9vAuN3 zc6gXso;OdIY5n9mm7m<&c$3oFu{906Fx5%>6k5Hg5CWw-_9Rh#!CPeIHIxCy3fuH?zIKS z3x!^}?k`XI?Mrl^oK8aeNO*Z4au6eP9e^!iI-K~iV6Ufa%W=GrB!q+{ZIz3N3-+&c zE%0!Uj!(y;h-6a>{mOasK;-({5itAfj8_ZC?B20SVb>rbC%4$SdA0bj*OM5G3<)Z$ zyo^>%-yB(uRI_5TGC2g{zCb`uUXDLhRjXsYSy95`!$ti-9`W~uK~_87O`{)r>)(vF zRr6gIPL4-n3OKMl)KqGdp)69{;T_YQ#M?hMG-qM*NxBnnuCdzg%)(iHLGpah-Z=?iUzSZcPa~O+ zVHHzE){7D=GLFaK%h8lV0t>dF09U3agbl8I*ozPnTUtCr*93VY>bcT%XCx71&@f*s z-T{HYKA*DNL27<38tsXU(?m|lzsgAuxDgbC6Xj-Qk)^j>Oh)o83NRKv@Z!*3VdpgmZ*4V5c<}JJ+=sV0^xockDqz z&xQ}>HcPgrsxRov6auWe&1-;sy&VI811(vwxkf1<0~_m9Tq(FL0c4%!*rau)ba3F%%vkbb5ioTO)K zIzrz9oi;g$XRk(Zg=5iWNIupt)}*g=x~ImnEDM$abr})=K%QdeYZ#*< za(>)vG_-KMGh;yn?>E>F6!a|bR4= z+*60FF)KJBdXvrn#wC%h@&3JqCxjbQ#0GacV(UU-P88NrY%u(j%TWDk+jn`|)m;9C zqf<0rO4e5m!~}pNrjdb=l;+@jWRK&-OyB7t0p%rpn3ghT_d%x=oKiXxVN&a`9F;8_ z+t7)$>aQGoPaqHOq;35?j}Y4Cx!&M(ykHxU3QK{jYbh5;A|TXhy2$EMB{>B(Fo)A0 zmTB#XQJUq1PTP_bl&>!B^8z|exn(%4(vQt-X=UGZmqn+{i~A9izvU|kBQUr)HqUN0 z-Ga$#*^S}Z!Hxt;$HG^Fuv8?~Eh~$+ORXK{H$Jvh%Ztc21d;ZtA`W~;`75w(1OC2^ zgp?0sAxehdHdNvIbszp~dbF_#N(KBV$ff&=p%VHwS}&dog)6@aWCdW?>fe^69~j-* zrk|R`WQ(=DDGU_>Li<-wMm*Fkm7Y$0nktI>TV4WpS{4x1qudq~e zP0?#hl~^JmuOWZ|MHhzg6yh)VzvI#v(sU_4K-LZL8N{Gysg&dDFBX=@#{v5(w`Br9 zgyqQhsGVYbw!aaG14_=?6G+Y#uZ}g&xAM5KFX>12_sp5)xv+MP%I@q1?@?)b>te-_ z_Bd5W^keo2B>y4mnn063+k!cS`||r{*A?rZh<$ymrE>VSl`}VoePaOs&x6y6=`d(3 zgjlg!bE99}56yPkjTKv{@FF!86ug=8#cNT5Rgla1eK!|uLUNgzd|z?b56>2+>&G(= z^yZOtr8^wt+0ka>kOTj)1+tn4Cjrc=N%LG)iaWLPQ(9!dN}*FaTOwXA(jbtu{P04C z#=cBAmykmW0%WL27_&_Hxs@%Stz+5(p99~GQ7hMFktLm>`IA5fmH%REK}bS})igZK zv!+(=JZY#1=#M%9a2>HYc&psy1Oae<4DF|b?l2d9GKi$PMH0q`HyF^1>2N~gmuoHU z&S(1}zI+#4e6`@3e`(k!mFTIYks^)!M)LQb8qF4bbC~j&1L6jGii9^-ud0vohCFh8?(~uIgej;o>rtPyUnhcN!E{DL2`Q=?-CGTV=;uE# zO2$`saCcA2ZV0}R2|Q8ri_3b7orAp1%jv4ZcAhhma5XjZa{1NLfC z5f+e&rl3>zj2^H@!saWv6tptA*AWO$>Cp5?e9%ydbmyc?MxeFQ+>|zSRB;ce zxMG=&Hzs-=7y5cW5Qr@6)=Sc?`~t z#_Xs!XzS(MTB#In39dtH(a^e#hi_te3$Hg4d0tQ_e`@9lD|#Sp#Jkzj+x|t%c_#l` zZ>V{SEU#YGF8=Q~D||xgrtB{D6ZLF2=hNi+bDYQS*Wi?*_jx^iAg`bk9;@H zDChf*MN$}qGQ{nZD7rky_|*is_4T383PoV_&l96y=0j*IVjj1*Q|@CEoHGMMX8YsAPzPv|v^i4s4S1Xz+${y^)!zKV3#@%X2;*K$zeR_o%*ZFu;$ zTxET|!Rhl8Q0Ih;Njra_@m3V5lwkI;b!OtX8ra_X*oN;#KBF_@#aKl{Rc|n(V=2Ul zMF2sdxj7ai8ZpXfCyH{ZNXg}grrj_UW@pIeCbpw88xAMQ?-wPO)P=0SFcqMNJ`v^Z zWTvS#19Pi0wySpGD4N5eH!#bEb;ZG=1sg37udJhv`=~+Ei~E`)>~-P6cz$fHrL2DG z;e|T0CZa~$NG@z4ZFbV5JbMP%XvL87h7wcM^6JK#ZEtGKa_~;$YQ<_S?4bO9g}N(i z+L={`qF_*v+Yb@QaJZ3sS|vmY48(&y0SMpTVKO;P_$wM6`*b_=5@e>a9zHPt?hOvQ zh9zq)^`MMhZJ-jB!^!**=vO%7K{bwJAQaiE1(ZP5JQzT4 z9_tg6>v5VbP7`mAPg1suLJ0!ZWUF64eGFMq;#sIGw#<%x2}~7%R8sXC5g?3Hi|)u( z{aKXU!1t{oju>=Vbo`NcJRaW!Fx)@)pj!zYzKJ)Q%}ACZ+ti}UwZm2_@xZ>%LTmXH zEg4(ZkJV%+R5fZ;#U$8-KxueZ(tPF3*eKyfe?u8giBlBM7!hnBOY3J%eaTk~8G@wz zj{ac_f6Ia^FtEsECdntq5isyd*CH~Bp{bl2E#W@eW)<90|8F#~Xq(dQ`&c?!qJSoS zB4+FJ2Y)=2OkdS0CFr7$K$0t^%|r=o+y!;XWE?1HYuT~K0l1KVR#BJQ_uU=}U&m1?#RadEEq z*DVm{S=s5&)UHr*mQ!yL8fL^(G@{;$Wc-`Rea9THA4kBx;+w6`G!$l0lwVTH+Q%yw z_PN+`Wl;ic|z~Qa($*wTwOKU23i2Cnq8v&|vl>AjkKg%C=QTkw{@E{Ie=FvgDJYU0m1i?{*47c6VV4$(d;QLQUpftrX9t%idU zIB_BZCloiZp}OSm>Ao_B%Np?6l?8Fe4zNYV1%^PSOU10?D=TH$Ez)gi2sVW8a<-P+ zhm$~dWeRTTHHCZ~%*~99%}VR1!+Xa#OzrOOXIDQ}(0>}tC7{;*j(_#?cP^K!q_eI1 z_Qf_<$=hJTgVTR=WMJ8pNl*Qk`7xc5PP;k}Lep(Q^emT`raPajgtpZ#`?>_jv9p

T_t_Hl!Q*;9c%@Db(eV^>^8bU%{thV{;cYs6{<6^ItcsRB=_A_L1765 zNtvBDJ}R=VU}#Lc*Q1c*e)x_7n&%3}Yg}nj$u}aZ#d$lxFu#yZi49MzrGz-B<9rDY z%7$?N1}W*J>}0n3BP9qMMz9SR3Hwf@H%Ag4`KWMNeLuR05^E%@kN+;JdG@n<9H3M0 z&olQY=JAYa;wdJV)B!5e=L!L30B}xVA5y#Z^LQs2D-KYhQ~`x93$ zBIu~;KKYnvBs{{f{%w&?l(Q8R1HDsH>_dOQ;1R51pTl;G8PnTB*;F^%<*k>|xc^Vg6=p{^Fmi!UQTn0JhK5MvHk9U$!web_^J>@*h^`G76pfRA zLBty9I#!_Jy_F{--@^Tq?x6n$s1qefo)<0iKPc$^ZT~(IY|RKl%CJ5*!IlLl z^R*p``|M?{1m%kpyZrd(qUg$Z8Q)aCES#EZU&DI#dWeBet=4d->paWz!dkkZ&_|{i zR$naAAye458W~KYz|B=_^PC+hzs^HUZOcI9e7-->MhE@Wh~q$0I65!`K2bV!-rhz@ zL~{+eJYz2XC;{?0pMB!1jf=3j%0{!`3iak<|7d^F!5g3^<$JAC(daFuIt+6<0_Nce zkvbL|&~ggyM?tJ5rH(%Q*$70_qcUar7u~{QE{;fidHSXpuR72Tn*PmJ0h}Uq>};w# z_R~}1h8Eu6rKKjKo_x=S znY)P2c*ZX${VCwK*+~~D|K}p{=Q7n2{v9@i0z2A~AU_tvs1ovbnIGue_6A95@#F;9 zAQeS+XmSL^rKBup!t;0h;sJIIxDWnA60XJfb2}z~NR;cw-GSs7Cw>C`V)4qc~Sq_}6N#~xJz{nB$>K6qqa-pj`G*7=!R z)V9?obAdlZhla(tbOqRtnND=J7LGQ>CwB&EC-_uZN}9Brx*$2vl|89ul_A*V7%cbP z{xwIQsM40-JyW5r@owQuhUmCi>EC;E$?g{g+*#UOhVro!PGvVSaXZ;ic-MM{aHXyM zsmb^kzbI3zfh-%|ectof6!FrkpYJ+zqf`Fa`nm$Xt0E#7!Hw^1RDw@Al>N2gV22-x zVw0XzZ~nMg+Z**2jY4clPCrHaQ5k)O>zCjTa*>arv!Zef^d$|U_SQX{E&g)WZf+x0 zB(ajK;1xrOL{hVJ`{a(#<-BG9EnXf}BU7;dP2CUy==ZUt>| z5?)NK(u~>1q?||)U*uy-^I^O6MK)V%edR!6`a@g`w=MVLC~zH~Io&kXR!L%OlD|zF zXy_P^?oHgn5Jw_*Ok-rvocp$|{z5>G@d%sZ-zp)n^m*j`2{)G%$7@xI*19R_SxRnf zp*k{h@ccV8xpYcp1_c0Ic<>tEu3ON5rJM^_A-+ZAjw`%~Da8x)?dPSy#wH;Gfy1bU zn%P4e%e~u4kC;(L$HXTUkp#*f@<%_G1U<`HY3;fe!hH8_LQj>Q@HXNf7?;k+DKJ~e zl*TQFhZKZYUy(i3>M4+M%FTdHTsSg?TmAjIS;D?uXrv z`%GBeQ++@CJr$koNpbjBH9Nq{hE@Ap(}KHi9ZL<>*v?&Y9ZDJ=JVo>BEr2tR_&Q+4 zA5`8Rb8i7rhysO~mS5@LrD`nKDiCf59`@UZ38iV~)>C4X(}I5aPkv#xb7(4`2FI-G zQ6+VacoMqF@sU1QK-~U@Z9w`~Blr!r`UX4?#onZPSU|CkB4{+%o^C*j!e$9~pMjRS zS~ajDesh2oH{zlHk4?JxME6SV)6CBYbez1zzKD2C7(9h7+FSo}9XhMdQK&hJ1N7OZ zm#pk!+9@xCSCDQN0`VvlkCT)yzdcpYnrli?>3UyiU4ss85I^LbTuWho-Svi*i(`)w zDxrsQs}y`rQ?AYR6Ddaz4faF#H;$qM$o4~;m&9^N;@9#HAQ6Jy4B~EVoX6;dBgbMk z82%d?Ic;T_D~dm*Uny9LPi~Spyb828ac8-R*Mb;vo%TMQ*i6Aa{JT?%E(+ad4()I# z3K_rB-sX02`qLsip{aKL)V!_q&ZeA&)i3>bBoYf~=M~!=FRjK^oViteJsifQWH^r< z6yss&$&9|h*K7WVjk0Gq3<+j*Kt~+a1<8iWAigH_#%QBY5J)Oj9;kSAaWvbeKFm+N z0%kr5JNNs$F8TEO@PiG>8)pTXQzFQ}OIU$|6o^9dNjy#?oET9_8fK9-_C3n#II1Y} zL@sV8vyw*nHvL3>LH;HdZBjO7-3dZYte8HZ?jKw|F4Oj#_SlGY}YOR|dta+d)K8ipdm!9|0@smr0Vq$}7FHV1>% ziD?J}Ke#2w2DUB=HEEOLgJNAB5yhv@>iA+h|#bq}6reP-IQC0^5#+PjNN7b_c3O zJ;kPksvF(?y_yC@Qdc4*Zz1WxVO;+AI>65hug?5A2Lf}29Qk6jyemFy>RoxwX$cQO z(H>FFw%l#kJ@UmZ^rGQfZ0H&m$m-WZ4iP$OSQG*e@FHF8)XjiCPQD_#-}>2LQdnf=>E9Z#c!9V7A!av-oYASL*DyRy1 zSL;MAu#jCCQJ3va`ln|K$S`9dA}|=g!4BW8*uD!I>>gXk5=liYgTd-wdaw{)-06)M z=OQQ^B&+@YW@Lw7I0l=NA?L5GKBlG?yF)5H=W8wwU6w^4>c;xyse`v8W4FGjqpEG( zoL*N7n0LPx9)gIJuBt)a-@8j69qJt@QAXOM*3T$pRYX;*v67?&&Lg+EWO+0q_dEaZ zbTIAD=3mW6Mt|B-vR`dNgfq@49e@jKFPycp89M8^(u9t{2@= z7-%b)?p-yoxQR46N%NvwJ|g{0zS0&;4r5vf0FjHu;l1(b1tKm0vQv~0Bx;}=IlALA z)>7MCxJ#^$L>v|k?^23Y;NR=%E!$k+!?s<;OA8k#S9jmqwcL^(tNv1%iiU15Oc( zXUHDJrE$-&Ws0?XBhd7@X`|8m8Xi7Bxr7_^!gZ{73E(=4o07|g_CKtA39Rm)F8Avr zth){7O^sogxIrkf;?0l>O-lCG$sD(zSLPE##dV1*i0kBrnBu9{Qg!fOFWej!On>QB zC|7aPIchRL^9yrBF2ss&9`##9tkC|=n0-ubeBr)B8qt=o!i5Ps62;b!?eFoSyoC$fkH#)=c4M?5tsX9ra5@`$iyT)iZ1R0{M2%ToQ=BJ ze#aung}?M4eoxian+?0sY43==$+LEfr@G{6il;a-q3Q1XAAz23=B1L zuod&{8?=Y1&XSfJ6SuTjx+e^3$BJCHEH=)~}`eOo}YSLqLj!U{&M`#dB<`(E&dQ90^pmc0?PqFk$vX}26 zkOKV|Eg>Q~%)AZs%_-#&Dl~-aQYEs5x*$<@mUux|XhgxhP*RF-fhJvLonyd)0 z^_P`D8A%u6_TUwq27&^+^!2j)@Iw+;!h?SiB1VX(BcD&n^suD#4ZvVWdVr(4w;m+Q*1dJ&YZ;NNprfirm^%!Y9X$ zZPb*s{jv>*!R(e9IZ)+K5nSKXUxe4G-*WwT0VOOqBEiI%eeinrOa%QA>mQ)E>=Xgm zBHq_tJf-CMegUDa>U!*aZD8*P0UNt6BF<3jeopEy3qI2YK}ws&1G0Bo&!ZGiS1)Y! z??ZO+U)njm-Xo~=MM2=Yalq#rwy#C`;Py*l7;!WhWgLHyrN#0naWzqf%9>y=^MaQr zXaOJ%D1;^6TBzku~?6 zNk)huYe$LR+yCV4C}++T`xz{TgCd$tU&HhCxyy{CCx$Uc`OqKV{SBt-zRhA3{|KyB!+Um_@r&O>fn3`tNl4b}{=Xw7(_gW;Cf()0so&3t9 z3%Fl>fYJL*zcBeJ5p>MV^m9fI-eOitcCG_pTK_*byAC=}dMiSOaw6LcvRUFU{z#<5 z$%zERZ@*^uGt$?r((j|^}%IgzWrVgsc!;uMl%&sACq%72-XF^QG?e}sKySd?AV z^$bHuH&O%AARyh{AX3sLAl=;!N;inoE!`;{O4raJ-QAtv?ekvm_5FP3@66nB_CEWp zz0TfefdpGy41J{U7V&+Vx5nQ{QIhjBgNJ^UA>+yYa2CvwhL?)s!QmVsGQs&^8*a{y zdVu4jUtS!J{dR;VI7Gb>8?7E2P0IS2X~H?}^QtyK_A887M0;Tkz(9)AUqyeX7GlA5 z{@(pw#_%NVe~;>0U{DUkS(?|{ukzwHUWNbOXCD)e%IPock*{f60Q3+o7Cji_g5m?P zbYtg)lO%HH-X(d;#EMvE=4;hbk~%@n%%91|K1fNOP-kRPJzIXH#>o$3VoIMl&apV< zCVEK>;cbZ`CN?CpED7;&ijg)7bsi%8;?j)~_%np=8p~TH7(S}I<-@YStf7Uhm)#=~ z0x5gq1?KEl(Yt7l!AJCEWnf$Qe_FHmT%7K0BM9=nt8S8RwlKlgYZG@GXqOOUxQbig z_+7c>lYKAsOT`GsH%_i42+DA)5JAcC10wo;WA71au4m+~<=Qoudp^Pu(Xh!29xGMx zqfFYPUhZN)3<=9vs#e_oG_61P^Xd!$9*)=fdbtB1&WXf07tXHy`?%JS=A*7klvG!E zL(GvBHlZh0gpK&YZ?WXu@y#c*<=Rot> zG_KB*A)Ry=cK{Lup?(T(cnF5p+uOK&-?SQfd!L z9d(2_E31N)>UJp9Ye(|M)%v8cLC^3YCzm=Y^WL7f+NITJwcA1}2cTedokj}CMrP3; z#QN1aL{XOMP_I!nXGV;i?HM0WWqnlvWz71AT>@D@6Y?q+lmZP>l;fJ?dTdG4(VAHx zlK2-6wyn7 z{{tZX<3<|oKpLD(-lj;V|0zhZp$n-|??e9%eiA?*?r-(M6ZR=(1Ehd1lWl!{DuoflxY5W+HOcP|y+pUel-8&+ zg9l#uu-bij)3hhp*)|zB%ja_{6`%Z**G0dr#O*)*CQkB?w84WWuXNy2JS=lYAj}1} ziWC-(mh7ua8v)z&b&DUJApMQnYA&{^{-du0w^n(~f~3xPXdjdlmfp#S_M$KeqKzbP z)4Qzy)0M&i!N7Xs2V7u8{a78r|7oG}iY;|e#7v8b zNsRSay3dmgzqy)w&M;{yZ;SY^qgvhh7^onS`(;EU5C&bbHY>_FBq4V#k^-GM2tg+< zg6~aO$1ryynKK*y>2NWGvT#(5`30|EJ$}OdJ?JmLz0&l~uTJdxpAy%4+D*4?;#~U0 zKQXQ;+oZ%+0yut3c})Ug9MeunktvuLZKB3sjZ7w*mbTw6ib+f^Q^SQF{nbms_4 zBz&EkMW@At5V5{fHa3S*$K7Tx*K6|pUFxk+=q6JA9Y>cYU*sH(CF4pX)yLk?i-1#hhcs*TsSwE)VyyN?0OFfwWf=3iX`C($h z=(fMk6*w$h{xv8b@7Fm((IYAf5wg#1O3RbXI|v!K=x(&qM0-*hJg z7@oTG4SsvX$yM!MKH=sM`pa?HdKe%31dL)JYE$zs^v*y06SPx&BKy!T#IQ}iWPHcn ziWlg#PtQsuK+yMN<39yA<{+dhhZ&W*+ra-6+!*<{qZ)+UHO=?o-jul6JYl81539!R z4|~6ea2uAcYLaiL4o|ke|2|0dPmHR}DQwRrV-e>~__ahB6;MzA>;6BvvY$#=@&^nA z%!lrWMSrg5orm$Hekw^s9;8qRLbyX?b%ZO5c1v8AZ`OBr1X`ZvR8%E(0^)n9M*dge z?yZ0sjd^lttn843yPfWyYjZQeQpgAF!er)u@W!P1HWFKquJ(*^uN3=Fz1CIgqOz5T z{P3-5?UtEHP$3Qa)%z*>=D&VVD@3XxU3No2uyQiHV=-AaF|O;7;Dsi$M;_7KOsU44 z>_36K(za%-T;@HRVLHIk4g6BMU+p%2hfLQ9WV-y!zqdOr9! z_a&tazLCN)+l}N5>(+CT4+bu-`gYIo*#3VRMB$bb)2x@oSpJQ_{;(fxV34?Q2QUePJbM(_z#jA!~V12r8#jHohY;0|f?!7?bPa^Tyji7b>W&o%gqP@f@HekMGZoZ^xFYw;4#$LI z+9J2>j8BOJ8fJik=0BA-qEvL^6w%hm>j4Z|Iw)PLKXzdXmZ!+QO-9!!-g66^0=u%aFxeJtPA%Wvrz7Q(p?yu!# z>KH#x5oGA-CcmMzw8l2hwa6g+yZ}@U4&D5_Z3;i93)3b8sqk@49>#v>EIWsC$8iyy zgp`5o-Kh?2z3>qlvyTx&JyZ!LWL|!x_gkWjMD3)W^Oz@g#``?l`GX4U;#V8LNbz3K z{IOA-Mliuf((v{a9B{O6fLK;!)0+&8ylGSWoRo%wfiSPnAv&{E#Zz+3E(vYc{}fai zpZKYR2gGc`IPWH)_c*r6D@UT081+96Q!a0RFOMw)WA|j=}SC8jy z3++C1^4{({`&N;uZW|Ky2q1Tn<#+@;zn430+rCh%gJX-6iIXuW%B+R8>-i}Te{8j_$zf=nS|l$x&UXlzrh}g9Senu!HZw+_IiJAsiLJL$}_y2Asy5U~OC-+!h=Rr`AezTxRGviECQSW?&RoSv?Q zp!--mGLp?09NRTi{KU7aDYDOe@#%Qtf+IWuUijexwD?SXQhJniGTi{&9>2sFcmcPX=)H+W_GI4bvAM zFHT5JEhHeo9Gt78(`o{d#O@}5=d4sz08c8y8>s`6qLjZ@dfM4JVp+YO%?kYs7|Y(T z=bSE4CH&6=U>~>Rt|iDfDTV8;7(}gwUtX;}zV!$t%t!sXKX=YDnXK-7L>8aDy8byZ zg-xielptL^m=&T)q#C`wslg9!z6=4b@pHxxwBiFNiW{{T7N;ne_EVm zzSiJ}n)_PW>k31+6X$Co1x@zv^Ie`{A|LF92R^|B!kCnfWP^3j61iA~Pi-w8HGruk zmux`NahCY*Xi*3>9#aO$vH(R!LLl8Ey(23?FW#Vi<@qBjwyv#m&$<6X_0v~oDH~65 zp=C#Fe?N_fGr+A|$WKay{!PzkuRBF=ccgLQxp2_xR?D@akKxp>CoaE@ol6ms0S(<_ z7AC8}@*FR+jx#=xAefol|H8XlS_@uu#>-y}khvreR zLa42B#kSIdhvvUng4x+D(Cct?;4yYGNWgT2lqkSVWjxTho8u+S_Z1>Xn<0!npO zuU~_zAVJp=f>8|994)+rLW>#h?*q$PLQRVd3svi(TW z0QTmfJT2V1e%%6F6k>Y$rjK4#8)2LINQ5}Y_BN~4d&*AA+fCh)#6%zcRN!rermi&I zRNclHLQhJu)icHHq-NM`Kw6^h{g6UAnOaZ+(^gF8 z2@s=h4g)G04)FxxHf!0qf;swbQcl>&OO-6#f8IS=A+n`-FPO+9`k3{l*NjO{c>6OC z`!F|S92N9^&>6q7k$3EPB61aV`DRjDR%ktGT+6KQGOX>T`Nr!tJpT%{XNufaHVT<< zX1~T?>YwW*n|vORhz^%urIDAO*Vk6c^+v{Eq>y}U3DK+Jhdl*gMMztzFpI?O3pusj z98>b^mPS__V_C5j5oU#V{1UrdWTB*C>|0{qj$Q34XUuNrmk2$X|4e;dCNzIW@jD?K z(U40c99*$b0)tsK2OjfD{=NbK&5%Qfc--%u#zHtes zyY^`#{)R&6+gbuefAm2K8+h?+-N;sK=PT9^$ugYA2GhUqul=R<-Gi6BY}9Cc3phvfu3ZGo0oPs%n`rxqdIVDD``hmI8;pX>ngR`POA6v3X_kd{OvH21 zz5eKK)#p1>BHwTp3?^el7^2i3zweA)-gd5?n+(LMP8i!y008ke}B!AXzia=ND94*Z+JsV29kUaLVCvCAfT0TW7K*yN#vod)@Z* z=Z^c38>_KjNao!hna`x7dxVya{$~NaG9Bc(=HGF6QVBjA{Wt+jXp6+;xLzaI@1BYD zY<$cP`&;ftRNnafEpI@|8jpN8G2+&097?Tw$eSulIf^IJ$|0XOL1+o!CC;}Wm?IxO z?=BLVl~`8znxn+Ni{RdCZgzM$`2I?@m5exR?7*AseX#1g?T+D8gpPBp{-Coj2Uen5 z-z1nU)#+`T<;zDP$fhS_zwgIDdJci`zq#ci+H}dD{PcBTKIV%0umS& zB`p#q^6wbenix#J0?onc#XQ680wf`$U$UJSvQE5l>V6CHLt^wavv)TxcM8$^eXKzu z_5jAaF6u)PuP^m$^Kq}QJ+4@&^0rn&->zRkXL@90#!H z%shZqduptsGc+sQfMBr)?|$2} zYzew{J$qZe05<7+IKx;e73$0R2e7J*Jum#;Fmw7Z6PPOKtdg_sM%-> z)>ZEry7>!$QJS~tHtO&twx(cBO#;FbgJWLS`DxI;i2EU+0M?|sv+sd4etMpPsO2UX zjaku-9f`53(b)0wD0#Gh2KIKHnIPjTw;(*3JO2G+{kNUAw!6}p-PJji(T%|Qmh&$^ zO?r!)YrSjHb(Ao$R56oDhH;aJ4pYiYrdUe5W} z7S$kDPHGy{G6MgJmQ|8jhmg3b(FE3=@U=^{b#}p^C4;m+BnKLhQCFWQq;m-GPiAyV ze_D%B^ewAXWBDvJT|Jb%qK{*>0mMJMft_)18b+q;Qh{{Ze_$6XbLrs%bqn~5{F@Uv z_)JX3`d4bSO}$oL=r?P7Pyb(jh)|+qaDA)a=>qfqNWd-3P zuGF$ml-^Z~G#4JQ5V#StC{)fFMU*}L59xO~xrDV)Ek63)jlu{H-#~f=e5ekX%DmsS z`p`w<9}n;g2&;MADZbG?dVb9R=3Uef(9-gR-s&Uc`w)qHQ;lSoRiOBBM1$_oZuNL6 zf(dkB1#-tp_1@V(BRK@X(DN3CJI_qc!o=~mJK#v(@lf(P^)0d{Kg=Twfo07xy-U#= zyqkY%#nklZv_F9Uo-Y#h>l?4P9!A`Jux@sqw_-BX6P}v#R&4mF1!n3ht!m~HU9ZYF zd7JUOra7Cu#p`|l`F|@?lSR*neNB}K;G*Dw4DH4aJ^dxku?-+c!|?Z87LKj|-0iXR zo2{44X_|mb+gFO@O2&;~hc-5)BQh1@?JwnnEAk>92bQahPvkT!2=%qDY}09Cw&Uov;|8`!Zy z@&bq8ms)3`qj5gzEJP@=P77Hw@!fn^a|{#WZ2Z?NW%x@IK^*-e9=P1Z)vYgznXkl# zm=z58kmE3NhX)MR;&zQUtqdRCdVcZfuA1>IPi9&*2GK-{Euq`6++8T!+WSWrHTaX2 zlsj~_|LFMR5gsOx{mtO5KHUC&x- zkoSHf%BiQ=KI=uWC=m?gkU*??B}#)lcbs{6i(dKqe+;phrv{m9-G+#Xfx^K>U_B+!Uu$9)P`NQR&fmCbKNO63DLkp3lio(Nj$yZK z0&oO;@FuNat|?Wv$rlMLB6f>`Ab*U$bYd$b3v?>(97N_LST;>CKnooHd3!0# zj3(4QE&?L-!sE3XFpM-0K+7EHTs0{A1NdD7dbsH>QJXj7xbXqMAlxxg+rcSj=aq+x z5Pu_GwzI%~HDr-YU{(dv1ofiRdT%|O=M1Tq>W}d4@6JUsgb8%X{qhTv^of4gmCFOp z%_DTKGq#6`6Ua<#5M)cQJi)W_he;uX3yU9$gD@w!024PXw3X@k)X&Mm7X2D^{v5fM=4;99iYB=EP-~T&RnuCUS-&*2-RJbC@6THq?WOw(K|7>P02G9ftYdjShfG4SwI5J|YKgO@T&zOd4Mw2LS0F zkANm_ufW2}BUzWWRVtgDhBMWG)g@*luP_i+J)1m3pyaPMAp2?1*>=CXPe*-7niq6~ zcl(ER$P;J4*b|ddDqNe6p)nSl;3wo@Xh{CB1si_q< z%A4P^*|H|t*sL}bD65~xK~sY@(dANPTEy@q*bwCnuK>c>&#!6%4lD!4k|@(4d2`Zu zR5$^EP{JQsm+p~84|Bzsa@daVzM@@5|O!b9k>L9Pv9}tJCai~0k zzND?FCH{E=QhCeRjC?%^0cPhBi}_MpZTh!-e7#*Bbe0w5fR@T8(ane>jH0FYs9?2+ zGrLF63lc)>fI_n3>(r%SZ+A^}!3<=~fNx)Yf8}|#w$z7K7{g50r<^ofT3##KLwcZ1_k4j0~EG=z!CON7cxjyz5@I&U+WWQvxaiMt$?KrPsoC%{zF zq@k1#%XN>j2$D!iI-Vz^80HCx!{$kicel&qrHGu8Gs~lS$;4s9D-*Bw?H6Aw3YJFG z)^`#@XCOpIqq(NUxIkB7v10fr0GsDVmoN*GIHav53nBbU7(7Lr|E5kAE7cIIWz6mQ zN@ig_p6t)(-x|5*3+qHw|nro7OrBlEuq;b}fIr?_JFFE%a(+^r-*ih$_x_j2l2NdB-pkAM68=SijztkQ{)D zu3Sg|NMQlbPyU1_z)4l^tJgQ=Cx#o%Gt)BwYNnrL2XQtnEX6V|OlHqpq{rwVNjG`R zmfL_s9GO zZu{NS4mf+o1p1HZB<^qa4lt)MZY^@dIL3hZQ#S46&5K}8UvI5ldp^oRkd~a)ZARfs z8xG(40`Vn>Vk!aoCbZPi`zy@`e;Mq7bw88%D;4<&90FtC(GbCG;&dx5VxAzuNOstgxhge3%Nvgf31%Wf zD*R%ezQu#+{3d(^g_K<~?fKFkTIjt@U^t z*|*t9C+mb2jS&D7W7=QITQr6-P%=s(p8$lnuA}}6Hp_~=-()8SLkN}Pw;dc8&|fuW zfcg?>IL&r*KlW=?MM_i*Ru+O7>ubBysgj*0+UW~*$ilI+3L8eI9(vGKz(wkt_5qOL zS5KyKILQ454o(Rw-g0(~z_}r&6eP;|UGySr23~f5vO8rv}|0BkFP2)*K&?DP`Yp z9g~8HpBL4E$v^LSbgo-^X2Y`b@<=Uzy;VWH7_n2(BV;v)UFQs-jz?+1C21ky@l4ef z1G0d>27)r=5+fdCcGG8>*V7ms`bYa|D^w-W)6gBJ(s}}XZS!gpayx&BvC#5b=5-Z& z;)>F{ZC+tRbw}||(V|R)W0Pkgff<$+aAShbuKTy7XhT%OpVprnT+juZkLDLHgQF|s$Y4-u|S2_2}*o-WYqt1 z;^UWSCU{p)#Ki7Qf9^&pmFq10HAwV~ov03IDhi<_Ja?mbCRYwC7qh{xG5Kv)cQKPK zQ)hx7ZxP8XH1tA#2_Y4^{E+O|LVk>$@i$lEgx@h$sD-)VSmo4w$LfUD+ok@m@s8V6 z3v}9w%}HQZQp=?HO0kY#oDvdNVBuiLm*wX^VZpU4CSv9w z7#sof!ViK&`9IQ^nYm(S4M=^wQSQ?O4GXnLQs(G8MaY^h4kt*=sLj%j6k6 zF-!_Qh9*JYvFtg9aJSw8N5P)&}dGy?N= zK9+hndvAM+Yza~&ype^&(|IK+EiKzZ)K8Jp$ckAbL8*i-CMb}0{gEzuhScT*QCu=@ zNjyjak1yLnE>kpII;|i+B*CV>Aq?@u3=`W$bHQJ<{p1)??9u#LQiijpx+IT@RH_7C zt&Mj&={D1hbq$j$)7G`O3M{(46WX%$=m}I5yvmjR=-5i(5QE>2Nn_OyE6TH%9)^3b z9FkTUMs2y?Ep1bx2PaIylWk{oC9Yec6UH^l5?FFNVs(OF&6_qC&m&MKP6g zoU?VJHGz05E?_PoQG zotYB?y=}xjMMq0LKfsOg$i~IN@SdZjTO`Ny{ei%z@>+7P$q$M>diCzxLlTc$2=8FwtOv#Z7DuH4XHguyj>%?3!98&*W{XtJn z;4fc$twyl>`FJP1_NMOZplr+Dcg5P*_yq;{YC~uJyvzfrRVvh0$#LU1xXh$)(d#-Z@4V5a7G3N`e1za2S%S(- z$>f;7W0JBiI60>O_HQ&rY()$`4xHdI-2Ex$rq{P;pWF)m;>5^26orb$Pb30wf)1k^ zZ5-c4L~O%|Lg7ieqvT&)quHV-b*O!TN3sjAYaAOlV~S$yL}aZ9H{+^KoHA5( zEzECKz(=J6g4G7+D2x&EN&f;Oy1O+I3(3z@164b@%S2fmrZM4i9eoK?-QMHXI zg=)(>f=l`pC22buM+zgg4qKHn1yyxIgkbT}|D#I(JLR}!FKe$<`zFryQV<>UaW@ma zN~-&G(fnx@u}SpZlHN8nFt3ia2z8EWw$6pKc&vmcQ95+kYlhR(wyKfSJUXxjUgXGQ z-7sc%`c3p*t|tA3O+R9`yi7dYysUV6`I%)3GUw3sunVPv_6?!lzA^)~a3Z(g~yerJB%j*un>d;&W><`RMK zy-O|&?^-0k&;gk_)aA=imBm!snfN|dm1d!NG;h%)N3OKcYPMKLwfHNqaZo5S7j$Z^ zE+`j*bI9`pL@fj(lJOmm>)#`aQS=JQ%j4&tXYG!iT>%cE4Ei1$lx{!sK#%9O<=|N$ zb^VU@UYN-Xg6E5dM@3I=g<%*MKBKD>1XdeDee z1I^<_t)Gk~#QEe*aPTeT&#Jm24kWxlg}8Jk9(Ph(oRQn1MU4`UFu7!3v*Gx zwjUE{Ejg4|*gVwC({V^C`g*9}%kDEPf5Ex=IbAA!R>V-U^QAL+`C5ps?8@Hc+4}A+ zX){nA@wkTpk1y+j`W5BPprRm4fO7L!2^WyVu+u(Vc!gPjrlFdigIx}6nvB(S{)(uS zVPg=^G=x4lM;Fq?NZlQsu&e*m0wEXy2a1kHp

M5xUE7&kbWkE#x4~4Ws&lmH{XA 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%0A2j&nC@^Mst}4a<_@K82>Bp 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 Lnj%icy*Oqq{!wi09dQf5kkv$ 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 diff --git a/src/unilab/training/__init__.py b/src/unilab/training/__init__.py index 7dda18b39..ac96b36a7 100644 --- a/src/unilab/training/__init__.py +++ b/src/unilab/training/__init__.py @@ -35,19 +35,16 @@ resolve_offpolicy_checkpoint_path, resolve_task_checkpoint_path, ) -from unilab.utils.monitoring import HardwareMonitor from unilab.utils.seed import ( TrainingSeedInfo, apply_configured_training_seed, apply_training_seed, - derive_worker_seed, resolve_training_seed, ) __all__ = [ "BackendAdapter", "ExperimentTracker", - "HardwareMonitor", "algo_config_dict", "apply_env_nan_guard", "assert_offpolicy_task_choice_matches_algo", @@ -69,7 +66,6 @@ "TrainingSeedInfo", "apply_configured_training_seed", "apply_training_seed", - "derive_worker_seed", "resolve_appo_checkpoint_path", "resolve_offpolicy_checkpoint_path", "resolve_training_seed", diff --git a/src/unilab/utils/device.py b/src/unilab/utils/device.py index 004d64b37..85242b254 100644 --- a/src/unilab/utils/device.py +++ b/src/unilab/utils/device.py @@ -4,7 +4,6 @@ import re import subprocess from functools import lru_cache -from typing import Callable, cast import torch @@ -26,106 +25,6 @@ def get_default_device() -> str: return "cpu" -def _device_count(device_type: str) -> int | None: - if device_type == "cuda": - return int(torch.cuda.device_count()) - if device_type == "xpu": - xpu = getattr(torch, "xpu", None) - device_count = getattr(xpu, "device_count", None) - if callable(device_count): - return int(cast(Callable[[], int], device_count)()) - return None - - -def _mps_available() -> bool: - mps = getattr(torch.backends, "mps", None) - is_available = getattr(mps, "is_available", None) - return bool(callable(is_available) and is_available()) - - -def _parse_device_alias(value: str) -> tuple[str, int | None]: - raw = value.strip().lower() - if not raw: - raise ValueError("Device alias must not be empty") - if ":" not in raw: - return raw, None - base, index_text = raw.split(":", 1) - if not index_text: - raise ValueError(f"Device alias {value!r} has an empty index") - try: - index = int(index_text) - except ValueError as exc: - raise ValueError(f"Device alias {value!r} has a non-integer index") from exc - if index < 0: - raise ValueError(f"Device alias {value!r} has a negative index") - return base, index - - -def _resolve_indexed_device(device_type: str, index: int | None, original: str) -> str: - count = _device_count(device_type) - if count is not None and index is not None and index >= count: - raise ValueError( - f"Requested device {original!r} resolves to {device_type}:{index}, " - f"but only {count} {device_type} device(s) are available" - ) - return device_type if index is None else f"{device_type}:{index}" - - -def _resolve_mps_alias(index: int | None, original: str) -> str: - if not _mps_available(): - raise ValueError(f"Requested device {original!r} requires MPS, but MPS is unavailable") - if index not in (None, 0): - raise ValueError( - f"Requested device {original!r} cannot be mapped to MPS; only index 0 is valid" - ) - return "mps" - - -def resolve_torch_device_alias(device: str | None, *, default: str = "cpu") -> str: - """Resolve a cross-platform torch device alias to a concrete device string. - - ``gpu`` is an abstract accelerator alias. ``cuda`` is also accepted on - macOS/MPS for config portability and maps to ``mps`` when CUDA is absent. - The function validates the resolved device and never silently falls back to - CPU for unavailable accelerators. - """ - original = default if device is None else str(device) - base, index = _parse_device_alias(original) - - if base == "cpu": - if index is not None: - raise ValueError(f"CPU device {original!r} must not include an index") - return "cpu" - - if base == "mps": - return _resolve_mps_alias(index, original) - - if base == "xpu": - if not _xpu_available(): - raise ValueError(f"Requested device {original!r} requires XPU, but XPU is unavailable") - return _resolve_indexed_device("xpu", index, original) - - if base == "cuda": - if torch.cuda.is_available(): - return _resolve_indexed_device("cuda", index, original) - if _mps_available(): - return _resolve_mps_alias(index, original) - raise ValueError(f"Requested device {original!r} requires CUDA, but CUDA is unavailable") - - if base == "gpu": - if torch.cuda.is_available(): - return _resolve_indexed_device("cuda", index, original) - if _xpu_available(): - return _resolve_indexed_device("xpu", index, original) - if _mps_available(): - return _resolve_mps_alias(index, original) - raise ValueError( - f"Requested device {original!r} requires an accelerator, but none is available" - ) - - raise ValueError(f"Unsupported device alias {original!r}; expected cpu, gpu, cuda, mps, or xpu") - - def _is_macos() -> bool: return platform.system() == "Darwin" diff --git a/src/unilab/utils/geometry.py b/src/unilab/utils/geometry.py index 4c0779390..c07c5cc85 100644 --- a/src/unilab/utils/geometry.py +++ b/src/unilab/utils/geometry.py @@ -20,16 +20,6 @@ ) -def np_sample_uniform( - lower: float | np.ndarray, - upper: float | np.ndarray, - size: tuple[int, ...], - dtype=np.float32, -) -> np.ndarray: - """Sample uniformly from ``[lower, upper]`` and cast to ``dtype``.""" - return np.random.uniform(lower, upper, size).astype(dtype) - - def np_normalize_axis(axis: np.ndarray | tuple[float, ...] | list[float]) -> np.ndarray: """Return a unit-length copy of a rotation axis vector. Raises on zero norm.""" axis = np.asarray(axis) @@ -57,38 +47,9 @@ def np_roll_pitch_from_quat(quat: np.ndarray) -> tuple[np.ndarray, np.ndarray]: return roll, pitch -def np_gravity_z_in_body_from_quat(quat_w: np.ndarray) -> np.ndarray: - """Z component of world gravity ``[0, 0, -1]`` expressed in body frame. - - Equivalent to ``np_quat_apply_inverse(quat_w, [0, 0, -1])[..., 2]`` but - computed directly from quaternion components to skip the intermediate. - """ - return 2.0 * (quat_w[..., 1] * quat_w[..., 1] + quat_w[..., 2] * quat_w[..., 2]) - 1.0 - - def np_quat_angular_velocity_from_pair( quat: np.ndarray, prev_quat: np.ndarray, dt: float ) -> np.ndarray: """Angular velocity from two consecutive quaternions via axis-angle diff / dt.""" rel = np_quat_mul(quat, np_quat_conjugate(prev_quat)) return np_quat_to_axis_angle(rel) / dt - - -def np_sample_uniform_quaternion(num_samples: int) -> np.ndarray: - """Sample uniformly random unit quaternions (w-first) via Shoemake (1992). - - Returns an ``(num_samples, 4)`` array in float64 (leaves any downstream - dtype conversion to the caller). - """ - u1 = np.random.rand(num_samples) - u2 = np.random.rand(num_samples) * 2.0 * np.pi - u3 = np.random.rand(num_samples) * 2.0 * np.pi - - r1 = np.sqrt(1.0 - u1) - r2 = np.sqrt(u1) - q1 = r1 * np.sin(u2) - q2 = r1 * np.cos(u2) - q3 = r2 * np.sin(u3) - q4 = r2 * np.cos(u3) - - return np.stack([q4, q1, q2, q3], axis=1) diff --git a/src/unilab/utils/monitoring.py b/src/unilab/utils/monitoring.py deleted file mode 100644 index cafcd38a0..000000000 --- a/src/unilab/utils/monitoring.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Hardware monitoring utilities for performance profiling.""" - -from typing import Dict - -import torch - -try: - import psutil - - HAS_PSUTIL = True -except ImportError: - HAS_PSUTIL = False - - -class HardwareMonitor: - """Monitor CPU, GPU, memory usage.""" - - def __init__(self): - self.has_psutil = HAS_PSUTIL - if self.has_psutil: - self.process = psutil.Process() - - self.has_cuda = torch.cuda.is_available() - if self.has_cuda: - try: - import pynvml - - pynvml.nvmlInit() - self.nvml_handle = pynvml.nvmlDeviceGetHandleByIndex(0) - self.has_nvml = True - except Exception: - self.has_nvml = False - else: - self.has_nvml = False - - def get_metrics(self) -> Dict[str, float]: - """Get current hardware metrics.""" - metrics = {} - - # CPU & Memory (requires psutil) - if self.has_psutil: - metrics["cpu_percent"] = self.process.cpu_percent() - metrics["cpu_count"] = psutil.cpu_count() - mem = self.process.memory_info() - metrics["memory_rss_mb"] = mem.rss / 1024 / 1024 - metrics["memory_percent"] = self.process.memory_percent() - - # GPU - if self.has_cuda: - metrics["gpu_memory_allocated_mb"] = torch.cuda.memory_allocated() / 1024 / 1024 - metrics["gpu_memory_reserved_mb"] = torch.cuda.memory_reserved() / 1024 / 1024 - - if self.has_nvml: - import pynvml - - util = pynvml.nvmlDeviceGetUtilizationRates(self.nvml_handle) - metrics["gpu_utilization"] = util.gpu - metrics["gpu_memory_utilization"] = util.memory - - return metrics diff --git a/src/unilab/utils/seed.py b/src/unilab/utils/seed.py index 87bb40fd5..9dff5f52f 100644 --- a/src/unilab/utils/seed.py +++ b/src/unilab/utils/seed.py @@ -61,15 +61,6 @@ def resolve_training_seed(cfg: Any) -> TrainingSeedInfo: return TrainingSeedInfo(configured_seed=None, configured_seed_source=None, effective_seed=None) -def derive_worker_seed(base_seed: int | None, worker_index: int = 0) -> int | None: - """Derive deterministic subprocess seeds from the effective run seed.""" - if base_seed is None: - return None - if worker_index < 0: - raise ValueError(f"worker_index must be non-negative, got {worker_index}") - return int(base_seed) + int(worker_index) + 1 - - def apply_training_seed( seed: int | None, *, diff --git a/src/unilab/utils/sim2sim.py b/src/unilab/utils/sim2sim.py index 536b685d9..bfe7e11bd 100644 --- a/src/unilab/utils/sim2sim.py +++ b/src/unilab/utils/sim2sim.py @@ -249,42 +249,3 @@ def policy_load_dim_guard( "`uv run scripts/audit_sim2sim_contracts.py`.\n" f"Original load error:\n{exc}" ) from exc - - -class Sim2SimConfigResolver: - """Object facade over the module-level sim2sim contract API.""" - - ALLOWLIST = ALLOWLIST - WARNING_LIST = WARNING_LIST - DENYLIST = DENYLIST - ENV_STRUCTURAL_DENYLIST = ENV_STRUCTURAL_DENYLIST - - @staticmethod - def extract_snapshot(full_cfg: DictConfig) -> dict[str, Any]: - """See :func:`extract_contract_snapshot`.""" - return extract_contract_snapshot(full_cfg) - - @staticmethod - def resolve( - source_run_dir: str | Path | None, - target_cfg: DictConfig, - *, - algo_name: str | None = None, - strict: bool = True, - ) -> DictConfig | None: - """See :func:`resolve_sim2sim_config`.""" - return resolve_sim2sim_config( - source_run_dir, target_cfg, algo_name=algo_name, strict=strict - ) - - @staticmethod - def load_dim_guard( - *, - env_obs_dim: int | None = None, - env_action_dim: int | None = None, - algo_name: str | None = None, - ): - """See :func:`policy_load_dim_guard`.""" - return policy_load_dim_guard( - env_obs_dim=env_obs_dim, env_action_dim=env_action_dim, algo_name=algo_name - ) diff --git a/tests/assets/test_hub.py b/tests/assets/test_hub.py index a4695e72f..664adf326 100644 --- a/tests/assets/test_hub.py +++ b/tests/assets/test_hub.py @@ -255,7 +255,6 @@ def test_robot_asset_specs_cover_hf_hosted_robots(): for robot, specs in ROBOT_ASSET_SPECS.items(): assert specs, robot for directory, marker, pattern, label in specs: - # go2w additionally reference the shared go2 mesh dir. assert directory.startswith("robots/") assert marker and pattern and label diff --git a/tests/base/backend/test_drake_batch_pool.py b/tests/base/backend/test_drake_batch_pool.py index 59f07bc90..0a359a729 100644 --- a/tests/base/backend/test_drake_batch_pool.py +++ b/tests/base/backend/test_drake_batch_pool.py @@ -39,7 +39,7 @@ def _run_clean_python(code: str) -> str: return result.stdout -_GO1_POOL_HELPER = """ +_GO2_POOL_HELPER = """ import xml.etree.ElementTree as ET import numpy as np @@ -53,8 +53,8 @@ def _run_clean_python(code: str) -> str: ) -def make_go1_pool(nbatch, nthread): - source_model = ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml" +def make_go2_pool(nbatch, nthread): + source_model = ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml" drake_model = materialize_drake_compatible_mjcf(source_model) contract = parse_mjcf_model_contract(drake_model.model_file) ( @@ -123,7 +123,7 @@ def test_batch_backend_mode_rejects_existing_pydrake_module() -> None: try: create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 1, 0.01, drake_backend_mode="batch", @@ -148,7 +148,7 @@ def test_create_backend_rejects_pydrake_mode() -> None: with pytest.raises(ValueError, match="drake_backend_mode='batch'"): create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 1, 0.01, drake_backend_mode="pydrake", @@ -166,7 +166,7 @@ def test_drake_backend_constructs_without_task_base_name() -> None: backend = create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 1, 0.01, drake_backend_mode="batch", @@ -251,14 +251,14 @@ def test_drake_uni_runtime_import_is_lazy_and_pydrake_free() -> None: not _batch_extension_built(), reason="optional Drake batch extension has not been built", ) -def test_drake_batch_pool_go1_smoke_shapes_and_time() -> None: +def test_drake_batch_pool_go2_smoke_shapes_and_time() -> None: output = _run_clean_python( - _GO1_POOL_HELPER + _GO2_POOL_HELPER + textwrap.dedent( """ import json - pool, qpos, _, state = make_go1_pool(2, 1) + pool, qpos, _, state = make_go2_pool(2, 1) control = np.tile(qpos[7:], (2, 1)) state_only = pool.step(state, 2, control, None, False) output = pool.step(state, 2, control, None, True) @@ -285,7 +285,7 @@ def test_drake_batch_pool_go1_smoke_shapes_and_time() -> None: "has_sensor_data": True, "nthread": 1, "sensor_finite": True, - "sensor_shape": [2, 42], + "sensor_shape": [2, 68], "state_finite": True, "state_only_has_sensor_data": False, "state_shape": [2, 38], @@ -300,12 +300,12 @@ def test_drake_batch_pool_go1_smoke_shapes_and_time() -> None: ) def test_drake_batch_pool_uses_thread_workspaces_not_env_workspaces() -> None: output = _run_clean_python( - _GO1_POOL_HELPER + _GO2_POOL_HELPER + textwrap.dedent( """ import json - _, qpos, qvel, state = make_go1_pool(4, 1) + _, qpos, qvel, state = make_go2_pool(4, 1) for env_index in range(4): row_qpos = qpos.copy() row_qpos[0] += 0.05 * env_index @@ -313,7 +313,7 @@ def test_drake_batch_pool_uses_thread_workspaces_not_env_workspaces() -> None: state[env_index, 1 + qpos.size :] = qvel def make_pool(nthread): - return make_go1_pool(4, nthread)[0] + return make_go2_pool(4, nthread)[0] control = np.tile(qpos[7:], (4, 1)) serial_pool = make_pool(1) @@ -349,7 +349,7 @@ def make_pool(nthread): "parity_sensor": True, "parity_state": True, "reset_sensor_finite": True, - "reset_sensor_shape": [1, 42], + "reset_sensor_shape": [1, 68], "reset_times": [0.0], "reset_x": [1.23], "serial_workspace_count": 1, @@ -365,12 +365,12 @@ def make_pool(nthread): ) def test_drake_batch_pool_worker_exception_reaches_python() -> None: output = _run_clean_python( - _GO1_POOL_HELPER + _GO2_POOL_HELPER + textwrap.dedent( """ import json - pool, qpos, _, state = make_go1_pool(4, 2) + pool, qpos, _, state = make_go2_pool(4, 2) state[2, 0] = np.nan control = np.tile(qpos[7:], (4, 1)) try: @@ -491,7 +491,7 @@ def test_create_backend_batch_mode_avoids_pydrake_and_steps() -> None: assert "pydrake" not in sys.modules backend = create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 2, 0.01, drake_backend_mode="batch", @@ -506,7 +506,7 @@ def test_create_backend_batch_mode_avoids_pydrake_and_steps() -> None: backend.step(backend.get_dof_pos(), nsteps=1) diagnostics = backend.diagnostics() foot_contact = backend.get_sensor_data("FL_foot_contact") - body_ids = backend.get_body_ids(["trunk", "FR_calf"]) + body_ids = backend.get_body_ids(["base", "FR_calf"]) body_pos = backend.get_body_pos_w(body_ids) summary = { "cls": type(backend).__name__, @@ -532,7 +532,7 @@ def test_create_backend_batch_mode_avoids_pydrake_and_steps() -> None: "body_finite": True, "body_shape": [2, 2, 3], "cls": "DrakeBackend", - "contact_shape": [2, 3], + "contact_shape": [2, 1], "contact_nonzero": True, "diagnostic_mode": "batch", "foot_shape": [2, 3], @@ -561,7 +561,7 @@ def test_drake_backend_pre_step_hook_refreshes_between_substeps() -> None: backend = create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 1, 0.01, drake_backend_mode="batch", @@ -608,13 +608,13 @@ def test_drake_backend_body_frame_getters_use_compact_root_frame() -> None: backend = create_backend( "drake", - SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go1/scene_flat.xml")), + SceneCfg(model_file=str(ASSETS_ROOT_PATH / "robots/go2/scene_flat.xml")), 1, 0.01, drake_backend_mode="batch", drake_nthread=1, ) - base_id = backend.get_body_ids(["trunk"]) + base_id = backend.get_body_ids(["base"]) other_id = backend.get_body_ids(["FR_calf"]) base_pos = backend.get_body_pos_b(base_id) base_quat = backend.get_body_quat_b(base_id) diff --git a/tests/base/test_sim_backend.py b/tests/base/test_sim_backend.py index df1bbddf5..2a7fe29dc 100644 --- a/tests/base/test_sim_backend.py +++ b/tests/base/test_sim_backend.py @@ -24,7 +24,6 @@ def _xml(robot: str, scene: str = "scene_flat.xml") -> str: BASIC_ROBOTS = [ pytest.param(dict(model_file=_xml("g1"), base_name="pelvis"), id="g1"), - pytest.param(dict(model_file=_xml("go1"), base_name="trunk"), id="go1"), pytest.param(dict(model_file=_xml("go2"), base_name="base"), id="go2"), ] diff --git a/tests/training/test_seed_contract.py b/tests/training/test_seed_contract.py index 437acb012..e58953354 100644 --- a/tests/training/test_seed_contract.py +++ b/tests/training/test_seed_contract.py @@ -12,7 +12,6 @@ from unilab.utils.seed import ( apply_training_seed, - derive_worker_seed, resolve_training_seed, ) @@ -53,12 +52,6 @@ def test_apply_training_seed_rejects_negative_seed(): apply_training_seed(-1) -def test_derive_worker_seed_is_deterministic_and_distinct_from_base_seed(): - assert derive_worker_seed(10, worker_index=0) == 11 - assert derive_worker_seed(10, worker_index=3) == 14 - assert derive_worker_seed(None, worker_index=3) is None - - @pytest.mark.parametrize( ("config_dir", "overrides"), [ diff --git a/tests/training/test_sim2sim_resolver.py b/tests/training/test_sim2sim_resolver.py index d45104454..a734e8487 100644 --- a/tests/training/test_sim2sim_resolver.py +++ b/tests/training/test_sim2sim_resolver.py @@ -20,7 +20,6 @@ ENV_STRUCTURAL_DENYLIST, WARNING_LIST, CrossBackendIncompatibleError, - Sim2SimConfigResolver, extract_contract_snapshot, policy_load_dim_guard, resolve_sim2sim_config, @@ -397,42 +396,6 @@ def test_dim_guard_does_not_swallow_keyerror(): raise KeyError("actor") -# --- Sim2SimConfigResolver class facade + user-level bypass ------------------------ - - -def test_resolver_class_exposes_field_lists(): - assert Sim2SimConfigResolver.DENYLIST is DENYLIST - assert Sim2SimConfigResolver.WARNING_LIST is WARNING_LIST - assert Sim2SimConfigResolver.ALLOWLIST is ALLOWLIST - assert Sim2SimConfigResolver.ENV_STRUCTURAL_DENYLIST is ENV_STRUCTURAL_DENYLIST - - -def test_resolver_class_resolve_delegates_and_raises(tmp_path): - _write_sidecar(tmp_path, extract_contract_snapshot(_mujoco_cfg())) - target = _mujoco_cfg() - target.env.control_config.action_scale = 0.5 - with pytest.raises(CrossBackendIncompatibleError): - Sim2SimConfigResolver.resolve(tmp_path, target) - - -def test_resolver_class_strict_false_is_user_bypass(tmp_path, capsys): - # training.sim2sim_strict=false maps to strict=False: a DENYLIST denial becomes a - # warning and play proceeds with the target cfg (the load-time dim guard still bites). - _write_sidecar(tmp_path, extract_contract_snapshot(_mujoco_cfg())) - target = _mujoco_cfg() - target.env.control_config.action_scale = 0.5 - assert Sim2SimConfigResolver.resolve(tmp_path, target, strict=False) is target - assert "action_scale" in capsys.readouterr().out - - -def test_resolver_class_extract_and_dim_guard_delegate(): - snap = Sim2SimConfigResolver.extract_snapshot(_mujoco_cfg()) - assert snap["env.control_config.action_scale"] == 0.25 - with pytest.raises(CrossBackendIncompatibleError): - with Sim2SimConfigResolver.load_dim_guard(env_obs_dim=5, env_action_dim=2): - raise RuntimeError("size mismatch for actor.0.weight") - - def _compose_task(task: str) -> Any: conf_dir = str(Path(__file__).resolve().parents[2] / "src" / "unilab" / "conf" / "ppo") GlobalHydra.instance().clear() diff --git a/tests/utils/test_utils_package_policy.py b/tests/utils/test_utils_package_policy.py index f026b3e88..d35cc516c 100644 --- a/tests/utils/test_utils_package_policy.py +++ b/tests/utils/test_utils_package_policy.py @@ -8,7 +8,6 @@ "checkpoint", "device", "geometry", - "monitoring", "nan_guard", "nan_viz", "reward", From c615db7043b7edc0dd0de92e0773246c13abfeb8 Mon Sep 17 00:00:00 2001 From: TATP-233 Date: Wed, 16 Sep 2026 15:21:30 +0800 Subject: [PATCH 2/3] chore(deps): bump unisim-core to 1.4.2 and unilab-rl to 1.2.1 unisim-core 1.4.2 removed the upstream export_scene module, so drop the unilab-export-scene console script, its tests, and its docs. The Drake branch no longer filters MuJoCo root-body options (unilabsim/unisim#92); pop base_name/push_body_name at the owner boundary before constructing DrakeBackend. Refresh uv.lock and uv.rocm.lock. Refs #1591 --- .../en/2-user_guide/7-tooling/0-index.md | 7 -- .../2-user_guide/7-tooling/4-scene_export.md | 16 ----- .../1-sim_to_real/9-troubleshooting.md | 4 +- .../zh_CN/2-user_guide/7-tooling/0-index.md | 7 -- .../2-user_guide/7-tooling/4-scene_export.md | 11 ---- .../1-sim_to_real/9-troubleshooting.md | 4 +- pyproject.rocm.toml | 7 +- pyproject.toml | 7 +- src/unilab/base/backend_factory.py | 6 ++ tests/test_export_scene.py | 66 ------------------- uv.lock | 14 ++-- uv.rocm.lock | 14 ++-- 12 files changed, 30 insertions(+), 133 deletions(-) delete mode 100644 docs/sphinx/source/en/2-user_guide/7-tooling/4-scene_export.md delete mode 100644 docs/sphinx/source/zh_CN/2-user_guide/7-tooling/4-scene_export.md delete mode 100644 tests/test_export_scene.py diff --git a/docs/sphinx/source/en/2-user_guide/7-tooling/0-index.md b/docs/sphinx/source/en/2-user_guide/7-tooling/0-index.md index 216746f8d..db0ed2c1c 100644 --- a/docs/sphinx/source/en/2-user_guide/7-tooling/0-index.md +++ b/docs/sphinx/source/en/2-user_guide/7-tooling/0-index.md @@ -24,12 +24,6 @@ Configure run logging and experiment metadata. Inspect NaN guard dumps from PPO runs. ::: -:::{grid-item-card} Scene export -:link: 4-scene_export -:link-type: doc -Export MuJoCo scenes and copied assets for inspection. -::: - :::{grid-item-card} Robot import :link: 5-robot_import :link-type: doc @@ -44,6 +38,5 @@ Connect robot assets, model descriptions, control interfaces, and keyframes. 1-onnx_export 2-wandb 3-nan_visualizer -4-scene_export 5-robot_import ``` diff --git a/docs/sphinx/source/en/2-user_guide/7-tooling/4-scene_export.md b/docs/sphinx/source/en/2-user_guide/7-tooling/4-scene_export.md deleted file mode 100644 index d849ccded..000000000 --- a/docs/sphinx/source/en/2-user_guide/7-tooling/4-scene_export.md +++ /dev/null @@ -1,16 +0,0 @@ -# Scene Export - -Scene export is implemented by `unisim.backend.mujoco.export_scene` and registered -as the `unilab-export-scene` console entry in `pyproject.toml`. It accepts a -MuJoCo XML or MJB model path, writes `scene.xml`, copies mesh assets when they -are discoverable, and can create a zip archive. - -For task-level materialization checks, use the script that constructs an env -from the registry and owner config: - -```bash -uv run scripts/visualize_task_env.py --task G1WalkFlat --backend mujoco --num_envs 4 -``` - -`tests/test_export_scene.py` covers the export helper, including `scene.xml` -creation, reloadability, and zip output. diff --git a/docs/sphinx/source/en/3-deployment/1-sim_to_real/9-troubleshooting.md b/docs/sphinx/source/en/3-deployment/1-sim_to_real/9-troubleshooting.md index 89bd1d9dd..245e9e903 100644 --- a/docs/sphinx/source/en/3-deployment/1-sim_to_real/9-troubleshooting.md +++ b/docs/sphinx/source/en/3-deployment/1-sim_to_real/9-troubleshooting.md @@ -24,8 +24,8 @@ sideways, start here. Almost always one of: 1. **Joint order swapped.** Inspect `policy.onnx` input width and the joint - order in your motor driver. Use `unilab-export-scene` to dump the - training joint order. + order in your motor driver against the training scene XML + (`src/unilab/assets/robots//scene_flat.xml`). 2. **Action scale unit mismatch.** Policy outputs unscaled values; the driver expects rad, but you fed it normalized [-1, 1]. Apply the `env.actions.joint_pos.scale` / default-angle convention from the training diff --git a/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/0-index.md b/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/0-index.md index 235cfb66e..d57a636a4 100644 --- a/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/0-index.md +++ b/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/0-index.md @@ -23,12 +23,6 @@ 检查 PPO 运行中的 NaN guard dump。 ::: -:::{grid-item-card} 场景导出 -:link: 4-scene_export -:link-type: doc -导出 MuJoCo 场景及复制的 asset 以供检查。 -::: - :::{grid-item-card} 机器人导入 :link: 5-robot_import :link-type: doc @@ -43,6 +37,5 @@ 1-onnx_export 2-wandb 3-nan_visualizer -4-scene_export 5-robot_import ``` diff --git a/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/4-scene_export.md b/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/4-scene_export.md deleted file mode 100644 index 44694a8b6..000000000 --- a/docs/sphinx/source/zh_CN/2-user_guide/7-tooling/4-scene_export.md +++ /dev/null @@ -1,11 +0,0 @@ -# 场景导出 - -场景导出由 `unisim.backend.mujoco.export_scene` 实现,并在 `pyproject.toml` 中注册为 `unilab-export-scene` 控制台入口。它接受一个 MuJoCo XML 或 MJB 模型路径,写出 `scene.xml`,在能够发现 mesh asset 时复制它们,并且可以创建一个 zip 归档。 - -对于 task 级别的实例化检查,请使用从 registry 和 owner config 构造 env 的脚本: - -```bash -uv run scripts/visualize_task_env.py --task G1WalkFlat --backend mujoco --num_envs 4 -``` - -`tests/test_export_scene.py` 覆盖了导出辅助逻辑,包括 `scene.xml` 的创建、可重新加载性以及 zip 输出。 diff --git a/docs/sphinx/source/zh_CN/3-deployment/1-sim_to_real/9-troubleshooting.md b/docs/sphinx/source/zh_CN/3-deployment/1-sim_to_real/9-troubleshooting.md index 33a9f1077..355b3f93a 100644 --- a/docs/sphinx/source/zh_CN/3-deployment/1-sim_to_real/9-troubleshooting.md +++ b/docs/sphinx/source/zh_CN/3-deployment/1-sim_to_real/9-troubleshooting.md @@ -22,8 +22,8 @@ 几乎总是以下之一: -1. **关节顺序被调换。** 检查 `policy.onnx` 的输入宽度与你电机驱动器中的关节顺序。 - 用 `unilab-export-scene` 导出训练时的关节顺序。 +1. **关节顺序被调换。** 检查 `policy.onnx` 的输入宽度,并将你电机驱动器中的关节顺序 + 与训练场景 XML(`src/unilab/assets/robots//scene_flat.xml`)对照。 2. **动作缩放单位不匹配。** 策略输出未缩放的值;驱动器期望的是弧度,而你喂给它的 是归一化的 [-1, 1]。在把目标发送给驱动器之前,应用训练 owner YAML 中的 `env.actions.joint_pos.scale` / 默认角度约定,并原样复现该 owner 解析后的 diff --git a/pyproject.rocm.toml b/pyproject.rocm.toml index 3956a3fa9..93770addb 100644 --- a/pyproject.rocm.toml +++ b/pyproject.rocm.toml @@ -24,13 +24,13 @@ requires-python = ">=3.10,<3.14" dependencies = [ "numpy", # Physics implementations are provided by the independently released - # unisim-core package. The 1.4.1 release carries the fixed model variant, + # unisim-core package. The 1.4.2 release carries the fixed model variant, # per-world reset-default, per-env gravity, substep body-wrench, and # IsaacGym fixed-variant contracts. - "unisim-core>=1.4.1", + "unisim-core>=1.4.2", # RL algorithms and async runtimes live in the independently released # uni-rl package (distribution name ``unilab-rl``); see pyproject.toml. - "unilab-rl==1.2.0", + "unilab-rl==1.2.1", "torch==2.11.0", "triton-rocm==3.6.0 ; sys_platform == 'linux' and platform_machine == 'x86_64'", "gymnasium", @@ -61,7 +61,6 @@ eval = "unilab.cli:eval_main" demo = "unilab.cli:demo_main" unilab-complete = "unilab.cli_completion:main" unilab-viz-nan = "unilab.utils.nan_viz:main" -unilab-export-scene = "unisim.backend.mujoco.export_scene:main" unilab-render-teaser = "unilab.visualization.teaser:main" unilab-pull-assets = "unilab.assets.pull:main" diff --git a/pyproject.toml b/pyproject.toml index 8a3057fd7..ebaa70f21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,15 +39,15 @@ requires-python = ">=3.10,<3.14" dependencies = [ "numpy", # Physics implementations are provided by the independently released - # unisim-core package. The 1.4.1 release carries the fixed model variant, + # unisim-core package. The 1.4.2 release carries the fixed model variant, # per-world reset-default, per-env gravity, substep body-wrench, and # IsaacGym fixed-variant contracts. - "unisim-core>=1.4.1", + "unisim-core>=1.4.2", # RL algorithms and async runtimes (PPO/APPO/SAC/TD3 runners, # collectors, IPC, logging) live in the independently released uni-rl # package (distribution name ``unilab-rl``), consumed via the injected # env contract (uni_rl.env_contract.EnvFactory). Published on PyPI. - "unilab-rl==1.2.0", + "unilab-rl==1.2.1", "numba>=0.67", "prettytable>=3.10", # torch is a range (not an exact pin) so that published PyPI metadata lets @@ -89,7 +89,6 @@ eval = "unilab.cli:eval_main" demo = "unilab.cli:demo_main" unilab-complete = "unilab.cli_completion:main" unilab-viz-nan = "unilab.utils.nan_viz:main" -unilab-export-scene = "unisim.backend.mujoco.export_scene:main" unilab-render-teaser = "unilab.visualization.teaser:main" unilab-pull-assets = "unilab.assets.pull:main" diff --git a/src/unilab/base/backend_factory.py b/src/unilab/base/backend_factory.py index 55dcee972..5976cd478 100644 --- a/src/unilab/base/backend_factory.py +++ b/src/unilab/base/backend_factory.py @@ -123,6 +123,12 @@ def create_backend( "newton_capacity_check_steps", ): kwargs.pop(key, None) + if backend_type == "drake": + # unisim-core 1.4.2 dropped the Drake-branch filtering of MuJoCo + # root-body options; Drake derives root state from its own plant and + # DrakeBackend rejects the keywords. Pop them at the owner boundary. + kwargs.pop("base_name", None) + kwargs.pop("push_body_name", None) # Newton reconstructs body state from its compiled articulation and does # not accept MuJoCo's synthetic body-sensor injection. Keep this # capability translation at the owner/backend boundary so env code remains diff --git a/tests/test_export_scene.py b/tests/test_export_scene.py deleted file mode 100644 index 044e3fd91..000000000 --- a/tests/test_export_scene.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Tests for scene export tool.""" - -from __future__ import annotations - -from pathlib import Path -from zipfile import ZipFile - -import pytest - -pytest.importorskip("mujoco") - -from unisim.backend.mujoco.export_scene import export_scene, main - -MINIMAL_XML = """\ - - - - - - - -""" - - -@pytest.fixture() -def model_file(tmp_path: Path) -> str: - p = tmp_path / "test_model.xml" - p.write_text(MINIMAL_XML) - return str(p) - - -def test_export_creates_xml(model_file: str, tmp_path: Path): - out = tmp_path / "export_out" - export_scene(model_file, str(out)) - assert (out / "scene.xml").is_file() - - -def test_export_directory_structure(model_file: str, tmp_path: Path): - out = tmp_path / "export_out2" - export_scene(model_file, str(out)) - assert out.is_dir() - assert (out / "scene.xml").is_file() - - -def test_exported_scene_reloadable(model_file: str, tmp_path: Path): - import mujoco - - out = tmp_path / "export_out3" - export_scene(model_file, str(out)) - model = mujoco.MjModel.from_xml_path(str(out / "scene.xml")) - assert model.ngeom > 0 - - -def test_export_scene_zip_contains_xml(model_file: str, tmp_path: Path): - out = tmp_path / "export_zip" - zip_path = Path(export_scene(model_file, str(out), as_zip=True)) - assert zip_path.is_file() - assert zip_path.suffix == ".zip" - with ZipFile(zip_path) as zf: - assert "scene.xml" in zf.namelist() - - -def test_export_scene_cli_creates_xml(model_file: str, tmp_path: Path): - out = tmp_path / "export_cli" - assert main([model_file, "-o", str(out)]) == 0 - assert (out / "scene.xml").is_file() diff --git a/uv.lock b/uv.lock index 211b3f755..d21cbaa7e 100644 --- a/uv.lock +++ b/uv.lock @@ -5239,8 +5239,8 @@ requires-dist = [ { name = "trimesh", marker = "extra == 'newton'", specifier = ">=3.21.7" }, { name = "trimesh", marker = "extra == 'viser'", specifier = ">=3.21.7" }, { name = "typing-extensions" }, - { name = "unilab-rl", specifier = "==1.2.0" }, - { name = "unisim-core", specifier = ">=1.4.1" }, + { name = "unilab-rl", specifier = "==1.2.1" }, + { name = "unisim-core", specifier = ">=1.4.2" }, { name = "unisim-core", extras = ["superdex"], marker = "python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'superdex'", specifier = ">=1.4.0" }, { name = "viser", marker = "extra == 'viser'", specifier = ">=1.0.26" }, { name = "wandb" }, @@ -5260,7 +5260,7 @@ dev = [ [[package]] name = "unilab-rl" -version = "1.2.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hydra-core" }, @@ -5277,20 +5277,20 @@ dependencies = [ { name = "torch", version = "2.9.0+cu130", source = { registry = "https://download-r2.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, { name = "wandb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/9d/7a646bc044cadb48cbd1d0c58832faf59e037a45f22432cff2a7ad5a7b01/unilab_rl-1.2.0.tar.gz", hash = "sha256:bb8b1c713b961ea4b24ea72c39d443e057531e71882fa058502af947b98768da", size = 148289, upload-time = "2026-09-10T05:20:52.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/44/2280a1b68c604b3e4b8bd350e34cde0b9d55e91f43266bfa23c7d571a7cb/unilab_rl-1.2.1.tar.gz", hash = "sha256:e9749709e55ceeb9321cd0e2aa1b655cbd276901398003702dc13fb8d71cda85", size = 144847, upload-time = "2026-09-15T14:59:48.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/67/0ea1fb5f0c9a7e8604b0415b018deb3286024191a84d357f1b3221d2a41d/unilab_rl-1.2.0-py3-none-any.whl", hash = "sha256:617317dcca581d1af2daec36d50de7214067dd34f5d85a4f02d7cd38de1df611", size = 183372, upload-time = "2026-09-10T05:20:51.254Z" }, + { url = "https://files.pythonhosted.org/packages/43/d0/384be1d5ed60dfbec4620340784a84042227f396a62cc1a6b965744042eb/unilab_rl-1.2.1-py3-none-any.whl", hash = "sha256:516874fca1649bcfd080c7226e039fd646f7acdfff4c1e97b6f2a27c3264c152", size = 178664, upload-time = "2026-09-15T14:59:47.945Z" }, ] [[package]] name = "unisim-core" -version = "1.4.1" +version = "1.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/57/4da896cef1f76e9902cfe4deb0f5dcf678a2217507dd39fe286a7edb6984/unisim_core-1.4.1.tar.gz", hash = "sha256:aa71cc1f90615929be2e75851d636271675666caa140629c042e6a46fb45d657", size = 269776, upload-time = "2026-09-15T08:21:16.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/e7/5954d490d66facf3449f1032d5cc13288fb4fd1166eaba4eea8987c4f4ca/unisim_core-1.4.2.tar.gz", hash = "sha256:e27d89292083cdff646d2dbeb0ac787ee4351e7ef811c20c6fed2a40578785b7", size = 269413, upload-time = "2026-09-16T04:22:39.708Z" } [package.optional-dependencies] superdex = [ diff --git a/uv.rocm.lock b/uv.rocm.lock index 8a620d3ce..7725f2723 100644 --- a/uv.rocm.lock +++ b/uv.rocm.lock @@ -3789,8 +3789,8 @@ requires-dist = [ { name = "trimesh", marker = "extra == 'viser'", specifier = ">=3.21.7" }, { name = "triton-rocm", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", specifier = "==3.6.0", index = "https://download.pytorch.org/whl/rocm7.2" }, { name = "typing-extensions" }, - { name = "unilab-rl", specifier = "==1.2.0" }, - { name = "unisim-core", specifier = ">=1.4.1" }, + { name = "unilab-rl", specifier = "==1.2.1" }, + { name = "unisim-core", specifier = ">=1.4.2" }, { name = "viser", marker = "extra == 'viser'", specifier = ">=1.0.26" }, { name = "wandb" }, ] @@ -3807,7 +3807,7 @@ dev = [ [[package]] name = "unilab-rl" -version = "1.2.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hydra-core" }, @@ -3823,20 +3823,20 @@ dependencies = [ { name = "torch", version = "2.11.0+rocm7.2", source = { registry = "https://download.pytorch.org/whl/rocm7.2" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "wandb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/9d/7a646bc044cadb48cbd1d0c58832faf59e037a45f22432cff2a7ad5a7b01/unilab_rl-1.2.0.tar.gz", hash = "sha256:bb8b1c713b961ea4b24ea72c39d443e057531e71882fa058502af947b98768da", size = 148289, upload-time = "2026-09-10T05:20:52.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/44/2280a1b68c604b3e4b8bd350e34cde0b9d55e91f43266bfa23c7d571a7cb/unilab_rl-1.2.1.tar.gz", hash = "sha256:e9749709e55ceeb9321cd0e2aa1b655cbd276901398003702dc13fb8d71cda85", size = 144847, upload-time = "2026-09-15T14:59:48.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/67/0ea1fb5f0c9a7e8604b0415b018deb3286024191a84d357f1b3221d2a41d/unilab_rl-1.2.0-py3-none-any.whl", hash = "sha256:617317dcca581d1af2daec36d50de7214067dd34f5d85a4f02d7cd38de1df611", size = 183372, upload-time = "2026-09-10T05:20:51.254Z" }, + { url = "https://files.pythonhosted.org/packages/43/d0/384be1d5ed60dfbec4620340784a84042227f396a62cc1a6b965744042eb/unilab_rl-1.2.1-py3-none-any.whl", hash = "sha256:516874fca1649bcfd080c7226e039fd646f7acdfff4c1e97b6f2a27c3264c152", size = 178664, upload-time = "2026-09-15T14:59:47.945Z" }, ] [[package]] name = "unisim-core" -version = "1.4.1" +version = "1.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/57/4da896cef1f76e9902cfe4deb0f5dcf678a2217507dd39fe286a7edb6984/unisim_core-1.4.1.tar.gz", hash = "sha256:aa71cc1f90615929be2e75851d636271675666caa140629c042e6a46fb45d657", size = 269776, upload-time = "2026-09-15T08:21:16.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/e7/5954d490d66facf3449f1032d5cc13288fb4fd1166eaba4eea8987c4f4ca/unisim_core-1.4.2.tar.gz", hash = "sha256:e27d89292083cdff646d2dbeb0ac787ee4351e7ef811c20c6fed2a40578785b7", size = 269413, upload-time = "2026-09-16T04:22:39.708Z" } [[package]] name = "urllib3" From 3817b15473c7d82ec3567d4b6f28838a85c255d3 Mon Sep 17 00:00:00 2001 From: YUFEI JIA <59379871+TATP-233@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:49:08 +0800 Subject: [PATCH 3/3] refactor: drop compat shims unreachable above the new dependency floor (#1596) With unisim-core>=1.4.2 and unilab-rl==1.2.1 as the floor, remove the Genesis legacy retry path, the Newton optional-kwarg pops, the SuperDex execution-mode omission trick, and the CLI SuperDex runtime guard; sync the replay-buffer placement benchmark manifest and reword the affected comments and Newton backend docs. Refs #1592 --- .../en/2-user_guide/3-backends/7-newton.md | 6 +- .../zh_CN/2-user_guide/3-backends/7-newton.md | 7 +- pyproject.toml | 2 +- .../rl/benchmark_replay_buffer_placement.py | 18 ++--- src/unilab/base/backend_factory.py | 65 +++---------------- src/unilab/base/env_factory.py | 8 ++- src/unilab/base/process_device.py | 9 ++- src/unilab/cli.py | 8 +-- tests/base/backend/test_process_device.py | 4 +- tests/base/test_superdex_backend_options.py | 6 +- .../test_replay_buffer_placement_benchmark.py | 2 +- tests/test_cli_runtime_requirements.py | 10 --- uv.lock | 2 +- 13 files changed, 41 insertions(+), 106 deletions(-) diff --git a/docs/sphinx/source/en/2-user_guide/3-backends/7-newton.md b/docs/sphinx/source/en/2-user_guide/3-backends/7-newton.md index 07cbd0d7a..1de946d91 100644 --- a/docs/sphinx/source/en/2-user_guide/3-backends/7-newton.md +++ b/docs/sphinx/source/en/2-user_guide/3-backends/7-newton.md @@ -33,8 +33,10 @@ collector sim processes land on their own physical GPU with no cross-GPU leakage; single-GPU PPO/SAC regressions pass alongside. Newton/Warp follows standard CUDA device semantics, so no `CUDA_VISIBLE_DEVICES` pinning (the Genesis quirk) is needed; the rank-local device reaches spawn collectors as -a `newton_device="cuda:N"` env override (uni_rl 1.0.0's collector-side -process-binding gate only covers mjwarp), and the SAC owner raises the +a `newton_device="cuda:N"` env override, and uni_rl's collector-side +process binding is injection-based — UniLab injects +`bind_backend_process_device_for_backend`, which covers both mjwarp and +newton — while the SAC owner raises the collector tick-0 timeout to 180 s to cover Warp kernel compilation on the cold path. diff --git a/docs/sphinx/source/zh_CN/2-user_guide/3-backends/7-newton.md b/docs/sphinx/source/zh_CN/2-user_guide/3-backends/7-newton.md index 6e3f42e1f..6c57cbe58 100644 --- a/docs/sphinx/source/zh_CN/2-user_guide/3-backends/7-newton.md +++ b/docs/sphinx/source/zh_CN/2-user_guide/3-backends/7-newton.md @@ -31,9 +31,10 @@ DpRankSupervisor DP=2(`training.devices=[0,1]`)训练冒烟均正常完成 在各自 GPU、无对端泄漏;单卡 PPO/SAC 回归同步通过。Newton/Warp 遵循标准 CUDA 设备语义,无需 Genesis 那样的 `CUDA_VISIBLE_DEVICES` 钉卡;rank 本地设备通过 env override 以 `newton_device="cuda:N"` 传入 spawn -collector(uni_rl 1.0.0 的 collector 进程绑定门只覆盖 mjwarp),SAC -owner 将 collector tick-0 超时提升到 180 s 以覆盖 Warp 内核编译的冷 -路径。 +collector,且 uni_rl 的 collector 进程绑定为注入式——UniLab 注入的 +`bind_backend_process_device_for_backend` 同时覆盖 mjwarp 与 +newton;SAC owner 将 collector tick-0 超时提升到 180 s 以覆盖 Warp +内核编译的冷路径。 ## 安装 diff --git a/pyproject.toml b/pyproject.toml index ebaa70f21..5637d1bfe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -170,7 +170,7 @@ viser = ["viser>=1.0.26", "trimesh>=3.21.7"] # required-environments; elsewhere the extra is empty and the CLI reports a # targeted runtime diagnostic. superdex = [ - "unisim-core[superdex]>=1.4.0 ; python_version >= '3.12' and sys_platform == 'linux' and platform_machine == 'x86_64'", + "unisim-core[superdex]>=1.4.2 ; python_version >= '3.12' and sys_platform == 'linux' and platform_machine == 'x86_64'", ] [dependency-groups] diff --git a/scripts/benchmark/rl/benchmark_replay_buffer_placement.py b/scripts/benchmark/rl/benchmark_replay_buffer_placement.py index e98fcc82c..4010c0592 100644 --- a/scripts/benchmark/rl/benchmark_replay_buffer_placement.py +++ b/scripts/benchmark/rl/benchmark_replay_buffer_placement.py @@ -191,6 +191,12 @@ def _xpu_available() -> bool: def _replay_transfer_manifest(device: torch.device, *, ring_depth: int = 2) -> dict[str, Any]: + """Describe the uni_rl 1.2.1 replay-transfer backend for ``device``. + + uni_rl 1.2.1 builds ``CudaLikeReplayTransferBackend`` for CUDA (ROCm + included) and ``TorchCopyReplayTransferBackend`` otherwise; the async + ``submit_h2d`` path and the dedicated XPU backend no longer exist. + """ if device.type == "cuda": torch_version = getattr(torch, "version", None) is_rocm = bool(getattr(torch_version, "hip", None)) @@ -198,26 +204,14 @@ def _replay_transfer_manifest(device: torch.device, *, ring_depth: int = 2) -> d "backend": "CudaLikeReplayTransferBackend", "device_family": "rocm" if is_rocm else "cuda", "host_memory_kind": "registered_pinned_shared", - "supports_async_submit": True, "supports_timing_events": True, "h2d_submitter": "torch_copy_stream" if is_rocm else "pybind11", "ring_depth": ring_depth, } - if device.type == "xpu": - return { - "backend": "XpuReplayTransferBackend", - "device_family": "xpu", - "host_memory_kind": "pageable_shared", - "supports_async_submit": True, - "supports_timing_events": False, - "h2d_submitter": "torch_xpu_copy_stream", - "ring_depth": ring_depth, - } return { "backend": "TorchCopyReplayTransferBackend", "device_family": device.type, "host_memory_kind": "pageable_shared", - "supports_async_submit": False, "supports_timing_events": False, "h2d_submitter": "torch_copy", "ring_depth": ring_depth, diff --git a/src/unilab/base/backend_factory.py b/src/unilab/base/backend_factory.py index 5976cd478..f4ffa1676 100644 --- a/src/unilab/base/backend_factory.py +++ b/src/unilab/base/backend_factory.py @@ -22,25 +22,6 @@ from unilab.base.scene import SceneCfg -def _legacy_genesis_device_option_error(exc: TypeError) -> bool: - """Identify an old UniSim adapter rejecting the optional device keyword. - - UniSim 1.1 reports unknown backend options from ``GenesisBackend`` while - other compatible releases may expose Python's usual ``unexpected keyword`` - wording. Keep the compatibility retry narrowly scoped to those messages; - constructor errors from the actual Genesis runtime must still propagate. - """ - - message = str(exc).lower() - mentions_device = "genesis_device_id" in message or "device_id" in message - rejects_keyword = ( - "does not accept backend options" in message - or "unexpected keyword argument" in message - or "unexpected keyword" in message - ) - return mentions_device and rejects_keyword - - def env_backend_kwargs(cfg: "EnvCfg") -> dict[str, Any]: """Translate ``EnvCfg`` backend knobs into UniSim adapter options.""" result: dict[str, Any] = { @@ -69,18 +50,13 @@ def env_backend_kwargs(cfg: "EnvCfg") -> dict[str, Any]: "isaacsim_render_mode": cfg.isaacsim_render_mode, "isaacsim_render_width": cfg.isaacsim_render_width, "isaacsim_render_height": cfg.isaacsim_render_height, + "superdex_execution_mode": cfg.superdex_execution_mode, } - # Keep the optional key absent for legacy unisim-core releases that do not - # know about Genesis' explicit device argument. Once a rank selects a - # device the key is added below and ``create_backend`` supplies a narrow - # compatibility fallback for those releases. + # Forward the explicit Genesis device id only when a rank selected one; + # when absent, unisim-core's factory default applies and Genesis picks + # its own device. if cfg.genesis_device_id is not None: result["genesis_device_id"] = cfg.genesis_device_id - # Keep the default absent so unisim-core releases that predate the - # execution-mode option still accept the SuperDex kwargs; "serial" requires - # the updated adapter. - if cfg.superdex_execution_mode != "batch": - result["superdex_execution_mode"] = cfg.superdex_execution_mode return result @@ -112,17 +88,6 @@ def create_backend( ensure_robot_assets_for_paths( [scene.model_file, scene.visual_model_file, *scene.fragment_files] ) - if backend_type != "newton": - # Keep the owner translation forward-compatible with unisim-core - # releases that predate the Newton adapter and therefore do not pop - # these optional kwargs in their shared factory. - for key in ( - "newton_device", - "newton_nconmax", - "newton_njmax", - "newton_capacity_check_steps", - ): - kwargs.pop(key, None) if backend_type == "drake": # unisim-core 1.4.2 dropped the Drake-branch filtering of MuJoCo # root-body options; Drake derives root state from its own plant and @@ -139,11 +104,9 @@ def create_backend( } if backend_type == "genesis" and kwargs.get("genesis_device_id") is not None: # Bind before any unisim-core Genesis constructor can call gs.init. - # New unisim-core releases repeat this idempotently; old releases do - # not accept the keyword, so the retry below still gets the correct - # process-wide device. Binding a non-zero id pins - # CUDA_VISIBLE_DEVICES (Quadrants only honors the first visible - # device), so forward the *post-pin* in-process index. + # Binding a non-zero id pins CUDA_VISIBLE_DEVICES (Quadrants only + # honors the first visible device), so forward the *post-pin* + # in-process index. genesis_device_id = kwargs["genesis_device_id"] if ( isinstance(genesis_device_id, bool) @@ -156,19 +119,7 @@ def create_backend( ) bound = bind_genesis_process_device(f"cuda:{genesis_device_id}") kwargs["genesis_device_id"] = int(bound.rsplit(":", 1)[1]) - try: - return unisim.create_backend(backend_type, scene, num_envs, sim_dt, **kwargs) - except TypeError as exc: - if backend_type != "genesis" or "genesis_device_id" not in kwargs: - raise - # unisim-core < 1.2 has no Genesis device field and reports the - # unknown option from GenesisBackend. Retry only for that precise - # capability error; unrelated constructor TypeErrors must propagate. - if not _legacy_genesis_device_option_error(exc): - raise - legacy_kwargs = dict(kwargs) - legacy_kwargs.pop("genesis_device_id", None) - return unisim.create_backend(backend_type, scene, num_envs, sim_dt, **legacy_kwargs) + return unisim.create_backend(backend_type, scene, num_envs, sim_dt, **kwargs) __all__ = ["SimBackend", "create_backend", "env_backend_kwargs"] diff --git a/src/unilab/base/env_factory.py b/src/unilab/base/env_factory.py index 46c256714..20f8f70b5 100644 --- a/src/unilab/base/env_factory.py +++ b/src/unilab/base/env_factory.py @@ -42,9 +42,11 @@ def make_registry_env( # carry the explicit cold-path id in the opaque override and bind # immediately before registry construction. Binding a non-zero id pins # CUDA_VISIBLE_DEVICES for this process, so forward the post-pin - # in-process index downstream. Newer unisim-core versions repeat this - # check in GenesisBackend itself, making this compatibility guard - # idempotent. + # in-process index downstream. This binding is required, not a + # compatibility shim: spawn collectors are fresh interpreters that cannot + # inherit the parent process's binding, and only UniLab's + # ``bind_genesis_process_device`` sets the pinned-namespace flag its + # resolution helpers consult. if sim_backend == "genesis" and env_cfg_override is not None: genesis_device_id = env_cfg_override.get("genesis_device_id") if genesis_device_id is not None: diff --git a/src/unilab/base/process_device.py b/src/unilab/base/process_device.py index ee30357c1..37ab1e0d4 100644 --- a/src/unilab/base/process_device.py +++ b/src/unilab/base/process_device.py @@ -26,9 +26,12 @@ # Newton consumes an explicit ``cuda:N`` device string (``newton_device``) -# instead of an integer id. uni_rl's collector-side binder gate only knows -# mjwarp, so the rank-local device must reach spawn collectors through the -# env override rather than through process binding. +# instead of an integer id. uni_rl's collector-side process binding is +# injection-based: it binds through the caller-supplied ``bind_device`` +# callable and fails closed when none is injected. UniLab injects +# ``bind_backend_process_device_for_backend`` (which covers mjwarp and +# newton); the env override additionally forwards the rank-local device +# string so spawn collectors can pass it to the Newton adapter. BACKEND_ENV_DEVICE_STR_FIELDS: dict[str, str] = { "newton": "newton_device", } diff --git a/src/unilab/cli.py b/src/unilab/cli.py index 926eb2bae..e7fd7944d 100644 --- a/src/unilab/cli.py +++ b/src/unilab/cli.py @@ -133,13 +133,7 @@ def _check_runtime_requirements(algo: str, sim: str) -> None: "in a source checkout (or `pip install unilab[newton]`)." ) if sim == "superdex": - try: - from unisim.backend.superdex.dependencies import superdex_dependencies_available - except ImportError as exc: - raise SystemExit( - "sim=superdex requires unisim-core>=1.1.5 with the SuperDex adapter; " - "the installed unisim-core does not provide that adapter." - ) from exc + from unisim.backend.superdex.dependencies import superdex_dependencies_available if not superdex_dependencies_available(): raise SystemExit( diff --git a/tests/base/backend/test_process_device.py b/tests/base/backend/test_process_device.py index 8c51b61f3..7c1b693f9 100644 --- a/tests/base/backend/test_process_device.py +++ b/tests/base/backend/test_process_device.py @@ -170,8 +170,8 @@ def test_non_gpu_backend_is_left_untouched() -> None: def test_newton_override_carries_cuda_device_string() -> None: - # uni_rl's collector binder gate only knows mjwarp, so newton's rank-local - # device must reach spawn collectors as a ``cuda:N`` override string. + # Newton consumes an explicit ``cuda:N`` string, so its rank-local device + # reaches spawn collectors as an override string rather than an integer id. owner_override: dict[str, object] = {"newton_device": None, "nested": {"keep": True}} routed = apply_backend_env_device_override( owner_override, diff --git a/tests/base/test_superdex_backend_options.py b/tests/base/test_superdex_backend_options.py index 8adc2df69..7d15f306f 100644 --- a/tests/base/test_superdex_backend_options.py +++ b/tests/base/test_superdex_backend_options.py @@ -93,7 +93,7 @@ def create(name: str, scene: SceneCfg, num_envs: int, dt: float, **kwargs: Any) assert captured["superdex_num_workers"] == workers -def test_superdex_execution_mode_is_forwarded_only_when_serial( +def test_superdex_execution_mode_is_always_forwarded( monkeypatch: pytest.MonkeyPatch, ) -> None: captured: dict[str, Any] = {} @@ -111,13 +111,11 @@ def create(name: str, scene: SceneCfg, num_envs: int, dt: float, **kwargs: Any) backend_factory.create_backend( "superdex", scene, 1, 0.002, **backend_factory.env_backend_kwargs(serial) ) - # Legacy unisim-core releases predate the option; the default stays absent - # so they still accept the SuperDex kwargs. assert captured["superdex_execution_mode"] == "serial" backend_factory.create_backend( "superdex", scene, 1, 0.002, **backend_factory.env_backend_kwargs(EnvCfg()) ) - assert "superdex_execution_mode" not in captured + assert captured["superdex_execution_mode"] == "batch" def test_superdex_execution_mode_validates_and_does_not_leak( diff --git a/tests/benchmark/test_replay_buffer_placement_benchmark.py b/tests/benchmark/test_replay_buffer_placement_benchmark.py index 4b2ce02c7..6ba406cdc 100644 --- a/tests/benchmark/test_replay_buffer_placement_benchmark.py +++ b/tests/benchmark/test_replay_buffer_placement_benchmark.py @@ -133,7 +133,7 @@ def test_replay_transfer_manifest_records_backend_fields() -> None: assert manifest["backend"] == "TorchCopyReplayTransferBackend" assert manifest["device_family"] == "cpu" assert manifest["host_memory_kind"] == "pageable_shared" - assert manifest["supports_async_submit"] is False + assert "supports_async_submit" not in manifest assert manifest["ring_depth"] == 2 diff --git a/tests/test_cli_runtime_requirements.py b/tests/test_cli_runtime_requirements.py index de8fbb7af..b4c79390e 100644 --- a/tests/test_cli_runtime_requirements.py +++ b/tests/test_cli_runtime_requirements.py @@ -62,13 +62,3 @@ def test_superdex_missing_runtime_reports_python_and_sdk(monkeypatch: pytest.Mon SystemExit, match=r"Python 3\.12.*Physics/Robotics.*uv sync --extra superdex" ): cli._check_runtime_requirements("ppo", "superdex") - - -def test_superdex_old_unisim_reports_adapter_requirement( - monkeypatch: pytest.MonkeyPatch, -) -> None: - import sys - - monkeypatch.setitem(sys.modules, "unisim.backend.superdex.dependencies", None) - with pytest.raises(SystemExit, match="unisim-core>=1.1.5 with the SuperDex adapter"): - cli._check_runtime_requirements("ppo", "superdex") diff --git a/uv.lock b/uv.lock index d21cbaa7e..d6919a5a9 100644 --- a/uv.lock +++ b/uv.lock @@ -5241,7 +5241,7 @@ requires-dist = [ { name = "typing-extensions" }, { name = "unilab-rl", specifier = "==1.2.1" }, { name = "unisim-core", specifier = ">=1.4.2" }, - { name = "unisim-core", extras = ["superdex"], marker = "python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'superdex'", specifier = ">=1.4.0" }, + { name = "unisim-core", extras = ["superdex"], marker = "python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'superdex'", specifier = ">=1.4.2" }, { name = "viser", marker = "extra == 'viser'", specifier = ">=1.0.26" }, { name = "wandb" }, { name = "warp-lang", marker = "extra == 'mjwarp'", specifier = "==1.16.0" },