Distributed Training
يوزّع التدريب الموزّع تدريب النموذج على عدة وحدات GPU أو أجهزة باستخدام التوازي على مستوى البيانات أو التجزئة أو الموترات أو خطوط المعالجة. يتناول DDP وFSDP والتوسّع.
يوزّع التدريب الموزع عمل تدريب نموذج واحد على عدة معالجات، عادةً وحدات GPU أو وحدات TPU في جهاز واحد أو عبر سحابة أو عنقود محلي، ما يسرّع إنجاز التدريب أو يتيح تدريب نموذج لا تتسع ذاكرة جهاز واحد له. وتتبادل الأجهزة التدرجات أو التنشيطات أو أجزاء المعلمات عبر وصلات بينية سريعة باستخدام مكتبات اتصال مثل NVIDIA NCCL. بهذه الطريقة تُدرَّب النماذج التأسيسية والنماذج اللغوية الكبيرة الحديثة، كما يختصر التدريب اليومي لـكشف الكائنات على محطات العمل متعددة وحدات GPU.
آلية عمل التدريب الموزع#
التوازي على مستوى البيانات هو الاستراتيجية الأكثر شيوعًا. تحتفظ كل وحدة GPU بنسخة كاملة من النموذج، وتعالج شريحتها الخاصة من كل دفعة من بيانات التدريب، ثم تشارك في عملية all-reduce التي تحسب متوسط التدرجات كي تطبق كل نسخة تحديث الانحدار المتدرج نفسه. تتداخل DistributedDataParallel (DDP) في PyTorch مع هذا الاتصال أثناء المرور الخلفي. يساوي حجم الدفعة الإجمالي حجم الدفعة لكل وحدة GPU مضروبًا في عدد وحدات GPU، لذا يلزم عادةً تحجيم معدل التعلم بما يتناسب معه: درّب Goyal وآخرون ResNet-50 على ImageNet في ساعة واحدة باستخدام 256 وحدة GPU ودفعة من 8,192 صورة، مع قاعدة تحجيم خطية ومرحلة إحماء، محققين كفاءة تحجيم تقارب 90% عند الانتقال من 8 إلى 256 وحدة GPU.
يقلل التوازي المجزأ على مستوى البيانات كلفة ذاكرة تلك النسخ. تقسّم ZeRO والتوازي الموزع كامل التجزئة (FSDP) في PyTorch المعلمات والتدرجات وحالات المُحسِّن بين وحدات GPU، وتجمع الأوزان الكاملة لكل طبقة فقط أثناء حساب تلك الطبقة، لذا تقل الذاكرة المطلوبة من كل وحدة GPU كلما أُضيفت وحدات GPU.
يقسّم التوازي على مستوى النموذج الشبكة العصبية نفسها. يوزع التوازي الموترّي عمليات ضرب المصفوفات الفردية بين وحدات GPU، ويخصص التوازي خط الأنابيب الطبقات المتتابعة لوحدات GPU مختلفة ويمرر دفعات مصغرة عبرها، ويقسّم التوازي السياقي التسلسلات الطويلة، بينما يوزع توازي الخبراء خبراء نموذج مزيج الخبراء على وحدات GPU مختلفة. تجمع أطر العمل مثل Megatron-LM هذه الأساليب مع التوازي على مستوى البيانات لتدريب نماذج تضم مئات المليارات من المعلمات.
التدريب باستخدام وحدات GPU متعددة عمليًا#
يمثل الاتصال العبء الإضافي الرئيسي: تزداد حركة all-reduce مع حجم النموذج، لذا تتدرج وحدات GPU المتصلة عبر NVLink داخل العقدة على نحو أفضل من العقد المتصلة عبر شبكات أبطأ. تُحسب إحصاءات تطبيع الدفعة لكل GPU ما لم تُحوّل الطبقات إلى تطبيع دفعة متزامن، وهذا مهم عندما تكون حصة كل GPU من الدفعة صغيرة. يشغّل Ultralytics YOLO26 التدريب على وحدات GPU متعددة عبر DDP: يؤدي تمرير معرّفات أجهزة متعددة إلى تشغيل عملية لكل GPU باستخدام torch.distributed.run، مع واجهة NCCL الخلفية على CUDA، ويقسّم قيمة batch بالتساوي بين وحدات GPU.
from ultralytics import YOLO
# تحميل نموذج YOLO26 مُدرَّب مسبقًا
model = YOLO("yolo26n.pt")
# التدريب على وحدتي GPU 0 و1 باستخدام DDP؛ تمنح batch=32 كل وحدة GPU عدد 16 صورة في الخطوة الواحدة
results = model.train(data="coco8.yaml", epochs=100, imgsz=640, batch=32, device=[0, 1])تطبيقات عملية#
- النماذج اللغوية الكبيرة: درّبت Meta نموذج Llama 3 405B باستخدام ما يصل إلى 16K وحدة GPU من نوع H100، وجمعت بين التوازي الموترّي وتوازي خط الأنابيب والتوازي السياقي والتوازي على مستوى البيانات فيما يسميه مؤلفوها التوازي رباعي الأبعاد.
- المركبات ذاتية القيادة: تدرّب فرق الإدراك نماذج الكشف والتقسيم الدلالي على أرشيفات ضخمة من تسجيلات الكاميرات وlidar والرادار المأخوذة من أساطيل المركبات، وهو أمر لا يكون عمليًا إلا على عناقيد GPU كبيرة.
- تحليل الصور الطبية: تُجهد أحجام التصوير المقطعي المحوسب (CT) والتصوير بالرنين المغناطيسي (MRI) ثلاثية الأبعاد وعالية الدقة ذاكرة وحدة GPU واحدة، ويتيح توزيع الدفعات أو أجزاء النموذج على عدة وحدات GPU تدريب أحجام ونماذج أكبر.
التدريب الموزع مقارنةً بالمفاهيم ذات الصلة#
- التعلم الاتحادي: يدرّب التعلم الاتحادي النماذج أيضًا عبر أجهزة كثيرة، لكن البيانات تبقى على الهواتف أو في المستشفيات أو لدى عملاء آخرين حفاظًا على الخصوصية، ولا تنتقل إلى خادم مركزي سوى تحديثات النموذج. أما التدريب الموزع فيجمع البيانات في عنقود واحد لتعظيم السرعة.
- التعلم المجزأ: يقسّم التعلم المجزأ النموذج بين العميل والخادم كي لا تغادر البيانات الخام جهاز العميل، مقابل زيادة الاتصال حفاظًا على الخصوصية.
- تجميع التدرجات: يجمع تجميع التدرجات التدرجات عبر عدة دفعات صغيرة قبل إجراء تحديث واحد، محققًا حسابيًا ما تحققه دفعة كبيرة على وحدة GPU واحدة مقابل استهلاك الوقت، بينما يحسب التوازي على مستوى البيانات تلك الدفعات بالتزامن على عدة وحدات GPU.










