Pipeline Parallelism
يوزّع التوازي عبر خطوط الأنابيب طبقات النموذج المتتالية على وحدات GPU مختلفة، ويمرّر الدفعات المصغّرة عبرها، ما يتيح تدريب نموذج أكبر من سعة وحدة GPU واحدة.
تُعد موازاة خطوط الأنابيب تقنية من تقنيات التدريب الموزع، تقسم الشبكة العصبية بحسب عمقها إلى مجموعات متتالية من الطبقات تُسمى مراحل، وتضع كل مرحلة على GPU مستقل، ثم تمرر التنشيطات من مرحلة إلى التالية. ولإبقاء كل وحدات GPU مشغولة، تُقسّم كل دفعة إلى دفعات مصغرة أصغر تتدفق عبر المراحل كالأجزاء على خط تجميع. وتُسمى هذه الطريقة أيضًا موازاة النموذج بين الطبقات. وقد ذاع أسلوب الدفعات المصغرة على يد باحثين من Google بقيادة Yanping Huang عبر GPipe في نوفمبر 2018، حين دربوا AmoebaNet يضم 557 مليون مُعامل ليحقق دقة 84.4% من المستوى الأول على ImageNet، ومحوّل ترجمة متعدد اللغات يضم 6 مليارات مُعامل و128 طبقة transformer.
الدفعات المصغرة وفجوة خط الأنابيب#
عند معالجة دفعة واحدة في كل مرة، لا تعمل إلا مرحلة واحدة بينما تنتظر المراحل الأخرى: فلا تستطيع المرحلة 2 البدء قبل انتهاء المرحلة 1، ويُعكس الترتيب أثناء الانتشار العكسي. وتتيح الدفعات المصغرة للمرحلة 1 بدء الدفعة المصغرة الثانية بمجرد تسليم الأولى إلى المرحلة 2. وتُسمى الفترات الخاملة المتبقية أثناء امتلاء خط الأنابيب وتفريغه بالفجوة. ويوضح طباعة جدول تمرير أمامي بأسلوب GPipe لأربع مراحل وست دفعات مصغرة شكله:
stages, micro_batches = 4, 6
steps = micro_batches + stages - 1 # time steps until the last micro-batch leaves the last stage
for stage in range(stages):
row = ""
for t in range(steps):
m = t - stage # stage s starts micro-batch m once stage s-1 hands it over
row += f" F{m}" if 0 <= m < micro_batches else " ."
print(f"GPU {stage}:{row}")
# Every stage idles for stages - 1 of the steps, in the forward and again in the backward pass
bubble = (stages - 1) / steps
print(f"Idle fraction: {bubble:.0%}")يأتي الناتج على شكل درجات: تنفذ GPU 0 تمريرات أمامية F0 إلى F5 في الخطوات الست الأولى من أصل تسع، ثم تنتظر؛ وتنتظر GPU 3 ثلاث خطوات قبل بدء F0، ويكون السطر الأخير Idle fraction: 33%. وتبلغ نسبة الفجوة (عدد المراحل − 1) / (عدد الدفعات المصغرة + عدد المراحل − 1)، لذا تخفض معالجة 24 دفعة مصغرة عبر المراحل الأربع نفسها النسبة إلى 11%. وتُجمع التدرجات من جميع الدفعات المصغرة قبل تنفيذ خطوة واحدة للمحسّن، وفق العملية الحسابية نفسها المستخدمة في تراكم التدرجات، لذا يطابق التحديث التدريب على الدفعة الكاملة. كما تتخلص GPipe من التنشيطات داخل كل مرحلة، ثم تعيد حسابها أثناء التمرير الخلفي، وهو شكل من تحديد نقاط تحقق التدرج.
جداول خطوط الأنابيب#
تعيد الجداول اللاحقة ترتيب العمل نفسه لتوفير الذاكرة أو تقليل الفجوة:
- 1F1B: قدمه نظام PipeDream في عام 2018، ويتناوب بين دفعة مصغرة واحدة للتمرير الأمامي وأخرى للتمرير الخلفي في كل مرحلة، بمجرد امتلاء خط الأنابيب. عندئذٍ تحتفظ كل مرحلة بتنشيطات عدد من الدفعات المصغرة لا يتجاوز عدد المراحل، بدلًا من الاحتفاظ بها جميعًا.
- 1F1B المتداخل: يمنح كل GPU عدة مراحل أصغر غير متجاورة. وأفاد فريق Megatron-LM في NVIDIA بتحقيق إنتاجية أعلى بأكثر من 10% باستخدامه، كما دربوا نموذجًا يضم تريليون مُعامل بسرعة 502 بيتافلوب/ثانية على 3,072 وحدة GPU، أي 52% من ذروة الأداء.
- صفر فجوة: يقسم التمرير الخلفي إلى تدرج مدخلات المرحلة، الذي تنتظره المرحلة السابقة، وتدرج الأوزان، الذي يمكنه ملء الفترات الخاملة لاحقًا. ويتفوق على إنتاجية 1F1B بما يصل إلى 23% ضمن ميزانية ذاكرة مماثلة.
يوفر PyTorch هذه الأساليب بوصفها ScheduleGPipe وSchedule1F1B وScheduleInterleaved1F1B وScheduleInterleavedZeroBubble وScheduleDualPipeV ضمن واجهة برمجة تطبيقات خطوط الأنابيب، التي تقسم النموذج إلى مراحل أيضًا. أما DualPipe فيأتي من DeepSeek-V3، حيث شغّل فريقه 16 مرحلة لخط الأنابيب واستخدمها لموازاة الحوسبة والاتصالات وتقليل الفجوة.
موضع موازاة خطوط الأنابيب#
لا تتبادل المراحل إلا التنشيطات عند حدودها، مرة واحدة لكل دفعة مصغرة؛ لذلك تتحمل موازاة خطوط الأنابيب الروابط الأبطأ بين الخوادم على نحو أفضل من موازاة الموترات، التي تتطلب اتصالات داخل كل طبقة. لذا تجمع عمليات التدريب الكبيرة بين الأسلوبين. دربت Meta نموذج Llama 3 بحجم 405B باستخدام موازاة موترات بثمانية اتجاهات داخل كل خادم ذي 8 وحدات GPU، و16 مرحلة لخط الأنابيب بين الخوادم، وموازاة البيانات على 64 إلى 128 نسخة؛ كما تستخدم محركات الخدمة مثل vLLM التقسيم نفسه عندما يحتاج نموذج لغة كبير (LLM) إلى أكثر من عقدة واحدة. وتحدد أبطأ مرحلة سرعة خط الأنابيب بأكمله، كما تضم المرحلتان الأولى والأخيرة في نموذج اللغة جدول التضمينات وطبقة الإخراج؛ لذلك خصصت Llama 3 لكل منهما طبقة محوّل واحدة أقل.
تقسم الأساليب ذات الصلة العمل بطرق مختلفة:
- موازاة الموترات: تقسم مصفوفات الأوزان داخل كل طبقة، بحيث تشارك كل وحدة GPU في كل طبقة.
- موازاة السياق: تقسم تسلسل المدخلات الطويل بين وحدات GPU.
- التعلم المقسّم: يقسم الشبكة بحسب العمق أيضًا، ولكن بين مؤسسات مختلفة، بحيث لا يرسل مالك البيانات بيانات أولية إلى الخادم الذي يشغّل الطبقات اللاحقة.
تُبقي موازاة البيانات كل طبقة على كل وحدة GPU، وتقسم الدفعة بدلًا من ذلك؛ وهذا كل ما يحتاج إليه النموذج عندما يتسع على جهاز واحد. بهذه الطريقة يتدرب Ultralytics YOLO26 على عدة وحدات GPU: باستخدام device=[0, 1, 2, 3] وbatch=64 في وضع التدريب، يشغّل كل GPU نموذج كشف الأجسام كاملًا على 16 صورة، ويحسب PyTorch DistributedDataParallel متوسط التدرجات عبر وحدات GPU بعد كل تمرير خلفي.










