لماذا يهم الحجم؟
تدريب نموذج انحدار لوجستي صغير على حاسوب محمول يستغرق ثوانٍ. أما تدريب نموذج لغوي ضخم حديث فقد يستغرق أسابيع عبر آلاف وحدات GPU. بين هذين الحدين توجد سلسلة من التحديات الهندسية — قيود الذاكرة، وعبء التواصل، والدقة العددية، واستغلال الأجهزة — تحدد ما إذا كانت عملية التدريب ممكنة ومجدية وسريعة.
فهم كيفية التوسع الفعّال لم يعد اختياريًا للممارسين. حتى أعباء العمل المعتدلة — كشبكة ResNet على ImageNet أو محوّل للتصنيف النصي — تستفيد استفادة كبيرة من الأساليب المعروضة هنا. الأفكار الجوهرية عامة: وزّع الحسابات، استغل كفاءة الأجهزة، وقلّل بصمة الذاكرة دون التضحية بالدقة.
الأجهزة: GPU وTPU
يهيمن التعلم العميق الحديث على عمليات المصفوفات الضخمة المتوازية — وهو بالضبط عبء العمل الذي صُممت وحدات GPU لتسريعه. تحتوي GPU على آلاف النوى الأصغر (نوى CUDA في NVIDIA) التي تُنفّذ نفس التعليمة على عناصر بيانات كثيرة في آنٍ واحد. لعمليات ضرب المصفوفات — العمود الفقري لتمريرات التقدم والتراجع في الشبكات العصبية — يمكن لوحدات GPU أن تكون أسرع بـ 10–100 مرة من وحدات CPU.
ذاكرة GPU
ذاكرة VRAM (ذاكرة الفيديو العشوائية) هي الذاكرة المدمجة في GPU حيث يجب أن تقيم معاملات النموذج وتنشيطاته وتدرجاته أثناء التدريب. تمتلك وحدات GPU الحديثة 16–80 جيجابايت من VRAM (مثلًا NVIDIA H100: 80 جيجابايت HBM3). تتصل GPU بمضيف CPU عبر PCIe، وهو أبطأ بعدة رتب من عرض النطاق الداخلي للرقاقة — لذا تقليل نقل البيانات بين المضيف والجهاز أمر بالغ الأهمية.
وحدات TPU
وحدات TPU (معالجات Tensor) من Google هي دوائر متكاملة خاصة مصممة لعمليات ضرب المصفوفات بدقة bfloat16. تُنظَّم وحدات TPU في "حاضنات" — تصل إلى آلاف الرقاقات المتصلة بشبكة اتصال عالية النطاق الترددي. تتفوق في التدريب على دُفعات كبيرة بأشكال منتظمة للموترات وتتكامل بشكل وثيق مع JAX وTensorFlow.
النواة محدودة بالحساب إذا كان إنتاجية العمليات الحسابية هي العائق، ومحدودة بالذاكرة إذا كان عرض نطاق الذاكرة هو العائق. عمليات ضرب المصفوفات الكبيرة محدودة بالحساب عادةً؛ أما العمليات العنصرية (دوال التنشيط، تطبيع الطبقات) فمحدودة بالذاكرة. تجمع النوى المُدمجة عمليات متعددة محدودة بالذاكرة في تمرير نواة واحد لتقليل حركة البيانات — وهو الفكرة الجوهرية وراء FlashAttention.
توازي البيانات
أبسط استراتيجيات التوسع وأكثرها شيوعًا هي توازي البيانات: تكرار النموذج الكامل على كل GPU، وتقسيم الدُفعة عبر وحدات GPU، وحساب التدرجات بشكل مستقل على كل منها، ثم تجميع (متوسط) التدرجات قبل تحديث المعاملات.
بعد التمرير الخلفي، تتزامن وحدات GPU في التدرجات عبر عملية All-Reduce الجماعية — تُرسل كل GPU تدرجاتها وتستقبل المجموع (أو المتوسط) عبر جميع وحدات GPU. تستخدم الأُطر الحديثة خوارزمية Ring-AllReduce التي توزع عبء التواصل بالتساوي وتتوسع بكفاءة شبه خطية في عرض النطاق الترددي.
PyTorch DDP
تُعدّ DistributedDataParallel (DDP) في PyTorch التطبيق القياسي. تُداخل DDP تزامن التدرجات مع التمرير الخلفي — بمجرد حساب تدرجات طبقة ما، تبدأ في التزامن بالخلفية بينما يستمر التمرير الخلفي عبر الطبقات السابقة. يُخفي هذا معظم زمن انتظار التواصل خلف الحساب.
قاعدة التوسع الخطي
عند التوسع من GPU واحدة إلى N وحدة GPU مع توازي البيانات، يزداد حجم الدُفعة الفعّال بمقدار N. تنص قاعدة التوسع الخطي: اضرب معدل التعلم في N للحفاظ على نفس منحنى الخسارة. غير أن هذه القاعدة تتفكك عند أحجام الدُفعات الكبيرة جدًا — يصبح ضجيج التدرج صغيرًا جدًا ويعاني المحسّن في التعميم. تساعد جداول الإحماء على استقرار التدريب المبكر عند أحجام الدُفعات الكبيرة.
توازي النماذج
عندما يكون النموذج أكبر من أن يتناسب مع ذاكرة VRAM لوحدة GPU واحدة، يُطلب توازي النماذج: تقسيم النموذج نفسه عبر أجهزة متعددة. أبسط أشكاله توازي الأنابيب، حيث تُخصَّص مجموعات مختلفة من الطبقات لوحدات GPU مختلفة.
فقاعات الأنابيب
يعاني توازي الأنابيب البسيط من فقاعات الأنابيب: تبقى وحدات GPU الموجودة في المراحل اللاحقة خاملة في انتظار التنشيطات من المراحل السابقة. تقسّم طريقة GPipe كل دُفعة إلى دُفعات صغيرة وتعالجها بشكل متسلسل — تُعالج GPU2 الدُفعة الصغيرة 1 بينما تُعالج GPU1 الدُفعة الصغيرة 2، مما يُخفي عبء الفقاعات إلى حد بعيد.
توازي الموترات
يُقسّم توازي الموترات عمليات ضرب المصفوفات الفردية عبر وحدات GPU. لمصفوفة وزن W ومدخل X، يمكن توزيع أعمدة W عبر K وحدات GPU؛ تحسب كل GPU نتيجة جزئية، ثم تجمع All-Reduce المخرجات الكاملة. هذا هو النهج المستخدم في Megatron-LM لتدريب نماذج المحوّلات الكبيرة بكفاءة.
التوازي ثلاثي الأبعاد
يجمع تدريب النماذج الكبيرة المتقدم (GPT-3، LLaMA، Gemini) بين توازي البيانات + توازي الأنابيب + توازي الموترات — ما يُسمى "التوازي ثلاثي الأبعاد". يعتمد التكوين الأمثل على حجم النموذج وعدد وحدات GPU وعرض نطاق الاتصال بين وحدات GPU وسعة الذاكرة.
ZeRO وFSDP
يُحدد ZeRO (محسّن عديم التكرار، من DeepSpeed) أن توازي البيانات القياسي يخزن نسخًا مكررة من حالة المحسّن والتدرجات والمعاملات على كل GPU. يُزيل ZeRO هذا التكرار بتجزئة كل منها عبر جميع وحدات GPU:
- ZeRO-1 — تجزئة حالة المحسّن فقط (أقل عبء تواصل)
- ZeRO-2 — تجزئة حالة المحسّن + التدرجات
- ZeRO-3 — تجزئة حالة المحسّن + التدرجات + المعاملات (يُتيح نماذج أكبر بكثير من VRAM أي GPU منفردة)
المعادل الأصلي في PyTorch هو FSDP (توازي البيانات المجزّأ بالكامل)، الذي يُطبّق استراتيجية تجزئة مماثلة لـ ZeRO-3. FSDP هو النهج الموصى به لتدريب النماذج الكبيرة في نظام PyTorch البيئي.
التدريب بالدقة المختلطة
يستخدم التدريب بالدقة الكاملة (FP32) 4 بايت لكل رقم. يُخزّن التدريب بالدقة المختلطة المعاملات والتدرجات بنصف الدقة (FP16 أو bfloat16 — بايتان لكل منهما)، مما يُقلل استخدام الذاكرة ويُضاعف الإنتاجية على الأجهزة ذات نوى الموترات نصف الدقة المخصصة.
FP16 مقابل BF16
| الصيغة | بتات الأس | بتات الكسر | النطاق الديناميكي | ملاحظات |
|---|---|---|---|---|
| FP32 | 8 | 23 | ~1.2×10⁻³⁸ إلى 3.4×10³⁸ | قياسي؛ 4 بايت |
| FP16 | 5 | 10 | ~6×10⁻⁸ إلى 65504 | يتطلب تحجيم الخسارة لتجنب نقص التدفق |
| BF16 | 8 | 7 | مثل FP32 | نفس نطاق الأس؛ مفضل للاستقرار |
يمتلك BF16 نفس النطاق الديناميكي لـ FP32 (8 بتات أس)، مما يجعله أكثر استقرارًا عدديًا بكثير من FP16 للتدريب. يتطلب FP16 تحجيم الخسارة — ضرب الخسارة بثابت كبير قبل التمرير الخلفي ثم قسمة التدرجات مجددًا — لمنع نقص تدفق قيم التدرج الصغيرة. يتجنب BF16 هذا التعقيد وأصبح الخيار الافتراضي على الأجهزة الحديثة.
الدقة المختلطة التلقائية (AMP)
تُلقي torch.cuda.amp.autocast في PyTorch تلقائيًا العمليات إلى الدقة المناسبة: تعمل عمليات ضرب المصفوفات بـ FP16/BF16، بينما تبقى عمليات التقليل والعمليات الحساسة عدديًا بـ FP32. يتعامل GradScaler مع تحجيم الخسارة تلقائيًا لتدريب FP16.
تجميع التدرجات
تُحسّن أحجام الدُفعات الكبيرة استقرار التدريب، لكن قد لا تتناسب الدُفعة الكبيرة مع ذاكرة GPU. يُحاكي تجميع التدرجات دُفعة كبيرة بتقسيمها إلى K دُفعات صغيرة تُعالج بالتسلسل. تُجمع (تُجمع) التدرجات من كل دُفعة صغيرة في الذاكرة. بعد K خطوات، تعمل خطوة تحديث المحسّن مرة واحدة — تمامًا كما لو عُولجت الدُفعة الكاملة في آنٍ واحد.
أثناء التمرير الخلفي، يجب الاحتفاظ بتنشيطات التمرير الأمامي في الذاكرة لحساب التدرجات. بالنسبة للشبكات العميقة، يهيمن هذا على استخدام VRAM. تتجاهل نقاط تفتيش التدرجات (إعادة الحساب) التنشيطات أثناء التمرير الأمامي وتعيد حسابها أثناء التمرير الخلفي — مقايضة الحساب بالذاكرة. يُقلل هذا من استخدام VRAM بمقدار 5–10 أضعاف لمحوّلات عميقة، على حساب مضاعفة وقت التدريب تقريبًا.
أُطر التدريب الموزع
تمتد عدة أُطر عمل حلقات التدريب القياسية إلى إعدادات متعددة وحدات GPU وعقد متعددة:
منصات التعلم الآلي السحابية
بالنسبة لمعظم المؤسسات، يحدث التدريب على نطاق واسع في السحابة وليس على أجهزة محلية. تقدم كبرى مزودي الخدمات السحابية بنية تحتية مُدارة لتدريب التعلم الآلي:
- AWS SageMaker — مهام تدريب مُدارة مع دعم المثيلات الفورية؛ يتكامل مع S3 للبيانات؛ يدعم DDP وFSDP ومكتبات SageMaker الموزعة الخاصة.
- Google Cloud Vertex AI — تدريب أصلي على TPU وGPU؛ تكامل مع Google Cloud Storage؛ يدعم JAX وTensorFlow وPyTorch.
- Azure ML — مجموعات حوسبة مُدارة مع شبكات RDMA لتدريب متعدد العقد السريع؛ تكامل DeepSpeed.
- Lambda Labs / CoreWeave / Together AI — مزودو سحابة GPU متخصصون في أعباء عمل التعلم الآلي، وغالبًا أرخص لمهام التدريب المتقطعة.
المثيلات الفورية / القابلة للاستباق
مثيلات GPU السحابية مكلفة. تعرض المثيلات الفورية (AWS) أو الأجهزة الافتراضية القابلة للاستباق (GCP) نفس الأجهزة بخصم 60–90%، لكن يمكن للمزود استرجاعها في أي وقت. جعل التدريب متحملًا للأخطاء — حفظ نقاط التفتيش بشكل متكرر والاستئناف من آخر نقطة تفتيش بعد الاستباق — ضروري عند استخدام المثيلات الفورية لجلسات تدريب طويلة.
تُسرّع وحدات GPU تدريب الشبكات العصبية من خلال التوازي الضخم؛ وتُقدّم وحدات TPU كفاءة متخصصة بدقة bfloat16. يُوسّع توازي البيانات التدريب إلى وحدات GPU متعددة بتقسيم الدُفعات وتوسيط التدرجات عبر All-Reduce. يُتيح توازي النماذج نماذج أكبر من ذاكرة GPU منفردة باستخدام توازي الأنابيب أو الموترات أو تجزئة ZeRO/FSDP. تُقلّص الدقة المختلطة (BF16) الذاكرة إلى النصف وتُضاعف الإنتاجية مع خسارة دقة ضئيلة. يُحاكي تجميع التدرجات الدُفعات الكبيرة على أجهزة محدودة. تُتيح المنصات السحابية مجموعات GPU/TPU عند الطلب.