جدولة GPU وإدارة الموارد
NVIDIA KAI Scheduler وDynamic Resource Allocation
3 دقيقة للقراءة
في يناير 2025، أطلقت NVIDIA KAI (Kubernetes AI) Scheduler كمصدر مفتوح، مما جلب إدارة GPU على مستوى المؤسسات للمجتمع. مع Kubernetes 1.34's GA Dynamic Resource Allocation، هذا يمثل أحدث تقنيات جدولة GPU.
NVIDIA KAI Scheduler
بنية KAI
┌─────────────────────────────────────────────────────────────────┐
│ NVIDIA KAI Scheduler │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ مجدول واعي بـ GPU ││
│ │ ├── وعي بالطوبولوجيا (NVLink، NVSwitch) ││
│ │ ├── وضع واعي بالذاكرة ││
│ │ ├── تحسين مهام Multi-GPU ││
│ │ └── سياسات الأولوية والمقاطعة ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ إدارة الطوابير ││
│ │ ├── جدولة الحصة العادلة ││
│ │ ├── جدولة المجموعات ││
│ │ ├── إدارة الحصص ││
│ │ └── استعارة/إقراض ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ طبقة التكامل ││
│ │ ├── يعمل مع GPU Operator ││
│ │ ├── متوافق مع Kueue ││
│ │ └── جاهز لـ DRA ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────┘
سياسات جدولة KAI
# سياسة جدولة KAI
apiVersion: kai.nvidia.com/v1alpha1
kind: SchedulingPolicy
metadata:
name: gpu-topology-aware
spec:
# وضع واعي بالطوبولوجيا
topologyPolicy:
strategy: BestFit # BestFit، SpreadEvenly، SingleNode
preferNVLink: true
# جدولة واعية بالذاكرة
memoryPolicy:
strategy: FirstFit
memoryThreshold: 80% # لا تجدول إذا كانت ذاكرة GPU > 80%
# تحسين Multi-GPU
multiGPUPolicy:
preferSameSwitch: true # GPUs على نفس NVSwitch
maxGPUsPerNode: 8
# المقاطعة
preemption:
enabled: true
gracePeriod: 30s
استخدام KAI مع أعباء العمل
apiVersion: batch/v1
kind: Job
metadata:
name: llm-training
annotations:
kai.nvidia.com/scheduling-policy: gpu-topology-aware
spec:
template:
spec:
schedulerName: kai-scheduler
containers:
- name: trainer
image: nvcr.io/nvidia/pytorch:24.01-py3
resources:
limits:
nvidia.com/gpu: 8
env:
- name: NCCL_DEBUG
value: INFO
Dynamic Resource Allocation (DRA)
DRA في Kubernetes 1.34 (GA)
┌─────────────────────────────────────────────────────────────────┐
│ DRA مقابل جدولة GPU التقليدية │
├─────────────────────────────────────────────────────────────────┤
│ │
│ التقليدية (Device Plugin): │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ Pod: nvidia.com/gpu: 1 ││
│ │ - قائم على الأعداد الصحيحة (GPUs كاملة فقط) ││
│ │ - لا وعي بالذاكرة/الحوسبة ││
│ │ - وصول حصري ││
│ │ - تخصيص ثابت ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
│ DRA (Kubernetes 1.34 GA): │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ ResourceClaim: gpu-claim ││
│ │ - اختيار جهاز دقيق ││
│ │ - قيود الذاكرة/الحوسبة ││
│ │ - مشاركة متعددة الـ pods ││
│ │ - تخصيص في الوقت المناسب ││
│ │ - خصائص الجهاز (NVLink، MIG) ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────┘
مكونات DRA
# DeviceClass يحدد أنواع GPU
apiVersion: resource.k8s.io/v1alpha3
kind: DeviceClass
metadata:
name: nvidia-gpu
spec:
selectors:
- cel:
expression: device.driver == "nvidia.com"
---
# ResourceClaimTemplate للاستخدام المتكرر
apiVersion: resource.k8s.io/v1alpha3
kind: ResourceClaimTemplate
metadata:
name: gpu-claim-template
namespace: ml-research
spec:
spec:
devices:
requests:
- name: gpu
deviceClassName: nvidia-gpu
count: 1
selectors:
- cel:
expression: device.attributes["nvidia.com/memory"].quantity >= "40Gi"
استخدام DRA في Pods
apiVersion: v1
kind: Pod
metadata:
name: dra-training
namespace: ml-research
spec:
containers:
- name: trainer
image: pytorch/pytorch:2.1-cuda12.1
resources:
claims:
- name: gpu-claim
resourceClaims:
- name: gpu-claim
resourceClaimTemplateName: gpu-claim-template
DRA متقدم: مشاركة GPU متعددة الـ Pods
# ResourceClaim قابل للمشاركة
apiVersion: resource.k8s.io/v1alpha3
kind: ResourceClaim
metadata:
name: shared-gpu
namespace: ml-research
spec:
devices:
requests:
- name: inference-gpu
deviceClassName: nvidia-gpu
count: 1
# السماح لعدة pods بمشاركة هذا المطالبة
allocationMode: WaitForFirstConsumer
---
# عدة pods تتشارك GPU
apiVersion: v1
kind: Pod
metadata:
name: inference-1
spec:
containers:
- name: server
image: inference:latest
resources:
claims:
- name: shared-gpu
request: inference-gpu
resourceClaims:
- name: shared-gpu
resourceClaimName: shared-gpu # مرجع للمطالبة الموجودة
---
apiVersion: v1
kind: Pod
metadata:
name: inference-2
spec:
containers:
- name: server
image: inference:latest
resources:
claims:
- name: shared-gpu
request: inference-gpu
resourceClaims:
- name: shared-gpu
resourceClaimName: shared-gpu # نفس المطالبة
المقارنة: KAI مقابل DRA مقابل Kueue
| الميزة | KAI Scheduler | DRA | Kueue |
|---|---|---|---|
| طوبولوجيا GPU | أصلي | عبر selectors | لا |
| إدارة الطوابير | مدمج | لا | أصلي |
| تخصيص دقيق | نعم | نعم | لا |
| مشاركة متعددة الـ pods | عبر السياسات | أصلي | لا |
| جدولة المجموعات | نعم | لا | نعم |
| أصلي في Kubernetes | امتداد | أصلي (1.34) | أصلي |
المكدس الموصى به لـ 2026
┌─────────────────────────────────────────────────────────────────┐
│ مكدس جدولة GPU الإنتاجي │
├─────────────────────────────────────────────────────────────────┤
│ │
│ الطبقة 1: إدارة الطوابير (Kueue) │
│ └── عدالة متعددة المستأجرين، حصص، استعارة │
│ │
│ الطبقة 2: جدولة GPU (KAI أو DRA) │
│ └── وضع واعي بالطوبولوجيا والذاكرة │
│ │
│ الطبقة 3: إدارة الموارد (GPU Operator) │
│ └── التعريفات، device plugin، المقاييس │
│ │
│ الطبقة 4: البنية التحتية (Kubernetes 1.34+) │
│ └── DRA GA، VolumeAttributesClass، OCI artifacts │
│ │
└─────────────────────────────────────────────────────────────────┘
الوحدة التالية: Kubeflow وخطوط ML لتنسيق سير عمل ML من البداية للنهاية. :::