LeRobot documentation
التوافق العكسي
التوافق العكسي
ترحيل تطبيع السياسة (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السكريبت:
- يستخرج Extracts إحصاءات التطبيع من أوزان النموذج
- ينشئ خطوط أنابيب مسبقة المعالجة ولاحقة المعالجة الخارجية
- إزالة طبقات التطبيع من أوزان النموذج
- يحفظ خطوط أنابيب النموذج والمعالج النظيف
- دفعات إلى 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