LeRobot documentation
FineART-VLA
FineART-VLA
FineART-VLA는 LeRobot의 Pi05 정책을 통해 Physical Intelligence의 π0.5와 그 openpi 구현을 기반으로 구축되었습니다. 이 기반 위에 학습 가능한 PaliGemma 언어 헤드를 추가하고, 언어 생성과 동작 생성을 번갈아 수행하는 런타임을 제공합니다. 단일 체크포인트로 저수위 서브태스크를 예측하고, 선택적으로 메모리를 업데이트하거나 시각적 질문에 답할 수 있으며, 해당 텍스트를 조건으로 하여 flow-matching 동작 전문가를 제어할 수 있습니다.
작업 조건부 액션만 필요한 경우 Pi05를 사용하세요. 롤아웃 중에 정책이 중간 언어를 생성하거나 소비해야 하는 경우 FineART-VLA를 사용하세요.
FineART-VLA와 Pi05의 차이점
| 기능 | Pi05 | FineART-VLA |
|---|---|---|
| 액션 모델 | PaliGemma 비전-언어 프리픽스 + Gemma 액션 전문가 | 동일한 기본 아키텍처 |
| 언어 헤드 | 런타임 생성을 위해 학습되지 않음 | 텍스트 교차 엔트로피로 다시 활성화하고 학습 |
| 액션 조건화 | 에피소드 작업 | 활성화된 저레벨 서브태스크 및 정규화된 로봇 상태 |
| 학습 대상 | Flow-matching actions | Flow actions, 레시피에서 선택된 텍스트, 선택적 FAST action 토큰 |
| 데이터셋 요구 사항 | 표준 이미지, 상태, 동작 및 작업 | 모든 언어 기능 학습에 필요한 언어 어노테이션을 포함하여 동일한 필드 |
| 롤아웃 | 직접적인 작업-행동 정책 | 계층적 작업 → 하위 작업 → 동작 루프, 선택적 메모리 및 VQA |
FineART-VLA는 Pi05 체크포인트에서 초기화할 수 있습니다. 정책 아키텍처는 호환성을 유지하지만, FineART-VLA는 자체 프로세서를 구축하여 레시피 라벨과 FAST 라벨이 Pi05 프로세서 스택에 의해 조용히 대체되지 않도록 합니다.
설치
FineART-VLA의 종속성을 포함하여 LeRobot을 설치합니다:
git clone https://github.com/huggingface/lerobot.git
cd lerobot
python -m venv .venv
source .venv/bin/activate
pip install -e ".[fineart_vla]"fineart_vla 추가 항목에는 PaliGemma/FAST 의존성이 포함됩니다. CUDA GPU가 있는 Linux 환경에서 선택적 융합 학습 커널을 사용하려면 대신 ".[fineart_vla_kernels]"을 설치하세요. 이 항목은 liger-kernel과 FlashRT 백엔드에서 사용하는 Hugging Face kernels 패키지를 추가합니다. Liger는 --policy.use_liger_kernels=true로 선택적으로 활성화되며, 프로세스 전체에 걸쳐 transformers의 PaliGemma RoPE/GeGLU를 패치하므로, 같은 프로세스에서 로드된 다른 PaliGemma 기반 정책도 융합 커널로 실행됩니다.
언어 주석이 포함된 데이터 준비
FineART-VLA는 학습 중에 일반적인 LeRobot 데이터셋에서 감독된 서브태스크를 추론하지 않습니다. 데이터셋에는 선택된 레시피에서 사용되는 언어 타겟이 선택적 language_persistent 및 language_events 열에 포함되어 있어야 합니다.
최소한 연속적인 subtask 타임라인을 주석 처리하여 각 학습 프레임에 활성 상태의 저수준 명령이 있도록 하세요. 레시피가 해당 기능을 학습하는 경우에만 memory, VQA, 삽입어, 음성 주석을 추가하세요.
FineART-VLA는 EO-1과 마찬가지로 기본 레시피를 FineARTVLAConfig에 내장합니다. 30%는 고수준 작업 → 하위 작업 예측, 70%는 저수준 하위 작업 조건부 액션 학습으로 샘플링합니다. 각 구성은 자신의 레시피 사전(dictionary)을 소유하며, 저장된 체크포인트는 해당 사전을 추론(inference)으로 전달합니다.
기본값을 덮어쓰려면 --policy.recipe_path=/path/to/custom.yaml을 사용하세요.
src/lerobot/configs/recipes/에 있는 공유 레시피는 main의 의미를 유지하며,
FineART-VLA는 이를 대체하지 않습니다. 목표만 학습하려면 ${task}를 포함하는
하위 레벨 사용자 메시지 하나를 가진 인라인 레시피를 사용하거나, recipe=None을 설정하고
일반적인 PI05 파이프라인에 대해 텍스트/FAST 손실을 비활성화하세요.
기본적으로 추론은 π(a|o, subtask)·π(subtask|o, task)로 분해됩니다. 사용자 정의 joint-sequence 레시피에는 학습 시와 동일한 causal mark로 task와 생성된 assistant span을 렌더링하는 런타임 프로세서가 필요합니다. 기존의 policy-side joint prompt builder는 더 이상 rollout에서 사용되지 않습니다.
Rollout은 계획 주기(--autosteer_interval_s=3), 인터랙티브 명령, 동기화/RTC 스케줄링을 담당합니다. FineART-VLA는 쿼리가 있을 때만 텍스트를 생성하며, 일반적인 액션 호출은 런타임의 인지 없이 다른 서브태스크를 생성하지 않습니다.
통합 메모리/서브태스크 스크래치패드는 기본 설정이 아니며, 사용자 정의 레시피와 메모리 인식 런타임 컨트롤러가 필요합니다. 일반적인 서브태스크 생성에는 memory_scratchpad=false를 유지하세요. 이전 스크래치패드 체크포인트는 통합된 응답을 액션 컨트롤에 직접 전달하는 것을 방지하기 위한 명시적인 가드를 유지합니다.
lerobot-annotate를 사용하여 해당 컬럼을 생성합니다. 저장소에는 소스 및 대상 데이터셋에 맞게 수정할 수 있는 Hugging Face Jobs 런처가 포함되어 있습니다. 로컬에서 어노테이션을 실행하려면 먼저 pip install -e ".[annotations]"을 설치합니다:
HF_TOKEN=hf_... uv run python examples/annotations/run_hf_job.py
긴 학습 실행 전에 여러 에피소드를 검사하여 서브태스크가 시간적으로 정확하고 전체 데모를 커버하는지 확인하세요. 생성 및 검증은 주석 파이프라인을, 스키마 및 레시피 리졸버는 언어 컬럼 및 레시피를 참고하세요.
If a dataset has no language columns, recipe rendering becomes a no-op and FineART-VLA falls back to the plain Pi05 prompt path. This is useful for compatibility but does not train the language planner.
FineART-VLA 학습
이 예제는 FineART에서 중간 학습되어 자신의 다음 하위 작업을 예측하도록 학습된 체크포인트인 lerobot/fineart_vla_base에서 FineART-VLA를 초기화하고, 내장된 70/30 하위 작업 레시피를 학습합니다. --policy.path는 기본 체크포인트 자체의 구성을 로드하므로, 미세 조정 시 FAST 토큰 레이아웃(fast_skip_tokens)과 기본 모델이 학습에 사용된 레시피가 유지됩니다. 다른 --policy.* 플래그는 이를 오버라이드합니다.
lerobot-train \
--dataset.repo_id=${HF_USER}/my_language_annotated_dataset \
--policy.path=lerobot/fineart_vla_base \
--policy.tokenizer_max_length=256 \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.freeze_vision_encoder=false \
--policy.gradient_checkpointing=true \
--batch_size=8 \
--steps=30000 \
--output_dir=outputs/fineart_vla \
--job_name=fineart_vla \
--trackio.enable=true작은 실행으로 시작하여 Trackio 대시보드에서 손실이 예상대로 동작하는지 확인한 후 규모를 확장하세요.
순수한 PI0.5 체크포인트에서 시작하려면, FineART-VLA의 기본 구성을 유지하고 --policy.pretrained_path를 해당 체크포인트로 지정하십시오: --policy.type=fineart_vla --policy.pretrained_path=lerobot/pi05_base. OpenPI 형식의 가중치는 로드 시 변환되며, 텍스트 및 FAST 손실은 FineART 중간 학습이 아닌 PaliGemma의 언어 헤드에서 시작됩니다.
주요 학습 제어
| 옵션 | 기본값 | 목적 |
|---|---|---|
policy.recipe_path | None | 임베디드 70/30 서브태스크 레시피의 선택적 오버라이드 |
policy.text_loss_weight | 1.0 | Language-head 교차 엔트로피 가중치; 0은 텍스트 학습을 비활성화합니다 |
policy.flow_loss_weight | 10.0 | 연속 동작 플로우-로스 가중치 |
policy.enable_fast_action_loss | true | FAST 액션 토큰에 대한 이산(supervision)을 추가합니다 |
policy.fast_action_loss_weight | 1.0 | FAST 교차 엔트로피 가중치 |
policy.knowledge_insulation | true | VLM K/V 경로를 통해 action-loss 기울기를 차단합니다 |
policy.flow_num_repeats | 5 | 독립적인 노이즈 제거 대상에 대해 하나의 VLM 접두사를 재사용합니다 |
policy.lm_head_lr_scale | 1.0 | 언어 헤드 학습률을 조절합니다. 1.0은 기본 학습률을 사용합니다 |
policy.fast_skip_tokens | 1152 | FAST id 오프셋; <seg>+<loc>를 건너뛰어 VQA와 FAST가 충돌하지 않도록 합니다 |
fast_skip_tokens=1152는 FAST 코드를 PaliGemma의 <loc> 범위 아래에 배치합니다.
openpi의 pi0-FAST 규약은 128입니다(FAST가 <loc> id를 차지함). 해당 값을 사용하는 것은 그렇게 학습된 체크포인트와 가중치 호환성을 유지하기 위한 것이며, <loc> 대상이 FAST 코드와 임베딩 행을 공유하게 되는 VQA 레시피와 함께 사용하는 것은 피해야 합니다.
손실 가중치는 시작점일 뿐, 데이터셋에 독립적인 상수가 아닙니다. 플로우 손실과 텍스트/FAST 손실을 별도로 추적하고, 총 손실만으로 체크포인트를 선택하는 대신 생성된 서브태스크를 검사하세요.
데이터셋별 FAST 토크나이저
기본적으로 (--policy.auto_fit_fast_tokenizer=true) 학습은 --policy.action_tokenizer_name를 시작점으로 하여 학습 데이터셋에 FAST 토크나이저를 적합(fit)하고, --policy.fast_tokenizer_cache_dir에 이를 캐시합니다. lerobot/fineart_vla_base와 같은 체크포인트에서 파인튜닝을 수행하는 경우에도 동일하게 적용되어, FAST 타깃이 새로운 로봇의 액션 분포와 일치하도록 합니다. 적합된 토크나이저는 체크포인트의 프로세서 아티팩트 내에 저장되므로 추론 시 이를 재사용합니다. action_tokenizer_name을 변경 없이 사용하려면 --policy.auto_fit_fast_tokenizer=false를 설정하세요.
학습 성능
FineART-VLA는 기본적으로 최적화된 학습 경로를 사용합니다:
- Python에서 작은 연산을 반복 실행하는 대신, batches를 반복하여 flow targets와 suffix projections를 처리합니다;
- caches 상수 action masks를 캐시하고 forward마다 RoPE 위치를 한 번만 계산합니다;
- selects는 대상 형상과 희소성을 기준으로 텍스트/FAST 크로스 엔트로피 구현을 선택합니다;
- 지식 격리, 플로우 전용 배치에서 수학적으로 불필요한 VLM/비전 역전파를 건너뜁니다;
- gradient checkpointing이 활성화된 경우 네이티브 non-reentrant SigLIP 레이어 checkpointing을 사용하며
- Liger RoPE/GeGLU 커널을 유지하면서 SigLIP 형식에서 더 느린 LayerNorm 패치를 피합니다.
선택적 학습 백엔드는 기본적으로 비활성화되어 있습니다:
| 옵션 | 시도해 볼 때 |
|---|---|
policy.use_flashrt_adarms=true | 지원되는 CUDA GPU에서 융합된 적응형 RMSNorm 및 게이트된 잔차 |
policy.use_compiled_text_ce=true | 컴파일된 materialized-logit CE 버킷 |
policy.use_compiled_vision=true | 비전 패스에 그라디언트가 없는 경우에만 컴파일된 비전을 사용 |
policy.use_flex_attention=true | 지식 격리(knowledge insulation)를 적용하고 flow_num_repeats > 1인 프로파일링된 CUDA 설정; 그렇지 않으면 SDPA가 사용됩니다 |
policy.use_manual_attention=true | 물리적 메모리에 할당된 어텐션이 더 빠른 것으로 명시적으로 프로파일링된 형태 |
policy.manual_attention_scope=action | 수동 attention을 action query로 제한합니다 |
모든 백엔드를 무분별하게 활성화하지 마세요. Flex와 수동 attention은 상호 배타적이며, attention/AdaRMS 대안은 지식 격리가 필요합니다. 벤치마크에서 가장 우수한 성능을 보인 구성은 컴파일된 텍스트 CE와 FlashRT AdaRMS를 사용했으며, Flex/수동 attention과 컴파일된 비전은 비활성화되어 있었습니다.
추론 성능
FineART-VLA에는 두 가지 추론 루프가 있으며, 둘 다 비용이 높은 멀티모달 프리픽스를 반복적으로 인코딩하는 것을 피합니다:
- Action denoising은 이미지/언어 접두사를 한 번만 인코딩하고, flow 단계 간에 해당 KV 캐시를 재사용하며, 디바이스에서 action 접미사 마스크를 구성하고, 접두사 캐시를 복제하는 대신 임시 접미사 K/V를 잘라냅니다. 이 구현은 각 chunk마다 디바이스에서 timestep 스케줄을 한 번만 생성하여, 기존의 timestep 산술을 유지합니다. 이 구현 세부 사항은 벤치마킹 없이는 end-to-end 속도 향상을 입증하지 않습니다.
- Language decoding은 자기회귀 KV 캐싱을 사용하므로, 각 새로운 토큰은 전체 접두사를 다시 실행하는 대신 캐시된 이미지/언어 키와 샘플링된 토큰만 처리합니다.
공유 런타임은 언어와 액션을 서로 다른 속도로 실행합니다. 하위 작업이 더 오래 유효한 경우 --autosteer_interval_s 값을 늘리거나, 언어 생성 없이 지시를 직접 제공하려면 /subtask를 사용하세요. 간격을 늘리면 생성 비용은 줄지만 재계획 속도도 느려집니다.
체크포인트 실행
체크포인트와 일치하는 로봇/카메라 구성으로 lerobot-rollout를 실행하고, --interactive=true 및 --autosteer_interval_s=3를 지정하세요. --inference.type=sync 또는 --inference.type=rtc를 선택합니다. 인터랙티브 터미널에서 /autosteer <goal>는 생성된 서브태스크를 활성화하고, /subtask <instruction>은 하나를 수동으로 제공하며, /start는 로봇 제어를 시작합니다. 완전한 하드웨어 설정, 안전 동작 및 녹화 제어에 대해서는 인터랙티브 언어 제어를 참조하세요. 이전의 --sim, --mode, --high_level_hz 어댑터 CLI 옵션은 이 인터페이스의 일부가 아닙니다.
문제 해결
- 큰 flow-loss 기울기: FineART-VLA는 PyTorch SDPA의 math 백엔드에서 FP32 attention 연산을 사용하여 KI-off joint prefix/action attention을 실행하며, 그 출력을 모델 dtype으로 다시 변환합니다(기본 PI0.5는 eager attention을 유지합니다). 이는 큰 query/key 활성화 값이 있는 낮은 flow timestep에서 기울기를 불안정하게 만들 수 있는 정밀도 감소된 attention을 방지합니다. 기존 체크포인트와 정규화 레이어는 변경되지 않으며, KI-off는 여전히 VLM의 keys와 values를 통해 학습합니다. 유한한 총 손실만 의존하기보다는
flow_loss,text_loss및 클리핑 전 기울기 노름을 별도로 모니터링하세요. - 텍스트 손실 또는 생성된 하위 작업이 없는 경우: 선택한 레시피가 샘플링된 프레임의 주석을 바인딩할 수 있는지, 그리고
policy.text_loss_weight > 0인지 확인하세요. - 하위 작업은 그럴듯해 보이지만 동작이 실패하는 경우: 하위 작업 경계, 정규화된 상태/동작 통계, 그리고 저레벨 레시피 샘플이 존재하는지 확인하세요.
- 텍스트가 반복 토큰이나 위치 토큰으로 수렴하는 경우: 텍스트 대상 커버리지, 언어 헤드 학습률, 그리고 flow, FAST, 텍스트 손실 간의 균형을 확인하세요.
- 메모리 부족: 먼저 배치 크기를 줄이고, 그 다음에 그래디언트 체크포인트링을 활성화하세요. 카메라 수에 대해 메모리를 프로파일링하지 않고 컴파일된 또는 대안 어텐션 백엔드를 활성화하지 마세요.
- 느린 롤아웃: 액션 지연 시간과 언어 지연 시간을 분리한 후,
--autosteer_interval_s(새로운 서브태스크가 생성되는 주기)과--policy.num_inference_steps(플로우 디노이징 단계 수)를 조정합니다.
인용
FineART-VLA 또는 FineART 데이터셋을 사용하신 경우, 다음을 인용해 주세요:
@misc{choghari2026fineart,
title = {FineART: Fine-Grained Annotated Robotic Trajectory Dataset and Vision-Language-Action Model for Bimanual Manipulation},
author = {Choghari, Jade and Kooijmans, Pepijn and Agarwal, Mansi and Ciftci, Yusuf Umut and Doriwala, Aseem and Weaver, Catherine and Sivapurapu, Mouli and Yang, Kai and Lee, Jackson and Wolf, Thomas and Mannam, Pragna},
year = {2026},
}FineART-VLA는 Physical Intelligence의 π₀.₅와 knowledge insulation을 기반으로 구축되었습니다.
라이선스
이 모델은 PI0.5 백본이 기반을 둔 원래 OpenPI 저장소와 일치하는 Apache 2.0 라이선스를 따릅니다.
Update on GitHub