背景与目标
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)
- 新建
unilabsim/uni_rl 仓库,建立打包与 TestPyPI 发布管线。
- 迁移以下内容到 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 等)
- 解耦: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。
- 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 通过。
- 文档与
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(计划)
- uni_rl 仓库初始化与发布管线:建仓、uv_build 骨架、静态版本、README/LICENSE、TestPyPI 首发验证(预发布版本号)。
- 代码迁移:algos + ipc + logging + utils 子集与对应测试迁入 uni_rl,内部 import 重写为
uni_rl.*,uni_rl 测试独立通过。
- env 契约解耦:protocol 下沉 + env 构造注入,uni_rl 对 unilab 的 import 清零。
- UniLab 侧适配:依赖 uni-rl、删除已迁移代码、import/配置字符串/测试全面重定向,
make test-all 通过。
- 发布与收尾: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)已创建。
背景与目标
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:uni-rl,import namespace:uni_rluv_build+ src layout + 静态版本(沿用本仓库版本策略)~/.pypirc)交付边界(In Scope)
unilabsim/uni_rl仓库,建立打包与 TestPyPI 发布管线。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 等)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。uni-rl;删除已迁移代码;更新 import、conf/**/*.yaml中的class_name/runtime_resolver字符串(unilab.algos.*→uni_rl.*)、structured_configs.py默认值、sim2sim引用、visualization/interactive_playback.py及全部相关测试;make test-all通过。AGENTS.md更新(新架构边界、指针、发布说明)。不做(Out of Scope)
main与 declared base 分支本身(最终 PR 保持未合入,由 maintainer 决策)。预计规模
tests/algos~6.9k LOC、tests/ipc、相关 utils/logging 测试)。visualization/interactive_playback.py(约 15 处 lazy import)、structured_configs.py、约 10 处 conf YAML 字符串、utils/sim2sim.py、多个测试文件中的字符串断言。永久维护成本
rsl-rl-lib等算法依赖的 API 漂移跟踪转移到 uni_rl。分支与流程
dev/issue-1042-manager-based-api(冻结,不直接改动)。dev/issue-<roadmap#>-uni-rl-split,从 declared base 最新 head 创建。make test-all(base 非 main,远程 CI 在后续入 main 的边界执行)。Child Issues(计划)
uni_rl.*,uni_rl 测试独立通过。make test-all通过。验收标准
pip install -i https://test.pypi.org/simple/ uni-rl可安装并import uni_rl成功。import unilab/from unilab。make test-all通过,unilab.algos不再存在。