LeRobot documentation

X-VLA: Mô hình nền tảng robot đầu tiên sử dụng soft-prompt cho mọi robot, mọi tác vụ

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

X-VLA: Mô hình nền tảng robot đầu tiên sử dụng soft-prompt cho mọi robot, mọi tác vụ

Tổng quan

Trong nhiều năm qua, ngành robot luôn hướng tới việc xây dựng các tác nhân có thể tuân theo các chỉ dẫn tự nhiên của con người và vận hành khéo léo trên nhiều môi trường và nhiều loại thân robot khác nhau. Những đột phá gần đây trong LLM và VLM gợi mở một hướng đi: mở rộng các kiến trúc mô hình nền tảng này sang điều khiển có thân bằng cách neo chúng vào các hành động. Điều này đã dẫn đến sự trỗi dậy của các mô hình Vision-Language-Action (VLA), với kỳ vọng rằng một mô hình tổng quát duy nhất có thể kết hợp khả năng hiểu ngữ nghĩa rộng rãi với kỹ năng thao tác vững chắc.

Tuy nhiên, việc huấn luyện các mô hình như vậy là rất khó khăn. Dữ liệu robot bị phân mảnh trên nhiều nền tảng, cảm biến, cấu hình thân robot và giao thức thu thập khác nhau. Sự không đồng nhất xuất hiện ở khắp nơi: các cấu hình cánh tay khác nhau, các không gian hành động khác nhau, các thiết lập camera khác nhau, các miền thị giác khác nhau và các phân phối tác vụ khác nhau. Những sự không nhất quán này tạo ra các sự dịch chuyển phân phối lớn, khiến việc tiền huấn luyện trở nên không ổn định và việc thích ứng trở nên thiếu tin cậy.

Lấy cảm hứng từ meta-learning và prompt learning, chúng ta đặt câu hỏi: “Điều gì sẽ xảy ra nếu một mô hình VLA có thể học cấu trúc của từng robot và tập dữ liệu theo cách mà LLM học các tác vụ, thông qua prompts?”

X-VLA là một khung VLA sử dụng soft-prompt và flow-matching, coi mỗi cấu hình phần cứng như một “nhiệm vụ” và mã hóa nó bằng một tập hợp nhỏ các embedding có thể học được. Những Soft Prompts này nắm bắt các biến thể về cơ thể robot và đặc thù theo miền, hướng dẫn Transformer ngay từ những giai đoạn sớm nhất của việc tích hợp đa phương thức. Với cơ chế này, X-VLA có thể điều hòa các hình thái robot, loại dữ liệu và cấu hình cảm biến đa dạng trong một kiến trúc thống nhất duy nhất.

XVLA Architecture

Được xây dựng từ các bộ mã hóa Transformer thuần túy, X-VLA mở rộng một cách tự nhiên theo kích thước mô hình và sự đa dạng của tập dữ liệu. Trên 6 benchmark mô phỏng và 3 robot thực, Soft Prompts luôn vượt trội so với các phương pháp hiện có trong việc xử lý các khác biệt về phần cứng và miền dữ liệu. X-VLA-0.9B, được huấn luyện trên 290K episode trải dài trên bảy nền tảng robot, học được một chính sách tổng quát không phụ thuộc vào cơ thể (embodiment) trong Giai đoạn I, và thích ứng hiệu quả với các robot mới trong Giai đoạn II chỉ bằng cách học một bộ prompts mới, trong khi giữ nguyên phần khung xương (backbone) ở trạng thái đóng băng.

XVLA Architecture 2

Với chỉ 1% tham số được tinh chỉnh (9M), X-VLA-0.9B đạt hiệu suất gần bằng π₀ trên LIBERO và Simpler-WidowX, mặc dù sử dụng ít hơn 300 lần số tham số có thể huấn luyện. Nó cũng thể hiện sự khéo léo mạnh mẽ trong thế giới thực với rất ít ví dụ minh họa, bao gồm việc gấp vải trong chưa đầy hai phút.

XVLA fold visualization

X-VLA cho thấy trí tuệ robot tổng quát không đòi hỏi các kiến trúc ngày càng phức tạp, mà chỉ cần cách tiếp cận đúng đắn để tiếp nhận tính dị thể. Soft Prompts cung cấp một cơ chế đơn giản, có khả năng mở rộng để thống nhất dữ liệu robot đa dạng, mở đường cho các mô hình nền tảng robot có khả năng thích ứng và hoạt động xuyên suốt nhiều hình thái cơ thể.

Cài đặt

Sau khi cài đặt LeRobot, hãy cài đặt các phụ thuộc của X-VLA:

pip install -e ".[xvla]"

Nếu bạn đã cài đặt LeRobot từ PyPI thay vì:

pip install 'lerobot[xvla]'

Bắt đầu nhanh

Cách sử dụng cơ bản

Để sử dụng X-VLA trong cấu hình LeRobot của bạn, hãy chỉ định loại policy là:

policy.type=xvla

Đánh giá các checkpoint được huấn luyện trước

Ví dụ đánh giá với 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

Các điểm kiểm tra khả dụng

🎯 Mô hình cơ sở

lerobot/xvla-base

Một phiên bản X-VLA có 0,9 tỷ tham số, được huấn luyện bằng một công thức xử lý dữ liệu và học tập được thiết kế cẩn thận. Quy trình huấn luyện bao gồm hai giai đoạn:

  • Giai đoạn I: Tiền huấn luyện - Được tiền huấn luyện trên 290K tập dữ liệu từ Droid, Robomind và Agibot, bao phủ bảy nền tảng trên năm loại cánh tay robot (từ cấu hình một cánh tay đến cấu hình hai cánh tay). Bằng cách tận dụng các soft prompt để hấp thụ các biến thể đặc thù của từng cơ thể robot, mô hình học được một chính sách tổng quát không phụ thuộc vào cơ thể robot.

  • Giai đoạn II: Thích ứng miền - Được điều chỉnh thành các chính sách có thể triển khai cho các miền đích. Một bộ soft prompts mới được đưa vào và tối ưu hóa để mã hóa cấu hình phần cứng của miền mới, trong khi backbone được huấn luyện trước vẫn được giữ nguyên.

Điểm kiểm tra mô phỏng

lerobot/xvla-libero

Đạt tỷ lệ thành công 93% trên các benchmark LIBERO. Được tinh chỉnh từ mô hình cơ bản cho các tác vụ mô phỏng.

lerobot/xvla-widowx

Được tinh chỉnh trên BridgeData cho các thí nghiệm gắp và đặt trên các nền tảng WidowX nhỏ gọn. Chứng minh khả năng thao tác vững chắc.

🤖 Điểm kiểm tra trong thực tế

lerobot/xvla-folding

Một mô hình thao tác khéo léo đã được tinh chỉnh, huấn luyện trên bộ dữ liệu gấp vải Soft-FOLD chất lượng cao. Đạt tỷ lệ thành công 100% trong suốt 2 giờ gấp vải liên tục.

lerobot/xvla-agibot-world

Được tối ưu hóa cho các thao tác khéo léo của robot AgileX.

lerobot/xvla-google-robot

Được điều chỉnh cho các nền tảng Robot của Google.

Huấn luyện X-VLA

Cấu hình huấn luyện được khuyến nghị

Khi tinh chỉnh X-VLA cho một cấu hình hoặc tác vụ mới, chúng tôi khuyến nghị không đóng băng VLM, đồng thời đặt policy.dtype=bfloat16 để tránh gặp lỗi OOM.

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

Giải thích các tham số huấn luyện

Tham sốMặc địnhMô tả
freeze_vision_encoderfalseKhông đóng băng trọng số của bộ mã hóa thị giác VLM
freeze_language_encoderfalseKhông đóng băng trọng số bộ mã hóa ngôn ngữ của VLM
train_policy_transformertrueCho phép các lớp transformer của policy được huấn luyện
train_soft_promptstrueCho phép huấn luyện các prompt mềm

💡 Thực hành tốt nhất: Đối với việc thích ứng ở Giai đoạn II sang các dạng triển khai mới, không đóng băng các bộ mã hóa VLM và đồng thời huấn luyện cả bộ biến đổi chính sách (policy transformer) và các prompt mềm (soft prompts).

Ví dụ: Huấn luyện trên Robot hai tay

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

💡 Hiệu suất tốt nhất: Nếu bạn có đủ tài nguyên tính toán và muốn đạt được hiệu suất tinh chỉnh X-VLA tốt nhất, bạn nên làm theo chiến lược tinh chỉnh chính thức:

🔥 Fine-tune đầy đủ tất cả các thành phần với một lược đồ tốc độ học tùy chỉnh

Để đảm bảo tối ưu hóa ổn định, Mô hình Thị giác-Ngôn ngữ (VLM) phải được huấn luyện với tốc độ học cơ bản chỉ bằng 1/10, trong khi tất cả các thành phần khác sử dụng LR đầy đủ. Tỷ lệ LR này rất quan trọng để đạt được hiệu suất finetuning mạnh mẽ và ổn định. Mặc định, điều này đã được thực hiện sẵn cho bạn. ❕Lưu ý

Việc khớp hoàn toàn với hiệu suất được báo cáo chính thức có thể cần thêm lịch warm-up LR cho soft-prompts, điều này có thể mang lại những cải thiện nhỏ. Chúng tôi khuyến khích bạn triển khai điều này trong pipeline huấn luyện tùy chỉnh của mình để đạt kết quả tối ưu.

Khái niệm cốt lõi

1. Chế độ hành động

X-VLA sử dụng hệ thống Action Registry để xử lý các không gian hành động và các dạng thân (embodiment) khác nhau. Tham số action_mode xác định cách các hành động được xử lý, các hàm mất mát được sử dụng và cách các dự đoán được xử lý hậu kỳ.

Các Chế Độ Hành Động Có Sẵn

Chế độ Hành độngChiều kích hành độngMô tảTrường hợp sử dụng
ee6d20Cơ cấu đầu cuối với xyz, xoay 6D, kẹpCấu hình hai cánh tay với kiểm soát không gian
joint14Không gian khớp với kẹpRobot điều khiển khớp trực tiếp
agibot_ee6d20Biến thể AGI-bot với tổn thất MSENền tảng AGI-bot
so101_bimanual20 (mô hình), 12 (thực tế)Robot hai tay SO101Nhiệm vụ thao tác bằng hai tay
auto20 (mô hình), auto (thực)Tự động phát hiện chiều hành động từ bộ dữ liệuĐược khuyến nghị cho các robot mới

Tại sao các Chế độ Hành động lại quan trọng

Khi bạn có một checkpoint được huấn luyện trước như lerobot/xvla-base được huấn luyện với action_dim=20, và bạn muốn huấn luyện trên một tập dữ liệu có kích thước hành động khác (ví dụ: 14 cho cánh tay hai tay), bạn không thể đơn giản cắt giảm kích thước hành động. Chế độ hành động điều phối:

  1. Tính toán tổn thất: Các hàm tổn thất khác nhau cho các thành phần hành động khác nhau (MSE cho các khớp, BCE cho các kẹp, v.v.)
  2. Tiền xử lý: Đặt các kênh kẹp về 0, đệm các chiều
  3. Xử lý hậu kỳ: Áp dụng sigmoid vào logits của kẹp, cắt bỏ phần đệm

Ví dụ: Không gian hành động BimanualSO101

Chế độ hành động so101_bimanual xử lý sự không khớp giữa đầu ra của mô hình (20D) và điều khiển robot thực (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

Xem cài đặt action_hub.py để biết thêm chi tiết.

Chế độ Tự động (Khuyến nghị)

Chế độ hành động auto là cách dễ nhất để sử dụng X-VLA với bất kỳ robot nào. Nó tự động phát hiện chiều kích hành động của bộ dữ liệu của bạn và xử lý việc đệm/cắt:

lerobot-train \
  --policy.path="lerobot/xvla-base" \
  --policy.action_mode=auto \
  --policy.max_action_dim=20 \
  ...

Cách hoạt động:

  • Đọc action_feature.shape[-1] từ bộ dữ liệu của bạn (ví dụ: 7 cho Franka)
  • Đầu ra của mô hình là max_action_dim (mặc định là 20) để tương thích với các mô hình được huấn luyện trước
  • Loss được tính chỉ trên các chiều thực: MSE(pred[:,:,:real_dim], target[:,:,:real_dim])
  • Postprocess cắt bớt đầu ra về real_dim để điều khiển robot

Điều này loại bỏ nhu cầu tạo các chế độ hành động tùy chỉnh cho hầu hết các robot.

2. ID miền

Domain IDs là các định danh có thể học được cho các cấu hình robot và thiết lập camera khác nhau. Chúng cho phép X-VLA phân biệt giữa:

  • Các robot khác nhau (Robot 1 so với Robot 2)
  • Các cấu hình camera khác nhau (cam1 so với cam2)
  • Các tổ hợp khác nhau (Robot1-cam1-cam2 so với Robot1-cam1 so với Robot2-cam1)

Đặt ID miền

Trong quá trình huấn luyện: Mặc định, domain_id được đặt thành 0 cho huấn luyện chung.

Trong quá trình đánh giá: Chỉ định domain_id khớp với cấu hình huấn luyện của checkpoint của bạn.

# Example: LIBERO checkpoint uses domain_id=3
domain_id = 3

domain_id được thêm tự động vào các quan sát bởi XVLAAddDomainIdProcessorStep trong pipeline tiền xử lý.

Mô hình lerobot/xvla-base đã được huấn luyện trên các domain ID sau. Khuyến nghị chọn một domain ID có cấu hình tương tự nhất với robot/cấu hình của bạn:

Bộ dữ liệu tinh chỉnh

Tên bộ dữ liệuID miền
Cầu nối0
RT11
Calvin2
libero3
widowx-air4
AIR-AGILEX-HQ5
robotwin2_abs_ee6
robotwin2_clean6
robocasa-human7
VLABench8
AGIBOT-challenge9
AIR-AGILEX10
AIRBOT18

3. Các bước của Processor

X-VLA yêu cầu các bước tiền xử lý và hậu xử lý cụ thể để hoạt động đúng cách.

Các bước tiền xử lý bắt buộc

  1. XVLAImageToFloatProcessorStep: Chuyển đổi hình ảnh từ khoảng [0, 255] sang khoảng [0, 1]
  2. XVLAImageNetNormalizeProcessorStep: Áp dụng chuẩn hóa ImageNet (bắt buộc cho backbone VLM)
  3. XVLAAddDomainIdProcessorStep: Thêm domain_id vào các quan sát

Ví dụ về Bộ xử lý tùy chỉnh

Đối với các môi trường LIBERO, một bộ xử lý tùy chỉnh sẽ chuyển đổi quan sát chuẩn thành đầu vào mà X-VLA đã được huấn luyện:

from lerobot.policies.xvla.processor_xvla import LiberoProcessorStep

processor = LiberoProcessorStep()
# Builds the 9D state from the canonical 8D state, with the end-effector rotation in 6D
# Rotates the wrist camera back, since the LIBERO integration rotates every camera by 180°

4. Tham số cấu hình

Các tham số cấu hình chính cho 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

Tạo các chế độ hành động tùy chỉnh

Nếu robot của bạn có không gian hành động riêng, bạn có thể tạo một chế độ hành động tùy chỉnh:

Bước 1: Xác định không gian hành động

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 action

Bước 2: Sử dụng chế độ Action tùy chỉnh của bạn

lerobot-train \
  --policy.action_mode=my_custom_robot \
  --dataset.repo_id=YOUR_DATASET \
  --policy.path="lerobot/xvla-base" \
  ...

Chủ đề nâng cao

Hỗ trợ nhiều camera

X-VLA hỗ trợ nhiều góc nhìn camera thông qua tham số 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

Đường ống tiền xử lý tùy chỉnh

Tạo một pipeline tiền xử lý tùy chỉnh cho môi trường của bạn:

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
    ]
)

Xử lý các chiều hành động khác nhau

Khi tập dữ liệu của bạn có ít chiều hành động hơn so với mô hình được huấn luyện trước:

Tùy chọn 1 (Đề xuất): Sử dụng chế độ hành động 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

Tùy chọn 2: Sử dụng chế độ hành động được định nghĩa trước với đệm tích hợp

# Model expects 20D, dataset has 12D
# Action mode handles padding internally
action_mode = "so101_bimanual"  # Pads 12 → 20

Tùy chọn 2: Tạo một chế độ hành động tùy chỉnh ánh xạ các chiều một cách rõ ràng

@register_action("my_mapped_action")
class MappedActionSpace(BaseActionSpace):
    dim_action = 20
    REAL_DIM = 12

    def _pad_to_model_dim(self, x):
        # Custom padding logic
        ...

Xử lý sự cố

Các vấn đề thường gặp

Vấn đề: “Kích thước chiều hành động không khớp”

  • Giải pháp: Kiểm tra xem action_mode của bạn có khớp với không gian hành động của robot hay không. Tạo một chế độ hành động tùy chỉnh nếu cần.

Vấn đề: “Giá trị ảnh nằm ngoài khoảng [0, 1]”

  • Giải pháp: Đảm bảo hình ảnh được tiền xử lý bằng XVLAImageToFloatProcessorStep trước khi chuẩn hóa.

Vấn đề: “Không tìm thấy Domain ID”

  • Giải pháp: Đảm bảo XVLAAddDomainIdProcessorStep có trong pipeline tiền xử lý của bạn với domain_id chính xác.

Vấn đề: “Tỷ lệ thành công thấp trên cấu hình mới”

  • Solution:
    1. Kiểm tra xem action_mode của bạn có chính xác không
    2. Kiểm tra xem các soft prompt có đang được huấn luyện hay không (train_soft_prompts=True)
    3. Đảm bảo tiền xử lý đúng cách (chuẩn hóa ImageNet, domain_id)
    4. Xem xét việc tăng số bước huấn luyện

Vấn đề: “Hết bộ nhớ trong khi huấn luyện”

  • Solution:
    1. Giảm chunk_size (ví dụ: từ 32 xuống 16)
    2. Bật kiểm tra điểm gradient
    3. Giảm kích thước lô
    4. Đóng băng nhiều thành phần hơn

Trích dẫn

Nếu bạn sử dụng X-VLA trong nghiên cứu của mình, vui lòng trích dẫn:

@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}
}

Tài nguyên bổ sung

Đóng góp

Chúng tôi hoan nghênh mọi đóng góp! Nếu bạn đã triển khai một chế độ hành động hoặc bộ xử lý mới cho robot của mình, hãy cân nhắc gửi một PR để hỗ trợ cộng đồng.

Update on GitHub