# 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.

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

1. قم بتثبيت LeRobot باتباع [دليل التثبيت](./installation).
2. قم بتثبيت تبعيات EVO1:

   ```bash
   pip install -e ".[training,evo1]"
   ```

   لتدريب LIBERO وتقييمه، قم بتثبيت إضافة LIBERO أيضًا:

   ```bash
   pip install -e ".[training,evo1,libero]"
   ```

3. ثبّت عجلة `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.state`
- `action`
- تعليمات مهمة اللغة في حقل `task` في مجموعة البيانات، أو حقل آخر مُهيأ بواسطة `policy.task_field`

تُملأ متجهات الحالة والإجراء حتى `policy.max_state_dim` و`policy.max_action_dim`. ثم تُقصّ التنبؤات مرة أخرى إلى بُعد إجراء مجموعة البيانات قبل إرجاعها.

## الاستخدام

للاستخدام EVO1 في تكوين LeRobot، حدد:

```python
policy.type=evo1
```

بشكل افتراضي، تهيّئ سياسة EVO1 الجديدة نموذج VLM الخاص بها من:

```python
policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf
```

بمجرد توفر نقطة تفتيش بصيغة LeRobot لنموذج EVO1، قم بتحميلها باستخدام:

```python
policy.path=your-org/your-evo1-checkpoint
```

## التدريب

### المرحلة 1

تجمّد المرحلة 1 نموذج VLM وتدرّب رأس الإجراء:

```bash
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، لكنه يبدأ مُحسِّناً ومجدولاً جديدين:

```bash
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:

```bash
# --inference.type=rtc is optional
lerobot-rollout \
  --policy.path=your-org/your-evo1-checkpoint \
  --inference.type=rtc \
  ...
```

## النتائج

### تقييم LIBERO

#### نتيجة مرجعية

> [!NOTE]
> اجتاز نقطة التفتيش المُطلَقة للمرحلة 2 التحقق من التنزيل النظيف والتشغيل: [`zuoxingdong/evo1_libero`](https://huggingface.co/zuoxingdong/evo1_libero)، المراجعة [`515921f4a2c1d3f3ad523721eafa26fdf2af315b`](https://huggingface.co/zuoxingdong/evo1_libero/commit/515921f4a2c1d3f3ad523721eafa26fdf2af315b). استخدم تقييم التنزيل النظيف مراجعة LeRobot [`e40b58a8dfa9e7b86918c374791599d070518d11`](https://github.com/huggingface/lerobot/commit/e40b58a8dfa9e7b86918c374791599d070518d11).

أنتج نقطة التفتيش لمرحلة 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`](https://huggingface.co/zuoxingdong/evo1_libero/blob/515921f4a2c1d3f3ad523721eafa26fdf2af315b/train_config.json). استخدم التشغيل المُقاس بطاقتي H100 مع عمليتي DDP وحجم دفعة 64 لكل عملية، مما يعطي حجم دفعة عالمي 128. استخدمت كلتا المرحلتين نفس البنية. جاء نموذج VLM الأساسي من المراجعة `014c0583a0d4bedf29fbe2dbff4f865eb998e171` من `OpenGVLab/InternVL3-1B-hf`. لا يسجّل المصنوع المُصدَّر التزام LeRobot للتدريب الدقيق أو قفل تبعياته الأصلي، لذا تعيد الأوامر أدناه إنتاج الإعداد والبنية المُسجَّلين من نسخة حالية بدلاً من إعادة بناء بيئة البرمجية بتطابق تام على مستوى البت.

من نسخة المصدر الخاصة بـ LeRobot، ثبّت الاعتمادات المقفّلة وقم بتنزيل تلك المراجعة الدقيقة من VLM:

```bash
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 خطوة:

```bash
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:

```bash
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:

```bash
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 العشرة، حيث يُطلق كل مهمة في عملية جديدة:

```bash
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 حلقة إجمالاً، بينما يطابق العملية الجديدة لكل مهمة في الحلقة بنية إعادة تعيين مولّد الأرقام العشوائية المقاسة.

## المراجع

- [مستودع EVO1](https://github.com/MINT-SJTU/Evo-1)
- [InternVL3-1B-hf](https://huggingface.co/OpenGVLab/InternVL3-1B-hf)

## رخصة

تتبع تكامل LeRobot هذا ترخيص Apache 2.0 المستخدم في LeRobot. تحقق من صفحات نموذجي EVO1 وInternVL3 الأصليين لمعرفة تراخيص نقاط التفتيش والبيانات المنشورة.

