أساسيات Kubernetes لتعلم الآلة

بنية Kubernetes لمهندسي ML

4 دقيقة للقراءة

فهم بنية Kubernetes ضروري لتحسين أعباء عمل ML. يغطي هذا الدرس المكونات الأساسية من منظور متطلبات تعلم الآلة.

مكونات Control Plane

نظرة عامة على البنية

┌─────────────────────────────────────────────────────────────────┐
│                        Control Plane                             │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────────────────┐│
│  │ kube-apiserver│  │    etcd      │  │ kube-controller-manager││
│  │              │  │  (الحالة)    │  │                        ││
│  └──────────────┘  └──────────────┘  └────────────────────────┘│
│  ┌──────────────┐  ┌──────────────────────────────────────────┐│
│  │kube-scheduler │  │ cloud-controller-manager (سحابة فقط)    ││
│  │  + DRA       │  │                                          ││
│  └──────────────┘  └──────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────────┤
│                        عقد العمال                                │
│  ┌────────────────────────────────────────────────────────────┐│
│  │ عقدة 1 (GPU)           │ عقدة 2 (GPU)       │ عقدة 3 (CPU) ││
│  │ ┌────────┐ ┌────────┐ │ ┌────────┐          │ ┌────────┐  ││
│  │ │kubelet │ │kube-   │ │ │التدريب │          │ │الاستدلال│  ││
│  │ │        │ │proxy   │ │ │ Pod    │          │ │ Pod     │  ││
│  │ └────────┘ └────────┘ │ └────────┘          │ └────────┘  ││
│  │ ┌────────────────────┐│                     │              ││
│  │ │ NVIDIA Device      ││                     │              ││
│  │ │ Plugin             ││                     │              ││
│  │ └────────────────────┘│                     │              ││
│  └────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘

المجدول: عقل أعباء عمل ML

kube-scheduler يضع pods على العقد. لأعباء عمل ML، هذا يشمل:

الجدولة القياسية:

# Pod يطلب موارد GPU
apiVersion: v1
kind: Pod
metadata:
  name: training-pod
spec:
  containers:
  - name: trainer
    image: pytorch/pytorch:2.1-cuda12.1
    resources:
      limits:
        nvidia.com/gpu: 4  # طلب 4 GPUs
        memory: "64Gi"
        cpu: "16"
      requests:
        nvidia.com/gpu: 4
        memory: "32Gi"
        cpu: "8"

جدولة متقدمة مع Node Affinity:

# جدولة على أنواع GPU محددة
apiVersion: v1
kind: Pod
metadata:
  name: llm-training
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: nvidia.com/gpu.product
            operator: In
            values:
            - NVIDIA-A100-SXM4-80GB
            - NVIDIA-H100-SXM5-80GB
  containers:
  - name: trainer
    image: my-llm-trainer:latest
    resources:
      limits:
        nvidia.com/gpu: 8

مكونات عقدة العمال

بنية العقدة لـ ML

┌─────────────────────────────────────────────────────────────┐
│                    عقدة عامل GPU                             │
├─────────────────────────────────────────────────────────────┤
│  kubelet          │ يدير pods، يبلغ عن حالة العقدة         │
│  kube-proxy       │ قواعد الشبكة لحركة الخدمة             │
│  Container Runtime│ containerd (موصى به لـ ML)            │
├─────────────────────────────────────────────────────────────┤
│                  إضافات الجهاز                              │
│  ┌─────────────────────────────────────────────────────────┐│
│  │ NVIDIA Device Plugin                                    ││
│  │ - يعلن عن GPUs كموارد قابلة للجدولة                     ││
│  │ - يدير مورد nvidia.com/gpu                              ││
│  │ - يتعامل مع عزل الجهاز                                 ││
│  └─────────────────────────────────────────────────────────┘│
│  ┌─────────────────────────────────────────────────────────┐│
│  │ NVIDIA GPU Operator (معيار 2025)                        ││
│  │ - يثبت التعريفات، مجموعة الأدوات، device plugin        ││
│  │ - DCGM Exporter للمقاييس                                ││
│  │ - اكتشاف ميزات GPU                                     ││
│  └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

تسميات العقد لجدولة ML

# تسميات عقد GPU الشائعة
kubectl label nodes gpu-node-1 \
  nvidia.com/gpu.product=NVIDIA-A100-SXM4-80GB \
  nvidia.com/gpu.memory=81920 \
  node-type=training \
  accelerator=nvidia-gpu

# عرض موارد العقدة
kubectl describe node gpu-node-1 | grep -A5 "Allocatable"
# Allocatable:
#   cpu:                64
#   memory:             512Gi
#   nvidia.com/gpu:     8
#   ephemeral-storage:  1Ti

كائنات Kubernetes لـ ML

موارد عبء العمل الأساسية

المورد حالة استخدام ML متى تستخدم
Pod عبء عمل حاوية واحدة اختبار مباشر، استدلال بسيط
Deployment خوادم استدلال عديمة الحالة خدمة النموذج، نقاط API
StatefulSet تدريب موزع خوادم المعاملات، نماذج مجزأة
Job تشغيلات التدريب تدريب لمرة واحدة، تجارب
CronJob إعادة تدريب مجدولة تحديثات النموذج اليومية
DaemonSet خدمات مستوى العقدة مراقبة GPU، جمع السجلات

مثال مهمة التدريب

apiVersion: batch/v1
kind: Job
metadata:
  name: pytorch-training
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 3
  ttlSecondsAfterFinished: 86400  # تنظيف بعد 24 ساعة
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - name: pytorch
        image: pytorch/pytorch:2.1-cuda12.1
        command: ["python", "train.py"]
        args:
        - "--epochs=100"
        - "--batch-size=64"
        resources:
          limits:
            nvidia.com/gpu: 2
            memory: "32Gi"
          requests:
            nvidia.com/gpu: 2
            memory: "16Gi"
        volumeMounts:
        - name: data
          mountPath: /data
        - name: checkpoints
          mountPath: /checkpoints
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: training-data
      - name: checkpoints
        persistentVolumeClaim:
          claimName: model-checkpoints

مثال نشر الاستدلال

apiVersion: apps/v1
kind: Deployment
metadata:
  name: model-inference
spec:
  replicas: 3
  selector:
    matchLabels:
      app: inference
  template:
    metadata:
      labels:
        app: inference
    spec:
      containers:
      - name: model-server
        image: my-model:v1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            nvidia.com/gpu: 1
            memory: "8Gi"
          requests:
            nvidia.com/gpu: 1
            memory: "4Gi"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: inference-service
spec:
  selector:
    app: inference
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

التخزين لأعباء عمل ML

فئات التخزين لـ ML

# SSD عالي الأداء لبيانات التدريب
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-ssd
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# PVC لبيانات التدريب
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: training-data
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: fast-ssd
  resources:
    requests:
      storage: 500Gi

تخزين مشترك للتدريب الموزع

# NFS للوصول متعدد الـ pods (التدريب الموزع)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-checkpoints
spec:
  accessModes:
  - ReadWriteMany  # عدة pods يمكنها الكتابة
  storageClassName: nfs-client
  resources:
    requests:
      storage: 100Gi

التالي، سنستكشف namespaces وحصص الموارد وأنماط تعدد المستأجرين لفرق ML. :::

اختبار

الوحدة 1: أساسيات Kubernetes لتعلم الآلة

خذ الاختبار