LeRobot documentation
EVO1
EVO1
EVO1 هو سياسة رؤية-لغة-إجراء للتحكم في الروبوتات، مبني حول هيكل أساسي InternVL3 ورأس إجراء مستمر يعتمد على مطابقة التدفق. يكشف تكامل LeRobot عن EVO1 كنوع سياسة قياسي، مما يتيح تدريبه وتقييمه باستخدام واجهات برمجة التطبيقات المعتادة لمجموعة بيانات LeRobot ونقطة التفتيش ومعالج البيانات.
نظرة عامة على النموذج
The policy embeds one or more camera images and the language task prompt with InternVL3, pads robot state/action vectors to fixed maximum dimensions, and predicts future action chunks with a flow-matching action head. During inference, the policy samples an action chunk and returns n_action_steps actions from that chunk before sampling again.
ما تغطيه تكامل LeRobot
- إعداد
policy.type=evo1القياسي من خلال LeRobot - تضمين الصور والنصوص في InternVL3 مع خيار الرجوع إلى FlashAttention
- التحكم في الضبط الدقيق القائم على المراحل لتشغيلات الضبط الدقيق الخاصة برأس الإجراء فقط وتشغيلات الضبط الدقيق لنماذج الرؤية-اللغة
- التنبؤ بالإجراء باستخدام مطابقة التدفق المستمر
- حفظ/تحميل نقاط التفتيش عبر واجهات برمجة تطبيقات سياسات LeRobot
- التدريب باستخدام
lerobot-trainوالتقييم باستخدام واجهات برمجة التطبيقات القياسية للاستدلال على السياسات
قد يتضمن مشروع EVO1 الأوسع نطاقًا سكربتات تدريب إضافية وأدوات لمجموعات البيانات. تركز هذه الصفحة على مسار سياسة التحكم في الروبوت الخاصة بـ LeRobot.
متطلبات التثبيت
قم بتثبيت LeRobot باتباع دليل التثبيت.
قم بتثبيت تبعيات EVO1:
pip install -e ".[training,evo1]"لتدريب LIBERO وتقييمه، قم بتثبيت إضافة LIBERO أيضًا:
pip install -e ".[training,evo1,libero]"ثبّت عجلة
flash-attnفقط إذا كانت متوافقة مع بيئة Python وPyTorch وCUDA وبطاقة GPU لديك. يلجأ EVO1 إلى الانتباه القياسي عندما لا يتوفرflash_attn.
يستخدم EVO1 تطبيق InternVL الأصلي في مكتبة transformers الخاصة بـ Hugging Face، لذا يجب أن يشير policy.vlm_model_name إلى نقطة تفتيش محوّلة بشكل أصلي مثل OpenGVLab/InternVL3-1B-hf (لاحظ لاحقة -hf). يقوم التشغيل الأول بتنزيل نقطة تفتيش VLM المُهيّأة، بينما تعيد التشغيلات اللاحقة استخدامها من ذاكرة التخزين المؤقت في Hugging Face.
متطلبات البيانات
يتوقع EVO1 مجموعة بيانات LeRobot تتضمن:
- من واحد إلى
policy.max_viewsمن الملاحظات البصرية، على سبيل المثالobservation.images.image observation.stateaction- تعليمات مهمة اللغة في حقل
taskفي مجموعة البيانات، أو حقل آخر مُهيأ بواسطةpolicy.task_field
تُملأ متجهات الحالة والإجراء حتى policy.max_state_dim وpolicy.max_action_dim. ثم تُقصّ التنبؤات مرة أخرى إلى بُعد إجراء مجموعة البيانات قبل إرجاعها.
الاستخدام
للاستخدام EVO1 في تكوين LeRobot، حدد:
policy.type=evo1بشكل افتراضي، تهيّئ سياسة EVO1 الجديدة نموذج VLM الخاص بها من:
policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf
بمجرد توفر نقطة تفتيش بصيغة LeRobot لنموذج EVO1، قم بتحميلها باستخدام:
policy.path=your-org/your-evo1-checkpoint
التدريب
المرحلة 1
تجمّد المرحلة 1 نموذج VLM وتدرّب رأس الإجراء:
lerobot-train \ --dataset.repo_id=your_org/your_dataset \ --policy.type=evo1 \ --policy.training_stage=stage1 \ --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \ --policy.device=cuda \ --policy.chunk_size=50 \ --policy.n_action_steps=50 \ --policy.max_state_dim=24 \ --policy.max_action_dim=24 \ --policy.optimizer_lr=1e-5 \ --batch_size=4 \ --steps=5000 \ --output_dir=./outputs/evo1_stage1
المرحلة 2
يحمّل المرحلة 2 سياسة المرحلة 1، لكنه يبدأ مُحسِّناً ومجدولاً جديدين:
lerobot-train \ --dataset.repo_id=your_org/your_dataset \ --policy.path=./outputs/evo1_stage1/checkpoints/005000/pretrained_model \ --policy.training_stage=stage2 \ --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \ --policy.device=cuda \ --policy.chunk_size=50 \ --policy.n_action_steps=50 \ --policy.max_state_dim=24 \ --policy.max_action_dim=24 \ --policy.optimizer_lr=1e-5 \ --batch_size=4 \ --steps=80000 \ --output_dir=./outputs/evo1_stage2
بشكل افتراضي، يعيد policy.training_stage تطبيق الإعدادات الافتراضية للضبط الدقيق الخاصة بتلك المرحلة. وهذا أمر مهم عند بدء المرحلة 2 من نقطة تفتيش المرحلة 1، لأن إعدادات نقطة تفتيش المرحلة 1 تخزّن أعلام ضبط الدقة الخاصة بنموذج اللغة البصرية (VLM) معطّلة. وتتمتع إعدادات المرحلة الافتراضية بأولوية على أعلام policy.finetune_* المخزّنة أو المُدخلة يدوياً، ما لم يكن policy.apply_training_stage_defaults=false، لذا اضبط هذا العلم فقط عند التحكم يدوياً في كل أعلام الضبط الدقيق.
معلمات التدريب الرئيسية
| معامل | افتراضي | الوصف |
|---|---|---|
policy.vlm_model_name | OpenGVLab/InternVL3-1B-hf | نقطة تفتيش InternVL3 أو دليل نموذج محلي تم تحويلها بشكل أصلي |
policy.training_stage | stage1 | stage1 يدرب رأس الإجراء؛ stage2 يضبط فروع VLM |
policy.apply_training_stage_defaults | true | يعيد تطبيق الإعدادات الافتراضية لضبط المرحلة بعد تحميل نقطة التفتيش |
policy.vlm_num_layers | 14 | عدد طبقات اللغة في InternVL3 التي تُحفظ للسياسة |
policy.dtype | bfloat16 | نوع البيانات المطلوب لنموذج VLM |
policy.use_flash_attn | true | يتطلب FlashAttention عند تثبيته؛ وإلا فإنه يعود إلى |
policy.enable_gradient_checkpointing | true | يتيح إنشاء نقاط تفتيش على وحدات InternVL3 المدعومة |
policy.gradient_checkpointing_use_reentrant | false | الإعداد المعاد الدخول الذي يُمرَّر إلى نقطة التفتيش للتدرجات عند دعمه |
policy.chunk_size | 50 | عدد الإجراءات المستقبلية المتوقعة لكل شريحة |
policy.n_action_steps | 50 | عدد الإجراءات المستهلكة من المقطع المُسحوب |
policy.max_state_dim | 24 | بُعد الحشو للحالة |
policy.max_action_dim | 24 | بُعد حشو الإجراء |
policy.postprocess_action_dim | null | بعد المعالجة اللاحقة لـ EVO1 |
policy.binarize_gripper | false | يحوّل قناة الماسك بعد المعالجة إلى قيم ثنائية لتقييم بنمط LIBERO |
policy.task_field | task | حقل الدفعة المستخدم كموجّه للغة |
الاستدلال
جرّبها مع نقطة تحقق مدرّبة من EVO1:
# --inference.type=rtc is optional
lerobot-rollout \
--policy.path=your-org/your-evo1-checkpoint \
--inference.type=rtc \
...النتائج
تقييم LIBERO
نتيجة مرجعية
اجتاز نقطة التفتيش المُطلَقة للمرحلة 2 التحقق من التنزيل النظيف والتشغيل:
zuoxingdong/evo1_libero، المراجعة515921f4a2c1d3f3ad523721eafa26fdf2af315b. استخدم تقييم التنزيل النظيف مراجعة LeRobote40b58a8dfa9e7b86918c374791599d070518d11.
أنتج نقطة التفتيش لمرحلة 2 في التشغيل الواحد عند الخطوة 70,000:
| Suite | الحلقات الناجحة | الحلقات | معدل النجاح |
|---|---|---|---|
| LIBERO المكانية | 485 | 500 | 97.0% |
| LIBERO Object | 496 | 500 | 99.2% |
| هدف LIBERO | 483 | 500 | 96.6% |
| LIBERO-10 | 469 | 500 | 93.8% |
| الإجمالي | 1,933 | 2,000 | 96.65% |
تستخدم هذه النتائج نقطة تحقق واحدة مُدرَّبة وبذرة تقييم 1000؛ وهي ليست متوسطًا متعدد البذور أو تقديرًا للثقة.
وصفة التدريب المرجعية
يسجّل نقطة التفتيش المُصدَّرة إعداد مرحلة 2 المُحلَّلة بالكامل في train_config.json.
استخدمت التجربة المُقاسة وحدتي معالجة رسومية H100 مع عمليتي DDP وحجم دفعة 64 لكل عملية، مما يعطي حجم دفعة عالمي 128. استخدمت كلتا المرحلتين نفس البنية. جاء نموذج VLM الأساسي من المراجعة 014c0583a0d4bedf29fbe2dbff4f865eb998e171 من OpenGVLab/InternVL3-1B-hf.
لا يسجّل المصنوع المُصدَّر التزام LeRobot للتدريب الدقيق أو قفل تبعياته الأصلي،
لذلك تعيد الأوامر أدناه إنتاج الإعداد والبنية المُسجَّلين من نسخة حالية بدلاً من
إعادة بناء بيئة البرمجية بتطابق تام على مستوى البت.
من نسخة المصدر الخاصة بـ LeRobot، ثبّت الاعتمادات المقفّلة وقم بتنزيل تلك المراجعة الدقيقة من VLM:
uv sync --locked --extra training --extra evo1 --extra libero
VLM_DIR=$(uv run hf download OpenGVLab/InternVL3-1B-hf \
--revision=014c0583a0d4bedf29fbe2dbff4f865eb998e171)تجمّد المرحلة 1 نموذج VLM وتدرّب رأس الإجراء لعدد 5,000 خطوة:
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--dataset.return_uint8=true \
--dataset.image_transforms.enable=true \
--dataset.use_imagenet_stats=true \
--dataset.eval_split=0.0 \
--policy.type=evo1 \
--policy.training_stage=stage1 \
--policy.apply_training_stage_defaults=true \
--policy.vlm_model_name="${VLM_DIR}" \
--policy.vlm_num_layers=14 \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.use_amp=true \
--policy.use_flash_attn=true \
--policy.enable_gradient_checkpointing=true \
--policy.gradient_checkpointing_use_reentrant=false \
--policy.image_resolution='[448,448]' \
--policy.chunk_size=50 \
--policy.n_action_steps=50 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.dropout=0.2 \
--policy.optimizer_lr=1e-5 \
--policy.optimizer_weight_decay=1e-3 \
--policy.optimizer_grad_clip_norm=1.0 \
--policy.scheduler_warmup_steps=1000 \
--policy.push_to_hub=false \
--use_policy_training_preset=true \
--batch_size=64 \
--steps=5000 \
--save_checkpoint=true \
--save_checkpoint_to_hub=false \
--save_freq=2500 \
--log_freq=10 \
--env_eval_freq=0 \
--num_workers=4 \
--prefetch_factor=2 \
--persistent_workers=true \
--seed=1000 \
--trackio.enable=false \
--output_dir=./outputs/evo1-libero-stage1-g128-5kتحمّل المرحلة 2 سياسة المرحلة 1 لكنها تبدأ بمُحسِّن ومجدول جديدين. يتم التدريب لمدة 80,000 خطوة؛ والنقطة المحفوظة المُبلَّغ عنها هي تلك المحفوظة عند الخطوة 70,000:
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--dataset.return_uint8=true \
--dataset.image_transforms.enable=true \
--dataset.use_imagenet_stats=true \
--dataset.eval_split=0.0 \
--policy.path=./outputs/evo1-libero-stage1-g128-5k/checkpoints/005000/pretrained_model \
--policy.training_stage=stage2 \
--policy.apply_training_stage_defaults=true \
--policy.vlm_model_name="${VLM_DIR}" \
--policy.vlm_num_layers=14 \
--policy.dtype=float32 \
--policy.device=cuda \
--policy.use_amp=true \
--policy.use_flash_attn=true \
--policy.enable_gradient_checkpointing=true \
--policy.gradient_checkpointing_use_reentrant=false \
--policy.image_resolution='[448,448]' \
--policy.chunk_size=50 \
--policy.n_action_steps=50 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.dropout=0.2 \
--policy.optimizer_lr=1e-5 \
--policy.optimizer_weight_decay=1e-3 \
--policy.optimizer_grad_clip_norm=1.0 \
--policy.scheduler_warmup_steps=1000 \
--policy.push_to_hub=false \
--use_policy_training_preset=true \
--batch_size=64 \
--steps=80000 \
--resume=false \
--save_checkpoint=true \
--save_checkpoint_to_hub=false \
--save_freq=10000 \
--log_freq=10 \
--env_eval_freq=0 \
--num_workers=4 \
--prefetch_factor=2 \
--persistent_workers=true \
--seed=1000 \
--trackio.enable=false \
--output_dir=./outputs/evo1-libero-stage2-g128-80kملف تقييم بصيغة المؤلف
يستخدم ملف EVO1 LIBERO بصيغة المؤلف أسماء ميزات الكاميرا الخام الخاصة بـ LIBERO (observation.images.agentview_image وobservation.images.robot0_eye_in_hand_image)، ويعيد التخطيط كل 14 إجراءً، ويحوّل أمر المقبض إلى قيمة ثنائية قبل تحريك المحاكِ. يمكن لمعالج ما بعد السياسة الخاص بـ EVO1 اقتصاص الإجراء المُملأ ذي الأبعاد الـ 24 إلى فضاء إجراءات LIBERO ذي الأبعاد الـ 7 وتطبيق تحويل المقبض الثنائي ذلك. لتقييم نقطة تحقق بصيغة المؤلف ضمن نفس إعداد حلقة واحدة لكل مهمة، احتفظ بأسماء الكاميرا الخام بدلاً من تعيين image/image2 الافتراضي، وفعّل أعلام ما بعد معالجة إجراءات LIBERO:
lerobot-eval \
--policy.path=your-org/your-evo1-libero-checkpoint \
--policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
--policy.device=cuda \
--policy.use_flash_attn=true \
--policy.n_action_steps=14 \
--policy.postprocess_action_dim=7 \
--policy.binarize_gripper=true \
--env.type=libero \
--env.task=libero_object \
--env.camera_name_mapping="{agentview_image: agentview_image, robot0_eye_in_hand_image: robot0_eye_in_hand_image}" \
--env.observation_height=448 \
--env.observation_width=448 \
--eval.batch_size=1 \
--eval.n_episodes=1ملف lerobot/libero v3 الأصلي
تخزّن المراجعة a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 ميزات الكاميرا على شكل image وimage2. يقيّم هذا المثال جميع مهام LIBERO Object العشرة، حيث يُطلق كل مهمة في عملية جديدة:
export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl
suite=libero_object
horizon=280
for task_id in {0..9}; do
lerobot-eval \
--policy.path=zuoxingdong/evo1_libero \
--policy.pretrained_revision=515921f4a2c1d3f3ad523721eafa26fdf2af315b \
--policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
--policy.device=cuda \
--policy.use_amp=true \
--policy.dtype=bfloat16 \
--policy.use_flash_attn=false \
--policy.enable_gradient_checkpointing=false \
--policy.vlm_num_layers=14 \
--policy.image_resolution='[448,448]' \
--policy.max_text_length=1024 \
--policy.chunk_size=50 \
--policy.n_action_steps=14 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.num_inference_timesteps=32 \
--policy.postprocess_action_dim=7 \
--policy.binarize_gripper=true \
--policy.gripper_threshold=0.0 \
--policy.gripper_below_threshold_value=-1.0 \
--policy.gripper_above_threshold_value=1.0 \
--env.type=libero \
--env.task="${suite}" \
--env.task_ids="[${task_id}]" \
--env.camera_name=agentview_image,robot0_eye_in_hand_image \
--env.camera_name_mapping="{agentview_image: image, robot0_eye_in_hand_image: image2}" \
--env.control_mode=relative \
--env.obs_type=pixels_agent_pos \
--env.observation_width=448 \
--env.observation_height=448 \
--env.init_states=true \
--env.episode_length="${horizon}" \
--env.render_mode=rgb_array \
--env.max_parallel_tasks=1 \
--eval.n_episodes=50 \
--eval.batch_size=1 \
--eval.use_async_envs=false \
--eval.recording=false \
--seed=1000 \
--output_dir="./outputs/evo1-libero-stage2-70k-eval/${suite}/task-${task_id}" \
--job_name="evo1-libero-stage2-70k-${suite}-task-${task_id}"
doneشغّل جميع معرّفات المهام العشرة لكل مجموعة باستخدام هذه الآفاق:
env.task | env.episode_length |
|---|---|
libero_spatial | 280 |
libero_object | 280 |
libero_goal | 300 |
libero_10 | 520 |
اضبط suite وhorizon لكل صف. وهذا يمنح 500 حلقة لكل مجموعة و2,000 حلقة إجمالاً، بينما يطابق العملية الجديدة لكل مهمة في الحلقة طوبولوجيا إعادة تعيين مولّد الأرقام العشوائية المقاسة.
المراجع
رخصة
تتبع تكامل LeRobot هذا ترخيص Apache 2.0 المستخدم في LeRobot. تحقق من صفحات نموذجي EVO1 وInternVL3 الأصليين لمعرفة تراخيص نقاط التفتيش والبيانات المنشورة.
Update on GitHub