Serving & Production
~30 мин

Мониторинг и Observability

Data drift, model drift, Prometheus/Grafana, алерты, Evidently.

Мониторинг ML — ловим деградацию до того, как бизнес позвонит

Загрузка интерактивного виджета...

Модель задеплоили, метрики отличные. Через 3 месяца конверсия просела на 15%. Начали разбираться — оказалось, модель деградировала из-за изменения данных (drift), но никто не заметил. Мониторинг ML — это не только Prometheus с Grafana для latency и errors. Это ещё data drift, prediction drift, model staleness — вещи, которых в классическом DevOps просто нет.

Что мониторить — четыре уровня

  • Infrastructure — CPU/GPU, memory, latency p50/p95/p99, error rate, throughput. Стандартный мониторинг сервиса
  • Data — распределение фичей сдвинулось? Новые NULL-ы? Схема изменилась? Объём данных в норме?
  • Model — распределение предсказаний изменилось? Confidence упал? Модель давно не переобучалась?
  • Business — CTR, конверсия, revenue, retention — метрики, ради которых всё затевалось

Data Drift и Concept Drift

Data drift — распределение входных фичей P(X) изменилось по сравнению с обучающей выборкой. Модель обучена на данных до пандемии, а в 2020 поведение радикально изменилось. Детектируется метриками PSI (Population Stability Index: < 0.1 — ок, 0.1-0.25 — стоит посмотреть, > 0.25 — сильный drift) и KS-тестом (Kolmogorov-Smirnov). Concept drift — ещё хуже: данные могут выглядеть так же, но связь P(Y|X) изменилась. Раньше «клики» коррелировали с покупкой, после редизайна — нет.

  • Gradual drift — медленные изменения: сезонность, инфляция. Детектируется скользящими метриками
  • Sudden drift — резкий скачок: пандемия, редизайн. Детектируется алертами на резкое падение
  • Recurring drift — циклические изменения: праздники, выходные. Можно учесть при обучении

Evidently — мониторинг ML из коробки

Evidently — Python-библиотека для отчётов о drift и качестве модели. Даёшь ей train-данные (эталон) и prod-данные (текущие) — она сравнивает распределения и генерирует HTML-отчёт. TestSuite даёт автоматическую проверку True/False — если drift обнаружен, отправляешь алерт в Slack.

from evidently.report import Report
from evidently.metric_preset import DataDriftPreset, TargetDriftPreset
from evidently.test_suite import TestSuite
from evidently.test_preset import DataDriftTestPreset

# HTML-отчёт с графиками распределений
report = Report(metrics=[DataDriftPreset(), TargetDriftPreset()])
report.run(reference_data=train_df, current_data=prod_df)
report.save_html("drift_report.html")

# Автоматическая проверка — True/False
tests = TestSuite(tests=[DataDriftTestPreset()])
tests.run(reference_data=train_df, current_data=prod_df)
if not tests.as_dict()["summary"]["all_passed"]:
    send_alert("🚨 Data drift detected!")

Prometheus + Grafana — мониторинг сервиса

Prometheus собирает метрики, Grafana визуализирует. Для ML-сервиса добавляем специфичные метрики поверх стандартных (latency, errors): распределение confidence (Histogram с бакетами 0.1-1.0), количество предсказаний по версиям модели (Counter с лейблами). Алерты настраиваются в Prometheus: p99 latency > 500ms, error rate > 5%, median confidence < 0.3 — всё это сигналы о проблемах.

from prometheus_client import Counter, Histogram

PREDICTIONS = Counter(
    'model_predictions_total', 'Total predictions',
    ['model_version', 'result']
)
LATENCY = Histogram(
    'model_prediction_seconds', 'Prediction latency',
    buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1.0]
)
CONFIDENCE = Histogram(
    'model_confidence', 'Confidence distribution',
    buckets=[0.1, 0.2, 0.3, 0.5, 0.7, 0.9, 1.0]
)

@app.post("/predict")
async def predict(request: PredictRequest):
    with LATENCY.time():
        result = model.predict_proba(request.features)
    PREDICTIONS.labels(model_version="v2.3", result="success").inc()
    CONFIDENCE.observe(float(max(result[0])))

💡 Как это в реальной работе

Prometheus собирает метрики сервиса (latency, error rate), Grafana рисует дашборды. Раз в день Evidently проверяет drift по топ-фичам. Если PSI > 0.25 или p99 latency > 500ms — алерт в Slack. Раз в квартал (или при drift) — переобучаем модель. Бизнес-метрики (конверсия, CTR) мониторим отдельно в BI-инструментах.

💡 Чек-лист: что мониторить

1) Latency p50/p95/p99. 2) Error rate < 1%. 3) Распределение предсказаний — не сдвинулось ли. 4) Data drift по топ-фичам (PSI/KS). 5) Когда последний раз переобучали модель. 6) Бизнес-метрики: CTR и конверсия не упали. 7) Свежесть данных в пайплайне.

🎯 На собесе

Data drift vs concept drift? Data drift — изменилось распределение фичей P(X). Concept drift — изменилась связь фичей и таргета P(Y|X). Как детектировать? PSI и KS-test для фичей, мониторинг accuracy на свежей разметке, прокси-метрики (распределение confidence, бизнес-KPI).