أساسيات 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. :::