背景
scripts/(约 3.5 万行)与 src/unilab(尤其 src/unilab/training/)存在系统性的职责混乱与耦合,对照参考仓库 mjlab 的分层模式后确认三个结构性问题:
- scripts/ 越界承载库层逻辑:
scripts/benchmark/mjwarp/backend.py(754 行)是完整 SimBackend 子类;scripts/benchmark/torch_env/ 复制 task reward/obs 数学;play_viser.py import play_interactive.py 私有函数;多个脚本 import base.backend.mujoco.* 私有工具。
- training/ 职责混杂 + 依赖方向错乱:12 个文件混了 5 种性质(utils / 算法适配 / 部署推理 / 编排);
training/experiment.py:73-97 运行时 exec_module 依赖 scripts/benchmark/core/device_info.py(库→scripts 倒置);algos 十余处 import training 而 training 又 import algos,形成互依。
- 平行实现泛滥:play 管线 8 处(
visualization/interactive_playback.py 的 4 个 session 工厂无人用)、run 目录命名 3 份、checkpoint 诊断 3 份、_algo_config_dict 4 份、NanGuard 接线 3 份、MotionLoader 2 套、config 快照 2 套格式。
好的方面:envs/、tasks/、managers/ 三层干净(无向上依赖、无 backend 私有探测),本次不动。
总目标与边界
做什么:把混进 scripts/ 的库层逻辑归位,收敛平行实现,拆掉 training/ 与 algos/、scripts/ 之间的错乱依赖。完成后"任何一段逻辑,看路径就知道它该在哪"。
不做什么:
- 不动
envs/、tasks/、managers/ 三层;
- 不改任何训练语义、算法行为、配置 schema、checkpoint 格式(纯结构性移动 + 去重,行为等价);
- 不引入新框架(不迁 tyro、不动 Hydra 体系、不将 CLI 收编为 console script——方向性决策另行再议);
- 不整体治理
scripts/benchmark/(约 2 万行,单独评估),本期只掐断它对库层的反向污染。
预计总规模:5 个 sub-issue,每个一个 PR;合计净改动预计 1200–1800 行(大半是 import 路径变更与删除重复代码)。
永久维护成本:低。重复点从 N 份收敛为 1 份后维护成本下降;新增约束用现有测试 + 少量 import 边界测试守住,不引入新运行时机制。
Sub-issues
执行顺序与依赖
基于分支 dev/issue-1042-manager-based-api 新建分支开发,pr时也merge回此分支。
#1240(反向依赖)──┐
├─→ #1242(play 统一)─→ #1243(training 归位)
#1241(样板收敛)──┘
#1244(motion/deploy)独立,可任意插空
#1240、#1241 先行:小而独立、风险低、见效快;#1242 依赖前两者(动同一批入口文件,先小收敛减少冲突面);#1243 必须在 #1242 之后(training/offpolicy.py 去向依赖 #1242 的结果);#1244 与主线无依赖。
明确未授权、需单独确认的扩张点
- 是否学 mjlab 把 train/play 收编为
[project.scripts] console entry(新 execution path);
normalize_ppo_train_cfg 等 Python 层配置解释是否长期保留(触及 config first 原则取舍,需产品判断);
scripts/benchmark/(含 torch_env/ 数学复制、mjwarp/backend.py)整体去留。
以上三点在 sub-issue 执行中一律绕过不碰,需要时单独立项。
背景
scripts/(约 3.5 万行)与src/unilab(尤其src/unilab/training/)存在系统性的职责混乱与耦合,对照参考仓库 mjlab 的分层模式后确认三个结构性问题:scripts/benchmark/mjwarp/backend.py(754 行)是完整SimBackend子类;scripts/benchmark/torch_env/复制 task reward/obs 数学;play_viser.pyimportplay_interactive.py私有函数;多个脚本 importbase.backend.mujoco.*私有工具。training/experiment.py:73-97运行时exec_module依赖scripts/benchmark/core/device_info.py(库→scripts 倒置);algos 十余处 import training 而 training 又 import algos,形成互依。visualization/interactive_playback.py的 4 个 session 工厂无人用)、run 目录命名 3 份、checkpoint 诊断 3 份、_algo_config_dict4 份、NanGuard 接线 3 份、MotionLoader 2 套、config 快照 2 套格式。好的方面:
envs/、tasks/、managers/三层干净(无向上依赖、无 backend 私有探测),本次不动。总目标与边界
做什么:把混进 scripts/ 的库层逻辑归位,收敛平行实现,拆掉 training/ 与 algos/、scripts/ 之间的错乱依赖。完成后"任何一段逻辑,看路径就知道它该在哪"。
不做什么:
envs/、tasks/、managers/三层;scripts/benchmark/(约 2 万行,单独评估),本期只掐断它对库层的反向污染。预计总规模:5 个 sub-issue,每个一个 PR;合计净改动预计 1200–1800 行(大半是 import 路径变更与删除重复代码)。
永久维护成本:低。重复点从 N 份收敛为 1 份后维护成本下降;新增约束用现有测试 + 少量 import 边界测试守住,不引入新运行时机制。
Sub-issues
执行顺序与依赖
基于分支 dev/issue-1042-manager-based-api 新建分支开发,pr时也merge回此分支。
#1240、#1241 先行:小而独立、风险低、见效快;#1242 依赖前两者(动同一批入口文件,先小收敛减少冲突面);#1243 必须在 #1242 之后(
training/offpolicy.py去向依赖 #1242 的结果);#1244 与主线无依赖。明确未授权、需单独确认的扩张点
[project.scripts]console entry(新 execution path);normalize_ppo_train_cfg等 Python 层配置解释是否长期保留(触及 config first 原则取舍,需产品判断);scripts/benchmark/(含torch_env/数学复制、mjwarp/backend.py)整体去留。以上三点在 sub-issue 执行中一律绕过不碰,需要时单独立项。