Налаштування моніторингу продуктивності ML-моделі в production
Моніторинг ML-моделі в production — це не тільки відстеження метрик якості (AUC, F1, RMSE), але й інфраструктурні метрики (latency, throughput, GPU utilization), бізнес-метрики та операційні індикатори. Без комплексного моніторингу неможливо швидко реагувати на деградацію.
Рівні моніторингу
Рівень 1 — Інфраструктура:
- Latency: p50, p95, p99 інференс-запитів
- Throughput: запитів в секунду
- Error rate: 5xx помилки, таймаути
- Resource utilization: CPU/GPU/RAM, memory bandwidth
- Queue depth: при використанні батч-інференсу
Рівень 2 — Дані та модель:
- Feature statistics: mean, std, min, max, null rate для кожної вхідної ознаки
- Prediction distribution: гістограма передбачень
- Confidence distribution: для класифікаторів
- Data drift: KS-тест, PSI (див. деталі моніторингу дрейфу)
Рівень 3 — Бізнес-метрики:
- Proxy-метрики: CTR, конверсія, engagement — без очікування ground truth
- Downstream business KPIs: revenue impact, churn rate
- A/B метрики при паралельному тестуванні версій
Стек моніторингу
Prometheus + Grafana — стандарт для інфраструктурних метрик. ML-специфічні метрики експортуються через prometheus_client:
from prometheus_client import Histogram, Counter, Gauge
REQUEST_LATENCY = Histogram(
'ml_inference_latency_seconds',
'Inference request latency',
buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5]
)
PREDICTION_DISTRIBUTION = Histogram(
'ml_prediction_score',
'Distribution of model prediction scores',
buckets=[0.1 * i for i in range(11)]
)
@REQUEST_LATENCY.time()
def predict(features):
score = model.predict_proba(features)[0][1]
PREDICTION_DISTRIBUTION.observe(score)
return score
Evidently + Grafana — для моніторингу дрейфу з візуалізацією. Evidently генерує метрики у форматі, сумісному з Prometheus.
OpenTelemetry — стандартизований спосіб інструментування для трасування, метрик та логів. Особливо корисний у мікросервісних архітектурах, де інференс — один із багатьох сервісів.
Логування пар передбачень
Для відстроченого обчислення метрик якості (коли ground truth з'являється пізніше) необхідно логувати пари (запит, передбачення) з унікальним ID:
import uuid
def predict_and_log(request_features):
prediction_id = str(uuid.uuid4())
prediction = model.predict(request_features)
# Логування у ClickHouse/BigQuery/Kafka
prediction_store.log({
'prediction_id': prediction_id,
'timestamp': datetime.utcnow(),
'features': request_features.to_dict(),
'prediction': float(prediction),
'model_version': MODEL_VERSION
})
return prediction, prediction_id
Коли ground truth стає відомим (наприклад, користувач здійснив або не здійснив покупку), він записується з тим же prediction_id, і система обчислює фактичні метрики якості.
Панелі управління
Рекомендована структура Grafana-панелей:
- Operational Overview — latency, throughput, error rate в реальному часі
- Model Health — prediction distribution, feature statistics, drift metrics
- Business Impact — proxy-метрики та downstream KPIs
- Model Comparison — порівняння поточної та попередньої версії при canary deployment
Алертинг
Рівні сигналів та канали:
- Warning (Slack): drift PSI > 0.15, latency p99 > 500мс
- Critical (PagerDuty): error rate > 1%, latency p99 > 2с, prediction rate близько нуля або 100%
- Fatal (page on-call): інференс-сервіс недоступний
Середній час від виявлення проблеми до початку розслідування при налаштованому моніторингу: 5-10 хвилин проти кількох годин без нього.







