# VLABench

[VLABench](https://github.com/OpenMOSS/VLABench) est un benchmark à grande échelle pour la **manipulation robotique conditionnée par le langage avec raisonnement de long terme**. La suite amont couvre 100 catégories de tâches sur plus de 2 000 objets et évalue six dimensions de l'intelligence robotique : la compréhension des maillages et des textures, le raisonnement spatial, le transfert de connaissances du monde, la compréhension des instructions sémantiques, la compréhension des lois physiques et la planification de long terme. Construit sur MuJoCo / dm_control avec un bras Franka Panda 7-DOF. LeRobot expose **43 de ces tâches** via `--env.task` (21 primitives + 22 composites, voir [Tâches disponibles](#available-tasks) ci-dessous).

- Article : [VLABench: A Large-Scale Benchmark for Language-Conditioned Robotics Manipulation with Long-Horizon Reasoning](https://arxiv.org/abs/2412.18194)
- GitHub : [OpenMOSS/VLABench](https://github.com/OpenMOSS/VLABench)
- Site web du projet : [vlabench.github.io](https://vlabench.github.io)
- Politique pré-entraînée : [`lerobot/smolvla_vlabench`](https://huggingface.co/lerobot/smolvla_vlabench)

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/vlabench.png"
  alt="VLABench benchmark overview"
  width="85%"
/>

## Tâches disponibles

VLABench fournit deux suites de tâches couvrant **43 catégories de tâches** dans la surface `--env.task` de LeRobot :

| Suite     | Nom de la CLI    | Tâches | Description                                                      |
| --------- | ----------- | ----- | ---------------------------------------------------------------- |
| Primitive | `primitive` | 21    | Combinations of single / few skills (select, insert, physics QA)     |
| Composite | `composite` | 22    | Raisonnement multi-étapes et planification à long terme (cuisiner, réorganiser) |

**Tâches primitives :** `select_fruit`, `select_toy`, `select_chemistry_tube`, `add_condiment`, `select_book`, `select_painting`, `select_drink`, `insert_flower`, `select_billiards`, `select_ingredient`, `select_mahjong`, `select_poker`, et tâches de raisonnement physique (`density_qa`, `friction_qa`, `magnetism_qa`, `reflection_qa`, `simple_cuestick_usage`, `simple_seesaw_usage`, `sound_speed_qa`, `thermal_expansion_qa`, `weight_qa`).

**Tâches composites :** `cluster_billiards`, `cluster_book`, `cluster_drink`, `cluster_toy`, `cook_dishes`, `cool_drink`, `find_unseen_object`, `get_coffee`, `hammer_nail`, `heat_food`, `make_juice`, `play_mahjong`, `play_math_game`, `play_poker`, `play_snooker`, `rearrange_book`, `rearrange_chemistry_tube`, `set_dining_table`, `set_study_table`, `store_food`, `take_chemistry_experiment`, `use_seesaw_complex`.

`--env.task` accepte trois formes :

- un seul nom de tâche (`select_fruit`)
- une liste séparée par des virgules (`select_fruit,heat_food`)
- un raccourci de suite (`primitive`, `composite` ou `primitive,composite`)

## Installation

VLABench n'est **pas sur PyPI** — sa seule distribution est le dépôt GitHub [OpenMOSS/VLABench](https://github.com/OpenMOSS/VLABench) — LeRobot n'expose donc pas d'extra `vlabench`. Installez-le manuellement en tant que clone éditable, avec les versions de MuJoCo / dm_control requises par VLABench, puis récupérez les assets de maillage :

```bash
# After following the standard LeRobot installation instructions.

git clone https://github.com/OpenMOSS/VLABench.git ~/VLABench
git clone https://github.com/motion-planning/rrt-algorithms.git ~/rrt-algorithms
pip install -e ~/VLABench -e ~/rrt-algorithms
pip install "mujoco==3.2.2" "dm-control==1.0.22" \
            open3d colorlog scikit-learn openai gdown

python ~/VLABench/scripts/download_assets.py
```

VLABench nécessite Linux (`sys_platform == 'linux'`) et Python 3.10+. Définissez le backend de rendu MuJoCo avant l'exécution :

```bash
export MUJOCO_GL=egl  # for headless servers (HPC, cloud)
```

## Évaluation

Tous les extraits d’évaluation ci-dessous reproduisent la commande exécutée par la CI (voir `.github/workflows/benchmark_tests.yml`). L’argument `--rename_map` associe les clés de caméra `image` / `second_image` / `wrist_image` de VLABench à la disposition d’entrée à trois caméras (`camera1` / `camera2` / `camera3`) sur laquelle la politique `smolvla_vlabench` publiée a été entraînée.

### Évaluation monotâche (recommandée pour une itération rapide)

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_vlabench \
  --env.type=vlabench \
  --env.task=select_fruit \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.second_image": "observation.images.camera2", "observation.images.wrist_image": "observation.images.camera3"}'
```

### Évaluation multi-tâches

Passer une liste de tâches séparées par des virgules :

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_vlabench \
  --env.type=vlabench \
  --env.task=select_fruit,select_toy,add_condiment,heat_food \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.second_image": "observation.images.camera2", "observation.images.wrist_image": "observation.images.camera3"}'
```

### Évaluation de la suite

Exécuter une suite entière (les 21 primitives ou les 22 composites) :

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_vlabench \
  --env.type=vlabench \
  --env.task=primitive \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  --env.max_parallel_tasks=1 \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.second_image": "observation.images.camera2", "observation.images.wrist_image": "observation.images.camera3"}'
```

Ou les deux suites :

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_vlabench \
  --env.type=vlabench \
  --env.task=primitive,composite \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  --env.max_parallel_tasks=1 \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.second_image": "observation.images.camera2", "observation.images.wrist_image": "observation.images.camera3"}'
```

### Épisodes d'évaluation recommandés

**10 épisodes par tâche** pour un benchmarking reproductible (210 au total pour la suite complète de primitives, 220 pour les tâches composites). Correspond au protocole du papier VLABench.

## Entrées et sorties de la politique

**Observations :**

- `observation.state` — état de l'effecteur final à 7 dimensions (position xyz + Euler xyz + pince)
- `observation.images.image` — caméra avant, 480×480 HWC uint8
- `observation.images.second_image` — deuxième caméra, 480×480 HWC uint8
- `observation.images.wrist_image` — caméra du poignet, 480×480 HWC uint8

**Actions :**

- Contrôle continu dans `Box(-1, 1, shape=(7,))` — position 3D + orientation Euler 3D + pince 1D.

## Entraînement

### Jeux de données

Jeux de données VLABench précollectés au format LeRobot sur le Hub :

- [`VLABench/vlabench_primitive_ft_lerobot_video`](https://huggingface.co/datasets/VLABench/vlabench_primitive_ft_lerobot_video) — 5 000 épisodes, 128 tâches, images 480×480.
- [`VLABench/vlabench_composite_ft_lerobot_video`](https://huggingface.co/datasets/VLABench/vlabench_composite_ft_lerobot_video) — 5 977 épisodes, 167 tâches, images 224×224.

### Exemple de commande d'entraînement

Effectuer un fine-tuning d'un modèle de base SmolVLA sur la suite de primitives :

```bash
lerobot-train \
  --policy.type=smolvla \
  --policy.repo_id=${HF_USER}/smolvla_vlabench_primitive \
  --policy.load_vlm_weights=true \
  --policy.push_to_hub=true \
  --dataset.repo_id=VLABench/vlabench_primitive_ft_lerobot_video \
  --env.type=vlabench \
  --env.task=select_fruit \
  --output_dir=./outputs/smolvla_vlabench_primitive \
  --steps=100000 \
  --batch_size=4 \
  --env_eval_freq=5000 \
  --eval.batch_size=1 \
  --eval.n_episodes=1 \
  --save_freq=10000
```

## Reproduire des résultats publiés

Le point de contrôle publié [`lerobot/smolvla_vlabench`](https://huggingface.co/lerobot/smolvla_vlabench) a été entraîné sur le jeu de données primitive-suite ci-dessus et est évalué à l’aide des commandes [Single-task](#single-task-evaluation-recommended-for-quick-iteration) / [Suite-wide](#suite-wide-evaluation). CI exécute une évaluation de fumée sur 10 tâches primitives (un épisode chacune) sur chaque PR touchant le benchmark.

