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

Namespaces وحصص الموارد لفرق ML

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

تعدد المستأجرين أمر حاسم عندما تتشارك فرق ML متعددة مجموعات GPU. توفر Namespaces العزل، بينما تمنع حصص الموارد أي فريق من احتكار الموارد الغالية.

استراتيجية Namespace لـ ML

Namespaces قائمة على الفرق

# Namespace لفريق بحث ML
apiVersion: v1
kind: Namespace
metadata:
  name: ml-research
  labels:
    team: research
    cost-center: rd-001
    gpu-tier: high-priority
---
# Namespace لإنتاج ML
apiVersion: v1
kind: Namespace
metadata:
  name: ml-production
  labels:
    team: platform
    cost-center: prod-001
    gpu-tier: critical
---
# Namespace لتجارب ML
apiVersion: v1
kind: Namespace
metadata:
  name: ml-experiments
  labels:
    team: data-science
    cost-center: ds-001
    gpu-tier: best-effort

نموذج عزل Namespace

┌─────────────────────────────────────────────────────────────────┐
│                     مجموعة Kubernetes GPU                        │
├─────────────────────────────────────────────────────────────────┤
│  ml-production (حرج)                                             │
│  ├── inference-deployments (دائماً يعمل)                        │
│  ├── model-servers (توسع تلقائي)                                │
│  └── الحصة: 16 GPU مضمونة                                       │
├─────────────────────────────────────────────────────────────────┤
│  ml-research (أولوية عالية)                                      │
│  ├── training-jobs (دفعات)                                      │
│  ├── notebooks (تفاعلي)                                         │
│  └── الحصة: 32 GPU حد، 8 مضمونة                                 │
├─────────────────────────────────────────────────────────────────┤
│  ml-experiments (أفضل جهد)                                       │
│  ├── experiment-jobs (قابلة للإيقاف)                            │
│  ├── hyperparameter-tuning                                      │
│  └── الحصة: 8 GPU حد، 0 مضمونة                                  │
└─────────────────────────────────────────────────────────────────┘

حصص الموارد

تكوين حصة GPU

# حصة الموارد لـ namespace ml-research
apiVersion: v1
kind: ResourceQuota
metadata:
  name: ml-research-quota
  namespace: ml-research
spec:
  hard:
    # حدود GPU
    requests.nvidia.com/gpu: "8"
    limits.nvidia.com/gpu: "32"

    # حدود الحوسبة
    requests.cpu: "64"
    limits.cpu: "128"
    requests.memory: "256Gi"
    limits.memory: "512Gi"

    # حدود التخزين
    requests.storage: "2Ti"
    persistentvolumeclaims: "20"

    # عدد الكائنات
    pods: "50"
    services: "10"
    secrets: "50"
    configmaps: "50"

حصة namespace الإنتاج

apiVersion: v1
kind: ResourceQuota
metadata:
  name: ml-production-quota
  namespace: ml-production
spec:
  hard:
    # تخصيص GPU مضمون
    requests.nvidia.com/gpu: "16"
    limits.nvidia.com/gpu: "16"

    # حوسبة أعلى للاستدلال
    requests.cpu: "128"
    limits.cpu: "256"
    requests.memory: "512Gi"
    limits.memory: "1Ti"

    # pods غير محدودة للتوسع
    pods: "200"
    services: "50"
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values:
      - critical
      - high

LimitRanges للموارد الافتراضية

طلبات GPU الافتراضية

apiVersion: v1
kind: LimitRange
metadata:
  name: ml-limit-range
  namespace: ml-research
spec:
  limits:
  # حدود الحاوية الافتراضية
  - type: Container
    default:
      cpu: "2"
      memory: "8Gi"
    defaultRequest:
      cpu: "1"
      memory: "4Gi"
    max:
      cpu: "32"
      memory: "128Gi"
      nvidia.com/gpu: "8"
    min:
      cpu: "100m"
      memory: "128Mi"

  # حدود حجم PVC
  - type: PersistentVolumeClaim
    max:
      storage: "500Gi"
    min:
      storage: "1Gi"

فئات الأولوية لأعباء عمل ML

تسلسل فئات الأولوية

# حرج: استدلال الإنتاج (لا يُقاطع أبداً)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: ml-critical
value: 1000000
globalDefault: false
preemptionPolicy: PreemptLowerPriority
description: "استدلال ML الإنتاجي - لا يُقاطع أبداً"
---
# عالي: تدريب البحث (يمكن مقاطعة التجارب)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: ml-high
value: 100000
globalDefault: false
preemptionPolicy: PreemptLowerPriority
description: "مهام تدريب البحث"
---
# منخفض: التجارب (قابلة للمقاطعة)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: ml-low
value: 1000
globalDefault: false
preemptionPolicy: Never
description: "أعباء العمل التجريبية - يمكن مقاطعتها"

استخدام الأولوية في مهام التدريب

apiVersion: batch/v1
kind: Job
metadata:
  name: research-training
  namespace: ml-research
spec:
  template:
    spec:
      priorityClassName: ml-high  # يمكن مقاطعة التجارب
      containers:
      - name: trainer
        image: pytorch/pytorch:latest
        resources:
          limits:
            nvidia.com/gpu: 4

التحقق من استخدام الحصة

# عرض استخدام الحصة
kubectl describe resourcequota ml-research-quota -n ml-research

# الإخراج:
# Name:                    ml-research-quota
# Namespace:               ml-research
# Resource                 Used    Hard
# --------                 ----    ----
# limits.nvidia.com/gpu    12      32
# requests.nvidia.com/gpu  8       8
# pods                     15      50
# requests.memory          128Gi   256Gi

# عرض جميع الحصص في المجموعة
kubectl get resourcequota --all-namespaces

# التحقق مما إذا كان pod سيناسب الحصة
kubectl run test --image=nginx --dry-run=client \
  --requests='nvidia.com/gpu=4' -n ml-research

التالي، سنغطي أساسيات kubectl وتقنيات تصحيح الأخطاء لأعباء عمل ML. :::

اختبار

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

خذ الاختبار