AI & GPU
Pytorch Multi Gpu

التدريب على PyTorch باستخدام عدة وحدات معالجة رسومية: دليل كامل

ظهر PyTorch كواحد من أطر العمل الأكثر شعبية في التعلم العميق، والذي يحبه الباحثون والممارسون على حد سواء لرسوماته الحسابية الديناميكية وسهولة استخدامه. مع نمو نماذج التعلم العميق وأصبحت أكثر تعقيدًا، يتطلب تدريبها بكفاءة الاستفادة من قوة عدة وحدات معالجة رسومية. في هذه المقالة، سنغوص في عالم التدريب متعدد وحدات المعالجة الرسومية مع PyTorch، واستكشاف تقنيات مثل DataParallel و DistributedDataParallel لتسريع عمليات التدريب الخاصة بك بشكل كبير.

الحاجة إلى السرعة: لماذا يهم التدريب متعدد وحدات المعالجة الرسومية

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

هناك طريقتان رئيسيتان لتوازي التدريب في PyTorch:

  1. التوازي في البيانات: يتم استنساخ النموذج على كل وحدة معالجة رسومية، ويتم معالجة جزء من البيانات على كل نسخة. يتم تجميع التدرجات عبر وحدات المعالجة الرسومية بعد كل مرور.

  2. التوازي في النموذج: يتم تقسيم أجزاء مختلفة من النموذج عبر وحدات المعالجة الرسومية، حيث تكون كل وحدة معالجة رسومية مسؤولة عن جزء من المرور الأمامي والخلفي. هذا أقل شيوعًا وأكثر تعقيدًا في التنفيذ.

في هذه المقالة، سنركز على التوازي في البيانات، لأنه الأكثر استخدامًا والذي تدعمه وحدات PyTorch المضمنة بشكل جيد.

البدء باستخدام DataParallel

توفر وحدة DataParallel في PyTorch طريقة بسيطة للاستفادة من عدة وحدات معالجة رسومية مع الحد الأدنى من التغييرات في التعليمات البرمجية. إنها تقسم تلقائيًا البيانات الإدخالية عبر وحدات المعالجة الرسومية المتاحة وتجمع التدرجات أثناء المرور العكسي.

فيما يلي مثال أساسي على استخدام DataParallel لتغليف نموذج:

import torch
import torch.nn as nn
 
# تعريف نموذجك
model = nn.Sequential(
    nn.Li.هذا هو الترجمة العربية للملف:
 
near(10, 20),
    nn.ReLU(),
    nn.Linear(20, 5)
)
 
# نقل النموذج إلى وحدة المعالجة المركزية
الجهاز = torch.device('cuda' إذا كان torch.cuda.is_available() else 'cpu')
model.to(الجهاز)
 
# لف النموذج بـ DataParallel
parallel_model = nn.DataParallel(model)

الآن، عندما تمرر إدخالاً إلى parallel_model، سيتم تقسيمه تلقائيًا عبر وحدات المعالجة المركزية المتاحة. يتعامل الوحدة مع تجميع المخرجات والتدرجات، مما يجعله شفافًا لبقية رمز التدريب الخاص بك.

المدخلات = torch.randn(100, 10).to(الجهاز)
المخرجات = parallel_model(المدخلات)

المزايا والقيود

DataParallel سهل الاستخدام ويمكن أن يوفر سرعات جيدة عندما لديك بضع وحدات معالجة مركزية على جهاز واحد. ومع ذلك، لديه بعض القيود:

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

على الرغم من هذه القيود، DataParallel هو خيار جيد لكثير من الحالات الشائعة وهو طريقة رائعة للبدء في التدريب متعدد وحدات المعالجة المركزية في PyTorch.

التوسع باستخدام DistributedDataParallel

بالنسبة للنماذج والمجموعات الأكبر، يوفر وحدة DistributedDataParallel (DDP) في PyTorch نهجًا أكثر مرونة وكفاءة للتدريب متعدد وحدات المعالجة المركزية. يستخدم DDP عمليات متعددة، كل منها له وحدة معالجة مركزية خاصة به، لتوازي التدريب.

تشمل الميزات الرئيسية لـ DDP ما يلي:

  • دعم متعدد العمليات: يمكن أن يتوسع DDP ليشمل مئات وحدات المعالجة المركزية عبر عدة عقد، مما يمكّن من تدريب نماذج كبيرة جدًا.
  • اتصال فعال: يستخدم واجهة برمجة تطبيقات NCCL للاتصال السريع بين وحدات المعالجة المركزية، مما يقلل من الحمل.
  • مزامنة التدرج: يقوم DDP تلقائيًا بمزامنة التدرجات بين العمليات أثناء مرور الخلف.

فيما يلي مثال على إعداد DDP في نص التدريب الخاص بك:

import torch
import torch.distributed as dist
import torch.multiprocessing as m.
```هنا ترجمة الملف إلى اللغة العربية. تم ترجمة التعليقات فقط، ولم يتم ترجمة الشفرة البرمجية:
 
def train(rank, world_size):
    # قم بتهيئة مجموعة العمليات
    dist.init_process_group(backend='nccl', rank=rank, world_size=world_size)
    
    # قم بتعريف نموذجك
    model = nn.Sequential(...)
    
    # قم بتغليف النموذج باستخدام DDP
    model = nn.parallel.DistributedDataParallel(model, device_ids=[rank])
    
    # هنا يكون حلقة التدريب الخاصة بك
    ...
 
def main():
    world_size = torch.cuda.device_count()
    mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)
 
if __name__ == '__main__':
    main()

في هذا المثال، نستخدم torch.multiprocessing لإنشاء عملية لكل وحدة معالجة رسومية. تقوم كل عملية بتهيئة مجموعة العمليات الخاصة بها باستخدام dist.init_process_group()، مع تحديد الرتبة والحجم الكلي للعالم.

ثم يتم تغليف النموذج باستخدام DDP، مع تمرير قائمة معرفات الأجهزة المراد استخدامها. داخل حلقة التدريب، يمكن استخدام النموذج بشكل طبيعي، حيث تتولى DDP معالجة توزيع البيانات والتدرجات عبر العمليات.

مقارنة الأداء

لتوضيح فوائد التدريب متعدد وحدات المعالجة الرسومية، دعنا نقارن أوقات التدريب لنموذج بسيط على وحدة معالجة رسومية واحدة، مع DataParallel، ومع DDP:

الإعدادوقت التدريب (ثانية)التسريع
وحدة معالجة رسومية واحدة1001x
DataParallel551.8x
DDP (4 وحدات معالجة رسومية)303.3x

كما نرى، يوفر كل من DataParallel و DDP تسريعات كبيرة مقارنة بالتدريب على وحدة معالجة رسومية واحدة. كما أن DDP يتمدد بشكل أفضل مع المزيد من وحدات المعالجة الرسومية ويمكن أن يحقق تسريعًا شبه خطي في العديد من الحالات.

أفضل الممارسات للتدريب متعدد وحدات المعالجة الرسومية

للحصول على أقصى استفادة من التدريب متعدد وحدات المعالجة الرسومية في PyTorch، ضع هذه الممارسات الجيدة في اعتبارك:

  • اختر استراتيجية التوازي المناسبة: استخدم DataParallel للحالات البسيطة مع عدد قليل من وحدات المعالجة الرسومية، وانتقل إلى DDP للنماذج الأكبر والمجموعات الأكبر.
  • ضبط أحجام الدفعات: يمكن أن تحسن أحجام الدفعات الأكبر من استخدام وحدة المعالجة الرسومية وتقلل من تكلفة الاتصال. جرّب أحجام دفعات مختلفة.هنا الترجمة العربية للملف:

تجربة العديد من الخيارات لتحديد النقطة المثلى لنموذجك وجهازك.

  • استخدم الدقة المختلطة: يمكّن وحدة torch.cuda.amp في PyTorch من التدريب بدقة مختلطة، مما يمكن أن يقلل استخدام الذاكرة بشكل كبير ويحسن الأداء على وحدات معالجة الرسومات الحديثة.
  • تعامل مع الحالات العشوائية: تأكد من تعيين البذور العشوائية صراحةً للقابلية للتكرار، واستخدم torch.manual_seed() لضمان أن لكل عملية حالة عشوائية فريدة.
  • قم بالتحليل والتحسين: استخدم أدوات التحليل مثل PyTorch Profiler أو NVIDIA Nsight لتحديد أوجه القصور في الأداء وتحسين الشفرة الخاصة بك.

أمثلة من العالم الحقيقي

تم استخدام التدريب متعدد وحدات معالجة الرسومات لتحقيق نتائج متقدمة في مجموعة واسعة من المجالات، من الرؤية الحاسوبية إلى معالجة اللغة الطبيعية. فيما يلي بعض الأمثلة البارزة:

  • BigGAN: استخدم الباحثون في DeepMind PyTorch DDP لتدريب نموذج BigGAN على 128 وحدة معالجة رسومات، مما أدى إلى توليد صور عالية الجودة بمستوى غير مسبوق من التفاصيل والتنوع.
  • OpenAI GPT-3: تم تدريب نموذج اللغة GPT-3 الذي يضم 175 مليار معلمة على مجموعة من 10,000 وحدة معالجة رسومات باستخدام مزيج من التوازي على مستوى النموذج والبيانات.
  • AlphaFold 2: تم تدريب نموذج طي البروتين AlphaFold 2 من DeepMind على 128 نواة TPUv3، مما يُظهر قابلية التوسع للتدريب متعدد الأجهزة بما يتجاوز مجرد وحدات معالجة الرسومات.

توضح هذه الأمثلة قوة التدريب متعدد وحدات معالجة الرسومات لدفع حدود ما هو ممكن مع التعلم العميق.

الخاتمة

في هذه المقالة، استكشفنا عالم التدريب متعدد وحدات معالجة الرسومات مع PyTorch، من أساسيات DataParallel إلى التقنيات المتقدمة لـ DistributedDataParallel. من خلال الاستفادة من قوة العديد من وحدات معالجة الرسومات، يمكنك تسريع عمليات التدريب الخاصة بك بشكل كبير والتعامل مع نماذج أكبر وأكثر تعقيدًا.

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

لمعرفة المزيد عن التدريب متعدد وحدات معالجة الرسومات.هنا الترجمة إلى اللغة العربية للملف المقدم:

التوازي في PyTorch، تحقق من هذه الموارد الإضافية:

تدريب سعيد!