MLOps: трекинг и реестр моделей
Воспроизводимость - вопрос, на котором ловят ноутбучных героев: «где-то было лучше, но не помню где» это не эксперимент, это воспоминание. Проверяют пять фиксаций и дисциплину registry.
// Формула: код + данные + конфиг + окружение + сиды. Не хватает одного - не воспроизведёшь.
Пять фиксаций воспроизводимости
Эксперимент воспроизводим, когда зафиксированы: код (коммит), данные (версия или снапшот), конфиг (гиперпараметры), окружение (lock-файл), сиды.
Трекинг (MLflow/W&B-класс) пишет параметры, метрики и артефакты каждого запуска - сравнение запусков таблицей вместо археологии по ноутбукам.
// Ноутбук - для исследования; в трекинг попадает запуск скрипта или пайплайна. Ноутбучные результаты невоспроизводимы по определению: скрытое состояние ячеек.
- трекинг экспериментов
- параметры+метрики+артефакты каждого запуска
Данные версионируются отдельно
Git не для гигабайт: датасеты версионируются DVC (Data Version Control)/lakeFS/снапшотами, а в трекинге лежит ссылка на версию данных.
«Лучшая модель» без зафиксированной версии данных - невоспроизводима и необъяснима: может, улучшил гиперпараметры, а может, в данные приехала новая неделя.
// Сравнение запусков честно при одинаковых сплитах и сидах: разные сплиты - сравниваешь данные, а не гиперпараметры.
- версия данных
- снапшот/DVC-тег - вторая половина воспроизводимости
Model registry: что крутится в проде
Registry - реестр версий модели со стадиями: staging → production → archived. Отвечает на вопросы «что катим», «что катили» и «куда откатываться».
Промоушен через registry - событие с проверками: авто-сравнение с чемпионом на holdout, ручной approve. Не «скопировал файл на сервер».
// Метаданные связывают всё: из прод-инцидента по версии модели восстанавливаешь запуск, данные и код - lineage в обе стороны.
- model registry
- версии модели со стадиями и историей промоушенов
Как отвечать: «Как организуешь эксперименты, чтобы результаты были воспроизводимы?»
Пять фиксаций на каждый запуск: коммит кода, версия данных (DVC или снапшот - в git данные не живут), конфиг гиперпараметров, lock-файл окружения и сиды. Запуски идут скриптом через трекинг - MLflow или аналог - с метриками и артефактами; ноутбук остаётся песочницей, его результаты в сравнение не идут: скрытое состояние ячеек делает их невоспроизводимыми. Сравнение запусков - только при одинаковых сплитах и сидах. Лучшая модель уходит в registry со стадиями, и в прод попадает только из него - через сравнение с чемпионом и approve.
Пять фиксаций, дисциплина «ноутбук ≠ эксперимент» и registry как единственная дорога в прод - полная система.
На чём валят
- −«Лучшая модель» без версии данных - не воспроизведёшь и не объяснишь.
- −Сравнивать запуски с разными сплитами/сидами и делать выводы о гиперпараметрах.
- −Датасеты в git - репозиторий умрёт; нигде - умрёт эксперимент.
- −Катить в прод модель мимо registry - через месяц никто не скажет, что там крутится.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Код модели уже в git. Зачем отдельно версионировать данные, например через DVC?A)Тот же код на разных данных даёт разную модель, а git не тянет большие бинарные датасетыB)Git и так хранит датасеты в сотни гигабайт и построчно отслеживает их измененияC)Версионирование данных избавляет от необходимости писать тесты на код пайплайнаD)Это нужно ради ускорения чтения обучающего датасета с диска в момент обучения модели
показать ответ и разбор
+A)Тот же код на разных данных даёт разную модель, а git не тянет большие бинарные датасеты// разбор: Модель определяется кодом И данными: тот же скрипт на другом срезе даёт другую модель, поэтому для воспроизводимости данные версионируют вместе с кодом. Git для этого не годится — он не рассчитан на гигабайтные бинарники; DVC хранит данные в объектном хранилище, а в git кладёт только лёгкий указатель на версию. Тесты и скорость чтения тут ни при чём.
- Что такое training-serving skew и чем от него защищает feature store?A)Это когда обучающая выборка случайно оказалась значительно больше по объёму, чем тестовая выборкаB)Это постепенный уход распределения таргета со временем, который лечится полным переобучениемC)Это рассинхрон версий библиотек между машиной обучения и продакшен-сервером инференса модели онлайнD)Фичи в проде считаются иначе, чем на обучении; общий feature store даёт единую логику офлайн и онлайн
показать ответ и разбор
+D)Фичи в проде считаются иначе, чем на обучении; общий feature store даёт единую логику офлайн и онлайн// разбор: Training-serving skew — когда фича на обучении и та же фича в проде считаются по-разному (другой SQL, другое окно, другой дефолт для пропуска). Модель обучалась на одном распределении, а в проде видит другое — тихая деградация. Feature store хранит одно определение фичи и отдаёт её консистентно и в офлайн-обучение, и в онлайн-инференс. Это не про размер выборки и не про версии либ.
- Эксперимент дал +2% метрики, но на той же конфигурации гиперпараметров результат не воспроизводится. Что чаще всего забыли зафиксировать?A)Ничего: расхождение в пару процентов между прогонами нормально и фиксировать тут нечегоB)Seed, версию данных и версии библиотек — источники недетерминизма помимо гиперпараметровC)Забыли увеличить число эпох обучения, из-за чего вторая модель банально не успела дообучиться до концаD)Забыли развернуть обучение на таком же числе GPU — это возможная причина расхождения
показать ответ и разбор
+B)Seed, версию данных и версии библиотек — источники недетерминизма помимо гиперпараметров// разбор: Гиперпараметры — лишь часть конфигурации. Невоспроизводимость обычно даёт незафиксированный источник случайности: random seed (инициализация, шаффл, dropout), версия данных (датасет подъехал/пересобрался), версии библиотек и CUDA (недетерминизм ядер). Фиксируют seed, пинят версии и версионируют данные — иначе «тот же» эксперимент каждый раз чуть другой.
- Модель в проде дала спорное предсказание; нужно узнать, на каких данных и коде она обучена. Что это за свойство системы?A)Lineage/происхождение (provenance): связка модели с версией кода, данных, гиперпараметров и окружением обученияB)Латентность инференса: время, за которое модель успевает ответить на один запрос в продакшене под нагрузкойC)Пропускная способность сервиса: сколько всего запросов к модели он успевает обработать за одну секунду времениD)A/B-тест: сравнение спорной версии модели с предыдущей на живом трафике реальных пользователей сервиса
показать ответ и разбор
+A)Lineage/происхождение (provenance): связка модели с версией кода, данных, гиперпараметров и окружением обучения// разбор: Чтобы разобрать инцидент или воспроизвести модель, нужна прослеживаемость (lineage/provenance): для каждой продовой модели зафиксировано, каким коммитом кода, на какой версии данных, с какими гиперпараметрами и в каком окружении она обучена. Это дают трекинг экспериментов плюс версионирование данных/артефактов (MLflow, DVC, registry). Латентность и throughput — про инференс, A/B — про сравнение, а не про происхождение.
- Зачем в model registry заводят стадии (staging → production → archived) для версий модели?A)Стадии нужны для красоты интерфейса реестра и на реальный процесс выката они не влияютB)Чтобы хранить как можно меньше версий: все версии, кроме одной текущей, немедленно и безвозвратно удаляютсяC)Управляемое продвижение: версия проходит staging, помечается production, прежняя архивируется — прод ссылается на стадиюD)Чтобы автоматически ускорять инференс production-версии в несколько раз по сравнению со staging-версией модели
показать ответ и разбор
+C)Управляемое продвижение: версия проходит staging, помечается production, прежняя архивируется — прод ссылается на стадию// разбор: Стадии в registry задают управляемый жизненный цикл: новая версия сначала в staging (прогоны, canary, приёмка), затем помечается production, а прежняя — archived. Прод-сервис ссылается не на конкретный хеш, а на стадию «production», поэтому выкат и откат — это смена указателя, с аудитом кто и когда продвинул. Это про процесс и управляемость, а не про красоту, удаление версий или скорость инференса.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.