جدولة 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+
vGPUHypervisorVMs، متعدد المستأجرين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.10gb10GB14استدلال صغير
2g.20gb20GB28نماذج متوسطة
3g.40gb40GB42استدلال كبير
4g.40gb40GB56تدريب
7g.80gb80GB98GPU كامل

تكوين 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
تدريب نموذج كبيرحصري
ضبط HyperparameterTime-slicing

التالي، سنستكشف Kueue وVolcano لإدارة قوائم GPU المتقدمة وجدولة المجموعات. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

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

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.