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

Pi0 および Pi0.5 モデルのファインチューニング:OpenPI 公式ワークフロー

Pi0 および Pi0.5 は、Physical Intelligence によって開発された視覚-言語-アクション(VLA)モデルです。艾欧(EmbodyFlow)データプラットフォームからエクスポートしたデータを使用してこれらのモデルをファインチューニングする場合、このガイドでは公式の OpenPI フレームワークに基づいた完全なフローを説明します。

なぜ LeRobot ではなく OpenPI フレームワークを選ぶのか?

LeRobot も Pi0 を含む主要なモデルをサポートしていますが、Pi0 シリーズに関しては公式の OpenPI トレーニングフレームワークの使用を強く推奨します。
JAX ベースで開発されており、マルチ GPU による高性能なトレーニングをネイティブでサポートしているため、Pi0 の潜在能力をより引き出すことができます。


1. 準備:データのエクスポートと配置

まず、艾欧プラットフォームでアノテーション済みのデータを OpenPI が認識できる形式に変換する必要があります。

エクスポートフロー

  1. 形式の選択:エクスポートページで LeRobot v2.1 標準形式を選択します。 export lerobot v2.1
  2. ローカルでの解凍:生成された .tar.gz ファイルをダウンロードして解凍します。
  3. ディレクトリ構成:OpenPI がデータをスムーズに見つけられるように、Hugging Face のローカルキャッシュディレクトリに移動してください。例:
    # ディレクトリの準備
    mkdir -p ~/.cache/huggingface/lerobot/local/mylerobot

    # 解凍したファイル(meta.json, data/ などを含む)を移動
    mv /path/to/extracted/data/* ~/.cache/huggingface/lerobot/local/mylerobot/

フィールドマッピングのリファレンス(Aloha 3カメラの例)

後の設定で、コード内のキーとデータ内のフィールドを一致させる必要があります。デフォルトでは以下を推奨します:

  • cam_high: トップビュー
  • cam_left_wrist: 左手首ビュー
  • cam_right_wrist: 右手首ビュー
  • state: ロボットの現在の状態
  • action: 目標アクション(注意:ALOHA は OpenPI のデフォルト設定で 14 次元です。データの次元が異なる場合は、必ず下の「技術的な注意点」セクションを参照してください)。

2. コア:適切なトレーニング設定の選択

OpenPI のトレーニングロジックは高度にテンプレート化されています。設定を選択することは、本質的に「あなたのロボットに最も近い」ポリシーテンプレートを選択し、それをファインチューニングすることを意味します。

ニーズ/シナリオ推奨パス注目ポイント
迅速な検証 / リンクの疎通確認シミュレーションパス (LIBERO / ALOHA Sim)Inputs/Outputs の迅速な一致に重点を置き、コストが最小。
実機デプロイ (双腕 Aloha)ALOHA Realカメラキー、アクション次元、およびグリッパーの制御ロジックを一致させる必要あり。
単腕 / 産業用ロボットUR5 の例を参照制御インターフェースの互換性解決を優先し、その後にトレーニング効果を検討。
究極の汎化性能の追求DROID データ一致ベースDROID の正規化 (Norm Stats) 戦略を学習。

簡単に言うと: 初めて実行する場合は、まずシミュレーション設定でフローを通してください。実機で使用する場合は、ALOHA Real を選択し、state/action の次元を厳密に一致させてください。


技術的な注意点:14 次元 vs 16 次元のアクションベクトルについて

これは非常に見落としやすい「落とし穴」です。OpenPI のデフォルトの ALOHA ポリシー(aloha_policy.py)は、14 次元の構造をハードコードしています:

  • デフォルト構造[左腕6関節, 左グリッパー1, 右腕6関節, 右グリッパー1] = 14 次元。
  • よくある問題:7 軸のロボットアーム(例:[7, 1, 7, 1])を使用している場合、総次元数は 16 になります。この時、コードを修正しないと、超過した次元は暗黙的に切り捨てられ、トレーニングされたモデルは最後の2つの関節を完全に制御できなくなります。

修正の提案:

  1. あなたの action ベクトルの定義を確認してください。
  2. aloha_policy.py 内で、すべての :14 スライスを実際の次元数(例::16)に変更してください。
  3. 同時に _joint_flip_mask の長さを修正し、符号反転ロジックがハードウェアと一致するようにしてください。

3. トレーニング設定の記述

次に、openpi/src/openpi/training/config.py でファインチューニングタスクを定義する必要があります。

# 例:あなたのロボット用にカスタム設定を追加
TrainConfig(
name="pi0_aloha_mylerobot",
model=pi0_config.Pi0Config(),
data=LeRobotAlohaDataConfig(
repo_id="local/mylerobot", # 先ほどデータを配置したディレクトリを指す
assets=AssetsConfig(
assets_dir="/home/user/code/openpi/assets/pi0_aloha_mylerobot",
),
default_prompt="fold the clothes", # タスクの説明、非常に重要
repack_transforms=_transforms.Group(
inputs=[
_transforms.RepackTransform(
{
"images": {
"cam_high": "observation.images.cam_high",
"cam_left_wrist": "observation.images.cam_left_wrist",
"cam_right_wrist": "observation.images.cam_right_wrist",
},
"state": "observation.state",
"actions": "action",
}
)
]
),
),
weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi0_base/params"),
num_train_steps=20_000,
)

4. トレーニング開始:統計情報の計算と実行

トレーニングを開始する前に、必ず正規化統計を実行してください。そうしないと、モデルが受け取る数値範囲が混乱し、学習がうまくいきません。

ステップ 1:Norm Stats の計算

uv run scripts/compute_norm_stats.py --config-name pi0_aloha_mylerobot

ステップ 2:ファインチューニングの開始

最高のパフォーマンスを得るために JAX モードの使用を推奨します。

シングル GPU モード:

export XLA_PYTHON_CLIENT_MEM_FRACTION=0.9
CUDA_VISIBLE_DEVICES=0 uv run scripts/train.py pi0_aloha_mylerobot \
--exp-name=my_first_experiment \
--overwrite

マルチ GPU 並列 (FSDP):

uv run scripts/train.py pi0_aloha_mylerobot --exp-name=multi_gpu_run --fsdp-devices 4

5. 推論とデプロイ

ファインチューニングが完了したら、ポリシーサーバーを起動してロボットを「動かす」ことができます。

# 推論サーバーを起動、デフォルトポートは 8000
uv run scripts/serve_policy.py policy:checkpoint \
--policy.config=pi0_aloha_mylerobot \
--policy.dir=experiments/my_first_experiment/checkpoints/last

6. よくある質問 (FAQ)

  • Q: ビデオメモリが不足 (OOM) します。
    • batch_size を小さくするか、XLA_PYTHON_CLIENT_MEM_FRACTION が正しく設定されているか確認してください。マルチ GPU による FSDP もビデオメモリの圧力を軽減する有効な手段です。
  • Q: モデルのアクションが奇妙、または関節が全く動きません。
    • RepackTransform のマッピングが正しいか確認してください。
    • 上記の 14 次元 vs 16 次元 の技術的な注意点セクションを再度確認し、次元が暗黙的に切り捨てられていないか確認してください。
  • Q: トレーニングの Loss が全く下がりません。
    • default_prompt が正確か確認してください。
    • compute_norm_stats で生成された統計ファイルが有効になっているか確認してください。

その他の参考資料