# دليل حسابات الأجهزة لتدريب LeRobot

تقدير تقريبي لتدريب سياسة LeRobot: مقدار ذاكرة VRAM التي تحتاجها كل سياسة، ومدة التدريب المتوقعة، وأين يجب التنفيذ عندما لا تكون الأجهزة المحلية كافية.

الأرقام أدناه **توضيحية** — وهي أرقام تقريبية من حيث الرتبة لاختيار العتاد، وليست تنبؤات دقيقة. يعتمد معدل الإنتاجية بشكل كبير على مدخلات ومخرجات مجموعة البيانات، ودقة الصورة، وحجم الدفعة، وعدد وحدات معالجة الرسومات.

## الذاكرة حسب مجموعة السياسة

تتجمع السياسات حسب حجم العمود الفقري؛ وتوفر التقسيمات أدناه سقفًا ذاكرةً واحدة لكل مجموعة بدلاً من تكرار الأرقام لكل سياسة. تتوسع الذاكرة بشكل خطي تقريبًا مع حجم الدفعة؛ ويحمل AdamW (الافتراضي في LeRobot) حالة المُحسِّن التي تضيف ما يقارب 30–100% فوق مسار الأمامي والخلفي وحده.

| مجموعة      | سياسات                                    | ذروة ذاكرة VRAM (حجم الدفعة 8، AdamW) | بطاقات الرسوميات المناسبة للمبتدئين             |
| ---------- | ------------------------------------------- | ----------------------: | --------------------------------- |
| BC خفيف   | `act`, `vqbet`, `tdmpc`                     |                  ~2–6GB | بطاقة الرسوميات في الحاسوب المحمول (RTX 3060)، L4، A10G   |
| الانتشار  | `diffusion`, `multi_task_dit`               |                 ~8–14GB | RTX 4070+ / L4 / A10G             |
| VLA صغير  | `smolvla`                                   |                ~10–16GB | RTX 4080+ / L4 / A10G             |
| VLA كبير  | `pi0`, `pi0_fast`, `pi05`, `xvla`, `wall_x` |                ~24–40GB | A100 40 GB+ (24 GB ضيّق عند BS 1) |
| متعدد الوسائط | `groot`, `eo1`                              |                ~24–40GB | A100 40 GB+                       |
| RL         | `sac`                                       |             config-dep. | راجع [دليل HIL-SERL](./hilserl)   |

هل المشكلة مرتبطة بالذاكرة؟ قلّل حجم الدفعة (بشكل خطي تقريبًا)، واستخدم تراكم التدرجات لاستعادة حجم الدفعة الفعّال، أو في حالة SmolVLA اترك `freeze_vision_encoder=True`.

## وقت التدريب

عادةً ما يتقارب تعلّم التقليد في الروبوتات خلال **5–10 فترات تدريب على مجموعة البيانات**، وليس مئات الآلاف من الخطوات الخام. بمجرد معرفتك لعدد الفترات، يكون الوقت الفعلي بشكل أساسي:

```text
total_frames    = sum of frames over all episodes      # 50 ep × 30 fps × 30 s ≈ 45,000
steps_per_epoch = ceil(total_frames / (num_gpus × batch_size))
total_steps     = epochs × steps_per_epoch
wall_clock      ≈ total_steps × per_step_time
```

يعتمد زمن كل خطوة على السياسة وبطاقة الرسوميات. الأرقام الواردة في الجدول أدناه هي نقاط مرجعية — اختر الصف الأقرب إلى إعداداتك وقم بالتعديل خطيًا باستخدام `total_steps` إذا كنت تدرب لفترة أطول أو أقصر.

### السيناريوهات الشائعة

زمن التنفيذ التقريبي لـ **5 فترات على مجموعة بيانات من ~50 حلقة (~45 ألف إطار بمعدل 30 إطارًا في الثانية × 30 ثانية)**، مع المُحسِّن الافتراضي (AdamW) وصور بدقة 640×480:

| الإعداد                                | سياسة         | دفعة | الوقت الفعلي |
| ------------------------------------ | -------------- | ----- | ---------: |
| RTX 4090 / RTX 3090 واحدة (24 جيجابايت)   | `act`          | 8     |  ~30–60 دقيقة |
| RTX 4090 / RTX 3090 واحدة (24 جيجابايت)   | `diffusion`    | 8     |      ~2–4h |
| وحدة L4 / A10G واحدة (24 جيجابايت)             | `act`          | 8     |      ~1–2h |
| وحدة L4 / A10G واحدة (24 جيجابايت)             | `smolvla`      | 4     |      ~3–6h |
| وحدة A100 واحدة بسعة 40 جيجابايت                    | `smolvla`      | 16    |      ~1–2h |
| وحدة A100 واحدة بسعة 40 جيجابايت                    | `pi0` / `pi05` | 4     |      ~4–8h |
| عقدة 4× H100 80 GB (`accelerate`) | `diffusion`    | 32    |  ~30–60 دقيقة |
| عقدة 4× H100 80 GB (`accelerate`) | `smolvla`      | 32    |      ~1–2h |
| Apple Silicon M1/M2/M3 Max (MPS)     | `act`          | 4     |     ~6–14h |

هذه أرقام تقريبية من حيث الرتبة. تتباعد النتائج الفعلية بنسبة ±50% اعتمادًا على دقة الصورة، ومدخلات ومخرجات مجموعة البيانات، وخيوط محمّل البيانات، ونوع بطاقة GPU المحدد. وهي مفيدة كحدس للإجابة عن سؤال «هل ستستغرق هذه العملية ساعة أم يومًا؟»، وليست التزامات بمستوى الخدمة (SLAs).

### تعدّ بطاقة GPU متعددة أمراً بالغ الأهمية

`accelerate launch --num_processes=N` هو الأسهل لتقليل وقت التدريب. يعالج كل خطوة مُحسِّن `N × batch_size` عينة في وقت حقيقي تقريبي مماثل لخطوة بطاقة GPU واحدة، لذا فإن 4 بطاقات GPU تعني تسريعًا يقارب 4 أضعاف للتشغيلات المحددة بالحساب. راجع دليل [التدريب متعدد بطاقات GPU](./multi_gpu_training) للإعداد الكامل.

نقاط بيانات مرجعية على عناقيد 4×H100 80 GB (`accelerate launch --num_processes=4`)، 5000 خطوة، حجم دفعة 32، AdamW، مجموعة بيانات [`imstevenpmwork/super_poulain_draft`](https://huggingface.co/datasets/imstevenpmwork/super_poulain_draft) (حوالي 50 حلقة، صور بحجم 640×480 تقريبًا):

| سياسة      | الوقت الفعلي | `update_s` | `dataloading_s` | استخدام وحدة المعالجة الرسومية | أعلام بارزة                                                                                                                  |
| ----------- | ---------- | ---------: | --------------: | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `diffusion` | 16m 17s    |      0.167 |           0.015 | ~90%     | القيم الافتراضية (التدريب من الصفر)                                                                                               |
| `smolvla`   | 27m 49s    |      0.312 |           0.011 | ~80%     | `--policy.path=lerobot/smolvla_base`, `freeze_vision_encoder=false`, `train_expert_only=false`                                 |
| `pi05`      | 3h 41m     |      2.548 |           0.014 | ~95%     | `--policy.pretrained_path=lerobot/pi05_base`، `gradient_checkpointing=true`، `dtype=bfloat16`، مُرمِّز الرؤية + الخبير مُدرَّب |

تفصل سجلات التدريب التكرار الكامل إلى `dataloading_s` (`next(dl_iter)`)، و`preprocessing_s` (تحويل الصور وخط أنابيب السياسة)، و`update_s` (تحديث المُحسِّن). يغطي `step_s` جميع هذه العناصر الثلاثة ويحدد قيمة `samples_per_s`. يسبق المعيار أعلاه هذا التقسيم، لذا فإن `dataloading_s` فيه يتضمن المعالجة المسبقة.

### الجدولة ونقاط التفتيش

إذا قمت بتقصير التدريب (مثل 5k–10k خطوة على مجموعة بيانات صغيرة)، فقصّر جدول معدل التعلم أيضًا باستخدام `--policy.scheduler_decay_steps≈--steps`. وإلا فإن معدل التعلم سيبقى قريبًا من ذروته ولن يتناقص أبدًا. الأمر نفسه ينطبق على `--save_freq`.

## أين يتم التشغيل

ذاكرة VRAM هي المعيار الأول. ضمن الفئة الواحدة، اختر بناءً على الميزانية والتوفر — الأعمدة `$`–`$$$$` نسبية؛ تحقق من الأسعار الحالية لدى المزود الذي تستخدمه فعليًا.

| فئة                      | VRAM  | الدرجة   | مريح لـ                                             |
| -------------------------- | ----- | ------ | ----------------------------------------------------------- |
| RTX 3090 / 4090 (استهلاكية) | 24 جيجابايت | `$`    | BC الخفيف، الانتشار، SmolVLA. ضيق عند حجم الدفعة 1 لـ VLAs.    |
| L4 / A10G (سحابي)          | 24 جيجابايت | `$–$$` | نفس الغلاف؛ شائع في Google Cloud وRunPod وAWS `g5/g6`. |
| A100 40 GB                 | 40 جيجابايت | `$$$`  | أي سياسة عند أحجام دفعات معقولة.                       |
| A100 80 GB / H100 80 GB    | 80 جيجابايت | `$$$$` | عناقيد متعددة المعالجات الرسومية؛ دفعات كبيرة لنماذج VLA.                 |
| **التشغيل على المعالج فقط**               | —     | —      | لا تقم بالتدريب. استخدم Colab أو استأجر وحدة معالجة رسومية (GPU).                       |

### وظائف Hugging Face

يتيح لك [Hugging Face Jobs](https://huggingface.co/docs/hub/jobs) تنفيذ التدريب على بنية HF التحتية المُدارة، مع احتساب الفاتورة بالثانية، دون الحاجة إلى امتلاك وحدة معالجة رسومية. يقوم `lerobot-train` بإرسال المهمة وبثها نيابةً عنك — ما عليك سوى إضافة `--job.target=<flavor>` إلى أمر تدريب عادي:

```bash
lerobot-train \
  --policy.type=act --dataset.repo_id=<USER>/<DATASET> \
  --policy.repo_id=<USER>/act_<task> \
  --job.target=a10g-large
```

ملاحظات:

- شغّل `hf auth login` مرة واحدة قبل الإرسال، حيث يعمل المهمة تحت رمزك.
- يتوافق `--job.target` مع الجدول أعلاه: `t4-small`/`t4-medium` (T4، ACT فقط)، `l4x1`/`l4x4` (L4 24 GB)، `a10g-small/large/largex2/largex4` (A10G 24 GB مع التوسع الأفقي)، `a100-large` (A100). لعرض الكتالوج الحالي مع الأسعار، استخدم `hf jobs hardware`، أو راجع [https://huggingface.co/docs/hub/jobs](https://huggingface.co/docs/hub/jobs).
- يتم تعيين مهلة افتراضية للعمل على `2d` (48 ساعة). يمكنك تجاوزها باستخدام `--job.timeout=4h` (أو أي سلسلة مدة صالحة أخرى) لتقصير المهلة أو إطالتها. يتوقف العمل تلقائياً عند اكتمال الأمر.
- للاطلاع على الشرح الكامل — رفع مجموعة البيانات، بث نقاط التفتيش، استئناف التشغيل على مهمة — راجع [دليل تدريب التعلم بالتقليد](./il_robots#train-using-hugging-face-jobs).

