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.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

X-VLA: أول نموذج أساسي للروبوتات يعتمد على التلميحات الناعمة لأي روبوت وأي مهمة

نظرة عامة

على مدى سنوات، سعت الروبوتات إلى بناء وكلاء قادرين على اتباع تعليمات بشرية طبيعية والتحرك بمهارة عبر بيئات وأجسام روبوتية متعددة. تشير الاختراقات الحديثة في نماذج LLMs وVLMs إلى مسار للمضي قدماً: توسيع معماريات هذه النماذج الأساسية إلى التحكم المادي من خلال ربطها بالأفعال. وقد أدى ذلك إلى ظهور نماذج Vision-Language-Action (VLA)، على أمل أن يتمكن نموذج عام واحد من الجمع بين الفهم الدلالي الواسع ومهارات التلاعب المتينة.

لكن تدريب مثل هذه النماذج أمرٌ صعب. البيانات الخاصة بالروبوتات متناثرة عبر منصات وأجهزة استشعار وأجسام بروتوكولات جمع مختلفة. يظهر التنوع في كل مكان: تكوينات مختلفة للأذرع، ومساحات أفعال مختلفة، وإعدادات كاميرات مختلفة، ومجالات بصرية مختلفة، وتوزيعات مهام مختلفة. تُنشئ هذه الاختلافات إزاحات توزيعية كبيرة تجعل التدريب المسبق غير مستقر والتكيّف غير موثوق.

مستوحين من التعلّم الفائق وتعلّم الأوامر، نطرح السؤال التالي: “ماذا لو كان بإمكان نموذج VLA أن يتعلم بنية كل روبوت ومجموعة بيانات بنفس الطريقة التي تتعلم بها نماذج اللغة الكبيرة المهام، من خلال الأوامر؟”

X-VLA هو إطار عمل VLA يعتمد على التلميحات الناعمة ومطابقة التدفق، ويعامل كل إعداد عتادي على أنه “مهمة” ويشفّره باستخدام مجموعة صغيرة من التضمينات القابلة للتعلم. تلتقط هذه التلميحات الناعمة الاختلافات المتعلقة بالجسد المادي والمجال المحدد، وتوجّه محوّل (Transformer) منذ المراحل الأولى من الدمج متعدد الوسائط. وبفضل هذا الآلية، يمكن لـ X-VLA التوفيق بين أشكال الروبوتات المتنوعة، وأنواع البيانات، وإعدادات المستشعرات ضمن معمارية موحدة واحدة.

XVLA Architecture

مبني من وحدات ترميز Transformer خالصة، يتوسع X-VLA بشكل طبيعي مع حجم النموذج وتنوع مجموعة البيانات. عبر 6 معايير محاكاة و3 روبوتات حقيقية، تتفوق Soft Prompts باستمرار على الأساليب القائمة في التعامل مع الفروقات في الأجهزة والمجالات. يتعلم X-VLA-0.9B، المدرَّب على 290 ألف حلقة تمتد عبر سبع منصات روبوتية، سياسة عامة غير مرتبطة بالجسم المادي في المرحلة الأولى، ويتكيف بكفاءة مع روبوتات جديدة في المرحلة الثانية ببساطة من خلال تعلم مجموعة جديدة من التلميحات، مع إبقاء الهيكل الأساسي مجمّدًا.

XVLA Architecture 2

بضبط 1% فقط من المعاملات (9 ملايين)، يحقق 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 مليار معامل، تم تدريبها باستخدام وصفة معالجة بيانات وتعلم مصممة بعناية. يتكون خط أنابيب التدريب من مرحلتين:

  • المرحلة الأولى: التدريب المسبق - تم تدريب النموذج مسبقًا على 290 ألف حلقة من Droid وRobomind وAgibot، وتشمل سبع منصات عبر خمسة أنواع من الأذرع الروبوتية (من إعدادات الذراع الواحدة إلى إعدادات الذراعين). ومن خلال الاستفادة من التلميحات الناعمة لامتصاص التباينات الخاصة بكل تجسيد، يتعلم النموذج سياسة عامة غير مرتبطة بالتجسيد.

  • المرحلة الثانية: تكييف المجال - يتم تكييفها لتحويلها إلى سياسات قابلة للنشر في المجالات المستهدفة. يتم تقديم مجموعة جديدة من التلميحات الناعمة وتحسينها لتشفير تكوين العتاد الخاص بالمجال الجديد، بينما يبقى الهيكل الأساسي المُدرَّب مسبقًا مجمّدًا.

نقاط التفتيش في المحاكاة

lerobot/xvla-libero

يحقّق معدل نجاح بنسبة 93% على اختبارات LIBERO. تم ضبطه من النموذج الأساسي لمهام المحاكاة.

lerobot/xvla-widowx

تم ضبطه بدقة على BridgeData لتجارب الالتقاط والتثبيت على منصات WidowX المدمجة. يُظهر قدرات قوية في التلاعب بالأجسام.

🤖 نقاط تحقق واقعية

lerobot/xvla-folding

نموذج للتعديل الدقيق على المهارة في التلاعب، تم تدريبه على مجموعة بيانات طي الأقمشة Soft-FOLD عالية الجودة. يحقق معدل نجاح بنسبة 100% على مدار ساعتين من طي الأقمشة المستمر.

lerobot/xvla-agibot-world

مُحسَّن لمهام التلاعب الماهر لروبوت AgileX.

lerobot/xvla-google-robot

مُعدّّة لمنصات روبوتات Google.

تدريب 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السماح بالتدرّب على التلميحات الناعمة

💡 أفضل الممارسات: عند تكييف المرحلة الثانية لتجسيدات جديدة، لا تُجمِّد مُشفِّرات 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، فيجب عليك اتباع استراتيجية الضبط الرسمية:

🔥 ضبط كامل لجميع المكونات مع مخطط معدل تعلّم مخصص

لضمان استقرار التحسين، يجب تدريب نموذج الرؤية واللغة (VLM) باستخدام معدل تعلم أساسي قدره 1/10 فقط، بينما تستخدم جميع المكونات الأخرى معدل التعلم الكامل (LR). يعد هذا النسبة لمعدل التعلم (LR) أمرًا بالغ الأهمية لتحقيق أداء قوي ومستقر في الضبط الدقيق (finetuning). وقد تم تنفيذ ذلك بالفعل افتراضيًا. ❕ملاحظة

قد يتطلب التطابق التام مع الأداء المبلّغ رسميًا جدولة إضافية لدفء معدل التعلم (LR) للتلميحات الناعمة (soft-prompts)، والتي يمكن أن تجلب تحسينات طفيفة. نوصي بتنفيذ ذلك في خط أنابيب التدريب المخصص لديك للحصول على أفضل النتائج.

المفاهيم الأساسية

1. أوضاع الإجراءات

يستخدم X-VLA نظام Action Registry للتعامل مع فضاءات الإجراءات والأجساد المختلفة. يحدد معامل 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. معرّفات المجال

المعرّفات النطاقية هي معرّفات قابلة للتعلم تُستخدم للتمييز بين تكوينات الروبوتات المختلفة وإعدادات الكاميرات. وهي تتيح لـ 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، يتولى معالج مخصص معالجة تنسيق الملاحظة المحدد:

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 convention

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 قبل التطبيع.

المشكلة: “لم يتم العثور على معرّف المجال”

  • الحل: تأكد من أن 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