LeRobot 文件

向後相容性

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

向後相容性

策略標準化遷移 (PR #1452)

重大變更 (Breaking Change):LeRobot 策略不再將標準化層嵌入權重中。標準化現在由外部的 PolicyProcessorPipeline 元件處理。

有什麼改變?

PR #1452 之前 PR #1452 之後
標準化位置 嵌入在模型權重中 (normalize_inputs.*) 外部的 PolicyProcessorPipeline 元件
模型狀態字典 (Model State Dict) 包含標準化統計數據 僅乾淨權重 - 無標準化參數
用法 policy(batch) 處理所有事項 preprocessor(batch)policy(...)postprocessor(...)

對現有模型的影響

  • 在 PR #1452 之前訓練的模型,其權重中嵌入了標準化參數
  • 這些模型需要進行遷移,才能與新的 PolicyProcessorPipeline 系統搭配運作
  • 遷移過程會提取標準化統計數據,並建立獨立的處理器管線 (processor pipelines)

遷移舊模型

使用遷移指令碼來轉換具有嵌入式標準化的模型

python src/lerobot/processor/migrate_policy_normalization.py \
    --pretrained-path lerobot/act_aloha_sim_transfer_cube_human \
    --push-to-hub \
    --branch migrated

該指令碼會:

  1. 提取模型權重中的標準化統計數據
  2. 建立外部預處理器與後處理器管線
  3. 移除模型權重中的標準化層
  4. 儲存乾淨的模型 + 處理器管線
  5. 推送到 Hub 並自動建立 PR

使用已遷移的模型

# New usage pattern (after migration)
from lerobot.policies.factory import make_policy, make_pre_post_processors

# Load model and processors separately
policy = make_policy(config, ds_meta=dataset.meta)
preprocessor, postprocessor = make_pre_post_processors(
    policy_cfg=config,
    dataset_stats=dataset.meta.stats
)

# Process data through pipeline
processed_batch = preprocessor(raw_batch)
action = policy.select_action(processed_batch)
final_action = postprocessor(action)

硬體 API 重新設計

PR #777 改進了 LeRobot 校準,但不向後相容。以下概述了變更內容,以及如何繼續使用在此 PR 之前建立的數據集。

有什麼改變?

PR #777 之前 PR #777 之後
關節範圍 角度 -180...180° 標準化範圍 關節:–100...100 夾爪:0...100
零點位置 (SO100 / SO101) 手臂完全水平伸展 每個關節範圍的中間
邊界處理 軟體防護機制,用於偵測 ±180° 迴繞 (wrap-arounds) 由於零點位於範圍中間,無需迴繞邏輯

對現有數據集的影響

  • PR #777 之前記錄的軌跡,如果直接載入將無法正確重播
    • 關節角度會產生偏移且標準化不正確。
  • 任何直接在舊數據上進行微調或訓練的模型,都需要轉換其輸入和輸出。

使用舊校準系統製作的數據集

我們提供了一個遷移範例指令碼,用於重播使用先前校準錄製的片段:examples/backward_compatibility/replay.py。以下我們將說明範例指令碼中為使舊校準數據集能正常運作所進行的修改。

+   key = f"{name.removeprefix('main_')}.pos"
    action[key] = action_array[i].item()
+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90

讓我們深入解析。新的代碼庫使用 .pos 後綴作為位置觀測,並且我們移除了 main_ 前綴。

key = f"{name.removeprefix('main_')}.pos"

對於 "shoulder_lift" (id = 2),0 位置變更了 -90 度,且方向與舊校準/代碼相比已反轉。

action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)

對於 "elbow_flex" (id = 3),0 位置與舊校準/代碼相比變更了 -90 度。

action["elbow_flex.pos"] -= 90

若要使用度數標準化,我們接著將 --robot.use_degrees 選項設定為 true

python examples/backward_compatibility/replay.py \
    --robot.type=so101_follower \
    --robot.port=/dev/tty.usbmodem5A460814411 \
    --robot.id=blue \
+   --robot.use_degrees=true \
    --dataset.repo_id=my_dataset_id \
    --dataset.episode=0

使用舊校準系統訓練的策略

策略輸出動作的格式與數據集相同 (torch.Tensors)。因此,應應用相同的轉換。

要找到這些轉換,我們建議先嘗試使用上述章節的方法,重播一個您的策略所訓練過的數據集片段。然後,將這些相同的轉換新增到您的推論指令碼中(如 record.py 指令碼所示)。

action_values = predict_action(
    observation_frame,
    policy,
    get_safe_torch_device(policy.config.device),
    policy.config.use_amp,
    task=single_task,
    robot_type=robot.robot_type,
    )
    action = {key: action_values[i].item() for i, key in enumerate(robot.action_features)}

+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90
    robot.send_action(action)

如果您有任何疑問或遇到遷移問題,歡迎隨時在 Discord 上提問。

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.