شبكة الخدمات والشبكات لـ 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. :::