LeRobot documentation

سياسة π₀.₅ (Pi05)

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

سياسة π₀.₅ (Pi05)

π₀.₅ هو نموذج رؤية-لغة-إجراء مع تعميم عالم مفتوح، من Physical Intelligence. تم تكييف تنفيذ LeRobot من مستودعهم مفتوح المصدر OpenPI.

نظرة عامة على النموذج

يمثّل π₀.₅ تطورًا كبيرًا عن π₀، الذي طوّره Physical Intelligence لمعالجة تحدٍّ كبير في مجال الروبوتات: التعميم في العالم المفتوح. فبينما يمكن للروبوتات أداء مهام مبهرة في بيئات مُتحكَّم بها، صُمّم π₀.₅ ليتعمّم على بيئات ومواقف جديدة تمامًا لم تُشاهد قطّ أثناء التدريب.

تحدي التعميم

كما توضح شركة Physical Intelligence، فإن التحدي الجوهري لا يكمن في أداء مهام تتطلب الرشاقة أو المهارة، بل في التعميم، أي القدرة على أداء المهام بشكل صحيح في بيئات جديدة مع كائنات جديدة. فكّر في روبوت يقوم بتنظيف منازل مختلفة: كل منزل يحتوي على كائنات مختلفة في أماكن مختلفة. يجب أن يحدث التعميم على مستويات متعددة:

  • المستوى المادي: فهم كيفية التقاط الملعقة (من المقبض) أو الطبق (من الحافة)، حتى مع وجود أجسام غير مرئية في بيئات مزدحمة
  • المستوى الدلالي: فهم دلالات المهمة، مثل مكان وضع الملابس والأحذية (سلة الغسيل، وليس على السرير)، وما هي الأدوات المناسبة لتنظيف الانسكابات
  • المستوى البيئي: التكيف مع بيئات العالم الحقيقي “الفوضوية” مثل المنازل ومتاجر البقالة والمكاتب والمستشفيات

التدريب المشترك على بيانات غير متجانسة

الابتكار الثوري في π₀.₅ هو التدريب المشترك على مصادر بيانات غير متجانسة. يتعلم النموذج من:

  1. بيانات ويب متعددة الوسائط: وصف الصور، الإجابة على الأسئلة البصرية، كشف الكائنات
  2. التعليمات اللفظية: تدريب البشر للروبوتات على مهام معقدة خطوة بخطوة
  3. أوامر المهام الفرعية: تسميات سلوك دلالية عالية المستوى (مثل “التقاط الوسادة” لسرير غير مرتب)
  4. بيانات الروبوتات متعددة الأجساد: بيانات من منصات روبوتية مختلفة ذات قدرات متباينة
  5. بيانات متعددة البيئات: روبوتات ثابتة موزعة عبر العديد من المنازل المختلفة
  6. بيانات التلاعب بالروبوتات المتنقلة: حوالي 400 ساعة من عروض الروبوتات المتنقلة

يُشكّل هذا المزيج المتنوع من التدريب “منهجاً” يتيح التعمّل على المستويات الفيزيائية والبصرية والدلالية في آنٍ واحد.

متطلبات التثبيت

  1. قم بتثبيت LeRobot باتباع دليل التثبيت الخاص بنا.

  2. قم بتثبيت تبعيات Pi0.5 عن طريق تشغيل الأمر التالي:

    pip install -e ".[pi]"

    إذا قمت بتثبيت LeRobot من PyPI:

    pip install 'lerobot[pi]'

الاستخدام

للاستخدام π₀.₅ في إعدادات LeRobot الخاصة بك، حدد نوع السياسة على النحو التالي:

policy.type=pi05

التدريب

البدء السريع على LIBERO

قم بضبط نموذج LIBERO الأساسي على lerobot/libero، وهو نسخة مشفّرة بالفيديو بحجم ~1.9 غيغابايت من العروض التوضيحية التي تقف وراء النتائج أدناه.

يحمل المفاتيح التي يقرأها π₀.₅، وهي نفسها التي ينتجها بيئة LIBERO أثناء التقييم:

ميزةالشكل في مجموعة البياناتكيف يستهلك π₀.₅ ذلك
observation.images.image256×256×3، agentviewتم تغيير الحجم إلى 224×224
observation.images.image2256×256×3، المعصمتم تغيير الحجم إلى 224×224
observation.state8تم تقسيمها إلى 256 حاوية وكتابتها في الاستدعاء
action7يتم توسيدها داخلياً إلى 32؛ يستخدم الخسارة الأبعاد السبعة الأولى

لا حاجة إلى --rename_map هنا — فالمفاتيح متطابقة بالفعل؛ راجع Rename Map and Empty Cameras إذا كانت مفاتيحك مختلفة.

π₀.₅ uses the gated [google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224) tokenizer — accept its license on the Hub and log in with `hf auth login` before training.

مصمم لبطاقة GPU واحدة بسعة 80 جيجابايت:

lerobot-train \
    --dataset.repo_id=lerobot/libero \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_libero_base \
    --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
    --policy.n_action_steps=10 \
    --policy.empty_cameras=1 \
    --policy.freeze_vision_encoder=false \
    --policy.train_expert_only=false \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --policy.push_to_hub=false \
    --output_dir=./outputs/pi05_libero \
    --job_name=pi05_libero \
    --batch_size=64 \
    --num_workers=8 \
    --steps=30000 \
    --save_freq=5000 \
    --seed=1000

التطبيع باستخدام المتوسط/الانحراف المعياري، وليس الافتراضي الكمي الخاص بـ π₀.₅ — بما يتوافق مع pi05_libero_finetuned_v044، وهو نقطة الفحص التي قُيس عليها النتائج أدناه.

--policy.n_action_steps=10 و--policy.empty_cameras=1 صريحة لأن --policy.pretrained_path يُحمّل الأوزان فقط — lerobot/pi05_libero_base يخزّن كلاهما، وإلا فإنهما سيعودان إلى 50 و0 (انظر تحميل نقطة التفتيش).

ثم قيّم نقطة تفتيش باستخدام lerobot-eval وقارنها بمعدلات النجاح المرجعية — راجع LIBERO.

إحصاءات الكتل

يعمل π₀.₅ على تطبيع STATE وACTION باستخدام الفواصل العشرية، لذا يجب أن يحتوي ملف meta/stats.json في مجموعة بياناتك على q01 وq99. تحتوي مجموعات البيانات الأقدم فقط على min/max/mean/std وتفشل عند الدفعة الأولى:

ValueError: QUANTILES normalization mode requires q01 and q99 stats

إعادة حسابها:

lerobot-edit-dataset \
    --repo_id your_dataset \
    --new_repo_id your_dataset \
    --operation.type recompute_stats \
    --operation.overwrite true

تُحفظ النتيجة في $HF_LEROBOT_HOME/your_dataset، وليس في ذاكرة التخزين المؤقت التي يقرأها --dataset.repo_id — لذا درّب النموذج باستخدام --dataset.root=$HF_LEROBOT_HOME/your_dataset، أو أضف --push_to_hub true أعلاه.

أو احتفظ بالبيانات كما هي ومرر --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}'.

تسجيل واستئناف ودمج مقاييس التجميع (quantiles) من ملخصات كل حلقة، بحيث يحتوي meta/stats.json في النهاية على غلاف محافظ (min لـ q <= 50، وmax لـ q > 50) بدلاً من مقاييس التجميع الخاصة بالبيانات الكاملة. لتقدير الأخيرة، امسح كل حلقة باستخدام هيستوغرام متحرك:

python src/lerobot/scripts/augment_dataset_quantile_stats.py \
    --repo-id=your_dataset \
    --overwrite \
    --skip-images

يحافظ --skip-images على إحصاءات الصور الموجودة مسبقًا ويتجنب تنزيل بيانات الفيديو أو فك ترميزها عندما يكون إعادة حساب STATE/ACTION فقط هو المطلوب، بينما يقرأ --root مجموعة بيانات محلية بدلاً من Hub. هذه القيم هي تقديرات مبنية على التوزيعات التكرارية، وتخضع لخطأ التقطيع وإعادة التجميع، لذا قد تختلف عن القيم الحذرة — مما يغيّر الأهداف المعيارية لـ π₀.₅ وبالتالي مقياس دالته الخسارة. الإحصاءات المحفوظة مسبقًا داخل نقطة تحقق موجودة مسبقًا لا تتأثر.

مثال على أمر التدريب

نفس عملية الضبط الدقيق مع تجميد VLM: ذاكرة أقل، مقابل انخفاض في معدل النجاح. استبدل --dataset.repo_id بمجموعتك الخاصة.

lerobot-train \
    --dataset.repo_id=lerobot/libero \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_libero_base \
    --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
    --policy.n_action_steps=10 \
    --policy.empty_cameras=1 \
    --policy.freeze_vision_encoder=true \
    --policy.train_expert_only=true \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --policy.push_to_hub=false \
    --output_dir=./outputs/pi05_libero_expert \
    --job_name=pi05_libero_expert \
    --batch_size=64 \
    --num_workers=8 \
    --steps=30000 \
    --save_freq=5000 \
    --seed=1000

معلمات التدريب الرئيسية

  • --policy.compile_model=true: يُفعّل تجميع النموذج لتسريع التدريب
  • --policy.gradient_checkpointing=true: يقلل من استهلاك الذاكرة بشكل كبير أثناء التدريب
  • --policy.dtype=bfloat16: استخدم تدريب الدقة المختلطة من أجل الكفاءة
  • --batch_size=64: حجم الدفعة للتدريب، عدّل هذا بناءً على ذاكرة وحدة معالجة الرسوميات لديك
  • --policy.pretrained_path=lerobot/pi05_base: نموذج π₀.₅ الأساسي الذي تريد ضبطه، والخيارات المتاحة هي:
  • --policy.optimizer_fused=true: يستخدم AdamW المدمج لخطوات المُحسِّن الأسرع؛ يتم تجاهل هذا العلم عند استئناف التشغيل

RTC اختياري أثناء التدريب

يمكن لـ Pi05 أن يتعلم بشكل اختياري شرطية بادئة الإجراء (action-prefix conditioning) لتفعيل التقطيع في الوقت الفعلي، وذلك تبعاً لـ شرطية الإجراء أثناء التدريب للتقطيع الفعّال في الوقت الفعلي. اضبط policy.rtc_training_max_delay على أكبر تأخير استدلال متوقع بوحدة خطوات المتحكم:

lerobot-train \
    --dataset.repo_id=${HF_USER}/my_dataset \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_base \
    --policy.rtc_training_max_delay=10 \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --batch_size=8 \
    --steps=30000 \
    --output_dir=outputs/pi05_rtc \
    --job_name=pi05_rtc

القيمة الافتراضية هي 0، مما يعطّل RTC أثناء التدريب ويُبقي هدف Pi05 القياسي دون تغيير. يجب أن يكون التأخير المُعدّ أصغر من chunk_size. أثناء التدريب، يجمع Pi05 طول بادئة نظيفة بشكل مستقل لكل مثال، ويحسب خسارة التدفق فقط على البادئة المتبقية.

استخدم نقطة التفتيش الناتجة مع RTC المدرّب بشكل صريح:

lerobot-rollout \
    --strategy.type=base \
    --policy.path=outputs/pi05_rtc/checkpoints/last/pretrained_model \
    --inference.type=rtc \
    --inference.rtc.mode=trained \
    --inference.rtc.execution_horizon=10 \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --task="pick up the cube" \
    --fps=50 \
    --device=cuda

اضبط inference.rtc.execution_horizon بين rtc_training_max_delay الخاص بالنقطة المحفوظة وchunk_size - rtc_training_max_delay، واضبط inference.queue_threshold على قيمة لا تقل عن rtc_training_max_delay. أي ارتفاع عابر في زمن الاستجابة يتجاوز النطاق المُدرَّب عليه يؤدي إلى تجاهل ذلك المقطع وإعادة المحاولة؛ ويتوقف التوليد مع خطأ صريح فقط إذا استمر التأخير خارج النطاق. يبقى الوضع الافتراضي --inference.rtc.mode=guided متاحًا للنقاط المحفوظة العادية.

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

لا يمكن استبدال الصيغتين ببعضهما البعض:

--policy.path--policy.pretrained_path
التحميلاتالأوزان و ملف config.json الخاص بالنقطة المحفوظةالأوزان فقط
أسماء الميزاتمن نقطة التفتيشمن مجموعة بياناتك، بعد --rename_map
الإعدادات المخزنة، مثل n_action_stepsموروثإعادة التعيين إلى القيم الافتراضية
--policy.typeيجب حذفمطلوب
--rename_mapمطلوب عندما تختلف مفاتيح الكاميرا لديكمدعوم لتطبيع مفاتيح مجموعة البيانات

استخدم --rename_map مع أيٍّ من صيغ التحميل عندما تختلف أسماء ميزات البيانات الخام عن أسماء ميزات السياسة. على سبيل المثال، يربط أمر ضبط RoboMME الدقيق أعمدته الخام image وwrist_image وstate وactions أثناء تهيئة الأوزان باستخدام --policy.pretrained_path.

شرح معلمات التدريب

معاملافتراضيالوصف
freeze_vision_encoderfalseلا تُجمِّد مُشفِّر الرؤية
train_expert_onlyfalseلا تُجمّد نموذج VLM، بل درّب جميع المعاملات

💡 نصيحة: ضبط train_expert_only=true يُجمّد نموذج VLM ويدرب خبير الإجراءات والإسقاطات فقط، مما يتيح الضبط الدقيق مع تقليل استهلاك الذاكرة.

ذاكرة الملاحظة قصيرة المدى (MEM)

يمكن لـ Pi05 استخدام سياق بصري وحسي ذاتي قصير المدى بشكل اختياري بناءً على MEM. يتم تعطيل المسارين الافتراضيّين بشكل افتراضي، وبالتالي تحتفظ نقاط التفتيش وأوامر التدريب الحالية بسلوك إطار واحد لـ Pi05.

تنفّذ هذه الوحدة ذاكرة الأفق القصير الخاصة بـ MEM فقط — أي مُشفّر الفيديو من القسم III-C والتقدير الحسّي الذاتي من القسم III-D. أما ذاكرة اللغة طويلة الأفق الخاصة بـ MEM (القسم III-B)، حيث يتنبأ سياسة عالية المستوى بالمهمة الفرعية التالية وملخص طبيعي مضغوط لما حدث حتى الآن، فلم تُنفَّذ. في تجارب العزل الواردة في الورقة، استعادت ذاكرة الفيديو وحدها جزءًا فقط من تقدّم المهمة الكامل لـ MEM في المهام طويلة الأفق.

إن إدخال الذاكرة عند الضبط الدقيق من نقطة تحقق تم تدريبها مسبقًا دونها يتوافق أيضًا مع اختبار MEM-Posttrain-Only الأضعف في الورقة. النتائج الرئيسية لـ MEM تأتي من تدريب مُشفِّر الفيديو على خليط متنوع من مقاطع فيديو الروبوت وغير الروبوت، وهو ما لا توفره أي نقطة تحقق عامة لـ Pi05 حاليًا.

فعّله أثناء الضبط الدقيق باستخدام:

lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi05 \
    --policy.pretrained_path=lerobot/pi05_base \
    --policy.use_visual_memory=true \
    --policy.memory_frames=6 \
    --policy.memory_stride=30 \
    --policy.memory_temporal_attention_every=4 \
    ...

يتضمن memory_frames الملاحظة الحالية. يُقاس memory_stride بوحدة إطارات مجموعة البيانات وليس بالثواني، لذا قم بتعديله بناءً على fps لمجموعة بياناتك: يتدرب MEM مسبقًا على ست ملاحظات متباعدة بمقدار ثانية واحدة، وهو ما يعادل memory_stride=30 لمجموعة بيانات بمعدل 30 إطارًا في الثانية (القيمة الافتراضية) بينما يعادل memory_stride=10 لمجموعة بيانات بمعدل 10 إطارات في الثانية مثل lerobot/robomme.

تستبدل كل طبقة SigLIP رابعة انتباهها بانتباه MEM المكوّن من الزمان والمكان: انتباه زمني سببي بين رموز الباتش المتطابقة، يُركَّب مع الانتباه المكاني القياسي ويعيد استخدام الإسقاطات المُدرَّبة مسبقًا، بحيث لا تُضاف أي معاملات قابلة للتعلم إلى برج الرؤية. تُسقط رموز الإطارات السابقة بمجرد تشغيل آخر طبقة من هذا النوع، مما يحافظ على طول بادئة اللغة/الإجراء التالية دون تغيير.

تُملأ السجلات غير المتوفرة في بداية الحلقة وتُخفى. عند الاستدلال، يحافظ Pi05 على سجل الصور المتباعد بنفس الطريقة داخليًا، ويمسحه كلما أُعيد تعيين السياسة.

الاستشعار الذاتي التاريخي هو خيار مستقل:

--policy.use_proprioceptive_memory=true

عند التفعيل، يُضاف رمز حالة مستمر مُسقَط واحد لكل إطار محتفظ به، وتُزال الحالة المُفصَّلة من موجه النص بحيث تكون الحالة ممثلةً مرة واحدة بالضبط (القسم III-D من MEM). وهذا يُغيّر صيغة الموجه، لذا فعّله منذ بداية التدريب بدلاً من تفعيله في منتصفه. تستخدم الذاكرة البصرية والذاكرة الحسية الحركية نفس إعدادات memory_frames وmemory_stride، لكن يمكن تفعيل أي مسار منهما بشكل مستقل. درّب أو حسّن النموذج مع خيارات الذاكرة المختارة؛ فالتفعيل فقط عند الاستدلال لا يمنح سلوك ذاكرة مُتعلَّمة لنقطة تفتيش إطار واحد.

تحت PEFT، يتم تدريب proprio_history_proj وحفظه بالكامل عبر modules_to_save، لأنه لا يحتوي على أوزان مسبقة التدريب يمكن تكييفها.

عند الاستدلال، يحافظ MEM على طابور تاريخ مُجمَّع واحد، ويفترض أن كل صف في الدفعة يتشارك حدود الحلقات. يحقق lerobot-eval ذلك من خلال استدعاء policy.reset() قبل كل نشر مُجمَّع وقبل إعادة تعيين البيئة المتجهية. لا يُدعم إعادة تعيين الصفوف تلقائيًا بشكل مستقل في دفعة متجهية غير متزامنة؛ ابدأ نشرًا جديدًا بحيث تُعاد تعيين طوابير السياسة والإجراءات كاملة معًا.

الإجراءات النسبية

بشكل افتراضي، يتنبأ π₀.₅ بإجراءات مطلقة. يمكنك تفعيل الإجراءات النسبية بحيث يتنبأ النموذج بإزاحات نسبية لحالة الروبوت الحالية. قد يحسّن ذلك استقرار التدريب لبعض التكوينات.

لاستخدام الإجراءات النسبية، أعد أولاً حساب إحصاءات مجموعة البيانات الخاصة بك في الفضاء النسبي عبر سطر الأوامر:

lerobot-edit-dataset \
    --repo_id your_dataset \
    --new_repo_id your_dataset \
    --operation.type recompute_stats \
    --operation.overwrite true \
    --operation.relative_action true \
    --operation.chunk_size 50 \
    --operation.relative_exclude_joints "['gripper']" \
    --push_to_hub true

أو ما يعادلها بلغة بايثون:

from lerobot.datasets import LeRobotDataset, recompute_stats

dataset = LeRobotDataset("your_dataset")
recompute_stats(dataset, relative_action=True, chunk_size=50, relative_exclude_joints=["gripper"])
dataset.push_to_hub()

يجب أن يتطابق chunk_size مع chunk_size الخاص بسياساتك (الافتراضي 50 لـ π₀.₅). يحدد relative_exclude_joints أسماء المفاصل التي يجب أن تبقى في الفضاء المطلق (مثل أوامر الماسك). استخدم --push_to_hub true لرفع الإحصائيات المحدّثة إلى Hub.

ثم درّب مع تمكين الإجراءات النسبية:

lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi05 \
    --policy.use_relative_actions=true \
    --policy.relative_exclude_joints='["gripper"]' \
    ...

نتائج الأداء

نتائج معيار Libero

أثبت π₀.₅ أداءً قويًا على مجموعة اختبارات Libero. وللمقارنة واختبار تطبيق LeRobot الخاص به، قمنا بضبط نموذج libero الأساسي لخطوات إضافية قدرها 6k على مجموعة بيانات Libero، وقارنّا النتائج بنتائج OpenPI المرجعية.

معايرةتنفيذ LeRobotمرجع OpenPI
Libero Spatial97.0%98.8%
Libero Object99.0%98.2%
هدف ليبرو98.0%98.0%
Libero 1096.0%92.4%
المتوسط97.5%96.85%

تُظهر هذه النتائج قدرات التعميم القوية لنموذج π₀.₅ عبر مهام التلاعب الروبوتي المتنوعة. لإعادة إنتاج هذه النتائج، يمكنك اتباع التعليمات الموجودة في قسم Libero.

رخصة

يتبع هذا النموذج رخصة Apache 2.0، بما يتوافق مع مستودع OpenPI الأصلي.

Update on GitHub