LeRobot 文件
π₀-FAST (Pi0-FAST)
並獲得增強的文件體驗
開始使用
π₀-FAST (Pi0-FAST)
π₀-FAST 是一個用於通用機器人控制的視覺-語言-動作模型 (Vision-Language-Action model),它使用自動回歸下一標記預測 (next-token prediction) 來建立連續機器人動作的模型。
模型概覽
π₀-FAST 將視覺-語言模型的強大功能與名為 FAST (Frequency-space Action Sequence Tokenization,頻域動作序列標記化) 的新型動作標記化方法相結合。這使得在高難度動作任務上訓練自動回歸 VLA 成為可能(這些任務在標準的基於分箱的離散化方法中無法實現),同時其訓練速度比基於擴散 (diffusion) 的方法(如 π₀)快達 5 倍。
為什麼選擇 FAST?
標準的機器人動作標記化方法使用簡單的「逐維度、逐時間步」分箱方案。雖然對於簡單行為還算可行,但對於需要精確和高頻控制的複雜且靈巧的技能,這種方法會迅速崩潰。
FAST 透過使用訊號處理技術壓縮動作序列來解決此問題,從而產生密集的動作標記序列,這些序列可以像語言標記一樣進行自動回歸預測。
FAST 標記化運作原理
FAST 標記化透過以下步驟壓縮動作序列
標準化 (Normalize):取得一個形狀為
(H, D)的連續動作區塊,其中H是時域寬度 (horizon),D是動作維度。使用支援的標準化方法之一進行處理(建議使用 Quantiles 以處理離群值)。離散餘弦轉換 (Discrete Cosine Transform, DCT):對每個動作維度分別應用 DCT(透過 scipy)。DCT 是一種常用於影像和音訊編解碼器(如 JPEG, MP3)的壓縮演算法。
量化 (Quantization):對每個動作維度的係數進行四捨五入並移除不顯著的部分,產生一個稀疏的頻率矩陣。
平坦化 (Flatten):將矩陣展開為一維向量,低頻分量排在前面。
位元組對編碼 (Byte Pair Encoding, BPE):訓練 BPE 標記器將 DCT 係數壓縮為密集的動作標記,通常與先前的標記化方法相比可實現 10 倍壓縮。
這種方法可以透過訓練任何現有的 VLM 預測這些 FAST 標記,進而將其轉化為 VLA。
安裝需求
請遵循我們的安裝指南來安裝 LeRobot。
執行以下指令安裝 π₀-FAST 相關依賴
pip install -e ".[pi]"
訓練自定義 FAST 標記器
對於 FAST 標記器,您有兩個選擇
使用預訓練的標記器:
lerobot/fast-action-tokenizer是在超過 100 萬個真實機器人動作序列上訓練的,可作為通用標記器。訓練您自己的標記器:為了在您的特定資料集上獲得最佳效能,您可以在自己的資料上微調標記器。
訓練您自己的標記器
lerobot-train-tokenizer \
--repo_id "user/my-lerobot-dataset" \
--action_horizon 10 \
--encoded_dims "0:6" \
--vocab_size 1024 \
--scale 10.0 \
--normalization_mode QUANTILES \
--output_dir "./my_fast_tokenizer" \
--push_to_hub \
--hub_repo_id "username/my-action-tokenizer"標記器關鍵參數
| 參數 | 說明 | 預設 |
|---|---|---|
--repo_id | LeRobot 資料集儲存庫 ID | 必要 |
--action_horizon | 每個區塊中的未來動作數量 | 10 |
--encoded_dims | 以逗號分隔的待編碼維度範圍(例如 "0:6,7:23") | "0:6,7:23" |
--vocab_size | BPE 詞彙表大小 | 1024 |
--scale | 量化用的 DCT 縮放因子 | 10.0 |
--normalization_mode | 標準化模式 (MEAN_STD, MIN_MAX, QUANTILES, QUANTILE10, IDENTITY) | QUANTILES (分位數) |
--sample_fraction | 每個片段 (episode) 取樣的區塊比例 | 0.1 |
使用方式
若要在 LeRobot 中使用 π₀-FAST,請將策略類型指定為
policy.type=pi0_fast訓練
若要訓練 π₀-FAST,您可以使用 LeRobot 訓練腳本
lerobot-train \
--dataset.repo_id=your_dataset \
--policy.type=pi0_fast \
--output_dir=./outputs/pi0fast_training \
--job_name=pi0fast_training \
--policy.pretrained_path=lerobot/pi0_fast_base \
--policy.dtype=bfloat16 \
--policy.gradient_checkpointing=true \
--policy.chunk_size=10 \
--policy.n_action_steps=10 \
--policy.max_action_tokens=256 \
--steps=100000 \
--batch_size=4 \
--policy.device=cuda訓練關鍵參數
| 參數 | 說明 | 預設 |
|---|---|---|
--policy.gradient_checkpointing=true | 訓練期間顯著減少記憶體使用量 | false |
--policy.dtype=bfloat16 | 使用混合精度訓練以提高效率 | float32 |
--policy.chunk_size | 要預測的動作步數(動作時域寬度) | 50 |
--policy.n_action_steps | 要執行的動作步數 | 50 |
--policy.max_action_tokens | 每個動作區塊的最大 FAST 標記數 | 256 |
--policy.action_tokenizer_name | 要使用的 FAST 標記器 | lerobot/fast-action-tokenizer |
--policy.compile_model=true | 啟用 torch.compile 以加快訓練速度 | false |
推論
用於快速推論的 KV 快取 (KV-Caching)
π₀-FAST 支援 KV 快取,這是 LLM 推論中廣泛使用的優化技術。這會快取來自注意機制 (attention mechanism) 的鍵值對 (key-value pairs),避免在自動回歸解碼過程中進行多餘的計算。
# KV-caching is enabled by default
policy.use_kv_cache=true推論範例
from lerobot.policies.pi0_fast import PI0FastPolicy, PI0FastConfig
# Load the policy
policy = PI0FastPolicy.from_pretrained("your-model-path")
# During inference
actions = policy.predict_action_chunk(batch)模型架構
π₀-FAST 使用基於 PaliGemma 的架構
- 視覺編碼器:SigLIP 視覺塔,用於影像理解
- 語言模型:Gemma 2B,用於處理語言指令並預測動作標記
模型接收影像、文字指令和機器人狀態作為輸入,並輸出離散的 FAST 標記,這些標記隨後被解碼回連續動作。
配置選項
| 參數 | 說明 | 預設 |
|---|---|---|
paligemma_variant | VLM 骨幹變體 (gemma_300m, gemma_2b) | gemma_2b |
max_state_dim | 最大狀態向量維度(已填充) | 32 |
max_action_dim | 最大動作向量維度(已填充) | 32 |
temperature(溫度) | 取樣溫度(0.0 表示貪婪搜尋) | 0.0 |
max_decoding_steps | 最大解碼步數 | 256 |
use_kv_cache | 啟用 KV 快取以加速推論 | true |
與 π₀ 的比較
| 特性 | π₀ | π₀-FAST |
|---|---|---|
| 動作表示 | 流匹配 (Flow Matching)(擴散) | 自動回歸標記 (FAST) |
| 訓練速度 | 1x | 快 5 倍 |
| 靈巧性 | 高 | 高 |
| 推論方法 | 疊代去噪 | 自動回歸解碼 |
| KV 快取 | 不適用 | 支援 |
重現 π₀-FAST 結果
我們使用 LeRobot 的實作,在 LIBERO 基準測試上重現了 π₀Fast 的結果。我們採用 LeRobot PiFast 基礎模型 lerobot/pi0fast-base,並使用 HuggingFace LIBERO 資料集,在 8 個 H100 GPU 上,以 256 的批次大小,額外微調 40k 步(bfloat16)。
微調後的模型可以在這裡找到
- π₀Fast LIBERO: lerobot/pi0fast-libero
使用以下訓練指令
lerobot-train \
--dataset.repo_id=lerobot/libero \
--output_dir=outputs/libero_pi0fast \
--job_name=libero_pi0fast \
--policy.path=lerobot/pi0fast_base \
--policy.dtype=bfloat16 \
--steps=100000 \
--save_freq=20000 \
--batch_size=4 \
--policy.device=cuda \
--policy.scheduler_warmup_steps=4000 \
--policy.scheduler_decay_steps=100000 \
--policy.scheduler_decay_lr=1e-5 \
--policy.gradient_checkpointing=true \
--policy.chunk_size=10 \
--policy.n_action_steps=10 \
--policy.max_action_tokens=256 \
--policy.empty_cameras=1 \接著,我們執行以下指令,使用 LeRobot LIBERO 實作來評估微調後的模型
tasks="libero_object,libero_spatial,libero_goal,libero_10"
lerobot-eval \
--policy.path=lerobot/pi0fast-libero \
--policy.max_action_tokens=256 \
--env.type=libero \
--policy.gradient_checkpointing=false \
--env.task=${tasks} \
--eval.batch_size=1 \
--eval.n_episodes=1 \
--rename_map='{"observation.images.image":"observation.images.base_0_rgb","observation.images.image2":"observation.images.left_wrist_0_rgb"}'注意: 我們將 n_action_steps 設為 10,這與原始的 OpenPI 實作類似。
結果
我們在 LIBERO 基準測試中獲得了以下結果
| 模型 | LIBERO Spatial (空間) | LIBERO Object (物件) | LIBERO Goal (目標) | LIBERO 10 | 平均 |
|---|---|---|---|---|---|
| π₀-fast | 70.0 | 100.0 | 100.0 | 60.0 | 82.5 |
完整的評估輸出資料夾(包含影片)可在此處取得 here
授權
此模型採用 Apache 2.0 授權條款,與原始 OpenPI 儲存庫一致。
參考資料
- FAST: Efficient Robot Action Tokenization - Physical Intelligence 部落格
- OpenPI 儲存庫 - 原始實作
- Hugging Face 上的 FAST 標記器 - 預訓練標記器