docs/source/libero.mdx
LIBERO is a benchmark designed to study lifelong robot learning — the idea that robots need to keep learning and adapting with their users over time, not just be pretrained once. It provides a set of standardized manipulation tasks that focus on knowledge transfer: how well a robot can apply what it has already learned to new situations. By evaluating on LIBERO, different algorithms can be compared fairly and researchers can build on each other's work.
LIBERO includes five task suites covering 130 tasks, ranging from simple object manipulations to complex multi-step scenarios:
| Suite | CLI name | Tasks | Description |
|---|---|---|---|
| LIBERO-Spatial | libero_spatial | 10 | Tasks requiring reasoning about spatial relations |
| LIBERO-Object | libero_object | 10 | Tasks centered on manipulating different objects |
| LIBERO-Goal | libero_goal | 10 | Goal-conditioned tasks with changing targets |
| LIBERO-90 | libero_90 | 90 | Short-horizon tasks from the LIBERO-100 collection |
| LIBERO-Long | libero_10 | 10 | Long-horizon tasks from the LIBERO-100 collection |
After following the LeRobot installation instructions:
pip install -e ".[libero]"
export MUJOCO_GL=egl # for headless servers (HPC, cloud)
Evaluate across the four standard suites (10 episodes per task):
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
Evaluate on one LIBERO suite:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object \
--eval.batch_size=2 \
--eval.n_episodes=3
--env.task picks the suite (libero_object, libero_spatial, etc.).--env.task_ids restricts to specific task indices ([0], [1,2,3], etc.). Omit to run all tasks in the suite.--eval.batch_size controls how many environments run in parallel.--eval.n_episodes sets how many episodes to run per task.Benchmark a policy across multiple suites at once by passing a comma-separated list:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object,libero_spatial \
--eval.batch_size=1 \
--eval.n_episodes=2
LIBERO supports two control modes — relative (default) and absolute. Different VLA checkpoints are trained with different action parameterizations, so make sure the mode matches your policy:
--env.control_mode=relative # or "absolute"
By default, LeRobot preserves LIBERO's hard-reset behavior. With fixed initial states enabled, you can opt into soft resets to skip rebuilding the simulator model and renderer on every episode:
--env.init_states=true --env.hard_reset=false
Soft resets are faster but are not bit-identical to hard resets after the environment's settling steps, so camera observations and policy results may differ slightly. Use hard resets when reproducing benchmark results.
Observations:
observation.state — 8-dim proprioceptive features (eef position, axis-angle orientation, gripper qpos)observation.images.image — main camera view (agentview_image), HWC uint8observation.images.image2 — wrist camera view (robot0_eye_in_hand_image), HWC uint8Actions:
Box(-1, 1, shape=(7,)) — 6D end-effector delta + 1D gripperFor reproducible benchmarking, use 10 episodes per task across all four standard suites (Spatial, Object, Goal, Long). This gives 400 total episodes and matches the protocol used for published results. Success rates may vary by a few percent across evaluation seeds, so we recommend averaging over 3 seeds.
<Tip> To compare two policies on the same episodes, use the same `--seed`, keep `--env.init_states=true`, and run each task in a single batch (`--eval.batch_size` equal to episodes per task). </Tip>Two preprocessed LIBERO datasets are fully compatible with LeRobot. They contain the same demonstrations with the same schema and differ in how camera frames are stored:
| lerobot/libero | HuggingFaceVLA/libero | |
|---|---|---|
| episodes / frames / tasks | 1,693 / 273,465 / 40 | 1,693 / 273,465 / 40 |
| cameras | 2× 256×256×3 | 2× 256×256×3 |
| state / action dims | 8 / 7 | 8 / 7 |
| dataset format | v3.0 | v3.0 |
| camera encoding | MP4 video | PNG in parquet |
| download size | 1.9 GB | 69.9 GB |
| extra dependency | video backend (torchcodec or pyav) | none |
We recommend lerobot/libero: 37× smaller download with equivalent loading speed (~330 samples/s per worker). Video re-encoding is slightly lossy; use the image-based variant if you cannot install a video decoding backend.
For reference, the original dataset published by Physical Intelligence:
<Tip> Pin `--dataset.revision=<commit-sha>` when reporting results — Hub datasets can be re-uploaded, and success rates are only comparable against the same data revision. </Tip>Train SmolVLA on the recommended dataset:
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
To share the result on the Hub, replace --policy.push_to_hub=false with --policy.repo_id=${HF_USER}/libero-smolvla. Evaluate saved checkpoints with lerobot-eval as shown in the Evaluation section.
We reproduce the results of Pi0.5 on the LIBERO benchmark. We take the Physical Intelligence LIBERO base model (pi05_libero) and finetune for an additional 6k steps in bfloat16, with batch size of 256 on 8 H100 GPUs using the HuggingFace LIBERO dataset.
The finetuned model: 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
We set n_action_steps=10, matching the original OpenPI implementation.
| Model | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | Average |
|---|---|---|---|---|---|
| Pi0.5 (LeRobot) | 97.0 | 99.0 | 98.0 | 96.0 | 97.5 |
These results are consistent with the original results reported by Physical Intelligence:
| Model | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | Average |
|---|---|---|---|---|---|
| Pi0.5 (OpenPI) | 98.8 | 98.2 | 98.0 | 92.4 | 96.85 |