خدمة النماذج والاستدلال

التوسع التلقائي وإدارة حركة المرور

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

يتطلب استدلال ML الإنتاجي توسعاً تلقائياً ذكياً بناءً على مقاييس GPU وإدارة حركة مرور متطورة للنشر الآمن. يغطي هذا الدرس HPA وKEDA واستراتيجيات نشر canary.

بنية التوسع التلقائي

┌─────────────────────────────────────────────────────────────────────┐
│                    التوسع التلقائي لاستدلال ML                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌──────────────────┐    ┌──────────────────┐                       │
│  │   Prometheus     │───→│       KEDA       │                       │
│  │   مقاييس GPU    │    │   ScaledObject   │                       │
│  └──────────────────┘    └────────┬─────────┘                       │
│                                   │                                  │
│                                   ↓                                  │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                   متحكم HPA                                  │    │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │    │
│  │  │ مقاييس     │  │ استخدام    │  │ مقاييس     │          │    │
│  │  │ CPU/الذاكرة│  │ GPU        │  │ مخصصة      │          │    │
│  │  └─────────────┘  └─────────────┘  └─────────────┘          │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                   │                                  │
│                                   ↓                                  │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              نشر الاستدلال (1-N نسخ)                         │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘

HPA المعتمد على GPU مع DCGM

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: triton-gpu-hpa
  namespace: ml-serving
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: triton-inference
  minReplicas: 2
  maxReplicas: 20
  metrics:
  # استخدام GPU من مُصدّر DCGM
  - type: Pods
    pods:
      metric:
        name: DCGM_FI_DEV_GPU_UTIL
      target:
        type: AverageValue
        averageValue: "70"
  # استخدام ذاكرة GPU
  - type: Pods
    pods:
      metric:
        name: DCGM_FI_DEV_MEM_COPY_UTIL
      target:
        type: AverageValue
        averageValue: "80"
  # طلبات الاستدلال في الثانية
  - type: Pods
    pods:
      metric:
        name: nv_inference_request_success
      target:
        type: AverageValue
        averageValue: "100"
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 25
        periodSeconds: 120

KEDA للتوسع المتقدم

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: inference-scaler
  namespace: ml-serving
spec:
  scaleTargetRef:
    name: triton-inference
  minReplicaCount: 1
  maxReplicaCount: 50
  pollingInterval: 15
  cooldownPeriod: 300
  triggers:
  # مقاييس Prometheus GPU
  - type: prometheus
    metadata:
      serverAddress: http://prometheus:9090
      metricName: gpu_utilization
      threshold: "70"
      query: |
        avg(DCGM_FI_DEV_GPU_UTIL{pod=~"triton-.*"})
  # طول قائمة الطلبات
  - type: prometheus
    metadata:
      serverAddress: http://prometheus:9090
      metricName: inference_queue_size
      threshold: "100"
      query: |
        sum(nv_inference_pending_request_count{pod=~"triton-.*"})
  # تأخر موضوع Kafka (للاستدلال غير المتزامن)
  - type: kafka
    metadata:
      bootstrapServers: kafka:9092
      consumerGroup: inference-consumer
      topic: inference-requests
      lagThreshold: "1000"

التوسع التلقائي لـ KServe

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: llm-service
  annotations:
    # استخدام HPA بدلاً من KPA
    serving.kserve.io/autoscalerClass: hpa
    # التوسع على استخدام GPU
    serving.kserve.io/metric: gpu
    serving.kserve.io/targetUtilizationPercentage: "70"
spec:
  predictor:
    minReplicas: 1
    maxReplicas: 10
    scaleTarget: 70
    scaleMetric: gpu
    model:
      modelFormat:
        name: pytorch
      storageUri: "s3://models/llm"
      resources:
        requests:
          nvidia.com/gpu: 1

نشر Canary

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: model-v2-canary
spec:
  predictor:
    # النسخة المستقرة: 90% حركة مرور
    canaryTrafficPercent: 10
    model:
      modelFormat:
        name: pytorch
      storageUri: "s3://models/v2"
---
# Argo Rollouts لـ canary متقدم
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: inference-rollout
spec:
  replicas: 10
  selector:
    matchLabels:
      app: inference
  template:
    spec:
      containers:
      - name: inference
        image: inference:v2
        resources:
          limits:
            nvidia.com/gpu: 1
  strategy:
    canary:
      steps:
      - setWeight: 5
      - pause: {duration: 10m}
      - analysis:
          templates:
          - templateName: success-rate
      - setWeight: 25
      - pause: {duration: 10m}
      - analysis:
          templates:
          - templateName: latency-check
      - setWeight: 50
      - pause: {duration: 15m}
      - setWeight: 100
      canaryService: inference-canary
      stableService: inference-stable
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  metrics:
  - name: success-rate
    interval: 1m
    successCondition: result[0] >= 0.99
    provider:
      prometheus:
        address: http://prometheus:9090
        query: |
          sum(rate(inference_success_total{app="inference"}[5m])) /
          sum(rate(inference_requests_total{app="inference"}[5m]))

تقسيم حركة المرور مع Istio

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: inference-routing
spec:
  hosts:
  - inference.ml.svc.cluster.local
  http:
  - match:
    - headers:
        x-model-version:
          exact: "v2"
    route:
    - destination:
        host: inference-v2
        port:
          number: 8000
  - route:
    - destination:
        host: inference-v1
        port:
          number: 8000
      weight: 90
    - destination:
        host: inference-v2
        port:
          number: 8000
      weight: 10
---
# اختبار A/B بناءً على شرائح المستخدمين
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ab-testing
spec:
  hosts:
  - inference.ml.svc.cluster.local
  http:
  - match:
    - headers:
        x-user-segment:
          exact: "premium"
    route:
    - destination:
        host: inference-premium
  - route:
    - destination:
        host: inference-standard

التصغير إلى صفر مع Knative

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: batch-model
  annotations:
    # تمكين التصغير إلى صفر
    serving.kserve.io/enable-scale-to-zero: "true"
    # الحد الأدنى للتوسع
    autoscaling.knative.dev/min-scale: "0"
    # تأخير التصغير
    autoscaling.knative.dev/scale-down-delay: "5m"
    # التزامن المستهدف لكل pod
    autoscaling.knative.dev/target: "10"
spec:
  predictor:
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://models/batch"

الدرس التالي: خدمة LLM مع vLLM وTGI لاستدلال نماذج اللغة الكبيرة. :::

اختبار

الوحدة 4: خدمة النماذج والاستدلال

خذ الاختبار