جدولة GPU وإدارة الموارد

Kueue وVolcano: جدولة GPU المتقدمة

4 دقيقة للقراءة

المنظمات التي تعامل GPUs كموارد مشتركة تحكمها السياسات تفوز على نطاق AI. Kueue وVolcano توفران التحكم في القبول القائم على الطوابير وجدولة المجموعات الضرورية لأعباء عمل ML.

مشكلة إدارة الطوابير

بدون إدارة طوابير

┌─────────────────────────────────────────────────────────────────┐
│              المشكلة: جدولة Kubernetes الأصلية                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  الفريق أ يقدم: مهمة 32 GPU                                     │
│  الفريق ب يقدم: مهمة 8 GPU                                      │
│  الفريق ج يقدم: مهمة 64 GPU                                     │
│                                                                  │
│  سلوك Kubernetes:                                                │
│  - أول pod مجدول يحصل على الموارد                               │
│  - لا عدالة بين الفرق                                           │
│  - التدريب الموزع: تخصيص جزئي للـ pod (انسداد!)                 │
│  - لا استعارة/إقراض بين الحصص                                   │
│  - المهام عالقة بالانتظار بدون رؤية                             │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

مع إدارة طوابير

┌─────────────────────────────────────────────────────────────────┐
│              الحل: إدارة طوابير Kueue                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ClusterQueue: gpu-cluster (64 GPU إجمالي)                      │
│  ├── LocalQueue: team-a (حصة: 16 GPU، يمكن استعارة 32)         │
│  ├── LocalQueue: team-b (حصة: 16 GPU، يمكن استعارة 32)         │
│  └── LocalQueue: team-c (حصة: 32 GPU، يمكن استعارة 16)         │
│                                                                  │
│  عبء عمل مقدم → تحكم القبول → جدولة المجموعات                   │
│                                                                  │
│  الفوائد:                                                        │
│  - حصة عادلة بين الفرق                                          │
│  - قبول جماعي (الكل أو لا شيء)                                  │
│  - استعارة عندما تكون الطوابير خاملة                            │
│  - سياسات الأولوية                                              │
│  - رؤية الطابور والأولويات                                      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

Kueue: قائمة انتظار المهام الأصلية في Kubernetes

تثبيت Kueue

# تثبيت Kueue
kubectl apply --server-side -f https://github.com/kubernetes-sigs/kueue/releases/download/v0.9.0/manifests.yaml

# التحقق من التثبيت
kubectl get pods -n kueue-system

# التحقق من CRDs
kubectl get crd | grep kueue
# clusterqueues.kueue.x-k8s.io
# localqueues.kueue.x-k8s.io
# resourceflavors.kueue.x-k8s.io
# workloads.kueue.x-k8s.io

نكهات الموارد

# تعريف أنواع GPU كنكهات
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: nvidia-a100
spec:
  nodeLabels:
    nvidia.com/gpu.product: NVIDIA-A100-SXM4-80GB
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: nvidia-h100
spec:
  nodeLabels:
    nvidia.com/gpu.product: NVIDIA-H100-SXM5-80GB
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: nvidia-l4
spec:
  nodeLabels:
    nvidia.com/gpu.product: NVIDIA-L4

تكوين ClusterQueue

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: gpu-cluster
spec:
  namespaceSelector: {}  # جميع namespaces
  queueingStrategy: BestEffortFIFO
  preemption:
    reclaimWithinCohort: Any
    withinClusterQueue: LowerPriority
  resourceGroups:
  - coveredResources: ["cpu", "memory", "nvidia.com/gpu"]
    flavors:
    - name: nvidia-a100
      resources:
      - name: "cpu"
        nominalQuota: 256
        borrowingLimit: 128
      - name: "memory"
        nominalQuota: 1Ti
        borrowingLimit: 512Gi
      - name: "nvidia.com/gpu"
        nominalQuota: 32
        borrowingLimit: 16
    - name: nvidia-h100
      resources:
      - name: "cpu"
        nominalQuota: 128
      - name: "memory"
        nominalQuota: 512Gi
      - name: "nvidia.com/gpu"
        nominalQuota: 16

LocalQueue لكل فريق

# طابور الفريق أ
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
  name: ml-research-queue
  namespace: ml-research
spec:
  clusterQueue: gpu-cluster
---
# طابور الفريق ب
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
  name: ml-production-queue
  namespace: ml-production
spec:
  clusterQueue: gpu-cluster

تقديم المهام إلى Kueue

apiVersion: batch/v1
kind: Job
metadata:
  name: distributed-training
  namespace: ml-research
  labels:
    kueue.x-k8s.io/queue-name: ml-research-queue
spec:
  parallelism: 4
  completions: 4
  template:
    spec:
      containers:
      - name: trainer
        image: pytorch/pytorch:2.1-cuda12.1
        resources:
          requests:
            nvidia.com/gpu: 8
            cpu: "32"
            memory: "128Gi"
          limits:
            nvidia.com/gpu: 8
            cpu: "32"
            memory: "128Gi"
      restartPolicy: Never

مراقبة Kueue

# التحقق من حالة الطابور
kubectl get clusterqueue gpu-cluster -o yaml

# عرض أعباء العمل المعلقة/المقبولة
kubectl get workloads -n ml-research

# التحقق من حالة LocalQueue
kubectl describe localqueue ml-research-queue -n ml-research

Volcano: جدولة المجموعات للتدريب الموزع

لماذا جدولة المجموعات؟

┌─────────────────────────────────────────────────────────────────┐
│              المشكلة: تخصيص Pod جزئي                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  تدريب موزع 4 عمال يحتاج 4 GPUs في وقت واحد                    │
│                                                                  │
│  بدون جدولة المجموعات:                                          │
│  العامل 0: ✓ مجدول (ينتظر الآخرين)                              │
│  العامل 1: ✓ مجدول (ينتظر الآخرين)                              │
│  العامل 2: ✗ معلق (لا GPU)                                      │
│  العامل 3: ✗ معلق (لا GPU)                                      │
│                                                                  │
│  النتيجة: انسداد - GPUs مهدرة، التدريب عالق!                     │
│                                                                  │
│  مع جدولة المجموعات:                                             │
│  جميع العمال الـ 4: ✗ ينتظرون حتى تتوفر 4 GPUs                   │
│  جميع العمال الـ 4: ✓ قُبلوا معاً                                │
│                                                                  │
│  النتيجة: لا موارد مهدرة                                         │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

تثبيت Volcano

# تثبيت Volcano
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml

# التحقق
kubectl get pods -n volcano-system

مثال مهمة Volcano

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: pytorch-distributed
  namespace: ml-research
spec:
  minAvailable: 4  # جدولة المجموعات: الكل الـ 4 أو لا شيء
  schedulerName: volcano
  plugins:
    env: []
    svc: []
  queue: default
  tasks:
  - replicas: 1
    name: master
    template:
      spec:
        containers:
        - name: pytorch
          image: pytorch/pytorch:2.1-cuda12.1
          command: ["python", "-m", "torch.distributed.launch"]
          args: ["--master_addr=master-0", "--nproc_per_node=1", "train.py"]
          resources:
            limits:
              nvidia.com/gpu: 1
  - replicas: 3
    name: worker
    template:
      spec:
        containers:
        - name: pytorch
          image: pytorch/pytorch:2.1-cuda12.1
          command: ["python", "-m", "torch.distributed.launch"]
          args: ["--master_addr=master-0", "--nproc_per_node=1", "train.py"]
          resources:
            limits:
              nvidia.com/gpu: 1

Kueue مقابل Volcano

الميزة Kueue Volcano
التركيز الأساسي قائمة المهام والقبول جدولة المجموعات
الأولوية سياسات متقدمة أساسي
تعدد المستأجرين قوي (مجموعات، استعارة) أساسي
CRD مطلوب يستخدم Jobs الأصلية VolcanoJob مخصص
حالة CNCF مشروع Kubernetes SIG CNCF Incubating
الأفضل لـ المشاركة العادلة، الحصص التدريب الموزع

التوصية: استخدم Kueue لإدارة الطوابير + Volcano لجدولة المجموعات الصارمة.

التالي، سنغطي NVIDIA KAI Scheduler وDynamic Resource Allocation (DRA) لإدارة GPU المتطورة. :::

اختبار

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

خذ الاختبار