Strands Robots와 LeRobot 통합: Hugging Face Hub 데이터셋에서 물리 로봇 배포까지

Strands Robots와 LeRobot 통합: Hugging Face Hub 데이터셋에서 물리 로봇 배포까지

TL;DR

Hugging Face는 Strands Robots SDK와 LeRobot의 통합을 발표했습니다. 이를 통해 사용자는 로봇 시연을 기록하고, Hub에 푸시하며, 시뮬레이션에서 정책을 실행하고, 단일 인자 변경만으로 동일한 코드를 물리 SO-101 로봇에 배포할 수 있습니다. 또한 Zenoh 기반 메쉬를 통해 여러 로봇을 협조시킬 수 있습니다.

Overview

Strands Robots는 AWS에서 제공하는 오픈‑소스 SDK(Apache 2.0)로, 로봇 추상화, 시뮬레이션, 그리고 LeRobot 스택을 AgentTools 형태로 노출하여 하나의 Strands 에이전트에 조합합니다. 통합은 의도적으로 얇게 설계되었습니다: LeRobot 자체 스크립트가 하드웨어 기록 및 캘리브레이션을 담당하고, Strands AgentTools는 에이전트가 오케스트레이션하는 부분을 제공합니다. 시뮬레이션 도구는 LeRobot이 하드웨어에서 쓰는 동일한 형식으로 LeRobotDatasets를 기록합니다. GR00T와 LerobotLocal은 공통 인터페이스 뒤에서 정책 추론을 제공하고, MolmoAct2 체크포인트는 LerobotLocal 경로를 통해 실행됩니다. 피어 메쉬는 에이전트를 원격 로봇으로 확장합니다. 데이터셋 형식은 LeRobot이 작성한 그대로 유지되며, 에이전트 루프가 접착제 역할을 합니다.

Prerequisites

Minimal (default simulation path)

  • Linux 또는 macOS에서 Python 3.12+ (MuJoCo 백엔드의 경우 Apple Silicon 지원).
  • 에이전트 추론을 위한 Strands‑compatible 모델 제공자(Amazon Bedrock + AWS 자격 증명, Anthropic API, OpenAI, 혹은 로컬 Ollama).
  • Strands Robots를 다음과 같이 설치: uv pip install "strands-robots[sim-mujoco,lerobot,mesh]

Advanced (hardware deployment, real policies, Hub push)

  • Hugging Face 계정 및 쓰기 권한 토큰(데이터셋 푸시 및 정책 체크포인트 Pull용).
  • 하드웨어 경로용: SO‑101 팔로워와 리더 쌍, 혹은 다른 LeRobot 지원 로봇. 두 장치 모두 ~/.cache/huggingface/lerobot/calibration/ 아래에 캘리브레이션 파일이 있어야 합니다.
  • 로컬 GR00T 추론용: 최소 16 GB VRAM을 가진 NVIDIA GPU와 Docker 설치. 이 포스트는 gr00t_inference 도구의 lifecycle="full" 액션을 사용해 이미지 Pull, 체크포인트 다운로드, 컨테이너 시작을 한 번에 수행합니다.

Recording Demonstrations

시뮬레이션 도구는 LeRobot이 하드웨어에서 쓰는 동일한 형식으로 LeRobotDatasets를 기록합니다. 하드웨어가 필요하지 않습니다. Simulation 도구의 start_recording 액션은 동일한 DatasetRecorder 클래스를 통해 기록합니다: 관절 상태와 행동에 대한 동일한 parquet 스키마, 카메라당 MP4 레이아웃도 동일합니다. 에이전트 프롬프트는 거의 동일합니다:

from strands import Agent
from strands_robots import Robot

robot = Robot("so100\))  # mode="sim" by default
agent = Agent(tools=[robot])

agent(
    "Record a demonstration of 'pick the red cube and place it in the box' "
    "using the Mock policy provider at FPS 30. Write the dataset to "
    "my_user/cube_picking_sim and push to the Hub when done." )

Mock 정책은 자리채움 관절 행동을 생성해 훈련된 체크포인트 없이도 워크플로우가 끝까지 실행되게 합니다. 로봇은 무작위 움직임을 보이며 잡기를 완수하지 않으며, 기록은 구조적으로 완전합니다(유효한 관절 상태, 유효한 카메라 프레임, 잘 형성된 LeRobotDataset 에피소드). 하지만 시연 자체는 훈련 데이터로는 유용하지 않습니다. 실제 큐브‑픽킹을 보려면 --policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101을 사용하세요(구성 파일에서 자동 감지된 MolmoAct2 체크포인트, LerobotLocal 경로를 통해 라우팅). 프롬프트, 데이터셋 형식, 에이전트 코드는 동일합니다. LeRobot 자체 데이터셋 로더는 Strands‑specific 코드 없이 시뮬레이션 기록 데이터를 읽습니다:

from lerobot.datasets.lerobot_dataset import LeRobotDataset

dataset = LeRobotDataset("my_user/cube_picking_sim" )
print(dataset.features)
# {'observation.state': Sequence(...),
#  'observation.images.front': VideoFrame(...),
#  'action': Sequence(...),
#  'episode_index': Value(...), 'frame_index': Value(...), ...}

features 딕셔너리는 Hub에 있는 어떤 LeRobot 데이터셋과도 형태가 동일합니다: 컬럼 이름, parquet+MP4 레이아웃, 로더 경로 모두 동일합니다. 하드웨어‑기반 데이터를 소비하는 훈련 스크립트는 시뮬레이션‑기반 데이터를 그대로 사용합니다. 필요에 따라 시뮬레이션에서 푸시된 데이터셋은 동일한 Hub 레포지토리 내에 하드웨어 기록과 함께 존재할 수 있습니다.

Recording on hardware

물리 SO‑101에서 시연을 기록하려면 LeRobot의 record CLI를 직접 사용합니다. Strands 통합은 해당 명령을 AgentTool로 감싸지 않으며, LeRobot이 이미 깔끔하게 작업을 수행합니다:

lerobot-calibrate --robot.type=so101_follower --robot.id=my_follower
lerobot-calibrate --robot.type=so101_leader   --robot.id=my_leader

lerobot-record \
  --robot.type=so101_follower --robot.id=my_follower \
  --teleop.type=so101_leader  --teleop.id=my_leader \
  --dataset.repo_id=my_user/cube_picking \
  --dataset.single_task='Pick up the red cube and place it in the box' \
  --dataset.num_episodes=25 \
  --dataset.push_to_hub=true

위 명령으로 Hub에 올라가는 데이터셋은 시뮬레이션 기록과 동일한 형식입니다. 정책을 파인‑튜닝하려면 LeRobot의 training CLI(lerobot-training)를 사용하세요; 훈련 자체는 이 포스트 범위를 벗어나며 표준 LeRobot 워크플로우를 따릅니다. Step 3 이후부터는 에이전트가 원본 체크포인트든 파인‑튜닝된 체크포인트든 자유롭게 사용할 수 있습니다.

Running a Policy in Simulation

데이터셋이 Hub에 있으면 다음 단계는 정책을 실행하는 것입니다. 예시는 기본 sim 모드의 Robot() 팩토리를 사용하고, gr00t_inference를 추가해 에이전트가 추론 컨테이너를 관리하도록 합니다:

from strands import Agent
from strands_robots import Robot, gr00t_inference

robot = Robot("so100\))  # mode="sim" by default
agent = Agent(tools=[robot, gr00t_inference])

agent(
    "Start GR00T inference on port 5555 with the cube-picking checkpoint "
    "from my_user/cube-picker. Then ask the robot to pick up the red cube." )

에이전트는 내부적으로 gr00t_inference(action="lifecycle", lifecycle="full", ...)를 호출해 GR00T 컨테이너 이미지 Pull, Hub에서 체크포인트 다운로드, 추론 서비스 시작을 수행합니다. 이후 run_policy 액션을 policy_provider="groot"와 함께 시뮬레이션 로봇에 실행하고, policy_config 딕셔너리에 GR00T 서비스의 호스트와 포트를 전달합니다(컨테이너는 포트 5555에서 접근 가능). 시뮬레이션은 정책의 액션 청크와 함께 진행되며, 결과 렌더링은 Simulation.render를 통해 확인할 수 있습니다. 프로세스 내 추론을 선호한다면(gr00t_inference 대신) Hub 레포지토리에서 로드되는 LerobotLocalPolicy 인스턴스로 교체하면 됩니다. 제공자는 lerobot/ 조직 아래의 모든 모델 ID를 인‑프로세스 경로로 라우팅합니다:

from strands_robots.policies import create_policy
policy = create_policy("lerobot/act_aloha_sim_transfer_cube_human" )

LerobotLocalPolicy는 ACT, Diffusion Policy, SmolVLA, π0, π0.5 등을 지원하며, LeRobot 정책 레지스트리에서 config.json을 통해 해결할 수 있는 모든 모델을 로드합니다. 흐름‑매칭 정책에 rtc_config가 포함된 경우 Real‑Time Chunking이 자동으로 활성화됩니다. 최근 출시된 NVIDIA Cosmos 3도 동일 인터페이스 뒤의 정책 제공자로 사용할 수 있어, 어떤 제공자를 선택하든 에이전트 코드는 동일하게 유지됩니다.

Note: LerobotLocalPolicytrust_remote_code=True 옵션으로 Hugging Face 모델을 로드합니다. STRANDS_TRUST_REMOTE_CODE=1을 설정해 사용을 허용하고, 신뢰하는 조직의 체크포인트만 로드하도록 하세요.

Deploying the Policy to Physical Hardware

Step 3와 동일한 코드를 사용하되, 하나의 키워드 인자만 변경합니다. Robot 팩토리는 이제 make_robot_from_config를 통해 LeRobot이 제공하는 실제 로봇을 반환합니다:

robot = Robot(
    "so100",
    mode="real",
    port=" /dev/ttyACM0",
    data_config="so100_dualcam",
    cameras={
        "front": {"type": "opencv", "index_or_path": " /dev/video0", "fps": 30},
        "wrist": {"type": "opencv", "index_or_path": " /dev/video2", "fps": 30},
    },
)
agent = Agent(tools=[robot, gr00t_inference])

agent(
    "Start GR00T inference on port 5555 with the cube-picking checkpoint "
    "from my_user/cube-picker. Then ask the robot to pick up the red cube." )

동일 프롬프트가 이제 물리 팔에 적용됩니다. 하드웨어 경로는 LeRobot의 로봇 추상화를 사용해 관절 명령과 카메라 읽기를 수행하고, 포트 5555에서 접근 가능한 GR00T 컨테이너가 액션 청크를 생성합니다. SO‑101에 적용하기 전에 팔로워와 리더 모두에 대한 캘리브레이션이 완료돼야 합니다. 각 장치마다 lerobot-calibrate 명령을 한 번 실행하면 ~/.cache/huggingface/lerobot/calibration/ 아래에 파일이 저장됩니다. 캘리브레이션이 없으면 에이전트가 LeRobot 드라이버 레이어에서 발생한 오류를 표출합니다.

Coordinating Multiple Robots with the Mesh

지금까지는 한 번에 하나의 로봇만 제어했습니다. 메쉬는 Strands Robots가 다수 로봇을 다루는 방법입니다. 예를 들어, 책상 위의 리더 팔이 다른 방에 있는 팔을 텔레오퍼레이트하거나, 다섯 대의 SO‑101이 동일한 창고 작업을 병렬로 수행하거나, 인간형 로봇이 모바일 베이스와 협업하는 경우가 모두 메쉬 패턴에 해당합니다. 메쉬는 Zenoh라는 오픈소스 피어‑투‑피어 프로토콜 위에 구축되며, IP 주소 관리, 디스커버리 코드 작성, 브로커 선택이 필요 없습니다. 새로운 로봇이 켜지는 순간 메쉬에 자동으로 나타나고, 에이전트는 한 번에 모든 로봇과 통신할 수 있습니다. 각 Robot()Simulation()은 자동으로 Zenoh 피어 메쉬에 참여합니다. robot_mesh 도구는 에이전트에게 fleet 운영을 위한 어휘(디스커버리, 구조화 명령, 브로드캐스트, 비상 정지 등)를 제공합니다:

agent = Agent(tools=[robot_mesh])

agent(
    "List every robot and simulation on the mesh. "
    "Then send 'go to home pose' to each one in parallel." )

에이전트는 robot_mesh(action="peers")를 호출해 로컬 및 발견된 피어를 열거하고, robot_mesh(action="broadcast", ...)를 통해 모든 피어에 구조화 명령을 타임아웃과 함께 전송합니다. [mesh-iot] 엑스트라를 추가하면 AWS IoT Core를 통해 교차‑네트워크 플릿에 트래픽을 라우팅합니다. robot_mesh 도구의 액션 레퍼런스는 프로젝트 문서에 전체 어휘(구독, 감시, 인박스, 구조화 피어‑투‑피어 명령)를 포함합니다. 기본적으로 물리적 메쉬 액션은 실행 전 인간 승인 인터럽트를 요구합니다: 플릿 전체 브로드캐스트와 비상 정지, 그리고 단일 피어에 대한 tell, send, stop이 모두 해당됩니다. STRANDS_MESH_HITL_ACTIONS 환경 변수로 이 세트를 조정할 수 있습니다(all, none, 혹은 콤마 구분 서브셋). 예시를 처음 실행하면 터미널에 robot_mesh-broadcast-approval 프롬프트가 나타나며, y(또는 yes/approve)를 입력해 브로드캐스트를 승인합니다. 승인은 LLM 도구 인자와 별도로 전달되므로, 명령 본문에 승인 플래그를 삽입하는 프롬프트‑인젝션 시도를 차단합니다. 전송은 에이전트 코드를 건드리지 않고 확장됩니다. 내장 Zenoh 메쉬는 자동 폴백이며, LAN에서는 Zenoh 멀티캐스트가 브로커 없이 피어 디스커버리를 처리합니다. [mesh-iot] 엑스트라를 추가하면 AWS IoT Core(MQTT5 + mTLS)를 통해 클라우드 플릿에 트래픽을 라우팅하고, STRANDS_MESH_BACKEND=bridge로 BridgeTransport를 선택해 LAN과 클라우드를 하나의 API 뒤에 결합합니다. 프로덕션 플릿을 위해서는 Arm과 협업해 개발한 Device Connect라는 디바이스‑인식 네트워킹 레이어가 디스커버리, 존재감, 구조화 RPC, 이벤트 라우팅, 안전성을 담당합니다. robot_mesh 도구는 Device Connect가 사용 가능하면 이를 통해 디스패치하고, 그렇지 않으면 내장 Zenoh 메쉬로 폴백하므로 에이전트 코드는 변하지 않습니다.

Try It Using the Sample Application

전체 샘플은 GitHub의 strands-labs/robots 레포지토리 examples/lerobot/ 폴더에 있습니다. 다섯 단계를 하나의 CLI 스크립트(hub_to_hardware.py)와 노트북(hub_to_hardware.ipynb)에 패키징했습니다. CLI는 기본적으로 Mock 정책으로 시뮬레이션에서 엔드‑투‑엔드 실행됩니다. GPU, Docker, Hugging Face 자격 증명 없이도 동작합니다.

uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
git clone https://github.com/strands-labs/robots.git
cd robots

export STRANDS_MESH_LOCAL_DEV=1

python examples/lerobot/hub_to_hardware.py

기록된 데이터셋은 ~/.cache/huggingface/lerobot/local/strands-cube-pick/에 저장됩니다. 로컬이 아닌 Hugging Face Hub에 푸시하려면 HF_TOKEN을 쓰기 권한으로 export한 뒤 --hf-user <your-user> 옵션을 전달하세요. Step 3에서 실제 잡기 동작을 원한다면 --policy groot --checkpoint <hf_repo>(Docker + NVIDIA GPU 필요) 혹은 --policy lerobot_local --checkpoint <hf_repo>(GPU + STRANDS_TRUST_REMOTE_CODE=1 필요)를 사용하세요. 노트북(examples/lerobot/hub_to_hardware.ipynb)은 동일 워크플로를 셀 단위로 안내하며, 각 단계 사이에 내레이션이 포함됩니다. JupyterLab에서 열어 시뮬레이션 모드로 위‑아래 순서대로 실행하면 됩니다.

Security Considerations

이 설정에 포함된 코드 스니펫은 Strands Robots와 HuggingFace를 연결하는 “hello world” 예시입니다. 보다 심도 있는 프로덕션 사용 시 다음과 같은 중요한 고려 사항이 있습니다:

Prompt Injection

에이전트에 신뢰할 수 없는 데이터를 공급하면 프롬프트 인젝션이 발생할 수 있습니다. 이는 로봇이 물리 공간에서 행동을 수행하므로 중요한 위험 요소입니다. 이를 완화하려면 로봇에 공급되는 데이터가 신뢰된 출처에서 온 것인지 확인하고, 신뢰할 수 없는 입력이 있을 경우 에이전트가 사용할 수 있는 도구를 제한해 안전‑중요 행동을 방지해야 합니다.

Robot Mesh Auth Behavior

코드 스니펫에 포함된 STRANDS_MESH_LOCAL_DEV=1 설정은 인증이나 접근 제어 없이 로봇 메쉬를 초기화합니다. 즉, 동일 네트워크에 있는 어떤 장치든 로봇 플릿에 명령을 보낼 수 있습니다. 신뢰된 개발 환경에서는 허용되지만, 신뢰되지 않은 네트워크나 프로덕션 환경에서는 STRANDS_MESH_AUTH_MODE=mtls를 사용해야 합니다.

Operator Approval for Fleet‑Wide Actions

robot_mesh 도구의 물리적 액션은 네트워크상의 피어에 영향을 미칩니다: 브로드캐스트와 비상 정지는 모든 피어에, tell/send/stop은 단일 피어에 적용됩니다. 에이전트가 이러한 명령을 자동으로 내보내는 것을 방지하기 위해 기본적으로 모든 다섯 액션은 인간‑인‑루프 인터럽트 뒤에 게이트됩니다. 에이전트가 게이트된 액션을 호출하면 Strands 런타임이 에이전트 루프를 일시 중지하고, LLM 도구 인자와 별도로 운영자가 승인하도록 요청합니다. STRANDS_MESH_HITL_ACTIONS 환경 변수로 이 세트를 조정할 수 있습니다(all, none, 혹은 콤마 구분 서브셋). 액션당 속도 제한, 명령 검증, 감사 로그가 인터럽트와 함께 동작합니다. 에이전트 루프 외부(스크립트나 단위 테스트)에서는 게이트된 액션이 차단됩니다.

How This Fits Together

통합의 핵심 설계 선택은 Strands Robots가 LeRobot이 이미 제공하는 기능을 재구현하지 않는다는 점입니다. 하드웨어 추상화, 캘리브레이션, 데이터셋 형식은 모두 상위에서 유지됩니다. Strands는 자연어로 조합 가능한 AgentTool 인터페이스만 추가합니다. 두 가지 결과가 따릅니다. 사용자 입장에서는 Hub에 있는 모든 데이터셋이 에이전트가 확장·파인‑튜닝·배포할 수 있는 자산이 되며, 변환 단계가 필요 없습니다. 개발자 입장에서는 시뮬레이션 데이터와 하드웨어 데이터가 동일 파일 형식을 공유하므로, 하나를 위해 작성된 훈련 스크립트가 다른 쪽에서도 그대로 동작합니다. 시뮬레이션과 실제 사이의 경계는 배포 세부 사항일 뿐, 아키텍처적 분리점이 아닙니다.

Where to Go From Here

전체 Strands Robots 문서는 로봇 카탈로그, 시뮬레이션, 정책 제공자, 메쉬, Device Connect 등을 깊이 있게 다룹니다. 더 큰 워크로드를 위해 strands-labs/robots-sim 레포지토리는 Isaac Sim 및 Newton 등 무거운 시뮬레이션 백엔드를 제공하며, LIBERO 벤치마크 예시도 포함합니다. 두 백엔드 모두 이 포스트에서 보여준 동일 Robot 추상화에 연결되므로, 규모가 커져도 에이전트 코드는 변하지 않습니다. Apache 2.0 라이선스 하에 기여를 환영합니다. 이 워크플로로 만든 것이 있다면 어떤 점이 잘 작동했는지, 어떤 점이 안 됐는지 이슈를 열어 알려 주세요. SDK는 개발자 피드백이 직접적인 표면에 닿을 때 가장 빠르게 개선됩니다.

Resources

  • Strands Robots (SDK, AgentTools, Robot factory): github.com/strands-labs/robots, Apache 2.0
  • Strands Robots docs (full documentation): strands-labs.github.io/robots/
  • Strands Robots Sim (examples, simulation backends): github.com/strands-labs/robots-sim
  • The example: examples/lerobot/hub_to_hardware.py and hub_to_hardware.ipynb
  • How to Build Physical AI Agents: Natural Language for Real‑World Robotics: Live Stream and Blog
  • Diving Deep on Physical AI | S1E4 | Automate with NVIDIA NeMo Agent Toolkit and Bedrock AgentCore: Live Stream
  • LeRobot: github.com/huggingface/lerobot - datasets, policies, hardware drivers
  • Strands Agents SDK: github.com/strands-agents/harness-sdk
  • SmolVLA: SmolVLA
  • Pi0: Pi0
  • NVIDIA Isaac‑GR00T N1.7: GR00T N1.7
  • NVIDIA Cosmos3 Nano: Cosmos 3 Nano

Authors

Cagatay Cali는 AWS에서 연구 엔지니어로, 에이전트 AI와 로보틱스에 집중하고 있습니다. 그는 AI 에이전트를 물리 로봇에 연결하는 인터페이스를 설계해, 개발자가 자연어로 로봇 시스템을 제어하고, 모든 수준의 빌더가 에이전트와 로보틱스를 쉽게 활용할 수 있도록 합니다.

Sundar Raghavan은 AWS Agentic AI Foundations 팀의 Sr Solutions Architect입니다. 그는 Amazon Bedrock AgentCore의 개발자 경험을 담당하며, SDK와 CLI를 관리하고, 프레임워크와 에코시스템 통합 전략을 이끌고 있습니다. 현재는 물리 AI에 초점을 맞추어 Strands Robots와 협업해 동일한 에이전트 개발 경험을 로보틱스에 제공하고 있습니다.

Sources