جدولة GPU وإدارة الموارد
مشاركة GPU: MIG وTime-Slicing وMPS
4 دقيقة للقراءة
استخدام GPU في مجموعات Kubernetes غالباً يبلغ متوسطه 30-50%. استراتيجيات المشاركة مثل MIG وtime-slicing وMPS يمكن أن تحسن الكفاءة بشكل كبير دون التضحية بالعزل.
مقارنة استراتيجيات مشاركة GPU
| الاستراتيجية | العزل | حالة الاستخدام | دعم GPU |
|---|---|---|---|
| MIG | أجهزة | استدلال إنتاجي، موارد مضمونة | A100، H100 |
| Time-Slicing | برمجي | تطوير، أعباء متقطعة | جميع NVIDIA GPUs |
| MPS | عملية | استدلال عالي الإنتاجية | Pascal+ |
| vGPU | Hypervisor | VMs، متعدد المستأجرين | Enterprise |
Multi-Instance GPU (MIG)
بنية MIG
┌─────────────────────────────────────────────────────────────────┐
│ A100-80GB مع MIG │
├─────────────────────────────────────────────────────────────────┤
│ بدون MIG: عبء عمل واحد يحصل على كامل 80GB │
│ │
│ مع MIG (7 instances): │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ │ 1g.10gb │ 1g.10gb │ 1g.10gb │ 1g.10gb │ 1g.10gb │ 1g.10gb │ 1g.10gb │
│ │ Pod 1 │ Pod 2 │ Pod 3 │ Pod 4 │ Pod 5 │ Pod 6 │ Pod 7 │
│ └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
│ │
│ تكوينات بديلة: │
│ ┌─────────────────────┬─────────────────────┬─────────────────────┐
│ │ 2g.20gb │ 2g.20gb │ 3g.40gb │
│ │ Pod 1 │ Pod 2 │ Pod 3 │
│ └─────────────────────┴─────────────────────┴─────────────────────┘
└─────────────────────────────────────────────────────────────────┘
ملفات MIG
| الملف | الذاكرة | SMs | حالة الاستخدام |
|---|---|---|---|
| 1g.10gb | 10GB | 14 | استدلال صغير |
| 2g.20gb | 20GB | 28 | نماذج متوسطة |
| 3g.40gb | 40GB | 42 | استدلال كبير |
| 4g.40gb | 40GB | 56 | تدريب |
| 7g.80gb | 80GB | 98 | GPU كامل |
تكوين MIG في Kubernetes
# MIG configuration ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: mig-parted-config
namespace: gpu-operator
data:
config.yaml: |
version: v1
mig-configs:
# جميع GPUs كـ instances صغيرة (استدلال)
all-1g.10gb:
- devices: all
mig-enabled: true
mig-devices:
"1g.10gb": 7
# تكوين مختلط
mixed:
- devices: [0, 1]
mig-enabled: true
mig-devices:
"3g.40gb": 2
- devices: [2, 3]
mig-enabled: true
mig-devices:
"1g.10gb": 7
# تكوين التدريب
training-4g:
- devices: all
mig-enabled: true
mig-devices:
"4g.40gb": 1
"3g.40gb": 1
استخدام MIG Instances في Pods
apiVersion: v1
kind: Pod
metadata:
name: inference-small
spec:
containers:
- name: model-server
image: my-inference:latest
resources:
limits:
# طلب شريحة MIG محددة
nvidia.com/mig-1g.10gb: 1
---
apiVersion: v1
kind: Pod
metadata:
name: inference-medium
spec:
containers:
- name: model-server
image: my-inference:latest
resources:
limits:
nvidia.com/mig-3g.40gb: 1
Time-Slicing
تكوين Time-Slicing
# Time-slicing ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
namespace: gpu-operator
data:
any: |-
version: v1
flags:
migStrategy: none
sharing:
timeSlicing:
renameByDefault: false
failRequestsGreaterThanOne: false
resources:
- name: nvidia.com/gpu
replicas: 4 # 4 pods يمكنها مشاركة كل GPU
تطبيق Time-Slicing
# تطبيق التكوين
kubectl apply -f time-slicing-config.yaml
# وضع تسميات للعقد لـ time-slicing
kubectl label nodes gpu-node-1 \
nvidia.com/device-plugin.config=time-slicing
# تعديل GPU Operator لاستخدام التكوين
kubectl patch clusterpolicies.nvidia.com/cluster-policy \
-n gpu-operator \
--type merge \
-p '{"spec": {"devicePlugin": {"config": {"name": "time-slicing-config", "default": "any"}}}}'
مثال Time-Slicing Pod
# 4 pods تتشارك GPU واحد
apiVersion: apps/v1
kind: Deployment
metadata:
name: inference-deployment
spec:
replicas: 4
selector:
matchLabels:
app: inference
template:
metadata:
labels:
app: inference
spec:
containers:
- name: inference
image: my-inference:latest
resources:
limits:
nvidia.com/gpu: 1 # كل واحد يحصل على شريحة زمنية
اعتبارات time-slicing:
- لا عزل للذاكرة (OOM يؤثر على جميع pods)
- حمل تبديل السياق (~5-10%)
- الأفضل لأعباء العمل المتقطعة/التفاعلية
- غير موصى به للاستدلال الحساس للتأخير
Multi-Process Service (MPS)
بنية MPS
┌─────────────────────────────────────────────────────────────────┐
│ بنية MPS │
├─────────────────────────────────────────────────────────────────┤
│ بدون MPS: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ عملية │ │ عملية │ │ عملية │ (تبديل السياق) │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ GPU │ │
│ └───────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ مع MPS: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ عملية │ │ عملية │ │ عملية │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ خادم MPS │ (سياق واحد) │
│ └───────┬───────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ GPU │ │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────────────┘
تكوين MPS Daemon
# نشر MPS daemon كـ DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-mps
namespace: gpu-operator
spec:
selector:
matchLabels:
app: nvidia-mps
template:
metadata:
labels:
app: nvidia-mps
spec:
nodeSelector:
nvidia.com/gpu.present: "true"
containers:
- name: mps
image: nvidia/cuda:12.1-base-ubuntu22.04
command:
- /bin/bash
- -c
- |
nvidia-cuda-mps-control -d
sleep infinity
securityContext:
privileged: true
env:
- name: CUDA_MPS_PIPE_DIRECTORY
value: /tmp/nvidia-mps
- name: CUDA_MPS_LOG_DIRECTORY
value: /tmp/nvidia-mps-log
volumeMounts:
- name: mps-pipe
mountPath: /tmp/nvidia-mps
resources:
limits:
nvidia.com/gpu: 1
volumes:
- name: mps-pipe
hostPath:
path: /tmp/nvidia-mps
اختيار الاستراتيجية الصحيحة
┌─────────────────────────────────────────────────────────────────┐
│ شجرة القرار: استراتيجية مشاركة GPU │
├─────────────────────────────────────────────────────────────────┤
│ │
│ تحتاج عزل أجهزة؟ ──نعم──> MIG (A100/H100) │
│ │ │
│ لا │
│ │ │
│ استدلال عالي الإنتاجية؟ ──نعم──> MPS │
│ │ │
│ لا │
│ │ │
│ تطوير/أعباء متقطعة؟ ──نعم──> Time-Slicing │
│ │ │
│ لا │
│ │ │
│ GPU حصري كامل ─────────────────> لا مشاركة │
│ │
└─────────────────────────────────────────────────────────────────┘
| نوع عبء العمل | الاستراتيجية الموصى بها |
|---|---|
| استدلال إنتاجي | MIG |
| notebooks التطوير | Time-slicing |
| استدلال دفعي | MPS |
| تدريب نموذج كبير | حصري |
| ضبط Hyperparameter | Time-slicing |
التالي، سنستكشف Kueue وVolcano لإدارة قوائم GPU المتقدمة وجدولة المجموعات. :::