LeRobot documentation

X-VLA: первая модель-фундамент для роботов с мягкими промптами для любого робота и любой задачи

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

X-VLA: первая модель-фундамент для роботов с мягкими промптами для любого робота и любой задачи

Обзор

На протяжении многих лет робототехника стремилась создать агентов, способных выполнять естественные человеческие инструкции и демонстрировать высокую ловкость в самых разных средах и на различных роботизированных платформах. Недавние прорывы в области LLM и VLM указывают на возможный путь развития: расширить архитектуры этих базовых моделей для воплощённого управления, привязав их к конкретным действиям. Это привело к появлению моделей Vision-Language-Action (VLA), в которых надеются, что одна универсальная модель сможет объединить широкое семантическое понимание с надёжными навыками манипулирования объектами.

Но обучение таких моделей затруднено. Данные о роботах фрагментированы по платформам, датчикам, конфигурациям и протоколам сбора. Гетерогенность проявляется повсюду: различные конфигурации манипуляторов, различные пространства действий, различные схемы установки камер, различные визуальные домены и различные распределения задач. Эти несоответствия создают значительные сдвиги распределения, из-за которых предобучение становится нестабильным, а адаптация — ненадёжной.

Вдохновлённые метаобучением и обучением с промптами, мы задаём вопрос: «Что, если модель VLA сможет изучать структуру каждого робота и набора данных так же, как LLM изучают задачи, с помощью промптов?»

X-VLA — это фреймворк VLA с мягкими промптами и flow-matching, который рассматривает каждую аппаратную конфигурацию как «задачу» и кодирует её с помощью небольшого набора обучаемых эмбеддингов. Эти Soft Prompts фиксируют вариации, специфичные для конкретного воплощения и домена, направляя работу Transformer с самых ранних этапов мультимодального слияния. Благодаря этому механизму X-VLA способен согласовать различные морфологии роботов, типы данных и конфигурации датчиков в рамках единой унифицированной архитектуры.

XVLA Architecture

Построенный исключительно на энкодерах Transformer, X-VLA естественно масштабируется с ростом размера модели и разнообразия датасета. На шести симуляционных бенчмарках и с тремя реальными роботами Soft Prompts стабильно превосходят существующие методы в обработке различий в аппаратном обеспечении и доменах. X-VLA-0.9B, обученный на 290K эпизодах, охватывающих семь робототехнических платформ, в фазе I обучает универсальную политику, не зависящую от конкретного воплощения (embodiment), а в фазе II эффективно адаптируется к новым роботам, просто обучая новый набор промптов, при этом сохраняя базовую модель (backbone) замороженной.

XVLA Architecture 2

При настройке лишь 1% параметров (9M) модель X-VLA-0.9B достигает производительности, близкой к π₀, на LIBERO и Simpler-WidowX, несмотря на использование в 300 раз меньшего числа обучаемых параметров. Она также демонстрирует высокую ловкость в реальных условиях при минимальном количестве демонстраций, включая складывание тканей менее чем за две минуты.

XVLA fold visualization

X-VLA демонстрирует, что универсальный интеллект роботов не требует всё более сложных архитектур, а лишь правильного способа усвоения гетерогенности. Soft Prompts предлагают простой и масштабируемый механизм для унификации разнообразных робототехнических данных, прокладывая путь к адаптивным фундаментальным моделям роботов, работающим с различными типами корпусов.

Установка

После установки LeRobot установите зависимости X-VLA:

pip install -e ".[xvla]"

Если вы установили LeRobot из PyPI:

pip install 'lerobot[xvla]'

Быстрый старт

Базовое использование

Чтобы использовать X-VLA в вашей конфигурации LeRobot, укажите тип политики как:

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

Доступные контрольные точки

🎯 Базовая модель

lerobot/xvla-base

Вариант X-VLA с 0,9 млрд параметров, обученный с использованием тщательно разработанного рецепта обработки данных и обучения. Процесс обучения состоит из двух фаз:

  • Фаза I: Предобучение — Предобучение на 290 тыс. эпизодов из Droid, Robomind и Agibot, охватывающих семь платформ пяти типов роботизированных манипуляторов (от одноручных до двуручных конфигураций). За счёт использования мягких промптов для поглощения вариаций, специфичных для конкретного воплощения, модель обучает универсальную политику, не зависящую от конкретного воплощения.

  • Фаза II: адаптация к домену — адаптация к политикам, готовым к развёртыванию в целевых доменах. Вводится и оптимизируется новый набор мягких промптов для кодирования конфигурации оборудования нового домена, при этом предобученная базовая модель остаётся замороженной.

Точки контрольной проверки симуляции

lerobot/xvla-libero

Достигает 93% успешности на бенчмарках LIBERO. Дообучен из базовой модели для задач симуляции.

lerobot/xvla-widowx

Доработан на BridgeData для экспериментов по захвату и размещению объектов на компактных платформах WidowX. Демонстрирует надёжные возможности манипуляции.

🤖 Чекпоинты для реальных задач

lerobot/xvla-folding

Модель для точной настройки ловкого манипулирования, обученная на высококачественном наборе данных Soft-FOLD по складыванию ткани. Достигает 100% успеха при непрерывном складывании ткани в течение 2 часов.

lerobot/xvla-agibot-world

Оптимизирован для задач ловкого манипулирования роботом AgileX.

lerobot/xvla-google-robot

Адаптировано для платформ Google Robot.

Обучение X-VLA

Рекомендуемая конфигурация обучения

При дообучении X-VLA для нового воплощения или задачи мы рекомендуем не замораживать VLM, а также устанавливать policy.dtype=bfloat16, чтобы избежать ошибок 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

Параметры обучения

ПараметрПо умолчаниюОписание
freeze_vision_encoderfalseНе замораживайте веса визуального энкодера VLM
freeze_language_encoderfalseНе замораживайте веса языкового энкодера VLM
train_policy_transformertrueРазрешить обучению слоев преобразователя политики
train_soft_promptstrueРазрешить обучение мягких промптов

💡 Лучшая практика: Для адаптации в фазе II к новым воплощениям не замораживайте энкодеры 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 от основной, в то время как все остальные компоненты используют полную скорость обучения. Это соотношение скоростей обучения имеет решающее значение для достижения высокого и стабильного качества дообучения. По умолчанию это уже настроено. ❕Примечание

Полное совпадение с официально заявленными показателями производительности может потребовать дополнительного расписания разгонной скорости обучения (warm-up LR) для soft-prompts, что способно дать незначительное улучшение. Мы рекомендуем реализовать это в вашем кастомизированном конвейере обучения для достижения оптимальных результатов.

Основные концепции

1. Режимы действий

X-VLA использует систему Action Registry для работы с различными пространствами действий и embodiments. Параметр action_mode определяет, как обрабатываются действия, какие функции потерь применяются и как выполняется постобработка предсказаний.

Доступные режимы действий

Режим действияРазмерность действияОписаниеСценарий использования
ee6d20Исполнительный орган с xyz, 6D-вращением, захватомДвухрукие конфигурации с пространственным управлением
joint14Совместное пространство с захватомРоботы с прямым совместным управлением
agibot_ee6d20Вариант AGI-bot с потерей MSEПлатформы AGI-bot
so101_bimanual20 (модель), 12 (реальные)Двуручный робот SO101Задачи бимануального манипулирования
auto20 (модель), auto (реальный)Автоматически определяет размерность действия из набора данныхРекомендуется для новых роботов

Почему режимы действий важны

Если у вас есть предобученная контрольная точка, например lerobot/xvla-base, обученная с action_dim=20, и вы хотите обучать модель на наборе данных с другим размером действия (например, 14 для двуручных манипуляторов), вы не можете просто обрезать размер действия. Режим действия управляет:

  1. Вычисление функции потерь: различные функции потерь для разных компонентов действия (MSE для суставов, BCE для захватов и т. д.)
  2. Предобработка: обнуление каналов захвата, дополнение размерностей
  3. Постобработка: применение сигмоиды к логитам захвата, удаление заполнителей

Пример: пространство действий BimanualSO101

Режим действий 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] из вашего набора данных (например, 7 для Franka)
  • Выход модели max_action_dim (по умолчанию 20) для совместимости с предобученными моделями
  • Потери вычисляются только по реальным размерностям: MSE(pred[:,:,:real_dim], target[:,:,:real_dim])
  • Postprocess обрезает вывод обратно до real_dim для управления роботом

Это устраняет необходимость создавать собственные режимы действий для большинства роботов.

2. Идентификаторы областей

Domain ID — это обучаемые идентификаторы для различных конфигураций роботов и камерных установок. Они позволяют X-VLA различать:

  • Разные роботы (Робот 1 и Робот 2)
  • Различные конфигурации камер (cam1 и cam2)
  • Различные комбинации (Robot1-cam1-cam2 против Robot1-cam1 против Robot2-cam1)

Настройка идентификаторов доменов

Во время обучения: по умолчанию domain_id устанавливается в 0 для общего обучения.

Во время оценки: укажите domain_id, соответствующий конфигурации обучения вашего контрольного снимка.

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

The domain_id is automatically added to observations by the XVLAAddDomainIdProcessorStep in the preprocessing pipeline.

Модель lerobot/xvla-base обучена на следующих идентификаторах доменов. Рекомендуется выбрать тот, который наиболее похож на вашего робота/конфигурацию:

Наборы данных для дообучения

Имя набора данныхИдентификатор домена
Мост0
RT11
Calvin2
libero3
widowx-air4
AIR-AGILEX-HQ5
robotwin2_abs_ee6
robotwin2_clean6
robocasa-human7
VLABench8
AGIBOT-challenge9
AIR-AGILEX10
AIRBOT18

3. Шаги процессора

Для корректной работы X-VLA требуются определенные этапы предобработки и постобработки.

Необходимые шаги предобработки

  1. XVLAImageToFloatProcessorStep: преобразует изображения из диапазона [0, 255] в диапазон [0, 1]
  2. XVLAImageNetNormalizeProcessorStep: применяет нормализацию ImageNet (необходимо для VLM-бэкбона)
  3. XVLAAddDomainIdProcessorStep: добавляет domain_id в наблюдения

Пример пользовательского процессора

Для сред LIBERO специальный процессор преобразует каноническое наблюдение во вход, на котором обучалась X-VLA:

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. Параметры конфигурации

Ключевые параметры конфигурации для 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 action

Шаг 2: Использование вашего пользовательского режима действия

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: создайте собственный режим действия, который явно сопоставляет измерения

@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_mode соответствует пространству действий вашего робота. При необходимости создайте собственный режим действий.

Проблема: «Значения изображения вне диапазона [0, 1]»

  • Решение: убедитесь, что изображения предварительно обрабатываются с помощью XVLAImageToFloatProcessorStep перед нормализацией.

Проблема: «Domain ID not found»

  • Решение: Убедитесь, что XVLAAddDomainIdProcessorStep присутствует в вашем конвейере предобработки с правильным значением domain_id.

Проблема: «Низкий процент успеха на новом воплощении»

  • Solution:
    1. Проверьте, что ваш action_mode указан верно
    2. Убедитесь, что мягкие промпты обучаются (train_soft_prompts=True)
    3. Обеспечьте правильную предобработку (нормализация ImageNet, domain_id)
    4. Рассмотрите возможность увеличения количества шагов обучения

Проблема: «Недостаточно памяти во время обучения»

  • Solution:
    1. Уменьшите chunk_size (например, с 32 до 16)
    2. Включить контрольные точки градиентов
    3. Уменьшите размер пакета
    4. Заморозить больше компонентов

Цитирование

Если вы используете 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}
}

Дополнительные ресурсы

Внесение вклада

Мы приветствуем вклады в проект! Если вы реализовали новый режим действия или процессор для вашего робота, пожалуйста, рассмотрите возможность отправки PR, чтобы помочь сообществу.

Update on GitHub