Skip to content

Roadmap: 拆分统一物理后端为独立 unisim / unisim-core package #1428

Description

@TATP-233

Owner summary

这是一个按仓库协作规范管理的大型 roadmap issue:它定义跨 UniLab 与新建 unisim 仓库的集成结果、child issue 依赖顺序和最终回合边界,不把拆仓工作压缩成单个实现 PR。roadmap 的最终结果要求当前版图中的全部仿真物理后端完成迁移;首发只表示交付节奏,不表示其余后端可永久留在 UniLab。

建议在 github.com/unilabsim/unisim 新建独立仓库,以 PyPI distribution unisim-core 发布统一物理后端能力;Python import namespace 确定为 unisim。最小完整交付不是复制 src/unilab/base/backend/,而是先把 scene、随机化、asset、dtype、可视化等反向依赖改造成 package-neutral contract,再交付轻量 core、MuJoCo/Motrix 两个代表性 adapter、conformance kit,并只预留 benchmark API/结果 schema,不做实质 benchmark 开发。UniLab 保留 task/env/manager/Hydra/训练与机器人资产 owner,通过有期限的 re-export shim 分批切换为 unisim-core 消费者,最终删除仓内 backend 实现。

预计跨两个仓库 10–16 个 PR、约 80–140 个 touched files;大量代码是保留历史的移动,新增 glue/发布/文档约 2k–4k 手写 LOC。永久维护责任包括公开 backend API 的兼容策略、per-engine optional extras/support matrix、双仓兼容 CI、TestPyPI release/security、conformance 和 benchmark API/schema。命名、首发范围、版本、许可证、历史迁移、文档、shim、分支、TestPyPI 和资产策略均已由 maintainer 确认。

一句话问题

UniLab 已形成统一 SimBackend 和多个物理引擎 adapter,但这些实现仍与 UniLab 的 scene、domain randomization、asset、工具和训练侧 helper 双向耦合,既不能被独立 benchmark 消费,也不能作为一个轻量、稳定的物理后端 package 供 UniLab 以外的项目复用。

两个产品目标

  1. 物理引擎 benchmark(后续能力):统一 contract 必须预留 benchmark 的 case/result/provenance 接口;本 roadmap 当前不实现 workload、性能测量或 benchmark 结论。
  2. UniLab 的 physics provider:UniLab 继续拥有机器人学习 task 与训练生命周期,但只通过公开 unisim-core contract 构造和使用物理后端,不再内置或私有访问具体引擎实现。

这两个消费者必须使用同一套 contract 和 adapter;不为 benchmark 建第二套简化接口,也不为 UniLab 保留长期 fork。

当前证据

  • Architecture: 统一物理后端抽象、manager-based API 与 mjwarp-uni #882 首次记录未来拆出 unisim 的方向;Architecture Phase 1: 统一物理后端 contract 收敛(unisim 可提取边界) #888 / PR refactor: 统一物理后端 contract 收敛 Phase 1 (#888) #892 已完成第一阶段 SimBackend contract 收敛和 conformance seed,但明确把“建仓、拆包、版本、发布”留给后续 issue。
  • src/unilab/base/backend/base.py 已是公开统一接口,tests/base/test_backend_conformance.pytest_backend_imports.pytest_sim_backend*.py 已提供可复用的边界与一致性测试基础。
  • 该目录目前仍不能直接移动:base.py 依赖 unilab.dr.types;factory 依赖 unilab.assets.hubSceneCfg;各 adapter 还依赖 unilab.base.sceneunilab.terrainsunilab.utils.rotation、global dtype 与 UniLab playback helper。依赖倒置尚未完成。
  • UniLab 的 env/task/training/visualization 多处直接 import unilab.base.backend...,需要受控迁移和兼容窗口,不能一次 rename 后期待所有 consumer 自行修复。
  • 当前开发工作树的 backend Python 代码约 55 个文件、17k 行;相关 backend tests 约 7.7k 行。这里包含多个 engine runtime、subprocess IPC、materialization 与 playback,不适合用一个大 PR 跨仓复制。
  • pyproject.toml 已把 MuJoCo、MJWarp、Motrix 和 Genesis 表达为 optional extras,说明 engine 依赖天然适合按 adapter 隔离;但当前基础 unilab package 仍携带 Torch、Gymnasium、Hydra、learner 等与 physics core 无关的依赖。
  • 2026-09-02 查询 PyPI:unisim-core==0.0.1 是名称占位包;unisim==1.0.1 是另一个名为 “UniSim: Universal Similarity” 的项目。GitHub organization 当前没有 unilabsim/unisim 仓库。

推荐的 package 与仓库边界

unilabsim/unisim repository
  src/unisim/
    contract/          # backend-neutral types, capabilities, errors, lifecycle
    registry/          # lazy adapter registry/factory; no Hydra
    adapters/          # mujoco, motrix, ... optional engine implementations
    subprocess_ipc/    # only if required by extracted adapters
    conformance/       # reusable adapter author test kit
    benchmark/         # engine-level workloads, metrics and result schema

UniLab repository
  task / env / manager / Hydra owner YAML / registry mapping
  reward / observation / termination / runner / learner / checkpoint / sim2sim
  robot asset registry, HF download policy and task-owned scene composition
  thin translation from UniLab config/scene/DR request to unisim inputs

unisim-core owns

  • SimBackend 的公开语义、backend identity、capability、错误类型和生命周期;
  • package-neutral scene/materialization input、state/control/reset/mutation 类型;
  • lazy factory/registry、adapter dependency diagnostics;
  • backend adapter、backend-native runtime、subprocess worker/IPC(若该 adapter 需要);
  • cold-path selector/materialization 与 hot-path buffer/step 规则;
  • conformance kit、benchmark API/result schema 与扩展点(workload、测量和结论暂缓);
  • wheel/sdist、版本、release note、支持矩阵和 API 文档。

UniLab 继续拥有

  • Hydra compose、task=<task>/<backend> owner YAML、training.sim_backend identity 规则;
  • NpEnvState、manager/env/task lifecycle、reward/observation/termination、runner/learner/IPC;
  • sim2sim policy I/O contract、checkpoint、训练与 play entrypoint;
  • 机器人资产 HF registry/cache、task XML/fragment、terrain generation;
  • 将 task-owned scene、DR plan 和显式 dtype/config 翻译成 unisim-core input 的 adapter layer。

不跨越的边界

  • unisim-core 不 import unilab,也不依赖 Hydra、Torch、Gymnasium、RSL-RL 或训练脚本。
  • UniLab 的 env/manager 只调用 unisim-core 已声明的公开 contract,不访问 engine model/data/private runtime。
  • asset/XML/model metadata 仍只在 materialization/cache 等冷路径处理;step/reset 热路径不解析 asset,也不用 getattr/hasattr 探测私有能力。
  • benchmark 只评价 physics contract;RL return、reward、收敛速度和策略效果属于 UniLab 或独立研究,不混入 core benchmark 分数。

命名与发布建议

  • GitHub repository / product brand:unilabsim/unisim / UniSim。
  • PyPI distribution:unisim-core(名称已占位)。
  • Python namespace:已确定为 unisim;PyPI distribution 仍为 unisim-core
  • CLI:首版只在 benchmark 真有稳定入口后提供 unisim-bench;core library 不创建泛化的 train/play CLI。
  • License:建议延续 Apache-2.0,并在迁移时保留 copyright/provenance;具体 engine SDK、fixture asset 和 subprocess worker 的再分发条款逐项审计。
  • 版本:沿用 UniLab 当前版本策略;bootstrap child 记录 source-of-truth、版本同步和 release note 规则,不另行发明独立版本体系。

首版范围选择

推荐首个可发布纵向切片为 core + MuJoCo + Motrix + conformance,同时只预留 benchmark contract/API/result schema,不实现 benchmark workload、性能测量或结论;其余后端仍是本 roadmap 的强制最终迁移范围。
首发切片是阶段性 release;roadmap 完成前必须继续迁移全部后端,不能以首发 package 发布作为结束条件。

首发范围已确认;下表仅记录阶段性 release 的取舍,不改变 roadmap 必须迁移全部 backend 的最终边界:

选项 首版结果 规模与长期成本
A(推荐) core + MuJoCo + Motrix;其余 adapter 逐个迁移 能形成至少双引擎 benchmark,风险可控;迁移期需短期 compatibility matrix
B core + MuJoCo only 最快发布,但不能独立证明“统一多引擎 benchmark”目标,只能作为 package bootstrap
C 一次迁移全部当前 adapter UniLab 更快清空旧目录,但把 IPC、GPU、runtime discovery、playback 和多种 SDK 风险合并到首发,review/release/support 成本最高

首版不自动承诺所有 engine、OS、Python、render、DR 和 sensor 能力对等;这只约束阶段性 release。roadmap 最终必须覆盖当前 UniLab backend registry/版图中的 MuJoCo、Motrix、Drake、MJWarp、Genesis、IsaacGym 和 IsaacSim;benchmark 当前只保留接口,不做实质开发。

Benchmark 接口预留(当前不做实质开发)

本 roadmap 只定义未来 benchmark 所需的稳定扩展点、case/result schema、provenance 字段和 adapter capability 查询接口,不实现 workload、性能采样、GPU/CPU 测量、结果比较或 benchmark 结论。任何实质 benchmark implementation 必须另立 child/issue,并经 maintainer checkpoint 授权。

接口设计仍须与 physics contract 共用同一 scene/control/state 语义,不能为 benchmark 创建第二套 backend API。

迁移策略

Phase 0 — ADR 与提取清单(UniLab,1 PR)

  • 固定 namespace、public/private API、首发 adapter、版本兼容和 release ownership;
  • 生成 import/dependency graph,把每个现有文件归类为 move、split、stay 或 delete;
  • 明确 scene/DR/asset/dtype/playback 的依赖倒置接口;
  • 记录 main 与活跃 integration branch 的 source-of-truth,未合入能力不能被静默当作稳定首发范围;
  • 给出跨仓迁移表和 rollback 条件。

Phase 1 — 仓库与 package bootstrap(unisim,2–3 PR)

  • maintainer 授权后创建 public unilabsim/unisim,默认分支 main
  • 在隔离 clone 中优先用 filtered-history/import 保留可追溯提交,不重写 UniLab 现有分支历史;若历史保留成本过高,使用明确 provenance manifest 的 snapshot import;
  • 建立 uv/uv_build、Apache-2.0、CODEOWNERS、issue/PR 模板、lint/type/test、wheel/sdist clean-install smoke;
  • 抽出不 import UniLab/engine SDK 的 core contract、fake backend 和 conformance kit。

Phase 2 — 首个双引擎纵向切片(unisim,3–5 PR)

  • 先迁 MuJoCo,再迁 Motrix;每个 adapter 独立一个 implementation issue/PR;
  • 将 UniLab-owned scene、DR、asset、terrain、dtype 和 playback 依赖倒置到正式 input/protocol;
  • adapter optional extras、lazy import、缺依赖诊断和平台矩阵通过 clean env 验证;
  • 预留 benchmark extension points/result schema 和最小 fake/reference hook;不实现 benchmark workload、性能测量或结论。

Phase 3 — UniLab consumer migration(UniLab,2–4 PR)

  • UniLab pin 已发布的 unisim-core pre-release/stable artifact,并在 owner config 层完成参数翻译;
  • unilab.base.backend 可短期作为只 re-export/诊断的 compatibility shim,但不保留实现副本或行为分叉;
  • env/manager/training/visualization consumer 分批改用新 public namespace;
  • 全部 consumer 迁完后删除对应 UniLab backend 实现、重复 tests 和过渡 shim。

Phase 4 — 其余 adapter 与稳定发布(每 adapter 独立 child)

  • Drake、MJWarp、Genesis、IsaacGym、IsaacSim 等只在其 source branch 已进入声明 base、依赖许可证可发布、conformance 和平台验证明确后逐个迁移;
  • out-of-process adapter 共用一份 subprocess_ipc,不复制 worker protocol;
  • roadmap 完成前只使用 TestPyPI 完成预发布、安装 smoke 和兼容性验证;生产 PyPI 发布由 maintainer 在最终 roadmap PR 完成后手动执行。

文档迁移(与代码同等交付)

文档不是收尾工作,而是每个迁移 child 的纵向交付物。需要同步维护中英文入口和新仓库文档,避免代码已经切换但用户仍按照旧 import、旧安装命令或旧 backend identity 操作。

  • unisim 必须提供 README、安装与 optional extras 说明、public API/contract 文档、adapter support matrix、conformance kit 使用说明、benchmark workload/result schema、版本策略、CHANGELOG、迁移指南和 release 文档。
  • UniLab 必须同步更新 README.mdCONTRIBUTING.md、中英文 Sphinx getting-started/developer/backend 文档、backend 配置与 task 迁移示例;明确 unisim-core 版本约束、unilab.base.backend compatibility shim 的退役版本,以及 uv run 验证命令。
  • 文档中的 engine support、性能数字、安装平台和 benchmark 结论只能引用同一 commit 的测试/benchmark 证据;不把单机结果写成普遍 support claim。
  • 文档迁移 child 必须与对应代码 child 同步 review;中英文内容、链接、代码示例和 API 名称在文档 gate 中检查。

Child issue 与依赖顺序

本 roadmap 开发授权后,按以下顺序创建并合并 child issue;每个 child 一个主要结果、一个工作分支和一个 PR。编号为计划标识,实际 issue 创建后回填链接:

  1. Child 1:ADR、依赖图与提取清单(UniLab):固定 unisim namespace、首发 adapter、版本/许可证、compatibility window、文档 owner 和 benchmark 接口预留范围;产出 move/split/stay/delete 清单。
  2. Child 2:unisim 仓库与 core/conformance bootstrap:从 declared base 的已确认来源建立仓库、构建/测试/release 骨架、package-neutral contract、fake backend 和 conformance kit。
  3. Child 3:MuJoCo adapter + benchmark 接口 fixture:完成第一个真实 adapter、optional extra、cold-path materialization、step/reset/state-read conformance,并只提供 benchmark 接口 fixture 与文档,不做实质 benchmark。
  4. Child 4:Motrix adapter + benchmark schema 对齐:完成第二个真实 adapter、同一 workload 所需的接口/结果 schema 对齐和文档;不执行 benchmark workload、测量或结论。
  5. Child 5:UniLab consumer migration:以已发布 unisim-core 为依赖,迁移 env/task/manager/training/visualization consumer,保留有期限 shim 并补回归。
  6. Child 6:UniLab 文档与迁移指南收口:同步中英文用户/开发者文档、安装/配置/示例、旧路径退役说明;若各代码 child 已包含完整文档,可由 maintainer 合并为同一纵向 child,但不得省略。
  7. Child 7:Drake adapter:迁移 Drake backend、其依赖倒置、conformance、benchmark API 接入和文档;不执行实质 benchmark。
  8. Child 8:MJWarp adapter:迁移 MJWarp backend、GPU/placement contract、conformance、benchmark API 接入和文档;不恢复已退役的 device-only lifecycle,不执行实质 benchmark。
  9. Child 9:Genesis adapter:迁移 Genesis backend、runtime discovery、conformance、benchmark API 接入和文档;不执行实质 benchmark。
  10. Child 10:IsaacGym adapter:迁移 IsaacGym backend 及其 out-of-process worker/IPC,复用共享 subprocess protocol,完成平台/support 证据、benchmark API 接入和文档;不执行实质 benchmark。
  11. Child 11:IsaacSim adapter:迁移 IsaacSim backend 及其 out-of-process worker/IPC,复用共享 subprocess protocol,完成平台/support 证据、benchmark API 接入和文档;不执行实质 benchmark。
  12. Child 12:全 backend 收口与 UniLab 删除:确认上述七类 backend 均由 unisim-core 提供,删除 UniLab 内对应实现、重复测试和长期 compatibility shim,完成全量文档与迁移指南验收。

依赖关系为 1 → 2 → 3 → 4 → 5 → 6,随后按 7 → 8 → 9 → 10 → 11 → 12 完成全量 backend 收口;Child 7–11 可在 core 稳定后按 engine 并行,但 Child 12 必须等待全部 adapter、文档和 support matrix 完成,不能把任一当前 backend 标记为永久 deferred。

每个 child 的 PR base 必须是本 roadmap 集成分支 dev/issue-1428-unisim-extraction;该分支从 declared base dev/issue-1042-manager-based-api 的最新只读快照创建。所有开发和发布不得直接修改 UniLab maindev/issue-1042-manager-based-api;全部 child 合并并在集成分支最新 head 通过 gate 后,才在 roadmap 完成阶段准备回合 declared base 的最终 PR,且在此之前不向其写入。

Roadmap / repository 治理

  • 本 issue 创建在 UniLab,因为源代码、现有 consumer 和拆分决策当前由 UniLab 拥有;新仓库创建后,在 unilabsim/unisim 建 execution roadmap 并与本 issue双向链接。
  • UniLab declared base:dev/issue-1042-manager-based-api;提案时该分支 head e6867464(2026-09-02)。该分支和 main 在本 roadmap 执行期间均只读;所有 UniLab child 从 roadmap 集成分支创建,不能从 main 或 declared base 直接开发或发布。
  • unisim 仓库在创建后使用其 main 作为仓内 base;它不是 UniLab 的 declared base。跨仓 consumer PR 仍先在各自仓库完成本地 gate,再由 UniLab 集成分支承接。
  • 本 issue 已获得全自主开发授权;实现、文档和 TestPyPI 验证可按 child 顺序连续推进,但不得修改 UniLab maindev/issue-1042-manager-based-api
  • 两仓 PR 各自在最终 head 运行本仓完整本地 gate;UniLab child/集成分支继续遵循 make test-all(执行时使用仓库规定的 uv run 环境),unisim 仓库固定等价的 uv run gate。开发和发布阶段只使用 TestPyPI;credentials 位于 ~/.pypirc,不得输出、提交或复制其内容;最终生产 PyPI 发布由 maintainer 手动执行。
  • 创建或更新任何 PR 前,必须确认工作树干净并在最终 head 记录 gate 结果;base 为 roadmap 集成分支的 PR 使用本地 gate 与 review,不触碰 UniLab main 或 declared base。
  • 当 declared base 前进时,只在计划同步点读取其最新 head 并重建/同步 roadmap 分支;不得向 declared base 写入,不得把旧 head 的测试结果带入候选。

预计规模与 review

  • Phase 0:5–10 files,≤800 手写 LOC,1 PR。
  • Bootstrap/core:15–25 files,约 1k–2k 手写 LOC,2–3 PR。
  • 首个两个 adapter:约 25–45 moved/edited files,1k–2k glue/benchmark LOC,3–5 PR;移动代码与新增手写代码分开报告。
  • UniLab migration/cleanup:约 30–60 touched files,2–4 PR;删除 LOC 不设硬上限,但每个 PR 只迁移一个 consumer/adapter 边界。
  • 全部 adapter 完成预计合计 10–16 PR、80–140 touched files。发现公共 contract、IPC、release/support 或平台责任明显超出上述预估时,先更新 roadmap 再继续。
  • Review owner:Backend/API、Packaging/Release、UniLab Env/Config;benchmark API/schema 由 Backend + Performance reviewer 共同确认。

Acceptance criteria

  • maintainer 已确认 namespace=unisim、distribution=unisim-core、首发范围、版本策略、license/repository visibility 和 benchmark 仅接口预留边界。
  • unilabsim/unisim 是可独立 clone/build/test 的仓库;历史或 provenance 可追溯到 UniLab 来源。
  • clean env 安装 base unisim-core 后不需要 UniLab、Hydra、Torch、Gymnasium 或任一 engine SDK,import 不触发 optional runtime。
  • 每个 engine extra 在支持的平台 clean env 中有 wheel/sdist install smoke、明确依赖错误和 support matrix。
  • conformance kit 覆盖 fake backend 与首发两个真实 adapter;unsupported capability 在 cold path fail closed。
  • benchmark v1 仅完成接口/结果 schema 预留,不实现 workload、性能测量或比较;未来实质 benchmark 需独立授权。
  • UniLab 的 task/env/manager/Hydra/asset/sim2sim contract 保持 owner 不变;backend-specific 逻辑不扩散到 scripts/runner/learner。
  • UniLab 通过发布的 unisim-core 使用已迁移 adapter;对应实现不存在长期双份,compatibility shim 有删除版本/issue。
  • roadmap 最终验收确认 MuJoCo、Motrix、Drake、MJWarp、Genesis、IsaacGym、IsaacSim 全部通过 unisim-core 公开 contract;UniLab 不再保留这些 backend 的实现副本或行为分叉,compatibility shim 已按记录版本删除。
  • 近风险验证包括 contract/import audit、adapter conformance、scene/materialization、reset/mutation、state shape/dtype、optional dependency 和跨版本 compatibility。
  • 最终 UniLab head 通过 make test-all;unisim 最终 head 通过其完整 uv run gate;发布 artifact 通过 isolated smoke。
  • TestPyPI 发布、isolated smoke、版本/changelog/migration guide 和 rollback 记录有 owner;roadmap 完成前不执行生产 PyPI 发布,最终生产发布由 maintainer 手动执行。

Non-goals

  • 不把 UniLab 的 manager/task/reward/learner/runner/checkpoint/sim2sim 搬入 unisim-core
  • 不借拆包重新设计第二套 backend V2、runner lifecycle 或 collector/learner protocol。
  • 不在首版承诺全部 backend 的 parity;但 roadmap 最终交付不允许把当前 backend 永久留在 UniLab 或标记为可选迁移。
  • 不把机器人 mesh/texture 打进 wheel;fixture asset 必须小、许可明确并拥有稳定 digest。
  • 不以 benchmark 为由在常规 CI 强制专有 SDK、GPU 或长时 job。
  • 不在两个仓库长期维护同一 adapter、protocol 或 conformance test 的副本。
  • roadmap 已授权创建 unilabsim/unisim、迁移代码、更新文档并发布到 TestPyPI;但不修改 UniLab maindev/issue-1042-manager-based-api,不在 roadmap 完成前发布生产 PyPI。

Stop conditions / 范围复核点

  • unisim-core 为了构造 backend 仍必须 import UniLab scene/DR/asset/Hydra 类型;先完成依赖倒置,不发布循环依赖 package。
  • TestPyPI credentials、依赖许可证、目标平台和 engine runtime 的关键事实必须在对应 child 中记录;小型实现问题不得阻塞整体推进,但不得绕过 contract 或发布安全边界。
  • 任一迁移 adapter 的 upstream SDK/license、fixture asset 再分发权或目标平台 wheel 可用性不清楚。
  • 为保持兼容需要永久双实现、动态探测 backend 私有能力或绕过 SimBackend lifecycle。
  • active integration branch 与 main 的 contract/adapter 差异无法确定 source-of-truth。
  • benchmark 无法固定同步、transfer、scene 和 state 语义,导致结果比较的是不同 workload。
  • 新增公共 execution path、常规硬件 CI、production support claim 或跨仓 release coupling 超出已确认范围。

Related

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

    area:benchmarkBenchmark recording and evaluation workflowenhancementNew feature or requestroadmap

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions