# π₀ (Pi0)

π₀は、Physical Intelligenceによる汎用ロボット制御用の**Vision-Language-Actionモデル**です。LeRobotの実装は、彼らのオープンソースリポジトリである[OpenPI](https://github.com/Physical-Intelligence/openpi)を基に調整されています。

## モデル概要

π₀は、[Physical Intelligence](https://www.physicalintelligence.company/blog/pi0)が開発した初の汎用ロボット基盤モデルであり、ロボティクスにおける画期的な進歩を代表しています。反復的な動作に特化してプログラムされた従来の狭い専門家のようなロボットプログラムとは異なり、π₀は、視覚的な入力を理解し、自然言語の指示を解釈し、多様なタスクにわたってさまざまなロボットを制御できる汎用ポリシーとして設計されています。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/lerobot-pi0%20(1).png"
  alt="An overview of Pi0"
  width="85%"
/>

### 物理的インテリジェンスのビジョン

Physical Intelligence が述べているように、AI はチェスや創薬などデジタル領域で目覚ましい成功を収めていますが、物理世界における人間の知能は依然として AI を大きく上回っています。Moravec のパラドックスを言い換えると、チェスで勝つことは AI にとって「容易な」問題ですが、シャツをたたむことやテーブルを片付けることは、これまで考案された最も困難な工学問題の一部を解決することを必要とします。π₀ は、大規模言語モデルと同様に、ユーザーがロボットに任意のタスクを依頼できる人工物理知能の開発に向けた第一歩を代表しています。

### アーキテクチャとアプローチ

π₀は、いくつかの重要な革新を組み合わせています：

- **Flow Matching**: フローマッチング（拡散モデルの一種）を用いて、事前学習済みVLMに連続的なアクション出力を追加する新しい手法を使用します
- **クロスエンボディメント学習**: UR5e、バイマニュアルUR5e、Franka、バイマニュアルTrossen、バイマニュアルARX、モバイルTrossen、モバイルFibocomを含む8つの異なるロボットプラットフォームのデータで学習
- **インターネット規模の事前学習**: 事前学習済みの3Bパラメータのビジョン・言語モデルから意味的知識を継承
- **高周波数制御**: リアルタイムの巧緻性操作のために、最大50 Hzでモーターコマンドを出力します

## インストール要件

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

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

## トレーニングデータと機能

π₀は、これまでで最大のロボット操作データセットで訓練されており、3つの主要なデータソースを組み合わせています。

1. **インターネット規模の事前学習**: セマンティック理解のためのウェブからのビジョン・言語データ
2. **Open X-Embodiment Dataset**: オープンソースのロボット操作データセット
3. **Physical Intelligence Dataset**: 8種類の異なるロボットにわたる巧緻性タスクの大規模かつ多様なデータセット

## 使用方法

LeRobotでπ₀を使用するには、ポリシータイプを以下のように指定します:

```python
policy.type=pi0
```

## トレーニング

π₀の学習には、適切な設定を指定して標準的なLeRobot学習スクリプトを使用できます。

```bash
lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi0 \
    --output_dir=./outputs/pi0_training \
    --job_name=pi0_training \
    --policy.pretrained_path=lerobot/pi0_base \
    --policy.repo_id=your_repo_id \
    --policy.compile_model=true \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.freeze_vision_encoder=false \
    --policy.train_expert_only=false \
    --steps=3000 \
    --policy.device=cuda \
    --batch_size=32
```

### 主要な学習パラメータ

- **`--policy.compile_model=true`**: 高速なトレーニングのためにモデルのコンパイルを有効にします
- **`--policy.gradient_checkpointing=true`**: 学習中のメモリ使用量を大幅に削減します
- **`--policy.dtype=bfloat16`**: 効率化のために混合精度学習を使用します
- **`--batch_size=32`**: 学習用のバッチサイズ。GPUのメモリに応じて調整してください
- **`--policy.pretrained_path=lerobot/pi0_base`**: 微調整したいベースのπ₀モデル。選択肢は以下の通りです:
  - [lerobot/pi0_base](https://huggingface.co/lerobot/pi0_base)
  - [lerobot/pi0_libero](https://huggingface.co/lerobot/pi0_libero)（Liberoデータセットで特化して学習済み）
- **`--policy.optimizer_fused=true`**: 高速なオプティマイザーステップのためにfused AdamWを使用します。このフラグは、ランを再開する場合は無視されます

### トレーニングパラメータの説明

| パラメータ               | デフォルト | 説明                                 |
| ----------------------- | ------- | ------------------------------------------- |
| `freeze_vision_encoder` | `false` | ビジョンエンコーダーをフリーズしないでください            |
| `train_expert_only`     | `false` | VLMをフリーズせず、すべてのパラメータを学習します |

**💡 ヒント**: `train_expert_only=true` を設定すると、VLM が凍結され、アクションエキスパートと射影のみが学習対象となります。これにより、メモリ使用量を削減しながらファインチューニングを実行できます。

## 相対アクション

デフォルトでは、π₀は絶対的なアクションを予測します。**相対アクション**を有効にすると、モデルは現在のロボット状態に対するオフセットを予測するようになります。これにより、特定のセットアップにおける学習の安定性が向上する場合があります。

相対アクションを使用するには、まずCLIを通じて相対空間でのデータセットの統計情報を再計算してください。

```bash
lerobot-edit-dataset \
    --repo_id your_dataset \
    --new_repo_id your_dataset \
    --operation.type recompute_stats \
    --operation.overwrite true \
    --operation.relative_action true \
    --operation.chunk_size 50 \
    --operation.relative_exclude_joints "['gripper']" \
    --push_to_hub true
```

または、Pythonでは以下のように記述できます:

```python
from lerobot.datasets import LeRobotDataset, recompute_stats

dataset = LeRobotDataset("your_dataset")
recompute_stats(dataset, relative_action=True, chunk_size=50, relative_exclude_joints=["gripper"])
dataset.push_to_hub()
```

`chunk_size` は、ポリシーの `chunk_size` と一致させる必要があります（π₀ のデフォルトは 50 です）。`relative_exclude_joints` は、絶対空間のままにしておくべき関節の名前を列挙します（例：グリップコマンド）。更新された統計情報を Hub にアップロードするには、`--push_to_hub true` を使用してください。

次に、相対アクションを有効にして学習します:

```bash
lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi0 \
    --policy.use_relative_actions=true \
    --policy.relative_exclude_joints='["gripper"]' \
    ...
```

## ライセンス

このモデルは、元の[OpenPIリポジトリ](https://github.com/Physical-Intelligence/openpi)と一貫して、**Apache 2.0ライセンス**に従っています。

