Kubernetes
يشغّل Kubernetes (K8s) الحاويات عبر عنقود، ويحافظ على سلامة العدد المحدد من النسخ المتماثلة، ويجدول مهام تدريب GPU واستدلاله.
Kubernetes، الذي يُختصر غالبًا إلى K8s، نظام مفتوح المصدر يشغّل التطبيقات المعبّأة في حاويات عبر عنقود من الأجهزة. يحدّد المستخدمون الحالة المطلوبة لأحد أعباء العمل، مثل صورة الحاوية المراد تشغيلها، وعدد النسخ المطلوب الإبقاء عليه، ومقدار سعة CPU والذاكرة وGPU التي تحتاج إليها كل نسخة؛ ويعمل Kubernetes باستمرار على بدء الحاويات وإعادة تشغيلها ونقلها وتوسيع نطاقها لمطابقة تلك الحالة. أعلنت Google المشروع في يونيو 2014، مستفيدةً من مدير العناقيد الداخلي Borg، وقدّمته مع الإصدار 1.0 في يوليو 2015 بوصفه المشروع التأسيسي لـ مؤسسة الحوسبة السحابية الأصلية التي تأسست حديثًا. والاسم يوناني ويعني «ربّان السفينة»، فيما يشير K8s إلى الأحرف الثمانية بين K وs. وفي عمليات تعلّم الآلة (MLOps)، يشكّل Kubernetes الطبقة الشائعة لتشغيل مهام التدريب الموزع والاستدلال الدفعي وتقديم النماذج على الأجهزة المشتركة.
البنية وحلقة التحكم#
يتألف العنقود من مستوى تحكم وعُقد عاملة. يضم مستوى التحكم خادم API الذي تتصل به جميع العملاء، ومخزن etcd لحالة العنقود، والمُجدوِل الذي يعيّن الوحدات الجديدة إلى العُقد، ووحدات التحكم التي تراقب كل منها نوعًا واحدًا من الكائنات. وتشغّل كل عقدة عاملة، سواء كانت خادمًا محليًا أو آلة افتراضية في السحابة، وكيل kubelet وبيئة تشغيل للحاويات مثل containerd أو CRI-O. وأصغر وحدة يجدولها Kubernetes هي الوحدة (pod): حاوية واحدة أو أكثر تتشارك عنوان شبكة ووحدات تخزين.
تُعرّف أعباء العمل على شكل كائنات، وتُكتب عادةً بصيغة YAML وتُطبّق باستخدام kubectl. يحافظ Deployment على عدد محدد من الوحدات المتطابقة قيد التشغيل، ويستبدلها تدريجيًا عند تغيير الصورة؛ ويوفّر Service عنوانًا ثابتًا واحدًا لتلك الوحدات ويوزّع الطلبات بينها؛ بينما يشغّل Job الوحدات حتى اكتمال المهمة. تقارن وحدات التحكم الحالة المعلنة بما يعمل فعليًا، وتتدخل عند وجود أي اختلاف:
وتجعل الحلقة نفسها Kubernetes قادرًا على إصلاح نفسه. فعند تعطل عقدة، تخرج وحداتها من حالة التشغيل، وتنشئ وحدة التحكم بدائل لها على عُقد سليمة. كما أن بقاء وحدة في حالة Pending بسبب نقص السعة يشكّل إشارة تستخدمها أدوات التوسيع التلقائي للعناقيد لإضافة عُقد.
Kubernetes لتعلّم الآلة#
تصل وحدات GPU إلى الوحدات عبر إضافات الأجهزة، التي تعلن عنها كمورد قابل للعد مثل nvidia.com/gpu، وعبر التخصيص الديناميكي للموارد، المستقر منذ Kubernetes 1.34، والذي يتيح للوحدة طلب الأجهزة وفق سمات مثل طراز GPU أو سعته من الذاكرة. يثبّت GPU Operator من NVIDIA برامج التشغيل والإضافات على عُقد GPU، ويمكنه تقسيم GPU واحد إلى شرائح Multi-Instance GPU أو مشاركته زمنيًا بين الوحدات. وأفادت OpenAI عام 2021 بأنها وسّعت عناقيد Kubernetes المنفردة إلى 7,500 عقدة لتدريب نماذج مثل GPT-3 وCLIP.
تضيف المشاريع مفتوحة المصدر طبقات متخصصة في تعلّم الآلة فوق Kubernetes:
- Kubeflow: يشغّل تدريب PyTorch الموزع ومسارات تعلّم الآلة ودفاتر الملاحظات على عنقود.
- Kueue: يضع مهام المعالجة الدُفعية والتدريب في قوائم انتظار، ويفرض حصص الفرق، كي تظل وحدات GPU المكلفة مشغولة من دون أن تستحوذ عليها فرقة واحدة.
- KServe: يقدّم النماذج عبر نقاط نهاية يتوسع نطاقها تلقائيًا، بما في ذلك خفض النطاق إلى الصفر للنماذج الخاملة.
- التوسيع الأفقي التلقائي للوحدات: يضيف نسخ الاستدلال أو يزيلها استنادًا إلى استخدام CPU أو مقاييس مخصصة مثل طول قائمة الانتظار، ما يحافظ على استقرار زمن الاستجابة مع تغير حركة المرور.
تُعد المهمة أبسط طريقة لتشغيل مهمة GPU لمرة واحدة، مثل الاستدلال على دفعة. تحتوي صورة Docker الرسمية من Ultralytics مسبقًا على الأمر yolo وأوزان YOLO26 nano، لذا لا تحدد هذه المهمة سوى أمر وتطلب GPU واحدة:
apiVersion: batch/v1
kind: Job
metadata:
name: yolo26-predict
spec:
backoffLimit: 2 # retry a failed pod at most twice
template:
spec:
restartPolicy: Never
containers:
- name: yolo
image: ultralytics/ultralytics:latest
command: ["yolo", "predict", "model=yolo26n.pt", "source=https://ultralytics.com/images/bus.jpg"]
resources:
limits:
nvidia.com/gpu: 1 # schedule only onto a node with a free GPUيرسل kubectl apply -f job.yaml المهمة، ويضع المُجدوِل الوحدة على عقدة يتوفر فيها GPU، ويطبع kubectl logs job/yolo26-predict نتائج اكتشاف الكائنات من وضع التنبؤ. وتتبع مهمة التدريب النمط نفسه، مع إضافة وحدة تخزين دائمة لنقاط التحقق، فضلًا عن وحدة تخزين في الذاكرة عند /dev/shm لعمّال محمّل بيانات PyTorch.
مقارنة Kubernetes بـ Docker والحوسبة عديمة الخوادم#
- Docker: ينشئ الصور ويشغّل الحاويات على جهاز واحد. ويوزّع Kubernetes الحاويات على أجهزة متعددة، ومنذ الإصدار 1.24 يشغّل الصور المبنية باستخدام Docker عبر containerd أو CRI-O بدلًا من Docker Engine.
- الحوسبة عديمة الخوادم: تخفي خدمات مثل Google Cloud Run وAWS Lambda العنقود بالكامل وتفرض الرسوم حسب الطلب، كما توفر Knative نموذج التوسيع إلى الصفر نفسه لعناقيد Kubernetes.
- Kubernetes مُدار: تشغّل Google Kubernetes Engine (GKE) وAmazon Elastic Kubernetes Service (EKS) وAzure Kubernetes Service (AKS) مستوى التحكم نيابةً عن عملائها، كما تدير GKE Autopilot العُقد العاملة أيضًا.










