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ụ
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.

Đượ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.

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.

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=142Các điểm kiểm tra khả dụng
🎯 Mô hình cơ sở
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
Đạ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.
Đượ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ế
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.
Được tối ưu hóa cho các thao tác khéo léo của robot AgileX.
Đượ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=trueGiải thích các tham số huấn luyện
| Tham số | Mặc định | Mô tả |
|---|---|---|
freeze_vision_encoder | false | Không đóng băng trọng số của bộ mã hóa thị giác VLM |
freeze_language_encoder | false | Không đóng băng trọng số bộ mã hóa ngôn ngữ của VLM |
train_policy_transformer | true | Cho phép các lớp transformer của policy được huấn luyện |
train_soft_prompts | true | Cho 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 động | Chiều kích hành động | Mô tả | Trường hợp sử dụng |
|---|---|---|---|
ee6d | 20 | Cơ cấu đầu cuối với xyz, xoay 6D, kẹp | Cấu hình hai cánh tay với kiểm soát không gian |
joint | 14 | Không gian khớp với kẹp | Robot điều khiển khớp trực tiếp |
agibot_ee6d | 20 | Biến thể AGI-bot với tổn thất MSE | Nền tảng AGI-bot |
so101_bimanual | 20 (mô hình), 12 (thực tế) | Robot hai tay SO101 | Nhiệm vụ thao tác bằng hai tay |
auto | 20 (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:
- 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.)
- Tiền xử lý: Đặt các kênh kẹp về 0, đệm các chiều
- 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 deploymentXem 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 = 3domain_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ệu | ID miền |
|---|---|
| Cầu nối | 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. 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
- XVLAImageToFloatProcessorStep: Chuyển đổi hình ảnh từ khoảng [0, 255] sang khoảng [0, 1]
- XVLAImageNetNormalizeProcessorStep: Áp dụng chuẩn hóa ImageNet (bắt buộc cho backbone VLM)
- 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 stepsTạ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 actionBướ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 modelTù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 → 20Tù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_modecủ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
XVLAImageToFloatProcessorSteptrước khi chuẩn hóa.
Vấn đề: “Không tìm thấy Domain ID”
- Giải pháp: Đảm bảo
XVLAAddDomainIdProcessorStepcó 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:
- Kiểm tra xem action_mode của bạn có chính xác không
- Kiểm tra xem các soft prompt có đang được huấn luyện hay không (
train_soft_prompts=True) - Đảm bảo tiền xử lý đúng cách (chuẩn hóa ImageNet, domain_id)
- 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:
- Giảm
chunk_size(ví dụ: từ 32 xuống 16) - Bật kiểm tra điểm gradient
- Giảm kích thước lô
- Đóng băng nhiều thành phần hơn
- Giảm
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