LeRobot documentation

التوافق العكسي

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

التوافق العكسي

ترحيل تطبيع السياسة (PR #1452)

تغيير جوهري: لم تعد سياسات LeRobot تحتوي على طبقات تطبيع مدمجة في أوزانها. يتم الآن التعامل مع التطبيع عبر مكونات PolicyProcessorPipeline خارجية.

ما الذي تغيّر؟

قبل طلب الإرسال #1452بعد طلب الدمج #1452
موضع التطبيعمضمّنة في أوزان النموذج (normalize_inputs.*)مكوّنات PolicyProcessorPipeline الخارجية
حالة النموذجتحتوي على إحصاءات التطبيعأوزان نظيفة فقط - لا توجد معاملات تطبيع
الاستخدامpolicy(batch) يتولى كل شيءpreprocessor(batch) → policy(...) → postprocessor(...)

الأثر على النماذج الموجودة

  • النماذج التي تم تدريبها قبل PR #1452 تحتوي على تطبيع مدمج في أوزانها
  • تتطلب هذه النماذج هجرة للعمل مع نظام PolicyProcessorPipeline الجديد
  • تستخرج عملية الترحيل إحصاءات التطبيع وتُنشئ خطوط معالجة منفصلة

الانتقال من النماذج القديمة

استخدم سكربت الترحيل لتحويل النماذج التي تتضمن تطبيعًا مدمجًا:

python src/lerobot/processor/migrate_policy_normalization.py \
    --pretrained-path lerobot/act_aloha_sim_transfer_cube_human \
    --push-to-hub \
    --branch migrated

السكريبت:

  1. يستخرج Extracts إحصاءات التطبيع من أوزان النموذج
  2. ينشئ خطوط أنابيب مسبقة المعالجة ولاحقة المعالجة الخارجية
  3. إزالة طبقات التطبيع من أوزان النموذج
  4. يحفظ خطوط أنابيب النموذج والمعالج النظيف
  5. دفعات إلى Hub مع إنشاء طلبات دمج تلقائية

استخدام النماذج المُهاجرة

# New usage pattern (after migration)
from lerobot.policies import make_policy, make_pre_post_processors

# Load model and processors separately
policy = make_policy(config, ds_meta=dataset.meta)
preprocessor, postprocessor = make_pre_post_processors(
    policy_cfg=config,
    dataset_stats=dataset.meta.stats
)

# Process data through pipeline
processed_batch = preprocessor(raw_batch)
action = policy.select_action(processed_batch)
final_action = postprocessor(action)

إعادة تصميم واجهة برمجة التطبيقات (API) للأجهزة

تحسّن #777 معايرة LeRobot لكنها غير متوافقة مع الإصدارات السابقة. فيما يلي نظرة عامة على ما تغيّر وكيف يمكنك الاستمرار في العمل مع مجموعات البيانات التي أُنشئت قبل هذا الطلب.

ما الذي تغيّر؟

قبل طلب الإرسال #777بعد طلب الإرسال #777
النطاق المشتركدرجات -180...180°النطاق المُعايَر المفاصل: –100...100 الماسك: 0...100
الموضع الصفري (SO100 / SO101)الذراع ممدودة بالكامل أفقياًفي منتصف المدى لكل مفصل
معالجة الحدودحمايات برمجية للكشف عن الالتفافات ±180 °لا حاجة إلى منطق الالتفاف بسبب الصفر في المدى الأوسط

الأثر على مجموعات البيانات الحالية

  • المسارات المسجّلة التي أُنشئت قبل PR #777 ستُعاد بشكل غير صحيح إذا تم تحميلها مباشرةً:
    • تُعد زوايا المفاصل مُزاحة ومُطبَّعة بشكل غير صحيح.
  • ستحتاج أي نماذج تم ضبطها بدقة أو تدريبها مباشرة على البيانات القديمة إلى تحويل مدخلاتها ومخرجاتها.

استخدام مجموعات البيانات المصنوعة بنظام المعايرة السابق

نوفر مثالاً على سكربت هجرة لإعادة تشغيل حلقة مسجلة باستخدام المعايرة السابقة هنا: examples/backward_compatibility/replay.py. فيما يلي نأخذك في جولة عبر التعديلات التي تُجرى في السكربت النموذجي لجعل مجموعات بيانات المعايرة السابقة تعمل.

+   key = f"{name.removeprefix('main_')}.pos"
    action[key] = action_array[i].item()
+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90

لنُفصّل ذلك. يستخدم كود الأساس الجديد لاحقة .pos لملاحظات الموضع، وقد أزلنا البادئة main_:

key = f"{name.removeprefix('main_')}.pos"

في "shoulder_lift" (المعرّف = 2)، يتم تغيير الموضع 0 بزاوية -90 درجة، وتنعكس الاتجاه مقارنةً بالعايرة/الكود القديم.

action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)

في "elbow_flex" (id = 3)، يتم تغيير الموضع 0 بمقدار -90 درجة مقارنةً بالعايرة/الكود القديم.

action["elbow_flex.pos"] -= 90

للاستخدام من أجل تطبيع الدرجات، نضبط الخيار --robot.use_degrees على true.

python examples/backward_compatibility/replay.py \
    --robot.type=so101_follower \
    --robot.port=/dev/tty.usbmodem5A460814411 \
    --robot.id=blue \
+   --robot.use_degrees=true \
    --dataset.repo_id=my_dataset_id \
    --dataset.episode=0

استخدام السياسات المدرَّبة بنظام المعايرة السابق

تُخرج سياسات الإجراءات بنفس تنسيقات مجموعات البيانات (torch.Tensors). لذلك، يجب تطبيق التحويلات نفسها.

لإيجاد هذه التحويلات، نقترح أولاً إعادة تشغيل حلقة من مجموعة البيانات التي تم تدريب سياستك عليها باستخدام القسم أعلاه. ثم، أضف هذه التحويلات نفسها إلى سكربت الاستدلال لديك (موضح هنا لسكربت يستدعي predict_action، مثل أمثلة evaluate.py في examples/):

action_values = predict_action(
    observation_frame,
    policy,
    get_safe_torch_device(policy.config.device),
    preprocessor,
    postprocessor,
    policy.config.use_amp,
    task=single_task,
    robot_type=robot.robot_type,
    )
    action = {key: action_values[i].item() for i, key in enumerate(robot.action_features)}

+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90
    robot.send_action(action)

إذا كانت لديك أسئلة أو واجهت مشاكل أثناء الترحيل، فلا تتردد في طرحها على Discord

Update on GitHub