LeRobot documentation
π₀.₅ (Pi05) ポリシー
π₀.₅ (Pi05) ポリシー
π₀.₅は、Physical Intelligenceによるオープンワールド汎化能力を備えたVision-Language-Actionモデルです。LeRobotの実装は、彼らのオープンソースリポジトリであるOpenPIを基に調整されています。
モデル概要
π₀.₅は、Physical Intelligenceが開発したπ₀からの大きな進化であり、ロボティクスにおける大きな課題であるオープンワールド汎化に対応するために設計されています。ロボットは制御された環境で印象的なタスクを実行できますが、π₀.₅は、学習中に一度も見たことのない全く新しい環境や状況に汎化するように設計されています。
汎化の課題
Physical Intelligence が説明しているように、根本的な課題は、俊敏さや器用さを要するタスクの実行ではなく、汎化(generalization)です。これは、新しい環境で新しいオブジェクトに対してタスクを正しく実行する能力を指します。異なる住宅の清掃を行うロボットを想像してください。各住宅には、異なる場所に異なるオブジェクトが配置されています。汎化は、複数のレベルで発生する必要があります。
- 物理レベル: 混雑した環境で見たことのない物体があっても、スプーン(柄の部分)やプレート(縁の部分)をどのように掴むかを理解すること
- セマンティックレベル: タスクの意味を理解し、衣類や靴をどこに置くべきか(ベッドの上ではなく洗濯かご)、こぼれた汚れを掃除するにはどのような道具が適切かを把握すること
- 環境レベル: 家庭、スーパーマーケット、オフィス、病院など、複雑な現実世界の環境に適応すること
異種データでの共同学習
π₀.₅における画期的な革新は、異種データソースでの共同学習です。モデルは以下から学習します:
- マルチモーダルWebデータ: 画像キャプション生成、視覚的質問応答、物体検出
- 口頭指示: 人間が複雑なタスクをステップバイステップでロボットにコーチングする
- サブタスクコマンド: 高レベルのセマンティックな動作ラベル(例: 整えられていないベッドに対して「枕を拾う」)
- クロスエンボディメントロボットデータ:異なる能力を持つさまざまなロボットプラットフォームからのデータ
- マルチ環境データ: 多数の異なる家庭に配置された静的ロボット
- モバイルマニピュレーションデータ: モバイルロボットのデモレーション約400時間
この多様なトレーニングミックスは、物理的・視覚的・意味的なレベルで同時に一般化を可能にする「カリキュラム」を構築します。
インストール要件
LeRobotのインストールは、インストールガイドに従って行ってください。
以下のコマンドを実行して、Pi0.5の依存関係をインストールします。
pip install -e ".[pi]"PyPIからLeRobotをインストールした場合は:
pip install 'lerobot[pi]'
使用方法
LeRobot の設定で π₀.₅ を使用するには、ポリシータイプを以下のように指定します:
policy.type=pi05トレーニング
LIBEROでのクイックスタート
lerobot/libero(以下の結果の背後にあるデモの約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を参照してください。
π₀.₅ uses the gated [google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224) tokenizer — accept its license on the Hub and log in with `hf auth login` before training.
80 GBのGPU1台で動作するサイズ:
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ではなく) — 以下の結果を測定したチェックポイントである pi05_libero_finetuned_v044 と一致しています。
--policy.pretrained_path は重みのみを読み込むため、--policy.n_action_steps=10 および --policy.empty_cameras=1 は明示的に指定する必要があります。lerobot/pi05_libero_base には両方が保存されており、指定しないと 50 と 0 にフォールバックしてしまいます(チェックポイントの読み込みを参照)。
その後、lerobot-evalでチェックポイントを評価し、LIBEROに記載されている参照の成功率と比較してください。
Quantile統計
π₀.₅ は STATE と ACTION を分位数で正規化するため、データセットの meta/stats.json には q01 と q99 が必要です。古いデータセットには min/max/mean/std のみが含まれており、最初のバッチで失敗します:
ValueError: QUANTILES normalization mode requires q01 and q99 stats再計算します:
lerobot-edit-dataset \
--repo_id your_dataset \
--new_repo_id your_dataset \
--operation.type recompute_stats \
--operation.overwrite trueThe 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)が保存されるようになります。後者を推定するには、すべてのエピソードを走査し、実行中ヒストグラムを使用します:
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を独自のデータセットに置き換えてください。
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
- lerobot/pi05_libero_base(Liberoデータセットで特化して学習済み)
--policy.optimizer_fused=true: 高速なオプティマイザーステップのためにfused AdamWを使用します。このフラグは、ランを再開する場合は無視されます
オプションのトレーニング時のRTC
Pi05は、Training-Time Action Conditioning for Efficient Real-Time Chunkingに従い、効率的なReal-Time Chunkingのためのアクションプレフィックス条件付けを任意に学習できます。
policy.rtc_training_max_delayを、コントローラーステップにおける最大の想定推論遅延に設定します:
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を明示的に使用して、生成されたチェックポイントを使用します:
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=cudainference.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に基づく短期間の視覚および固有受容コンテキストを任意で使用できます。両方のパスはデフォルトで無効化されているため、既存のチェックポイントやトレーニングコマンドは、単一フレームのPi05の動作を維持します。
これは MEM の短期記憶のみを実装しています。具体的には、セクション III-C のビデオエンコーダーと、セクション III-D の固有受容性射影です。MEM の長期言語記憶(セクション III-B)は実装されていません。この長期記憶では、上位のポリシーが次のサブタスクと、それまでに何が起きたかを示す圧縮された自然言語の要約を予測します。論文のアブレーション実験では、長期タスクにおいてビデオ記憶だけでは、完全な MEM のタスク進捗の一部しか回復できないことが示されています。
チェックポイントからのファインチューニングにおいて、事前学習時にメモリが使用されていなかった場合にメモリを導入することは、論文のより弱いアブレーションである
MEM-Posttrain-Onlyに対応します。MEMの主要な成果は、ロボット動画と非ロボット動画の多様な混合データセットで動画エンコーダーを事前学習することから得られており、現在公開されているPi05のチェックポイントにはこれが含まれていません。
でファインチューニングする際に、これを有効にします:
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は内部で同じ間隔の画像履歴を保持し、ポリシーがリセットされるたびにクリアします。
過去の固有受覚は独立したオプションです:
--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を通じて相対空間でのデータセットの統計情報を再計算してください。
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では以下のように記述できます:
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 を使用してください。
次に、相対アクションを有効にして学習します:
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セクションの手順に従ってください。
ライセンス
このモデルは、元のOpenPIリポジトリと一貫して、Apache 2.0ライセンスに従っています。
Update on GitHub