【UniLab】 UniLab 开源机器人强化学习框架学习笔记——概述
UniLab 开源机器人强化学习框架学习笔记
一、UniLab 框架概述
UniLab 是一个用于机器人控制的开源强化学习框架,它打破了传统上由 GPU 主导的仿真范式。
UniLab 不再在单个 GPU 上同时运行物理仿真和策略训练,而是采用了一种异构架构:由 CPU 并行执行物理仿真,并通过共享内存将经验数据流式传输给常驻于 GPU 的策略训练模块。
这种设计将仿真与学习过程解耦,支持跨 Linux(CUDA、ROCm、XPU)和 Apple Silicon(MPS)平台灵活部署,且完全不需要依赖基于 GPU 的物理引擎。
无需 GPU 仿真后端即可训练机器人 RL。演示动画使用 MotrixSim 渲染。
信息来源:README.md, pyproject.toml
二、UniLab 解决了什么行业痛点?
大多数现代机器人 RL 框架(如 IsaacGym、IsaacLab)都假设物理仿真和神经网络训练在同一个 GPU 上运行。这种耦合架构存在三大核心限制:
- 必须配备昂贵高端 GPU 才能执行仿真步进;
- 绑定单一厂商软硬件生态,迁移成本极高;
- GPU 资源同时供给仿真与梯度训练,资源竞争导致仿真吞吐量瓶颈。
UniLab 通过硬件域分离拆分工作负载,彻底规避上述问题:
| 硬件域 | 核心职责 | 运行硬件 |
|---|---|---|
| 物理仿真域 | 推进环境步长、计算观测值、收集状态转移样本 | 多核 CPU |
| 策略训练域 | 梯度更新、反向传播、模型保存加载 | GPU (CUDA / MPS / ROCm / XPU) |
两个硬件域通过**共享内存 IPC(进程间通信)**层打通:CPU 采集器进程直接将交互状态数据写入张量,GPU 学习器直接采样,无额外数据拷贝、无序列化开销。
信息来源:README.md, shared_buffer.py, replay_buffer.py
三、核心架构概览
3.1 顶层数据流逻辑
采集器子进程在数千个向量化并行环境中运行 CPU 物理仿真,交互产生的状态转移样本推送至共享经验回放池;
学习器进程从缓冲区采样数据,在 GPU 完成梯度更新;更新后的 Actor 网络权重通过共享内存同步回所有采集器进程。
3.2 核心 IPC 组件设计
- SharedReplayBuffer
将全部状态转移数据存储在紧凑 CPU 张量中,按观测、动作、奖励、Critic 特征列切分存储;该内存布局大幅降低跨进程写入时缓存行失效损耗。 - SharedWeightSync
引入版本计数器机制,采集器读取网络权重时无需全局加锁,即可自动识别过期权重,兼顾异步性能与训练一致性。
信息来源:replay_buffer.py, weight_sync.py, async_runner.py
四、项目完整目录结构
UniLab 整体封装为 Python 包unilab,模块职责边界清晰,分层管理环境、物理后端、跨进程通信、算法、配置、训练工具:
unilab/ ├── base/ ← 抽象环境契约与后端接口 │ ├── base.py ← ABEnv:核心环境抽象基类 (ABC) │ ├── registry.py ← 任务注册与工厂函数 │ └── backend/ ← SimBackend 抽象基类 + MuJoCo/MotrixSim 适配器 ├── envs/ ← 具体机器人任务环境 │ ├── locomotion/ ← Go1, Go2, Go2-arm, G1 四足/双足机器人运动任务 │ ├── manipulation/ ← Allegro & Sharpa 灵巧手抓取操作任务 │ └── motion_tracking/ ← G1 人形动作复刻:跳舞、后空翻、物体追踪 ├── ipc/ ← 异构训练专用共享内存 IPC 原语 │ ├── replay_buffer.py │ ├── weight_sync.py │ ├── async_runner.py │ └── rollout_ring_buffer.py ├── algos/ ← 强化学习算法实现层 │ ├── torch/ ← PPO (RSL-RL), APPO, SAC, TD3, FlashSAC, HORA │ └── mlx/ ← Apple MLX 框架专属 PPO 变体 ├── training/ ← 训练循环、模型保存、实验日志工具 ├── dr/ ← 域随机化管理模块 ├── terrains/ ← 程序化随机地形生成工具 ├── conf/ ← Hydra YAML 配置文件,按算法、任务分组 └── scripts/ ← 训练、评估、演示入口脚本信息来源:init.py, registry.py, base.py
五、支持算法与物理仿真后端
5.1 内置强化学习算法库
覆盖在线、离线、异步三大学习范式,全部配套独立训练脚本与 Hydra 配置组,统一 CLI 命令uv run train调度执行:
| 算法名称 | 学习范式 | 启动脚本 | 核心特性 |
|---|---|---|---|
| PPO | On-policy | train_rsl_rl.py | 兼容 RSL-RL,支持对称性感知 MLP |
| MLX PPO | On-policy | train_mlx_ppo.py | Apple Silicon 原生 MLX 加速训练 |
| APPO | 异步 On-policy | train_appo.py | V-trace 重要性权重校正,采集器与训练完全解耦 |
| SAC | Off-policy | train_offpolicy.py | 分布式熵自适应调节、层归一化优化 |
| TD3 | Off-policy | train_offpolicy.py | 双 Q 网络截断、目标策略平滑降噪 |
| FlashSAC | Off-policy | train_offpolicy.py | 轻量化网络结构、余弦退火学习率 |
5.2 物理仿真后端抽象层
通过统一SimBackend抽象接口封装两种物理引擎,切换仿真后端仅需修改命令行参数,无需改动业务代码:
| 仿真后端 | 依赖包版本 | 核心优势 |
|---|---|---|
| MuJoCo | mujoco-uni==3.8.0 | 高精度接触物理求解,支持 GPU 向量化步进 |
| MotrixSim | motrixsim-core==0.8.2 (可选) | 内置原生渲染器、备选物理求解器,macOS 原生适配 |
信息来源:cli.py, structured_configs.py, registry.py, pyproject.toml
六、完整训练运行机制
6.1 命令行路由逻辑示例
执行命令:
uv run train--algoappo--taskgo2_joystick_flat--simmotrixCLI 执行流程:
- 解析入参:算法
appo、任务go2_joystick_flat、仿真后端motrix; - 自动匹配对应训练脚本 + 任务专属 Hydra YAML 配置文件;
- 后端切换零侵入:仅需将
--sim motrix修改为--sim mujoco,代码无需改动。
6.2 环境注册表实例化流程
核心函数registry.make()基于任务名+后端组合实例化对应环境类。
采用装饰器注册机制完成环境绑定:
@envcfg("go2_joystick")@env("go2_joystick","motrix")内部生成(task_name, sim_backend) → 环境类映射查找表,实现环境动态加载。
信息来源:cli.py, registry.py
七、统一 CLI 命令大全
项目在pyproject.toml中预定义 3 条全局 CLI 指令,覆盖训练、评估、预演全流程,执行前自动校验参数合法性(平台、依赖、任务名校验):
| 命令 | 功能说明 | 使用示例 |
|---|---|---|
| train | 启动机器人强化学习训练 | uv run train --algo sac --task g1_walk_flat --sim mujoco |
| eval | 加载保存模型离线评估 | uv run eval --algo appo --task go2_joystick_flat --sim motrix --load-run -1 |
| demo | 一键回放官方预训练模型 | uv run demo dance |
CLI 内置校验规则:
mlx_ppo算法仅允许在 macOS arm64 执行;- 指定
--sim motrix时校验 MotrixSim 依赖是否安装; - 校验输入任务名是否存在于环境注册表。
信息来源:cli.py, pyproject.toml
八、环境与任务双层注册表系统
8.1 两层抽象契约
- ABEnv 顶层抽象
定义所有机器人环境强制实现基础接口:step()、init_state()、观测/动作空间、并行环境数量num_envs; - SimBackend 底层物理抽象
统一物理引擎接口:执行器控制范围、自由度速度、高度场地形采样scan()等通用方法。
8.2 三大任务领域划分
| 任务领域 | 适配机器人 | 典型任务场景 |
|---|---|---|
| Locomotion(运动控制) | Go1、Go2、Go2-arm、Go2-wheel、G1人形 | 平地行走、崎岖地形导航、摇杆实时控制 |
| Manipulation(操作抓取) | Allegro灵巧手、Sharpa灵巧手、Stewart平台 | 手指重定向、多物体抓取生成 |
| Motion Tracking(动作复刻) | G1 人形机器人 | 舞蹈复刻、墙面后空翻、动态物体追踪 |
8.3 注册表自动发现机制
每个任务域包的__init__.py通过__unilab_registry_modules__声明模块,框架启动时自动导入全部环境,填充全局查找表,无需手动注册。
信息来源:base.py, backend/base.py, locomotion/init.py
九、全平台异构硬件支持
UniLab 原生面向跨平台、异构计算硬件设计,pyproject.toml区分darwin/arm64、linux/x86_64两套依赖,自动适配平台计算后端:
| 操作系统 | 训练计算后端 | 支持仿真后端 | 补充说明 |
|---|---|---|---|
| Linux x86_64 | CUDA(默认)、ROCm(AMD显卡)、XPU(Intel核显) | MuJoCo、MotrixSim | 全部功能无阉割,性能对等 |
| macOS arm64 (M系列芯片) | MPS、MLX | MuJoCo、MotrixSim | 提供 MLX 加速 PPO;渲染异常自动切换 mxpython 原生调用 MotrixSim |
无头训练避坑方案
macOS 使用 MotrixSim 回放渲染报错、服务器无显示器训练场景,启动命令增加参数关闭渲染:
training.no_play=true完全跳过渲染器初始化,仅执行仿真与训练逻辑。
信息来源:pyproject.toml, cli.py
