أساسيات 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
قائمة فحص الحل:
- تحقق من أن NVIDIA device plugin يعمل
- تحقق من تطابق تسميات العقدة مع متطلبات pod
- تحقق من أن حصة الموارد تسمح بتخصيص GPU
- تحقق مما إذا كانت 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 وأنماط الجدولة المتقدمة. :::