التدريب باستخدام وحدات GPU متعددة مع DataParallel
nn.DataParallel، وموازنة ذاكرة GPU، واختناقات عرض النطاق الترددي، ومتى يكون DDP أفضل
التدريب باستخدام وحدات GPU متعددة مع DataParallel درس مجاني في Learn AI with Python على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn AI with Python، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn AI with Python 4 دروس في المجموع.
لماذا نستخدم عدة وحدات GPU
تتجاوز النماذج والدفعات الحديثة سعة الذاكرة والقدرة الحاسوبية لوحدة GPU واحدة. يتيح استخدام عدة وحدات GPU تدريب نماذج أكبر أو معالجة دفعات أكبر في زمن فعلي أقل. يوفر PyTorch عدة طرق لتحقيق ذلك، وأبسطها هي DataParallel.
التوازي على مستوى البيانات
يُكرّر التوازي على مستوى البيانات النموذج على كل وحدة GPU، ويقسّم كل دفعة إدخال بينها. تحسب كل وحدة GPU النتائج على الجزء المخصّص لها، ثم تُدمج التدرجات بحيث تبقى جميع النسخ متزامنة.
nn.DataParallel
يغلّف nn.DataParallel النموذج في سطر واحد. تحددون معرّفات وحدات GPU المطلوب استخدامها، ويتولى PyTorch تلقائيًا توزيع المدخلات وتجميع المخرجات.
import torch
import torch.nn as nn
model = MyModel().cuda()
model = nn.DataParallel(model, device_ids=[0, 1])التقسيم التلقائي للدفعة
أثناء المرور الأمامي، يقسّم DataParallel الدفعة على البعد 0 بين وحدات GPU المدرجة. وتتحول دفعة من 64 عنصرًا على وحدتي GPU إلى دفعتين فرعيتين، تضم كل منهما 32 عنصرًا. وتشغّل كل وحدة GPU النموذج نفسه على دفعتها الفرعية بالتوازي.
# batch of 64 with device_ids=[0, 1]
# GPU 0 processes samples 0..31
# GPU 1 processes samples 32..63متوسط التدرجات
أثناء المرور العكسي، تُجمع التدرجات الخاصة بكل وحدة GPU في الجهاز الأساسي، ثم يُحسب متوسطها (أي تُجمع فعليًا ثم تُضبط في مقياسها) بحيث يعكس تحديث النموذج الدفعة بأكملها. وبعد ذلك تُزامَن النسخ من جديد استعدادًا للخطوة التالية.
حلقة تدريب عادية
أفضل ما في الأمر أن حلقة التدريب لا تتغير تقريبًا. تنقلون البيانات إلى وحدة GPU الأساسية وتستدعون النموذج المغلّف كالمعتاد؛ إذ يتولى DataParallel التوزيع في الخلفية.
for x, y in loader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
out = model(x) # auto-split across GPUs
loss = criterion(out, y)
loss.backward() # gradients averaged
optimizer.step()اختلال GPU 0
لدى DataParallel عيب معروف: إذ تجمع وحدة GPU الأساسية (وعادةً ما تكون GPU 0) جميع المخرجات وتحسب الخسارة، ولذلك تتحمل قدرًا إضافيًا من الذاكرة والقدرة الحاسوبية. ومع زيادة عدد وحدات GPU، تصبح GPU 0 عنق زجاجة، وقد تنفد ذاكرتها قبل الوحدات الأخرى.
عملية واحدة وخيوط متعددة
يعمل DataParallel ضمن عملية Python واحدة ويستخدم الخيوط لتشغيل وحدات GPU. ويحدّ قفل المفسّر العام في Python والنفقات الإضافية لعمليتي التوزيع والتجميع من كفاءة التوسع، خصوصًا عند تجاوز وحدتين إلى أربع وحدات GPU.
لماذا يُفضَّل DDP
لهذه الأسباب، يُوصى باستخدام DistributedDataParallel (DDP) في أعمال التدريب الجادة متعددة وحدات GPU. يشغّل DDP عملية واحدة لكل وحدة GPU، ويزامن التدرجات باستخدام عملية all-reduce الفعالة، ويتجنب عنق الزجاجة في GPU 0، مما يحقق توسعًا شبه خطي.
متى يظل DataParallel مناسبًا
يُعد DataParallel مناسبًا للتجارب السريعة على جهاز واحد مزود بوحدتي GPU، حيث تفوق بساطته التي لا تتطلب سوى سطر واحد عدم كفاءته. أما في التدريب متعدد العقد أو باستخدام عدد كبير من وحدات GPU، فاستخدموا DDP بدلًا منه.
مشكلة شائعة: الحفظ
يحتوي state dict للنموذج المغلّف على البادئة module.. لحفظ نقطة تحقق نظيفة، احفظوا model.module.state_dict() حتى تُحمّل بشكل صحيح لاحقًا في نموذج غير مغلّف.
torch.save(model.module.state_dict(), "model.pt")تحقق سريع
اختبروا معرفتكم بـ DataParallel.
مراجعة
تعلّمتم التدريب على عدة وحدات GPU باستخدام DataParallel:
- يكرّر
nn.DataParallel(model, device_ids=[0, 1])النموذج ويقسّم الدفعات - يُحسب متوسط التدرجات عبر وحدات GPU في كل خطوة
- يحدّ اختلال GPU 0 وتصميم العملية الواحدة من قابلية التوسع
- يُفضَّل استخدام DDP عند وجود عدد كبير من وحدات GPU أو عند التدريب متعدد العقد
الأسئلة الشائعة
هل درس «التدريب باستخدام وحدات GPU متعددة مع DataParallel» مجاني؟
نعم — نص درس «التدريب باستخدام وحدات GPU متعددة مع DataParallel» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn AI with Python، انتقل إلى CoddyKit PRO. تتضمن دورة Learn AI with Python 4 دروس في المجموع.
ماذا ستتعلم في «التدريب باستخدام وحدات GPU متعددة مع DataParallel»؟
nn.DataParallel، وموازنة ذاكرة GPU، واختناقات عرض النطاق الترددي، ومتى يكون DDP أفضل تتمرن على Learn AI with Python مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn AI with Python؟
لا تُشترط خبرة سابقة. Learn AI with Python على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التدريب باستخدام وحدات GPU متعددة مع DataParallel»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn AI with Python هذا؟
نعم. كل درس في Learn AI with Python يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التدريب باستخدام وحدات GPU متعددة مع DataParallel
- DistributedDataParallel (DDP)
- التدريب بالدقة المختلطة باستخدام AMP
- التدريب الفعّال باستخدام Hugging Face Accelerate