# SmolVLA

SmolVLA é o modelo de fundação leve da Hugging Face para robótica. Projetado para facilitar o ajuste fino em conjuntos de dados LeRobot, ele ajuda a acelerar seu desenvolvimento!

  <img
    src="https://cdn-uploads.huggingface.co/production/uploads/640e21ef3c82bd463ee5a76d/aooU0a3DMtYmy_1IWMaIM.png"
    alt="SmolVLA architecture."
    width="500"
  />
  
  
    Figura 1. O SmolVLA recebe como entrada (i) múltiplas visões de câmeras, (ii) o estado sensoriomotor atual do robô e (iii) uma instrução em linguagem natural, codificada em recursos contextuais usados para condicionar o especialista de ações ao gerar um bloco de ações.
  

## Configure seu ambiente

1. Instale o LeRobot seguindo nosso [Guia de Instalação](./installation).
2. Instale as dependências do SmolVLA executando:

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

## Coletar um conjunto de dados

SmolVLA é um modelo base, portanto, é necessário fazer fine-tuning com seus próprios dados para obter desempenho ideal em sua configuração. Recomendamos gravar cerca de 50 episódios da sua tarefa como ponto de partida. Siga nosso guia para começar: [Gravando um Dataset](./il_robots)

No seu conjunto de dados, certifique-se de ter demonstrações suficientes para cada variação (por exemplo, a posição do cubo na mesa, se for uma tarefa de pegar e colocar o cubo) que você estiver introduzindo.

Recomendamos consultar o conjunto de dados vinculado abaixo, que serviu de referência e foi utilizado no [artigo SmolVLA](https://huggingface.co/papers/2506.01844):

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

Neste conjunto de dados, registramos 50 episódios em 5 posições distintas do cubo. Para cada posição, coletamos 10 episódios de interações de pegar e colocar. Essa estrutura, que repete cada variação várias vezes, ajudou o modelo a generalizar melhor. Tentamos um conjunto de dados semelhante com 25 episódios, e não foi suficiente, resultando em um desempenho ruim. Portanto, a qualidade e a quantidade dos dados são definitivamente fundamentais. Depois que seu conjunto de dados estiver disponível no Hub, você está pronto para usar nosso script de finetuning para adaptar o SmolVLA ao seu aplicativo.

## Ajuste fino do SmolVLA com seus dados

Use [`smolvla_base`](https://hf.co/lerobot/smolvla_base), nosso modelo pré-treinado de 450M, e ajuste-o finamente em seus dados. Treinar o modelo por 20k etapas levará aproximadamente ~4 horas em uma única GPU A100. Você deve ajustar o número de etapas com base no desempenho e no seu caso de uso.

Se você não tiver um dispositivo gpu, pode treinar usando nosso notebook no [![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)

Passar seu conjunto de dados para o script de treinamento usando `--dataset.repo_id`. Se você quiser testar sua instalação, execute o comando a seguir, no qual usamos um dos conjuntos de dados que coletamos para o [SmolVLA Paper](https://huggingface.co/papers/2506.01844). Substitua-o pelo seu próprio conjunto de dados para fazer o ajuste fino nos seus dados.

```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` é o repositório do Hub para o qual o modelo ajustado é enviado.
- `--rename_map` mapeia os nomes das câmeras do conjunto de dados para os nomes `camera1`, `camera2` e `camera3` que o `smolvla_base` espera. Sem ele, o treinamento é interrompido com um erro de incompatibilidade de recursos. Mapeie seus próprios nomes de câmeras da mesma forma (veja [Rename Map](./rename_map)).

  Você pode começar com um tamanho de lote pequeno e aumentá-lo gradualmente, se a GPU permitir, desde que os tempos de carregamento permaneçam curtos.

O fine-tuning é uma arte. Para uma visão completa das opções de fine-tuning, execute

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

  <img
    src="https://cdn-uploads.huggingface.co/production/uploads/640e21ef3c82bd463ee5a76d/S-3vvVCulChREwHDkquoc.gif"
    alt="Comparison of SmolVLA across task variations."
    width="500"
  />
  
  
    Figura 2: Comparação do SmolVLA entre variações de tarefa. Da esquerda para a direita: (1) contagem de cubos em pick-place, (2) contagem de cubos em pick-place, (3) contagem de cubos em pick-place sob perturbações e (4) generalização em pick-and-place do bloco de lego com SO101 do mundo real.
  

## Avalie o modelo ajustado e execute-o em tempo real

Da mesma forma, ao gravar um episódio, é recomendado que você esteja conectado ao HuggingFace Hub. Você pode seguir as etapas correspondentes: [Gravar um dataset](./il_robots#record-a-dataset). Depois de conectado, você pode executar inferência no seu ambiente da seguinte forma:

```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
```

Substitua `--robot.port`, `--robot.id`, `--robot.cameras` e `--policy.path` pela sua própria porta, ID do robô, câmeras (os mesmos nomes de câmera e resolução do seu conjunto de dados) e modelo ajustado. Passe o mesmo `--rename_map` que você usou para o treinamento e a mesma descrição de `--task` da gravação do seu conjunto de dados.

Flags opcionais que você pode adicionar ao comando acima:

- **RTC** (movimento mais suave quando a inferência é lenta, por exemplo, em hardware de baixa potência): `--inference.type=rtc --inference.rtc.execution_horizon=10 --inference.rtc.max_guidance_weight=10.0`
- **Ver o fluxo da câmera**: `--display_data=true`
- **Parar automaticamente**: `--duration=60` (em segundos). Por padrão, a política é executada até você pressionar Ctrl+C.

Para gravar episódios de avaliação, com um teleoperador opcional para redefinir a cena entre eles, use `--strategy.type=episodic` em vez disso. Consulte [Policy Deployment](./inference) para todas as estratégias.

