# DDP

يحافظ [DistributedDataParallel (DDP)](https://docs.pytorch.org/tutorials/beginner/ddp_series_theory.html) على نسخة كاملة من النموذج على كل وحدة معالجة رسومية. تعالج كل وحدة معالجة رسومية جزءًا غير متداخل من البيانات عبر تمريرة أمامية وتمريرة خلفية. قبل خطوة المُحسِّن، يقوم all-reduce بمتوسط التدرجات عبر جميع وحدات المعالجة الرسومية بحيث تبقى كل نسخة من النموذج متطابقة. استخدم DDP عندما يتسع نموذجك على وحدة معالجة رسومية واحدة.

```text
                         ┌─────────────────┐
                         │  training data  │
                         └────────┬────────┘
               ┌──────────────────┼──────────────────┐
               │ shard 0          │ shard 1          │ shard 2
               ▼                  ▼                  ▼
        ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
        │   model     │    │   model     │    │   model     │
        │  (copy 0)   │    │  (copy 1)   │    │  (copy 2)   │
        │   GPU 0     │    │   GPU 1     │    │   GPU 2     │
        └──────┬──────┘    └──────┬──────┘    └──────┬──────┘
               │ grads            │ grads            │ grads
               └──────────────────┼──────────────────┘
                               all-reduce
                          (average gradients)
               ┌──────────────────┼──────────────────┐
               ▼                  ▼                  ▼
        ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
        │  optimizer  │    │  optimizer  │    │  optimizer  │
        │    step     │    │    step     │    │    step     │
        └─────────────┘    └─────────────┘    └─────────────┘
          (identical)        (identical)        (identical)
```

تُفعَّل DDP تلقائيًا عند الإقلاع باستخدام مُطلق متعدد العمليات مثل [Accelerate](./accelerate).

```cli
# 4 GPUs on one machine
accelerate launch --num_processes 4 train.py
```

## تهيئة DDP

مرّر هذه [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) للتحكم في سلوك DDP.

- `gradient_accumulation_steps()` يحدد متى يتم تنفيذ all-reduce. يتخطى [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) تنفيذ all-reduce في خطوات التراكم الوسيطة وينفذه فقط في الدفعة الجزئية النهائية. على سبيل المثال، عند استخدام `gradient_accumulation_steps=4`، يتم تنفيذ all-reduce كل 4 عمليات تمرير عكسي.
- `~TrainingArguments.ddp_find_unused_parameters` يتتبع رسم autograd في نهاية تمرير الأمامي بحثًا عن المعاملات التي لن تستقبل تدرجًا، ثم يعلّمها بأنها جاهزة حتى لا تعيق عملية all-reduce. لا تستخدمه مع `~TrainingArguments.gradient_checkpointing` لأن فحص التدرجات يتخلّى عن التفعيلات الوسيطة ويعيد حسابها على الفور.
- `~TrainingArguments.ddp_bucket_cap_mb` هو حجم الدلو لتجميع التدرجات في عملية all-reduce واحدة خلال المرور العكسي. كلما زاد حجم الدلو، قلّت استدعاءات all-reduce وانخفضت تكلفة الإقلاع.
- `~TrainingArguments.ddp_broadcast_buffers` يزامن مخازن النموذج (مثل إحصاءات BatchNorm المتحركة) من rank 0 إلى جميع الـ ranks الأخرى في بداية كل تمريرة أمامية. عطّل هذا الخيار إذا كان نموذجك يستخدم LayerNorm فقط. لا تستخدمه مع `~TrainingArguments.gradient_checkpointing`.
- `~TrainingArguments.ddp_backend` يحدد واجهة الاتصال. استخدم `"nccl"` لشرائح NVIDIA GPU (الافتراضي والأسرع)، و`"gloo"` للتدريب على المعالج أو تصحيح الأخطاء، و`"xccl"` أو `"hccl"` أو `"cncl"` للأجهزة الأخرى.
- `ddp_timeout()` يحدد الحد الزمني لإتمام جميع العمليات والتشغيلات (all-reduce، broadcast). إذا توقف أحد العمليات، كما يحدث عند تحميل نموذج كبير ببطء، يرفع المهلة الزمنية خطأً بدلاً من الانسداد بشكل غير محدود.

```py
from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_accumulation_steps=4,
    ddp_backend="nccl",
    ddp_find_unused_parameters=False,
    ddp_bucket_cap_mb=25,
    ddp_broadcast_buffers=True,
    ddp_timeout=1800,
)
```

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

- راجع [FSDP](./fsdp) لتدريب النماذج التي تكون كبيرة جدًا بحيث لا تتسع على وحدة معالجة رسومية واحدة.
- راجع [DeepSpeed](./deepspeed) لتحسين ZeRO وإزالة التحميل.
- اقرأ الفصل [التوازي في البيانات](https://nanotron-ultrascale-playbook.static.hf.space/index.html#data_parallelism) من دليل المقياس الفائق لمزيد من المعلومات حول كيفية عمل DDP.

