# π₀.₅ (Pi05) ポリシー

π₀.₅は、Physical Intelligenceによる**オープンワールド汎化能力を備えたVision-Language-Actionモデル**です。LeRobotの実装は、彼らのオープンソースリポジトリである[OpenPI](https://github.com/Physical-Intelligence/openpi)を基に調整されています。

## モデル概要

π₀.₅は、[Physical Intelligence](https://www.physicalintelligence.company/blog/pi05)が開発したπ₀からの大きな進化であり、ロボティクスにおける大きな課題である**オープンワールド汎化**に対応するために設計されています。ロボットは制御された環境で印象的なタスクを実行できますが、π₀.₅は、学習中に一度も見たことのない全く新しい環境や状況に汎化するように設計されています。

### 汎化の課題

Physical Intelligence が説明しているように、根本的な課題は、俊敏さや器用さを要するタスクの実行ではなく、汎化能力、すなわち新しい環境で新しいオブジェクトに対してタスクを正しく実行する能力です。異なる住宅の清掃を行うロボットを想像してください。各住宅には、異なる場所に異なるオブジェクトが配置されています。汎化は複数のレベルで発生する必要があります。

- **物理レベル**: 混雑した環境で見たことのない物体があっても、スプーン（柄の部分）やプレート（縁の部分）をどのように掴むかを理解すること
- **セマンティックレベル**: タスクの意味を理解し、衣類や靴をどこに置くべきか（ベッドの上ではなく洗濯かご）、こぼれた汚れを掃除するにはどのような道具が適切かを把握すること
- **環境レベル**: 家庭、スーパーマーケット、オフィス、病院など、複雑な現実世界の環境に適応すること

### 異種データでの共同学習

π₀.₅における画期的な革新は、**異種データソースでの共同学習**です。モデルは以下から学習します:

1. **マルチモーダルWebデータ**: 画像キャプション生成、視覚的質問応答、物体検出
2. **口頭指示**: 人間が複雑なタスクをステップバイステップでロボットにコーチングする
3. **サブタスクコマンド**: 高レベルのセマンティックな動作ラベル（例: 整えられていないベッドに対して「枕を拾う」）
4. **クロスエンボディメントロボットデータ**：異なる能力を持つさまざまなロボットプラットフォームからのデータ
5. **マルチ環境データ**: 多数の異なる家庭に配置された静的ロボット
6. **モバイルマニピュレーションデータ**: モバイルロボットのデモレーション約400時間

この多様なトレーニングミックスは、物理的・視覚的・意味的なレベルで同時に一般化を可能にする「カリキュラム」を構築します。

## インストール要件

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

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

   PyPIからLeRobotをインストールした場合は:

   ```bash
   pip install 'lerobot[pi]'
   ```

## 使用方法

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

```python
policy.type=pi05
```

## トレーニング

### LIBEROでのクイックスタート

[lerobot/libero](https://huggingface.co/datasets/lerobot/libero)（[以下の結果](#libero-benchmark-results)の背後にあるデモの約1.9 GBの動画エンコード済みコピー）で、LIBEROベースモデルをファインチューニングします。

π₀.₅が読み取るキーを保持しており、これらはLIBERO環境が評価時に生成するキーでもあります。

| 機能                     | データセット内のShape | π₀.₅がそれをどのように消費するか                                    |
| --------------------------- | -------------------- | ------------------------------------------------------- |
| `observation.images.image`  | 256×256×3、agentview | 224×224にリサイズ                                      |
| `observation.images.image2` | 256×256×3、手首     | 224×224にリサイズ                                      |
| `observation.state`         | 8                    | 256個のビンに離散化され、プロンプトに書き込まれます   |
| `action`                    | 7                    | 内部で32にパディングされます。損失は最初の7次元を使用します |

**ここでは`--rename_map`は不要です** — キーがすでに一致しているためです。キーが異なる場合は、[Rename Map and Empty Cameras](./rename_map)を参照してください。

  π₀.₅ は、ゲート付きの [google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224) トークナイザーを使用します。トレーニングの前に、Hub でそのライセンスに同意し、`hf auth login` でログインしてください。

80 GBのGPU1台で動作するサイズ:

```bash
lerobot-train \
    --dataset.repo_id=lerobot/libero \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_libero_base \
    --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
    --policy.n_action_steps=10 \
    --policy.empty_cameras=1 \
    --policy.freeze_vision_encoder=false \
    --policy.train_expert_only=false \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --policy.push_to_hub=false \
    --output_dir=./outputs/pi05_libero \
    --job_name=pi05_libero \
    --batch_size=64 \
    --num_workers=8 \
    --steps=30000 \
    --save_freq=5000 \
    --seed=1000
```

**平均/標準偏差正規化（[quantile default](#quantile-statistics)ではなく）** — 以下の結果を測定したチェックポイントである [pi05_libero_finetuned_v044](https://huggingface.co/lerobot/pi05_libero_finetuned_v044) と一致しています。

`--policy.pretrained_path` は重みのみを読み込むため、**`--policy.n_action_steps=10` および `--policy.empty_cameras=1` は明示的に指定する必要があります**。`lerobot/pi05_libero_base` には両方が保存されており、指定しないと `50` と `0` にフォールバックしてしまいます（[チェックポイントの読み込み](#loading-a-checkpoint)を参照）。

その後、`lerobot-eval`でチェックポイントを評価し、[LIBERO](./libero)に記載されている参照の成功率と比較してください。

### Quantile統計

π₀.₅ は `STATE` と `ACTION` を分位数で正規化するため、データセットの `meta/stats.json` には `q01` と `q99` が必要です。古いデータセットには `min`/`max`/`mean`/`std` のみが含まれており、最初のバッチで失敗します:

```
ValueError: QUANTILES normalization mode requires q01 and q99 stats
```

再計算します:

```bash
lerobot-edit-dataset \
    --repo_id your_dataset \
    --new_repo_id your_dataset \
    --operation.type recompute_stats \
    --operation.overwrite true
```

**The result lands in `$HF_LEROBOT_HOME/your_dataset`**, not the cache `--dataset.repo_id` reads — so train with `--dataset.root=$HF_LEROBOT_HOME/your_dataset`, or add `--push_to_hub true` above.

または、データセットをそのままにして、`--policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}'` を渡します。

エピソードごとのサマリーから集計パーセンタイルを記録、再開、マージすることで、`meta/stats.json`にはデータセット全体のパーセンタイルではなく、保守的なエンベロープ（`q <= 50` に対して `min`、`q > 50` に対して `max`）が保存されるようになります。後者を推定するには、すべてのエピソードを走査し、実行中ヒストグラムを使用します:

```bash
python src/lerobot/scripts/augment_dataset_quantile_stats.py \
    --repo-id=your_dataset \
    --overwrite \
    --skip-images
```

`--skip-images` は既存の画像統計を保持し、`STATE`/`ACTION` の再計算のみが必要な場合に、動画データのダウンロードやデコードを回避します。`--root` は Hub ではなくローカルのデータセットを読み込みます。これらの値はヒストグラムによる推定値であり、離散化やリビンニングの誤差の影響を受けるため、保守的な値とは異なる場合があります。これにより、π₀.₅ の正規化されたターゲットが変化し、その損失のスケールも変わります。既存のチェックポイント内に保存されている統計には影響しません。

### トレーニングコマンドの例

VLMを凍結したまま同じファインチューニングを実行します: メモリ使用量は少なくなりますが、成功率が多少低下する可能性があります。`--dataset.repo_id`を独自のデータセットに置き換えてください。

```bash
lerobot-train \
    --dataset.repo_id=lerobot/libero \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_libero_base \
    --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
    --policy.n_action_steps=10 \
    --policy.empty_cameras=1 \
    --policy.freeze_vision_encoder=true \
    --policy.train_expert_only=true \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --policy.push_to_hub=false \
    --output_dir=./outputs/pi05_libero_expert \
    --job_name=pi05_libero_expert \
    --batch_size=64 \
    --num_workers=8 \
    --steps=30000 \
    --save_freq=5000 \
    --seed=1000
```

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

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

### オプションのトレーニング時のRTC

Pi05では、[Training-Time Action Conditioning for Efficient Real-Time Chunking](https://arxiv.org/abs/2512.05964)に従い、効率的な[Real-Time Chunking](./rtc)のためのアクションプレフィックス条件付けを任意に学習できます。`policy.rtc_training_max_delay`を、コントローラーステップにおける想定される最大の推論遅延に設定してください:

```bash
lerobot-train \
    --dataset.repo_id=${HF_USER}/my_dataset \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_base \
    --policy.rtc_training_max_delay=10 \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --batch_size=8 \
    --steps=30000 \
    --output_dir=outputs/pi05_rtc \
    --job_name=pi05_rtc
```

デフォルト値は`0`であり、これにより学習時のRTCが無効化され、標準的なPi05の目的関数は変更されません。設定される遅延は`chunk_size`より小さくなければなりません。学習中、Pi05は各サンプルに対してクリーンなプレフィックスの長さを独立してサンプリングし、残りのポストフィックスに対してのみフロー損失を計算します。

学習済みRTCを明示的に使用して、生成されたチェックポイントを使用します:

```bash
lerobot-rollout \
    --strategy.type=base \
    --policy.path=outputs/pi05_rtc/checkpoints/last/pretrained_model \
    --inference.type=rtc \
    --inference.rtc.mode=trained \
    --inference.rtc.execution_horizon=10 \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --task="pick up the cube" \
    --fps=50 \
    --device=cuda
```

`inference.rtc.execution_horizon` は、チェックポイントの `rtc_training_max_delay` と `chunk_size - rtc_training_max_delay` の間に設定し、`inference.queue_threshold` は少なくとも `rtc_training_max_delay` 以上に設定してください。学習範囲を超える一時的なレイテンシスパイクが発生した場合、そのチャンクは破棄され、再試行が行われます。レイテンシが範囲外に留まり続ける場合のみ、明示的なエラーとともにロールアウトが停止します。通常のチェックポイントに対しては、デフォルトの `--inference.rtc.mode=guided` が引き続き利用可能です。

### チェックポイントの読み込み

これら2つの形式は互換性がありません:

|                                        | `--policy.path`                                | `--policy.pretrained_path`                |
| -------------------------------------- | ---------------------------------------------- | ----------------------------------------- |
| 読み込み                                  | 重み**と**チェックポイントの`config.json` | 重みのみ                              |
| 特徴量の名前                          | チェックポイントから                            | `--rename_map` の後、データセットから   |
| 保存された設定、例: `n_action_steps` | 継承                                      | デフォルトにリセット                     |
| `--policy.type`                        | 省略する必要があります                                | 必須                                  |
| `--rename_map`                         | カメラのキーが異なる場合に必要            | supported for canonicalizing dataset keys |

`--rename_map` は、生データセットのフィーチャー名がポリシーのフィーチャー名と異なる場合に、いずれかの読み込み形式と組み合わせて使用します。例えば、RoboMME のファインチューニングコマンドでは、`--policy.pretrained_path` で重みを初期化しながら、生の `image`、`wrist_image`、`state`、`actions` 列をマッピングします。

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

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

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

## 短期観測メモリ（MEM）

Pi05は、[MEM](https://arxiv.org/abs/2603.03596)に基づく短期間の視覚および固有受容コンテキストを任意で使用できます。両方のパスはデフォルトで無効化されているため、既存のチェックポイントやトレーニングコマンドは、単一フレームのPi05の動作を維持します。

これは MEM の短期記憶のみを実装しています。具体的には、セクション III-C のビデオエンコーダーと、セクション III-D の固有受容性射影です。MEM の長期_言語_記憶（セクション III-B）は実装されていません。この長期記憶では、上位のポリシーが次のサブタスクと、それまでに何が起きたかの圧縮された自然言語の要約を予測します。論文のアブレーション実験では、長期タスクにおいてビデオ記憶だけでは、完全な MEM のタスク進捗の一部しか回復できないことが示されています。

チェックポイントからのファインチューニング時にメモリを導入する場合、これは論文のより弱いアブレーションである`MEM-Posttrain-Only`に対応します。MEMの主要な成果は、ロボット動画と非ロボット動画の多様な混合データで動画エンコーダーを事前学習することから得られますが、現在公開されているPi05のチェックポイントにはこれが含まれていません。

でファインチューニングする際に、これを有効にします:

```bash
lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_base \
    --policy.use_visual_memory=true \
    --policy.memory_frames=6 \
    --policy.memory_stride=30 \
    --policy.memory_temporal_attention_every=4 \
    ...
```

`memory_frames` には現在の観測が含まれます。`memory_stride` は秒ではなく**データセットのフレーム数**で測定されるため、データセットの`fps`に合わせてスケーリングしてください。MEM は 1 秒間隔の 6 つの観測で事前学習されており、これは 30 fps のデータセット（デフォルト）では`memory_stride=30`、`lerobot/robomme`のような 10 fps のデータセットでは`memory_stride=10`となります。

4層ごとに1回、SigLIPの各層の注意機構を、MEMの構成された時空間注意機構に置き換えます。これは、対応するパッチトークン間の因果的時間注意機構と、事前学習済み射影を再利用する標準的な空間注意機構を構成したものであり、ビジョンタワーに学習可能なパラメータは追加されません。最後の該当する層の実行後、過去フレームのトークンは破棄され、下流の言語/アクションプレフィックスの長さは変更されません。

エピソードの開始時に利用可能な履歴がない場合は、パディングとマスクが適用されます。推論時、Pi05は内部で同じ間隔の画像履歴を保持し、ポリシーがリセットされるたびにクリアします。

過去の固有受覚は独立したオプションです:

```bash
--policy.use_proprioceptive_memory=true
```

有効化すると、保持される各フレームに対して1つの投影連続状態トークンが追加され、離散化された状態はテキストプロンプトから削除されます。これにより、状態は正確に1回だけ表現されます（MEMセクションIII-D）。この変更はプロンプトの形式を変えるため、トレーニングの途中で有効にするのではなく、トレーニング開始時から有効にしてください。視覚メモリと固有受容メモリは同じ`memory_frames`および`memory_stride`設定を使用しますが、どちらのパスも独立して有効化できます。選択したメモリオプションでトレーニングまたはファインチューニングを実行してください。推論時のみ有効化しても、単一フレームのチェックポイントに学習されたメモリ動作は得られません。

PEFTでは、`proprio_history_proj`は事前学習済み重みの適応対象がないため、`modules_to_save`を通じて完全に学習・保存されます。

推論時、MEMは1つのバッチ化された履歴キューを保持し、すべてのバッチ行がエピソード境界を共有していると仮定します。`lerobot-eval`は、各バッチ化されたロールアウトの前に、およびベクトル環境をリセットする前に`policy.reset()`を呼び出すことで、この条件を満たします。非同期ベクトルバッチ内で各行を独立して自動リセットすることはサポートされていません。完全なポリシーとアクションキューが一緒にリセットされるよう、新しいロールアウトを開始してください。

## 相対アクション

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

相対アクションを使用するには、まず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=pi05 \
    --policy.use_relative_actions=true \
    --policy.relative_exclude_joints='["gripper"]' \
    ...
```

## パフォーマンス結果

### Liberoベンチマークの結果

π₀.₅ は Libero ベンチマークスイートで優れたパフォーマンスを示しています。LeRobot 実装を比較・テストするために、Libero データセット上で libero ベースモデルをさらに 6k ステップファインチューニングし、その結果を OpenPI の参照結果と比較しました。

| ベンチマーク          | LeRobotの実装 | OpenPI リファレンス |
| ------------------ | ---------------------- | ---------------- |
| **Libero Spatial** | 97.0%                  | 98.8%            |
| **Libero Object**  | 99.0%                  | 98.2%            |
| **Libero Goal**    | 98.0%                  | 98.0%            |
| **Libero 10**      | 96.0%                  | 92.4%            |
| **平均**        | 97.5%                  | 96.85%           |

これらの結果は、多様なロボティック操作タスクにおけるπ₀.₅の強力な汎化能力を示しています。これらの結果を再現するには、[Libero](https://huggingface.co/docs/lerobot/libero)セクションの手順に従ってください。

## ライセンス

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

