Feature store, model registry и «все эти MLOps штуки» — зачем, если вы не Google

Михаил Евдокимов, CEO, Head of Data Science, Insight AI

Feature store, model registry и «все эти MLOps штуки» — зачем, если вы не Google

«У нас же не Google»

Типичная сцена. DS-лид приходит к руководству и говорит: нам нужен model registry, нормальный пайплайн переобучения, мониторинг моделей, в идеале — feature store. Руководство слушает, кивает и отвечает примерно так: «У нас три модели в проде и пять человек в DS-команде. Это всё для Google и Netflix. Давайте лучше ещё одну модель сделаем — бизнес ждёт».

Логика понятная. Feature store, CI/CD для моделей, registry — звучит как тяжёлая инфраструктура, которая оправдывает себя при сотнях моделей и тысячах инженеров. Зачем это маленькой команде?

Ответ приходит примерно через год. Одна из трёх моделей тихо деградировала: данные сместились, а мониторинга нет — никто не заметил. Вторую нужно переобучить, но пайплайн обучения жил на ноутбуке аналитика, который ушёл в другую компанию два месяца назад. Третью обновили, но теперь никто точно не скажет, какая версия сейчас в проде, на каких данных она обучена и почему вчера она начала выдавать странные результаты.

MLOps нужен не для масштаба. Он нужен, чтобы не потерять контроль над тем, что уже работает. И «минимальный MLOps» — это не инфраструктура Google, а несколько конкретных практик, которые можно внедрить за недели, а не за кварталы.

Почему модели без инфраструктуры — отложенная проблема

Модель в проде — это не статичный артефакт. Это живой компонент, который зависит от данных, окружения, бизнес-контекста и людей. Когда вокруг модели нет инфраструктуры, деградация — вопрос не «если», а «когда».

Сценарии, которые я наблюдал десятки раз, укладываются в три категории.

Тихая деградация. Данные постепенно смещаются: меняется сезон, ассортимент, поведение пользователей. Модель формально работает, но качество падает неделю за неделей. Бизнес замечает проблему через месяцы — когда KPI уже просели и доверие к «этому вашему ML» подорвано.

Внезапный сбой. Один из источников данных перестал отвечать, поменял формат или начал отдавать пустые значения. Модель получает мусор на вход и выдаёт мусор на выход. Если нет проверки входных данных — это обнаруживается, когда клиенты начинают жаловаться или когда закупки принимают решения на основе бессмысленных прогнозов.

Организационная потеря. Человек, который строил модель, ушёл. Или перешёл на другой проект. Вместе с ним ушли знания: какие данные использовались, почему выбраны эти фичи, как именно запускать переобучение, какие есть известные ограничения. Модель превращается в чёрный ящик, к которому никто не решается прикасаться.

Общий знаменатель у всех трёх сценариев — отсутствие воспроизводимости и контроля. Не потому что команда плохая, а потому что инфраструктура для этого не была заложена.

«Инфраструктура Google» vs «инфраструктура выживания»

Когда люди слышат «MLOps», в голове рисуется картинка: Kubeflow, Vertex AI, managed feature store за десятки тысяч долларов в месяц, dedicated ML platform team из десяти инженеров, Kubernetes-кластер с auto-scaling. Для большинства компаний это звучит как параллельная реальность — и справедливо.

Но MLOps — это не набор конкретных инструментов. Это набор принципов: воспроизводимость, контроль версий моделей и данных, мониторинг, автоматизация рутинных операций. И реализовать их можно на любом стеке — от managed-платформы до git-репозитория и пары bash-скриптов.

Полезно разделить всё на два уровня. Первый — то, что нужно всем, даже если у вас одна модель в проде. Это минимум, без которого вы теряете контроль: model registry, воспроизводимость обучения, базовый мониторинг. Второй — то, что становится нужным при росте: feature store, полноценный CI/CD, автоматическое переобучение, A/B-инфраструктура. Первый уровень — недели работы. Второй — месяцы, и к нему стоит переходить, когда первый уровень уже работает.

Model registry — «паспорт модели» за полчаса

Самый простой, самый дешёвый и самый недооценённый компонент MLOps. По сути это ответ на вопрос: «какая модель сейчас в проде и что мы про неё знаем?»

Минимальный набор информации для каждой модели: версия и дата обучения, данные, на которых она обучена (или указатель на них), метрики на валидации, владелец (кто отвечает за модель в проде), известные ограничения (где модель работает хуже, на каких сегментах ей нельзя доверять), дата и план следующего переобучения.

Это можно вести хоть в Google Sheets, хоть в markdown-файле в git-репозитории, хоть в MLflow — форма не принципиальна. Принципиально, чтобы эта информация существовала и обновлялась при каждом релизе.

Зачем это нужно на практике? Когда модель начинает вести себя странно, первый вопрос — «что изменилось?». Без registry ответ на этот вопрос — детективный квест по Slack-переписке и git blame. С registry — 30 секунд: смотрим версию, дату, данные, метрики. Когда нужно откатиться — знаем, на что. Когда приходит аудит или новый человек в команде — есть от чего оттолкнуться.

Воспроизводимость обучения — «а можно переобучить?»

Вопрос, который убивает проекты через шесть месяцев после запуска. Модель нужно обновить: сменился сезон, добавились данные, изменился ассортимент. Кто-то открывает ноутбук, в котором модель обучалась, и обнаруживает, что: библиотеки обновились и код не запускается, данные были скачаны «откуда-то» и этот «откуда-то» уже не доступен, часть предобработки делалась руками в Excel и не задокументирована, окружение было настроено на конкретной машине, которую с тех пор переформатировали.

Переобучение, которое должно занять час, превращается в двухнедельный квест по восстановлению утраченных знаний. Иногда квест заканчивается выводом «проще обучить с нуля» — но и с нуля непонятно как, потому что постановка задачи тоже была в голове у одного человека.

Что нужно минимально. Зафиксированный код обучения в git (не ноутбук с пометкой «final_v3_LAST», а нормальный скрипт). Зафиксированные данные или указатель на них (версия датасета, snapshot, запрос в хранилище). Зафиксированное окружение: Docker-образ, requirements.txt, или хотя бы README с инструкцией «как воспроизвести обучение на чистой машине». Это не идеал, но это разница между «переобучили за день» и «разбирались два месяца».

Feature store — не для всех, но раньше, чем кажется

Feature store — это, пожалуй, самый «пугающий» компонент MLOps для небольших команд. Звучит как тяжёлая инфраструктура, которая нужна только при масштабах Spotify или Uber. И в каком-то смысле это правда: если у вас одна модель с десятью фичами, feature store — это overkill.

Но момент, когда он становится нужен, наступает раньше, чем обычно думают. Вот типичные сигналы: две или больше моделей используют одни и те же фичи, но каждая считает их по-своему (и результаты слегка расходятся). Фичи на обучении считаются из одного источника, а на инференсе — из другого, и между ними есть тонкие расхождения (training-serving skew). Подготовка фичей занимает столько времени, что новый эксперимент — это неделя работы вместо дня.

Минимальная реализация feature store — это не managed-платформа. Это общая витрина или таблица, из которой все модели берут фичи, с версионированием и документацией: что каждая фича означает, как считается и из каких данных. Это может быть таблица в ClickHouse, view в PostgreSQL, или даже набор SQL-запросов в git-репозитории с понятной структурой. Суть не в инструменте, а в принципе: единый источник правды для фичей.

Мониторинг: три уровня, без которых всё рассыпается

Мониторинг моделей — это то, про что все знают, но почти никто не делает нормально. В лучшем случае — кто-то раз в месяц запускает ноутбук и смотрит AUC на свежих данных. В худшем — мониторинга нет вообще, и деградация обнаруживается только через жалобы бизнеса.

Работающий мониторинг — это три слоя, каждый из которых отвечает на свой вопрос.

Уровень данных: «то, что приходит на вход, ещё нормальное?» Проверки: данные вообще пришли вовремя? Нет ли новых пропусков, аномалий, изменений в распределении признаков? Не сломался ли формат? Это самый базовый уровень, и именно он ловит проблемы раньше всего. Если данные сломались — всё дальше бессмысленно.

Уровень модели: «модель ведёт себя так же, как при запуске?» Проверки: не сместилось ли распределение предсказаний? Не изменился ли калибровочный профиль? Нет ли систематического bias по сегментам? Здесь полезны метрики вроде PSI (Population Stability Index) или просто сравнение гистограмм скоров за текущий и базовый периоды.

Уровень бизнеса: «модель по-прежнему приносит пользу?» Проверки: конверсия, потери, SLA, время обработки — метрики, ради которых модель создавалась. Этот уровень ловит проблемы, которые невидимы на уровне модели: например, модель технически работает нормально, но бизнес-процесс вокруг неё изменился и результат больше не используется.

И самое главное: у каждого алерта должно быть действие. Дрейф данных — ускоренное переобучение. Деградация бизнес-метрик — откат на предыдущую версию или переход в «безопасный режим». Мониторинг без playbook — это просто логирование, от которого никому не легче.

CI/CD для моделей — не роскошь, а гигиена

В обычной разработке CI/CD стал стандартом давно: код проходит автотесты, проверяется линтером, деплоится автоматически. Никому не приходит в голову выкатывать фронтенд руками по пятницам через SSH.

С моделями — до сих пор приходит. «Скачал модель, положил на сервер, перезапустил сервис, вроде работает». Или ещё лучше: «запустил ноутбук, который и обучает, и деплоит, и обновляет конфиг — если не упадёт посередине».

Минимальный CI/CD для модели — это не Kubernetes с ArgoCD. Это три вещи. Первая: автоматическая проверка данных перед обучением (не пустые ли, не сломан ли формат, нет ли аномалий). Вторая: автоматическая проверка модели после обучения (метрики не хуже порога, предсказания в разумном диапазоне, нет явного bias). Третья: автоматический откат, если после деплоя бизнес-метрики упали ниже порога.

Это может быть реализовано хоть bash-скриптом в cron, хоть GitHub Actions, хоть Airflow. Инструмент вторичен. Важно, что деплой модели перестаёт быть «ручной операцией, которая зависит от настроения и внимательности одного человека в пятницу вечером».

Дорожная карта: что внедрять первым

Feature store, model registry и «все эти MLOps штуки» — зачем, если вы не Google

Типичная ошибка — пытаться внедрить всё сразу. Feature store, model registry, мониторинг, CI/CD, автоматическое переобучение, A/B-платформу — в одном квартале. Результат предсказуем: ничего не доделано, всё «на 60%», команда выгорела.

Порядок, который я считаю рабочим, выглядит так.

Первые 2 недели: model registry. Просто зафиксируйте, что у вас есть: какие модели в проде, какие версии, на чём обучены, кто владелец. Это займёт буквально часы, а пользу принесёт сразу.

Недели 3–4: воспроизводимость обучения. Переведите пайплайны из ноутбуков в нормальные скрипты. Зафиксируйте окружение. Проверьте, что любой человек в команде может переобучить любую модель с нуля за разумное время.

Недели 5–8: мониторинг. Настройте три уровня: данные, модель, бизнес. Определите пороги и действия. Даже простой скрипт, который раз в день считает основные метрики и шлёт алерт в Slack — это уже мониторинг, и он в десятки раз лучше, чем ничего.

Недели 9–12: CI/CD. Автоматизируйте проверки перед деплоем и настройте откат. После этого обновление модели перестаёт быть стрессовым событием и становится рутиной.

Дальше (по необходимости): feature store. Когда у вас появляется несколько моделей с общими фичами и проблема training-serving skew становится реальной — тогда feature store оправдывает инвестиции.

Каждый следующий шаг имеет смысл только если предыдущий работает. Нет смысла строить CI/CD, если непонятно, какая модель в проде. Нет смысла строить feature store, если модели нельзя воспроизвести.

MLOps — это не инструменты, а дисциплина

Инструменты MLOps меняются каждый год. То, что сегодня кажется стандартом, через два года будет legacy. MLflow уступит место чему-то новому, managed-платформы будут появляться и закрываться, модные аббревиатуры сменятся ещё более модными.

Принципы при этом останутся те же: воспроизводимость, контроль версий моделей и данных, мониторинг качества, понятное владение, автоматизация рутины. Это не «инфраструктура для Google». Это инженерная дисциплина, которая позволяет держать модели живыми, а не переписывать их с нуля каждые полгода.

Компании, которые это понимают, запускают модели в прод и поддерживают их годами — с предсказуемым качеством, управляемыми рисками и понятной стоимостью владения. Остальные — каждые полгода начинают «новый ML-проект», потому что предыдущий «как-то не взлетел».

Разница между первыми и вторыми — не в бюджете и не в крутости алгоритмов. Разница — в том, есть ли вокруг модели инфраструктура, которая позволяет ей жить. И начать строить эту инфраструктуру можно с model registry за 30 минут, а не с Kubernetes-кластера за полмиллиона.

5
Начать дискуссию