جدولة GPU وإدارة الموارد
NVIDIA GPU Operator وDevice Plugin
4 دقيقة للقراءة
NVIDIA GPU Operator يؤتمت إدارة GPU في Kubernetes، ويثبت التعريفات ومجموعة أدوات الحاوية وdevice plugin ومكونات المراقبة. إنه معيار 2025 لمجموعات GPU الإنتاجية.
تحديات جدولة GPU
القيود التقليدية
┌─────────────────────────────────────────────────────────────────┐
│ جدولة GPU التقليدية │
├─────────────────────────────────────────────────────────────────┤
│ Pods تطلب: nvidia.com/gpu: 1 │
│ │
│ القيود: │
│ ├── GPUs تُعامل كأجهزة معتمة صندوق أسود │
│ ├── لا وعي بالذاكرة (80GB GPU لمهمة 8GB) │
│ ├── لا رؤية لاستخدام الحوسبة │
│ ├── لا وعي بالطوبولوجيا (NVLink، PCIe) │
│ └── وصول حصري بغض النظر عن الاحتياجات الفعلية │
└─────────────────────────────────────────────────────────────────┘
مكدس حلول NVIDIA
┌─────────────────────────────────────────────────────────────────┐
│ مكدس إدارة NVIDIA GPU │
├─────────────────────────────────────────────────────────────────┤
│ GPU Operator (المستوى الأعلى) │
│ ├── يدير جميع المكونات أدناه │
│ ├── تثبيت التعريفات الآلي │
│ └── إدارة دورة الحياة │
├─────────────────────────────────────────────────────────────────┤
│ NVIDIA Container Toolkit │
│ ├── nvidia-container-runtime │
│ └── يمكّن وصول GPU في الحاويات │
├─────────────────────────────────────────────────────────────────┤
│ Device Plugin │
│ ├── يعلن عن GPUs لـ Kubernetes │
│ └── يخصص GPUs للـ pods │
├─────────────────────────────────────────────────────────────────┤
│ GPU Feature Discovery │
│ ├── يضع تسميات للعقد بخصائص GPU │
│ └── يمكّن الجدولة الدقيقة │
├─────────────────────────────────────────────────────────────────┤
│ DCGM Exporter │
│ ├── مقاييس Prometheus │
│ └── استخدام GPU، الذاكرة، درجة الحرارة │
└─────────────────────────────────────────────────────────────────┘
تثبيت GPU Operator
المتطلبات المسبقة
# التحقق من أن عقد GPU في المجموعة
kubectl get nodes -l feature.node.kubernetes.io/pci-10de.present=true
# تثبيت Node Feature Discovery (إذا لم يكن موجوداً)
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/node-feature-discovery/master/manifests/nfd-all.yaml
# التحقق من أن NFD يعمل
kubectl get pods -n node-feature-discovery
التثبيت باستخدام Helm
# إضافة مستودع NVIDIA Helm
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# تثبيت GPU Operator بالإعدادات الافتراضية
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--wait
# التثبيت مع تكوين مخصص
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--set driver.enabled=true \
--set driver.version="550.54.15" \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--set dcgmExporter.enabled=true \
--set gfd.enabled=true \
--set mig.strategy=mixed
تكوين GPU Operator مخصص
# gpu-operator-values.yaml
driver:
enabled: true
version: "550.54.15"
repository: nvcr.io/nvidia
image: driver
imagePullPolicy: IfNotPresent
toolkit:
enabled: true
repository: nvcr.io/nvidia/k8s
image: container-toolkit
version: v1.14.3-ubuntu20.04
devicePlugin:
enabled: true
repository: nvcr.io/nvidia
image: k8s-device-plugin
version: v0.14.3
config:
name: time-slicing-config
default: any
dcgmExporter:
enabled: true
repository: nvcr.io/nvidia/k8s
image: dcgm-exporter
version: 3.3.0-3.2.0-ubuntu22.04
gfd:
enabled: true
repository: nvcr.io/nvidia
image: k8s-device-plugin
version: v0.14.3
mig:
strategy: mixed # none، single، mixed
# Node affinity لمكونات GPU operator
daemonsets:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
# التثبيت مع القيم المخصصة
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
-f gpu-operator-values.yaml
تسميات GPU Feature Discovery
تسميات العقد المولدة تلقائياً
# عرض تسميات ميزات GPU على عقدة
kubectl get node gpu-node-1 -o yaml | grep nvidia
# التسميات الشائعة المولدة:
# nvidia.com/gpu.present=true
# nvidia.com/gpu.product=NVIDIA-A100-SXM4-80GB
# nvidia.com/gpu.memory=81920
# nvidia.com/gpu.count=8
# nvidia.com/gpu.family=ampere
# nvidia.com/cuda.driver.major=550
# nvidia.com/cuda.runtime.major=12
# nvidia.com/mig.capable=true
استخدام تسميات GPU في مواصفات Pod
apiVersion: v1
kind: Pod
metadata:
name: a100-training
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# تطلب A100 أو H100 GPUs
- key: nvidia.com/gpu.product
operator: In
values:
- NVIDIA-A100-SXM4-80GB
- NVIDIA-H100-SXM5-80GB
# تطلب حد أدنى 80GB ذاكرة
- key: nvidia.com/gpu.memory
operator: Gt
values:
- "80000"
containers:
- name: trainer
image: pytorch/pytorch:2.1-cuda12.1
resources:
limits:
nvidia.com/gpu: 4
التحقق من وصول GPU
# التحقق من pods GPU Operator
kubectl get pods -n gpu-operator
# الإخراج المتوقع:
# NAME READY STATUS RESTARTS AGE
# gpu-feature-discovery-xxxx 1/1 Running 0 5m
# gpu-operator-xxxx 1/1 Running 0 5m
# nvidia-container-toolkit-daemonset-xxxx 1/1 Running 0 5m
# nvidia-cuda-validator-xxxx 0/1 Completed 0 4m
# nvidia-dcgm-exporter-xxxx 1/1 Running 0 5m
# nvidia-device-plugin-daemonset-xxxx 1/1 Running 0 5m
# nvidia-driver-daemonset-xxxx 1/1 Running 0 5m
# nvidia-operator-validator-xxxx 0/1 Completed 0 4m
# تشغيل test pod
kubectl run gpu-test --rm -it \
--image=nvidia/cuda:12.1-base-ubuntu22.04 \
--requests='nvidia.com/gpu=1' \
--restart=Never \
-- nvidia-smi
مقاييس DCGM للمراقبة
مقاييس GPU الرئيسية
| المقياس | الوصف | حالة الاستخدام |
|---|---|---|
| DCGM_FI_DEV_GPU_UTIL | نسبة استخدام GPU % | كفاءة التدريب |
| DCGM_FI_DEV_MEM_COPY_UTIL | عرض نطاق الذاكرة % | عنق زجاجة تحميل البيانات |
| DCGM_FI_DEV_FB_USED | ذاكرة GPU المستخدمة (MB) | منع OOM |
| DCGM_FI_DEV_FB_FREE | ذاكرة GPU الحرة (MB) | تخطيط السعة |
| DCGM_FI_DEV_GPU_TEMP | درجة الحرارة (C) | خنق حراري |
| DCGM_FI_DEV_POWER_USAGE | سحب الطاقة (W) | مراقبة التكلفة/الطاقة |
أمثلة استعلام Prometheus
# استخدام GPU حسب pod
avg(DCGM_FI_DEV_GPU_UTIL{pod=~"training-.*"}) by (pod)
# نسبة استخدام الذاكرة
(DCGM_FI_DEV_FB_USED / (DCGM_FI_DEV_FB_USED + DCGM_FI_DEV_FB_FREE)) * 100
# تنبيه على استخدام GPU منخفض (كشف الهدر)
avg(DCGM_FI_DEV_GPU_UTIL) by (Hostname) < 30
# استهلاك الطاقة لكل عقدة
sum(DCGM_FI_DEV_POWER_USAGE) by (Hostname)
التالي، سنستكشف استراتيجيات مشاركة GPU بما في ذلك MIG وtime-slicing وMPS لاستخدام أفضل. :::