为 UniLab 做贡献¶
本页概述面向贡献者的仓库工作流。契约与架构细节见 架构概览。
环境¶
按平台安装依赖。setup target 也会安装仓库检查所需的可选仿真器 extra:
macOS(MPS,PyPI torch wheel):
make setup-motrix(或make setup-mujoco)Linux NVIDIA(PyTorch cu128 wheel):
make setupLinux AMD / ROCm:
make sync-rocm,随后用uv run ...运行命令。要切回默认 CUDA / macOS profile,执行git restore -- pyproject.toml uv.lock后重新make setup。Linux Intel XPU:
make sync-xpu如果更喜欢直接使用 uv,完整默认环境为
uv sync --extra mujoco --extra motrix; 单后端使用--extra mujoco或--extra motrix。
# 选择一条核心安装路径:
make setup
# make setup-mujoco
# make setup-motrix
make sync-rocm
make sync-xpu
请使用 uv run 运行命令。不要在 uv run 之外直接调用 python。
开发规则¶
始终使用
uv run。任何代码相关提交前先运行make check。不要提交备份或临时文件:不要
*.bak、*.tmp、*.old、*.orig,也不要以~结尾的编辑器备份文件。不要往
src/unilab/utils/塞新的 owner 逻辑。那里的模块是过渡期 shim;应把 长期逻辑上移到对应 owner 层或src/unilab/base/。模块命名表达 owner 职责:默认使用单数名词;只有当语义本身就是集合契约时才用 复数;工厂模块使用
_factory后缀。代码注释、公共 API docstring、内部实现说明、TODO/FIXME 与配置注释默认使用 英文。中文说明放在
docs/sphinx/source/zh_CN/下的中文文档中,不在源码注释或 配置注释中重复本地化说明。当改动影响用户可见工作流时,保持
README.md、CONTRIBUTING.md,以及docs/sphinx/source/en/与docs/sphinx/source/zh_CN/下对应页面同步。
注释语言规范¶
公共 API docstring 必须用英文描述 contract、参数、返回值与边界条件。
inline comment 用英文解释非显而易见的实现意图、owner 边界,或 backend/env/config 不变量;过时注释应删除,而不是机械翻译。
TODO/FIXME 使用英文,并尽量写明后续处理所属的 owner layer 或外部依赖。
Hydra YAML 与示例配置注释使用英文,因为它们与源码 contract 一起 review。
已存在的中英文混用注释按小 PR 分批迁移。优先级为公共 contract、backend adapter、env contract、training runner、config schema 和高频测试,再处理低风险 示例。
常用命令¶
make format
make type
make check
make test
make test-cov
make test-slow
make test-all
文档改动在 make test-all 之外运行以下针对性验证:
uv run pytest tests/scripts/test_check_docs.py -q
cd docs/sphinx
UNILAB_DOCS_SKIP_AUTODOC=1 uv run --no-project --with-requirements requirements.txt sphinx-build -b html -n source build/html
Docs GitHub Actions workflow 会在 base 为 main 的匹配 PR 和 main push 上运行
同样的 prose-only 构建,也可以在 GitHub Actions 网页界面通过 workflow_dispatch
手动触发。它不会用
pip install -e . 安装 UniLab,不生成 API reference 页面,也不发布外部文档仓库。
如果要在本地对完整站点(含面向 UniLab-doc 发布流程的 API reference 页面)做最终
刷新,请从已同步的开发环境用并行 Sphinx 构建:
uv sync
uv pip install -r docs/sphinx/requirements.txt
cd docs/sphinx
uv run --no-sync sphinx-build -j auto -b html -n source build/html
协作¶
使用 Conventional Commit 标题。Issue 范围、roadmap 分支、PR 证据、本地和远程 gate、ADR
与发布的唯一规则来源是 协作工作流。创建或更新 PR 前,在最终 head
运行贴近改动契约的检查和 make test-all。
测试¶
测试按 owner 区域分组,位于 tests/:
tests/
├── base/ # registry、backend 选择、env contract
├── config/ # Hydra / dataclass / reward 注入
├── envs/ # 环境配置与实例化
├── dr/ # domain-randomization 类型与 manager
├── terrains/ # 地形生成器与场景 materialization
├── ipc/ # shared-memory 与 async-runner 原语
├── scripts/ # 训练脚本配置与入口工具
├── algos/ # runner 集成、RSL-RL PPO
├── integration/ # 跨模块 reward / config 集成
├── training/ # 训练运行辅助
└── utils/ # 辅助工具与实验跟踪
标记与跳过:
无标记的测试是快速 unit / contract / env smoke,由
make test运行。@pytest.mark.slow标记完整训练/脚本 smoke 或累计成本高的 backend matrix。CI 会跳过,本地用make test-slow。slow标记在pyproject.toml中注册。
make test-slow 运行须知:
测试专用 env 注册走子进程钩子。off-policy / APPO 等 runner 通过
multiprocessing.spawn起 collector 子进程,spawn 出来的解释器不会执行tests/conftest.py,所以DummyFlatTest等测试 env 不能只在 conftest 完成注册。tests/conftest.py会向UNILAB_EXTRA_REGISTRY_PACKAGES环境 变量注入tests._test_registry,unilab.base.registry.ensure_registries在子进程内读到后再次完成注册。新增测试 env 时,把模块加进tests/_test_registry/__init__.py的__unilab_registry_modules__。Replay 内存预算。off-policy host shared memory 只包含固定深度 ingress,随
num_envs与 transition width 增长,不随replay_buffer_n增长。完整 ring 按replay_buffer_n驻留在 CUDA/MPS learner device。如果运行时看到形如MemoryError: estimated shared-memory allocation … exceeds /dev/shm available …,说明本机 shared memory 不够容纳默认 ingress。device ring 分配失败 会另行报告所需与可用的 accelerator budget。
文档预期¶
命令必须指向已签入的脚本、包入口、Makefile target 或 config owner。
后端与任务的支持声明应当使用证据等级,例如
Registered、Configured、Tested、Benchmarked或Recommended。不要把
training.sim_backend=<backend>描述为独立的后端切换方式。在 面向用户的命令中使用--sim <backend>,并在内部选择 owner YAML 路径。让英文页面不含手写的导航块。
配置改动¶
任务、后端、reward 与算法的选择应当属于 Hydra owner YAML。当添加或改动
一条可运行路径时,更新 src/unilab/conf/ 下相关的 owner config,并用 tests/config/
或 tests/scripts/ 下的测试验证脚本组合。
参见 任务 owner config 契约 与 Hydra 配置。