LeRobot documentation

LIBERO-plus

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LIBERO-plus

The commands below run the simulator locally. To keep its dependencies away from your policy's, serve it instead with `lerobot-env-server --config_path=docker/sim/configs/libero_plus.yaml --sim.task=--docker=true`, where `` is the command's `--env.task`, and add `--env.server.endpoint=tcp/127.0.0.1:7448` to the command. A server runs the task it was started with (see [Simulation: local or served](./simulation)).

LIBERO-plus 是一个构建在 LIBERO 之上的、面向视觉-语言-动作(VLA)模型的鲁棒性基准。它通过对原始 LIBERO 任务集施加七个独立的扰动维度,对策略进行系统性的压力测试,从而揭示标准基准所遗漏的失效模式。

An overview of the LIBERO-plus benchmark perturbation dimensions

扰动维度

LIBERO-plus 通过沿以下维度对每个原始 LIBERO 任务进行扰动,生成了约 10 000 个任务变体:

维度有哪些更改
对象布局目标位置、是否存在干扰物体
相机视角相机位置、朝向、视场
机器人初始状态操作器初始位姿
语言说明由 LLM 重写的任务描述(释义 / 同义词)
光照条件强度、方向、颜色、阴影
背景纹理场景表面和物体外观
传感器噪声光度畸变与图像退化

可用的任务套件

LIBERO-plus 对 Spatial、Object、Goal 和 Long 套件中的 40 个原始任务进行了扰动。这四个套件中注册的每个任务都是扰动后的变体,而非原始任务之一。该分支还保留了 LIBERO-90 中的 90 个未扰动任务。

套件CLI 名称原始任务已注册的任务最大步数描述
LIBERO-Spatiallibero_spatial102,402280需要推理空间关系的任务
LIBERO-Objectlibero_object102,518280以操作不同对象为中心的任务
LIBERO-Goallibero_goal102,591300目标条件任务,目标会发生变化
LIBERO-90libero_909090400未受扰动的短期 LIBERO 任务
LIBERO-Longlibero_10102,519520来自 LIBERO-100 数据集的长时程任务

这些计数来自上游的 任务注册表。四个扰动套件总共包含 10,030 个任务变体;LIBERO-90 未计入该总数。计数和任务索引取决于已安装的 fork 版本。

Installing LIBERO-plus **replaces** vanilla LIBERO — it uninstalls `hf-libero` so that `import libero` resolves to the LIBERO-plus fork. You cannot have both installed at the same time. To switch back to vanilla LIBERO, uninstall the fork and reinstall with `pip install -e ".[libero]"`.

安装

系统依赖项(仅限 Linux)

sudo apt install libexpat1 libfontconfig1-dev libmagickwand-dev

Python 包

pip install -e ".[libero]" "robosuite==1.4.1" bddl easydict mujoco wand scikit-image gym
git clone https://github.com/sylvestf/LIBERO-plus.git
cd LIBERO-plus && pip install --no-deps -e .
pip uninstall -y hf-libero  # so `import libero` resolves to the fork

LIBERO-plus 从其 GitHub fork 安装,而非通过 pyproject extra 安装——该 fork 以命名空间包的形式发布,pip 无法处理,因此必须将其克隆并添加到 PYTHONPATH 中。标准安装方式参见 docker/Dockerfile.sim 中的 libero_plus_native 阶段。由于需要 MuJoCo,因此仅支持 Linux。

Set the MuJoCo rendering backend before running evaluation:
export MUJOCO_GL=egl   # headless / HPC / cloud

下载 LIBERO-plus 资源

LIBERO-plus 的扩展资源包是单独发布的。请从 Hugging Face 数据集 下载 assets.zip,并将其解压到 LIBERO-plus 包目录中:

# After installing the package, find where it was installed:
python -c "import libero; print(libero.__file__)"
# Then extract assets.zip into <package_root>/libero/assets/

评估

默认本地评估

按照上游评估指南的建议,每个变体使用一个回合,在四个扰动测试套件上评估所有已注册的变体:

lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero_plus \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.batch_size=1 \
  --eval.n_episodes=1 \
  --env.max_parallel_tasks=1

这将为上述注册表运行 10,030 个回合。使用 --eval.n_episodes=10 时,同一命令将运行 100,300 个回合,而不是 400 个。

冒烟测试

在启动完整评估之前,请使用一个已注册的变体和一个回合来检查您的配置:

lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero_plus \
  --env.task=libero_spatial \
  --env.task_ids='[0]' \
  --eval.batch_size=1 \
  --eval.n_episodes=1

这是一项配置检查,而非具有代表性的鲁棒性评估。

单套件评估

在单个 LIBERO-plus 套件上评估:

lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero_plus \
  --env.task=libero_spatial \
  --eval.batch_size=1 \
  --eval.n_episodes=1
  • --env.task 用于选择测试套件(libero_spatial、libero_object 等)。
  • --env.task_ids 用于限制为已注册的任务索引([0]、[1,2,3] 等),这些索引用于标识四个扰动套件中的变体。省略该参数将运行所有已注册的任务。在评估多个套件时,相同的索引列表会独立地应用于每个套件。
  • --eval.batch_size 控制并行运行的环境数量。
  • --eval.n_episodes 用于设置每个已注册任务运行的回合数。增加该值会重复评估所选的变体,而不会选择额外的不同变体。

多套件评估

通过传入逗号分隔的列表,一次性在多个测试套件上对策略进行基准测试:

lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero_plus \
  --env.task=libero_spatial,libero_object \
  --eval.batch_size=1 \
  --eval.n_episodes=1

控制模式

LIBERO-plus 支持两种控制模式——relative(默认)和 absolute。不同的 VLA 检查点采用不同的动作参数化方式训练,因此请确保所选模式与您的策略相匹配:

--env.control_mode=relative   # or "absolute"

重置性能

默认情况下,LeRobot 会保留 LIBERO 的硬重置行为。在启用固定初始状态后,您可以选择使用软重置,以跳过在每个 episode 中重建模拟器模型和渲染器:

--env.init_states=true --env.hard_reset=false

软重置速度更快,但在环境稳定步骤之后,其结果与硬重置并非逐位一致,因此相机观测值和策略结果可能存在细微差异。在复现基准测试结果时,请使用硬重置。

策略输入和输出

观察:

  • observation.state — 8 维本体感觉特征(末端执行器位置、轴角姿态、夹爪 qpos)
  • observation.images.image — 主摄像头视图(agentview_image),HWC uint8
  • observation.images.image2 — 手腕相机视角(robot0_eye_in_hand_image),HWC uint8

操作:

  • Box(-1, 1, shape=(7,)) 中的连续控制 — 6 维末端执行器增量 + 1 维夹爪

评估工作负载与可复现性

评估回合的总数为 所有套件中选中的已注册任务数量 × --eval.n_episodes。例如,Spatial 的所有变体各运行一个回合,共计 2,402 个回合;在 Spatial 和 Object 中分别选择 --env.task_ids='[0,1,2]' 且各运行一个回合,则共计六个回合。

400 集的计算(40 个原始任务 × 10 集)适用于原版 LIBERO,而非完整的 LIBERO-plus 评估。对于 LIBERO-plus,请从每个已注册的变体各运行一集开始。对同一变体重复运行多集,并不等同于对原始任务的不同变体进行采样。

对于自定义子集,请使用该 fork 的 task classification 来识别扰动类别和难度级别。不要假设每个原始任务在每个扰动类别中都有十个不同的变体。在报告结果时,请记录 fork 版本、所选套件名称和任务索引、每个变体的 episode 数、随机种子以及重置设置。为了与已发表的结果进行比较,请遵循该基准的采样和聚合协议,而不是将任意子集视为等效。

训练

数据集

LIBERO-plus 的 LeRobot 格式训练数据集可在以下位置获取:

示例训练命令

lerobot-train \
    --policy.type=smolvla \
    --policy.repo_id=${HF_USER}/smolvla_libero_plus \
    --policy.load_vlm_weights=true \
    --dataset.repo_id=lerobot/libero_plus \
    --env.type=libero_plus \
    --env.task=libero_spatial \
    --output_dir=./outputs/ \
    --steps=100000 \
    --batch_size=4 \
    --eval.batch_size=1 \
    --eval.n_episodes=1 \
    --env_eval_freq=1000

与 LIBERO 的关系

LIBERO-plus 是 LIBERO 的即插即用扩展:

  • 相同的 Python gym 接口(LiberoEnv)和标准观测
  • 相同的相机名称和观测/操作格式
  • 相同的任务套件名称
  • 安装在相同的 libero Python 包名称下(不同的 GitHub 仓库)

要使用原始的 LIBERO 基准,请参阅 LIBERO 并使用 --env.type=libero。

Update on GitHub