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

SmolVLAモデルのファインチューニング

概要

SmolVLA(Small Vision-Language-Action)は、HuggingFaceが開発した軽量な視覚-言語-アクションモデルで、ロボット学習タスク専用に設計されています。このモデルは450Mパラメータのみで、コンシューマーグレードのハードウェアでの実行に適しており、ロボット学習研究と開発に理想的な選択です。

前提条件

システム要件

  • オペレーティングシステム:Linux(Ubuntu 20.04+推奨)またはmacOS
  • Pythonバージョン:3.8+
  • GPU:NVIDIA GPU(RTX 3080以上推奨)、最低8GB VRAM
  • メモリ:最低16GB RAM
  • ストレージ容量:最低50GB利用可能容量

環境準備

1. LeRobotのインストール

# LeRobotリポジトリをクローン
git clone https://github.com/huggingface/lerobot.git
cd lerobot

# 仮想環境を作成
conda create -n lerobot python=3.10
conda activate lerobot

# 依存関係をインストール
pip install -e .

2. 追加の依存関係をインストール

# Flash Attentionをインストール(オプション、トレーニング加速用)
pip install flash-attn --no-build-isolation

# Weights & Biasesをインストール(実験追跡用)
pip install wandb
wandb login

データ準備

LeRobotフォーマットデータ

SmolVLAはLeRobotフォーマットのデータセットを使用する必要があります。データセットに以下の構造が含まれていることを確認してください:

your_dataset/
├── data/
│ ├── chunk-001/
│ │ ├── observation.images.cam_high.png
│ │ ├── observation.images.cam_low.png
│ │ └── ...
│ └── chunk-002/
│ └── ...
├── meta.json
├── stats.safetensors
└── videos/
├── episode_000000.mp4
└── ...

データ品質要件

HuggingFaceの推奨によると、SmolVLAは以下を必要とします:

  • 最低25の高品質エピソードで良好なパフォーマンスを達成
  • 100+エピソード推奨で最適な結果を得る
  • 各エピソードは完全なタスク実行プロセスを含むべき
  • 画像解像度は224x224または256x256を推奨

ファインチューニングトレーニング

基本トレーニングコマンド

# 環境変数を設定
export HF_USER="io-ai-data"
export CUDA_VISIBLE_DEVICES=0

# SmolVLAファインチューニングを開始
lerobot-train \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--dataset.root /data/lerobot_dataset \
--batch_size 64 \
--steps 20000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_finetuning \
--policy.device cuda \
--policy.optimizer_lr 1e-4 \
--policy.scheduler_warmup_steps 1000 \
--policy.push_to_hub false \
--save_checkpoint true \
--save_freq 5000 \
--wandb.enable true \
--wandb.project smolvla_finetuning

高度なトレーニング構成

マルチGPUトレーニング

# torchrunを使用したマルチGPUトレーニング
torchrun --nproc_per_node=2 --master_port=29500 \
$(which lerobot-train) \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--dataset.root /data/my_dataset \
--batch_size 32 \
--steps 20000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_multi_gpu \
--policy.device cuda \
--policy.optimizer_lr 1e-4 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true

メモリ最適化構成

# VRAMが小さいGPU向け
lerobot-train \
--policy.type smolvla \
--policy.pretrained_path lerobot/smolvla_base \
--dataset.repo_id ${HF_USER}/my_dataset \
--batch_size 16 \
--steps 30000 \
--output_dir outputs/train/smolvla_finetuned \
--job_name smolvla_memory_optimized \
--policy.device cuda \
--policy.optimizer_lr 5e-5 \
--policy.use_amp true \
--num_workers 2 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true

パラメータ詳細説明

コアパラメータ

パラメータ意味推奨値説明
--policy.typeポリシータイプsmolvlaSmolVLAモデルタイプ
--policy.pretrained_path事前学習済みモデルパスlerobot/smolvla_baseHuggingFace上の公式事前学習済みモデル
--dataset.repo_idデータセットリポジトリID${HF_USER}/my_datasetあなたのHuggingFaceデータセット
--dataset.rootデータセット保存場所/data/my_datasetローカルディレクトリから読み取るよう指定(オプション)
--batch_sizeバッチサイズ64VRAMに応じて調整、RTX 3080は32-64推奨
--stepsトレーニングステップ数20000小さなデータセットの場合は10000に削減可能
--output_dir出力ディレクトリoutputs/train/smolvla_finetunedモデル保存パス
--job_nameジョブ名smolvla_finetuningログと実験追跡用(オプション)

トレーニングパラメータ

パラメータ意味推奨値説明
--policy.optimizer_lr学習率1e-4ファインチューニング時は適切に低下可能
--policy.scheduler_warmup_stepsウォームアップステップ1000学習率ウォームアップ、トレーニングを安定化
--policy.use_amp混合精度trueVRAMを節約、トレーニングを加速
--policy.optimizer_grad_clip_norm勾配クリッピング1.0勾配爆発を防止
--num_workersデータローディングスレッド数4CPUコア数に応じて調整
--policy.push_to_hubHubへプッシュfalseHuggingFaceへモデルをアップロードするか(repo_idが必要)
--save_checkpointチェックポイント保存trueトレーニングチェックポイントを保存するか
--save_freq保存頻度5000チェックポイント保存間隔ステップ

モデル固有パラメータ

パラメータ意味推奨値説明
--policy.vlm_model_nameVLMバックボーンモデルHuggingFaceTB/SmolVLM2-500M-Video-InstructSmolVLAが使用する視覚言語モデル
--policy.chunk_sizeアクションチャンクサイズ50予測されるアクションシーケンスの長さ
--policy.n_action_steps実行アクションステップ50実際に実行されるアクション数
--policy.n_obs_steps観測履歴ステップ1使用される履歴観測フレーム数

トレーニング監視

Weights & Biases統合

SmolVLAは実験追跡のためのW&Bをサポートしています:

# W&Bロギングを有効化
lerobot-train \
--policy.type smolvla \
--dataset.repo_id your-name/your-repo \
--batch_size 64 \
--steps 20000 \
--policy.push_to_hub false \
--wandb.enable true \
--wandb.project smolvla_experiments \
--wandb.notes "SmolVLA finetuning on custom dataset" \
# ... その他のパラメータ

主要メトリクス監視

トレーニング中に注目すべきメトリクス:

  • Loss:全体的な損失、安定して減少すべき
  • Action Loss:アクション予測損失
  • Vision Loss:視覚特徴損失
  • Language Loss:言語理解損失
  • Learning Rate:学習率の変化
  • GPU Memory:VRAM使用状況

モデル評価

モデルの保存と読み込み

# ファインチューニング済みモデルを読み込み
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

policy = SmolVLAPolicy.from_pretrained(
"outputs/train/smolvla_finetuned/checkpoints/last",
device="cuda"
)

# 推論を実行
observation = {
"observation.images.cam_high": image_tensor,
"observation.state": state_tensor
}

action = policy.select_action(observation)

パフォーマンス評価スクリプト

# evaluation.py
import torch
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
from lerobot.datasets.lerobot_dataset import LeRobotDataset

def evaluate_model(model_path, dataset_path):
# モデルを読み込み
policy = SmolVLAPolicy.from_pretrained(model_path, device="cuda")

# テストデータセットを読み込み
dataset = LeRobotDataset(dataset_path, split="test")

total_loss = 0
num_samples = 0

with torch.no_grad():
for batch in dataset:
prediction = policy(batch)
loss = policy.compute_loss(prediction, batch)
total_loss += loss.item()
num_samples += 1

avg_loss = total_loss / num_samples
print(f"Average test loss: {avg_loss:.4f}")

return avg_loss

if __name__ == "__main__":
model_path = "outputs/train/smolvla_finetuned/checkpoints/last"
dataset_path = "path/to/your/test/dataset"
evaluate_model(model_path, dataset_path)

デプロイと推論

リアルタイム推論の例

# inference.py
import torch
import numpy as np
from PIL import Image
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy

class SmolVLAInference:
def __init__(self, model_path):
self.policy = SmolVLAPolicy.from_pretrained(
model_path,
device="cuda"
)
self.policy.eval()

def predict_action(self, image, state, instruction=""):
# 画像を前処理
if isinstance(image, np.ndarray):
image = Image.fromarray(image)

# 観測を構築
observation = {
"observation.images.cam_high": self.preprocess_image(image),
"observation.state": torch.tensor(state, dtype=torch.float32).unsqueeze(0),
"task.language_instruction": instruction
}

# アクションを予測
with torch.no_grad():
action = self.policy.select_action(observation)

return action.cpu().numpy()

def preprocess_image(self, image):
# 画像前処理ロジック
image = image.resize((224, 224))
image_tensor = torch.tensor(np.array(image)).permute(2, 0, 1).float() / 255.0
return image_tensor.unsqueeze(0)

# 使用例
if __name__ == "__main__":
inference = SmolVLAInference("outputs/train/smolvla_finetuned/checkpoints/last")

# 入力をシミュレート
image = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
state = np.random.randn(7) # 7自由度ロボット状態
instruction = "pick up the red cube"

action = inference.predict_action(image, state, instruction)
print(f"Predicted action: {action}")

ベストプラクティス

データ準備の推奨事項

  1. データ品質:デモンストレーションデータの品質を確保し、誤ったまたは一貫性のないアクションを避ける
  2. データ多様性:異なるシナリオ、照明条件、オブジェクト位置のデータを含める
  3. タスク説明:各エピソードに明確な自然言語説明を提供
  4. データバランス:成功と失敗のケースのバランスを確保

トレーニング最適化の推奨事項

  1. 学習率スケジューリング:学習率ウォームアップと減衰戦略を使用
  2. 正則化:適切にドロップアウトと重み減衰を使用
  3. チェックポイント保存:定期的にモデルチェックポイントを保存
  4. 早期停止戦略:検証損失を監視し、過学習を回避

ハードウェア最適化の推奨事項

  1. VRAM管理:混合精度トレーニングを使用してVRAMを節約
  2. バッチサイズ:VRAMサイズに応じてバッチサイズを調整
  3. データローディング:マルチプロセスデータローディングを使用してトレーニングを加速
  4. モデル並列化:大きなモデルの場合、モデル並列化の使用を検討

よくある質問(FAQ)

Q: SmolVLAは他のVLAモデルと比較してどのような利点がありますか?

A: SmolVLAの主な利点には以下が含まれます:

  • 軽量:450Mパラメータのみ、コンシューマーグレードハードウェアに適している
  • 効率的なトレーニング:トレーニング時間が比較的短い
  • 良好なパフォーマンス:複数のロボットタスクで優れたパフォーマンスを発揮
  • デプロイが容易:モデルサイズが適度で、実際のデプロイに便利

Q: トレーニングにはどのくらい時間がかかりますか?

A: トレーニング時間は複数の要因に依存します:

  • データセットサイズ:100エピソードは約2-4時間(RTX 3080)
  • バッチサイズ:より大きなバッチはトレーニングを加速できる
  • ハードウェア構成:より良いGPUはトレーニング時間を大幅に削減できる
  • トレーニングステップ:20000ステップは通常良好な結果を得るのに十分

Q: モデルが収束したかどうかを判断するには?

A: 以下の指標を観察します:

  • 損失曲線:全体的な損失は安定して減少し平坦化すべき
  • 検証パフォーマンス:検証セットでのパフォーマンスがもはや向上しない
  • アクション予測:モデルが予測するアクションは合理的であるべき
  • 実際のテスト:実際の環境でモデルのパフォーマンスをテスト

Q: VRAMが不足する場合はどうすればよいですか?

A: 以下の方法を試すことができます:

  • バッチサイズを減らす(例:64から32または16へ):--batch_size 16
  • 混合精度トレーニングを有効化:--policy.use_amp true
  • データローディングスレッドを減らす:--num_workers 2
  • より小さい画像解像度を使用:--policy.resize_imgs_with_padding 224 224
  • 観測ステップを減らす:--policy.n_obs_steps 1

Q: モデルのパフォーマンスを向上させるには?

A: パフォーマンス向上の方法:

  • データ量を増やす:より多くの高品質なデモンストレーションデータを収集
  • データ拡張:画像拡張技術を使用してデータの多様性を増やす
  • ハイパーパラメータチューニング:学習率、バッチサイズなどのパラメータを調整
  • モデルアンサンブル:複数のモデルをトレーニングしてアンサンブル
  • ドメイン適応:特定のタスクに対して追加のファインチューニング

関連リソース

更新ログ

  • 2024-01: 初版リリース
  • 2024-02: マルチGPUトレーニングサポートを追加
  • 2024-03: メモリ使用量とトレーニング効率を最適化
  • 2024-04: より多くの評価とデプロイの例を追加