# SmolVLA

SmolVLA est le modèle de fondation léger de Hugging Face pour la robotique. Conçu pour un fine-tuning facile sur les jeux de données LeRobot, il vous aide à accélérer votre développement !

  <img
    src="/static-proxy?url=https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F640e21ef3c82bd463ee5a76d%2FaooU0a3DMtYmy_1IWMaIM.png"
    alt="SmolVLA architecture."
    width="500"
  />
  
  
    Figure 1. SmolVLA prend en entrée (i) des vues de plusieurs caméras, (ii) l’état sensorimoteur actuel du robot, et (iii) une instruction en langage naturel, encodés en fonctionnalités contextuelles utilisées pour conditionner l’expert d’action lors de la génération d’un bloc d’actions.
  

## Configurer votre environnement

1. Installez LeRobot en suivant notre [Guide d'installation](./installation).
2. Installez les dépendances de SmolVLA en exécutant :

   ```bash
   pip install -e ".[smolvla]"
   ```

## Collecter un jeu de données

SmolVLA est un modèle de base, il est donc nécessaire de l’affiner sur vos propres données pour obtenir des performances optimales dans votre configuration. Nous recommandons d’enregistrer environ 50 épisodes de votre tâche comme point de départ. Suivez notre guide pour commencer : [Enregistrer un jeu de données](./il_robots)

Dans votre jeu de données, assurez-vous de disposer d'un nombre suffisant de démonstrations pour chaque variation (par exemple, la position du cube sur la table s'il s'agit d'une tâche de prise et de placement de cube) que vous introduisez.

Nous vous recommandons de consulter le jeu de données lié ci-dessous, utilisé à titre de référence dans l'[article SmolVLA](https://huggingface.co/papers/2506.01844) :

🔗 [SVLA SO100 PickPlace](https://huggingface.co/spaces/lerobot/visualize_dataset?path=%2Flerobot%2Fsvla_so100_pickplace%2Fepisode_0)

Dans ce jeu de données, nous avons enregistré 50 épisodes répartis sur 5 positions distinctes du cube. Pour chaque position, nous avons collecté 10 épisodes d'interactions de type pick-and-place. Cette structure, qui répète chaque variation plusieurs fois, a aidé le modèle à mieux généraliser. Nous avons essayé un jeu de données similaire avec 25 épisodes, et cela n'a pas été suffisant, ce qui a conduit à de mauvaises performances. La qualité et la quantité des données sont donc absolument essentielles. Une fois votre jeu de données disponible sur le Hub, vous êtes prêt à utiliser notre script de finetuning pour adapter SmolVLA à votre application.

## Ajuster finement SmolVLA sur vos données

Utilisez [`smolvla_base`](https://hf.co/lerobot/smolvla_base), notre modèle pré-entraîné de 450M, et effectuez son fine-tuning sur vos données. L’entraînement du modèle pendant 20k étapes prendra environ 4 heures sur un GPU A100 unique. Vous devez ajuster le nombre d’étapes en fonction des performances et de votre cas d’usage.

Si vous ne disposez pas d'un périphérique gpu, vous pouvez entraîner le modèle en utilisant notre notebook sur [![Google Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/lerobot/training-smolvla.ipynb)

Passez votre jeu de données au script d’entraînement à l’aide de `--dataset.repo_id`. Si vous souhaitez tester votre installation, exécutez la commande suivante, dans laquelle nous utilisons l’un des jeux de données que nous avons collectés pour le [SmolVLA Paper](https://huggingface.co/papers/2506.01844). Remplacez-le par votre propre jeu de données pour l’ajuster sur vos données.

```bash
lerobot-train \
  --policy.path=lerobot/smolvla_base \
  --dataset.repo_id=lerobot/svla_so100_pickplace \
  --policy.repo_id=${HF_USER}/my_smolvla \
  --rename_map='{"observation.images.top": "observation.images.camera1", "observation.images.wrist": "observation.images.camera2"}' \
  --batch_size=64 \
  --steps=20000 \
  --output_dir=outputs/train/my_smolvla \
  --job_name=my_smolvla_training \
  --policy.device=cuda \
  --trackio.enable=true
```

- `--policy.repo_id` est le dépôt du Hub vers lequel le modèle fine-tuné est poussé.
- `--rename_map` associe les noms des caméras du jeu de données aux noms `camera1`, `camera2` et `camera3` attendus par `smolvla_base`. Sans cette option, l’entraînement s’arrête avec une erreur de correspondance des caractéristiques. Associez vos propres noms de caméras de la même manière (voir [Rename Map](./rename_map)).

  Vous pouvez commencer par une petite taille de lot et l’augmenter progressivement, si le GPU le permet, tant que les temps de chargement restent courts.

Le fine-tuning est un art. Pour un aperçu complet des options de fine-tuning, exécutez

```bash
lerobot-train --help
```

  <img
    src="/static-proxy?url=https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F640e21ef3c82bd463ee5a76d%2FS-3vvVCulChREwHDkquoc.gif"
    alt="Comparison of SmolVLA across task variations."
    width="500"
  />
  
  
    Figure 2 : Comparaison de SmolVLA selon les variations de tâche. De gauche à droite : (1) comptage de cubes pick-place, (2) comptage de cubes pick-place, (3) comptage de cubes pick-place sous perturbations, et (4) généralisation sur le pick-and-place du bloc lego avec SO101 en conditions réelles.
  

## Évaluer le modèle affiné et l’exécuter en temps réel

De même, lors de l’enregistrement d’un épisode, il est recommandé d’être connecté au HuggingFace Hub. Vous pouvez suivre les étapes correspondantes : [Enregistrer un jeu de données](./il_robots#record-a-dataset). Une fois connecté, vous pouvez exécuter l’inférence dans votre configuration en procédant ainsi :

```bash
lerobot-rollout \
  --strategy.type=base \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.id=my_blue_follower_arm \
  --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}}" \
  --rename_map='{"observation.images.top": "observation.images.camera1", "observation.images.wrist": "observation.images.camera2"}' \
  --task="Grasp a lego block and put it in the bin." \
  --policy.path=${HF_USER}/FINETUNE_MODEL_NAME
```

Remplacez `--robot.port`, `--robot.id`, `--robot.cameras` et `--policy.path` par votre propre port, identifiant de robot, caméras (mêmes noms de caméras et résolution que dans votre jeu de données) et modèle affiné. Passez le même `--rename_map` que celui utilisé pour l’entraînement, ainsi que la même description de `--task` que lors de l’enregistrement de votre jeu de données.

Options facultatives que vous pouvez ajouter à la commande ci-dessus :

- **RTC** (mouvement plus fluide lorsque l’inférence est lente, par ex. sur du matériel à faible puissance) : `--inference.type=rtc --inference.rtc.execution_horizon=10 --inference.rtc.max_guidance_weight=10.0`
- **Afficher le flux de la caméra** : `--display_data=true`
- **Arrêt automatique** : `--duration=60` (en secondes). Par défaut, la politique s'exécute jusqu'à ce que vous appuyiez sur Ctrl+C.

Pour enregistrer des épisodes d'évaluation, avec un téléopérateur optionnel pour réinitialiser la scène entre eux, utilisez `--strategy.type=episodic` à la place. Consultez [Déploiement de la politique](./inference) pour toutes les stratégies.

