جدولة 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 المتطورة. :::