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

اختبار

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

خذ الاختبار