0Pricing
Learn AI with Python · درس

‏DistributedDataParallel (DDP)

مجموعات العمليات، وdist.init_process_group، وDistributedSampler، ومزامنة التدرجات

‏DistributedDataParallel (DDP) درس مجاني في Learn AI with Python على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn AI with Python، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn AI with Python 4 دروس في المجموع.

ما هو DDP

يُعد DistributedDataParallel (DDP) أسلوب PyTorch عالي الأداء للتدريب المتوازي على مستوى البيانات. فهو يطلق عملية واحدة لكل وحدة GPU، تحتفظ كل منها بنسخة كاملة من النموذج، ويزامن التدرجات بكفاءة. ويتوسع DDP بصورة شبه خطية عبر وحدات GPU والأجهزة.

مجموعة العمليات

ينسّق DDP العمليات من خلال مجموعة عمليات. ويحصل كل process على rank فريد، ويعرف إجمالي world size. وتتواصل العمليات عبر backend؛ ويكون ذلك backend هو nccl على وحدات GPU من NVIDIA.

init_process_group

تبدأ كل عملية بالانضمام إلى المجموعة. ويُنشئ dist.init_process_group مع backend="nccl" قناة الاتصال بين وحدات GPU.

import torch.distributed as dist
import os

dist.init_process_group(backend="nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()

تثبيت الجهاز

ينبغي أن تمتلك كل عملية وحدة GPU واحدة. استخدموا local rank لتعيين الجهاز، بحيث تستخدم العملية 0 ‏cuda:0، وتستخدم العملية 1 ‏cuda:1، وهكذا.

local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)

تغليف النموذج

انقلوا النموذج إلى وحدة GPU الخاصة به، ثم غلّفوه داخل DDP باستخدام device_ids=[local_rank]. ويسجّل DDP خطافات تزامن التدرجات أثناء الانتشار العكسي.

from torch.nn.parallel import DistributedDataParallel as DDP

model = MyModel().to(device)
model = DDP(model, device_ids=[local_rank])

DistributedSampler

يجب أن ترى كل عملية جزءًا مختلفًا من البيانات دون أي تداخل. يقسّم DistributedSampler مجموعة البيانات بين الرتب، بحيث يغطي اتحاد الأجزاء مجموعة البيانات بأكملها مرة واحدة بالضبط في كل حقبة.

from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler

sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, batch_size=32, sampler=sampler)

الخلط في كل حقبة

استدعوا sampler.set_epoch(epoch) في بداية كل حقبة. فهذا يعيد تهيئة بذرة الخلط بصورة متسقة بين العمليات، بحيث تخلط كل رتبة البيانات بالطريقة نفسها وتبقى الأجزاء منفصلة.

for epoch in range(epochs):
    sampler.set_epoch(epoch)
    for x, y in loader:
        ...

عملية All-Reduce للتدرجات

أثناء loss.backward()، ينفّذ DDP عملية all-reduce: ترسل كل عملية تدرجاتها وتتلقى النتيجة المتوسطة، بحيث تطبق جميع النسخ تحديثات متطابقة. وتتداخل عملية all-reduce مع الانتشار العكسي، مما يخفي تكلفة الاتصال.

لا يوجد عنق زجاجة في GPU 0

على خلاف DataParallel، لا يحتوي DDP على وحدة GPU مركزية تجمع المخرجات. تحسب كل عملية خسارتها وتدرجاتها، ولا تتبادل سوى التدرجات عبر all-reduce. وهذا التماثل هو سبب توسع DDP بشكل أفضل بكثير.

التشغيل باستخدام torchrun

يطلق torchrun العمليات الخاصة بكل وحدة GPU ويضبط متغيرات البيئة الخاصة بالرتب. ويبدأ --nproc_per_node=4 أربع عمليات (عملية واحدة لكل وحدة GPU) على هذه العقدة.

torchrun --nproc_per_node=4 train.py

الحفظ على Rank 0 فقط

تحتفظ جميع الرتب بأوزان متطابقة، لذا ينبغي أن تكتب رتبة واحدة فقط نقطة التحقق لتجنب الكتابة فوقها. احموا عملية الحفظ باستخدام فحص للرتبة.

if rank == 0:
    torch.save(model.module.state_dict(), "model.pt")
dist.barrier()

تحقق سريع

اختبروا معرفتكم بـ DDP.

مراجعة

تعلّمتم DistributedDataParallel:

  • تضم dist.init_process_group(backend="nccl") العملية إلى مجموعة العمليات
  • يوفّر DistributedSampler لكل رتبة جزءًا منفصلًا من البيانات
  • يزامن DDP(model, device_ids=[rank]) التدرجات عبر all-reduce
  • شغّلوا التدريب باستخدام torchrun --nproc_per_node=4
  • احفظوا على rank 0 فقط

الأسئلة الشائعة

هل درس «‏DistributedDataParallel (DDP)» مجاني؟

نعم — نص درس «‏DistributedDataParallel (DDP)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn AI with Python، انتقل إلى CoddyKit PRO. تتضمن دورة Learn AI with Python 4 دروس في المجموع.

ماذا ستتعلم في «‏DistributedDataParallel (DDP)»؟

مجموعات العمليات، وdist.init_process_group، وDistributedSampler، ومزامنة التدرجات تتمرن على Learn AI with Python مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn AI with Python؟

لا تُشترط خبرة سابقة. Learn AI with Python على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «‏DistributedDataParallel (DDP)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn AI with Python هذا؟

نعم. كل درس في Learn AI with Python يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التدريب باستخدام وحدات GPU متعددة مع DataParallel
  2. ‏DistributedDataParallel (DDP)
  3. التدريب بالدقة المختلطة باستخدام AMP
  4. التدريب الفعّال باستخدام Hugging Face Accelerate
← العودة إلى Learn AI with Python