Zero-shot robustness evaluation on LIBERO-plus: the same checkpoints we eval on stock LIBERO, run against ~10k perturbed tasks across 4 suites and 7 perturbation categories (Camera, Robot, Language, Light, Background, Noise, Layout).
This reuses the websocket policy server from
evaluation/LIBERO/policy_server/ and the stock-LIBERO env adapter
(evaluation/LIBERO/model2libero_interface.py::LiberoModelClient)
unchanged — LIBERO-plus bakes every perturbation into its bddl/init files
and keeps the obs keys and action convention identical, so only the env-side
driver differs.
| file | purpose |
|---|---|
eval_libero_plus.py |
per-shard eval driver: iterate a task-id range of one suite, bucket results by perturbation category, write logs/{suite}/{start}_to_{end}.json |
aggregate_results.py |
merge all per-shard jsons into overall_results.json (per-category, per-suite, and a leaderboard summary row) |
run_eval_libero_plus.sh |
multi-GPU + sharded launcher (flock work queue of (suite, shard) units), aggregates at the end |
run_eval_libero_plus_single.sh |
single-GPU smoke test over a small task-id range |
- LIBERO-plus runtime deps in the
libero_plusconda env:conda activate libero_plus pip install -e <LIBERO_PLUS_REPO_ROOT> pip install torch torchvision mujoco==3.2.3 robosuite==1.4.0 bddl easydict \ pyyaml opencv-python imageio imageio-ffmpeg websockets msgpack numpy==1.24.4 wand apt install -y libmagickwand-dev libfontconfig1-dev libexpat1
- Perturbation assets: download
assets.zipfrom the LIBERO-plus HF dataset and unzip into<LIBERO_PLUS_REPO_ROOT>/libero/libero/assets/so it containstextures/ new_objects/ scenes/ stable_hope_objects/ stable_scanned_objects/ turbosquid_objects/ articulated_objects/ serving_region.xml wall_frames.stl wall.xml.
The client side selects LIBERO-plus purely via env vars (the run scripts set
these): LIBERO_CONFIG_PATH=$EVAL_LOG_DIR/libero_config (auto-generated to
point at LIBERO-plus paths) and PYTHONPATH prepending $LIBERO_HOME so the
LIBERO-plus libero package shadows stock LIBERO.
Two conda envs are used: server in lerobot_lab (default), client in
libero_plus (default). The run scripts launch both.
Smoke test (4 tasks, one GPU):
export STATS_KEY_MODE=suite
export ROBOT_TYPE_MODE=panda
export CKPT_PATH=<CKPT_PATH>
export LIBERO_HOME=<LIBERO_PLUS_REPO_ROOT>
GPU_ID=0 TASK_SUITE=libero_goal START_IDX=0 END_IDX=4 \
bash evaluation/LIBERO-plus/run_eval_libero_plus_single.shFull run (all suites, fan out across free GPUs):
export CKPT_PATH=<CKPT_PATH>
export LIBERO_HOME=<LIBERO_PLUS_REPO_ROOT>
# SHARDS_PER_SUITE controls fan-out; total work units = 4 * SHARDS_PER_SUITE.
SHARDS_PER_SUITE=8 bash evaluation/LIBERO-plus/run_eval_libero_plus.sh
# or pin GPUs:
GPU_IDS=0,1,2,3 SHARDS_PER_SUITE=8 bash evaluation/LIBERO-plus/run_eval_libero_plus.shCommon env-var overrides:
CKPT_PATH(required): checkpoint path for the policy server, you can download our fine-tuned ckpt on https://huggingface.co/InternRobotics/InternVLA-A1.5-Libero.LIBERO_HOME(required): LIBERO-plus repo root.SERVER_ENV/CLIENT_ENV(defaultslerobot_lab/libero_plus): conda envs.CONDA_ROOT(default$HOME/miniconda3).GPU_IDS(e.g.0,1,2,3): skip auto-detection.GPU_MEM_FREE_THRESHOLD_MB(default30000): free-memory threshold for auto-detection.BASE_PORT(default5774): first port; per-worker ports areBASE_PORT + worker_idx.SHARDS_PER_SUITE(default4): task-id shards per suite.NUM_TRIALS_PER_TASK(default1): LIBERO-plus bakes perturbations into task defs, so 1 is standard.STATS_KEY_MODE/ROBOT_TYPE_MODE(defaultsuite):suitebinds stats / robot_type to the LIBERO suite name (for multi-subset stats.json checkpoints); a fixed string (e.g.panda) reuses one key across suites.VLM_MODEL_PATH(InternVLA-A1.5 only): override the VLM path baked into the checkpoint.WAN_MODEL_PATH/WAN_VAE_PATH: only used when overridingACTION_LOSS_ONLY_FLAG=--no-action_loss_only. The default--action_loss_onlyskips WAN weight loading, which matches the public InternVLA-A1.5 release.INFERENCE_BACKEND(defaultstandard):optimizedrequires--action_loss_only.NO_VIDEO_FLAG=--no-save_videosdisables video recording (recommended for the ~10k full run).EVAL_LOG_DIR: destination log dir (defaultoutputs/sim_eval/libero_plus/<timestamp>_all).