LeRobot documentation
실시간 청킹(RTC)
실시간 청킹(RTC)
실시간 청킹(Real-Time Chunking, RTC)은 Pi0, Pi0.5, SmolVLA와 같은 대규모 플로우 매칭 기반 로봇 정책이 높은 추론 지연에도 불구하고 매끄럽고 연속적이며 반응적인 동작을 생성할 수 있도록 합니다. LeRobot은 원래의 추론 시점 가이드 모드를 제공하며, 호환되는 Pi05 체크포인트의 경우 저렴한 하드 프리픽스 추론을 통한 학습 시점 액션 조건화를 지원합니다.
이러한 정책은 단일 동작 대신 미래 동작의 청크(예: 한 번에 50단계)를 생성합니다. 모델이 크기 때문에 각 청크를 생성하는 데 걸리는 시간이 로봇이 해당 청크를 실행하는 데 걸리는 시간보다 깁니다. 다음 청크가 늦게 도착하거나 이전에 실행된 동작과 일치하지 않을 때마다, 청크를 단순히 실행하는 방식은 일시 정지, 거친 전환, 또는 전략의 갑작스러운 변경과 같은 문제를 초래합니다.
RTC는 로봇이 현재 청크를 계속 실행하는 동안 다음 청크를 비동기적으로 생성하고, 이미 실행된 이전 청크의 부분과 매끄럽게 정렬되도록 새로운 청크를 유도하여 이 문제를 해결합니다.
RTC 작동 방식 (간소화)
RTC는 로봇이 움직이는 동안에도 앞을 내다보며 사고할 수 있게 합니다. 로봇이 하나의 액션 청크를 실행하는 동안, RTC는 다음 청크를 미리 생성하기 시작합니다. 그러나 새로운 청크가 준비될 시점에는 로봇이 이미 약간 이동했으므로, RTC는 새로운 청크가 로봇의 현재 동작과 매끄럽게 이어지도록 보장해야 합니다.
이를 위해 RTC는 새 청크의 시작 부분을 인페인팅 또는 “빈 공간 채우기” 문제로 취급합니다. 새 청크의 첫 부분을 부드럽게 조정하여 로봇의 진행 중인 움직임과 자연스럽게 어우러지도록 합니다. 그 결과, 멈춤이나 갑작스러운 점프가 발생하지 않습니다.
기술적으로 RTC는 플로우 매칭(flow-matching) 디노이징 과정에 가이던스 항을 추가하여, 새 청크의 겹치는 타임스텝이 이전 청크의 실행된 부분에 가깝도록 유지되도록 강제합니다. 일반적으로 부드러운 전환 마스크를 사용합니다.
빠른 시작
설치
RTC는 LeRobot에 내장되어 있습니다. 필요한 정책 의존성만 설치하면 됩니다:
# For Pi0 or Pi0.5
pip install -e ".[pi]"
# For SmolVLA
pip install -e ".[smolvla]"Pi0와 RTC 사용
실제 로봇에서 RTC 배포를 위해 lerobot-rollout --strategy.type=base --inference.type=rtc를 사용할 수 있습니다.
아래 스니펫은 파이프라인에서 Pi0와 함께 RTC가 작동하는 방식을 보여주는 단순화된 의사 예시입니다:
from lerobot.policies.pi0 import PI0Policy, PI0Config
from lerobot.configs import RTCAttentionSchedule
from lerobot.policies.rtc import RTCConfig, ActionQueue
# Load the Pi0 config so RTC can be enabled before the policy is built
policy_cfg = PI0Config.from_pretrained("lerobot/pi0_base")
# Enable RTC
policy_cfg.rtc_config = RTCConfig(
enabled=True,
execution_horizon=10, # How many steps to blend with previous chunk
max_guidance_weight=10.0, # How strongly to enforce consistency
prefix_attention_schedule=RTCAttentionSchedule.EXP, # Exponential blend
)
# Load the policy
policy = PI0Policy.from_pretrained("lerobot/pi0_base", config=policy_cfg).to("cuda")
# Now use predict_action_chunk with RTC parameters
inference_delay = 4 # How many steps of inference latency, this value should be calculated based on the inference latency of the policy
# Initialize the action queue
action_queue = ActionQueue(policy_cfg.rtc_config)
# Start in a separate thread with the following function
def get_actions():
while True:
if should_get_actions:
prev_actions = action_queue.get_left_over()
obs = get_robot_observations(robot)
# Generate actions WITH RTC
actions = policy.predict_action_chunk(
obs,
inference_delay=inference_delay,
prev_chunk_left_over=prev_actions,
)
action_queue.merge(
actions, actions, inference_delay
)
for step in range(num_steps):
action = action_queue.get()
# Execute the first N actions
execute_actions(action)주요 매개변수
RTCConfig에는 다음 매개변수를 조정할 수 있습니다:
mode는 액션 접두사 조건화 방법을 선택합니다:
guided(기본값)는 디노이징 과정에서 원래의 Jacobian guidance를 적용하며, 일반적인 flow-matching 체크포인트와 함께 작동합니다.trained는 이전 청의 접두사를 액션별 flow timesteps로 hard-inpaint합니다. 현재policy.rtc_training_max_delay > 0로 학습된 Pi05 체크포인트가 필요하며, guidance backward pass를 피합니다.
Local rollout과 policy server는 동일한 보수적 trained-mode 승인 규칙을 적용합니다: rtc_training_max_delay <= execution_horizon <= prediction_steps - rtc_training_max_delay. Pi05의 경우 prediction_steps는 체크포인트의 chunk_size입니다. 이를 통해 기존 로컬 한도가 유지됩니다. 설정된 prefix가 최대 trained delay를 커버하고, 그 밖의 예측 단계가 최소한 그만큼 남도록 합니다. Local rollout은 로봇 연결 전에 inference.queue_threshold >= rtc_training_max_delay를 추가로 요구하며, 원격 요청 타이밍은 자체 refill 설정을 사용합니다.
여기서 execution_horizon은 재생 요청 사이의 양이 아니라 공급된 접두사 용량입니다. Pi05는 inference_delay 접두사만 하드 조건으로 지정합니다. 허용 규칙은 지연 시간 보장이나 더 큰 용량이 런타임에서 실패해야 한다는 주장이 아닙니다. 반환된 청크가 실행될 수 있는지는 측정된 중복, 남은 동작 및 신선도 검사에 의해 여전히 결정됩니다. 일반 청크와 유도된 RTC는 이 학습 전용 규칙의 영향을 받지 않습니다.
execution_horizon: 이전 청크와 일관성을 유지하기 위한 타임스텝 수. 값이 높을수록 전환이 더 부드럽지만 반응성이 낮아질 수 있습니다.
일반적인 값: 8~12 단계
RTCConfig(execution_horizon=10)max_guidance_weight: 이전 청과의 일관성을 얼마나 강하게 강제할지를 결정합니다. 이는 전환의 매끄러움과 정책의 반응성 사이의 균형을 맞추기 위해 조정할 수 있는 하이퍼파라미터입니다. 10단계 flow matching(SmolVLA, Pi0, Pi0.5)의 경우 10.0이 최적의 값입니다.
prefix_attention_schedule: 겹침 영역에서 일관성을 가중하는 방법.
LINEAR: Linear decay from inference_delay to execution_horizonEXP: 지수 감소(시작하기에 권장)ONES: 전체 execution_horizon에 걸쳐 전체 가중치ZEROS: 바이너리(추론 지연 시간까지 전체 가중치, 이후에는 0)
inference_delay: 시스템의 추론 지연이 몇 개의 timestep에 해당하는지 나타냅니다. 런타임에 따라 달라질 수 있으므로 config가 아닌 predict_action_chunk()에 전달됩니다.
RTC 오프라인 테스트
실제 로봇에서 실행하기 전에, RTC가 어떻게 작동하는지 시각화하기 위해 데이터셋 샘플로 RTC를 테스트합니다:
python examples/rtc/eval_dataset.py \
--policy.path=lerobot/pi0_libero_finetuned \
--dataset.repo_id=HuggingFaceVLA/libero \
--rtc.execution_horizon=10 \
--rtc.max_guidance_weight=10.0 \
--device=cuda호환되는 학습 시 RTC Pi05 체크포인트를 평가할 때 --rtc.mode=trained를 추가하세요. 지원되지 않는 정책은 guided RTC로 폴백하는 대신 trained 모드를 거부합니다.
The script generates a visualization of the denoising process, comparing standard generation (left) with RTC (right). In the RTC plots, you can see how the first few steps (blue/purple lines) are guided to match the red ground truth trajectory (previous chunk’s tail), ensuring a smooth transition between chunks.

실제 로봇으로 RTC 테스트
lerobot-rollout \
--strategy.type=base \
--policy.path=${HF_USERNAME}/policy_repo_id \
--inference.type=rtc \
--inference.rtc.mode=guided \
--inference.rtc.execution_horizon=10 \
--inference.rtc.max_guidance_weight=10.0 \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem58FA0834591 \
--robot.cameras="{ gripper: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--task="Move green small object into the purple platform" \
--duration=120 \
--device=cuda학습 시점의 RTC Pi05 체크포인트의 경우, 모드를 trained(으)로 변경합니다. 체크포인트는 지원되는 최대 지연 시간을 기록하며, 롤아웃은 측정된 지연 시간을 해당 값과 비교하여 검증합니다:
lerobot-rollout \
--strategy.type=base \
--policy.path=${HF_USERNAME}/pi05_training_rtc \
--inference.type=rtc \
--inference.rtc.mode=trained \
--inference.rtc.execution_horizon=10 \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem58FA0834591 \
--task="Move green small object into the purple platform" \
--duration=120 \
--device=cudaRTC와 원격 추론의 관계
--inference.type=rtc는 로컬 RTC입니다. 추론은 rollout 프로세스의 백그라운드 스레드에서 실행되며 전송 계층을 사용하지 않습니다. 동일한 머신에서 정책 서버와 로봇 클라이언트를 별도의 프로세스로 실행하는 경우 대신 원격 백엔드를 사용합니다.
두 비동기 백엔드는 지원되는 로봇에서 동일한 제한 대기 및 종료 동작을 사용합니다. 타임아웃 기본값은 로컬 RTC 예산을 참조하세요. 대기 과정에서도 RTC의 접두사, 지연 또는 최신성 검사 조건은 완화되지 않습니다.
RTC와 원격 추론 모두 실시간 로봇 제어를 개선하지만, 해결하는 문제가 다릅니다.
| 측면 | 원격 추론 | RTC |
|---|---|---|
| 목적 | 다른 프로세스 또는 다른 컴퓨터에서 추론 실행 | 남은 궤적에 대한 조건 예측 |
| 실행 | 로컬 버퍼링된 재생, 선택적 정렬 및 블렌딩 | 지원되는 정책의 유도 또는 학습된 연속 |
| 관계 | plain chunks 또는 RTC를 서빙할 수 있습니다 | 로컬 또는 원격 백엔드를 통해 실행할 수 있습니다 |
| 한계 | 지연 시간, 최신성 및 버퍼 커버리지로 인해 동작이 여전히 제한됩니다 | 정책에서 선언한 RTC 계약이 필요합니다 |
Remote inference는 체크포인트가 협상된 RTC 모드를 지원하는 경우 RTC를 사용할 수 있습니다. 일반 청크는 선택적 커서 정렬 및 블렌딩도 지원합니다. 모드, 호환성 및 튜닝에 대한 자세한 내용은 remote inference 가이드를 참조하세요.
고급: 디버그 추적
RTC에는 추론 중에 어떤 일이 일어나고 있는지 이해하는 데 도움이 되는 내장 디버그 추적이 포함되어 있습니다:
# Enable debug tracking
policy_cfg.rtc_config.debug = True
policy_cfg.rtc_config.debug_maxlen = 100
policy.init_rtc_processor() # re-create the RTC processor so the new debug settings take effect
# After inference, access debug data
debug_data = policy.rtc_processor.get_all_debug_steps()
# Visualize denoising steps, corrections, etc.
from lerobot.policies.rtc.debug_visualizer import RTCDebugVisualizer
visualizer = RTCDebugVisualizer()
# ... create plots오프라인 RTC 시각화의 완전한 예제는 examples/rtc/eval_dataset.py를 참고하세요.
참고
- 부드러운 버터 같은 로봇 정책 - 실제 로봇 결과를 포함한 뛰어난 기술 설명
- Physical Intelligence - 실시간 청킹 - 원본 논문 및 연구
- Kinetix RTC 구현 - Physical Intelligence의 참조 구현
- 학습 시 액션 조건화 - 학습 중 클린 프리픽스 조건화를 통한 효율적인 RTC
- RLDX-1 - 학습 시 RTC 통합에 사용된 PyTorch 레퍼런스