Extensible Python-first benchmark comparing VLMs (CLIP-style and LLaVA-style) to children's behavioral data from LEVANTE. R is used for downloading trials (Redivis), fetching IRT models, and for statistical comparison; Python is used for config, data loaders, model adapters, and the evaluation runner.
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install -e . # install this package
# Optional: pip install -r requirements-transformers.txt # for CLIP
Use Python 3.10–3.13. On 3.13, requirements.txt pins torch>=2.6 and newer numpy/pandas so pip can install wheels (older torch/pandas often have no cp313 builds).
Pinned deps: requirements.txt. Dev: requirements-dev.txt.
You can use the package as a model runtime in another repo without adopting LEVANTE task loaders. Full guide: docs/runtime_exports.md.
from levante_bench.runtime import load_model, run_trials
model = load_model(model_name="qwen35", device="auto")
trials = [
{
"trial_id": "sample-1",
"item_uid": "sample-1",
"prompt": "Pick the best option.",
"option_labels": ["A", "B", "C", "D"],
"correct_label": "A",
"context_image_paths": [],
"option_image_paths": [],
"answer_format": "label",
}
]
results = run_trials(model, trials, max_new_tokens=64, task_id="custom")
Notes:
context_image_paths and option_image_paths.load_model() reuses it.model_config_path=... or model_config={...} to load_model().levante_bench.runtime.run_logit_forced_12(...) (see docs/runtime_exports.md).CLI equivalent:
levante-bench run-trials-jsonl \
--input-jsonl ./trials.jsonl \
--output-jsonl ./results.jsonl \
--model qwen35 \
--device auto \
--max-new-tokens 64 \
--task-id custom
src/levante_bench/config/irt_model_mapping.csv to map each task to its IRT model .rds file in the Redivis model registry (e.g. trog,trog/multigroup_site/overlap_items/trog_rasch_f1_scalar.rds).redivis package; run Rscript scripts/download_levante_data.R to fetch trials and IRT models into data/responses/<version>/ (default version: v1; writes SHA256SUMS.txt for reproducibility).python scripts/data_prep/download_levante_assets.py [--version VERSION] to download corpus and images from a versioned bucket prefix into data/assets/<version>/, plus shared additional images into data/assets/additional_images/ by default. If --version is omitted, the script uses LEVANTE_DATA_VERSION when set, otherwise v1. Visual asset downloads are parallelized (--workers, default 8).
python scripts/data_prep/download_synth_vocab_assets.py to sync gs://levante-bench/corpus_data/synth_vocab into data/assets/synth_vocab/.levante-bench list-taskslevante-bench list-modelslevante-bench check-gpu # verify local CUDA availabilitylevante-bench run-eval --task trog --model clip_base [--version VERSION] [--prompt-language de]levante-bench run-eval --task trog --model gemma3 --version v1 --device cuda # Gemma 3 smoke runlevante-bench run-benchmark --benchmark v1 --device autolevante-bench run-benchmark --benchmark vocab --device autolevante-bench run-workflow --workflow smol-vocab -- --helplevante-bench run-workflow --workflow benchmark-v1 -- --helpscripts/validate_all.sh # ruff + pytest + GPU check + benchmark smoke runsscripts/validate_all.sh --full-benchmarks # same checks + full v1 and vocab benchmarksscripts/validate_all.sh --with-r-validation # include R/Redivis package checksscripts/validate_r.sh --run-comparison-smoke --version 2026-03-24 # optional R comparison smoke testlevante-bench run-comparison --task trog --model clip_base or run Rscript comparison/compare_levante.R --task TASK --model MODEL directly. Outputs accuracy (with the IRT item d parameter) and D_KL (by ability bin) to results/comparison/.For multilingual runs (--prompt-language not English), per-model result folders include a 2-letter language suffix. Result layout is deterministic: results/<version>/<model>-<size>[-<lang>]/ and each model folder includes a metadata.json. Example: results/<version>/qwen35-2B-de/.
run-eval supports repeated runs when using true-random option ordering:
levante-bench run-eval \
--task trog \
--model qwen25vl_72b_hf \
--version v1 \
--true-random-option-order \
--num-runs 3
results/<version>/<model>/.results/<version>/<model>/0001/results/<version>/<model>/0002/cache/responses.json as option_order_seed.For Slurm/sbatch jobs, true-random mode is Slurm-aware by default and uses
job-based parent folders (for example job12345-task7/0001) to avoid
cross-job collisions while keeping numbered run subfolders. You can override with:
levante-bench run-eval \
--true-random-option-order \
--run-label "job{run_index_padded}" \
--no-slurm-run-label
Equivalent experiment YAML controls:
true_random_option_order: true
num_runs: 7
slurm_run_label: true # default; uses SLURM_JOB_ID/SLURM_ARRAY_TASK_ID when available
run_label: "" # optional parent folder override; runs stay 0001, 0002, ...
/ when deployed with Vercel./api/results-report supports:
RESULTS_SOURCE_MODE=bucket_compute, default),RESULTS_SOURCE_MODE=remote + RESULTS_REPORT_URL), orRESULTS_SOURCE_MODE=local).RESULTS_BUCKET_PREFIX at the tree that holds model summary.csv files (typically results/v1). The dashboard footer shows Summaries: gs://… from the computed report.RESULTS_BUCKET_PREFIX:
/api/kl-report — KL_REPORT_BUCKET_PREFIX (default results/comparison, *_d_kl.csv),/api/model-age-equivalency — MODEL_AGE_EQ_BUCKET_PREFIX,/api/model-age-equivalency-accuracy — MODEL_AGE_EQ_ACC_BUCKET_PREFIX or MODEL_AGE_EQ_BUCKET_PREFIX,/api/human-age-accuracy — HUMAN_AGE_BUCKET_PREFIX (default results),/api/parser-glitch-report — PARSER_GLITCH_BUCKET_PREFIX (default results)..env.example for the full set of variables.Models / Children),python scripts/analysis/plot_human_accuracy_by_age_lines.py \
--trials-csv data/responses/v1/trials.csv \
--output-csv results/human-accuracy-by-age-lines.csv \
--output results/human-accuracy-by-age-lines.png
python scripts/analysis/build_model_comparison_report.py --results-root results --output-json results/model-comparison-report.json
You can run experiment configs directly using the eval-style command structure:
# Direct
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml
# Wrapper (same behavior)
bash run_experiment.sh configs/experiments/experiment.yaml
Use dotlist-style overrides to change task subsets and smoke caps:
# Vocab smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[vocab] max_items_vocab=8 device=cpu
# Math smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[egma-math] max_items_math=2 device=cpu
# ToM smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[theory-of-mind] max_items_tom=2 device=cpu
For prompt experiments on mental rotation, you can override only that task's prompt text in experiment YAML:
task_overrides:
mental-rotation:
mental_rotation_prompt_template: |
The first image is the reference shape.
The second image is option A. The third image is option B.
One option is the same shape rotated to a different angle.
The other is a MIRROR image (horizontally flipped).
Which option matches the reference - just rotated, NOT flipped?
Answer with one letter: A or B.
levante-bench CLI (run-workflow and run-benchmark), including first-class v1 and vocab benchmark presets.levante-bench check-gpu and automatic device resolution (--device auto) with safe CUDA->CPU fallback.scripts/build_math_prompts.py now defaults to shuffled options, supports numberline image attachment via --numberline-graphics-dir, and has configurable numberline instruction styles (minimal, stepwise).scripts/run_smolvlmv2_math_eval.py now accepts image-backed prompt records (image_paths) so numberline items can be evaluated with actual graphics.levante-bench run-benchmark --benchmark vocab.scripts/validate_all.sh to run lint/tests/GPU check plus smoke or full benchmark validations in one command.scripts/list_benchmark_results.py to list benchmark and prompt-experiment outputs with metric deltas vs prior runs.# Heatmap of models x tasks accuracy
python scripts/plot_results.py
# Specific version
python scripts/plot_results.py --version 2026-03-24
# Text table only
python scripts/plot_results.py --no-plot
Use these commands to verify what ran and compare with prior runs:
# Show benchmark + prompt experiment history with deltas.
python3 scripts/list_benchmark_results.py --limit 20
# Run full validation pipeline (lint/tests/gpu + smoke benchmarks).
scripts/validate_all.sh
# Run full benchmarks instead of smoke.
scripts/validate_all.sh --full-benchmarks
# Include R package validation in the full validation pass.
scripts/validate_all.sh --with-r-validation
The test suite is split into fast unit/property tests (default) and opt-in integration tests (model loading / dataset end-to-end checks).
python -m pytest
tests/test_model_inference.pytests/test_task_datasets.pyLEVANTE_RUN_INTEGRATION=1 so
default CI/local runs stay deterministic and fast.LEVANTE_RUN_INTEGRATION=1 python -m pytestCurrent parser-focused coverage includes:
parse_answer / parse_answer_v2 branch coverage (JSON, embedded JSON,
phrase patterns, exact/prefix forms, ambiguous-prose rejection).parse_numeric_answer / parse_numeric_v2 branch coverage (strict JSON,
embedded JSON, slider mode constraints, fallback behavior).<imageN> interleaving behavior across model adapters.evaluate_trial correctness for label, numeric, and slider formats.run_eval.5xx retry and token-cap doubling path).Evaluation now uses a canonical parse layer with provenance so correctness is decided in normalized answer space, not output surface format.
predicted_label in option_labels.predicted_value (float), then compare
to target_value using slider_tolerance.[0,1], then map back to
task scale via slider_min/slider_max.ParseResult (in src/levante_bench/models/base.py) returns:
value (canonical parsed value/label or None)reason (extracted reason or source text)parse_method (which rule matched)parse_confidence (high / medium / low / none)raw_candidate (raw extracted token)evaluate_trial() now uses:
parse_answer_result(...) for label tasksparse_numeric_result(...) for numeric/slider tasksBackward-compatible APIs (parse_answer, parse_numeric_answer) are kept for
existing callers, but benchmark scoring uses parser-v2 paths.
Per-task CSV outputs now include parser provenance columns:
parse_methodparse_confidenceparse_raw_candidateThis supports score audits (for example, reviewing accuracy by parse method or identifying low-confidence parses).
The benchmark compares model outputs to human behavioral data on two dimensions:
d: Model accuracy (correct/incorrect per item) is paired with IRT item d parameters extracted from fitted Rasch models. In the current exports, higher d values are empirically easier: they correlate positively with human item accuracy. A positive model correlation indicates the model is also more accurate on easier items.See comparison/README.md for details.
See docs/README.md for data schema, releases, adding tasks/models, and secrets setup.
See docs/runtime_exports.md for reusable runtime exports (load_model, run_trials, run-trials-jsonl) used by sibling repos.
See docs/aquila-intermediate-runbook.md for Aquila intermediate checkpoint integration and dual-environment setup.
See docs/environment-split.md for benchmark vs Aquila virtualenv activation and usage.
See scripts/README.md for a script-by-script command index.
See CHANGELOG.md for ongoing project update history.
To migrate from the legacy -prod flat layout into a versioned bucket layout:
# Preview copy operations
python scripts/migrate_assets_to_versioned_bucket.py \
--version 2026-03-24 \
--dest-bucket gs://levante-bench \
--dry-run
# Execute migration
python scripts/migrate_assets_to_versioned_bucket.py \
--version 2026-03-24 \
--dest-bucket gs://levante-bench
Then point downloads at the destination bucket:
export LEVANTE_ASSETS_BUCKET_URL=https://storage.googleapis.com/levante-bench/corpus_data
python scripts/data_prep/download_levante_assets.py --version v1 --workers 8
corpus_data is the default destination prefix in the migration script, and can
be changed with --dest-root-prefix.
Versioned snapshots also include:
manifest.csvtranslations/item-bank-translations.csvWhen running benchmark/eval commands with --version current, local version
resolution now picks the most recently modified folder under data/assets/
(not only YYYY-MM-DD names), so version labels like v1 or pilot are supported.
Large hosted vision models can be run through the registry/runner path via
src/levante_bench/models/hf_hosted.py and model configs under configs/models/.
Set one HF token env var before running:
export HF_TOKEN=... # or HUGGINGFACEHUB_API_TOKEN
Example hosted model IDs:
qwen25vl_72b_hf (Qwen/Qwen2.5-VL-72B-Instruct)qwen3vl_30b_hf (Qwen/Qwen3-VL-30B-A3B-Instruct)qwen3vl_235b_hf (Qwen/Qwen3-VL-235B-A22B-Instruct)Run full eval with a hosted model:
PYTHONPATH=src .venv/bin/python -m levante_bench.cli run-eval \
--model qwen25vl_72b_hf \
--version current \
--device cpu
Cite the LEVANTE manuscript and the DevBench (NeurIPS 2024) paper when using this benchmark.
LICENSE).Canonical benchmark manifests are available under datasets/:
datasets/v1/dataset.yamldatasets/vocab/dataset.yamlThese manifests provide stable dataset metadata, URI templates, split definitions, logical schema fields, and provenance references intended to support Croissant metadata generation.
Extensible Python-first benchmark comparing VLMs (CLIP-style and LLaVA-style) to children's behavioral data from LEVANTE. R is used for downloading trials (Redivis), fetching IRT models, and for statistical comparison; Python is used for config, data loaders, model adapters, and the evaluation runner.
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install -e . # install this package
# Optional: pip install -r requirements-transformers.txt # for CLIP
Use Python 3.10–3.13. On 3.13, requirements.txt pins torch>=2.6 and newer numpy/pandas so pip can install wheels (older torch/pandas often have no cp313 builds).
Pinned deps: requirements.txt. Dev: requirements-dev.txt.
You can use the package as a model runtime in another repo without adopting LEVANTE task loaders. Full guide: docs/runtime_exports.md.
from levante_bench.runtime import load_model, run_trials
model = load_model(model_name="qwen35", device="auto")
trials = [
{
"trial_id": "sample-1",
"item_uid": "sample-1",
"prompt": "Pick the best option.",
"option_labels": ["A", "B", "C", "D"],
"correct_label": "A",
"context_image_paths": [],
"option_image_paths": [],
"answer_format": "label",
}
]
results = run_trials(model, trials, max_new_tokens=64, task_id="custom")
Notes:
context_image_paths and option_image_paths.load_model() reuses it.model_config_path=... or model_config={...} to load_model().levante_bench.runtime.run_logit_forced_12(...) (see docs/runtime_exports.md).CLI equivalent:
levante-bench run-trials-jsonl \
--input-jsonl ./trials.jsonl \
--output-jsonl ./results.jsonl \
--model qwen35 \
--device auto \
--max-new-tokens 64 \
--task-id custom
src/levante_bench/config/irt_model_mapping.csv to map each task to its IRT model .rds file in the Redivis model registry (e.g. trog,trog/multigroup_site/overlap_items/trog_rasch_f1_scalar.rds).redivis package; run Rscript scripts/download_levante_data.R to fetch trials and IRT models into data/responses/<version>/ (default version: v1; writes SHA256SUMS.txt for reproducibility).python scripts/data_prep/download_levante_assets.py [--version VERSION] to download corpus and images from a versioned bucket prefix into data/assets/<version>/, plus shared additional images into data/assets/additional_images/ by default. If --version is omitted, the script uses LEVANTE_DATA_VERSION when set, otherwise v1. Visual asset downloads are parallelized (--workers, default 8).
python scripts/data_prep/download_synth_vocab_assets.py to sync gs://levante-bench/corpus_data/synth_vocab into data/assets/synth_vocab/.levante-bench list-taskslevante-bench list-modelslevante-bench check-gpu # verify local CUDA availabilitylevante-bench run-eval --task trog --model clip_base [--version VERSION] [--prompt-language de]levante-bench run-eval --task trog --model gemma3 --version v1 --device cuda # Gemma 3 smoke runlevante-bench run-benchmark --benchmark v1 --device autolevante-bench run-benchmark --benchmark vocab --device autolevante-bench run-workflow --workflow smol-vocab -- --helplevante-bench run-workflow --workflow benchmark-v1 -- --helpscripts/validate_all.sh # ruff + pytest + GPU check + benchmark smoke runsscripts/validate_all.sh --full-benchmarks # same checks + full v1 and vocab benchmarksscripts/validate_all.sh --with-r-validation # include R/Redivis package checksscripts/validate_r.sh --run-comparison-smoke --version 2026-03-24 # optional R comparison smoke testlevante-bench run-comparison --task trog --model clip_base or run Rscript comparison/compare_levante.R --task TASK --model MODEL directly. Outputs accuracy (with the IRT item d parameter) and D_KL (by ability bin) to results/comparison/.For multilingual runs (--prompt-language not English), per-model result folders include a 2-letter language suffix. Result layout is deterministic: results/<version>/<model>-<size>[-<lang>]/ and each model folder includes a metadata.json. Example: results/<version>/qwen35-2B-de/.
run-eval supports repeated runs when using true-random option ordering:
levante-bench run-eval \
--task trog \
--model qwen25vl_72b_hf \
--version v1 \
--true-random-option-order \
--num-runs 3
results/<version>/<model>/.results/<version>/<model>/0001/results/<version>/<model>/0002/cache/responses.json as option_order_seed.For Slurm/sbatch jobs, true-random mode is Slurm-aware by default and uses
job-based parent folders (for example job12345-task7/0001) to avoid
cross-job collisions while keeping numbered run subfolders. You can override with:
levante-bench run-eval \
--true-random-option-order \
--run-label "job{run_index_padded}" \
--no-slurm-run-label
Equivalent experiment YAML controls:
true_random_option_order: true
num_runs: 7
slurm_run_label: true # default; uses SLURM_JOB_ID/SLURM_ARRAY_TASK_ID when available
run_label: "" # optional parent folder override; runs stay 0001, 0002, ...
/ when deployed with Vercel./api/results-report supports:
RESULTS_SOURCE_MODE=bucket_compute, default),RESULTS_SOURCE_MODE=remote + RESULTS_REPORT_URL), orRESULTS_SOURCE_MODE=local).RESULTS_BUCKET_PREFIX at the tree that holds model summary.csv files (typically results/v1). The dashboard footer shows Summaries: gs://… from the computed report.RESULTS_BUCKET_PREFIX:
/api/kl-report — KL_REPORT_BUCKET_PREFIX (default results/comparison, *_d_kl.csv),/api/model-age-equivalency — MODEL_AGE_EQ_BUCKET_PREFIX,/api/model-age-equivalency-accuracy — MODEL_AGE_EQ_ACC_BUCKET_PREFIX or MODEL_AGE_EQ_BUCKET_PREFIX,/api/human-age-accuracy — HUMAN_AGE_BUCKET_PREFIX (default results),/api/parser-glitch-report — PARSER_GLITCH_BUCKET_PREFIX (default results)..env.example for the full set of variables.Models / Children),python scripts/analysis/plot_human_accuracy_by_age_lines.py \
--trials-csv data/responses/v1/trials.csv \
--output-csv results/human-accuracy-by-age-lines.csv \
--output results/human-accuracy-by-age-lines.png
python scripts/analysis/build_model_comparison_report.py --results-root results --output-json results/model-comparison-report.json
You can run experiment configs directly using the eval-style command structure:
# Direct
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml
# Wrapper (same behavior)
bash run_experiment.sh configs/experiments/experiment.yaml
Use dotlist-style overrides to change task subsets and smoke caps:
# Vocab smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[vocab] max_items_vocab=8 device=cpu
# Math smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[egma-math] max_items_math=2 device=cpu
# ToM smoke
python -m levante_bench.cli experiment=configs/experiments/experiment.yaml tasks=[theory-of-mind] max_items_tom=2 device=cpu
For prompt experiments on mental rotation, you can override only that task's prompt text in experiment YAML:
task_overrides:
mental-rotation:
mental_rotation_prompt_template: |
The first image is the reference shape.
The second image is option A. The third image is option B.
One option is the same shape rotated to a different angle.
The other is a MIRROR image (horizontally flipped).
Which option matches the reference - just rotated, NOT flipped?
Answer with one letter: A or B.
levante-bench CLI (run-workflow and run-benchmark), including first-class v1 and vocab benchmark presets.levante-bench check-gpu and automatic device resolution (--device auto) with safe CUDA->CPU fallback.scripts/build_math_prompts.py now defaults to shuffled options, supports numberline image attachment via --numberline-graphics-dir, and has configurable numberline instruction styles (minimal, stepwise).scripts/run_smolvlmv2_math_eval.py now accepts image-backed prompt records (image_paths) so numberline items can be evaluated with actual graphics.levante-bench run-benchmark --benchmark vocab.scripts/validate_all.sh to run lint/tests/GPU check plus smoke or full benchmark validations in one command.scripts/list_benchmark_results.py to list benchmark and prompt-experiment outputs with metric deltas vs prior runs.# Heatmap of models x tasks accuracy
python scripts/plot_results.py
# Specific version
python scripts/plot_results.py --version 2026-03-24
# Text table only
python scripts/plot_results.py --no-plot
Use these commands to verify what ran and compare with prior runs:
# Show benchmark + prompt experiment history with deltas.
python3 scripts/list_benchmark_results.py --limit 20
# Run full validation pipeline (lint/tests/gpu + smoke benchmarks).
scripts/validate_all.sh
# Run full benchmarks instead of smoke.
scripts/validate_all.sh --full-benchmarks
# Include R package validation in the full validation pass.
scripts/validate_all.sh --with-r-validation
The test suite is split into fast unit/property tests (default) and opt-in integration tests (model loading / dataset end-to-end checks).
python -m pytest
tests/test_model_inference.pytests/test_task_datasets.pyLEVANTE_RUN_INTEGRATION=1 so
default CI/local runs stay deterministic and fast.LEVANTE_RUN_INTEGRATION=1 python -m pytestCurrent parser-focused coverage includes:
parse_answer / parse_answer_v2 branch coverage (JSON, embedded JSON,
phrase patterns, exact/prefix forms, ambiguous-prose rejection).parse_numeric_answer / parse_numeric_v2 branch coverage (strict JSON,
embedded JSON, slider mode constraints, fallback behavior).<imageN> interleaving behavior across model adapters.evaluate_trial correctness for label, numeric, and slider formats.run_eval.5xx retry and token-cap doubling path).Evaluation now uses a canonical parse layer with provenance so correctness is decided in normalized answer space, not output surface format.
predicted_label in option_labels.predicted_value (float), then compare
to target_value using slider_tolerance.[0,1], then map back to
task scale via slider_min/slider_max.ParseResult (in src/levante_bench/models/base.py) returns:
value (canonical parsed value/label or None)reason (extracted reason or source text)parse_method (which rule matched)parse_confidence (high / medium / low / none)raw_candidate (raw extracted token)evaluate_trial() now uses:
parse_answer_result(...) for label tasksparse_numeric_result(...) for numeric/slider tasksBackward-compatible APIs (parse_answer, parse_numeric_answer) are kept for
existing callers, but benchmark scoring uses parser-v2 paths.
Per-task CSV outputs now include parser provenance columns:
parse_methodparse_confidenceparse_raw_candidateThis supports score audits (for example, reviewing accuracy by parse method or identifying low-confidence parses).
The benchmark compares model outputs to human behavioral data on two dimensions:
d: Model accuracy (correct/incorrect per item) is paired with IRT item d parameters extracted from fitted Rasch models. In the current exports, higher d values are empirically easier: they correlate positively with human item accuracy. A positive model correlation indicates the model is also more accurate on easier items.See comparison/README.md for details.
See docs/README.md for data schema, releases, adding tasks/models, and secrets setup.
See docs/runtime_exports.md for reusable runtime exports (load_model, run_trials, run-trials-jsonl) used by sibling repos.
See docs/aquila-intermediate-runbook.md for Aquila intermediate checkpoint integration and dual-environment setup.
See docs/environment-split.md for benchmark vs Aquila virtualenv activation and usage.
See scripts/README.md for a script-by-script command index.
See CHANGELOG.md for ongoing project update history.
To migrate from the legacy -prod flat layout into a versioned bucket layout:
# Preview copy operations
python scripts/migrate_assets_to_versioned_bucket.py \
--version 2026-03-24 \
--dest-bucket gs://levante-bench \
--dry-run
# Execute migration
python scripts/migrate_assets_to_versioned_bucket.py \
--version 2026-03-24 \
--dest-bucket gs://levante-bench
Then point downloads at the destination bucket:
export LEVANTE_ASSETS_BUCKET_URL=https://storage.googleapis.com/levante-bench/corpus_data
python scripts/data_prep/download_levante_assets.py --version v1 --workers 8
corpus_data is the default destination prefix in the migration script, and can
be changed with --dest-root-prefix.
Versioned snapshots also include:
manifest.csvtranslations/item-bank-translations.csvWhen running benchmark/eval commands with --version current, local version
resolution now picks the most recently modified folder under data/assets/
(not only YYYY-MM-DD names), so version labels like v1 or pilot are supported.
Large hosted vision models can be run through the registry/runner path via
src/levante_bench/models/hf_hosted.py and model configs under configs/models/.
Set one HF token env var before running:
export HF_TOKEN=... # or HUGGINGFACEHUB_API_TOKEN
Example hosted model IDs:
qwen25vl_72b_hf (Qwen/Qwen2.5-VL-72B-Instruct)qwen3vl_30b_hf (Qwen/Qwen3-VL-30B-A3B-Instruct)qwen3vl_235b_hf (Qwen/Qwen3-VL-235B-A22B-Instruct)Run full eval with a hosted model:
PYTHONPATH=src .venv/bin/python -m levante_bench.cli run-eval \
--model qwen25vl_72b_hf \
--version current \
--device cpu
Cite the LEVANTE manuscript and the DevBench (NeurIPS 2024) paper when using this benchmark.
LICENSE).Canonical benchmark manifests are available under datasets/:
datasets/v1/dataset.yamldatasets/vocab/dataset.yamlThese manifests provide stable dataset metadata, URI templates, split definitions, logical schema fields, and provenance references intended to support Croissant metadata generation.