You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
调研:mjlab 课程学习(Curriculum)MBA 设计 vs UniLab 现状——框架能力已补齐,剩余差距在文档与增强项
#1580
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
调研:mjlab 课程学习(Curriculum)MBA 设计 vs UniLab 现状
结论(TL;DR)
带着"UniLab 是否存在课程学习能力缺口"的问题,对照本地 mjlab(
/home/user/ws/simulator/mjlab,v1.6.0+)与 UniLab main(v1.3.0)做了逐文件调研。结论:框架级课程学习能力 UniLab 已经具备,当前不是缺口。CurriculumManager随 ADR-0006 从 mjlab v1.6.0 整体迁移(src/unilab/managers/curriculum_manager.py),生命周期语义与 mjlab 一致(reset 时compute(),先于 reset events/DR 生效);G1PenaltyCurriculum)和 per-env 地形课程。docs/source/curriculum.rst);②若干双方都没有的增强方向(success-rate 驱动的通用 per-env term、curriculum 内部状态 checkpoint、learner→env 反馈通道)。调研基线
/home/user/ws/simulator/mjlab(v1.6.0+,main 分支)mjlab 的课程学习设计要点
Manager 与配置(
src/mjlab/managers/curriculum_manager.py,155 行):CurriculumManager(ManagerBase)+ 鸭子类型的NullCurriculumManager;CurriculumTermCfg继承ManagerTermBaseCfg且不新增字段(只有func+params)。_curriculum_state仅保存每个 term 最近一次返回值,用于日志(extras["log"]["Curriculum/<term>"]→ rsl_rl → wandb/tensorboard),不是持久状态。生命周期:唯二调用点在
_reset_idx()(src/mjlab/envs/manager_based_rl_env.py:581,605)——compute(env_ids)先于sim.reset/scene.reset/ reset-mode events 执行,因此课程对参数的修改在同一次 reset 内生效;reset(env_ids)只负责日志与 class term 的reset()钩子。没有 per-step compute。内置 term:
src/mjlab/envs/mdp/curriculums.py):reward_curriculum/termination_curriculum,stages 表(step+weight/params)按env.common_step_counter全局、单向地改写目标 term 的 live cfg(经reward_manager.get_term_cfg解析);构造期校验 stage 顺序与字段名,typo 直接KeyError。src/mjlab/tasks/velocity/mdp/curriculums.py):terrain_levels_vel(per-env 性能驱动:按行走距离 promote/demoteterrain_levels,改写env_origins,同一 reset 生效)与commands_vel(全局 staged 扩张速度指令采样范围)。配套:play 配置手动剥离 curriculum(
cfg.curriculum = {});专题文档docs/source/curriculum.rst(内置 term 表 + 配方 + 自定义指南);测试tests/test_curriculum_manager.py、tests/test_envs_curriculums.py(275 行)、tests/test_velocity_terrain_curriculum.py;curriculum 内部状态不进 checkpoint(step counter 由MjlabOnPolicyRunner持久化)。UniLab 现状(证据)
框架层(与 mjlab 同构):
src/unilab/managers/curriculum_manager.py:32CurriculumManager/:22CurriculumTermCfg/:145NullCurriculumManager;日志值 NaN/Inf fail-closed 校验(:121-131)。src/unilab/envs/manager_based_rl_env.py:587curriculum_manager.compute(env_ids=ids)在 reset 事务前调用;:597-606参与 manager reset 循环并输出Curriculum/...extras。ManagerBasedRlEnvCfg.curriculum: dict[str, CurriculumTermCfg | None](manager_based_rl_env.py:83),Hydra owner YAML 声明、可省略_target_。通用 staged term(#1397,比 mjlab 多两类):
src/unilab/envs/mdp/curriculums.py的reward_curriculum(:152) /termination_curriculum(:191) /command_curriculum(:228) /event_curriculum(:269);构造期 fail-closed 校验(_validate_stages:83-111)。demo owner:tests/fixtures/mjlab_cartpole/conf/stage_curriculum.yaml。性能驱动自适应(mjlab 没有):
G1PenaltyCurriculum(src/unilab/tasks/locomotion/g1/manager_terms.py:671-767)基于EpisodeLengthTracker(src/unilab/base/curriculum.py:8-22)在min_scale/max_scale间缩放全部负 reward 权重;已部署于 sac/td3/flashsac/ppo 多个生产 owner(如src/unilab/conf/sac/task/g1_walk_flat/base.yaml:212-227)。per-env 地形课程:
TerrainSpawnManager+TerrainCurriculumCfg(src/unilab/tasks/locomotion/common/terrain_spawn.py:47-243),per-envlevels、按 episode 结束时的行走距离 promote/demote;RoughTerrainCurriculumterm(rough_manager_terms.py:342-369)+RoughTerrainResetevent 配套;owner 示例src/unilab/conf/ppo/task/quadruped_joystick_rough/base.yaml:121-125。冷路径改写面:
reward/termination/command/event_manager.get_term_cfg已形式化为 protocol(src/unilab/managers/_types.py:196-220)。训练反馈:extras
info["log"]["Curriculum/..."]被 uni_rl 消费(uni_rl/algos/rsl_rl.py:307-308、uni_rl/algos/appo/worker.py:347)。Checkpoint:
NpEnv.export_training_state只导出 step counter(src/unilab/base/np_env.py:645-651);staged 课程因import_training_state恢复计数器而 resume 一致(manager_based_rl_env.py:750-754);更富状态可走uni_rl.training_state.TrainingStateProvider协议 seam。测试:
tests/envs/mdp/test_curriculums.py(463 行)、tests/managers/test_stage_curriculum_demo.py、tests/managers/test_core_managers.py:249-261。逐项对比
CurriculumManager/CurriculumTermCfg(func+params):587先于 reset 事务)terrain_levels_vel(torch 向量化)TerrainSpawnManager+RoughTerrainCurriculum(NumPy)G1PenaltyCurriculum(episode-length 驱动)docs/source/curriculum.rst完整一页cfg.curriculum = {}剩余差距与建议
curriculum.rst结构:内置 term 表、四类 staged term 的 YAML 配方(ramp penalty weight、tighten std、command ranges 扩张、event 范围扩张)、terrain 课程语义、自定义 term 指南。素材全部存在于测试与 fixture owner,工作量小。EpisodeLengthTracker先例,可泛化为 success/metric tracker + 通用 adaptive term,把 G1 私有实现沉淀为envs/mdp/公共能力。TrainingStateProvider,把G1PenaltyCurriculum._current_scale、terrain levels 纳入 export/import,消除长训 resume 后课程状态漂移。compute()hook:仅在有明确任务需求时单独论证。关联
ADR-0006;#1289(MBA 全面对比);#1389 / #1397(curriculum 缺口 roadmap 与落地,已关闭);#1252(mjlab 优势借鉴 roadmap);#1499(play variant 标准化,含 curriculum 剥离)。
All reactions