مشاركة وحدات المعالجة الرسومية المفروضة بواسطة الذاكرة في كوبيرنيتيس باستخدام NVIDIA CUDA 13.4

نيفيديا كوادا 13.4 تقدم آلية لتطبيق قيود على حدود الذاكرة لتقسيم وحدات المعالجة الرسومية، مما يسمح بتحديد كميات دقيقة للذاكرة وحدود قابلة للزيادة المؤقتة. يتيح مشغل تقسيم وحدات المعالجة الرسومية مفتوح المصدر وجدول المهام KAI v0.18.0 تحديد حدود الذاكرة لكل عبء عمل وأنماط معالجة مثل التقسيم الزمني أو مشاركة الموارد على عقد كوبرنيتيس.

القراءة الصوتية غير متاحة في هذا المتصفح
مشاركة وحدات المعالجة الرسومية المفروضة بواسطة الذاكرة في كوبيرنيتيس باستخدام NVIDIA CUDA 13.4

الوسوم

ملخص سريع

نيفيديا كوادا 13.4 تقدم آلية لتطبيق قيود على حدود الذاكرة لتقسيم وحدات المعالجة الرسومية، مما يسمح بتحديد كميات دقيقة للذاكرة وحدود قابلة للزيادة المؤقتة. يتيح مشغل تقسيم وحدات المعالجة الرسومية مفتوح المصدر وجدول المهام KAI v0.18.0 تحديد حدود الذاكرة لكل عبء عمل وأنماط معالجة مثل التقسيم الزمني أو مشاركة الموارد على عقد كوبرنيتيس.

مشاركة وحدات المعالجة الرسومية المفروضة بواسطة الذاكرة في Kubernetes باستخدام NVIDIA CUDA 13.4

مع تنوع أعباء العمل الخاصة بالذكاء الاصطناعي، يزداد الطلب على إدارة مرنة لموارد وحدات المعالجة الرسومية في بيئات Kubernetes. تحتاج العديد من التطبيقات إلى جزء صغير فقط من سعة وحدة المعالجة الرسومية، لكن الطرق التقليدية للتخصيص غالبًا ما تخصص أجهزة كاملة، مما يترك سعة كبيرة غير مستغلة. تتعامل NVIDIA مع هذا التحدي باستخدام CUDA 13.4، من خلال تطبيق قواعد صارمة على الذاكرة بطريقة شفافة للتطبيقات. يسمح هذا التحديث بتحديد كميات دقيقة من الذاكرة، وضمان حدود دنيا مع إمكانية زيادة الحدود القصوى، بالإضافة إلى اختيار بين أوضاع الحساب المبنية على تقسيم الوقت أو المشاركة.

لتفعيل هذه الإمكانيات على نطاق واسع، أصدرت NVIDIA أداة GPU Fractioning Operator مفتوحة المصدر. تُستضاف هذه الأداة ضمن منظمة KAI Scheduler على GitHub، وتعمل جنبًا إلى جنب مع أداة NVIDIA GPU Operator. وظيفتها الأساسية هي إعداد ومراقبة خدمة المعالجة المتعددة (MPS) على كل عقدة من عقد وحدات المعالجة الرسومية، وتطبيق حدود الذاكرة وأوضاع الحساب حسب كل عبء عمل، بالإضافة إلى قياس استخدام الذاكرة والحساب لكل جزء من وحدة المعالجة الرسومية بدلاً من الجهاز بأكمله.

هندسة تطبيق القواعد

توفر CUDA 13.4 القدرة الأساسية على فرض قواعد الذاكرة، لكن عنقود Kubernetes لا يمكنه استخدامها بشكل مستقل. على كل عقدة من عقد وحدات المعالجة الرسومية، هناك حاجة إلى آلية لتطبيق حدود الذاكرة وأوضاع الحساب الخاصة بكل حاوية Pod قبل بدء تشغيل العملية، ولتقديم تقارير عن الاستخدام الفعلي لكل جزء منها. يجب أن يتم هذا العمل على العقدة نفسها، بغض النظر عن الجهة التي قامت بتحديد عبء العمل.

تقوم أداة GPU Fractioning Operator بهذا الدور. فهي تقرأ تعليقات الموارد والأوضاع المكتوبة في ملف YAML الخاص بالPod من قبل جهة التحديد. بمجرد أن تختار جهة التحديد وحدات المعالجة الرسومية المناسبة لعبء العمل وتسجل تخصيص الذاكرة وأوضاع المشاركة في تعليقات كل حاوية Pod، تقوم أداة GPU Fractioning Operator بتكوين وحدات المعالجة الرسومية المخصصة لتطبيق تلك الحدود.

جدولة KAI v0.18.0 هي أول جدولة متكاملة مع مشغل تقسيم وحدات GPU. ابتداءً من هذه النسخة، تتضمن جدولة KAI وضعًا لمشاركة وحدات GPU يُسمى NvFractions. يقوم هذا الوضع باختيار الجزء المناسب من كل وحدة GPU لكل مهمة وكتابة الملاحظات الضرورية. يمكن للمسؤولين تفعيل NvFractions أثناء تثبيت جدولة KAI باستخدام خاصية Helm، والتي تقوم أيضًا بتثبيت مشغل تقسيم وحدات GPU كاعتماد.

ضبط طلبات وحدود الذاكرة

يمكن للمهام تحديد متطلبات وحدات GPU الجزئية باستخدام ملاحظات محددة. هناك أربع ملاحظات أساسية تجيب على أربعة أسئلة جوهرية: كمية الذاكرة المطلوبة، إلى أي مدى يمكن للمهمة أن تنمو، كيفية مشاركة عمليات الحساب، وعدد وحدات GPU التي تستخدمها.

يمكن للمسؤولين تحديد احتياجات الذاكرة كحجم مطلق باستخدام وحدات Kubernetes القياسية. يُعد اسم الحاوية جزءًا من المفتاح لضمان أن تستهدف الملاحظة الحاوية الصحيحة. بدلاً من ذلك، يمكن للمهام تحديد جزء من وحدة GPU. تتيح هذه الإمكانية للمهمة تحديد حد أدنى مضمون (الطلب) وحد أقصى يمكن أن تصل إليه عند توفر ذاكرة فارغة.

إذا تم حذف ملاحظة الحد، يكون الحد مساويًا للطلب، وتكون المهمة مقيدة بالضبط بما طلبته. يجب أن يكون حد الجزء أكبر من gpu-fraction وأقل من 1.

أوضاع الحساب: التقسيم الزمني مقابل مشاركة وحدات SM

تقدم CUDA 13.4 وضعين مختلفين لمشاركة وحدات GPU، كل منهما يتميز بخصائص أداء وعزل مختلفة.

التقسيم الزمني هو الوضع الافتراضي. إنه تسلسلي، أي أن المهام تتناوب على استخدام وحدة GPU بالكامل. عندما تستخدم كل مهمة جزءها الكامل، تحصل كل منها تقريبًا على 1/n من الوقت. أي وقت غير مستخدم من قبل إحدى المهام يتم مشاركته بالتساوي بين الباقي. من الأهمية بمكان أن كل مهمة تعمل في نطاق خطأ خاص بها، مما يوفر عزلًا كاملاً للأخطاء. إذا تعطلت إحدى المهام، فإن ذلك لا يؤثر على المهام المجاورة لها.

SM-Sharing (مشاركة المعالجات المتعددة للبث) هي عملية متوازية. في هذا الوضع، يتم تقسيم المعالجات المتعددة للبث الخاصة بوحدة المعالجة الرسومية بين المهام، وتعمل جميعها في نفس الوقت باستمرار. لا يتم تخصيص أي شيء مسبقًا؛ حيث تقوم هاردوير وحدة المعالجة الرسومية بتخصيص وإطلاق المعالجات المتعددة حسب احتياجات المهام. عندما تكون جميع المهام مشغولة، يكون التقسيم تقريبًا 1/n. ومع ذلك، إذا توقفت إحدى المهام عن العمل، فإن معالجاتها تنتقل إلى المهام الأخرى، مما يسمح لمهمة واحدة نشطة باستخدامها جميعًا. في هذا الوضع، تشترك المهام في نطاق خطأ واحد.

نظرًا لأن وحدة المعالجة الرسومية المشتركة تعمل بوضع حسابي واحد في كل مرة، فإن جدولة KAI لا تضع أبدًا مهمة ذات تقسيم زمني ومهمة تشترك في المعالجات المتعددة على نفس وحدة المعالجة الرسومية. يقوم جدول الجداول بتتبع ذلك لكل وحدة معالجة رسومية على حدة، وليس لكل عقدة، بحيث يمكن لعقدة واحدة استضافة كلا الوضعين على وحدات معالجة رسومية مختلفة.

أمثلة عملية على التنفيذ

توضح الأمثلة التالية كيفية تكوين الحاويات لسيناريوهات المشاركة المختلفة باستخدام تعليقات جدولة KAI.

خادم التنبؤ مع SM-Sharing

يمثل هذا المثال خادم تنبؤ مقسم على أربع وحدات معالجة رسومية. يتطلب ضمانًا بتخصيص 40Gi على كل وحدة معالجة رسومية، ويمكنه استخدام ما يصل إلى 60Gi عندما تكون الوحدات المجاورة خاملة. يعمل جنبًا إلى جنب مع المهام الأخرى بدلاً من الانتظار دوره.

apiVersion: v1
kind: Pod
metadata:
  name: inference
  labels:
    kai.scheduler/queue: default-queue
  annotations:
    nvidia.com/container.app.gpu-memory.request: "40Gi"
    nvidia.com/container.app.gpu-memory.limit: "60Gi"
    nvidia.com/container.app.gpu-compute.mode: "sm-sharing"
    gpu-fraction-num-devices: "4"
spec:
  schedulerName: kai-scheduler
  containers:
    - name: app
      image: nvcr.io/nvidia/cuda:13.0.2-base-ubuntu24.04

مهمة تطوير مع التقسيم الزمني

يناسب هذا المثال المهام التطويرية أو المهام الدفعية، مثل الملاحظات أو عمليات التعديل الدقيقة الصغيرة. يحتاج إلى ضمان نصف موارد كل وحدة من وحدتي المعالجة الرسومية، ويمكنه النمو إلى 80% عندما يكون هناك ذاكرة فارغة. يضمن التقسيم الزمني عزل الأخطاء بين المهام.

metadata:
  annotations:
    gpu-fraction: "0.5"
    gpu-fraction.limit: "0.8"
    nvidia.com/container.app.gpu-compute.mode: "time-slicing"
    gpu-fraction-num-devices: "2"
spec:
  schedulerName: kai-scheduler
  containers:
    - name: app

البدء والمجتمع

للاستفادة من هذه الميزات، يجب على المسؤولين التأكد من تثبيت جدولة KAI مع العلامة global.nvFractions.set=true. تمكّن هذه الإعدادات وضع NvFractions وتقوم بتثبيت مشغل تقسيم وحدة المعالجة الرسومية.

يتوفر كل من مشغل تقسيم وحدة المعالجة الرسومية وجدولة KAI على GitHub ضمن منظمة KAI Scheduler. تتوفر تعليمات التثبيت والإعداد لكل آليات المشاركة الثلاث في أدلة المسؤولين والمستخدمين. يمكن للمطورين أيضًا الانضمام إلى قناة Slack أو حضور اجتماعات المجتمع التي تُعقد كل أسبوعين لطرح الأسئلة والمساهمة في المشروع.

لمزيد من المعلومات حول CUDA 13.4، راجع الإعلان الرسمي. بالإضافة إلى ذلك، ستكون NVIDIA موجودة في KubeCon + CloudNativeCon NA 2026 في سولت ليك سيتي، يوتا، من نوفمبر 9 إلى 12.

الخلاصة

يمثل مشاركة وحدات المعالجة الرسومية المُفروضة بواسطة الذاكرة في Kubernetes تقدمًا كبيرًا في كفاءة استخدام الموارد لأعباء العمل الخاصة بالذكاء الاصطناعي. من خلال دمج مشغل تقسيم وحدات المعالجة الرسومية مع جدولة KAI v0.18.0 وCUDA 13.4، يمكن لفرق المنصات فرض حدود للذاكرة لكل عبء عمل واختيار بين أوضاع الحساب المتمثلة في التقسيم الزمني والمشاركة. تتيح هذه المرونة للمؤسسات خدمة المزيد من أعباء العمل باستخدام البنية التحتية الحالية مع الحفاظ على سيطرة صارمة على استخدام الذاكرة وتخصيص الحوسبة.

المصدر: https://developer.nvidia.com/blog/memory-enforced-gpu-sharing-in-kubernetes-with-nvidia-cuda-13-4

المصادر