LIBERO 是一个 benchmark,旨在研究终身机器人学习——即机器人需要随着时间的推移不断与用户一起学习和适应,而不是只做一次预训练。它提供了一组标准化的操作任务,侧重于知识迁移:即机器人能多大程度地将已学到的知识应用到新情境中。通过在 LIBERO 上评估,不同的算法可以被公平比较,研究者也可以借鉴彼此的工作。

LIBERO 包含五个任务套件,共覆盖130 个任务,从简单的物体操作到复杂的多步骤场景:
| 套件 | CLI 名称 | 任务数 | 描述 |
|---|---|---|---|
| LIBERO-Spatial | libero_spatial | 10 | 需要对空间关系进行 inference 的任务 |
| LIBERO-Object | libero_object | 10 | 以操作不同物体为核心的任务 |
| LIBERO-Goal | libero_goal | 10 | 目标条件化任务,目标会发生变化 |
| LIBERO-90 | libero_90 | 90 | 来自 LIBERO-100 集合的短视界任务 |
| LIBERO-Long | libero_10 | 10 | 来自 LIBERO-100 集合的长视界任务 |
在按照 LeRobot 安装说明操作之后:
pip install -e ".[libero]"LIBERO 需要 Linux(`sys_platform == 'linux'`)。LeRobot 使用 MuJoCo 进行 simulation — 在训练或评估之前设置渲染后端:export MUJOCO_GL=egl # for headless servers (HPC, cloud)
在四个标准套件上进行评估(每个任务 10 个 episode):
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_spatial,libero_object,libero_goal,libero_10 \
--eval.batch_size=1 \
--eval.n_episodes=10 \
--env.max_parallel_tasks=1在单个 LIBERO 套件上评估:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object \
--eval.batch_size=2 \
--eval.n_episodes=3--env.task 选择套件(libero_object、libero_spatial 等)。--env.task_ids 限制为特定的任务索引([0]、[1,2,3] 等)。省略则运行套件中的所有任务。--eval.batch_size 控制并行运行多少个环境。--eval.n_episodes 设置每个任务运行多少个 episode。通过传入逗号分隔的列表,一次在多套件上对 policy 进行 benchmark:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object,libero_spatial \
--eval.batch_size=1 \
--eval.n_episodes=2LIBERO 支持两种控制模式 — relative(默认)和 absolute。不同的 VLA checkpoint 使用不同的 action 参数化方式进行训练,因此请确保模式与你的 policy 匹配:
--env.control_mode=relative # or "absolute"默认情况下,LeRobot 保留 LIBERO 的硬重置行为。启用固定初始 state 后,你可以选择软重置,从而跳过在每个 episode 上重建 simulation 器 模型和渲染器:
--env.init_states=true --env.hard_reset=false软重置更快,但在环境的稳定步骤之后不会与硬重置逐位相同,因此相机 observation 和 policy 结果可能 略有差异。复现 benchmark 结果时请使用硬重置。
observation:
observation.state — 8 维本体感觉特征(end-effector 位置、轴角方向、gripper qpos)observation.images.image — 主相机视图(agentview_image),HWC uint8observation.images.image2 — 腕部相机视图(robot0_eye_in_hand_image),HWC uint8LeRobot 强制视觉特征使用 `.images.*` 前缀。请确保你的 policy 配置 `input_features` 使用相同的命名键,并且你的 dataset 元数据键遵循这一约定。如果你的数据包含不同的键, 你必须重命名 observation 以匹配 policy 的期望,因为 命名键被编码在归一化统计信息层中。
action:
Box(-1, 1, shape=(7,)) 中的连续控制 — 6D end-effector 增量 + 1D gripper为了可复现的 benchmark,请在全部四个标准套件(Spatial、Object、Goal、Long)中使用每个任务 10 个 episode。这样总共有 400 个 episode,与已发布结果所用的协议一致。不同评估随机种子下的成功率可能相差几个百分点,因此我们建议对 3 个种子取平均。
要在相同的 episode 上比较两个 policy,请使用相同的 `--seed`,保持 `--env.init_states=true`,并在单个批次中运行每个任务 (`--eval.batch_size` 等于每个任务的 episode 数)。
两个预处理好的 LIBERO dataset 与 LeRobot 完全兼容。它们包含相同的 demonstration 和相同的模式,区别仅在于相机帧的存储方式:
| lerobot/libero | HuggingFaceVLA/libero | |
|---|---|---|
| episode / 帧 / 任务 | 1,693 / 273,465 / 40 | 1,693 / 273,465 / 40 |
| 相机 | 2× 256×256×3 | 2× 256×256×3 |
| state / action 维度 | 8 / 7 | 8 / 7 |
| dataset 格式 | v3.0 | v3.0 |
| 相机编码 | MP4 视频 | parquet 中的 PNG |
| 下载大小 | 1.9 GB | 69.9 GB |
| 额外依赖 | 视频后端(torchcodec 或 pyav) | 无 |
我们推荐 lerobot/libero:下载体积小 37 倍,加载速度相当(每个工作进程约 330 样本/秒)。视频重新编码略有损失;如果无法安装视频解码后端,请使用基于图像的版本。
作为参考,以下是 Physical Intelligence 发布的原始 dataset:
在报告结果时固定 `--dataset.revision=` — Hub dataset 可能会被重新上传,只有针对相同的数据修订版,成功率才有可比性。
在推荐的 dataset 上训练 SmolVLA:
lerobot-train \
--policy.type=smolvla \
--policy.load_vlm_weights=true \
--policy.push_to_hub=false \
--dataset.repo_id=lerobot/libero \
--dataset.video_backend=torchcodec \
--output_dir=./outputs/libero_smolvla \
--steps=100000 \
--batch_size=64要在 Hub 上分享结果,请将 --policy.push_to_hub=false 替换为 --policy.repo_id=${HF_USER}/libero-smolvla。按照评估一节所示,使用 lerobot-eval 评估保存的 checkpoint。
我们在 LIBERO benchmark 上复现 Pi0.5 的结果。我们使用 Physical Intelligence 的 LIBERO 基础模型(pi05_libero),并使用 HuggingFace LIBERO dataset,在 8 块 H100 GPU 上以 bfloat16 精度额外 fine-tune 6k 步,批次大小为 256。
fine-tune 后的模型:lerobot/pi05_libero_finetuned
lerobot-eval \ --output_dir=./eval_logs/ \ --env.type=libero \ --env.task=libero_spatial,libero_object,libero_goal,libero_10 \ --eval.batch_size=1 \ --eval.n_episodes=10 \ --policy.path=pi05_libero_finetuned \ --policy.n_action_steps=10 \ --env.max_parallel_tasks=1
我们设置 n_action_steps=10,与原始 OpenPI 实现保持一致。
| 模型 | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | 平均 |
|---|---|---|---|---|---|
| Pi0.5 (LeRobot) | 97.0 | 99.0 | 98.0 | 96.0 | 97.5 |
这些结果与 Physical Intelligence 报告的原始结果一致:
| 模型 | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | 平均 |
|---|---|---|---|---|---|
| Pi0.5 (OpenPI) | 98.8 | 98.2 | 98.0 | 92.4 | 96.85 |