LeRobot documentation
원격 추론
원격 추론
큰 정책은 GPU가 필요하며, 동기식 롤아웃에서는 정책이 다음 액션 청크를 계산할 때마다 로봇의 움직임이 멈춥니다. 원격 추론은 이 작업을 두 부분으로 나눕니다. 정책 서버는 GPU에서 체크포인트를 실행하고, 로봇 컴퓨터는 카메라, 모터, 텔레오퍼레이션 및 녹화를 계속 제어합니다. 서버가 다음 액션을 계산하는 동안 로봇은 이미 가진 액션을 계속 실행하므로, 더 이상 추론을 위해 움직임이 중단되지 않습니다.
사용 시점:
- 로봇에 연결된 컴퓨터에 GPU가 없거나 정책(policy)에 필요한 용량보다 작은 GPU만 있는 경우: 로봇 팔 옆에 노트북이나 싱글보드 컴퓨터가 있고, 실험실 건너편에 GPU 워크스테이션이 있는 환경
- inference가 각 액션 청크의 상당한 부분을 차지하며 연속적인 동작이 필요한 경우
- checkpoint에 직접 접근하지 않고 로봇이 재계획을 수행하는 빈도를 결정하려면
조율해야 하는 유일한 트레이드오프는 신선도와 연속성입니다. 새로운 계획을 더 빨리 요청하면 로봇이 현재 보고 있는 상황에 반응할 수 있고, 현재 계획을 더 많이 따르면 작업 진행 상황을 유지할 수 있습니다.
작동 방식
로봇 컴퓨터는 예정된 동작의 버퍼를 유지합니다. 버퍼의 용량이 부족해지면 새로운 관측치를 전송하고, 서버가 계산하는 동안 버퍼에서 동작을 계속 수행하며, 아직 실행되지 않은 계획의 일부에 새로운 청크를 삽입합니다.
세 가지 클라이언트 설정이 이 동작을 결정합니다. refill_seconds는 다음 계획을 얼마나 일찍 요청할지, chunk_merge는 새 계획을 기존 계획에 어떻게 결합할지, 블렌딩은 두 계획 사이의 이음을 부드럽게 만듭니다. 서버에는 체크포인트와 학습에 사용된 로봇의 설명만 필요합니다. 아래 섹션은 작동하는 설정에서 시작하여 각 설정에 대한 직관을 쌓아가도록 구성되었습니다.
Local RTC(--inference.type=rtc)는 다른 비동기 옵션입니다. 추론은 서버 없이 동일한 머신에서 rollout 프로세스의 백그라운드 스레드에서 실행됩니다. 동일한 호스트에서 원격 추론은 여전히 두 개의 프로세스와 --inference.type=remote를 사용하며, RTC가 없는 정책의 정렬 및 블렌딩을 제공합니다. RTC와 원격 추론의 관계를 참조하세요.
지원되는 정책 및 로봇
저장된 프로세서가 단일 현재 관측으로부터 액션 청크를 예측할 수 있을 때 체크포인트를 서빙할 수 있습니다. ACT의 경우 시간적 앙상블(temporal ensembling)이 비활성화되어 있어야 합니다. ACT, SmolVLA, XVLA, EVO1, LaWAM 체크포인트는 이 경로를 통해 실제 로봇에서 실행된 바 있습니다. 여러 다른 정책은 계약 수준에서 지원되지만 하드웨어에서 검증되지 않았으며, 히스토리에 의존하는 정책은 추가적인 통합이 필요합니다. 정책 지원 테이블에는 모든 정책의 상태와 제한 사항이 나열되어 있습니다.
로봇 드라이버는 클라이언트가 동작을 기다리는 동안 마지막으로 적용된 타겟을 갱신하기 때문에 위치 유지(position-hold) 지원을 선언해야 합니다. SO, OMX, Koch, HopeJr, Rebot 및 YAM 팔로우러는 이를 선언합니다. OpenArm, Reachy2 및 양팔(bimanual) 래퍼는 구성에 따라 다릅니다. Unitree G1은 SONIC 컨트롤러와 함께 사용할 때만 이를 선언하며, 이 경우 유지되는 타겟은 마지막 모션 토큰입니다. 모바일 베이스는 이를 지원하지 않습니다. 하드웨어 표를 참조하세요. 지원되지 않는 로봇 또는 정책 계약은 어떤 동작도 수행하기 전에 승인 단계에서 거부됩니다.
작동하는 rollout에서 시작
성공적으로 실행된 동기식 lerobot-rollout 명령을 참고용으로 유지하고, 해당 명령의 로봇, 카메라, 작업, FPS, 텔레오퍼레이터 및 보간 설정을 그대로 유지하세요. 체크포인트와 모델 디바이스는 서버로 이동하며, 원격 클라이언트는 가중치를 로드하지 않습니다.
아래 예시는 전면 카메라 1개가 장착된 범용 6-액추에이터 SO-101를 설명합니다. 체크포인트, 카메라 뷰, 구성 요소 순서 및 단위를 함께 조정하세요.
1. 두 컴퓨터 모두에 설치
양쪽 모두 remote 추가 항목이 필요합니다. 하드웨어 추가 항목은 클라이언트에, 선택된 정책의 추가 항목은 서버에 유지하세요:
uv sync --locked --extra remote --extra core_scripts --extra feetech
# Add the policy extra on the server when required, for example --extra pi.지원되는 Zenoh 범위는 >=1.9.0,<1.11.0입니다. uv sync --locked은 현재 1.10.1인 lockfile 버전을 설치합니다.
2. 서버 구성 및 시작
일반 구성을 복사한 후 편집합니다:
cp examples/remote_inference/server.yaml server.yamlmodel.repo_or_path와 model.device를 설정합니다. Hub 체크포인트의 경우, 검증하려는 커밋에 model.revision을 고정합니다. features, action_feature, semantics, robot_type, execution.action_fps를 현재 작업 환경에 맞게 일치시키세요. 아래 스키마 및 카메라 이름 변경 예시를 참고하세요.
uv run --no-sync lerobot-policy-server --config_path=server.yaml
서버는 체크포인트를 로드하고, 선언을 검증한 후 워밍업을 실행하며, 그런 다음 Policy server ready: deployment=<name> instance=<id>; awaiting one client을 기록합니다. 모든 YAML 필드는 중첩된 CLI 오버라이드를 지원합니다:
uv run --no-sync lerobot-policy-server --config_path=server.yaml \ --model.device=cuda \ --execution.idle_timeout_s=10
3. 로봇 클라이언트 시작
다른 터미널에서 하드웨어 인수를 동일한 구성에 맞게 조정합니다:
uv run --no-sync lerobot-rollout \
--inference.type=remote \
--inference.endpoint=tcp/127.0.0.1:7447 \
--inference.deployment=manipulation \
--inference.mode=chunk \
--inference.chunk_merge=aligned \
--inference.semantics=so101-degrees-gripper-percent-v1 \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.use_degrees=true \
--robot.cameras='{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
--fps=30 \
--task="pick up the cube" \
--interactive=true입원 후 /start를 입력합니다. /stop은 실행을 종료하며, 로봇이 대기하거나 정지하는 동안 수행하는 작업을 참조하세요. 작동 중인 롤아웃의 텔레오퍼레이션 및 녹화 옵션을 유지합니다. 원격 클라이언트에 --policy.path, 로컬 모델-장치 오버라이드 또는 컴파일 플래그를 전달하지 마세요.
deployment은 서버를 선택하고 semantics는 검증된 동작 단위와 순서를 지정합니다. 두 값 모두 서버 구성과 일치해야 합니다. 예시에서는 몸체 관절의 자유도와 보정된 0~100 그리퍼 범위를 사용합니다.
Use a trusted LAN instead of localhost
서버를 LAN 인터페이스에 바인딩하고, 예시 주소를 실제 IP로 대체합니다:
uv run --no-sync lerobot-policy-server --config_path=server.yaml \
--zenoh.listen_endpoints='[tcp/172.18.133.214:7447]'클라이언트에서는 동일한 주소를 사용합니다: --inference.endpoint=tcp/172.18.133.214:7447. 두 호스트 모두 해당 엔드포인트에 도달할 수 있어야 합니다.
특정 인터페이스에 바인딩하면 노출 범위는 제한되지만, 피어 인증은 수행되지 않습니다. 신뢰할 수 있는 실험실 네트워크 외부에서는 인증된 라우터 연결을 사용하세요.
움직임을 계속하는 방법을 선택합니다
새로운 chunk가 도착할 때쯤이면, 해당 chunk를 계산하는 데 사용된 관측(observation)은 이미 약간 오래된 상태이며 로봇은 이미 이동한 뒤입니다. merge mode는 이 상황에 대해 어떻게 처리할지 결정합니다: 이전 chunk 뒤에 새로운 chunk를 재생하거나, 로봇이 이미 지나간 스텝을 제거하거나, 연결 지점을 부드럽게 매끄럽게 처리하는 것입니다.
| 선택 | 클라이언트 설정 | 유용한 시작점 |
|---|---|---|
| 추가 | mode=chunk, chunk_merge=append | 수락된 전체 실행 슬라이스를 유지합니다. 베이스라인으로 유용하지만, 다음 청크는 이전 관찰에서 시작할 수 있습니다. |
| 정렬 | mode=chunk, chunk_merge=aligned (auto 기본값) | 이미 지난 수신 스텝을 제거하고 미래 부분만 교체하여 독립적인 청크 간의 백워드 범프를 줄입니다. |
| 정렬 + 블렌딩 | Alignment 및 blend_steps > 0와 명시적 구성 요소 | 와 작업 진행이 작동하는 경우, 이전/새로운 대상의 부드러운 겹침 |
| RTC | mode=rtc_guided 또는 rtc_trained | checkpoint가 RTC를 지원하는 경우 사용하세요: 추론 자체는 나머지 궤적에 조건부입니다. |
이 표의 설정은 --inference. 접두사를 사용합니다. 일반 청크는 블렌딩이 비활성화된 정렬을 기본값으로 사용합니다. 이미 보간 중인 대상은 커밋되며 대체할 수 없습니다.
Alignment은 이미 커밋된 수신 스텝을 폐기합니다. Blending은 겹치는 미래 타겟을 평균화합니다. Interpolation은 엔드포인트 사이에 중간 모터 명령을 추가합니다. RTC는 예측이 생성되는 방식을 변경합니다. 이 중 어느 것도 매끄러운 움직임이나 성공적인 그랩을 보장하지 않습니다.
Add a short blend to the example
Blending은 클라이언트에서 완전히 구성되며, 서버에는 Blending 설정이나 재시작이 필요하지 않습니다. 배포의 action 이름에서 연속형 arm 좌표를 선택합니다:
--inference.chunk_merge=aligned \
--inference.blend_steps=5 \
--inference.blend_weight=0.5 \
--inference.blend_components='[shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos]'이것은 조정된 권장 사항이 아니라 비교용 설정입니다. 검증되지 않은 경우 그립퍼 및 기타 이산형 또는 접촉 민감형 제어 항목을 제외합니다. 선택되지 않은 구성 요소는 입력된 목표를 사용합니다.
Blending은 q_t + b_w * (i_t - q_t)를 계산합니다. q_t는 대기 중인 대상(target)이고, i_t는 동일한 미래 슬롯에 대한 수신 대상이며, b_w는 수신 비율(blend_weight)입니다. 가중치가 1이면 대체(replacement)가 수행됩니다. 실제 오버랩이 블렌딩 윈도우를 제한하므로, 구성된 10개의 스텝으로 10개의 오버랩 스텝을 생성할 수 없습니다. 반복적인 대체는 커밋되지 않은 대상을 여러 번 블렌딩할 수 있으며, 이는 이전의 영향력과 원래의 경과 시간을 유지합니다. Blending은 만료된 데이터를 갱신하지 않습니다.
Serve guided RTC on a compatible checkpoint
검증된 스키마를 유지하고 서버를 구성합니다:
uv run --no-sync lerobot-policy-server --config_path=server.yaml \
--execution.supported_modes='[rtc_guided]' \
--execution.rtc.enabled=true \
--execution.rtc.mode=guided \
--execution.rtc.execution_horizon=15클라이언트에서 --inference.mode=rtc_guided를 설정합니다. RTC는 일반 청크 정렬이나 블렌딩이 아닌 자체적인 연속 처리 방식을 사용합니다. 가이던스가 추가 작업을 발생시키므로 턴어라운드를 다시 측정해야 합니다. 15단계 호라이즌은 예시일 뿐, 최적화된 값이 아닙니다.
Trained RTC는 action-prefix conditioning으로 학습된 checkpoint와 호환되는 delay/horizon 설정이 필요합니다. RTC 구성을 참조하세요. 지원되지 않는 모드를 요청하면 동작 전에 실패합니다.
중요한 매개변수
아래의 Client 옵션은 별도로 명시되지 않는 한 --inference. 접두사를 사용합니다. 기본값은 시작 값일 뿐, 특정 로봇에 대한 보장은 아닙니다.
| 매개변수 | 기본값 / 단위 | 효과와 트레이드오프 |
|---|---|---|
refill_seconds | 0.5초의 남은 재생 시간 | 높을수록 더 일찍 요청을 보내고, 낮을수록 플랜의 더 많은 부분이 실행됩니다. 측정된 지연 시간 하한선이 이를 오버라이드할 수 있습니다. |
blend_steps | 0 정책 단계 | Zero는 블렌딩을 비활성화합니다. 더 큰 윈도우는 더 많은 겹치는 미래 타겟을 혼합합니다. |
blend_weight | 0.5 수신 비율 | Lower는 이전 target의 더 많은 부분을 유지합니다: 잠재적으로 더 완만한 변경 사항이지만, 교정이 더 느립니다. |
blend_components | [] | blending이 활성화된 경우 필수입니다. 서버가 허용하는 좌표의 명시적 부분 집합입니다. |
max_observation_age_s | 5.0초 | Maximum original source age through execution, including older blending contributors. Must cover inference and playback. |
action_starvation_grace_s | 1.0초 | 재생이 끝나면 제한된 대기 시간을 가집니다. 0이면 즉시 실패합니다. 다른 마감 시간을 재정의하지 않습니다. |
--fps | 서버의 action_fps 일치 | Policy action frequency. N개의 action에 대해 명목상 재생 시간은 N / fps초입니다. |
--interpolation_multiplier | 1 | 더 많은 중간 운동 명령; 재생을 연장하거나 정책 결정을 추가하지 않습니다. |
효과적인 리필은 max(refill_seconds, recent maximum turnaround + 1 / fps)입니다. 턴어라운드는 인코딩, 네트워크, 큐잉, 추론 및 디코딩을 포함합니다. 처음 수락된 요청이 초기 추정치를 제공하고, 이후 추정치는 최대 100개의 정상 상태 샘플을 사용합니다.
따라서 Refill은 고정된 요청 주기나 실행되는 동작의 보장된 수가 아닙니다. 로그에서 구성된 and effective refill을 확인하세요. 전체 실행 지평을 커버하는 임계값은 매우 빈번한 대체를 유발합니다.
Operation deadlines and server ownership
모든 값은 초 단위입니다.
| 클라이언트 매개변수 | 기본값 | 한계 |
|---|---|---|
handshake_timeout_s | 10 | Discovery/admission; 제어 교환을 위한 기본 예산 |
startup_timeout_s | 10 | 인식된 리셋/무효화 후 새로운 액션 시작 |
action_timeout_s | 5 | 미해결된 작업 요청 1건 |
language_timeout_s | 60 | 텍스트 요청 1회 |
서버에는 또한 execution.action_deadline_s=5 및 language.deadline_s=60이 있습니다. 클라이언트와 서버의 한도 값은 모두 적용되며, 한쪽을 변경해도 다른 쪽이 완화되지 않습니다. 리셋/무효화 제어 교환은 실행 중인 모델 호출 뒤에 대기해야 하므로, 광고된 서버 작업 예산도 추가로 허용합니다.
Server execution.idle_timeout_s=10은 클라이언트 부재 관찰 이후의 클린업을 제어하며, 액션 기아(action-starvation)에 대한 여유 시간(grace)을 제어하지 않습니다. 클린업은 실행 중인 모델 작업 뒤에 대기하며, 멈춘 호출을 인수할 수 없습니다. 연결된 상태의 일시 정지된 클라이언트는 세션을 유지합니다.
대기 또는 정지 중 로봇의 동작
지원되는 대기 동안, 클라이언트는 보간, 클리핑 및 그리퍼를 포함하여 드라이버가 실제로 적용한 마지막 목표를 새로고침합니다. 첫 번째 명령 전에, 측정된 포즈가 이를 초기화합니다. 이는 궤적 진행을 중단하며, 로봇은 해당 목표 방향으로 안정화될 수 있습니다. 이는 토크를 끄거나 정지를 보장하지 않습니다. 로컬 RTC는 지원되는 로봇에서 동일한 제한된 대기를 사용하며, 다른 환경에서는 소진 시 즉시 오류를 발생시킵니다.
| 상황 | 기대되는 동작 |
|---|---|
| 초기 추론 | Wait locally until usable actions arrive, within the startup deadline. |
| Actions가 소진됩니다 | 커밋된 보간을 완료한 후, 기아 허용 시간까지 타깃을 유지합니다. 새로운 관측 및 예측에서만 재개합니다. |
/vqa 또는 autosteering 쿼리 | 텍스트 생성 전 일시 중지; 실행이 여전히 활성 상태인 경우 이후 새 작업에서 재개합니다. 언어 범위가 적용됩니다. |
| 추론 중 지시 변경 | 이전 예측을 폐기하고, 일시 정지한 후 새로운 지시에 대한 새로운 동작을 가져옵니다. 요청 간의 변경 사항은 승인된 동작을 유지할 수 있습니다. |
| 기록 저장 또는 작업자 일시 정지 | target를 유지하거나, 제어권을 teleoperation으로 넘깁니다. 차단 녹화 작업은 적절한 시점에 새로운 추론으로 재개됩니다. |
| 마감 시간, 오래된 작업, 잘못된 응답 또는 만료된 기아 그레이스 | 터미널 장애: 정책 모션을 철회하고 구성된 종료 절차를 따르십시오. |
/stop 또는 일반적인 Ctrl+C | 정책 동작을 종료하고 구성된 반환/연결 해제 동작을 따릅니다. |
Starvation recovery는 오래된 in-flight 예측을 제거하고, 대기 시작 이후에 캡처된 새로운 예측을 가져옵니다. 오래된 결과로는 모션을 재개할 수 없습니다. 패킷과 사용 불가능한 결과는 grace를 갱신하지 않습니다. 빈번한 대기는 재생 또는 지연 시간 커버리지가 부족함을 나타냅니다.
서버 또는 연결 손실은 자동으로 복구되지 않습니다. 버퍼링된 유효한 작업이 소진된 후, grace 또는 다른 마감 시간이 만료될 때까지 대기합니다. 서버 존재가 손실된 것으로 관찰되면, 연결이 복구되어도 해당 세션을 재개할 수 없으며, 새 세션을 위해 롤아웃을 다시 시작해야 합니다. 텍스트 작업 중 서버 손실이 관찰되면 쿼리가 오류 상태로 전환됩니다.
정상적인 관측 수집과 액추에이터 제어 하에서, 터미널 종료 시 --return_to_initial_position=true(기본값)를 준수한 후 연결을 해제합니다. 반환 과정에서는 전체 관측을 읽기 때문에, 영구적인 카메라 장애가 반환을 방해할 수 있습니다. 실패한 액션 또는 홀드 적용은 추가적인 이동을 억제합니다. 해당 옵션을 false로 설정하면 반환은 건너뛰지만 연결 해제는 수행됩니다. 연결 해제 시 로봇 구성에 따라 토크가 해제될 수 있습니다. 터미널 실패는 클린업 후 비영 상태 코드로 종료되며, 강제 종료된 프로세스는 클린업을 보장할 수 없습니다.
작동하는 작업 하나 조정하기
동기식 참조 지점 근처에서 시작하세요. 각 예측의 상당 부분을 실행하되, 추론 지연을 가릴 수 있을 만큼 충분히 일찍 요청합니다. 그런 다음 더 빈번한 재계획이 도움이 되는지 평가해 보세요.
- 먼저 블렌딩 없이 정렬을 사용하세요. FPS, 보간 및 설정을 고정하세요. 실행 지평선, 전체 턴어라운드 및 느린 요청을 검사하세요.
- 여유를 두고 재충전 범위를 선택합니다. 다른 요청과 지연 시간 변동에 대비해 충분한 재생 시간을 확보하되, 계획을 지속적으로 교체하지 않습니다.
- 해당 주기에서 짧은 블렌드를 추가하세요. 작업 완료, 그립/해제, 충돌을 각각 비교하세요. 호환되지 않는 계획의 매끄러운 평균은 물체를 놓칠 수 있습니다.
- 혜택이 있을 때만 더 일찍 요청하세요. 리필을 늘리면 응답성이 향상될 수 있지만 유용한 진행을 방해할 수도 있습니다. 작업 성능이 저하되면 안정적인 리듬으로 되돌아가세요.
- 한 번에 하나의 설정만 변경하세요. 타임아웃이나 grace를 늘리는 것은 누락된 작업을 제공하지 않습니다. refill을 줄이는 것이 고갈에 대한 보편적인 해결책이 아닙니다.
0.8 s 실행 지평선과 안정적 성공 정렬을 위해, 요청 간격은 대략 0.8 - effective_refill입니다:
| 효과적인 재충전 | 대략적인 간격 | 주의할 점 |
|---|---|---|
0.2 s | 0.6 s | 후속 조치 강화, 느린 요청에 대한 보호 기능 완화 |
0.4 s | 0.4 s | 조기 교체, 더 많은 수정 기회 |
0.6 s | 0.2 s | 자주 변경; 작업 진행 상황 확인 |
이 값에는 시작, 홀드, 포화 및 제어 틱 효과가 제외됩니다. 0.2 s가 남아 있는 상태에서 시작되어 0.1 s가 소요되는 요청은 블렌딩에 0.1 s만 남게 되며, 이는 30 Hz에서 3단계에 해당합니다. 따라서 거의 동기화된 주기는 짧은 블렌딩만 필요할 수 있습니다.
정렬 및 RTC의 경우, 명목상 청크 길이가 아닌 트림 후 사용 가능한 재생 시간을 확인하세요. 추론에 1.67초 예측 중 1초가 소요되면 약 0.67초만 남게 됩니다. 1초짜리 추가 요청은 수용할 수 없으며, 리필 값으로 이를 해결할 수 없습니다. 턴어라운드를 줄이거나, 더 긴 지원 지평선을 사용하거나, 다른 동작 주기를 검증하세요.
Source age에는 실행이 포함됩니다. append의 경우, 대략 execution horizon + effective refill에 capture/inference 마진을 더한 값을 허용합니다. 30 Hz에서 100-step 청크는 이미 3.33초에 걸쳐집니다. 정렬은 일반적으로 age를 줄이지만, 반복적인 블렌딩은 더 오래된 기여자를 유지할 수 있습니다.
로그를 읽고 실행을 진단합니다
INFO 로그는 승인 및 유효한 설정, 텍스트 요청 결과, 대기/종료 전환, 그리고 약 5초 간격의 활동 요약을 표시합니다. 읽기 처리 시간과 대기 중인 재생을 함께 확인하세요. 자세한 내용은 서버 --log_level=DEBUG와 클라이언트 --inference.log_level=DEBUG를 사용하세요. 인터랙티브 세션에서는 ERROR보다 낮은 클라이언트 로그가 음소거됩니다. 실시간 타이밍 로그를 수집할 때는 비인터랙티브 실행을 사용하세요.
로그을 저장할 때는 2>&1 | tee -i server.log(또는 client.log)를 사용하세요. -i는 Ctrl+C가 전체 파이프라인에 도달했을 때에도 tee가 유지되도록 하여, 정상 종료 메시지도 함께 캡처합니다.
| 관찰 | 다음으로 유용한 확인 |
|---|---|
| Append은 역방향 돌출을 유발합니다 | … |
| Alignment은 매끄럽지만 작업 성공률이 떨어집니다 | Lower refill을 latency margin 내에서 낮추어 교체 빈도를 줄입니다. 블렌딩 전에 cadence를 조정합니다. |
| Blending이 결정을 내리지 못하는 것처럼 보입니다 | Shorten its window or increase incoming weight; compare without blending at the working cadence. |
| 반복 대기 / 액션 고갈 | 느린 응답 시간, 유실/정체된 요청, 트리밍 후 재생을 확인하세요. 지평선이 허용하는 경우에만 헤드룸을 늘리세요. |
| Refill 변경 사항은 아무 효과도 없습니다 | 측정된 지연 시간 하한이 지배적일 수 있습니다. 유효 리필을 검사하세요. |
| 오래된 소스 오류 | 가장 오래된 소스의 경과 시간, 지평선 및 블렌딩을 검사합니다. 새 응답은 기존 기여자의 정보를 새로고침하지 않습니다. |
클라이언트 재시작 후 BUSY | absent-client 정리 및 실행 중인 작업을 기다립니다. 거부된 재연결은 소유권 유예 기간을 연장하지 않습니다. |
| 계약 불일치 | schema, mode 및 시작 소프트웨어 메타데이터를 비교하고, 호환되지 않는 프로세스를 재시작하거나 업데이트합니다. |
DEBUG에는 각 요청의 제출 시 재생, 관찰 나이, 커서 진행률, 그리고 결과별 잘림/사용 가능 단계 및 중복이 포함됩니다. 이는 명령된 진행률을 설명하며, 측정된 물리적 실행을 나타내지 않습니다.
구성 및 네트워킹
체크포인트, 로봇 스키마, 서버 설정을 위한 배포 YAML을 하나로 유지하고, 실험에는 중첩된 CLI 오버라이드를 사용하세요. 독립적인 실험에는 서로 다른 배포 이름을 지정하세요. 두 프로세스 모두 패키지 및 프로토콜 버전을 기록하며, 수신은 프로토콜과 실행/데이터 계약을 확인하지만 동일한 패키지 버전을 요구하지 않습니다.
Schema, camera names and checkpoint requirements
유지 관리되는 server.yaml에는 모든 필수 필드가 포함되어 있습니다. features와 action_feature는 shape, dtype, 의미를 선언하며, 상태/액션 벡터는 구성 요소 순서도 선언합니다. 이미지는 RGB uint8, 높이 × 너비 × 3 형식을 사용합니다. 예를 들어:
features:
- name: observation.state
shape: [6]
dtype: float32
names:
[
shoulder_pan.pos,
shoulder_lift.pos,
elbow_flex.pos,
wrist_flex.pos,
wrist_roll.pos,
gripper.pos,
]
semantics: so101-degrees-gripper-percent-v1
- name: observation.images.front
shape: [480, 640, 3]
dtype: uint8
kind: rgb
semantics: rgb-front-table-v1체크포인트에 사용되는 이름을 사용하세요. scene이라는 이름의 로봇 카메라를 체크포인트의 front 뷰에 매핑하려면, 클라이언트에서 --rename_map='{"observation.images.scene":"observation.images.front"}'를 설정하세요. 이름 변경을 통해 뷰, 해상도 또는 보정을 변경할 수 없습니다. 추가 카메라는 서버로 전송되지 않으면서도 녹화를 위해 사용 가능 상태로 유지할 수 있습니다.
지원되는 정책은 저장된 프로세서와 현재 관찰로부터의 직접 청크 예측을 사용합니다. 히스토리에 의존하는 정책, 잠재 컨트롤러 출력, 그리고 select_action()를 통해서만 사용 가능한 준비 작업은 추가적인 통합이 필요합니다. 동기 추론 또는 워밍업의 성공만으로는 원격 작업의 품질이나 언어/RTC 지원 여부를 입증하지 못합니다.
지원되는 chunk-only checkpoint의 경우, 서버의 --execution.n_action_steps=30 옵션은 checkpoint를 수정하지 않고도 실행 슬라이드를 단축합니다. 이 값은 예측 지평선을 초과할 수 없으며, RTC 배포에서는 거부됩니다. 선택적인 클라이언트 옵션 --inference.expected_artifact=...은 모델/프로세서 내용과 유효한 추론 설정을 고정합니다. 배포 이름만으로는 checkpoint의 동일성을 나타내지 않습니다.
Independent deployments, bandwidth and connection loss
서버 --deployment=arm-a를 클라이언트 --inference.deployment=arm-a와 페어링합니다. 이름은 알파벳, 숫자, 밑줄, 마침표, 하이픈으로만 구성된 단일 세그먼트여야 합니다. 각 서버 프로세스는 여전히 활성 클라이언트 하나만 제공합니다. 여러 인스턴스가 동일한 이름을 광고하는 경우 --inference.instance=...를 선택하거나 서로 다른 이름을 사용하세요. 디스커버리는 임의로 선택하지 않습니다.
Traffic은 lerobot/inference/v1/deployments/{deployment} 아래에서 스코프가 설정되며, 이후 서버 인스턴스와 세션별로 구분됩니다. Query/reply는 discovery, admission, control을 처리하고, pub/sub는 추론 데이터를 전달하며, liveliness는 presence를 추적합니다. 명시적인 엔드포인트는 multicast/gossip discovery를 비활성화합니다. Sequence/generation ID와 클라이언트 로컬 타이밍이 모션을 제어하며, 동기화된 호스트 클록은 필요하지 않습니다.
Raw RGB은 손실 없이 기본값입니다. 이미지 대역폭을 줄이려면 --inference.encoding=jpeg --inference.jpeg_quality=90을 시도한 후, 처리 시간과 작업 품질을 비교해 보세요. 품질은 1에서 100까지의 범위를 가지며, 임의의 텐서는 JPEG로 인코딩되지 않습니다.
Liveliness은 전송 리스가 만료된 후에야 끊어진 연결을 감지할 수 있습니다. 클라이언트의 --inference.zenoh_config_path 또는 서버의 --zenoh.config_file를 통해 제공되는 Zenoh JSON5 파일로 transport/link/tx/lease를 조정할 수 있습니다. 이는 액션 마감 시간, 기아 상태 허용 시간, 부재 클라이언트 소유권 정리 동작에는 영향을 주지 않습니다. 관찰 혼잡 시에는 데이터를 차단하는 대신 데이터를 폐기합니다.
Server presence restored는 소유권 클리업을 취소합니다. 이미 장애가 발생한 클라이언트를 복구할 수는 없습니다. 정책 리셋이 실패하면 프로세스가 살아있더라도 배포가 사용 불가능한 상태가 됩니다. 실패를 해결하고 다시 시작하세요.
Private connections through an authenticated router
라우터는 여러 독립 실험을 포함하여 로봇 및 GPU 프로세스가 도달할 수 있는 공통 접점을 제공합니다. 이는 지연 시간과 장애 지점을 추가하며, 자동 방화벽 통과, 모델 스케줄링 또는 모션 복구를 제공하지 않습니다. 단순한 TCP와 세션 ID는 피어 인증을 수행하지 않습니다.
유지 관리되는 Zenoh 구성을 사용하세요: router.json5, server.json5, robot.json5. 이들은 TLS, 상호 인증서 검증, 탐색 비활성화, 역할 기반 ACL을 사용합니다. 구성된 경로 아래에 사설 CA와 라우터/서버/로봇 인증서를 각각 발급하세요. 각 프로세스에는 해당 프로세스의 개인 키와 CA 인증서만 필요합니다. CA 키는 다른 위치에 보관하세요. LAN 배포의 경우, localhost를 라우터의 호스트명으로 일관되게 교체하고 해당 이름을 포함하는 인증서를 발급하세요.
zenohd --config examples/remote_inference/zenoh/router.json5
uv run --no-sync lerobot-policy-server --config_path=server.yaml \
--zenoh.mode=client \
--zenoh.listen_endpoints='[]' \
--zenoh.connect_endpoints='[tls/localhost:7447]' \
--zenoh.config_file=examples/remote_inference/zenoh/server.json5rollout 명령에 추가합니다:
--inference.endpoint=tls/localhost:7447 \ --inference.zenoh_mode=client \ --inference.zenoh_config_path=examples/remote_inference/zenoh/robot.json5
ACL 배포 경로와 함께 배포 이름을 변경합니다. 모든 참여자는 직접적인 peer 링크 없이 클라이언트 모드를 사용합니다. 예시에서는 로봇과 서버 역할을 분리하지만, 역할 인증서를 공유하면 권한도 공유되므로 서로 다른 신뢰 그룹에는 별도의 승인된 ID를 사용해야 합니다. Router ACL은 손상된 로봇 프로세스를 방어하거나 그 내부 로컬 트래픽을 관리할 수 없습니다. Zenoh의 TLS 및 ACL 문서를 참조하세요.
zenohd 바이너리와 Python 바인딩은 호환되는 버전이어야 합니다. 설치된 라우터와 설치된 바인딩의 호환성을 확인하고, TLS 및 ACL 강제 적용을 포함하여 확인하려면:
LEROBOT_ZENOHD=/absolute/path/to/zenohd \ uv run --no-sync pytest tests/remote_inference/test_zenoh.py -q -rs
이 체크는 openssl도 필요합니다. 사용할 수 없는 선행 조건은 건너뛰기로 보고됩니다. 라우터, 프라이빗 호스팅 GPU 또는 Hugging Face Space를 통해 로봇을 제어하는 방식은 아직 검증되지 않았습니다. 새로운 토폴로지를 통해 로봇을 제어하기 전에 전체 처리 시간과 중단 동작을 측정하십시오. 전송 계층이 정상적으로 작동하는 것만으로는 사용 가능한 동작 예산을 확보했다고 볼 수 없습니다.
언어 및 녹음
interactive rollout를 통해 /vqa, /subtask, /autosteer를 사용하세요. 서버의 language.enabled=true는 텍스트 생성을 구현한 체크포인트에서만 활성화해야 하며, autosteering은 호환되는 goal/subtask 프롬프팅으로 서브태스크 생성을 위해 학습된 체크포인트가 추가로 필요합니다. 서버는 체크포인트가 해당 기능을 선언할 때 이러한 명령을 노출하며, 답변과 서브태스크의 유용성은 체크포인트에 따라 달라집니다.
Text work은 동작을 일시 중지하고 버퍼링된 후속 작업을 폐기합니다. VQA는 사용자의 지시를 유지하고 새로운 예측으로 재개하므로, 로봇은 성공적인 답변 이후에도 재계획 시 작업 진행 상황을 잃을 수 있습니다. 정보 제공 목적의 VQA 쿼리 동안 버퍼링된 동작을 계속 실행하는 기능은 계획되어 있으며, 향후 작업을 참조하세요.
기록은 일반적인 로컬 데이터셋 형식을 사용합니다. 작업 라벨은 분배된 액션을 따릅니다. 진단 정보는 애플리케이션 로그에 유지되며 데이터셋에 기록되거나 업로드되지 않습니다. 데이터셋을 사용하는 경우 초기 지침에 --dataset.single_task를 사용하고, 그렇지 않은 경우 --task를 사용합니다. 충돌하는 구성을 피하기 위해 둘 중 하나를 우선적으로 사용하세요.
Python에서 사용
공용 엔진과 구성은 lerobot.inference에, 원격 클라이언트, 엔진 및 서버는 lerobot.remote_inference에 있습니다. lerobot-rollout 외부의 제어 루프는 클라이언트를 연결하고 허용한 뒤 엔진으로 감싸 캡처를 게시하고, 모든 모터 틱을 CLI와 동일한 권한, 홀드 및 확인 계약을 적용하는 dispatch_tick을 통해 분배합니다:
import time
import numpy as np
from lerobot.inference import RemoteInferenceConfig, dispatch_tick
from lerobot.remote_inference import RemoteClient, RemoteInferenceEngine
from lerobot.utils.action_interpolator import ActionInterpolator
config = RemoteInferenceConfig(
endpoint="tcp/127.0.0.1:7447",
deployment="manipulation",
semantics="so101-degrees-gripper-percent-v1",
)
client = RemoteClient.connect(config)
caps = client.capabilities
client.admit(
features=caps.features,
action_feature=caps.action_feature,
semantics=config.semantics,
action_interval=caps.action_interval,
mode=config.mode,
)
engine = RemoteInferenceEngine(client, config, task="pick up the cube")
interpolator = ActionInterpolator(multiplier=1)
engine.start()
engine.resume()
try:
while running():
captured = time.monotonic()
engine.submit_observation(
{"observation.state": state_vector(), "observation.images.front": front_rgb()},
capture_time=captured,
)
# send() receives a torch tensor in the deployment's action order; hold() refreshes
# the last applied target. Returns None when the tick was held or starved.
dispatch_tick(engine, interpolator, send=robot_send, hold=robot_hold)
finally:
engine.stop() # revokes motion and closes the clientObservations은 체크포인트에서 사용하는 기능 이름으로 키가 지정되며 서버 스키마와 일치해야 합니다: 선언된 구성 요소 순서로 배치된 float32 벡터, 선언된 크기의 RGB uint8 이미지. tests/remote_inference/test_library_client.py는 이 경로를 루프백 서버에 대해 실행하며 호출 순서의 기준이 됩니다. lerobot-rollout는 이 위에 드라이버 변환, 위치 유지 확인, 인터랙티브 명령 및 녹화를 추가합니다. lerobot-policy-server는 서빙 진입점이며 YAML 및 CLI 오버라이드로만 구성됩니다.
Migrating from lerobot[async]
폐기된 lerobot[async] extra와 lerobot.async_inference 명령은 lerobot[remote], lerobot-policy-server 및 lerobot-rollout --inference.type=remote로 대체되었습니다. 이전의 chunk-size 임계값과 aggregation 가중치는 refill, alignment, blending과 호환되지 않으므로, 위의 parameters를 기준으로 다시 조정해야 합니다.
lerobot.rollout.inference의 기존 import 위치는 lerobot.inference와 lerobot.remote_inference를 대신하여 제거되었습니다. hold_mode 옵션은 없습니다. 원격 실행에는 드라이버의 position-hold 선언이 필요하며, rollout이 이를 자동으로 확인합니다.
SONIC를 사용하는 Unitree G1의 경우, 기존 명령을 수정하는 대신 G1 원격 레시피를 따르세요. G1 보행 컨트롤러는 여전히 지원되지 않습니다.
아키텍처, 실행 계약 및 계획된 확장 기능에 대해서는 엔지니어링 디자인 참고 자료를 참조하세요.
Update on GitHub