Pipeline Parallelism
اكتشف كيف يقوم التوازي في خط الأنابيب (pipeline parallelism) بتقسيم نماذج التعلم العميق عبر وحدات معالجة الرسومات (GPUs). تعلم كيفية منع أخطاء نفاد الذاكرة وتحسين التدريب الموزع.
توازي خط الأنابيب (Pipeline Parallelism) هو تقنية متقدمة للتدريب الموزع مصممة لتقسيم شبكة عصبية (NN) ضخمة عبر أجهزة حوسبة متعددة، مثل وحدات GPUs، عن طريق فصل النموذج حسب العمق. عندما تتجاوز أوزان النموذج وحالات المُحسِّن لبنية حديثة حدود الذاكرة الخاصة بمسرع واحد، يقوم المهندسون بتقسيم الطبقات المتسلسلة للشبكة إلى "مراحل". على سبيل المثال، قد توجد الطبقات الـ 10 الأولى على GPU 0، بينما توجد الطبقات الـ 10 اللاحقة على GPU 1. أثناء التمرير الأمامي، تتدفق البيانات من جهاز إلى آخر. من خلال ربط هذه الأجهزة معاً، يمكن للباحثين تدريب خوارزميات التعلم العميق (DL) الضخمة دون مواجهة أخطاء نفاد الذاكرة المحدودة للأجهزة.
كيف يعمل توازي خطوط المعالجة#
يؤدي التنفيذ البسيط لتقسيم الطبقات عبر الأجهزة إلى عدم كفاءة حادة تُعرف باسم "فقاعات خط الأنابيب" (pipeline bubbles). نظراً لأن الطبقات تعالج بشكل تسلسلي، فإن GPU 1 يظل خاملاً تماماً بينما يعالج GPU 0 الطبقات الأولية. لتحقيق أقصى استفادة من الأجهزة، تقوم مُجدولات خطوط الأنابيب الحديثة بتقسيم حجم الدفعة العام إلى "دفعات مصغرة" أصغر.
بدلاً من انتظار انتهاء دفعة كاملة، يبدأ GPU 0 فوراً في معالجة الدفعة المصغرة الثانية بمجرد تمرير الدفعة المصغرة الأولى إلى GPU 1. تستخدم أدوات مثل Microsoft DeepSpeed وPyTorch Distributed Pipelining API بشكل شائع استراتيجية الجدولة 1F1B (تمرير أمامي واحد، تمرير خلفي واحد). تعمل هذه الطريقة على تبديل حساب عمليات التمرير الأمامي والخلفي لدفعات مصغرة مختلفة في نفس الوقت، مما يقلل بشكل كبير من فقاعات خط الأنابيب واستهلاك الذاكرة. حتى أن تطورات عامي 2024 و2025 الأخيرة تقدم توازي خط الأنابيب بلا فقاعات (Zero Bubble Pipeline Parallelism)، وهي استراتيجية التنبؤ بالأوزان الواعية للمُحسِّن والتي تكاد تقضي على وقت الخمول عبر مجموعات الحوسبة.
التمييز بين تقنيات التوازي ذات الصلة#
يعمل توازي خطوط المعالجة ضمن نظام بيئي أوسع من استراتيجيات الحوسبة الموزعة. فهم الاختلافات أمر بالغ الأهمية لتوسيع نطاق نماذج الذكاء الاصطناعي بفعالية:
- توازي النموذج (Model Parallelism): هو المصطلح الشامل لتقسيم النموذج عبر الأجهزة. يعد توازي خطوط المعالجة شكلاً محدداً للغاية من توازي النموذج الذي يقوم بتقسيم البنية تسلسلياً حسب العمق.
- التوازي الموثري (Tensor Parallelism): على عكس عمليات التقسيم حسب العمق في توازي خط الأنابيب، يقوم التوازي الموثري بتجزئة عمليات المصفوفة الفردية أفقياً عبر وحدات GPU. غالباً ما يتم دمج هاتين التقنيتين لتحقيق أقصى إنتاجية.
- توازي البيانات (Data Parallelism): يقوم توازي البيانات بتكرار النموذج بأكمله على كل وحدة GPU ويوزع بيانات التدريب فيما بينها. بالنسبة لبنى اكتشاف الكائنات وتجزئة الصور المدمجة والمحسنة للغاية مثل نموذج Ultralytics YOLO26، والذي يتلاءم بطبيعته مع ذاكرة VRAM لجهاز واحد، يُعد توازي البيانات عبر PyTorch's DistributedDataParallel (DDP) الطريقة المفضلة لتسريع التدريب.
تطبيقات العالم الحقيقي في الذكاء الاصطناعي وتعلم الآلة#
توسيع نطاق البنية التحتية المعقدة ضروري لبناء أنظمة ذكاء اصطناعي حديثة ومتطورة:
- تدريب نماذج الأساس: يتطلب تطوير نماذج اللغة الكبيرة (LLMs) الضخمة ونماذج الأساس مثل Llama 3 من Meta دمج التوازي الموثري وتوازي البيانات وتوازي خط الأنابيب. تستفيد أطر العمل مثل NVIDIA Megatron-LM من هذه الاستراتيجيات لتدريب بنى خليط الخبراء (MoE) الضخمة عبر الآلاف من وحدات GPU على منصات سحابية مثل AWS SageMaker.
- التشخيص الطبي عالي الدقة: في مجال الذكاء الاصطناعي في الرعاية الصحية والنمذجة العلمية، غالباً ما تنتج عمليات المسح الحجمي ثنائية وثلاثية الأبعاد تنشيطات أضخم من أن تعالجها مسرعة واحدة. يتيح ربط طبقات الشبكة عبر العقد لمستشفيات الأبحاث تدريب شبكات عميقة على مجموعات بيانات MRI هائلة دون المساس بدقة الصورة.
مثال برمجِي: مفهوم تقسيم الطبقات#
تاريخياً، كان توزيع الطبقات عبر الأجهزة يتطلب كوداً مخصصاً ومعقداً. اليوم، تقوم المنطق الأساسي بربط طبقات محددة بمعرفات أجهزة مختلفة. فيما يلي تمثيل مفاهيمي لكيفية تقسيم مراحل الشبكة عبر الأجهزة في PyTorch، مما يضع الأساس لعمليات التوازي في خط الأنابيب:
import torch.nn as nn
class SimplePipelineModel(nn.Module):
def __init__(self):
super().__init__()
# Stage 1 is assigned to the first GPU
self.stage1 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:0")
# Stage 2 is assigned to the second GPU
self.stage2 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:1")
def forward(self, x):
# The forward pass seamlessly crosses device boundaries
x_out = self.stage1(x.to("cuda:0"))
return self.stage2(x_out.to("cuda:1"))بينما يتطلب إنشاء نماذج الأساس تنسيقاً معقداً، فإن نشر مشاريع رؤية الحاسوب (CV) السريعة والقابلة للتطوير يكون أبسط بشكل عام. للحصول على نشر نماذج مبسط واستخدام تلقيائي لوحدات GPU متعددة، يثق المطورون في منصة Ultralytics لتوسيع نطاق أعباء العمل تلقائياً. بالاستفادة من نصائح تدريب النماذج القوية، تعمل المنصة على إخفاء إدارة البنية التحتية، مما يسمح للمهندسين بالتركيز بالكامل على بناء حلول ذكاء اصطناعي دقيقة قادرة على الاستدلال في الوقت الفعلي.






