Skip to content

[Roadmap] 拆分 RL 算法层为独立包 uni-rl(unilabsim/uni_rl + TestPyPI 发布) #1476

Description

@TATP-233

背景与目标

UniLab 的 RL 算法层 src/unilab/algos/(约 14.7k LOC,59 个 py 文件)目前内嵌在主包中,包含 PPO(rsl_rl 适配)、APPO、FastSAC、FastTD3、FlashSAC、HIM-PPO、HORA(含蒸馏)以及 off-policy 异步运行时。参考 mjlab 的做法(算法层只依赖一个最小 env 契约,runner/wrapper 子类化第三方库)与本仓库 ADR-0007(unisim-core 拆分先例),将算法层拆分为独立仓库 unilabsim/uni_rl

  • distribution name:uni-rl,import namespace:uni_rl
  • 打包:uv_build + src layout + 静态版本(沿用本仓库版本策略)
  • 发布:本 roadmap 期间仅发布到 TestPyPI(凭证在本机 ~/.pypirc

交付边界(In Scope)

  1. 新建 unilabsim/uni_rl 仓库,建立打包与 TestPyPI 发布管线。
  2. 迁移以下内容到 uni_rl(代码 + 对应测试):
    • src/unilab/algos/ 全部(含 rsl_rl.py / rsl_rl_ppo.py / rsl_rl_runtime.py
    • 算法运行强依赖的运行时设施:src/unilab/ipc/(AsyncRunner、shm rollout/replay buffer、replay pipelines、dp_sync、memory_budget)、src/unilab/logging/(OffPolicyLogger / TraceRecorder 等)、src/unilab/utils/ 中 algos 实际使用的子集(seed / nan_guard / device / tensor 等)
  3. 解耦:uni_rl 不 import unilab。env 侧契约(obs dict / reset() -> (obs, info) / step / final-observation 语义 / obs dims)以最小 protocol 在 uni_rl 内表达;目前 algos 内直接构造 env 的点(registry.make 探测 env、create_env、double-buffer builder、hora appo play)改为由调用方注入 env factory / dims。
  4. UniLab 侧适配:依赖 uni-rl;删除已迁移代码;更新 import、conf/**/*.yaml 中的 class_name / runtime_resolver 字符串(unilab.algos.*uni_rl.*)、structured_configs.py 默认值、sim2sim 引用、visualization/interactive_playback.py 及全部相关测试;make test-all 通过。
  5. 文档与 AGENTS.md 更新(新架构边界、指针、发布说明)。

不做(Out of Scope)

  • 不改动 main 与 declared base 分支本身(最终 PR 保持未合入,由 maintainer 决策)。
  • 不发布到正式 PyPI,仅 TestPyPI。
  • 不改变任何算法行为、超参默认值与 checkpoint 格式。
  • 不重构训练脚本流程与 Hydra 配置组织方式(仅做 import/字符串重定向)。
  • uni_rl 仓库的远程 CI / 正式 PyPI trusted publishing 留待后续 roadmap。

预计规模

  • 迁移:algos ~14.7k LOC + ipc/logging/utils 子集(数千 LOC)+ 测试(tests/algos ~6.9k LOC、tests/ipc、相关 utils/logging 测试)。
  • UniLab 侧改动面:6 个训练/play 入口脚本、visualization/interactive_playback.py(约 15 处 lazy import)、structured_configs.py、约 10 处 conf YAML 字符串、utils/sim2sim.py、多个测试文件中的字符串断言。
  • 共 5 个 child issue,每个都是可独立审查/回退的纵向切片。

永久维护成本

  • 新增一个仓库与一条独立版本线;UniLab 通过 PyPI(Test) 依赖消费 uni-rl(同 unisim-core 模式)。
  • 双仓发布纪律:uni_rl 变更需先发版、UniLab 侧升级 pin。
  • 上游 rsl-rl-lib 等算法依赖的 API 漂移跟踪转移到 uni_rl。
  • env 契约 protocol 成为跨仓公共接口,变更需双侧同步评审。

分支与流程

  • Declared base:dev/issue-1042-manager-based-api(冻结,不直接改动)。
  • 集成分支:dev/issue-<roadmap#>-uni-rl-split,从 declared base 最新 head 创建。
  • 每个 child issue 从集成分支建分支并以 PR 合回;roadmap 完成后由集成分支向 declared base 发最终 PR(保持未合入)。
  • 每个 PR 在最终 head 运行本地 make test-all(base 非 main,远程 CI 在后续入 main 的边界执行)。

Child Issues(计划)

  1. uni_rl 仓库初始化与发布管线:建仓、uv_build 骨架、静态版本、README/LICENSE、TestPyPI 首发验证(预发布版本号)。
  2. 代码迁移:algos + ipc + logging + utils 子集与对应测试迁入 uni_rl,内部 import 重写为 uni_rl.*,uni_rl 测试独立通过。
  3. env 契约解耦:protocol 下沉 + env 构造注入,uni_rl 对 unilab 的 import 清零。
  4. UniLab 侧适配:依赖 uni-rl、删除已迁移代码、import/配置字符串/测试全面重定向,make test-all 通过。
  5. 发布与收尾:uni-rl 0.1.0 发 TestPyPI、UniLab 从 TestPyPI 消费验证、文档/AGENTS.md 更新、最终 PR。

验收标准

  • pip install -i https://test.pypi.org/simple/ uni-rl 可安装并 import uni_rl 成功。
  • uni_rl 仓库测试全绿,且全仓不存在 import unilab / from unilab
  • UniLab 集成分支 make test-all 通过,unilab.algos 不再存在。
  • 所有 child issues 关闭,最终 PR(集成分支 → declared base)已创建。

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions