LeRobot documentation
X-VLA: أول نموذج أساسي للروبوتات يعتمد على التلميحات الناعمة لأي روبوت وأي مهمة
X-VLA: أول نموذج أساسي للروبوتات يعتمد على التلميحات الناعمة لأي روبوت وأي مهمة
نظرة عامة
على مدى سنوات، سعت الروبوتات إلى بناء وكلاء قادرين على اتباع تعليمات بشرية طبيعية والتحرك بمهارة عبر بيئات وأجسام روبوتية متعددة. تشير الاختراقات الحديثة في نماذج LLMs وVLMs إلى مسار للمضي قدماً: توسيع معماريات هذه النماذج الأساسية إلى التحكم المادي من خلال ربطها بالأفعال. وقد أدى ذلك إلى ظهور نماذج Vision-Language-Action (VLA)، على أمل أن يتمكن نموذج عام واحد من الجمع بين الفهم الدلالي الواسع ومهارات التلاعب المتينة.
لكن تدريب مثل هذه النماذج أمرٌ صعب. البيانات الخاصة بالروبوتات متناثرة عبر منصات وأجهزة استشعار وأجسام بروتوكولات جمع مختلفة. يظهر التنوع في كل مكان: تكوينات مختلفة للأذرع، ومساحات أفعال مختلفة، وإعدادات كاميرات مختلفة، ومجالات بصرية مختلفة، وتوزيعات مهام مختلفة. تُنشئ هذه الاختلافات إزاحات توزيعية كبيرة تجعل التدريب المسبق غير مستقر والتكيّف غير موثوق.
مستوحين من التعلّم الفائق وتعلّم الأوامر، نطرح السؤال التالي: “ماذا لو كان بإمكان نموذج VLA أن يتعلم بنية كل روبوت ومجموعة بيانات بنفس الطريقة التي تتعلم بها نماذج اللغة الكبيرة المهام، من خلال الأوامر؟”
X-VLA هو إطار عمل VLA يعتمد على التلميحات الناعمة ومطابقة التدفق، ويعامل كل إعداد عتادي على أنه “مهمة” ويشفّره باستخدام مجموعة صغيرة من التضمينات القابلة للتعلم. تلتقط هذه التلميحات الناعمة الاختلافات المتعلقة بالجسد المادي والمجال المحدد، وتوجّه محوّل (Transformer) منذ المراحل الأولى من الدمج متعدد الوسائط. وبفضل هذا الآلية، يمكن لـ X-VLA التوفيق بين أشكال الروبوتات المتنوعة، وأنواع البيانات، وإعدادات المستشعرات ضمن معمارية موحدة واحدة.

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

بضبط 1% فقط من المعاملات (9 ملايين)، يحقق X-VLA-0.9B أداءً قريبًا من أداء π₀ على LIBERO وSimpler-WidowX، على الرغم من استخدام عدد أقل من المعاملات القابلة للتدريب بمقدار 300 مرة. كما يُظهر مهارة قوية في العالم الحقيقي مع عروض توضيحية قليلة، بما في ذلك طي الأقمشة في أقل من دقيقتين.

يُظهر 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نقاط التفتيش المتاحة
🎯 النموذج الأساسي
نسخة من X-VLA تحتوي على 0.9 مليار معامل، تم تدريبها باستخدام وصفة معالجة بيانات وتعلم مصممة بعناية. يتكون خط أنابيب التدريب من مرحلتين:
المرحلة الأولى: التدريب المسبق - تم تدريب النموذج مسبقًا على 290 ألف حلقة من Droid وRobomind وAgibot، وتشمل سبع منصات عبر خمسة أنواع من الأذرع الروبوتية (من إعدادات الذراع الواحدة إلى إعدادات الذراعين). ومن خلال الاستفادة من التلميحات الناعمة لامتصاص التباينات الخاصة بكل تجسيد، يتعلم النموذج سياسة عامة غير مرتبطة بالتجسيد.
المرحلة الثانية: تكييف المجال - يتم تكييفها لتحويلها إلى سياسات قابلة للنشر في المجالات المستهدفة. يتم تقديم مجموعة جديدة من التلميحات الناعمة وتحسينها لتشفير تكوين العتاد الخاص بالمجال الجديد، بينما يبقى الهيكل الأساسي المُدرَّب مسبقًا مجمّدًا.
نقاط التفتيش في المحاكاة
يحقّق معدل نجاح بنسبة 93% على اختبارات LIBERO. تم ضبطه من النموذج الأساسي لمهام المحاكاة.
تم ضبطه بدقة على BridgeData لتجارب الالتقاط والتثبيت على منصات WidowX المدمجة. يُظهر قدرات قوية في التلاعب بالأجسام.
🤖 نقاط تحقق واقعية
نموذج للتعديل الدقيق على المهارة في التلاعب، تم تدريبه على مجموعة بيانات طي الأقمشة Soft-FOLD عالية الجودة. يحقق معدل نجاح بنسبة 100% على مدار ساعتين من طي الأقمشة المستمر.
مُحسَّن لمهام التلاعب الماهر لروبوت AgileX.
مُعدّّة لمنصات روبوتات 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_encoder | false | لا تُجمِّد أوزان مُشفِّر الرؤية الخاص بنموذج VLM |
freeze_language_encoder | false | لا تُجمِّد أوزان مُشفِّر اللغة الخاص بنموذج VLM |
train_policy_transformer | true | السماح لطبقات محوّل السياسة بالتدريب |
train_soft_prompts | true | السماح بالتدرّب على التلميحات الناعمة |
💡 أفضل الممارسات: عند تكييف المرحلة الثانية لتجسيدات جديدة، لا تُجمِّد مُشفِّرات 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 كيفية معالجة الإجراءات، ودوال الخسارة المستخدمة، وكيفية المعالجة اللاحقة للتنبؤات.
أوضاع الإجراءات المتاحة
| وضع الإجراء | بعد الإجراء | الوصف | حالة الاستخدام |
|---|---|---|---|
ee6d | 20 | المُنفِّذ النهائي مع xyz، دوران 6D، ومِلقط | إعدادات ذراعين مع التحكم المكاني |
joint | 14 | فضاء مشترك مع قابض | روبوتات التحكم المشترك المباشر |
agibot_ee6d | 20 | نسخة AGI-bot مع خسارة MSE | منصات AGI-bot |
so101_bimanual | 20 (النموذج)، 12 (الحقيقي) | الروبوت SO101 ذو اليدين | مهام التلاعب الثنائي |
auto | 20 (نموذج)، auto (حقيقي) | يكتشف تلقائيًا بُعد الإجراء من مجموعة البيانات | موصى به للروبوتات الجديدة |
أهمية أوضاع الإجراءات
عندما يكون لديك نقطة تحقق مسبقة التدريب مثل lerobot/xvla-base تم تدريبها باستخدام action_dim=20، وتريد التدريب على مجموعة بيانات بعدية إجراء مختلفة (على سبيل المثال، 14 للأذرع ثنائية اليد)، لا يمكنك ببساطة تقليص بعد الإجراء. يقوم وضع الإجراء بتنسيق:
- حساب الدالة الخاسرة: دوال خسارة مختلفة لمكونات الإجراء المختلفة (MSE للمفاصل، BCE للقبضات، إلخ)
- المعالجة المسبقة: تصفير قنوات الماسك، ملء الأبعاد
- المعالجة اللاحقة: تطبيق دالة سيجمويد على قيم الإخراج الخاصة بالمقبض، وقص الحشو
مثال: مساحة الإجراءات لـ 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 = 3The domain_id is automatically added to observations by the XVLAAddDomainIdProcessorStep in the preprocessing pipeline.
تم تدريب نموذج lerobot/xvla-base على المعرّفات التالية للمجالات. يُوصى باختيار المعرّف الذي يشبه روبوتك/إعداداتك بشكل أكبر:
مجموعات بيانات الضبط الدقيق
| اسم مجموعة البيانات | معرف المجال |
|---|---|
| جسر | 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. خطوات المعالج
يتطلب 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 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:
- تحقق من أن 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}
}موارد إضافية
المساهمة
نرحّب بالمساهمات! إذا كنت قد نفّذت وضع إجراء جديدًا أو معالجًا لروبوتك، فيُرجى النظر في تقديم طلب سحب (PR) للمساعدة في دعم المجتمع.
Update on GitHub