الرئيسية / تعلم الآلة 101 / الوحدة 11 / الدرس 1

التدريب على نطاق واسع

الحوسبة بوحدات GPU وTPU، والتوازي في البيانات والنماذج، والدقة المختلطة، والتدريب الموزع — الهندسة التي تجعل التعلم الآلي الضخم ممكنًا.

~16 دقيقة قراءة و11 · د1 متقدم

لماذا يهم الحجم؟

تدريب نموذج انحدار لوجستي صغير على حاسوب محمول يستغرق ثوانٍ. أما تدريب نموذج لغوي ضخم حديث فقد يستغرق أسابيع عبر آلاف وحدات 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، وحساب التدرجات بشكل مستقل على كل منها، ثم تجميع (متوسط) التدرجات قبل تحديث المعاملات.

تدرج توازي البيانات
\nabla_{\theta} \mathcal{L} = \frac{1}{N}\sum_{i=1}^{N} \nabla_{\theta} \mathcal{L}_i
تحسب كل GPU i التدرجات على شريحة دُفعتها الصغيرة. التدرج المتوسط مطابق رياضيًا لحسابه على الدُفعة الكاملة — بشرط ضبط معدل التعلم بشكل مناسب.

بعد التمرير الخلفي، تتزامن وحدات 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 وسعة الذاكرة.

توازي البيانات
تكرار النموذج، تقسيم البيانات
الأنسب لـ: النماذج التي تتناسب مع GPU واحدة. يتوسع إلى مئات من وحدات GPU. قاعدة التوسع الخطي لمعدل التعلم. All-Reduce بعد التمرير الخلفي.
توازي الأنابيب
تقسيم الطبقات عبر وحدات GPU
الأنسب لـ: النماذج الأكبر من GPU واحدة. استخدم الدُفعات الصغيرة لإخفاء فقاعات الأنابيب. يتطلب موازنة تحميل دقيقة.
توازي الموترات
تقسيم مصفوفات الأوزان
الأنسب لـ: الطبقات الكبيرة جدًا (الانتباه، FFN). يتطلب اتصالًا عالي النطاق الترددي (NVLink). مستخدم في Megatron-LM.
ZeRO / FSDP
تجزئة حالة المحسّن
يجزّئ حالة المحسّن والتدرجات والمعاملات عبر وحدات GPU. يُتيح تدريب نماذج ضخمة بتريليونات المعاملات.

ZeRO وFSDP

يُحدد ZeRO (محسّن عديم التكرار، من DeepSpeed) أن توازي البيانات القياسي يخزن نسخًا مكررة من حالة المحسّن والتدرجات والمعاملات على كل GPU. يُزيل ZeRO هذا التكرار بتجزئة كل منها عبر جميع وحدات GPU:

المعادل الأصلي في PyTorch هو FSDP (توازي البيانات المجزّأ بالكامل)، الذي يُطبّق استراتيجية تجزئة مماثلة لـ ZeRO-3. FSDP هو النهج الموصى به لتدريب النماذج الكبيرة في نظام PyTorch البيئي.

التدريب بالدقة المختلطة

يستخدم التدريب بالدقة الكاملة (FP32) 4 بايت لكل رقم. يُخزّن التدريب بالدقة المختلطة المعاملات والتدرجات بنصف الدقة (FP16 أو bfloat16 — بايتان لكل منهما)، مما يُقلل استخدام الذاكرة ويُضاعف الإنتاجية على الأجهزة ذات نوى الموترات نصف الدقة المخصصة.

وفورات الذاكرة
\text{Memory}_{\text{mixed}} = \underbrace{2P}_{\text{BF16 params}} + \underbrace{2P}_{\text{BF16 grads}} + \underbrace{4P}_{\text{FP32 master}} + \underbrace{8P}_{\text{Adam state}}
تُخزَّن المعاملات بـ FP16/BF16 للتمريرين الأمامي والخلفي، لكن يُحتفظ بنسخة رئيسية بـ FP32 لخطوة تحديث المحسّن لمنع فقدان الدقة في خطوة تحديث الأوزان.

FP16 مقابل BF16

الصيغةبتات الأسبتات الكسرالنطاق الديناميكيملاحظات
FP32823~1.2×10⁻³⁸ إلى 3.4×10³⁸قياسي؛ 4 بايت
FP16510~6×10⁻⁸ إلى 65504يتطلب تحجيم الخسارة لتجنب نقص التدفق
BF1687مثل 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 وعقد متعددة:

PyTorch DDP
توازي البيانات
مدمج وجاهز للإنتاج. يُداخل تزامن التدرجات مع التمرير الخلفي. يُطلق عبر torchrun أو SLURM srun.
PyTorch FSDP
توازي البيانات المجزّأ بالكامل
تجزئة بأسلوب ZeRO-3. يتعامل مع نماذج أكبر من أي GPU منفردة. دعم أصلي في PyTorch 2.x.
DeepSpeed
محسّن ZeRO
ZeRO-1/2/3 + ZeRO-Infinity (إلغاء تحميل NVMe). مستخدم على نطاق واسع لما قبل تدريب LLM. مدفوع بتكوين JSON.
Megatron-LM
التوازي ثلاثي الأبعاد
إطار NVIDIA الجامع لتوازي البيانات والأنابيب والموترات. مستخدم لتدريب نماذج بحجم GPT-3.
HF Accelerate
مُشغّل موحّد
يُجرّد DDP/FSDP/DeepSpeed خلف واجهة برمجية موحدة. نفس سكريبت التدريب على GPU واحدة أو 100.
JAX / XLA
وظيفي + TPU
jit + pmap/shard_map لتوازي البيانات. يدمج مُجمّع XLA العمليات لوحدات TPU وGPU. مستخدم داخليًا في Google.

منصات التعلم الآلي السحابية

بالنسبة لمعظم المؤسسات، يحدث التدريب على نطاق واسع في السحابة وليس على أجهزة محلية. تقدم كبرى مزودي الخدمات السحابية بنية تحتية مُدارة لتدريب التعلم الآلي:

المثيلات الفورية / القابلة للاستباق

مثيلات GPU السحابية مكلفة. تعرض المثيلات الفورية (AWS) أو الأجهزة الافتراضية القابلة للاستباق (GCP) نفس الأجهزة بخصم 60–90%، لكن يمكن للمزود استرجاعها في أي وقت. جعل التدريب متحملًا للأخطاء — حفظ نقاط التفتيش بشكل متكرر والاستئناف من آخر نقطة تفتيش بعد الاستباق — ضروري عند استخدام المثيلات الفورية لجلسات تدريب طويلة.


النقاط الرئيسية

تُسرّع وحدات GPU تدريب الشبكات العصبية من خلال التوازي الضخم؛ وتُقدّم وحدات TPU كفاءة متخصصة بدقة bfloat16. يُوسّع توازي البيانات التدريب إلى وحدات GPU متعددة بتقسيم الدُفعات وتوسيط التدرجات عبر All-Reduce. يُتيح توازي النماذج نماذج أكبر من ذاكرة GPU منفردة باستخدام توازي الأنابيب أو الموترات أو تجزئة ZeRO/FSDP. تُقلّص الدقة المختلطة (BF16) الذاكرة إلى النصف وتُضاعف الإنتاجية مع خسارة دقة ضئيلة. يُحاكي تجميع التدرجات الدُفعات الكبيرة على أجهزة محدودة. تُتيح المنصات السحابية مجموعات GPU/TPU عند الطلب.

السابق و10-د3: مسار التعلم الآلي نظرة عامة على الوحدة الدرس التالي و11-د2: نقل التعلم