شبكة الخدمات والشبكات لـ ML

المراقبة والتتبع الموزع

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

تتطلب أنظمة ML مراقبة شاملة: مقاييس لاستخدام GPU وأداء النموذج، وتتبع موزع عبر خطوط الاستدلال، وتسجيل لتصحيح الأخطاء. يغطي هذا الدرس مكدس المراقبة لأعباء عمل Kubernetes ML.

مكدس مراقبة ML

┌─────────────────────────────────────────────────────────────────────┐
│                    مكدس مراقبة ML                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                   طبقة التصور                                │    │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐                   │    │
│  │  │ Grafana  │  │  Jaeger  │  │  Kibana  │                   │    │
│  │  │(المقاييس)│  │(التتبع)  │  │(السجلات)│                   │    │
│  │  └──────────┘  └──────────┘  └──────────┘                   │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                              │                                       │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                   طبقة الجمع                                 │    │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │    │
│  │  │Prometheus│  │  OTLP    │  │Fluent Bit│  │  DCGM    │    │    │
│  │  │ Server   │  │Collector │  │  Agent   │  │ Exporter │    │    │
│  │  └──────────┘  └──────────┘  └──────────┘  └──────────┘    │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                              │                                       │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                   مصادر البيانات                             │    │
│  │  - خدمات الاستدلال (الزمن، الإنتاجية، الأخطاء)              │    │
│  │  - مقاييس GPU (الاستخدام، الذاكرة، الحرارة)                 │    │
│  │  - مقاييس النموذج (الدقة، الانحراف، إحصائيات الميزات)       │    │
│  │  - تتبع الخطوط (تدفق الطلب من البداية للنهاية)             │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘

Prometheus لمقاييس ML

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: inference-monitor
  namespace: ml-monitoring
spec:
  selector:
    matchLabels:
      app: inference-service
  namespaceSelector:
    matchNames:
    - ml-serving
  endpoints:
  - port: metrics
    interval: 15s
    path: /metrics
---
# PrometheusRule لتنبيهات ML
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: ml-alerts
  namespace: ml-monitoring
spec:
  groups:
  - name: inference
    rules:
    - alert: HighInferenceLatency
      expr: |
        histogram_quantile(0.99,
          rate(inference_latency_seconds_bucket[5m])
        ) > 2
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "زمن استدلال P99 مرتفع"
        description: "زمن P99 هو {{ $value }}s"

    - alert: GPUMemoryHigh
      expr: DCGM_FI_DEV_MEM_COPY_UTIL > 90
      for: 10m
      labels:
        severity: critical
      annotations:
        summary: "استخدام ذاكرة GPU حرج"

    - alert: ModelAccuracyDrop
      expr: |
        avg_over_time(model_accuracy[1h]) <
        avg_over_time(model_accuracy[24h] offset 1d) * 0.95
      for: 30m
      labels:
        severity: warning
      annotations:
        summary: "انخفضت دقة النموذج بأكثر من 5%"

OpenTelemetry للتتبع الموزع

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: ml-otel
  namespace: ml-monitoring
spec:
  mode: deployment
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318
      prometheus:
        config:
          scrape_configs:
          - job_name: 'inference-services'
            kubernetes_sd_configs:
            - role: pod
            relabel_configs:
            - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
              action: keep
              regex: true

    processors:
      batch:
        timeout: 10s
        send_batch_size: 1024
      memory_limiter:
        check_interval: 1s
        limit_mib: 2000
      attributes:
        actions:
        - key: ml.model.name
          from_attribute: model_name
          action: upsert
        - key: ml.model.version
          from_attribute: model_version
          action: upsert

    exporters:
      jaeger:
        endpoint: jaeger-collector:14250
        tls:
          insecure: true
      prometheus:
        endpoint: "0.0.0.0:8889"
      loki:
        endpoint: http://loki:3100/loki/api/v1/push

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch, memory_limiter, attributes]
          exporters: [jaeger]
        metrics:
          receivers: [otlp, prometheus]
          processors: [batch]
          exporters: [prometheus]

أداة خدمات الاستدلال

# أداة OpenTelemetry للاستدلال Python
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from prometheus_client import Histogram, Counter, Gauge

# تهيئة التتبع
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
otlp_exporter = OTLPSpanExporter(endpoint="otel-collector:4317")

# مقاييس Prometheus
INFERENCE_LATENCY = Histogram(
    'inference_latency_seconds',
    'زمن طلب الاستدلال',
    ['model_name', 'model_version'],
    buckets=[.001, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]
)
INFERENCE_REQUESTS = Counter(
    'inference_requests_total',
    'إجمالي طلبات الاستدلال',
    ['model_name', 'status']
)
GPU_MEMORY_USED = Gauge(
    'gpu_memory_used_bytes',
    'ذاكرة GPU المستخدمة حالياً',
    ['gpu_id']
)

@app.post("/v1/models/{model_name}:predict")
async def predict(model_name: str, request: PredictRequest):
    with tracer.start_as_current_span("inference") as span:
        span.set_attribute("model.name", model_name)
        span.set_attribute("batch.size", len(request.instances))

        start_time = time.time()
        try:
            result = model.predict(request.instances)
            INFERENCE_REQUESTS.labels(model_name=model_name, status="success").inc()
            span.set_attribute("inference.success", True)
        except Exception as e:
            INFERENCE_REQUESTS.labels(model_name=model_name, status="error").inc()
            span.record_exception(e)
            raise
        finally:
            latency = time.time() - start_time
            INFERENCE_LATENCY.labels(
                model_name=model_name,
                model_version=model.version
            ).observe(latency)

        return result

لوحات Grafana

# ConfigMap لوحة استدلال ML
apiVersion: v1
kind: ConfigMap
metadata:
  name: ml-inference-dashboard
  labels:
    grafana_dashboard: "1"
data:
  ml-inference.json: |
    {
      "title": "لوحة استدلال ML",
      "panels": [
        {
          "title": "معدل الطلبات",
          "targets": [{
            "expr": "sum(rate(inference_requests_total[5m])) by (model_name)"
          }]
        },
        {
          "title": "زمن P99",
          "targets": [{
            "expr": "histogram_quantile(0.99, sum(rate(inference_latency_seconds_bucket[5m])) by (le, model_name))"
          }]
        },
        {
          "title": "استخدام GPU",
          "targets": [{
            "expr": "DCGM_FI_DEV_GPU_UTIL"
          }]
        },
        {
          "title": "معدل الأخطاء",
          "targets": [{
            "expr": "sum(rate(inference_requests_total{status='error'}[5m])) / sum(rate(inference_requests_total[5m]))"
          }]
        }
      ]
    }

الدرس التالي: سياسات الشبكة والأمان لحركة مرور ML. :::

اختبار

الوحدة 5: شبكة الخدمات والشبكات لـ ML

خذ الاختبار