# vla-evaluation-harness [](https://github.com/allenai/vla-evaluation-harness/actions/workflows/ci.yml) [](https://pypi.python.org/pypi/vla-eval) [](LICENSE) [](https://www.python.org/) [](https://github.com/astral-sh/ruff) [](https://ghcr.io/allenai/vla-evaluation-harness) | | | |:--|:--| | **Benchmarks** | [](configs/benchmarks/libero/) [](configs/benchmarks/simpler/) [](configs/benchmarks/calvin/) [](configs/benchmarks/maniskill2/) [](configs/benchmarks/libero_pro/) [](configs/benchmarks/libero_plus/) [](configs/benchmarks/robocasa/) [](configs/benchmarks/robocasa365/) [](configs/benchmarks/vlabench/) [](configs/benchmarks/mikasa/) [](configs/benchmarks/robotwin/) [](configs/benchmarks/rlbench/) [](configs/benchmarks/robocerebra/) [](configs/benchmarks/libero_mem/) [](configs/benchmarks/behavior1k/) [](configs/benchmarks/kinetix/) [](configs/benchmarks/robomme/) [](configs/benchmarks/molmospaces/) [](configs/benchmarks/duobench/) [](configs/benchmarks/robodojo/)  | | **Models (official)** | [](configs/model_servers/openvla/) [](configs/model_servers/pi0/) [](configs/model_servers/pi0/) [](configs/model_servers/groot/) [](configs/model_servers/oft/) [](configs/model_servers/xvla/) [](configs/model_servers/cogact/) [](configs/model_servers/rtc/) [](configs/model_servers/vlanext/) [](configs/model_servers/molmobot/)  | | **Models ([dexbotic](https://github.com/dexmal/dexbotic))**  | [](configs/model_servers/db_cogact/) | | **Models ([starVLA](https://github.com/starVLA/starVLA))**  | [](configs/model_servers/starvla/) [](configs/model_servers/starvla/) [](configs/model_servers/starvla/) [](configs/model_servers/starvla/) | | **Models ([🤗 LeRobot](https://github.com/huggingface/lerobot))**  | [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) [](configs/model_servers/lerobot/) | ✓ [reproduced](docs/reproductions/) | ◇ integrated, awaiting first reproduction | · planned **One framework to evaluate any VLA model on any robot simulation benchmark.** ### Latest News - [2026/09] [Push-T example](examples/pusht_train_eval/): a self-contained project that trains on its own environment and evaluates it with `vla_eval.evaluate` during training. `pip install vla-eval` is all it needs, no clone of this repo. - [2026/09] [v0.6.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.6.0) released. Python API for training-time evaluation, Charliecloud runtime, and `docker.build`. - [2026/08] [v0.5.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.5.0) released. RoboDojo, the RoboCasa/RoboCasa365 split, and the CPU render backend. - [2026/07] [v0.4.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.4.0) released. Recording on by default, pinned reproducible Docker rebuilds, DuoBench, and the LeRobot bridge below. - [2026/07] 🤗 [LeRobot](https://github.com/huggingface/lerobot) bridge: serve any single-obs-step LeRobot `PreTrainedPolicy` (π₀ / π₀.₅, GR00T N1.7, X-VLA, MolmoAct2, and the FastWAM / VLA-JEPA / LingBot-VA world models) with [one config](configs/model_servers/lerobot/), pinned at [v0.6.0](https://github.com/huggingface/lerobot/releases/tag/v0.6.0). Four checkpoints [reproduce their published LIBERO scores](docs/reproductions/lerobot.md): π₀.₅ 100%, GR00T N1.7 99%, MolmoAct2 97%, VLA-JEPA 96%. - [2026/06] [v0.3.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.3.0) released. SQLite recording + `vla-eval merge`, wandb/trackio tracking, and a watchdog for wedged benchmarks. - [2026/05] [v0.2.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.2.0) released. 18 benchmarks x 13 model servers, the largest open VLA evaluation matrix. Browse [`configs/`](configs/) to get started. - [2026/05] [Leaderboard](https://allenai.github.io/vla-evaluation-harness/leaderboard/) rebuilt: 2,456 models x 18 benchmarks, schema-validated pipeline, updated monthly. - [2026/04] [v0.1.0](https://github.com/allenai/vla-evaluation-harness/releases/tag/v0.1.0) released. 6 VLA models [reproduced](docs/reproductions/) within 2pp of published scores. - [2026/04] Batch parallel eval: 2,000 LIBERO episodes in 18 min on 1x H100 ([details](#batch-parallel-evaluation)). ### Why vla-evaluation-harness? | | | |:--|:--| | **Batch Parallel Evaluation** | Episode sharding + batched GPU inference → **47× throughput** (2 000 LIBERO episodes in 18 min on 1× H100). [Details](#batch-parallel-evaluation) | | **Zero Setup** | Benchmarks in Docker and model servers as single-file [uv scripts](https://docs.astral.sh/uv/guides/scripts/), avoiding dependency conflicts. | | **AI-Assisted Integration** | Shared agent skills for [adding benchmarks](skills/add-benchmark/), [model servers](skills/add-model-server/), and [running evaluations](skills/run-evaluation/). | | **[Leaderboard](https://allenai.github.io/vla-evaluation-harness/leaderboard/)** | The largest unified VLA comparison: 2,456 models × 18 benchmarks, aggregated from 2,087 papers. | --- ## Motivation VLA models are evaluated on LIBERO, CALVIN, SimplerEnv, ManiSkill, and others, but each benchmark has its own dependencies, observation format, and evaluation protocol. In practice, every research team ends up maintaining private eval forks per benchmark. Results diverge. Bug fixes don't propagate. No one tests under real-time conditions where the environment keeps moving during inference. **vla-evaluation-harness** integrates the model once, integrates the benchmark once, and the full cross-evaluation matrix fills itself. **How**: our abstraction layer fully decouples models from benchmarks. - Benchmarks run inside **Docker**, giving exact reproducibility without dependency conflicts. - Model servers are standalone **[uv scripts](https://docs.astral.sh/uv/guides/scripts/)** with inline dependency declarations and no manual setup. See [Architecture](docs/architecture.md) for how the pieces connect. --- ## Installation Requires Python 3.8+ and SQLite 3.24+ with JSON support for recording. A uv-managed Python build includes a suitable SQLite; system Python builds may not. ```bash pip install vla-eval ``` Or from source (pinned to the latest stable release): ```bash git clone --branch v0.7.0 https://github.com/allenai/vla-evaluation-harness.git cd vla-evaluation-harness uv sync --python 3.11 --all-extras --dev --group leaderboard ``` --- ## Quick Start Two terminals: one for the model server (GPU), one for the benchmark client. ```bash # Terminal 1: model server (runs on host with GPU) vla-eval serve --config configs/model_servers/db_cogact/libero.yaml # Terminal 2: run evaluation (benchmark runs in Docker by default). # Wait for the model server to finish loading first; ``GET /health`` returning HTTP 200 is the ready signal. vla-eval run --config configs/benchmarks/libero/smoke_test.yaml ``` Results are saved to `results/` as JSON. The benchmark runs inside Docker by default; pass `--no-docker` for local development. No Docker daemon? `--runtime charliecloud` runs the same image without root; see [Container runtimes](docs/runtimes.md). For full evaluation (10 tasks x 50 episodes): ```bash vla-eval run --config configs/benchmarks/libero/spatial.yaml ``` Other benchmarks and models follow the same pattern. Pick a benchmark and a compatible model server from [`configs/`](configs/): ```bash # SimplerEnv + X-VLA vla-eval serve --config configs/model_servers/xvla/simpler_widowx.yaml vla-eval run --config configs/benchmarks/simpler/widowx_vm.yaml # CALVIN + DB-CogACT vla-eval serve --config configs/model_servers/db_cogact/calvin.yaml vla-eval run --config configs/benchmarks/calvin/eval.yaml # LIBERO + π₀.₅ via 🤗 LeRobot (works for any LeRobot PreTrainedPolicy checkpoint) vla-eval serve --config configs/model_servers/lerobot/pi05_libero.yaml vla-eval run --config configs/benchmarks/libero/object.yaml ``` Each benchmark and model server directory has a README with setup details, supported configs, and Docker image info. See [Reproduction Reports](docs/reproductions/) for verified scores. > **Need faster runs?** See [Batch Parallel Evaluation](#batch-parallel-evaluation) for up to 47x throughput. ### From Python (evaluate while training) The same run is one function call, with the model served from the calling process: ```python import vla_eval results = vla_eval.evaluate(MyModelServer(model), "configs/benchmarks/libero/smoke_test.yaml") print(results[0]["mean_success"]) ``` [Python API](docs/python-api.md) documents the arguments. [examples/pusht_train_eval](examples/pusht_train_eval/) is a complete training script that does this every N steps on an environment vla-eval does not ship. --- ## Batch Parallel Evaluation A full evaluation takes hours sequentially. Two layers of parallelism bring this down to minutes: