المراقبة والملاحظة

مراقبة البنية التحتية لـ ML

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

مراقبة البنية التحتية لـ ML تتجاوز DevOps القياسي. يتوقع المحاورون أن تراقب استخدام GPU والذاكرة ومقاييس ML المحددة.

مقاييس البنية التحتية لـ ML

الفئة المقاييس عتبة التنبيه
GPU الاستخدام، الذاكرة، الحرارة تحذير <30% استخدام
الاستدلال زمن الاستجابة p50/p99، الإنتاجية، الأخطاء p99 > SLA
خط الأنابيب معدل النجاح، المدة، حداثة البيانات نجاح <95%
النموذج توزيع التوقعات، الثقة تحول التوزيع

إعداد Prometheus + Grafana

سؤال المقابلة: "كيف ستعد المراقبة لمجموعة تقديم النماذج؟"

# prometheus.yml - تكوين الجمع
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'model-serving'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        regex: model-serving
        action: keep
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        target_label: __metrics_path__
        regex: (.+)

  - job_name: 'nvidia-gpu'
    static_configs:
      - targets: ['dcgm-exporter:9400']

مقاييس ML المخصصة:

from prometheus_client import Counter, Histogram, Gauge, start_http_server

# مقاييس الاستدلال
INFERENCE_LATENCY = Histogram(
    'model_inference_latency_seconds',
    'زمن استجابة استدلال النموذج',
    ['model_name', 'model_version'],
    buckets=[.01, .025, .05, .1, .25, .5, 1.0, 2.5]
)

INFERENCE_REQUESTS = Counter(
    'model_inference_requests_total',
    'إجمالي طلبات الاستدلال',
    ['model_name', 'model_version', 'status']
)

PREDICTION_CONFIDENCE = Histogram(
    'model_prediction_confidence',
    'درجات ثقة توقع النموذج',
    ['model_name'],
    buckets=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99]
)

# كشف نقطة نهاية المقاييس
def instrument_inference(func):
    def wrapper(model_name, model_version, features):
        with INFERENCE_LATENCY.labels(model_name, model_version).time():
            try:
                result = func(model_name, model_version, features)
                INFERENCE_REQUESTS.labels(model_name, model_version, 'success').inc()
                PREDICTION_CONFIDENCE.labels(model_name).observe(result['confidence'])
                return result
            except Exception as e:
                INFERENCE_REQUESTS.labels(model_name, model_version, 'error').inc()
                raise
    return wrapper

مراقبة GPU مع DCGM

# نشر DCGM Exporter
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dcgm-exporter
spec:
  selector:
    matchLabels:
      app: dcgm-exporter
  template:
    spec:
      containers:
      - name: dcgm-exporter
        image: nvidia/dcgm-exporter:3.1.7-3.1.4-ubuntu20.04
        ports:
        - containerPort: 9400
          name: metrics
        securityContext:
          privileged: true
        volumeMounts:
        - name: device-plugin
          mountPath: /var/lib/kubelet/device-plugins
      volumes:
      - name: device-plugin
        hostPath:
          path: /var/lib/kubelet/device-plugins

مقاييس GPU الرئيسية:

# مقاييس DCGM للمراقبة
critical_gpu_metrics:
  DCGM_FI_DEV_GPU_UTIL: "نسبة استخدام GPU"
  DCGM_FI_DEV_MEM_COPY_UTIL: "استخدام نسخ الذاكرة"
  DCGM_FI_DEV_FB_FREE: "ذاكرة framebuffer الحرة"
  DCGM_FI_DEV_FB_USED: "ذاكرة framebuffer المستخدمة"
  DCGM_FI_DEV_GPU_TEMP: "حرارة GPU"
  DCGM_FI_DEV_POWER_USAGE: "استخدام الطاقة"

قواعد التنبيه

# prometheus-rules.yml
groups:
  - name: ml-infrastructure
    rules:
      - alert: HighInferenceLatency
        expr: |
          histogram_quantile(0.99,
            rate(model_inference_latency_seconds_bucket[5m])
          ) > 0.5
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "زمن استجابة p99 عالي لـ {{ $labels.model_name }}"
          description: "زمن الاستجابة p99 هو {{ $value }}s، SLA هو 500ms"

      - alert: LowGPUUtilization
        expr: DCGM_FI_DEV_GPU_UTIL < 30
        for: 15m
        labels:
          severity: warning
        annotations:
          summary: "استخدام GPU منخفض على {{ $labels.gpu }}"
          description: "استخدام GPU هو {{ $value }}%. ضع في اعتبارك التوحيد."

      - alert: HighPredictionErrorRate
        expr: |
          rate(model_inference_requests_total{status="error"}[5m])
          / rate(model_inference_requests_total[5m]) > 0.01
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "معدل خطأ عالي لـ {{ $labels.model_name }}"

متابعة المقابلة: تصميم لوحة المعلومات

السؤال: "ماذا ستعرض لوحة معلومات مراقبة ML المثالية؟"

ml_dashboard_panels:
  row_1_overview:
    - "إجمالي الطلبات/ثانية (جميع النماذج)"
    - "معدل الخطأ الإجمالي"
    - "إصدارات النماذج النشطة"
    - "استخدام مجموعة GPU"

  row_2_latency:
    - "زمن الاستجابة p50/p95/p99 حسب النموذج"
    - "خريطة حرارية لزمن الاستجابة بمرور الوقت"
    - "نسبة امتثال SLA"

  row_3_model_health:
    - "توزيع ثقة التوقع"
    - "توزيع فئة التوقع"
    - "مؤشرات انحراف الميزات"

  row_4_infrastructure:
    - "ذاكرة GPU حسب العقدة"
    - "عدد إعادة تشغيل Pod"
    - "عمق قائمة الانتظار (إذا كان هناك تجميع)"

رؤية خبير: "نربط استخدام GPU المنخفض مع زمن الاستجابة العالي لاكتشاف أخطاء تكوين التجميع - إذا كانت GPUs خاملة لكن زمن الاستجابة عالٍ، فحجم الدفعة صغير جداً."

في الدرس التالي، سنغطي التسجيل وتصحيح أنظمة ML الإنتاجية. :::

اختبار

الوحدة 4: المراقبة والملاحظة

خذ الاختبار