メインコンテンツまでスキップ

SmolVLA のファインチューニング

SmolVLA は Hugging Face LeRobot が公開する軽量 VLA 基盤モデルです。本稿は LeRobot v0.5.0 を前提とします。公式ドキュメント LeRobot v0.5.0 SmolVLA では事前学習重み lerobot/smolvla_base を使い LeRobot データでファインチューニングします。モデルカード lerobot/smolvla_base には多視点画像・ロボット状態・任意の言語・連続動作が入力と記載されています。

最初の安定ベースラインを作るなら、Pi0/Pi0.5 より SmolVLA の方が立ち上げやすいことが多いです(依然として VLA ですが、公式 LeRobot スタック内で完結します)。

IO-AI は ioaitech/lerobot-gpu:v0.5.0 を公開しており、LeRobot v0.5.0・GPU 依存・動画デコード・lerobot-train が入っています。履歴再現用に v0.4.4 / v0.3.3 もありますが、新規実験のデフォルトは v0.5.0 にしてください。

Docker Hub 上の例:

  • ioaitech/lerobot-gpu:v0.5.0
  • ioaitech/lerobot-gpu:v0.4.4
  • ioaitech/lerobot-gpu:v0.3.3

バージョン選択

meta/info.jsoncodebase_version(データ形式)とイメージを揃えます。

データ形式推奨イメージメモ
v3.0ioaitech/lerobot-gpu:v0.5.0現行推奨。公式 SmolVLA コマンドと整合。
v3.0ioaitech/lerobot-gpu:v0.4.4旧 v0.4 スタックの再現用。
v2.1ioaitech/lerobot-gpu:v0.3.3レガシーデータ用。

新規は v3.0 への統一を推奨します。

データ要件

公式は高品質なエピソードを約 50 本から、変化ごとに繰り返し収録することを推奨しています(例:立方体位置 5 種 × 各 10 本)。本数を機械的にコピーするのではなく、カバレッジを重視してください。

最低限の確認:

  • 画像キーが全エピソードで一致
  • observation.stateaction の形状が固定
  • タスク文と物理目標の一致
  • 物体位置・照明・初期姿勢のバリエーション

イメージで学習

docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

スモーク

docker run --rm --gpus all --shm-size 16g \
-v /path/to/lerobot_dataset:/data/input \
-v /path/to/output:/outputs \
ioaitech/lerobot-gpu:v0.5.0 \
bash -lc 'lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=local/my_dataset \
--dataset.root=/data/input \
--batch_size=8 \
--steps=1000 \
--output_dir=/outputs/smolvla_smoke \
--job_name=smolvla_smoke \
--policy.device=cuda \
--wandb.enable=false'

ファインチューニング例

docker run --rm --gpus all --shm-size 16g \
-v /path/to/lerobot_dataset:/data/input \
-v /path/to/output:/outputs \
ioaitech/lerobot-gpu:v0.5.0 \
bash -lc 'lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=local/my_dataset \
--dataset.root=/data/input \
--batch_size=64 \
--steps=20000 \
--output_dir=/outputs/smolvla_finetune \
--job_name=smolvla_finetune \
--policy.device=cuda \
--wandb.enable=false'

公式の目安では単一 A100 で約 20k steps が数時間規模です(解像度・デコード・バッチ・GPU 依存)。

Hub 上のデータセット例(--dataset.root を外す):

lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=your-name/your-dataset \
--batch_size=64 \
--steps=20000 \
--output_dir=outputs/train/smolvla \
--job_name=smolvla_finetune \
--policy.device=cuda \
--wandb.enable=true

ローカルに LeRobot を入れた場合

先に インストール を読み、Python >=3.12lerobot-train を使います。

git clone https://github.com/huggingface/lerobot.git
cd lerobot
git checkout v0.5.0

python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install -e ".[smolvla]"

ローカルパス:

lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=local/my_dataset \
--dataset.root=/path/to/lerobot_dataset \
--batch_size=64 \
--steps=20000 \
--output_dir=outputs/train/smolvla_finetune \
--job_name=smolvla_finetune \
--policy.device=cuda \
--wandb.enable=false

調整の目安

フラグ目安
--batch_sizeVRAM に合わせて小さく始める。
--stepsまず 1k でスモーク、その後 20k 前後を第一基準。
--policy.deviceNVIDIA では cuda。CPU は配線確認のみ。
--wandb.enable長時間・共有実験ではオン。短いローカル検証ではオフ可。
--output_dir実験ごとに分ける。

簡易推論チェック

import torch
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

policy = SmolVLAPolicy.from_pretrained(
"/path/to/output/smolvla_finetune/checkpoints/last",
device="cuda",
)
policy.eval()

observation = {
"observation.images.front": image_tensor,
"observation.state": state_tensor,
}

with torch.no_grad():
action = policy.select_action(observation)

print(getattr(action, "shape", None))

キーや形状エラーは、ハイパラより先にデータ仕様を疑ってください。

トラブルシューティング

--policy.path が旧ドキュメントと違う

v0.5.0 では --policy.path=lerobot/smolvla_base。旧 --policy.type smolvla 等を再現する場合は git タグも固定。

動画デコード失敗

ffmpeg と PyTorch/TorchCodec の整合。イメージは多くの場合同梱済み。

損失は良いが実機が悪い

データの多様性とタスク文の一貫性を確認。SmolVLA は欠けた多様性を自動補完しません。

参考リンク