Настройка мониторинга производительности модели в продакшене
Мониторинг 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 — стандартизированный способ инструментирования для трассировки, метрик и логов. Особенно полезен в микросервисных архитектурах, где инференс — один из многих сервисов.
Логирование prediction-пар
Для отложенного вычисления метрик качества (когда 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 минут против нескольких часов без него.







