LeRobot documentation
X-VLA: 모든 로봇, 모든 작업을 위한 최초의 소프트 프롬프트 기반 로봇 파운데이션 모델
X-VLA: 모든 로봇, 모든 작업을 위한 최초의 소프트 프롬프트 기반 로봇 파운데이션 모델
개요
수년간 로봇공학은 자연어 지시를 따르고 다양한 환경과 로봇 본체에서 능숙하게 작동하는 에이전트를 구축하는 것을 목표로 해왔습니다. LLM과 VLM의 최근 돌파구는 전방의 길을 제시합니다. 이러한 파운데이션 모델 아키텍처를 액션에 기반을 두어 임바디드 컨트롤로 확장하는 것입니다. 이를 통해 Vision-Language-Action(VLA) 모델의 부상이 촉발되었으며, 하나의 범용 모델이 광범위한 의미론적 이해와 견고한 조작 기술을 결합할 수 있기를 기대하고 있습니다.
그러나 이러한 모델을 학습시키는 것은 어렵습니다. 로봇 데이터는 플랫폼, 센서, 에임보디먼트, 수집 프로토콜에 걸쳐 파편화되어 있습니다. 이질성이 모든 곳에 나타납니다: 서로 다른 팔 구성, 서로 다른 액션 공간, 서로 다른 카메라 설정, 서로 다른 시각적 도메인, 서로 다른 작업 분포. 이러한 불일치는 사전 학습을 불안정하게 만들고 적응을 신뢰할 수 없게 만드는 주요 분포 시프트를 초래합니다.
메타러닝과 프롬 러닝에서 영감을 받아, 우리는 다음과 같은 질문을 던집니다. “VLA 모델이 LLM이 프롬을 통해 작업을 학습하는 것과 동일한 방식으로 각 로봇과 데이터셋의 구조를 학습할 수 있다면?”
X-VLA는 각 하드웨어 구성을 “작업”으로 간주하고, 학습 가능한 임베딩의 작은 집합으로 이를 인코딩하는 소프트 프롬프트 기반의 플로우 매칭 VLA 프레임워크입니다. 이러한 Soft Prompts는 에임보디먼트 및 도메인 특이적 변이를 포착하여, 멀티모달 융합의 가장 초기 단계부터 Transformer를 유도합니다. 이 메커니즘을 통해 X-VLA는 다양한 로봇 형태, 데이터 유형, 센서 구성을 단일 통합 아키텍처 내에서 조화롭게 처리할 수 있습니다.

순수 Transformer 인코더로 구성된 X-VLA는 모델 규모와 데이터셋 다양성에 따라 자연스럽게 확장됩니다. 6개의 시뮬레이션 벤치마크와 3개의 실제 로봇에 걸쳐, Soft Prompts는 하드웨어 및 도메인 차이를 처리하는 데 있어 기존 방법들을 일관되게 능가합니다. 7가지 로봇 플랫폼에 걸친 290K 에피소드로 학습된 X-VLA-0.9B는 Phase I에서 embodiment-agnostic한 범용 정책을 학습하고, Phase II에서는 백본을 동결한 채 새로운 프롬프트 집합만 학습함으로써 새로운 로봇에 효율적으로 적응합니다.

파라미터의 1%만 튜닝(9M)했음에도 불구하고, X-VLA-0.9B는 학습 가능한 파라미터가 300배 적은 상태에서도 LIBERO와 Simpler-WidowX에서 π₀에 근접한 성능을 달성합니다. 또한 2분 이내에 옷감을 접는 작업 등 최소한의 데모만으로도 실제 환경에서 뛰어난 민첩성을 보여줍니다.

X-VLA는 범용 로봇 지능을 위해 점점 더 복잡한 아키텍처가 필요하지 않으며, 이질성을 흡수하는 올바른 방식만 있으면 된다는 것을 보여줍니다. Soft Prompts는 다양한 로봇 데이터를 통합하기 위한 단순하고 확장 가능한 메커니즘을 제공하여, 적응력이 높고 크로스 연보디먼트(cross-embodiment)를 지원하는 로봇 파운데이션 모델로의 길을 열었습니다.
설치
LeRobot 설치 후 X-VLA의 종속성을 설치합니다:
pip install -e ".[xvla]"pip install lerobot 대신 PyPI에서 LeRobot을 설치한 경우:
pip install 'lerobot[xvla]'빠른 시작
기본 사용법
LeRobot 구성에서 X-VLA를 사용하려면 정책 유형을 다음과 같이 지정하세요:
policy.type=xvla
사전 학습된 체크포인트 평가
LIBERO를 사용한 평가 예시:
lerobot-eval \
--policy.path="lerobot/xvla-libero" \
--env.type=libero \
--env.task=libero_spatial,libero_goal,libero_10 \
--env.control_mode=absolute \
--eval.batch_size=1 \
--eval.n_episodes=1 \
--env.episode_length=800 \
--seed=142사용 가능한 체크포인트
🎯 베이스 모델
신중하게 설계된 데이터 처리 및 학습 레시피로 학습된 0.9B 파라미터의 X-VLA 인스턴스입니다. 학습 파이프라인은 두 단계로 구성됩니다:
Phase I: Pretraining - Droid, Robomind, Agibot의 290K 에피소드로 사전 학습했으며, 5가지 유형의 로봇 암(단일 암부터 양수 구성까지)에 걸친 7개 플랫폼을 포함합니다. 소프트 프롬프트를 활용하여 에피소드별 변이를 흡수함으로써, 모델은 에피소드에 무관한 범용 정책을 학습합니다.
Phase II: Domain Adaptation - 대상 도메인에 배포 가능한 정책으로 적응합니다. 새로운 소프트 프롬프트 세트를 도입하여 새로운 도메인의 하드웨어 구성을 인코딩하도록 최적화하는 동안, 사전 학습된 백본은 동결된 상태로 유지됩니다.
시뮬레이션 체크포인트
LIBERO 벤치마크에서 93%의 성공률을 달성합니다. 시뮬레이션 작업을 위해 기본 모델에서 파인튜닝되었습니다.
BridgeData로 fine-tuning하여 컴팩트한 WidowX 플랫폼에서 pick-and-place 실험을 수행했습니다. 견고한 조작 능력을 입증합니다.
🤖 실제 환경 체크포인트
고품질 Soft-FOLD 옷 접기 데이터셋으로 학습된 미세 조정된 민첩한 조작 모델입니다. 2시간 연속 옷 접기 작업에서 100%의 성공률을 달성합니다.
AgileX 로봇의 민첩한 조작 작업에 최적화되었습니다.
Google Robot 플랫폼에 맞게 조정되었습니다.
Training X-VLA
권장 학습 구성
새로운 embodiment 또는 작업을 위해 X-VLA를 fine-tuning할 때, VLM을 freeze하지 않는 것을 권장하며, OOM 오류를 방지하기 위해 policy.dtype=bfloat16를 설정하세요.
lerobot-train \
--dataset.repo_id=YOUR_DATASET \
--output_dir=./outputs/xvla_training \
--job_name=xvla_training \
--policy.path="lerobot/xvla-base" \
--policy.repo_id="HF_USER/xvla-your-robot" \
--policy.dtype=bfloat16 \
--policy.action_mode=auto \
--steps=20000 \
--policy.device=cuda \
--policy.freeze_vision_encoder=false \
--policy.freeze_language_encoder=false \
--policy.train_policy_transformer=true \
--policy.train_soft_prompts=true학습 매개변수 설명
| 매개변수 | 기본값 | 설명 |
|---|---|---|
freeze_vision_encoder | false | VLM 비전 인코더의 가중치를 동결하지 마세요 |
freeze_language_encoder | false | VLM 언어 인코더의 가중치를 동결하지 마세요 |
train_policy_transformer | true | policy transformer 레이어의 학습을 허용 |
train_soft_prompts | true | 소프트 프롬프트 학습 허용 |
💡 모범 사례: Phase II에서 새로운 embodiment로 적응할 때는 VLM 인코더를 동결하지 말고, 정책 트랜스포머와 소프트 프롬프트도 함께 학습하세요.
예: 양팔 로봇에서 학습
lerobot-train \
--dataset.repo_id=<USER>/bimanual-so100-handover-cube \
--output_dir=./outputs/xvla_bimanual \
--job_name=xvla_so101_training \
--policy.path="lerobot/xvla-base" \
--policy.dtype=bfloat16 \
--policy.repo_id="YOUR_USERNAME/xvla-biso101" \
--steps=3000 \
--policy.device=cuda \
--policy.action_mode=so101_bimanual \
--policy.freeze_vision_encoder=false \
--policy.freeze_language_encoder=false \
--policy.train_policy_transformer=true \
--policy.train_soft_prompts=true💡 최적의 성능: 충분한 컴퓨팅 리소스가 있고 X-VLA 파인튜닝의 최적 성능을 달성하려면 공식 파인튜닝 전략을 따라야 합니다:
🔥 커스텀 학습률 스키ماً 모든 구성 요소 전체 파인튜닝
안정적인 최적화를 보장하기 위해, Vision-Language Model(VLM)은 기본 학습률의 1/10만 사용하여 학습해야 하며, 나머지 모든 구성 요소는 전체 학습률을 사용합니다. 이 학습률 비율은 강력하고 안정적인 finetuning 성능을 달성하는 데 매우 중요합니다. 기본적으로 이미 이렇게 설정되어 있습니다. ❕참고
공식 보고된 성능을 완전히 일치시키려면 soft-prompts에 대한 추가적인 warm-up LR schedule이 필요할 수 있으며, 이를 통해 소폭의 성능 향상을 기대할 수 있습니다. 최적의 결과를 얻기 위해 사용자 정의 학습 파이프라인에 이를 구현하도록 권장합니다.
핵심 개념
1. 액션 모드
X-VLA는 Action Registry 시스템을 사용하여 다양한 액션 공간과 embodiments를 처리합니다. action_mode 파라미터는 액션이 처리되는 방식, 사용되는 손실 함수, 그리고 예측값의 후처리 방식을 정의합니다.
사용 가능한 액션 모드
| 액션 모드 | 액션 Dim | 설명 | 사용 사례 |
|---|---|---|---|
ee6d | 20 | xyz, 6D 회전, 그리퍼를 가진 엔드 이펙터 | 공간 제어가 가능한 듀얼 암 구성 |
joint | 14 | 그리퍼를 사용한 조인트 공간 | 직접 관절 제어 로봇 |
agibot_ee6d | 20 | MSE 손실을 사용하는 AGI-bot 변형 | AGI-bot 플랫폼 |
so101_bimanual | 20 (모델), 12 (실제) | SO101 양팔 로봇 | 양손 조작 작업 |
auto | 20 (모델), auto (실제) | dataset에서 action dim을 자동으로 감지합니다 | 새 로봇에 권장 |
액션 모드가 중요한 이유
action_dim=20로 학습된 lerobot/xvla-base와 같은 사전 학습된 체크포인트가 있고, 다른 액션 차원(예: 양팔 로봇의 경우 14)을 가진 데이터셋으로 학습을 진행하려는 경우, 액션 차원을 단순히 잘라낼 수 없습니다. 액션 모드는 다음을 조정합니다:
- 손실 계산: 각 동작 구성 요소에 대해 다른 손실 함수 사용(관절은 MSE, 그립퍼는 BCE 등)
- 전처리: 그리퍼 채널 제로화, 차원 패딩
- 후처리: gripper logits에 sigmoid 적용, padding 제거
예: BimanualSO101 Action Space
so101_bimanual 액션 모드는 모델 출력(20D)과 실제 로봇 제어(12D) 간의 불일치를 처리합니다:
# Model outputs 20 dimensions for compatibility
dim_action = 20
# Real robot only needs 12 dimensions
# [left_arm (6), right_arm (6)] = [joints (5) + gripper (1)] × 2
REAL_DIM = 12
# Preprocessing: Pad 12D actions to 20D for training
# Postprocessing: Trim 20D predictions to 12D for deployment자세한 내용은 action_hub.py 구현을 참고하세요.
자동 액션 모드(권장)
auto 액션 모드는 어떤 로봇이든 X-VLA를 사용하는 가장 쉬운 방법입니다. 데이터셋의 액션 차원을 자동으로 감지하고 패딩/트림을 처리합니다:
lerobot-train \
--policy.path="lerobot/xvla-base" \
--policy.action_mode=auto \
--policy.max_action_dim=20 \
...동작 방식:
- 데이터셋에서
action_feature.shape[-1]을 읽습니다(예: Franka의 경우 7) - 모델 출력은 사전 학습된 모델과의 호환성을 위해
max_action_dim(기본값 20)을 생성합니다 - 손실은 실제 차원에 대해서만 계산됩니다:
MSE(pred[:,:,:real_dim], target[:,:,:real_dim]) - Postprocess는 로봇 제어를 위해 출력을
real_dim으로 잘라냅니다
이것은 대부분의 로봇에 대해 커스텀 액션 모드를 생성할 필요가 없도록 합니다.
2. 도메인 ID
Domain ID는 서로 다른 로봇 구성과 카메라 설정을 위한 학습 가능한 식별자입니다. 이를 통해 X-VLA는 다음을 구별할 수 있습니다:
- 다른 로봇들 (로봇 1 대 로봇 2)
- 다른 카메라 구성(cam1 vs cam2)
- Robot1-cam1-cam2와 Robot1-cam1, Robot2-cam1 등 서로 다른 조합
도메인 ID 설정
학습 중: 기본적으로 일반 학습을 위해 domain_id가 0으로 설정됩니다.
평가 중: 체크포인트의 학습 구성과 일치하는 domain_id를 지정합니다.
# Example: LIBERO checkpoint uses domain_id=3
domain_id = 3The domain_id is automatically added to observations by the XVLAAddDomainIdProcessorStep in the preprocessing pipeline.
lerobot/xvla-base 모델은 다음 도메인 ID로 학습되었습니다. 로봇/구성과 가장 유사한 것을 선택하는 것이 좋습니다:
Fine-tuning 데이터셋
| 데이터셋 이름 | 도메인 ID |
|---|---|
| Bridge | 0 |
| RT1 | 1 |
| Calvin | 2 |
| libero | 3 |
| widowx-air | 4 |
| AIR-AGILEX-HQ | 5 |
| robotwin2_abs_ee | 6 |
| robotwin2_clean | 6 |
| robocasa-human | 7 |
| VLABench | 8 |
| AGIBOT-challenge | 9 |
| AIR-AGILEX | 10 |
| AIRBOT | 18 |
3. Processor 단계
X-VLA는 적절한 작동을 위해 특정 전처리 및 후처리 단계가 필요합니다.
필수 전처리 단계
- XVLAImageToFloatProcessorStep: 이미지를 [0, 255] 범위에서 [0, 1] 범위로 변환
- XVLAImageNetNormalizeProcessorStep: ImageNet 정규화를 적용합니다 (VLM 백본에 필수)
- XVLAAddDomainIdProcessorStep: 관측값에 domain_id를 추가합니다
사용자 정의 프로세서 예시
LIBERO 환경의 경우, 커스텀 프로세서가 특정 관찰 형식을 처리합니다:
from lerobot.policies.xvla.processor_xvla import LiberoProcessorStep
processor = LiberoProcessorStep()
# Handles robot_state dictionary, converts rotation matrices to 6D representation
# Applies 180° image rotation for camera convention4. 구성 매개변수
X-VLA의 주요 구성 매개변수:
# Observation and action
n_obs_steps: int = 1 # Number of observation timesteps
chunk_size: int = 32 # Action sequence length
n_action_steps: int = 32 # Number of action steps to execute
# Model architecture
hidden_size: int = 1024 # Transformer hidden dimension
depth: int = 24 # Number of transformer layers
num_heads: int = 16 # Number of attention heads
num_domains: int = 30 # Maximum number of domain IDs
len_soft_prompts: int = 32 # Length of soft prompt embeddings
# Action space
action_mode: str = "ee6d" # Action space type (use "auto" for auto-detection)
use_proprio: bool = True # Use proprioceptive state
max_state_dim: int = 32 # Maximum state dimension
max_action_dim: int = 20 # Max action dim for padding (used by "auto" mode)
# Vision
num_image_views: int | None # Number of camera views
resize_imgs_with_padding: tuple[int, int] | None # Target image size with padding
# Training
num_denoising_steps: int = 10 # Flow matching denoising steps커스텀 액션 모드 만들기
로봇의 액션 공간이 고유한 경우, 커스텀 액션 모드를 만들 수 있습니다:
1단계: 액션 공간 정의하기
from lerobot.policies.xvla.action_hub import BaseActionSpace, register_action
import torch
import torch.nn as nn
@register_action("my_custom_robot")
class MyCustomActionSpace(BaseActionSpace):
"""Custom action space for my robot."""
dim_action = 15 # Your robot's action dimension
gripper_idx = (7, 14) # Gripper channel indices
def __init__(self):
super().__init__()
self.mse = nn.MSELoss()
self.bce = nn.BCEWithLogitsLoss()
def compute_loss(self, pred, target):
"""Define your loss computation."""
# Example: MSE for joints, BCE for grippers
joints_loss = self.mse(pred[:, :, :7], target[:, :, :7])
gripper_loss = self.bce(pred[:, :, self.gripper_idx],
target[:, :, self.gripper_idx])
return {
"joints_loss": joints_loss,
"gripper_loss": gripper_loss,
}
def preprocess(self, proprio, action, mode="train"):
"""Preprocess actions before training."""
# Example: Zero out grippers in proprioception
proprio_m = proprio.clone()
action_m = action.clone() if action is not None else None
proprio_m[..., self.gripper_idx] = 0.0
if action_m is not None:
action_m[..., self.gripper_idx] = 0.0
return proprio_m, action_m
def postprocess(self, action):
"""Post-process predictions for deployment."""
# Example: Apply sigmoid to gripper logits
action[..., self.gripper_idx] = torch.sigmoid(action[..., self.gripper_idx])
return action2단계: 사용자 지정 액션 모드 사용
lerobot-train \
--policy.action_mode=my_custom_robot \
--dataset.repo_id=YOUR_DATASET \
--policy.path="lerobot/xvla-base" \
...고급 주제
멀티 카메라 지원
X-VLA는 num_image_views 파라미터를 통해 여러 카메라 뷰를 지원합니다:
# Configure for 3 camera views
policy.num_image_views=3
# Add empty cameras if you have fewer physical cameras
policy.empty_cameras=1 # Adds 1 zero-padded camera view커스텀 전처리 파이프라인
환경에 맞는 사용자 지정 전처리 파이프라인을 생성합니다:
from lerobot.processor import PolicyProcessorPipeline
from lerobot.policies.xvla import (
XVLAImageToFloatProcessorStep,
XVLAImageNetNormalizeProcessorStep,
XVLAAddDomainIdProcessorStep,
)
# Build custom pipeline
preprocessor = PolicyProcessorPipeline(
steps=[
YourCustomProcessorStep(), # Your custom processing
XVLAImageToFloatProcessorStep(), # Required: convert to float
XVLAImageNetNormalizeProcessorStep(), # Required: ImageNet norm
XVLAAddDomainIdProcessorStep(domain_id=5), # Your domain ID
]
)다른 액션 차원 처리
데이터셋의 액션 차원이 사전 학습된 모델보다 적은 경우:
옵션 1 (권장): auto 액션 모드 사용
# Automatically detects your dataset's action dimension
# Works with any robot without custom code
policy.action_mode=auto
policy.max_action_dim=20 # Match pretrained model옵션 2: 내장 패딩이 포함된 사전 정의된 액션 모드 사용
# Model expects 20D, dataset has 12D
# Action mode handles padding internally
action_mode = "so101_bimanual" # Pads 12 → 20옵션 2: 차원을 명시적으로 매핑하는 사용자 정의 action 모드 생성
@register_action("my_mapped_action")
class MappedActionSpace(BaseActionSpace):
dim_action = 20
REAL_DIM = 12
def _pad_to_model_dim(self, x):
# Custom padding logic
...문제 해결
자주 발생하는 문제
문제: “Action 차원 불일치”
- 해결 방법:
action_mode가 로봇의 액션 공간과 일치하는지 확인하세요. 필요하면 사용자 정의 액션 모드를 생성하세요.
문제: “[0, 1] 범위를 벗어난 이미지 값”
- 해결 방법: 정규화 전에 이미지가
XVLAImageToFloatProcessorStep으로 전처리되도록 확인하세요.
문제: “도메인 ID를 찾을 수 없음”
- 해결 방법:
XVLAAddDomainIdProcessorStep이 올바른 domain_id와 함께 전처리 파이프라인에 포함되어 있는지 확인하세요.
문제: “새로운 embodiment에서 낮은 성공률”
- Solution:
- action_mode가 올바른지 확인하세요
- 소프트 프롬프트가 학습되고 있는지 확인합니다(
train_soft_prompts=True) - 적절한 전처리(ImageNet 정규화, domain_id)를 확인하세요
- 학습 단계 수를 늘려 보십시오
문제: “학습 중 메모리 부족”
- Solution:
chunk_size를 줄입니다(예: 32에서 16으로).- 그라디언트 체크포인트 활성화
- 배치 크기 줄이기
- 더 많은 구성 요소 고정
인용
연구에 X-VLA를 사용하신 경우, 다음을 인용해 주세요:
@article{zheng2025x,
title = {X-VLA: Soft-Prompted Transformer as Scalable Cross-Embodiment Vision-Language-Action Model},
author = {Zheng, Jinliang and Li, Jianxiong and Wang, Zhihao and Liu, Dongxiu and Kang, Xirui
and Feng, Yuchun and Zheng, Yinan and Zou, Jiayin and Chen, Yilun and Zeng, Jia and others},
journal = {arXiv preprint arXiv:2510.10274},
year = {2025}
}추가 자료
기여하기
기여를 환영합니다! 로봇을 위한 새로운 action mode 또는 processor를 구현하셨다면, 커뮤니티를 돕기 위해 PR을 제출해 주십시오.
Update on GitHub