架构概览¶
UniLab 是一个 contract 驱动的机器人学习基础设施仓库。其核心规则是:在拥有该 契约的 owner 层修复行为。
运行时模型¶
异步路径采用从 CPU 仿真到加速器 learner 的流水线:
CPU physics backend -> collector / IPC -> learner
MuJoCo or Motrix shared memory torch or mlx
PPO 与 MLX PPO 是同步的单进程路径。APPO 与 off-policy 算法则使用异步 runner、
共享缓冲区,以及位于 src/unilab/ipc/ 与 src/unilab/algos/ 下的权重同步原语。
分层边界¶
层 |
路径 |
拥有 |
|---|---|---|
Backend |
|
|
Env |
|
MDP 语义、观测、奖励、reset |
Config 与 registry |
|
Schema、owner YAML、env/backend 注册 |
算法与 IPC |
|
Learner、runner、buffer、权重同步 |
Scripts |
|
轻量装配与 CLI 路由 |
设计规则¶
将 backend 差异保留在 backend 实现、env 适配层与 owner YAML 中。
使用
uv run train --algo <algo> --task <task> --sim <backend>或uv run eval ...来选择对外的算法/任务/backend 路由。这些 flag 会 compose 出匹配的 owner YAML;training.sim_backend只是一个身份字段。优先用 config 表达,而不是分支。任何扩展的优先级顺序是:config schema -> registry -> env/backend 适配层 -> 最后才是脚本分支。
不要在
step、reset或 interval domain randomization 等热路径中解析 XML 或 资源。如果共享的 env 代码需要某个 backend 操作,先将其加入
SimBackend,再使用。使用证据等级的表述。例如
Registered、Configured、Tested、Benchmarked或Recommended;没有仓库内证据就不要声称稳定支持。上浮可复用原语。通用逻辑应放在
src/unilab/base/或src/unilab/utils/, 不要在多个 workflow 中复制粘贴。在最接近风险的边界处进行验证:Hydra 改动用 config 测试,观测/reset 改动用 env 测试,runner 改动用 IPC 测试。
验证¶
在贴近风险处验证。顶层 smoke run 只能补充、不能替代对改动真正触及边界的验证。
改动类型 |
最少验证 |
|---|---|
仅文档 |
|
Hydra / task / reward 配置 |
|
Env contract / 观测 |
|
Runner / IPC |
|
Backend 路径 |
对应 backend 的 smoke run,必要时补 slow test |
训练入口 |
相关测试加 1 iteration smoke run |
快速路径用 make test;提 PR 前用 make test-all(make check 加
make test-cov)。
评审清单¶
这次改动触及了哪个 contract?
这个问题是否应该在更低层解决?
backend 或 task 行为是通过 config 表达的,还是被脚本特判掩盖了?
support 声明是否有 registry / config / test / benchmark 证据?
验证是否发生在最接近风险的边界?
关键文件¶
scripts/train_rsl_rl.pyscripts/train_mlx_ppo.pyscripts/train_appo.pyscripts/train_offpolicy.pysrc/unilab/base/np_env.pysrc/unilab/base/backend/base.pysrc/unilab/base/registry.pysrc/unilab/ipc/async_runner.pysrc/unilab/training/run.py