# SmolVLA

SmolVLAは、Hugging Faceのロボティクス向けの軽量な基盤モデルです。LeRobotデータセットでのファインチューニングが容易なよう設計されており、開発の高速化を支援します。

  <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は、(i)複数のカメラの視点、(ii)ロボットの現在の感覚運動状態、および(iii)自然言語の指示を入力として受け取り、これらをコンテキスト特徴にエンコードして、アクションチャンクを生成する際にアクションエキスパートを条件付けするために使用します。
  

## 環境のセットアップ

1. LeRobotのインストールは、[インストールガイド](./installation)に従って行ってください。
2. 以下のコマンドを実行して、SmolVLAの依存関係をインストールします:

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

## データセットを収集する

SmolVLAはベースモデルであるため、ご自身の環境で最適なパフォーマンスを発揮させるには、ご自身のデータでのファインチューニングが必要です。開始点として、タスクのエピソードを約50本記録することをお勧めします。以下のガイドに従って始めましょう: [データセットの記録](./il_robots)

データセットでは、導入する各バリエーション（例: キューブのピック&プレイスタスクにおけるテーブル上のキューブの位置）について、十分なデモレーションが含まれていることを確認してください。

[SmolVLA論文](https://huggingface.co/papers/2506.01844)で使用された参考用のデータセットとして、以下のリンク先を確認することをお勧めします:

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

このデータセットでは、5つの異なるキューブの位置に対して合計50エピソードを記録しました。各位置について、ピック＆プレイス（掴んで置く）操作のエピソードを10本ずつ収集しました。このように各バリエーションを複数回繰り返す構成により、モデルの汎化性能が向上しました。同様の構成で25エピソードのデータセットも試みましたが、データ量が不足しており、性能が低下しました。したがって、データの品質と量は確実に重要な要素です。データセットをHubに公開した時点で、ファインチューニングスクリプトを使用してSmolVLAをアプリケーションに適用できるようになります。

## Finetune SmolVLA on your data

事前学習済みの450Mモデルである[`smolvla_base`](https://hf.co/lerobot/smolvla_base)を使用し、ご自身のデータでファインチューニングを行ってください。A100 GPU 1台でモデルを20kステップ学習させるには、おおよそ4時間かかります。パフォーマンスとユースケースに基づいて、ステップ数を調整してください。

GPUデバイスがない場合は、[![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)のノートブックを使用してトレーニングできます。

`--dataset.repo_id` を使用して、データセットを学習スクリプトに渡します。インストールのテストを行う場合は、[SmolVLA Paper](https://huggingface.co/papers/2506.01844) のために収集したデータセットの1つを使用した以下のコマンドを実行してください。自分のデータでファインチューニングを行う場合は、ご自身のデータセットに置き換えてください。

```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` は、ファインチューニングされたモデルがプッシュされる Hub リポジトリです。
- `--rename_map` は、データセットのカメラ名を、`smolvla_base` が期待する `camera1`、`camera2`、`camera3` という名前にマッピングします。これを指定しないと、特徴量の不一致エラーによりトレーニングが停止します。ご自身のカメラ名も同様にマッピングしてください（[Rename Map](./rename_map) を参照）。

  GPUが許可している場合、ロード時間が短く保たれる限り、小さなバッチサイズから始めて段階的に増やしていくことができます。

ファインチューニングは芸術です。ファインチューニングのオプションの完全な概要については、runを実行してください。

```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: タスクのバリエーションにおけるSmolVLAの比較。左から右へ: (1) ピック&プレースによるキューブの個数カウント、(2) ピック&プレースによるキューブの個数カウント、(3) 摂動下でのピック&プレースによるキューブの個数カウント、(4) 実世界のSO101を用いたレゴブロックのピック&プレースにおける汎化性能。
  

## ファインチューニングされたモデルを評価し、リアルタイムで実行する

エピソードの記録時にも、HuggingFace Hubへのログインが推奨されます。以下の手順に従ってください: [データセットの記録](./il_robots#record-a-dataset)。ログイン後、以下のコマンドを実行して、ご自身の環境で推論を実行できます:

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

`--robot.port`、`--robot.id`、`--robot.cameras`、`--policy.path`を、それぞれご自身のポート番号、ロボットID、カメラ（データセットと同じカメラ名と解像度）、ファインチューニング済みモデルに置き換えてください。また、学習時に使用したのと同じ`--rename_map`と、データセットの録画時に使用したのと同じ`--task`の説明を渡してください。

上記のコマンドに追加できる任意のフラグ:

- **RTC**（推論が遅い場合、例えば低消費電力ハードウェア上で、より滑らかな動作を実現）: `--inference.type=rtc --inference.rtc.execution_horizon=10 --inference.rtc.max_guidance_weight=10.0`
- **カメラストリームを表示する**: `--display_data=true`
- **自動停止**: `--duration=60`（秒）。デフォルトでは、Ctrl+C を押すまでポリシーが実行されます。

評価エピソードを記録し、必要に応じてテレオペレーターを介してエピソード間でシーンをリセットするには、代わりに`--strategy.type=episodic`を使用してください。すべての戦略については、[Policy Deployment](./inference)を参照してください。

