المراقبة والملاحظة
مراقبة البنية التحتية لـ 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 الإنتاجية. :::