Skip to content

roadmap: IsaacGym 后端接入的可行性分析与方案建议 #1332

Description

@TATP-233

背景与目标(已经 maintainer 确认方向)

为 UniLab 增加 IsaacGym 物理后端。目的:方便从 IsaacGym 体系迁移项目、以及跨后端物理对比;不是效率优化项。这是必做项

约束(maintainer 明确)

  • UniLab 仓库不引入任何本地绝对路径依赖;IsaacGym 源码(本机 /home/user/ws/simulator 下)仅供本地查看参考,不进入依赖树。
  • 交付物必须包含自动化配置脚本 + 指南文档,让任何一台新机器能按文档/脚本从零搭好 IsaacGym 运行时。

本 issue 是 roadmap + umbrella 规划,不直接授权开发;各 child issue 单独确认后开工。

仓库现状(已核实的事实)

  • Backend 契约:SimBackendsrc/unilab/base/backend/base.py:230)是纯 numpy 接口,约 22 个 abstract 方法;生命周期 构造 → materialize() → 热路径 step/get → cleanup;热路径禁止解析 asset。
  • 工厂与注册:create_backend()src/unilab/base/backend/__init__.py:98)、_SUPPORTED_SIM_BACKENDS = ("mujoco","mjwarp","motrix","drake")src/unilab/base/registry.py:42);切后端走 task=<task>/<backend> 选 owner YAML。
  • GPU 后端先例:mjwarp 以 host-numpy profile 接入(GPU 物理 + 边界 H2D/D2H 拷贝),证明 GPU 后端可在不改接口前提下接入。
  • IsaacGym 运行时先例:scripts/benchmark/physics/benchmark_physics_step_isaacgym.py 通过外部环境变量(UNILAB_BENCHMARK_HOLOSOMA_DEPS / UNILAB_BENCHMARK_HSGYM_PYTHON / UNILAB_BENCHMARK_HSGYM_LIB)定位外部 Python 3.8 环境跑 benchmark——IsaacGym 不进主 venv 是既有模式。
  • 工具链硬约束:主仓库 requires-python = ">=3.10,<3.14" + torch==2.7/2.9;IsaacGym Preview 4(EOL)只支持 Python 3.6–3.8。→ in-process 集成被否决,唯一可行架构是 subprocess 隔离
  • 参考实现:本机 /home/user/ws/simulator/holosoma 有完整 isaacgym 集成(src/holosoma/holosoma/simulator/isaacgym/isaacgym.py,URDF 资产 + tensor API + use_gpu_pipeline)和安装脚本(scripts/setup_isaacgym.sh,conda/mamba + py3.8 hsgym env);simtoolrealuv venv --python 3.8 的轻量替代路径。均可作实现参考,不复制代码。
  • sim2sim:src/unilab/utils/sim2sim.py ALLOWLIST 已含 training.sim_backend,不需改契约文件;scripts/audit_sim2sim_contracts.pyPRIMARY_PAIR 需泛化。
  • 测试注意点:tests/base/test_registry.py:222 目前把 "isaacgym" 当非法后端用例,落地时需调整;conformance 参数化在 tests/base/test_backend_conformance.py:85

架构结论

方案:subprocess 隔离后端。主进程 IsaacGymBackend 满足 SimBackend numpy 契约;物理在独立 Python 3.8 环境的 worker 子进程中跑(worker 只依赖 numpy + isaacgym);action/state 经共享内存 + 管道 IPC 批量交换。运行时定位走环境变量 + 自动探测(参照 benchmark 的 UNILAB_BENCHMARK_HSGYM_* 模式,另立 UNILAB_ISAACGYM_* 规范),仓库内零绝对路径。

因目标是迁移与物理对比而非吞吐,IPC 开销可接受;不支持的 DR / render 能力按惯例 fail-closed。IsaacGym 侧资产为 URDF,MJCF→URDF 的 sensor/keyframe 概念映射在冷路径完成。

Child issue 拆分(每个单独确认,各自满足单 issue 规模上限)

  1. Child 1 — 环境配置自动化 + 指南文档scripts/tools/ 下新增 isaacgym 运行时安装/自检脚本(miniconda 或 uv 建 py3.8 env、解包用户手动下载的 Preview 4 tarball、pip install -e isaacgym/python、import 自检、打印 export 指引);docs/sphinx/source/{en,zh_CN}/2-user_guide/3-backends/ 新增 isaacgym 页面并登记 toctree。遵循 Evidence only:只写外部环境准备与 benchmark 用法,不声称训练支持。
  2. Child 2 — IsaacGymBackend 实现src/unilab/base/backend/isaacgym/(backend + py3.8 worker 入口 + IPC 协议)+ factory/registry 接入 + env_backend_kwargs 扩展 + conformance 测试参数(无 GPU/无运行时则 skip)。
  3. Child 3 — 配置与 sim2sim/play 接入conf/<algo>/task/<task>/isaacgym.yaml(先 1 个 task)、audit_sim2sim_contracts.py 泛化、test_registry.py:222 用例调整、play 入口验证(物理对比是首要场景,优先保证 play/sim2sim 而非训练吞吐)。

永久维护成本(诚实估计)

  • 一条跨进程 IPC 协议及 worker 生命周期管理(崩溃恢复、僵尸进程、GPU device 分配)的长期维护;
  • 每个支持的 task × algo 一份 isaacgym.yaml,DENYLIST 字段跨后端一致(audit CI 保障);
  • IsaacGym 本体 EOL:CUDA/驱动升级可能破坏 Python 3.8 运行时,届时需再投入或下线该后端;
  • 文档与安装脚本需跟随 NVIDIA 分发渠道变化(Preview 4 tarball 需 developer 账号手动下载)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions