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

kubectl وتصحيح الأخطاء لأعباء عمل ML

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

تصحيح أخطاء أعباء عمل ML يتطلب فهم جدولة GPU، وإيقاف OOM، وفشل التدريب الموزع. يغطي هذا الدرس أوامر kubectl الأساسية وتقنيات تصحيح الأخطاء.

أوامر kubectl الأساسية

فحص موارد GPU

# عرض جميع عقد GPU وسعتها
kubectl get nodes -l nvidia.com/gpu.present=true \
  -o custom-columns=NAME:.metadata.name,\
GPU_COUNT:.status.allocatable.nvidia\\.com/gpu,\
GPU_TYPE:.metadata.labels.nvidia\\.com/gpu\\.product

# التحقق من تخصيص GPU عبر المجموعة
kubectl describe nodes | grep -A5 "Allocated resources"

# عرض طلبات GPU حسب namespace
kubectl get pods --all-namespaces \
  -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.spec.containers[*].resources.limits.nvidia\.com/gpu}{"\n"}{end}' \
  | grep -v "^$"

فحص مهمة التدريب

# عرض جميع مهام التدريب
kubectl get jobs -n ml-research

# مراقبة تقدم المهمة
kubectl get jobs -w -n ml-research

# الحصول على تفاصيل المهمة مع الأحداث
kubectl describe job training-job-123 -n ml-research

# عرض حالة pod المهمة
kubectl get pods -l job-name=training-job-123 -n ml-research

تصحيح أخطاء Pod

# الحصول على سجلات pod (الحاوية الحالية)
kubectl logs training-pod-abc -n ml-research

# متابعة السجلات في الوقت الفعلي
kubectl logs -f training-pod-abc -n ml-research

# الحصول على سجلات من حاوية سابقة تعطلت
kubectl logs training-pod-abc -n ml-research --previous

# الحصول على سجلات من حاوية محددة في pod متعدد الحاويات
kubectl logs training-pod-abc -c trainer -n ml-research

# الحصول على سجلات مع الطوابع الزمنية
kubectl logs training-pod-abc -n ml-research --timestamps=true

تصحيح مشاكل ML الشائعة

GPU غير متاح

# التحقق مما إذا كان GPU device plugin يعمل
kubectl get pods -n kube-system -l name=nvidia-device-plugin-ds

# التحقق من سعة GPU للعقدة
kubectl describe node gpu-node-1 | grep -A10 "Capacity:"

# التحقق مما إذا كان pod معلق بسبب GPU
kubectl describe pod training-pod-abc -n ml-research | grep -A10 "Events:"

# الإخراج الشائع عندما تكون GPU غير متاحة:
# Warning  FailedScheduling  Insufficient nvidia.com/gpu

قائمة فحص الحل:

  1. تحقق من أن NVIDIA device plugin يعمل
  2. تحقق من تطابق تسميات العقدة مع متطلبات pod
  3. تحقق من أن حصة الموارد تسمح بتخصيص GPU
  4. تحقق مما إذا كانت pods أخرى تستهلك GPUs

إيقاف OOM (نفاد الذاكرة)

# التحقق من حالة OOMKilled
kubectl get pod training-pod-abc -n ml-research \
  -o jsonpath='{.status.containerStatuses[*].lastState.terminated.reason}'

# الحصول على معلومات إنهاء مفصلة
kubectl describe pod training-pod-abc -n ml-research | grep -A5 "Last State:"

# التحقق من استخدام الذاكرة قبل OOM
kubectl top pod training-pod-abc -n ml-research

تدفق تصحيح OOM:

Pod OOMKilled
      ├── تحقق من الذاكرة المطلوبة مقابل المستخدمة
      │   kubectl top pod <pod>
      ├── زيادة حدود الذاكرة
      │   resources.limits.memory: "64Gi"
      └── التحقق من تسربات الذاكرة
          - ذاكرة GPU غير محررة
          - تراكم عمال DataLoader
          - تراكم التدرج

فشل التدريب الموزع

# التحقق من جميع pods في التدريب الموزع
kubectl get pods -l training-job=distributed-123 -n ml-research

# التحقق من الاتصال بين pods
kubectl exec -it worker-0 -n ml-research -- ping worker-1

# التحقق من متغيرات بيئة NCCL
kubectl exec -it worker-0 -n ml-research -- env | grep NCCL

# عرض سجلات من master/worker-0
kubectl logs -f worker-0 -n ml-research

# التحقق مما إذا كان جميع العمال جاهزين
kubectl get pods -l training-job=distributed-123 \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

التصحيح التفاعلي

الدخول إلى Pods قيد التشغيل

# بدء shell في حاوية التدريب
kubectl exec -it training-pod-abc -n ml-research -- /bin/bash

# تشغيل nvidia-smi داخل pod
kubectl exec training-pod-abc -n ml-research -- nvidia-smi

# التحقق من استخدام ذاكرة GPU
kubectl exec training-pod-abc -n ml-research -- nvidia-smi --query-gpu=memory.used,memory.total --format=csv

# اختبار بيئة Python
kubectl exec training-pod-abc -n ml-research -- python -c "import torch; print(torch.cuda.is_available())"

Debug Pods للحاويات الفاشلة

# إنشاء debug pod على نفس العقدة مثل pod الفاشل
apiVersion: v1
kind: Pod
metadata:
  name: debug-pod
  namespace: ml-research
spec:
  nodeName: gpu-node-1  # نفس عقدة pod الفاشل
  containers:
  - name: debug
    image: pytorch/pytorch:2.1-cuda12.1
    command: ["sleep", "infinity"]
    resources:
      limits:
        nvidia.com/gpu: 1
    volumeMounts:
    - name: shared-data
      mountPath: /data
  volumes:
  - name: shared-data
    persistentVolumeClaim:
      claimName: training-data

إعادة توجيه المنفذ لخدمات ML

# إعادة توجيه TensorBoard
kubectl port-forward svc/tensorboard 6006:6006 -n ml-research

# إعادة توجيه MLflow UI
kubectl port-forward svc/mlflow 5000:5000 -n ml-research

# إعادة توجيه Jupyter notebook
kubectl port-forward pod/notebook-abc 8888:8888 -n ml-research

# إعادة توجيه نقطة استدلال النموذج للاختبار
kubectl port-forward svc/model-server 8080:80 -n ml-production

مراقبة الموارد

# مراقبة استخدام الموارد عبر namespace
watch -n 2 'kubectl top pods -n ml-research'

# الحصول على استخدام موارد العقدة المفصل
kubectl top nodes

# التحقق من طلبات موارد pod مقابل الاستخدام الفعلي
kubectl get pod training-pod-abc -n ml-research \
  -o jsonpath='{.spec.containers[*].resources}' | jq

# تصدير المقاييس إلى ملف
kubectl top pods -n ml-research --no-headers \
  | awk '{print $1","$2","$3}' > pod_metrics.csv

جدول مرجعي سريع

المشكلة الأمر ماذا تتحقق
GPU غير متاح kubectl describe pod قسم الأحداث
OOM killed kubectl top pod الذاكرة مقابل الحدود
التدريب متوقف kubectl logs -f آخر إخراج سجل
مشكلة شبكة kubectl exec -- ping اتصال Pod
التخزين ممتلئ kubectl exec -- df -h استخدام القرص
خطأ سحب الصورة kubectl describe pod حالة سحب الصورة

الوحدة التالية: جدولة GPU وإدارة الموارد مع أدوات NVIDIA وKueue وأنماط الجدولة المتقدمة. :::

اختبار

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

خذ الاختبار