البنية التحتية والنشر

Kubernetes لأحمال عمل ML

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

خبرة Kubernetes تفصل مهندسي MLOps عن DevOps العام. توقع أسئلة عميقة حول أنماط K8s الخاصة بـ ML.

سؤال المقابلة الأساسي: نشر ML

السؤال: "صمم نشر Kubernetes لنموذج يخدم 10,000 طلب في الثانية."

إطار الإجابة:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: model-serving
spec:
  replicas: 10  # ابدأ بالتوسع الأفقي
  selector:
    matchLabels:
      app: model-serving
  template:
    metadata:
      labels:
        app: model-serving
    spec:
      containers:
      - name: model-server
        image: model-serving:v1.2.3
        resources:
          requests:
            memory: "4Gi"
            cpu: "2"
            nvidia.com/gpu: "1"  # طلب GPU
          limits:
            memory: "8Gi"
            cpu: "4"
            nvidia.com/gpu: "1"
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30  # وقت تحميل النموذج
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
      tolerations:
      - key: "nvidia.com/gpu"
        operator: "Exists"
        effect: "NoSchedule"
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: model-serving
              topologyKey: "kubernetes.io/hostname"

المفاهيم الرئيسية التي يختبرها المحاورون

المفهوم لماذا يهم لـ ML السؤال الشائع
Requests مقابل Limits ذاكرة GPU لا يمكن تجاوزها "ماذا يحدث إذا لم تحدد limits؟"
Tolerations عقد GPU غالباً مُلوثة "كيف تجدول على عقد GPU؟"
Probes النماذج تستغرق وقتاً للتحميل "لماذا initialDelaySeconds مهم؟"
Anti-affinity التوزيع للتوفر "كيف تتعامل مع فشل العقد؟"

Horizontal Pod Autoscaler لـ ML

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: model-serving-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: model-serving
  minReplicas: 3
  maxReplicas: 50
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: inference_latency_p99
      target:
        type: AverageValue
        averageValue: "100m"  # هدف 100ms
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 30
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300  # تقليص محافظ
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60

متابعة المقابلة: "لماذا استقرار التقليص أطول من التوسع؟"

الإجابة: "تسخين النموذج مكلف. التقليص السريع جداً يسبب ارتفاعات في زمن الاستجابة عند عودة الحركة. نستخدم استقرار 5 دقائق لتجنب التذبذب."

تعمق في جدولة GPU

# تسميات العقد لأنواع GPU
kubectl label nodes gpu-node-1 gpu-type=a100
kubectl label nodes gpu-node-2 gpu-type=t4

# Pod مع اختيار GPU محدد
spec:
  nodeSelector:
    gpu-type: a100
  containers:
  - name: training
    resources:
      limits:
        nvidia.com/gpu: 4  # طلب 4 A100s

سؤال المقابلة: "كيف ستتعامل مع وظائف التدريب متعددة GPU؟"

الإجابة: "استخدم Kubernetes Jobs مع نسخ متعددة، كل منها يطلب 1+ GPU. للتدريب الموزع، استخدم Training Operator من Kubeflow الذي يدير موارد PyTorchJob أو TFJob مع شبكات pod-to-pod مناسبة."

نصيحة احترافية: اعرف الفرق بين nvidia.com/gpu وأنواع موارد GPU الأخرى (amd.com/gpu، intel.com/gpu) للمناقشات المستقلة عن السحابة.

في الدرس التالي، سنستكشف البنية التحتية لتقديم النماذج. :::

اختبار

الوحدة 2: البنية التحتية والنشر

خذ الاختبار