LeRobot documentation
أعمدة اللغات والوصفات
أعمدة اللغات والوصفات
تأتي معظم مجموعات بيانات LeRobot مع سلسلة task واحدة لكل حلقة — وهو ما يناسب المهارات قصيرة المدى ذات التعليمات الواحدة، لكنه غير كافٍ لسياسات الروبوتات طويلة المدى متعددة الوسائط التي تتجه إليها المجال (التخطيط على مستوى عالٍ، والذاكرة، والمقاطعات، وأسئلة الرؤية البصرية، واستخدام الأدوات). وللدعم هذه السياسات دون تفرع في صيغة مجموعة البيانات، يوسّع LeRobot LeRobotDataset بعمودين اختياريين للغة وطبقة وصفات صغيرة تحوّل تلك الصفوف إلى عينات تدريب بأسلوب المحادثة بشكل فوري.
ينقسم التصميم بوضوح إلى ثلاث طبقات:
- البيانات في مجموعة البيانات — تعليقات اللغة المخزّنة بجانب الإطارات في
data/chunk-*/file-*.parquetعلى شكل عمودين اختياريين (language_persistentوlanguage_events). المجموعات التي لا تحتوي على هذه الأعمدة تحتفظ بسلوكها الحالي. - وصفة — ملف YAML يحدد صفوف التسمية التي يجب ربطها وكيفية ترتيبها كجولات محادثة (
role،content، صور اختيارية، استدعاءات أدوات اختيارية). الوصفات إعدادات بحتة؛ لا حاجة إلى بايثون لإضافة وصفة جديدة. - صيغة التدريب — عند وقت العينة، يحلّ
RenderTrainingMessagesStepالوصفة مقابل التعليقات الخاصة بكل إطار، ويصدرmessagesبأسلوب HF بالإضافة إلى ملفات جانبية خاصة بـ LeRobot (message_streams،target_message_indices) تستهلكها معالجات السياسة.
تصف هذه الصفحة كل طبقة على حدة.
الطبقة 1 — أعمدة اللغة في مجموعة البيانات
توجد العمودان الاختياريان بجوار بيانات الإطار في data/chunk-*/file-*.parquet:
language_persistent: قائمة من الصفوف تُبَث عبر كل إطار في الحلقة للحالة التي تبقى نشطة، مثلsubtaskوplanوmemory.language_events: قائمة من الصفوف في الإطار الدقيق الذي تم فيه إصدار حدث، مثلinterjectionوvqaواستدعاءات أدوات الكلام.
تشارك العمودان نفس شكل الصفوف (تستثني صفوف الأحداث timestamp لأن الإطار الذي يقع عليه الصف يوفره بالفعل):
role: string content: string | null style: string | null timestamp: float32 # persistent rows only camera: string | null # observation.images.* feature key, view-dependent rows only tool_calls: list[Json] | null
يُوسِّم حقل camera الصفوف التي يكون content فيها مبنياً على منظور كاميرا محدد. يجب أن تُعيّن صفوف أنماط الاعتماد على المنظور (vqa وtrace) قيمة camera إلى مفتاح الميزة المطابق في observation.images.*. أما صفوف جميع الأنماط الأخرى — بما في ذلك motion الذي يصف بدائيات إطار الروبوت بمصطلحات مشتركة/ديكارتية — فيجب أن تُبقي camera على null. تفرض خطوط الأنابيب والموحِّد هذا الشرط عبر validate_camera_field(style, camera).
meta/tasks.parquet يبقى المصدر الرسمي للمهمة. أما ربط الوصفة الخاص ${task} فيقرأ دائمًا ذلك النص الخاص بالمهمة ولا يعتمد على التعليقات اللغوية.
البنية
يتكوّن حزمة اللغة نفسها من ثلاثة وحدات داخلية تدعم الطبقة 1:
lerobot.datasets.languageيحدد المخطط، وسجل الأساليب، وcolumn_for_style.lerobot.datasets.language_renderيحل الصفوف ويعرض الرسائل.- يحوّل
RenderTrainingMessagesStepعينات مجموعة البيانات إلىmessagesوmessage_streamsوtarget_message_indices.
LeRobotDataset لا يعتمد على وصفة محددة. يمرر language_persistent وlanguage_events عند وجودهما، وتحتفظ مجموعات البيانات غير المعلَّمة بسلوكها الحالي.
الطبقة 2 — تشريح الوصفة
تُعرَّف الوصفات على أنها ملفات YAML مدعومة بـ TrainingRecipe وMessageTurn من lerobot.datasets.recipe. تُحدِّد هذه الملفات صفوف التسمية التي يجب جلبها (عبر bindings) وكيفية تركيبها في جولات محادثة (messages).
messages:
- { role: user, content: "${task}", stream: high_level }
- { role: assistant, content: "${subtask}", stream: low_level, target: true }يمكن أن تتفرع الوصفة أيضًا إلى مزيج موزون من وصفات فرعية. في وقت أخذ العينة، يتم تحديد فرع واحد بالضبط بشكل حتمي من فهرس العينة، بحيث تتدرب إطارات مختلفة على أهداف مختلفة (مثل تحديثات الذاكرة مقابل التنفيذ على المستوى المنخفض مقابل VQA) دون أي ربط بلغة بايثون.
الدلالات الزمنية
تبقى الأنماث الدائمة نشطة بعد الإصدار حتى يتم استبدالها:
active_at(t, style=subtask)nth_prev(style=memory, offset=1)nth_next(style=subtask, offset=1)
توجد أنماط الأحداث في طابعها الزمني الدقيق فقط:
emitted_at(t, style=interjection)emitted_at(t, style=vqa, role=user, camera=observation.images.top)emitted_at(t, role=assistant, tool_name=say)
لا يتضمن التطابق الدقيق للأحداث نافذة تسامح، لذا يجب على الكتّاب طبع صفوف الأحداث بطوابع زمنية للإطارات من بيانات parquet.
دقة تعتمد على زاوية العرض
بالنسبة لأنماط المعتمدة على المنظور (vqa وtrace)، يكتسب المُحلِّل مرشح camera= موازياً لـrole= وtool_name=. تُصدر مجموعات البيانات التي تحتوي على عدة كاميرات عادةً زوجاً واحداً (vqa، user) + (vqa، assistant) لكل كاميرا عند نفس الطابع الزمني؛ وبدون camera=، ترى تلك المُحلِّلات تطابقين وترفع خطأً بسبب الغموض. تستهلك الوصفات كل كاميرا عبر ارتباطها الخاص بالإضافة إلى كتلة صورة مطابقة، على سبيل المثال
ask_vqa_top:
route: vqa
bindings:
vqa_query: "emitted_at(t, style=vqa, role=user, camera=observation.images.top)"
vqa: "emitted_at(t, style=vqa, role=assistant, camera=observation.images.top)"
messages:
- role: user
stream: high_level
if_present: vqa_query
content:
- { type: image, feature: observation.images.top }
- { type: text, text: "${vqa_query}" }
- {
role: assistant,
content: "${vqa}",
stream: high_level,
target: true,
if_present: vqa,
}أضِف وصفة فرعية واحدة من هذا النوع لكل كاميرا تسجّلها مجموعة البيانات. يجعل المؤشر الصريح route: vqa تفضيلًا لوسم VQA متناثر مطابق على اختيار المزيج الموزون العادي؛ أما أسماء المكونات فهي وصفية بحتة.
الطبقة 3 — صيغة التدريب
تستخدم العينات المُصيَّرة رسائل دردشة بنمط HF بالإضافة إلى LeRobot sidecars:
sample["messages"]
sample["message_streams"]
sample["target_message_indices"]لا يطبّق المُصيِّر قالب المحادثة الخاص بمُجزّئ الرموز. تُحدِّد مُعالِجات السياسة كيفية تسلسل الرسائل لعمودها الفقري، مما يُبقي نفس مجموعة البيانات قابلة للاستخدام عبر SmolVLA وPi0.5 وأي نموذج VLM مستقبلي يتوقع رسائل محادثة بأسلوب OpenAI.
مزيج
تختار وصفات المزج وصفة فرعية موزونة واحدة بشكل حتمي من فهرس العينة. يدرّب recipes/subtask_mem.yaml مزج النواة المدمجة — وهو يتناول التنبؤ بالمهام الفرعية على مستوى عالٍ، والتنفيذ على مستوى منخفض، والذاكرة. أما recipes/subtask_mem_vqa_speech.yaml فهو النسخة الأوسع التي تضيف أيضًا استجابات أسئلة الرؤية (VQA) والتدخلات المنطوقة.
يُظهر recipes/subtask_joint.yaml تدريب تسلسلي مشترك بدلاً من مزيج موزون. بالنسبة لنفس العينة، يُشرف على مهمة المساعد الفرعية باستخدام إنتروبيا التبادلية للنص على تدفق low_level بينما يبقى التنبؤ بالإجراء نشطاً، بما يتوافق مع الإعداد المشترك من ورقة π0.5. إنه للتدريب فقط حالياً: فبيئة التشغيل لا تعيد بناء هذا البادئة المشتركة عند الاستدلال بعد.
الغياب السلس
إذا كانت عمودا اللغة مفقودين، أو None، أو فارغين، فإن RenderTrainingMessagesStep يستخدم سلسلة المهمة كإشراف منخفض المستوى عندما تكون متاحة، وإلا يترك العينة دون تغيير. بالنسبة لعينة مُعلَّمة، إذا لم تنطبق أي فرع من فروع الوصفة ولم يوجد مسار بديل للمهمة، فإن العرض يعيد None، مما يتيح للمحمِّل إعادة محاولة عينة أخرى.