LeRobot documentation

π₀-FAST

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

π₀-FAST

π₀-FAST는 범용 로봇 제어를 위한 Vision-Language-Action 모델로, 오토레그레시브 다음 토큰 예측을 사용하여 연속적인 로봇 동작을 모델링합니다.

모델 개요

π₀-FAST은 Vision-Language Models의 강점을 FAST(Frequency-space Action Sequence Tokenization)라는 새로운 액션 토큰화 기법과 결합합니다. 이를 통해 표준 바인닝 기반 이산화로는 불가능한 고도의 민첩한 작업을 수행하는 오토레그레시브 VLA를 학습할 수 있으며, π₀와 같은 확산 기반 접근법보다 최대 5배 빠르게 학습할 수 있습니다.

An overview of Pi0-FAST

왜 FAST인가요?

로봇 액션 토큰화를 위한 표준 접근법은 차원별, 타임스텝별 단순한 버닝(bin) 스키움을 사용합니다. 단순한 동작에는 어느 정도 적합하지만, 정밀도와 고주파 제어의 정확성이 요구되는 복잡하고 민첩한 스킬에서는 이 방식이 빠르게 한계에 부딪힙니다.

FAST는 신호 처리 기법을 사용하여 액션 시퀀스를 압축하여 이를 해결합니다. 그 결과, 언어 토큰과 마찬가지로 자기회귀적으로 예측할 수 있는 밀집된 액션 토큰 시퀀스가 생성됩니다.

FAST 토큰화가 작동하는 방식

FAST 토크나이저는 다음 단계를 통해 액션 시퀀스를 압축합니다:

  1. Normalize: H가 horizon, D가 action dimension인 shape (H, D)의 연속 action chunk를 가져옵니다. 지원되는 정규화 방법 중 하나(외래치 처리를 위해 Quantiles 권장)를 사용하여 정규화합니다.

  2. 이산 코사인 변환(DCT): 각 동작 차원에 대해 개별적으로 DCT를 적용합니다(scipy 사용). DCT는 이미지 및 오디오 코덱(JPEG, MP3)에서 일반적으로 사용되는 압축 알고리즘입니다.

  3. Quantization: 각 액션 차원에 대해 중요하지 않은 계수를 반올림하고 제거하여 희소 주파수 행렬을 생성합니다.

  4. Flatten: 행렬을 1차원 벡터로 평탄화하며, 저주파 성분을 앞에 배치합니다.

  5. Byte Pair Encoding (BPE): DCT 계수를 밀집된 액션 토큰으로 압축하기 위해 BPE 토크나이저를 학습하며, 일반적으로 기존 토크나이제이션 방식 대비 10배 압축을 달성합니다.

이 접근법은 이러한 FAST 토큰을 예측하도록 학습함으로써 기존의 어떤 VLM이든 VLA로 변환할 수 있습니다.

설치 요구 사항

  1. LeRobot은 설치 가이드를 참고하여 설치하세요.

  2. 다음 명령을 실행하여 π₀-FAST의 종속성을 설치합니다:

    pip install -e ".[pi]"

커스텀 FAST 토크나이저 학습

FAST 토크나이저에는 두 가지 옵션이 있습니다:

  1. 사전 학습된 토크나이저 사용: lerobot/fast-action-tokenizer 토크나이저는 100만 개 이상의 실제 로봇 액션 시퀀스로 학습되어 범용 토크나이저로 작동합니다.

  2. 직접 토크나이저 학습하기: 특정 데이터셋에서 최대 성능을 얻으려면 자체 데이터로 토크나이저를 파인튜닝할 수 있습니다.

직접 토크나이저 학습하기

lerobot-train-tokenizer \
    --repo_id "user/my-lerobot-dataset" \
    --action_horizon 10 \
    --encoded_dims "0:6" \
    --vocab_size 1024 \
    --scale 10.0 \
    --normalization_mode QUANTILES \
    --output_dir "./my_fast_tokenizer" \
    --push_to_hub true \
    --hub_repo_id "username/my-action-tokenizer"

주요 Tokenizer 매개변수

매개변수설명기본값
--repo_idLeRobot 데이터셋 저장소 ID필수
--action_horizon각 청크의 미래 동작 수10
--encoded_dims인코딩할 쉼표로 구분된 차원 범위 (예: "0:6,7:23")"0:6,7:23"
--vocab_sizeBPE 어휘 크기1024
--scale양자화를 위한 DCT 스케일링 계수10.0
--normalization_mode정규화 모드 (MEAN_STD, MIN_MAX, QUANTILES, QUANTILE10, IDENTITY)QUANTILES
--sample_fraction에피소드당 샘플링할 청크 비율0.1

사용

LeRobot에서 π₀-FAST를 사용하려면 정책 유형을 다음과 같이 지정하세요:

policy.type=pi0_fast

학습

π₀-FAST를 학습하려면 LeRobot 학습 스크립트를 사용할 수 있습니다:

lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi0_fast \
    --output_dir=./outputs/pi0fast_training \
    --job_name=pi0fast_training \
    --policy.pretrained_path=lerobot/pi0fast-base \
    --policy.dtype=bfloat16 \
    --policy.gradient_checkpointing=true \
    --policy.chunk_size=10 \
    --policy.n_action_steps=10 \
    --policy.max_action_tokens=256 \
    --steps=100000 \
    --batch_size=4 \
    --policy.device=cuda

주요 학습 매개변수

매개변수설명기본값
--policy.gradient_checkpointing=true학습 중 메모리 사용량을 크게 줄입니다false
--policy.dtype=bfloat16효율성을 위해 혼합 정밀도 학습 사용float32
--policy.chunk_size예측할 액션 스텝 수(액션 호라이즌)50
--policy.n_action_steps실행할 액션 단계 수50
--policy.max_action_tokens액션 청크당 최대 FAST 토큰 수256
--policy.action_tokenizer_name사용할 FAST 토크나이저lerobot/fast-action-tokenizer
--policy.compile_model=truetorch.compile를 활성화하여 더 빠른 학습false
--policy.optimizer_fused=truefused AdamW 사용; 재개 시 무시None

추론

빠른 추론을 위한 KV-Caching

π₀-FAST는 LLM 추론에서 널리 사용되는 최적화 기법인 KV-caching을 지원합니다. 이 기법은 어텐션 메커니즘의 키-밸류 쌍을 캐시에 저장하여 오토레그레시브 디코딩 과정에서의 중복 계산을 방지합니다.

# KV-caching is enabled by default
policy.use_kv_cache=true

추론 예시

from lerobot.policies.pi0_fast import PI0FastPolicy, PI0FastConfig

# Load the policy
policy = PI0FastPolicy.from_pretrained("your-model-path")

# During inference
actions = policy.predict_action_chunk(batch)

모델 아키텍처

π₀-FAST는 PaliGemma 기반 아키텍처를 사용합니다:

  • Vision Encoder: 이미지 이해를 위한 SigLIP 비전 타워
  • Language Model: 언어 지시사항을 처리하고 액션 토큰을 예측하는 Gemma 2B

모델은 이미지, 텍스트 명령, 로봇 상태를 입력으로 받아 이산 FAST 토큰을 출력하고, 이 토큰은 다시 연속 동작으로 디코딩됩니다.

구성 옵션

매개변수설명기본값
paligemma_variantVLM 백본 변형 (gemma_300m, gemma_2b)gemma_2b
max_state_dim최대 상태 벡터 차원(패딩됨)32
max_action_dim최대 액션 벡터 차원(패딩됨)32
temperature샘플링 온도 (그리디의 경우 0.0)0.0
max_decoding_steps최대 디코딩 단계256
use_kv_cache추론 속도를 높이기 위해 KV 캐싱 활성화true

π₀와의 비교

기능π₀π₀-FAST
액션 표현Flow Matching (확산)자기회귀 토큰(FAST)
학습 속도1x5배 빠름
민첩성높음높음
추론 방법반복적 노이즈 제거자기 회귀 디코딩
KV 캐싱N/A지원

π₀Fast 결과 재현

LeRobot 구현을 사용하여 LIBERO 벤치마크에서 π₀Fast의 결과를 재현합니다. LeRobot PiFast 기반 모델 lerobot/pi0fast-base를 가져와 HuggingFace LIBERO dataset을 사용하여 bfloat16으로, 배치 크기 256, 8개의 H100 GPU에서 추가로 40k 스텝 동안 파인튜닝합니다.

여기에서 fine-tuned된 모델을 찾을 수 있습니다:

다음 학습 명령을 사용하여

lerobot-train \
  --dataset.repo_id=lerobot/libero \
  --output_dir=outputs/libero_pi0fast \
  --job_name=libero_pi0fast \
  --policy.path=lerobot/pi0fast-base \
  --policy.dtype=bfloat16 \
  --steps=100000 \
  --save_freq=20000 \
  --batch_size=4 \
  --policy.device=cuda \
  --policy.scheduler_warmup_steps=4000 \
  --policy.scheduler_decay_steps=100000 \
  --policy.scheduler_decay_lr=1e-5 \
  --policy.gradient_checkpointing=true \
  --policy.chunk_size=10 \
  --policy.n_action_steps=10 \
  --policy.max_action_tokens=256 \
  --policy.empty_cameras=1

이후 다음 명령을 실행하여 LeRobot LIBERO 구현으로 fine-tuned 모델을 평가합니다:

tasks="libero_object,libero_spatial,libero_goal,libero_10"
lerobot-eval \
  --policy.path=lerobot/pi0fast-libero \
  --policy.max_action_tokens=256 \
  --env.type=libero \
  --policy.gradient_checkpointing=false \
  --env.task=${tasks} \
  --eval.batch_size=1 \
  --eval.n_episodes=1 \
  --rename_map='{"observation.images.image":"observation.images.base_0_rgb","observation.images.image2":"observation.images.left_wrist_0_rgb"}'

참고: 원본 OpenPI 구현과 유사하게 n_action_steps=10으로 설정했습니다.

결과

LIBERO 벤치마크에서 다음 결과를 얻습니다:

모델LIBERO SpatialLIBERO ObjectLIBERO 목표LIBERO 10평균
π₀-fast70.0100.0100.060.082.5

비디오를 포함한 전체 평가 출력 폴더는 여기에서 확인할 수 있습니다.

라이선스

이 모델은 원래의 OpenPI 저장소와 일치하는 Apache 2.0 라이선스를 따릅니다.

참고

Update on GitHub