【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 上运行。这种耦合架构存在三大核心限制:

  1. 必须配备昂贵高端 GPU 才能执行仿真步进;
  2. 绑定单一厂商软硬件生态,迁移成本极高;
  3. 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 组件设计

  1. SharedReplayBuffer
    将全部状态转移数据存储在紧凑 CPU 张量中,按观测、动作、奖励、Critic 特征列切分存储;该内存布局大幅降低跨进程写入时缓存行失效损耗。
  2. 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 命令行路由逻辑示例

执行命令:

bash 复制代码
uv run train --algo appo --task go2_joystick_flat --sim motrix

CLI 执行流程:

  1. 解析入参:算法 appo、任务 go2_joystick_flat、仿真后端 motrix
  2. 自动匹配对应训练脚本 + 任务专属 Hydra YAML 配置文件;
  3. 后端切换零侵入:仅需将 --sim motrix 修改为 --sim mujoco,代码无需改动。

6.2 环境注册表实例化流程

核心函数 registry.make() 基于任务名+后端组合实例化对应环境类。

采用装饰器注册机制完成环境绑定:

python 复制代码
@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 内置校验规则:

  1. mlx_ppo 算法仅允许在 macOS arm64 执行;
  2. 指定 --sim motrix 时校验 MotrixSim 依赖是否安装;
  3. 校验输入任务名是否存在于环境注册表。

信息来源:cli.py, pyproject.toml

八、环境与任务双层注册表系统

8.1 两层抽象契约

  1. ABEnv 顶层抽象
    定义所有机器人环境强制实现基础接口:step()init_state()、观测/动作空间、并行环境数量 num_envs
  2. 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/arm64linux/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 回放渲染报错、服务器无显示器训练场景,启动命令增加参数关闭渲染:

bash 复制代码
training.no_play=true

完全跳过渲染器初始化,仅执行仿真与训练逻辑。

信息来源:pyproject.toml, cli.py