# Cosmos3

Cosmos3 هو **نموذج عالمي للأفعال للتحكم في الروبوتات**، مبني على [Cosmos 3](https://research.nvidia.com/labs/cosmos-lab/cosmos3/)، وهو عائلة نماذج العالم متعددة الوسائط من NVIDIA. انطلاقًا من ملاحظات الكاميرا وتعليمات لغوية، يتنبأ النموذج المشترك بإطارات الفيديو المستقبلية والقادم من أفعال الروبوت. تم تكييف تطبيق LeRobot من سياسة الأفعال الأصلية في [cosmos-framework](https://github.com/NVIDIA/cosmos-framework)، ويعمل على النماذج [Cosmos3 Nano وEdge](https://huggingface.co/collections/nvidia/cosmos3) المُطلَقة، بعد تحويلها إلى صيغة LeRobot.

- 📄 [التقرير التقني الخاص بـ Cosmos 3](https://research.nvidia.com/labs/cosmos-lab/cosmos3/technical-report.pdf) ([arXiv:2606.02800](https://arxiv.org/abs/2606.02800))
- 💻 [cosmos-framework](https://github.com/NVIDIA/cosmos-framework) و[Cosmos cookbook](https://github.com/nvidia/cosmos)
- 🤗 [مجموعة نماذج Cosmos 3](https://huggingface.co/collections/nvidia/cosmos3)

## نظرة عامة على النموذج

Cosmos 3 is a Mixture-of-Transformers (MoT). Every decoder layer has two pathways with their own layer norms, attention projections and MLPs, and the two pathways meet only in a shared self-attention:

- تقرأ **مسار الفهم** (العقل) رموز النص في الاستعلام، ورموز صور ViT اختيارياً، باستخدام الانتباه السببي.
- تقرأ **مسار التوليد** (المولّد) الرموز المستمرة لفرع التسلسل الانتشاري: كامنات VAE الخاصة بـ Wan2.2 للفيديو ورموز الإجراء. وهو يولي اهتمامًا ثنائي الاتجاه لكلا المسارين ويُدرَّب باستخدام مطابقة التدفق.

<img
  src="https://huggingface.co/datasets/HaomingSong/lerobot-documentation-images/resolve/main/lerobot/cosmos3/cosmos3_mot_architecture.png"
  alt="Mixture-of-Transformers architecture of Cosmos 3"
  width="100%"
/>

_بنية Mixture-of-Transformers (MoT) الخاصة بـ Cosmos 3 (الشكل 5 من [التقرير التقني](https://arxiv.org/abs/2606.02800)). يساراً: يمر التسلسل الفرعي التوليدي الذاتي (AR) عبر المُفكِّر، بينما يمر التسلسل الفرعي الانتشاري (DM) عبر المولّد، ويلتقي الاثنان في انتباه متعدد الوسائط مشترك. يميناً: قناع الانتباه، وهو سببي بالنسبة لـ AR وكامل بالنسبة للانتشار._

سياسياً، يعمل Cosmos3 في وضع نموذج الإجراءات العالمي للوصفات الأصلية للإجراءات:

- **المدخلات**: تُركَّب مشاهد الكاميرا في لوحة فيديو واحدة (مشهد واحد كما هو، مشاهدان جنبًا إلى جنب، ثلاثة مشاهد مع وضع الأول في الأعلى والآخرين تحته). يحمل الأمر المهمة ومعدل الإطارات ودقة اللوحة ووصف تخطيط اللوحة وعدد الإطارات الخاملة في الجزء.
- **التدريب**: يقوم النموذج التوجيهي بتشفير مقطع الإطار الحالي والإطارات المستقبلية بعدد `chunk_size` باستخدام VAE، ثم يضيف ضوضاء إلى الكمونيات المستقبلية وإلى مجموعة الإجراءات، ويتعلم إزالة الضوضاء عن كليهما. الخسارة هي مجموع مرجح لخسارة الفيديو وخسارة الإجراءات.
- **الاستدلال**: إطار الشرط نظيف، ويتم أخذ عينات من الفيديو المستقبلي والإجراءات بشكل مشترك باستخدام محلل UniPC، وتعيد السياسة مجموعة الإجراءات. يمكن حفظ الفيديو المتوقع أثناء التقييم (انظر [التقييم](#evaluation)).
- افتراضيًا، يتم تدريب مسار التوليد والطبقات المحيطة به ووحدات الإجراءات فقط (`train_gen_stream_only=true`، `freeze_vision_encoder=true`)، كما هو الحال في وصفات ما بعد التدريب الأصلية.

توفر LeRobot الحجمين المُصدرين كصيغتي سياسة:

|                                 | Cosmos3 Nano                                                        | Cosmos3 Edge                                                        |
| ------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- |
| نوع السياسة                     | `cosmos3_nano`                                                      | `cosmos3_edge`                                                      |
| المعاملات (تُدرَّب افتراضيًا) | 16.5B (7.0B)                                                        | 4.6B (1.4B)                                                         |
| الهيكل                        | MoT مُهيّأ من Qwen3-VL، 36 طبقة، حجم مخفي 4096          | MoT مع محوّل كثيف بحجم 2B، 28 طبقة، حجم مخفي 2048        |
| مقسّم                       | [nvidia/Cosmos3-Nano](https://huggingface.co/nvidia/Cosmos3-Nano)   | [nvidia/Cosmos3-Edge](https://huggingface.co/nvidia/Cosmos3-Edge)   |
| نقطة التفتيش الأساسية                 | [lerobot/Cosmos3-Nano](https://huggingface.co/lerobot/Cosmos3-Nano) | [lerobot/Cosmos3-Edge](https://huggingface.co/lerobot/Cosmos3-Edge) |

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

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

   ```bash
   pip install -e ".[cosmos3]"
   ```

   إذا قمت بتثبيت LeRobot من PyPI:

   ```bash
   pip install 'lerobot[cosmos3]'
   ```

3. أضِف الإضافات الخاصة بعملية عملك: `training` لـ`lerobot-train`، و`libero` للتدريب أو التقييم على LIBERO، و`peft` لـLoRA. على سبيل المثال:

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

يستخدم Cosmos3 واجهة PyTorch الخاصة بانتباه نقطة الضرب المُقيّمة (`sdpa`) افتراضيًا. إذا كان لديك تثبيت متوافق لـ `flash_attn` في بيئتك، يمكنك طلب `--policy.attn_implementation=flash_attention_2`. لا تجمع بينه وبين `--policy.compile_model=true`: فطبقات المُفكّك المُجمّعة تُعاد تجميعها لكل طبقة مع انتباه فلاش وتتوقف بخطأ إعادة تجميع.

## نقاط التفتيش

| نقطة التفتيش                                                                                            | الحجم | بيانات التدريب                                                                          | استخدام                  |
| ----------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------------- | -------------------- |
| [lerobot/Cosmos3-Nano](https://huggingface.co/lerobot/Cosmos3-Nano)                                   | نانو | إصدار [nvidia/Cosmos3-Nano](https://huggingface.co/nvidia/Cosmos3-Nano)           | الأساس للضبط الدقيق |
| [lerobot/Cosmos3-Edge](https://huggingface.co/lerobot/Cosmos3-Edge)                                   | الحافة | إصدار [nvidia/Cosmos3-Edge](https://huggingface.co/nvidia/Cosmos3-Edge)           | الأساس للضبط الدقيق |
| [lerobot/Cosmos3-Nano-Policy-LIBERO](https://huggingface.co/lerobot/Cosmos3-Nano-Policy-LIBERO)       | نانو | [lerobot/LIBERO-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO-Cosmos3)       | تقييم LIBERO    |
| [lerobot/Cosmos3-Edge-Policy-LIBERO](https://huggingface.co/lerobot/Cosmos3-Edge-Policy-LIBERO)       | الحافة | [lerobot/LIBERO-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO-Cosmos3)       | تقييم LIBERO    |
| [lerobot/Cosmos3-Nano-Policy-LIBERO_10](https://huggingface.co/lerobot/Cosmos3-Nano-Policy-LIBERO_10) | نانو | [lerobot/LIBERO_10-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO_10-Cosmos3) | تقييم LIBERO-10 |
| [lerobot/Cosmos3-Edge-Policy-LIBERO_10](https://huggingface.co/lerobot/Cosmos3-Edge-Policy-LIBERO_10) | الحافة | [lerobot/LIBERO_10-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO_10-Cosmos3) | تقييم LIBERO-10 |

- تحتوي نقاط التفتيش الأساسية على الأوزان المُطلَقة بصيغة LeRobot. وحداتها الإجراءية (`action2llm`، `llm2action`، `action_modality_embed`) لم تُدرَّب بعد على روبوت، لذا ابدأ الضبط الدقيق باستخدام `--policy.load_action_modules=false` (انظر [الضبط الدقيق على LIBERO](#fine-tuning-on-libero)).
- يحتوي `config.json` الخاص بالنقاط الفحص الأساسية على وصفة التدريب اللاحق الأصلية لـ DROID، بينما تكون القيم الافتراضية للفئات الخاصة بأنواع السياسات هي وصفة LIBERO الأصلية.
- تحتوي نقاط التفتيش الخاصة بـ LIBERO على أوزان EMA الخاصة بجولة تدريبها.
- تُخزَّن الأوزان في صيغة bfloat16. يحدد `config.json` قيمة `dtype: float32` عمداً: فالتدريب بدقة مختلطة انطلاقاً من نقاط الفحص هذه يحافظ على أوزان رئيسية بصيغة float32، تماماً كما هو الحال في التدريب الأصلي. أما للاستدلال والتقييم فمرّر `--policy.dtype=bfloat16`.

هناك طريقتان للبدء من نقطة تفتيش:

- `--policy.path=<checkpoint>` يحمّل الإعدادات المخزنة والأوزان والمعالجات، ثم يطبق سطر الأوامر فوقها.
- `--policy.type=cosmos3_nano --policy.pretrained_path=<checkpoint>` (أو `cosmos3_edge`) يُحمّل الأوزان والمعالجات فقط، وتبدأ الإعدادات من القيم الافتراضية للفئة، وهي وصفة LIBERO.

## الضبط الدقيق على LIBERO

القيم الافتراضية للفئة هي وصفة LIBERO الواردة في التقرير التقني: كتل من 16 إجراءً، تجسيد `domain_id=5`، بدون إجراء حالة، تطبيع كمومي للإجراءات، UniPC مع 30 خطوة وبدون إرشاد بدون مُصنِّف عند الاستدلال، ومعدل تعلّم قدره 5e-5 مع 500 خطوة إحماء وتراجع خطي إلى الصفر عند الخطوة 16000. وبالتالي، فإن البدء من نقطة تحقق أساسية باستخدام `--policy.type` لا يتطلب سوى `--policy.load_action_modules=false`.

تتدرب الوصفة على بيانات LIBERO المحوّلة إلى تخطيط Cosmos3:

- [lerobot/LIBERO-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO-Cosmos3): الأطقم الأربعة (Spatial، Object، Goal، 10)، 1693 حلقة.
- [lerobot/LIBERO_10-Cosmos3](https://huggingface.co/datasets/lerobot/LIBERO_10-Cosmos3): LIBERO-10 فقط، 379 حلقة.

تأتي كلتاهما من [nvidia/LIBERO_LeRobot_v3](https://huggingface.co/datasets/nvidia/LIBERO_LeRobot_v3)، وهو بيانات الوصفة الأصلية. تكون الأفعال بعشرة أبعاد `[delta position (3), rot6d (6), gripper]` بدلاً من أفعال محور الزاوية السبعة الأبعاد في LIBERO، وتكون الكاميرتان `observation.images.image` (من منظور الشخص الثالث) و`observation.images.image2` (من معصم اليد) بدقة 256x256 وبمعدل 20 إطاراً في الثانية، وتكون إحصاءات الأفعال هي إحصاءات الوصفة الأصلية. أثناء التقييم، يقوم بيئة LIBERO بتحويل الأفعال مرة أخرى (انظر [التقييم](#evaluation)).

### أمر التدريب

تدرّب وصف LIBERO الأصلي على دفعة عالمية من 2048 عينة لمدة 2000 تكرار على LIBERO-10 (أفضل نقطة تحقق قريبة من التكرار 1500) ولمدة 5000 تكرار على الأطقم الأربعة (أفضل نقطة تحقق قريبة من 4500). الأمر أدناه يعيد إنتاج ذلك على جهاز واحد مزوّد بـ 8 وحدات معالجة رسومية: FSDP2 عبر وحدات المعالجة الرسومية الثمانية، و32 عينة لكل وحدة معالجة رسومية و8 خطوات لتراكم التدرجات، بحيث يصبح `32 x 8 x 8 = 2048` عينة لكل تحديث لمُحسِّن. يُضرب كل عدد تكرارات أصلي في خطوات التراكم الثمانية: يصبح 2000 تكرار `--steps=16000`، ونقطة تحقق كل 500 تكرار `--save_freq=4000`، ويصبح الإحماء البالغ 500 ونهاية التلاشي البالغة 16000 هما 4000 و128000 على التوالي.

```bash
accelerate launch --num_processes=8 $(which lerobot-train) \
  --policy.type=cosmos3_nano \
  --policy.pretrained_path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-LIBERO_10 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --parallelism.dp_shard=8 \
  --accelerator.fsdp.mixed_precision_policy.param_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.reduce_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.cast_forward_inputs=false \
  --accelerator.gradient_accumulation.steps=8 \
  --accelerator.gradient_accumulation.sync_each_batch=true \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=32 \
  --steps=16000 \
  --save_freq=4000 \
  --policy.scheduler_warmup_steps=4000 \
  --policy.scheduler_decay_steps=128000 \
  --output_dir=outputs/train/cosmos3_nano_libero_10 \
  --job_name=cosmos3_nano_libero_10 \
  --trackio.enable=true
```

استخدم `--dataset.repo_id=lerobot/LIBERO-Cosmos3` و`--steps=40000` (5000 تكرار) للرباعيات الأربع. ولـ Cosmos3 Edge استخدم `--policy.type=cosmos3_edge --policy.pretrained_path=lerobot/Cosmos3-Edge`.

### معلمات التدريب الرئيسية

| معامل                                              | الوصف                                                                                                                                                                                                                                                                                                            |
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--policy.load_action_modules=false`                   | يبدأ وحدات الإجراءات من مرحلة تهيئتها بدلاً من تحميلها، كما تفعل وصفات ما بعد التدريب الأصلية. اضبطه فقط عند الضبط الدقيق انطلاقاً من نقطة تحقق أساسية (انظر الملاحظات أدناه).                                                                                                                        |
| `--parallelism.dp_shard=8`                             | FSDP2 على 8 وحدات معالجة رسومية. يحدد هذا الإجراء وحدات التفاف FSDP2 الخاصة به، لذا لا حاجة إلى `--accelerator.fsdp.wrap_modules`. راجع [دليل التدريب على وحدات معالجة رسومية متعددة](./multi_gpu_training).                                                                                                                                         |
| `--accelerator.fsdp.mixed_precision_policy.*`          | الحساب وتقليل التدرجات باستخدام bfloat16 مع أوزان رئيسية من نوع float32، كما في التدريب الأصلي. حافظ على القيمة الافتراضية `--policy.dtype` (float32) مع ذلك: فسيؤدي استخدام سياسة من نوع bfloat16 إلى تدريب أوزان رئيسية من نوع bfloat16.                                                                                                            |
| `--accelerator.gradient_accumulation.steps`            | الحجم العالمي للدفعة هو `--batch_size` مضروباً في عدد وحدات معالجة الرسوميات (GPUs) مضروباً في خطوات التراكم. يؤدي تعيين `sync_each_batch=true` إلى تقليل التدرجات بعد كل دفعة مصغرة، مما يجعلها تبقى مجزأة ولا تحتاج إلى نسخة إضافية غير مجزأة.                                                                                                                    |
| `--steps`, `--save_freq`, `--policy.scheduler_*_steps` | يحتسب LeRobot خطوات الحلقة (الدفعات الدقيقة) وليس تحديثات المُحسِّن. اضرب عدد التكرارات في الوصفة الأصلية (2000 أو 5000 تكرار، إحماء 500، اضمحلال 16000، نقاط تفتيش كل 500) في خطوات التراكم. أبقِ `--steps` في حدود `--policy.scheduler_decay_steps` على الأكثر: فمعدل التعلم يصبح صفراً بعد ذلك. |
| `--ema.type=power --ema.sigma_rel=0.1`                 | متوسط الحركة الأسي (EMA) للوصفة الأصلية. يحتفظ كل نقطة تحقق أيضًا بأوزان EMA في `pretrained_model_ema/`، وهي الأوزان التي تُقيَّم وتُنشر.                                                                                                                                                                   |
| `--tf32=false`                                         | يحافظ على عمليات ضرب المصفوفات من نوع float32 بدقة كاملة، كما هو الحال في التدريب الأصلي.                                                                                                                                                                                                                               |
| `--policy.gradient_checkpointing=true`                 | يعيد حساب التفعيلات لطبقات المُفكِّك (decoder) والكتل البصرية في المسار العكسي (backward pass) لتوفير الذاكرة.                                                                                                                                                                                                            |
| `--policy.compile_model=true`                          | اختياري: `torch.compile` لطبقات المُفكِّك ومُشفِّر VAE.                                                                                                                                                                                                                                                   |

على وحدة معالجة رسومية واحدة أو باستخدام DDP، استبدل أعلام FSDP2 (`--parallelism.dp_shard` و`--accelerator.fsdp.mixed_precision_policy.*`) بـ`--accelerator.mixed_precision=bf16`. على سبيل المثال، Cosmos3 Edge على وحدة معالجة رسومية واحدة، مع 32 عينة لكل خطوة و64 خطوة تراكم للحصول على نفس الدفعة العالمية البالغة 2048:

```bash
lerobot-train \
  --policy.type=cosmos3_edge \
  --policy.pretrained_path=lerobot/Cosmos3-Edge \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Edge-Policy-LIBERO_10 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --accelerator.mixed_precision=bf16 \
  --accelerator.gradient_accumulation.steps=64 \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=32 \
  --steps=128000 \
  --save_freq=32000 \
  --policy.scheduler_warmup_steps=32000 \
  --policy.scheduler_decay_steps=1024000 \
  --output_dir=outputs/train/cosmos3_edge_libero_10
```

`--policy.load_action_modules=false` يُعاد ضبطه إلى `true` بمجرد تحميل نقطة التفتيش، لذا فإن التشغيل المحفوظ يُحمّل وحدات الإجراءات المدرَّبة مرة أخرى. هناك حالتان تُبقيان وحدات الإجراءات على قيمتها الأولية عن طريق الخطأ:

- عند بناء سياسة دون `--policy.pretrained_path` أو `--policy.path`: لا يتم تحميل أي شيء، لذا يبقى العلم `false`، ويتخطى أي تقييم لاحق أو استئناف لتلك الجولة وحدات الإجراءات المدرَّبة الخاصة بها.
- استخدام PEFT مع وحدات الإجراء خارج `--peft.full_training_modules`: في هذه الحالة، لن تُدرَّب وحدات الإجراء أبدًا.

اضبط `--policy.load_action_modules=false` فقط عند الضبط الدقيق انطلاقًا من نقطة تحقق أساسية. عند استخدام PEFT، احتفظ بوحات الإجراءات في `--peft.full_training_modules` (القيمة الافتراضية).

### متطلبات العتاد

تم القياس على وحدات معالجة رسومية A800 بسعة 80 جيجابايت باستخدام أوامر هذه الصفحة مع تفعيل نقطة التفتيش للتدرجات:

| الإعداد                                 | وحدات معالجة الرسوميات |  الحجم الدفقي لكل وحدة معالجة رسومية  | ذروة الذاكرة لكل وحدة معالجة رسومية |
| ------------------------------------- | :--: | :-------------: | :-----------------: |
| نانو، الضبط الكامل (FSDP2)        |  8   |       32        |        38 جيجابايت        |
| نانو، لورا                            |  1   |        4        |        64 جيجابايت        |
| الحافة، الضبط الدقيق الكامل                |  1   |       32        |        47 جيجابايت        |
| Edge، LoRA                            |  1   |        8        |        21 جيجابايت        |
| التقييم في bfloat16، Nano وEdge |  1   | 10 بيئات |   39 جيجابايت و15 جيجابايت   |

- يتطلب Cosmos3 Nano وحدات معالجة رسومية بسعة 80 جيجابايت، وأربعة منها على الأقل للضبط الدقيق الكامل: فقبل أن تقسّم FSDP2 النموذج، تحتفظ كل وحدة معالجة رسومية بالنموذج الكامل بصيغة float32 (حوالي 66 جيجابايت).
- يستغرق الأمر حوالي 45 ثانية لكل تحديث للمحسّن باستخدام أمر LIBERO أعلاه على 8 وحدات معالجة رسومية A800، أي ما يعادل حوالي 25 ساعة لـ LIBERO-10.

## ضبط النموذج الدقيق على بياناتك الخاصة

يستند Cosmos3 إلى وصفة التدريب من سطر الأوامر ومجموعة البيانات: فلا تتضمن السياسة أي منطق خاص بالروبوت. تعمل أي مجموعة بيانات من LeRobot ما دامت تتبع النقاط أدناه.

### متطلبات مجموعة البيانات

- **الكاميرات**: من كاميرا واحدة إلى ثلاث ميزات `observation.images.*`، بترتيب مجموعة البيانات `info.json`. يتم تغيير حجم كل عرض إلى `--policy.view_size` (بحجم الكاميرا الأولى افتراضياً) وتجميعها في لوحة فيديو واحدة: عرض واحد كما هو، عرضان جنباً إلى جنب، وثلاثة مع العرض الأول في الأعلى والعرضين الآخرين جنباً إلى جنب تحته. ضع الكاميرات بترتيب ذلك التخطيط، على سبيل المثال `[third person, wrist]` لـ LIBERO و `[wrist, exterior 1, exterior 2]` لـ DROID.
- **عرض الوصف**: `--policy.view_description` هو جملة في الأمر الموجه تصف تخطيط اللوحة. الأوصاف الافتراضية تصف تخطيط LIBERO (قيم افتراضية على مستوى الفئة) وتخطيط DROID (ملف `config.json` الأساسي). اكتب جملة تخطيطك الخاص: الوصف الخاطئ لا يُكتشف بل يُضعف الأمر الموجه فقط.
- **تمثيل الإجراء**: يتعلم السياسة إجراءات مجموعة البيانات كما هي دون وجود خطوة تحويل. قم بتحويل الإجراءات إلى التمثيل الذي ترغب في تعلمه قبل التدريب، كما تفعل بيانات LIBERO مع دوران rot6d. إذا كان البيئة يتوقع تمثيلاً آخر، فقم بتحويل الإجراءات مرة أخرى في معالجات البيئة (تقوم بيئة LIBERO بذلك من أجل Cosmos3).
- **عرض الإجراء**: بحد أقصى `--policy.max_action_dim` (64) قناة. يأتي عرض المخرجات من مجموعة البيانات.
- **معدل الإطارات**: `fps` يأتي من بيانات وصفية مجموعة البيانات ويجب أن يكون معدل التحكم الفعلي: فهو يُكتب في الأمر (prompt) ويحدد محور الزمن لمواقع الفيديو وحدود الإطارات الخاملة.
- **الإحصاءات**: طريقة تطبيع الإجراءات الافتراضية هي `QUANTILES`، والتي تتطلب إحصاءات `q01` و`q99` للإجراء في `meta/stats.json` (تتوفر هذه الإحصاءات في مجموعات البيانات المكتوبة بواسطة LeRobot). أما وصفة DROID الأصلية فتستخدم `IDENTITY` بدلاً من ذلك.
- **الحالة**: عند استخدام `--policy.use_state=true` تُوضع الحالة الحالية أمام الإجراءات كإجراء حالة نظيف. ثم يجب أن يكون `observation.state` بنفس عرض القناة ومعناها كإجراء الإجراءات. وتُطبع الحالة والإجراء باستخدام إحصائياتهما الخاصة.
- **اللغة**: `task` كل إطار هو التعليمات الخاصة بالاستعلام.
- **التجسيد**: `--policy.domain_id` يختار صف إسقاطات الإجراء، وهو واحد من 32. تستخدم الوصفات الأصلية القيمة 5 لـ LIBERO، و8 لـ DROID، و30 لـ RoboCasa. عندما تبدأ وحدات الإجراء من قيمتها الأولية (`--policy.load_action_modules=false`)، يبدأ كل صف غير مدرَّب، وتعمل أي قيمة.
- **القطعة**: عدد الإجراءات لكل قطعة `--policy.chunk_size` (16 لـ LIBERO، و32 لـ DROID) وعدد الإجراءات المنفذة لكل قطعة `--policy.n_action_steps`.

تأتي الحقول التي تُترك عند `None` (`fps`، `view_size`) وأسماء قنوات الإجراءات من مجموعة البيانات. أما جميع الحقول الأخرى فتأتي من ملف الإعداد، لذا اضبطها في سطر الأوامر أو في ملف `--config_path`.

**أسماء قنوات الإجراء والحالة.** يوضح الأمر عدد الإطارات الخاملة في الجزء (أي لا يتحرك الروبوت)، ويحسب `Cosmos3IdleFrameProcessorStep` هذه الإطارات من أسماء قنوات الإجراء الموجودة في `meta/info.json`. تُحدّد الأسماء بصيغة `[<prefix>_]<type>_<index>` أنواع القنوات: `pos`، أو دوران (`rot6d`، `rot9d`، `axisangle`، `euler_xyz`، `quat_xyzw`، `quat_wxyz`)، أو `gripper` أو `joint`، مع بادئة للتمييز بين الأذرع (على سبيل المثال `left_rot6d_0`). تستخدم بيانات LIBERO `pos_0..2, rot6d_0..5, gripper_0`، بينما تستخدم تخطيط DROID `joint_0..6, gripper_0`.

لا يُشترط استخدام هذا التسمية. بدونه، يقتصر دور السياسة على تسجيل تحذير فقط، ولا تُحتسب أي إطار خامل في عدد الإطارات، وهو ما تلاحظه وصفة LIBERO على أي حال (إذ لا تحتوي حلقاتها على إطارات خاملة وفق القاعدة الأصلية). اتبع التسمية فقط إذا كنت ترغب في الحصول على عدد الإطارات الخاملة وفق وصفة DROID الأصلية.

### وصفة DROID

يُعدّ ملف `config.json` الخاص بالنقاط الفاحصة الأساسية وصفة التدريب اللاحق الأصلية لـ DROID: تجسيد `domain_id=8`، مقاطع من 32 إجراءً، والحالة الحالية كإجراء حالة، وإطارات الخمول المُحتسبة عليها (`use_state=true`، `idle_state=true`)، دون تطبيع (`IDENTITY`)، وUniPC مع 4 خطوات ومقياس توجيه بلا مُصنِّف بقيمة 3 عند الاستدلال، ومعدل تعلّم قدره 8e-5 (المعدل الأصلي 2e-4 مضروباً في معامله 0.4) دون إحماء وتراجع خطي إلى الصفر عند الخطوة 100000. البدء من هذا الملف باستخدام `--policy.path` يُدرّب النموذج وفق هذه الوصفة.

تدرّب الوصفة الأصلية على الحلقات الناجحة من [nvidia/Cosmos3-DROID](https://huggingface.co/datasets/nvidia/Cosmos3-DROID). يحتوي مجموعة بيانات DROID بتنسيق Cosmos3 على:

- الكاميرات الثلاث `observation.images.wrist_left` و`observation.images.exterior_1_left` و`observation.images.exterior_2_left`، بهذا الترتيب (كاميرا المعصم في الأعلى، والوجهان الخارجيان تحته)، بأبعاد 360x640 في البيانات الأصلية.
- إجراءات مواضع مشتركة ثمانية الأبعاد مسمّاة `joint_0` إلى `joint_6` و`gripper_0`، و`observation.state` بنفس الترتيب.
- معدل إطارات يبلغ 15 إطارًا في الثانية.

تدرّب الوصفة الأصلية على دفعة عالمية من 8192 عينة لمدة 10000 تكرار، مع نقطة حفظ كل 1000 تكرار. على جهاز واحد مزوّد بـ 8 وحدات معالجة رسومية، فإن 8 عينات لكل وحدة معالجة رسومية و128 خطوة تراكمية تعطي نفس الدفعة العالمية (`8 x 8 x 128 = 8192`)، ويُضرب كل عدد تكرارات في 128:

```bash
accelerate launch --num_processes=8 $(which lerobot-train) \
  --policy.path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-DROID \
  --dataset.repo_id=${HF_USER}/DROID-Cosmos3 \
  --parallelism.dp_shard=8 \
  --accelerator.fsdp.mixed_precision_policy.param_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.reduce_dtype=bfloat16 \
  --accelerator.fsdp.mixed_precision_policy.cast_forward_inputs=false \
  --accelerator.gradient_accumulation.steps=128 \
  --accelerator.gradient_accumulation.sync_each_batch=true \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=8 \
  --steps=1280000 \
  --save_freq=128000 \
  --policy.scheduler_decay_steps=12800000 \
  --output_dir=outputs/train/cosmos3_nano_droid \
  --job_name=cosmos3_nano_droid \
  --trackio.enable=true
```

تم تشغيل وصفة DROID الأصلية على 256 وحدة معالجة رسومية. على جهاز واحد مزوّد بثمانية وحدات معالجة رسومية من طراز A800، يستغرق تحديث المُحسِّن الواحد لهذا الأمر حوالي 33 دقيقة، لذا تتطلب الوصفة الكاملة العديد من الأجهزة. نفّذ الأمر نفسه على كل جهاز باستخدام أعلام العقد المتعددة الخاصة بـ `accelerate launch` (أو `torchrun`)، وقسّم داخل كل جهاز ونسّخ عبر الأجهزة باستخدام `--parallelism.dp_replicate=<number of machines> --parallelism.dp_shard=8`، وقسّم `--accelerator.gradient_accumulation.steps` وعدد الخطوات على عدد الأجهزة. راجع [HSDP](./multi_gpu_training#hsdp) في دليل التدريب متعدد وحدات المعالجة الرسومية.

### روبوت جديد

لروبوت جديد، ابدأ من القيم الافتراضية للفئة باستخدام `--policy.type` وقيّم حقول بياناتك على سطر الأوامر، على سبيل المثال:

```bash
lerobot-train \
  --policy.type=cosmos3_edge \
  --policy.pretrained_path=lerobot/Cosmos3-Edge \
  --policy.load_action_modules=false \
  --policy.domain_id=0 \
  --policy.chunk_size=32 \
  --policy.n_action_steps=32 \
  --policy.view_description='The left half shows the front camera; the right half shows the wrist-mounted camera.' \
  --dataset.repo_id=${HF_USER}/my_dataset \
  ...
```

### إعداد الهيكل الأساسي

إعداد الهيكل العظمي `--policy.mot_backbone` هو قيمة سطر أوامر واحدة. مرّر قاموس YAML يحتوي فقط على الحقول التي تريد تغييرها، على سبيل المثال نموذج بعدد طبقات أقل لاختبار سريع دون أوزان مُسبقة التدريب:

```bash
--policy.type=cosmos3_edge --policy.mot_backbone='{text_config: {num_hidden_layers: 2}, vision_config: {num_hidden_layers: 1}}'
```

تحتفظ الحقول غير المُدخَلة بقيم الافتراضية للحجم، أو بقيم التهيئة المُحمَّلة عبر `--policy.path`. اكتب الأعداد العشرية على شكل `1.0e-6` (فصيغة YAML تقرأ `1e-6` كنص)، وقدم الحقول التي تكون قيمتها قاموسًا، مثل `rope_parameters`، بشكل كامل. يجب أن تتطابق حقول البنية مع الأوزان التي تُحمِّلها.

## الضبط الدقيق باستخدام PEFT (LoRA)

يدعم Cosmos3 تقنية LoRA من خلال تكامل LeRobot [PEFT](./peft_training) (`pip install -e ".[cosmos3,training,peft]"`). بشكل افتراضي، تقوم LoRA بتكييف إسقاطات الانتباه في مسار التوليد (`q_proj_gen`، `k_proj_gen`، `v_proj_gen`، `o_proj_gen`)، بينما تُدرَّب وحدات الإجراء (`action2llm`، `llm2action`، `action_modality_embed`) بالكامل وتُحفظ مع المُكيّف.

```bash
lerobot-train \
  --policy.type=cosmos3_nano \
  --policy.pretrained_path=lerobot/Cosmos3-Nano \
  --policy.load_action_modules=false \
  --policy.gradient_checkpointing=true \
  --policy.repo_id=${HF_USER}/Cosmos3-Nano-Policy-LIBERO_10-LoRA \
  --peft.method_type=lora \
  --peft.r=16 \
  --peft.lora_alpha=32 \
  --policy.optimizer_lr=5e-4 \
  --policy.optimizer_weight_decay=0 \
  --dataset.repo_id=lerobot/LIBERO_10-Cosmos3 \
  --accelerator.mixed_precision=bf16 \
  --tf32=false \
  --ema.type=power \
  --ema.sigma_rel=0.1 \
  --batch_size=4 \
  --steps=16000 \
  --output_dir=outputs/train/cosmos3_nano_libero_10_lora
```

- `--peft.lora_alpha=32`، ومعدّل التعلم والتلاشي الوزني هما قيم وصفة Cosmos3 LoRA الأصلية. بدون `--peft.lora_alpha`، يستخدم PEFT القيمة 8.
- عند استخدام `--policy.load_action_modules=false` قد تتغير أشكال وحدات الإجراءات (`--policy.max_action_dim`، `--policy.num_embodiment_domains`). يعمل هذا مع الضبط الدقيق الكامل فقط: عند إعادة تشغيل PEFT يتم تحميل النموذج الأساسي، والذي يتطلب نفس الأشكال.
- لا يؤثر `--policy.train_gen_stream_only` و`--policy.freeze_vision_encoder` عند استخدام PEFT: إذ يتم تدريب المحوِّلات ووحدات الإجراءات فقط.
- لا تُضِف إسقاطات الإجراء (`action2llm`، `llm2action`) إلى `--peft.target_modules`: فهي جداول خاصة بكل تجسيد تُقرأ مباشرةً بواسطة ضرب مصفوفات مجمّعة، لذا لن يُحدث LoRA أي تغيير فيها. وهي تُدرَّب بالفعل بالكامل.
- حافظ على النوع الافتراضي `--policy.dtype` وهو float32 عند استخدام PEFT، بحيث تُحافظ وحدات الإجراء التي تُدرَّب بالكامل على أوزان رئيسية من نوع float32.
- لا تُعرّف الوصفات الأصلية حجم دفعة LoRA أو الجدول الزمني. يحافظ الأمر على جدول LIBERO (تلاشي خطي حتى الصفر عند الخطوة 16000) مع 4 عينات في كل خطوة.
- يتدرّب Cosmos3 Nano مع LoRA على وحدة معالجة رسومية واحدة بسعة 80 جيجابايت باستخدام نقطة التفتيش للتدرجات، بحجم يقارب 64 جيجابايت عند 4 عينات لكل وحدة معالجة رسومية (انظر [متطلبات العتاد](#hardware-requirements)).

## التقييم

قيّم نقطة تحقق LIBERO على الأطقم الأربعة:

```bash
lerobot-eval \
  --policy.path=lerobot/Cosmos3-Nano-Policy-LIBERO \
  --policy.dtype=bfloat16 \
  --tf32=false \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --env.observation_height=256 \
  --env.observation_width=256 \
  --eval.n_episodes=10 \
  --eval.batch_size=10 \
  --output_dir=outputs/eval/cosmos3_nano_libero
```

- لنقطة تحقق من تدريبك الخاص، مرر أوزان EMA: `--policy.path=outputs/train/cosmos3_nano_libero_10/checkpoints/last/pretrained_model_ema`.
- `--env.observation_height=256 --env.observation_width=256` يعرض الكاميرات بدقة 256x256 الخاصة ببيانات التدريب.
- تضيف بيئة LIBERO تحويل Cosmos3 للإجراءات إلى معالجاتها تلقائيًا: حيث تُعاد إجراءات rot6d ذات الأبعاد العشرة إلى إجراءات محور الزاوية ذات الأبعاد السبعة الخاصة بـ LIBERO. عند تشغيل السياسة خارج `lerobot-eval` وروبوت محاكاة، قم ببناء معالجات البيئة باستخدام `make_env_pre_post_processors(env_cfg, policy_cfg)` من `lerobot.envs.factory` أيضًا.
- راجع [دليل LIBERO](./libero) لمعرفة بروتوكول التقييم والخيارات الأخرى.

### الفيديو المتوقع

يتنبأ Cosmos3 بالإطارات المستقبلية مع الإجراءات. مرّر `--policy.save_predicted_video=true` لفك ترميز الفيديو المتنبأ به لكل شريحة باستخدام VAE وكتابة `pred_episode_*.mp4` بجانب مقاطع `eval_episode_*.mp4` المُصيَّرة.

<video src="https://huggingface.co/datasets/HaomingSong/lerobot-documentation-images/resolve/main/lerobot/cosmos3/cosmos3_libero_predicted_video.mp4" autoplay loop muted playsinline width="100%"
>

_Cosmos3 Edge في مهمة LIBERO-10 «ضع الوعاء الأسود في الدرج السفلي للخزانة وأغلقه». يسار: ملاحظات الشخص الثالث والمعصم أثناء التنفيذ. يمين: الفيديو الذي تتنبأ به السياسة، حيث يُعاد أخذ العينات كل 16 إجراءً من الملاحظة الحالية._

## النتائج

### LIBERO

| النماذج                        | Libero-Spatial  |  Libero-Object  |   Libero-Goal   |    Libero-10    | المتوسط |
| ----------------------------- | :-------------: | :-------------: | :-------------: | :-------------: | :-----: |
| Cosmos3-Nano-Policy-LIBERO    | 98.0% (490/500) | 99.4% (497/500) | 97.4% (487/500) | 96.8% (484/500) | 97.90%  |
| Cosmos3-Edge-Policy-LIBERO    | 98.6% (493/500) | 99.4% (497/500) | 97.2% (486/500) | 96.6% (483/500) | 97.95%  |
| Cosmos3-Nano-Policy-LIBERO_10 |       N/A       |       N/A       |       N/A       | 97.6% (488/500) | 97.60%  |
| Cosmos3-Edge-Policy-LIBERO_10 |       N/A       |       N/A       |       N/A       | 95.2% (476/500) | 95.20%  |
| Cosmos-Nano-TechReport        |       N/A       |       N/A       |       N/A       |      97.4%      | 97.40%  |

معدلات النجاح في حلقة مغلقة على LIBERO. تم تدريب Cosmos3-Nano-Policy-LIBERO وCosmos3-Edge-Policy-LIBERO على مجموعات LIBERO الأربع ([lerobot/Cosmos3-Nano-Policy-LIBERO](https://huggingface.co/lerobot/Cosmos3-Nano-Policy-LIBERO)، [lerobot/Cosmos3-Edge-Policy-LIBERO](https://huggingface.co/lerobot/Cosmos3-Edge-Policy-LIBERO)). تم تدريب Cosmos3-Nano-Policy-LIBERO_10 وCosmos3-Edge-Policy-LIBERO_10 على LIBERO-10 فقط ([lerobot/Cosmos3-Nano-Policy-LIBERO_10](https://huggingface.co/lerobot/Cosmos3-Nano-Policy-LIBERO_10)، [lerobot/Cosmos3-Edge-Policy-LIBERO_10](https://huggingface.co/lerobot/Cosmos3-Edge-Policy-LIBERO_10))، ويتبع إعداد التدريب الخاص بـ Cosmos3-Nano-Policy-LIBERO_10 وصفة LIBERO-10 المُبلَّغ عنها في التقرير التقني. Cosmos-Nano-TechReport هو معدل النجاح على LIBERO-10 لـ Cosmos3 Nano المُدرَّب على LIBERO-10 فقط، كما هو مُبلَّغ عنه في الجدول 20 من [التقرير التقني](https://arxiv.org/abs/2606.02800) (MT-init، التكرار 2000، 500 rollout).

## الاستشهاد

```bibtex
@techreport{nvidia2026cosmos3,
  title  = {Cosmos 3: Omnimodal World Models for physical AI},
  author = {{NVIDIA Cosmos Team}},
  year   = {2026},
  url    = {https://research.nvidia.com/labs/cosmos-lab/cosmos3/technical-report.pdf}
}
```

## رخصة

تتبع تنفيذ LeRobot **رخصة Apache 2.0** الخاصة بـ LeRobot. وتُطرح أوزان Cosmos3 والكود الأصلي تحت [رخصة OpenMDW-1.1](https://openmdw.ai/license/1-1/).

