Как организовать мониторинг модели в продакшене
Что проверяют
Понимаете ли вы, что модель ломается тихо: сервис отвечает 200, а предсказания уже бесполезны. Интервьюер ждёт нескольких уровней мониторинга и ответа на главный вопрос: что делать, пока истинные метки ещё не пришли. Следом спрашивают, как отличить дрейф данных от дрейфа концепции.
Как отвечать
Разложите мониторинг по слоям:
- сервис: задержка по перцентилям (p95, p99), доля ошибок, пропускная способность, память и GPU. Prometheus и Grafana, алерты как у любого другого сервиса;
- качество данных: схема, доля пропусков, диапазоны, категории, которых не было при обучении. Часто модель «ломает» источник данных: поменялась единица измерения или колонка стала пустой;
- дрейф данных: распределение признаков в проде против обучающей выборки или прошлого окна. PSI (условные пороги 0,1 и 0,25), KS-тест, расстояние Вассерштейна. Отдельно смотрите дрейф предсказаний: сдвиг распределения скоров заметен раньше всего;
- качество модели: ROC-AUC, precision и recall, MAE по мере поступления меток. Если метки приходят с задержкой (дефолт по кредиту виден через месяцы), используют прокси-метрики и оценку качества без меток, как в NannyML;
- бизнес-метрики: конверсия, доля одобрений, потери. Именно они в итоге решают, работает ли модель.
Основа всего: каждое предсказание логируется с версией модели, входными признаками и ID запроса, чтобы потом склеить его с меткой. Для отчётов по дрейфу подходят Evidently или NannyML, для версий моделей MLflow.
Новую версию выкатывайте через shadow или канареечный запуск. Переобучение по расписанию или по алерту допустимо, но выкатка только после валидации на отложенной выборке, а не автоматически.
Где спотыкаются
Называют сдвиг распределения признаков концептуальным дрейфом. Data drift это изменение P(X), concept drift это изменение зависимости P(y|X), и второе по одним признакам не видно.
Алертят на каждый статистически значимый сдвиг. На больших выборках тесты значимы почти всегда, без порога по величине эффекта будет сплошной шум.
Включают автоматическое переобучение с выкаткой без проверки и однажды выкатывают модель, обученную на сломанных данных.