# DeepSpeed ZeRO

يُزيل [DeepSpeed](https://www.deepspeed.ai/) ZeRO (Zero Redundancy Optimizer) التكرار في الذاكرة عبر التدريب الموزّع من خلال تقسيم حالات المُحسِّن والتدرّجات والمعاملات على وحدات معالجة الرسوميات. يتكوّن ZeRO من ثلاث مراحل، حيث تقسم كل مرحلة حالة أكثر من سابقتها. كما يدعم DeepSpeed التفريغ إلى ذاكرة المعالج المركزي أو ذاكرة NVMe لتحقيق توفير إضافي. تقلّل كل مرحلة إضافية ومستوى تفريغ من الذروة في استهلاك الذاكرة، على حساب زيادة التواصل بين وحدات معالجة الرسوميات.

```text
                  params        grads       opt states
                ┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-1          │██████████│ │██████████│ │███░░░░░░░│  GPU 0
                │██████████│ │██████████│ │░░░███░░░░│  GPU 1
                │██████████│ │██████████│ │░░░░░░████│  GPU 2
                └──────────┘ └──────────┘ └──────────┘
                ┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-2          │██████████│ │███░░░░░░░│ │███░░░░░░░│  GPU 0
                │██████████│ │░░░███░░░░│ │░░░███░░░░│  GPU 1
                │██████████│ │░░░░░░████│ │░░░░░░████│  GPU 2
                └──────────┘ └──────────┘ └──────────┘
                ┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-3          │███░░░░░░░│ │███░░░░░░░│ │███░░░░░░░│  GPU 0
                │░░░███░░░░│ │░░░███░░░░│ │░░░███░░░░│  GPU 1
                │░░░░░░████│ │░░░░░░████│ │░░░░░░████│  GPU 2
                └──────────┘ └──────────┘ └──────────┘
  █ resident    ░ held on another GPU
```

يقوم ZeRO-2 بتجزئة التدرجات وحالات المُحسِّن مع انخفاض في تكلفة الاتصال مقارنةً بـ ZeRO-3. استخدم ZeRO-3 فقط عندما لا يتسع نموذجك عبر وحدات معالجة الرسوميات باستخدام ZeRO-2.

## التثبيت

قم بتثبيت DeepSpeed من PyPI، أو ثبّت Transformers مع الإضافة `deepspeed`.

```shell
pip install deepspeed
pip install transformers[deepspeed]
```

إذا واجهت أخطاء تثبيت متعلقة بـ CUDA، فراجع وثائق [DeepSpeed CUDA](./debugging#deepspeed-cuda). يُعد [التثبيت من المصدر](https://www.deepspeed.ai/tutorials/advanced-install/#install-deepspeed-from-source) الخيار الأكثر موثوقية لأنه يتوافق مع عتادك الدقيق ويتضمن ميزات غير متاحة بعد في إصدار PyPI.

## إعداد

يتكامل [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) مع DeepSpeed من خلال الحجة [deepspeed](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments.deepspeed)، والتي تقبل ملف إعداد بصيغة JSON. أو استخدم [ملف إعداد Accelerate](./accelerate#accelerate-config-file) بدلاً من [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments).

استخدم `"auto"` في إعداداتك للقيم التي تريد أن يملأها DeepSpeed من [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments). إذا كنت تريد تحديد قيمة بشكل صريح، فتأكد من استخدام *نفس* القيمة لكل من معامل DeepSpeed و[TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments).

> [!NOTE]
> راجع مرجع [DeepSpeed Configuration JSON](https://www.deepspeed.ai/docs/config-json/) للحصول على قائمة كاملة بخيارات تكوين DeepSpeed.

```json
{
    "train_micro_batch_size_per_gpu": "auto",
    "gradient_accumulation_steps": "auto",
    "optimizer": {
        "type": "AdamW",
        "params": { "lr": "auto" }
    },
    "fp16": { "enabled": "auto" }
}
```

| إعدادات DeepSpeed | [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) |
|---|---|
| `train_micro_batch_size_per_gpu` | `per_device_train_batch_size` |
| `gradient_accumulation_steps` | `gradient_accumulation_steps` |
| `optimizer.params.lr` | `learning_rate` |
| `fp16.enabled` | `fp16` |

مرّر الإعداد إلى معامل `deepspeed`.

```py
from transformers import TrainingArguments

args = TrainingArguments(
    deepspeed="path/to/deepspeed_config.json",
    ...
)
```

```cli
# DeepSpeed launcher
deepspeed --num_gpus 4 train.py

# torchrun
torchrun --nproc_per_node 4 train.py

# Accelerate
accelerate launch --num_processes 4 train.py
```

> [!NOTE]
> يتجاهل Accelerate الحجة `deepspeed` في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments).

شغّل الأمر [accelerate config](https://huggingface.co/docs/accelerate/en/package_reference/cli#accelerate-config) وأجب عن الأسئلة المتعلقة بمكوناتك المادية وإعداد التدريب لإنشاء ملف `default_config.yaml` في ذاكرتك المؤقتة.

```yaml
distributed_type: DEEPSPEED
deepspeed_config:
  deepspeed_config_file: path/to/ds_config.json
machine_rank: 0
num_machines: 1
num_processes: 4
```

شغّل [accelerate launch](https://huggingface.co/docs/accelerate/en/package_reference/cli#accelerate-launch) مع سكربت مبني على [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer).

```shell
accelerate launch --config_file deepspeed_config.yaml train.py
```

## مراحل ZeRO

اختر إعداد مرحلة ZeRO لاستخدامه كنقطة انطلاق.

```json
{
    "bf16": { "enabled": "auto" },
    "zero_optimization": { "stage": 1 },
    "gradient_clipping": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "train_batch_size": "auto",
    "gradient_accumulation_steps": "auto"
}
```

```json
{
    "bf16": { "enabled": "auto" },
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": true,
        "allgather_bucket_size": 2e8,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },
    "gradient_clipping": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "train_batch_size": "auto",
    "gradient_accumulation_steps": "auto"
}
```

> [!WARNING]
> يقوم ZeRO-3 بتجزئة المعاملات أثناء التهيئة. يجب عليك إنشاء [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) قبل تحميل نموذجك — إذا كان النموذج موجودًا بالفعل على كل وحدة معالجة رسومية قبل تكوين DeepSpeed، فلن يتم توفير أي ذاكرة.

```json
{
    "bf16": { "enabled": "auto" },
    "zero_optimization": {
        "stage": 3,
        "overlap_comm": true,
        "contiguous_gradients": true,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_gather_16bit_weights_on_model_save": true,
        "offload_optimizer": { "device": "cpu", "pin_memory": true },
        "offload_param":     { "device": "cpu", "pin_memory": true }
    },
    "gradient_clipping": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "train_batch_size": "auto",
    "gradient_accumulation_steps": "auto"
}
```

الحقول التالية مهمة لتخصيص التدريب.

- `zero_optimization` يحدد مرحلة ZeRO.

    ```json
    { "zero_optimization": { "stage": 3 } }
    ```

- اضبط حجج حجم الدفعة وتراكم التدرجات على `"auto"`. إذا قمت بإعداد هذه القيم يدوياً بقيم لا تتوافق مع [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments)، فسيستمر التدريب بصمت بالقيم الخاطئة.

    ```json
    {
        "train_micro_batch_size_per_gpu": "auto",
        "train_batch_size": "auto",
        "gradient_accumulation_steps": "auto",
        "gradient_clipping": "auto"
    }
    ```

- `bf16` يحدد دقة التدريب. اضبطه على `"auto"` ليتطابق مع علم `bf16` في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments).

    ```json
    { "bf16": { "enabled": "auto" } }
    ```

- `stage3_gather_16bit_weights_on_model_save` يُنفّذ عملية all-gather عبر جميع وحدات معالجة الرسوميات قبل الحفظ، لإعادة بناء الموترات الكاملة من مقاطعها. هذا هو حجة ZeRO-3.

    ```json
    {
        "zero_optimization": {
            "stage": 3,
            "stage3_gather_16bit_weights_on_model_save": true
        }
    }
    ```

- اضبط `overlap_comm` على `true` لإخفاء زمن تأخير all-reduce خلف مسار الرجوع. وتُوازن `allgather_bucket_size` و`reduce_bucket_size` بين سرعة الاتصال وذاكرة وحدة معالجة الرسوميات. فالقيم الأقل تستخدم ذاكرة أقل لكنها تُبطئ الاتصال.

    ```json
    {
        "zero_optimization": {
            "stage": 2,
            "overlap_comm": true,
            "allgather_bucket_size": 2e8,
            "reduce_bucket_size": 2e8,
            "contiguous_gradients": true
        }
    }
    ```

- `offload_optimizer` ينقل المُحسِّن إلى ذاكرة المعالج المركزي. ولتوفير المزيد من الذاكرة، انقل أيضًا معاملات النموذج باستخدام `offload_param` (لنسخة ZeRO-3 فقط). اضبط `pin_memory` على `true` لتسريع عمليات النقل بين المعالج المركزي والوحدة الرسومية، لكن هذا يُثبّت ذاكرة الوصول العشوائي فلا تصبح متاحةً للعمليات الأخرى.

    ```json
    {
        "zero_optimization": {
            "stage": 3,
            "offload_optimizer": { "device": "cpu", "pin_memory": true },
            "offload_param":     { "device": "cpu", "pin_memory": true }
        }
    }
    ```

- `optimizer` و`scheduler` افتراضيًا هما المُحسِّن والمُجدوِل المُعيَّنان في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments). اضبطهما على `"auto"` حتى يقرأ DeepSpeed القيم من [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) ما لم تكن بحاجة إلى مُحسِّن أصلي لـ DeepSpeed مثل LAMB.

    ```json
    {
        "optimizer": {
            "type": "AdamW",
            "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" }
        },
        "scheduler": {
            "type": "WarmupDecayLR",
            "params": { "total_num_steps": "auto", "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto" }
        }
    }
    ```

    إذا كنت تقوم بتفريغ المُحسِّن، فاضبط `zero_force_ds_cpu_optimizer` على `false` لاستخدام مُحسِّن Adam المعالج المركزي من DeepSpeed.

    ```json
    {
        "zero_force_ds_cpu_optimizer": false
    }
    ```

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

يحفظ DeepSpeed نقاط التفتيش (checkpoints) بتنسيق مجزأ لا يمكن تحميله مباشرة باستخدام [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained). اضبط `load_best_model_at_end()` على `True` ليتمكن Trainer من تتبع أفضل نقطة تفتيش وإعادة تحميلها في نهاية التدريب.

```py
from transformers import TrainingArguments, Trainer

args = TrainingArguments(
    deepspeed="ds_config_zero3.json",
    load_best_model_at_end=True,
    ...
)
# after training, save a normal transformers checkpoint
trainer.save_model("./best-model")
```

تعيين `save_only_model=True` يتخطى حفظ حالة المُحسِّن الكاملة، مما يعني أنك لا تستطيع إعادة تحميل أفضل نموذج في نهاية التدريب. اضبط أيضاً `stage3_gather_16bit_weights_on_model_save: true` لإعادة بناء الأوزان الكاملة من شقوقها. هذا مطلوب لحفظ نموذج موحّد بدقة 16 بت أو حالة dict بدقة 16 بت مع ZeRO-3. يرفع Transformers خطأً عند دمج `save_only_model=True` مع `load_best_model_at_end=True`.

> [!TIP]
> لمتابعة الاستئناف عبر تكوينات التوازي المختلفة، راجع دليل [Universal Checkpointing](https://www.deepspeed.ai/tutorials/universal-checkpointing) الخاص بـ DeepSpeed.

## الخطوات التالية

- اقرأ الفصل [Zero Redundancy Optimizer](https://nanotron-ultrascale-playbook.static.hf.space/index.html#zero_redundancy_optimizer_(zero)) من The Ultra-Scale Playbook لمعرفة المزيد حول كيفية عمل ZeRO.
- اقرأ أبحاث ZeRO: [Memory Optimizations Toward Training Trillion Parameter Models](https://hf.co/papers/1910.02054)، و[Democratizing Billion-Scale Model Training](https://hf.co/papers/2101.06840)، و[Breaking the GPU Memory Wall for Extreme Scale Deep Learning](https://hf.co/papers/2104.07857).

