LIBERO Evaluation#
LIBERO is a tabletop robot manipulation benchmark with 4 task suites (Spatial, Object, Goal, Long Horizon), totaling 40 tasks, evaluated on a Franka arm. This page is a step-by-step reproduction guide for running LIBERO evaluation through the LoongForge eval module.
Three models are verified on LIBERO: pi05, xvla, and GR00T-N1.6 (all public weights).
Step 0: Download weights#
Model |
Weights |
|---|---|
pi05 |
lerobot/pi05_libero_finetuned_v044 ( |
xvla |
|
GR00T-N1.6 |
0xAnkitSingh/GR00T-N1.6-LIBERO (weight dir + Eagle3 processor + |
Step 1: Environment setup#
Standard environment#
Install the base LIBERO environment following the official LIBERO repository instructions, then install the additional dependencies the eval client needs:
pip install websockets msgpack pyyaml
pip install numpy==1.24.4 # downgrade numpy for simulator compatibility
⚠️ Common issues:
LIBERO historically defaults to Python 3.8; the syntax differences up to 3.10 are substantial. Python 3.10 avoids many issues.
numpy==1.24.4is pinned for compatibility with the simulation environment — do not upgrade.The LIBERO runner uses MuJoCo with offscreen GL. Keep
MUJOCO_GL=osmesa/PYOPENGL_PLATFORM=osmesa(set by the shipped run scripts).
The benchmark dataset is downloaded following the official LIBERO data instructions; the eval module does not repackage it.
Step 2: Run evaluation#
Run from inside the benchmark environment. The run scripts and eval YAMLs ship with /path/to/... placeholders — fill them in before running:
cd /path/to/LoongForge-VLA
# pi05
examples/embodied/pi05/eval/run_libero_eval.sh
# xvla
examples/embodied/xvla/eval/run_libero_eval.sh
# GR00T-N1.6
examples/embodied/groot_n1_6/eval/run_libero_eval.sh
Environment variables:
Variable |
Meaning |
Default |
|---|---|---|
|
eval YAML config path |
|
|
LoongForge repo root |
|
|
LIBERO env interpreter |
|
|
GPU id for the policy server |
|
|
MuJoCo offscreen GL backend |
|
|
NVIDIA libs (xvla script) |
|
Key config fields (see examples/embodied/<model>/eval/configs/libero/*.yaml):
benchmark.suite—libero_object|libero_spatial|libero_goal|libero_10benchmark.max_tasks/benchmark.episodes_per_task— raise for full-suite / multi-episode eval (e.g.max_tasks: 0,episodes_per_task: 10)benchmark.continuous_gripper—truefor pi05 continuous gripperbenchmark.control_mode— LIBERO OSC:auto|absolute|delta; xvla usesabsolutepi05:
model.action_dim: 7,model.action_horizon: 50, plus a matchingserver.dataset_statistics_pathxvla:
model.domain_id: 3(or omit to auto-resolve),server.chunk_execute_steps: 10, recommendedbenchmark.max_steps: 800GR00T-N1.6:
model.model_type: Gr00tN1d6,benchmark.control_mode: delta,server.embodiment_tag: libero_panda, plusmodel.base_model_path/model.model_name(Eagle3 processor)
Verification#
Task-success status (2026-07-21):
Model |
LIBERO status |
Notes |
|---|---|---|
pi05 |
✅ task success |
no full-suite regression run; verified via single-episode smoke only |
xvla |
✅ task success |
libero_object 79/100 (10 tasks × 10 eps); per-task spread 3/10 … 10/10 |
GR00T-N1.6 |
✅ task success |
10 tasks × 10 eps per suite: object 100/100, spatial 95/100, goal 95/100, libero_10 89/100 |
Report rates as successes/episodes over a full suite; single-episode smoke runs are not success rates and are not listed here.
Caveat on the GR00T-N1.6 LIBERO numbers: the shipped configs do not set
server.chunk_execute_steps, so the whole 16-step chunk is executed open-loop,
whereas the official GR00T LIBERO client uses --n_action_steps 8. The numbers
above are therefore not strictly the official protocol.