بنية تدريب النماذج ووحدات معالجة الرسوميات
بنية تدريب النماذج ووحدات معالجة الرسوميات
تشغيل مهمة تدريب واحدة على حاسوب محمول هو تجربة علمية بحتة. أما تشغيل التدريب على نطاق واسع — مئات التجارب المتزامنة، ومهام موزعة متعددة العقد تستهلك بيتابايتات من البيانات، مع تتبع تكاليف وحدات معالجة الرسوميات بالدولار — فهو انضباط هندسي متكامل. يتناول هذا الدرس ثلاثة محاور يجب على المهندس الأول في MLOps إتقانها: جدولة أحمال عمل وحدات معالجة الرسوميات على Kubernetes، والاستفادة من طاقة الـ Spot لخفض التكاليف بنسبة 60–80%، وأسس التدريب الموزع التي تتيح لمهمة واحدة الامتداد عبر عشرات العقد. أنت تعرف Kubernetes بعمق بالفعل؛ هنا نمتد بهذه المعرفة إلى مستوى بنية ML.
جدولة وحدات معالجة الرسوميات على Kubernetes
يتعامل Kubernetes مع وحدات معالجة الرسوميات بوصفها موارد موسّعة في إطار إضافات الأجهزة (device plugin framework)، استُقرّ عليه في الإصدار 1.10. تُعلن إضافة NVIDIA الخاصة بالأجهزة — المنشورة كـ DaemonSet — عن موارد nvidia.com/gpu على كل عقدة تحتوي على وحدة رسوميات. طلب وحدة رسوميات متطابق نحويًا مع طلب CPU أو ذاكرة، مما يعني أن كل آليات RBAC وحصص مساحات الأسماء والجدولة الحالية تعمل دون تغيير.
التفصيل الإنتاجي الحاسم: موارد وحدة الرسوميات ليست كسرية بالإعداد الافتراضي. حاوية تطلب nvidia.com/gpu: 1 تحصل على وصول حصري لوحدة رسوميات فيزيائية كاملة. إذا كانت العقدة تحتوي على 8 وحدات A100 وطلبت حاوية واحدة فقط، فإن سبع وحدات تبقى خاملة ما لم يُجدوَل سبعة حاويات أخرى معها. يؤدي هذا إلى انخفاض استخدام وحدات الرسوميات — أحد أكثر أنماط الهدر تكلفةً في بنية ML. الحلول هي التقطيع الزمني (NVIDIA MIG على A100/H100) أو المشاركة الافتراضية لوحدات الرسوميات.
مكدّس جدولة وحدات معالجة الرسوميات على مجموعة حقيقية
على نطاق الشركات الكبرى، تُشغّل مجموعات وحدات الرسوميات طبقة جدولة دُفعية فوق Kubernetes. الخياران السائدان هما Volcano (CNCF) وYunikorn (Apache)، وكلاهما يضيف جدولة العصابات (gang scheduling) — الضمان بأن جميع حاويات المهمة تبدأ في وقت واحد أو لا تبدأ أي منها. هذا حاسم للتدريب الموزع: إذا بدأت 15 حاوية من 16 لكن واحدة لم تُجدوَل بسبب استنزاف العقدة، تنتظر الـ 15 الجاهزة في حاجز، محترقةً ساعات من وحدة الرسوميات دون إنجاز شيء.
التدريب على Spot: خفض التكلفة بنسبة 60–80%
أجهزة وحدات معالجة الرسوميات مكلفة. تكلّف عقدة 8xA100 عند الطلب على AWS (p4d.24xlarge) نحو 32 دولارًا في الساعة. المكافئ Spot — أو GCP Preemptible — يكلّف 10–13 دولارًا في الساعة، أي توفيرًا بنسبة 60–70%. في الشركات التي تُشغّل آلاف ساعات وحدات الرسوميات يوميًا، هذا الفارق يعادل ملايين الدولارات سنويًا. المشكلة: يمكن لمزود السحابة استعادة عقدة Spot في أقل من دقيقتين إشعارًا (EC2) أو 30 ثانية (GCP). مهمة تدريب تعمل 10 ساعات دون تحمّل للأعطاء تفقد كل شيء عند الإخلاء.
النمط الإنتاجي لجعل التدريب على Spot عمليًا هو إنشاء نقاط تفتيش دورية في مخزن الكائنات الدائم. مهمة تدريب تحفظ نقطة تفتيش كل 10 دقائق تفقد 10 دقائق على الأكثر عند الإخلاء. بالتوافق مع backoffLimit في Kubernetes Job ومنطق إعادة التشغيل الصحيح، تستأنف المهمة تلقائيًا من آخر نقطة تفتيش.
dist.barrier() وتتعطل فعليًا. يجب تهيئة معالجات SIGTERM التي تُشغّل حفظ نقطة تفتيش وإغلاق سلس للمهمة كاملة قبل انتهاء نافذة الإخلاء. على AWS، استخدم خدمة بيانات تعريف EC2 لاستطلاع إشعارات مقاطعة Spot كل 5 ثوانٍ من حاوية جانبية.بنية مجموعات العقد: On-Demand مقابل Spot
البنية الإنتاجية القياسية تستخدم مجموعتَي عقد GPU في نفس المجموعة. مجموعة on-demand صغيرة (1–4 عقد) لمهام قصيرة وعالية الأولوية — تشغيلات التقييم النهائية، إعادة التدريب في مواعيد محددة، أي شيء أقل من 30 دقيقة. ومجموعة Spot كبيرة ذاتية التوسع (0–50 عقدة) للتجارب الاستكشافية ومسح المعاملات الفائقة (hyperparameter sweep) والتشغيلات التدريبية الطويلة القابلة للإخلاء.
أسس التدريب الموزع
عندما لا تكفي وحدة رسوميات واحدة لتدريب نموذج في وقت معقول، يُوزَّع التدريب عبر وحدات رسوميات وعقد متعددة. ثلاثة محاور للتوازي، والنماذج الكبيرة تستخدمها الثلاثة معًا (التوازي ثلاثي الأبعاد):
- توازي البيانات (DDP): كل وحدة رسوميات تحتفظ بنسخة كاملة من النموذج وتعالج مجموعة بيانات صغيرة مختلفة. تُجمَّع التدرجات عبر النسخ بعملية
AllReduceفي نهاية كل تمرير خلفي.DistributedDataParallelفي PyTorch هو المعيار. يتوسع جيدًا حتى ~32 وحدة رسوميات. - توازي المصفوفات (Tensor Parallelism): تُقسَّم مصفوفة الأوزان لطبقة واحدة عبر وحدات الرسوميات. التمرير للأمام يتطلب تواصلًا في منتصف الطبقة. مناسب للنماذج ذات البنية المحولة العريضة جدًا. Megatron-LM من NVIDIA هو المرجع.
- توازي خط الأنابيب (Pipeline Parallelism): تُوزَّع طبقات مختلفة على وحدات رسوميات مختلفة. يتطلب تجزيءً دقيقًا للدُفعات الصغيرة. DeepSpeed يستخدمه لنماذج تتجاوز ذاكرة وحدة رسوميات واحدة.
لمعظم فرق ML دون نطاق LLM، DDP هو نقطة البداية والشكل الوحيد من التوازي المطلوب. تُنسّق PyTorchJob على Kubeflow DDP عبر العقد بحقن متغيرات البيئة MASTER_ADDR وMASTER_PORT وWORLD_SIZE وRANK في كل حاوية.
قابلية الملاحظة لمهام التدريب
لمهام التدريب بوحدات الرسوميات سطح رصد مختلف عن حاويات الخدمات العادية. المقاييس الأساسية التي يجب تصديرها إلى Prometheus هي استخدام وحدة الرسوميات (DCGM_FI_DEV_GPU_UTIL)، والذاكرة المستخدمة (DCGM_FI_DEV_FB_USED)، وعرض نطاق NVLink. NVIDIA DCGM Exporter — المنشور كـ DaemonSet — يعرض كل هذه المقاييس بتنسيق Prometheus القياسي. مهمة تدريب يقل فيها استخدام وحدة الرسوميات عن 60% لفترة مستمرة تشير إلى اختناق في تحميل البيانات.
num_workers في DataLoader، استخدام FSx for Lustre بدلاً من وصلات S3 FUSE، أو تحويل مجموعة البيانات وتخزينها مسبقًا.الحكم الإنتاجي: مصفوفة قرار On-Demand مقابل Spot
ليست جميع مهام التدريب يجب أن تذهب إلى Spot. القرار يعتمد على ثلاثة عوامل: مدة المهمة، وتكلفة نقاط التفتيش، والحساسية للمواعيد النهائية. مسح hyperparameter من 200 تجربة قصيرة مدة كل منها 20 دقيقة مثالي لـ Spot. أما تشغيل التدريب النهائي قبل الإنتاج الذي يجب اكتماله في 8 ساعات لإصدار يوم الاثنين، فيجب أن يذهب إلى on-demand مع حجز ضمان للطاقة. الحكم الهندسي: إذا تجاوزت التكلفة المتوقعة للانقطاع وإعادة المحاولة (ساعات وحدات الرسوميات الضائعة بالإضافة إلى التكلفة التشغيلية) خصم Spot، استخدم on-demand.