Strands 機器人與 LeRobot 流式資料循環整合 Hugging Face 儲存桶
簡要重點
Hugging Face 發布了一個工作流程,將 Strands 機器人、LeRobot 資料集堆疊與 Hugging Face 儲存桶連結,讓您能記錄機器人示範、高效同步資料、直接從 Hub 流式傳輸資料進行訓練,並在單一循環中將訓練完成的策略重新部署至相同機器人。
此循環的功能
此循環包含四個階段,共用單一 Robot() 實例:
- 記錄 – 機器人(模擬或實體)寫入 LeRobotDataset。
- 儲存 – 資料集同步至 Hugging Face 儲存桶,以位元級別進行重複資料消除。
- 訓練 – 資料集直接從儲存桶透過 LeRobot 的
StreamingLeRobotDataset流式傳輸至 GPU,無需完整下載。 - 部署 – 訓練完成的檢查點載入至相同的
Robot()(現在模式為mode="real"),機器人記錄下一組示範,完成循環。
每個階段僅需單一函式呼叫或幾行程式碼,使整個流程可在筆電或 GPU 集群上執行。
前置條件
最小(模擬)設定
- Linux 或 macOS 上的 Python 3.12+(支援 Apple Silicon)。
- 兼容 Strands 的 LLM 提供者(Amazon Bedrock、Anthropic、OpenAI 或本地 Ollama)。
- 具備
lerobot額外功能的 Strands 機器人:
此指令會安裝 LeRobot ≥ 0.6.1、uv pip install -U "strands-robots[sim-mujoco,lerobot]>=0.5.1"datasets、av與torchcodec。
進階(儲存桶、實體機器人、實際策略)
- Hugging Face 帳號,具備寫入權限的存取權杖與
hfCLI(pip install "huggingface-hub>=1.6.0,<2.0.0")。 - 實體機器人(例如 SO-101),其校準檔位於
~/.cache/huggingface/lerobot/calibration/。 - 用於訓練的 NVIDIA GPU(或用於大型資料集的 GPU 集群)。
lerobot[training]額外功能用於訓練器(uv pip install "lerobot[training]")。
步驟 1 – 將示範記錄至儲存桶
機器人以原生磁碟格式(狀態/動作為 Parquet,影片為 MP4)記錄 LeRobotDataset。完成後,資料集會同步至儲存桶:
from strands import Agent
from strands_robots import Robot, sync_dataset_to_bucket
sim = Robot("so100") # 預設模式為 "sim"
agent = Agent(tools=[sim])
# 提示驅動世界建立、記錄與模擬策略執行。
agent(
"建立一個包含 so100 機器人的世界,加入一個紅色方塊與前方攝影機,
開始記錄(repo_id='local/cube_pick', root='/tmp/cube_pick', fps=30,
overwrite=True, task='拿起紅色方塊'),執行模擬策略 60 步後停止記錄。"
)
# 將完成的資料集同步至儲存桶。
sync_dataset_to_bucket("/tmp/cube_pick", "my-org/robot-fave")
# → {"status": "success", "bucket_uri": "hf://buckets/my-org/robot-fave/cube_pick"}
同步會寫入 hf://buckets/{bucket}/{run_id};run_id 預設為資料集資料夾名稱。相同呼叫也適用於透過 lerobot-record CLI 在實體 SO-101 上進行的錄製。
步驟 2 – 以位元級別重複資料消除進行儲存
儲存桶由 Xet 支援,執行內容定義的區塊切割並在位元級別進行重複資料消除。LeRobot 將資料分割為 100 MB 的 Parquet 檔案與 200 MB 的 MP4 檔案,因此每日同步僅上傳新建立的區塊與部分填滿的區塊。Hugging Face 提供的基準顯示,與 naïve 覆蓋相比,傳輸位元數減少 4 倍。
步驟 3 – 直接從 Hub 流式傳輸訓練
不需將整個資料集複製到本機磁碟,stream_dataset() 使用位元範圍請求直接從儲存桶讀取:
reader = sim.stream_dataset(
"my-org/robot-fave/cube_pick",
repo_type="bucket",
shuffle=False,
max_num_shards=1,
buffer_size=1,
)
print(reader.num_episodes, reader.num_frames, reader.fps)
for frame in reader:
# 觀察張量會即時從遠端 MP4 區塊解碼。
img = frame["observation.images.front"]
state = frame["observation.state"]
action = frame["action"]
break
僅小量的 meta/ 資料夾會在本機快取;影片畫格會按需解碼。訓練時,將讀取器包裝在 PyTorch 的 DataLoader 中:
for batch in reader.dataloader(batch_size=64, num_workers=4):
loss, _ = policy(batch)
loss.backward()
LeRobot 的 CLI 也支援直接流式傳輸:
lerobot-train \
--policy.type=act \
--dataset.repo_id=my-org/robot-fave/cube_pick \
--dataset.repo_type=bucket \
--dataset.streaming=true \
--num_workers=4
單一 NVIDIA L4 實例在 120 幀的示範上執行 500 次優化器步驟僅耗時 133 秒,產生的檢查點可透過 create_policy() 載入。
步驟 4 – 部署策略並回傳資料至循環
透過將 Robot 模式切換至 real,將新訓練完成的檢查點部署至實體機器人:
robot = Robot(
"so100",
mode="real",
port="/dev/ttyACM0",
cameras={"front": {"type": "opencv", "index_or_path": "/dev/video0", "fps": 30}},
)
agent = Agent(tools=[robot])
agent("拿起紅色方塊。")
機器人以相同的 LeRobot 格式記錄執行過程,可再同步回儲存桶,供下一次訓練迭代使用。
範例應用
提供完整筆記本於 examples/notebooks/05_streaming_data_loop.ipynb。它在模擬環境中以模擬策略執行完整循環,且無需 GPU 或 Hugging Face 憑證。要在本機試用:
git clone https://github.com/strands-labs/robots.git
cd robots
uv pip install -U "strands-robots[sim-mujoco,lerobot]>=0.5.1"
jupyter notebook examples/notebooks/05_streaming_data_loop.ipynb
設定 BUCKET = "my-org/robot-fave",並可選擇性設定 RUN_ID 以控制資料集存放位置。
安全考量
- 提示注入 – 代理執行 LLM 產生的提示;限制工具並僅輸入受信任的內容。
- 訓練資料信任邊界 – 分離資料收集(寫入)與訓練(讀取)的憑證;使用唯一的
run_id以追蹤示範。 - 儲存桶權限範圍 – 使用僅限目標命名空間的權杖,並偏好使用私人儲存桶存放收集資料。
- 儲存桶無版本歷史 – 覆蓋會取代先前的執行;將審核過的版本發布至一般 Hub 資料集以確保可審計性。
- 受信任的模型載入 – 自訂策略需
trust_remote_code=True;僅從您信任的組織載入檢查點,並在可用時優先使用safetensors。
清理
移除儲存桶內容與暫存檔案,避免儲存費用:
hf buckets rm my-org/robot-fave/cube_pick/ --recursive --dry-run # 預覽
hf buckets rm my-org/robot-fave/cube_pick/ --recursive # 刪除
hf buckets delete my-org/robot-fave # 刪除整個儲存桶
rm -rf /tmp/cube_pick /tmp/cube_pick_ft /tmp/nb5_dataset /tmp/nb5_ft
使用 push_to_hub() 建立的版本化儲存庫不受影響。
下一步
- 探索 Strands 機器人 文件,了解機器人目錄、模擬後端與多機器人網格。
- 透過變更
TrainSpec中的provider字串,使用不同策略提供者(GR00T、Cosmos 3、SmolVLA 等)。 - 擴展至機器人艦隊:為每台機器人分配唯一的
run_id,並讓它們同時寫入同一個儲存桶。 - 與外部儲存(如 Amazon S3)整合;LeRobot 格式與儲存無關,儲存桶流式傳輸提供原生 Hub 路徑,無需額外佈線。
資源
Strands 機器人
- SDK 與
Robot()工廠:https://github.com/strands-labs/robots (Apache 2.0) - 文件:https://strands-labs.github.io/robots/
- 錄製指南:https://strands-labs.github.io/robots/recording/
- 本文筆記本:https://github.com/strands-labs/robots/blob/main/examples/notebooks/05_streaming_data_loop.ipynb
- 代理 SDK:https://github.com/strands-agents/harness-sdk
LeRobot 與 Hub
- LeRobot 倉儲:https://github.com/huggingface/lerobot
- 儲存桶文件:https://huggingface.co/docs/hub/storage-buckets
- Xet 重複資料消除部落格:https://huggingface.co/blog/from-files-to-chunks
- 範例抓取與放置資料集:https://huggingface.co/datasets/lerobot/svla_so101_pickplace
策略
- SmolVLA:https://huggingface.co/lerobot/smolvla_base
- Pi0:https://huggingface.co/lerobot/pi0_base
- NVIDIA GR00T-N1.7-3B:https://huggingface.co/nvidia/GR00T-N1.7-3B
- NVIDIA Cosmos 3 Nano:https://huggingface.co/nvidia/Cosmos3-Nano
- MolmoAct2 for SO-100/101:https://huggingface.co/allenai/MolmoAct2-SO100_101
背景
Sources
相關
- Dispatch
- Dispatch
- Dispatch
- Dispatch