جدولة 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 لاستخدام أفضل. :::

اختبار

الوحدة 2: جدولة GPU وإدارة الموارد

خذ الاختبار