Skip to main content

Evaluation harness for Vision-Language-Action models

Project description

vla-evaluation-harness

CI pypi License: Apache 2.0 Python 3.8+ Ruff Docker Images

Benchmarks LIBERO SimplerEnv CALVIN ManiSkill2 LIBERO-Pro LIBERO-Plus RoboCasa VLABench MIKASA-Robo RoboTwin RLBench RoboCerebra LIBERO-Mem BEHAVIOR-1K Kinetix RoboMME MolmoSpaces-Bench FurnitureBench
Models (official) OpenVLA π₀ π₀-FAST GR00T N1.6 OFT X-VLA CogACT RTC VLANeXt MolmoBot MemVLA
Models (dexbotic) stars DB-CogACT
Models (starVLA) stars QwenGR00T QwenOFT QwenPI QwenFAST

reproduced | ◇ integrated, awaiting first reproduction | · planned

One framework to evaluate any VLA model on any robot simulation benchmark.

Latest News

  • [2026/05] v0.2.0 released. 18 benchmarks x 13 model servers — the largest open VLA evaluation matrix. Browse configs/ to get started.
  • [2026/05] Leaderboard rebuilt: 1,885 models x 18 benchmarks, schema-validated pipeline, updated monthly.
  • [2026/04] v0.1.0 released. 6 VLA models reproduced within 2pp of published scores.
  • [2026/04] Batch parallel eval: 2,000 LIBERO episodes in 18 min on 1x H100 (details).

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
Zero Setup Benchmarks in Docker, model servers as single-file uv scripts — no dependency conflicts.
AI-Assisted Integration Built-in Claude Code skills for adding benchmarks and model servers — scaffold new integrations in minutes, not hours.
Leaderboard The largest unified VLA comparison — 1,885 models × 18 benchmarks, aggregated from 1,755 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 — no dependency hell, exact reproducibility.
  • Model servers are standalone uv scripts with inline dependency declarations — zero manual setup.

See Architecture for how the pieces connect.


Installation

pip install vla-eval

Or from source:

git clone https://github.com/allenai/vla-evaluation-harness.git
cd vla-evaluation-harness
uv sync --python 3.11 --all-extras --dev

Quick Start

Two terminals: one for the model server (GPU), one for the benchmark client.

# 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)
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.

For full evaluation (10 tasks x 50 episodes):

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/:

# 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

Each benchmark and model server directory has a README with setup details, supported configs, and Docker image info. See Reproduction Reports for verified scores.

Need faster runs? See Batch Parallel Evaluation for up to 47x throughput.


Batch Parallel Evaluation

A full evaluation takes hours sequentially. Two layers of parallelism bring this down to minutes:

Wall-clock evaluation time: sequential vs batch parallel across LIBERO (47×), CALVIN (16×), SimplerEnv (12×)

Episode sharding splits (task, episode) pairs across N independent processes (RFC-0006). Each shard connects to the same model server, where a BatchPredictModelServer batches their inference requests into a single forward pass. The two axes multiply together.

Episode Sharding (environment parallelism)

# Option A: use the helper script (launches all shards + auto-merges)
./scripts/run_sharded.sh -c configs/benchmarks/libero/spatial.yaml -n 50

# Option B: manual launch
vla-eval run -c configs/benchmarks/libero/spatial.yaml --shard-id 0 --num-shards 4 &
vla-eval run -c configs/benchmarks/libero/spatial.yaml --shard-id 1 --num-shards 4 &
# ... (each shard is a separate process)
wait
vla-eval merge -c configs/benchmarks/libero/spatial.yaml -o results/libero_spatial.json

Each shard gets a deterministic slice via round-robin. Results merge with episode-level deduplication — if a shard fails, re-run only that shard.

Batch Model Server (GPU parallelism)

Enable batching in the model server config by setting max_batch_size > 1:

args:
  max_batch_size: 16    # max observations per GPU forward pass (>1 enables batching)
  max_wait_time: 0.05   # seconds to wait before dispatching a partial batch

Tuning & Combined Effect

We tune parallelism via a demand/supply methodology: demand λ(N) measures environment throughput as a function of shards, supply μ(B) measures model throughput as a function of batch size. The operating point satisfies λ(N) < 80% · μ(B*) to prevent queue buildup.

Demand/supply throughput for LIBERO + CogACT on H100

Sharding and batching multiply together (DB-CogACT 7B, LIBERO Spatial, 1× H100-80GB):

Sequential Batch Parallel (50 shards, B=16)
Wall-clock ~14 h ~18 min
Throughput ~11 obs/s ~486 obs/s

2 000 episodes, 47× faster. The included benchmarking tools (experiments/bench_demand.py, experiments/bench_supply.py) measure λ and μ for any model + benchmark combination. See the Tuning Guide for worked examples and max_wait_time derivation.


Docker Images

All benchmark environments are packaged as standalone Docker images based on base.

Image Size Benchmark Python Base
base 3.3 GB nvidia/cuda:12.1.1-runtime-ubuntu22.04
rlbench 🔒 4.7 GB RLBench 3.8 base
simpler 4.9 GB SimplerEnv 3.10 base
libero 6.0 GB LIBERO 3.8 base
libero-pro 6.2 GB LIBERO-Pro 3.8 base
robocerebra 6.4 GB RoboCerebra 3.8 base
calvin 9.6 GB CALVIN 3.8 base
maniskill2 9.8 GB ManiSkill2 3.10 base
kinetix 10.0 GB Kinetix 3.11 base
mikasa-robo 10.1 GB MIKASA-Robo 3.10 base
libero-mem 11.3 GB LIBERO-Mem 3.8 base
libero-plus 14.8 GB LIBERO-Plus 3.8 base
robomme 17.0 GB RoboMME 3.11 base
vlabench 17.7 GB VLABench 3.10 base
behavior1k 🔒 23.6 GB BEHAVIOR-1K 3.10 base
robotwin 28.6 GB RoboTwin 2.0 3.10 base
molmospaces 31.4 GB MolmoSpaces-Bench 3.11 base
robocasa 35.6 GB RoboCasa 3.11 base

🔒 = build-locally only; the Dockerfile gates the build behind a licence opt-in (docker/build.sh <name> --accept-license <name>) and the image isn't published to ghcr.io.

Pull (recommended):

docker pull ghcr.io/allenai/vla-evaluation-harness/libero:latest

Build locally (see docker/build.sh):

docker/build.sh                                           # build all (gated images skipped)
docker/build.sh libero                                    # build one
docker/build.sh behavior1k --accept-license behavior1k    # build a gated image

Documentation

Document Description
Architecture Component descriptions, protocol, episode flow, configuration
Contributing Dev setup, adding benchmarks/models, PR workflow
Reproduction Reports Per-model evaluation results and reproducibility verdicts
RFCs Design proposals with rationale and status tracking
Design Philosophy Freshness, Convenience, Layered Abstraction, Quality, Reproducibility, Openness

Contributing

See CONTRIBUTING.md for dev setup and PR workflow.

PRs for any 🔜 item in the support matrix are welcome.


Citation

If you find this work useful, please cite:

@article{choi2026vlaeval,
  title={vla-eval: A Unified Evaluation Harness for Vision-Language-Action Models},
  author={Choi, Suhwan and Lee, Yunsung and Park, Yubeen and Kim, Chris Dongjoo and Krishna, Ranjay and Fox, Dieter and Yu, Youngjae},
  journal={arXiv preprint arXiv:2603.13966},
  year={2026}
}

License

Apache 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vla_eval-0.2.0.tar.gz (774.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vla_eval-0.2.0-py3-none-any.whl (220.1 kB view details)

Uploaded Python 3

File details

Details for the file vla_eval-0.2.0.tar.gz.

File metadata

  • Download URL: vla_eval-0.2.0.tar.gz
  • Upload date:
  • Size: 774.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for vla_eval-0.2.0.tar.gz
Algorithm Hash digest
SHA256 3a4b9815d6a3801df3010a96f4e910bd41096385aa8005482c99a59021f69e7b
MD5 a2945f9442b27b1fd32d241a1f67b30d
BLAKE2b-256 6d4c941593d4e34e4cede5da27b7dd9278798b219bcab02dfe0f7df710603358

See more details on using hashes here.

File details

Details for the file vla_eval-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: vla_eval-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 220.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for vla_eval-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bb053a08b01fae0d527af8cf6ab3f6f129da7162add226d5365280ad3186a837
MD5 1947f9b4687effb2a45d51da3e0f9b38
BLAKE2b-256 8f22f62aa6e9f30f38b2eae6c3f499d4dcacdc590ab5beb63d0afe6050cc2d50

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page