CI/CD и оркестрация
CI/CD для ML это три контура тестов вместо одного: код, данные, модель. Вопрос «что гоняет твой CI» мгновенно показывает, автоматизировал ли ты ML-пайплайн или запускаешь трейн руками по пятницам.
// Зелёный pytest не ловит сломанные данные - в этом вся специфика ML-CI.
Три контура тестов
Код - юнит-тесты как везде. Данные - схема, свежесть, распределения: великие деградации приезжают именно отсюда, зелёными по всем юнит-тестам. Модель - метрика на эталонном наборе не хуже порога плюс инвариантные проверки (сдвиг входа → предсказуемая реакция).
Смоук-тест модели в CI: предсказание на золотом наборе, проверка сигнатуры и латентности - дешёвая страховка до деплоя.
// Оценивать кандидата и чемпиона - на одном и том же срезе: разные срезы дают «улучшение» из разницы данных.
- тесты данных
- схема/свежесть/распределения - контур, которого нет в обычном CI
Оркестрация: DAG вместо кронов
Пайплайн - DAG (directed acyclic graph) в оркестраторе (Airflow/Dagster/Kubeflow-класс): данные → фичи → трейн → оценка → регистрация. Ретраи, алерты, расписание и зависимости - из коробки, а не cron-скрипты по серверам.
Шаги идемпотентны: повторный запуск за тот же период даёт тот же результат. Без этого бэкфиллы и ретраи плодят дубли - «задвоенные агрегаты за неделю» родом отсюда.
// Конфиг пайплайна - в коде и через ревью (GitOps): изменение расписания или гиперпараметров это PR, а не правка в UI, которую никто не увидит.
- идемпотентность
- повторный запуск шага не меняет результат
- GitOps
- конфиг пайплайна кодом через PR - история и ревью
CD и ворота ретрейна
CD раскатывает не только сервис, но и модель: сборка образа, офлайн-оценка против чемпиона, canary. Человек утверждает - робот исполняет.
Ретрейн-триггеры: расписание, дрейф, деградация метрики, свежая разметка. Железное правило: автоматический ретрейн проходит те же ворота качества, что и ручной.
// Ретрейн по крону без ворот - конвейер инцидентов: плохие данные → плохая модель → авто-деплой. Автоматизация без проверок масштабирует ошибки.
- ворота качества
- оценка против чемпиона перед любой выкаткой
Как отвечать: «Что должен проверять CI в ML-проекте?»
Три контура. Код - обычные юнит-тесты. Данные - то, чего нет в классическом CI: валидация схемы, свежести и распределений входных данных, потому что главные деградации приезжают сломанными данными при зелёных тестах кода. Модель - смоук на золотом наборе: метрика не хуже порога, сигнатура и латентность в норме, сравнение с чемпионом на одном и том же срезе. Дальше CD: образ, офлайн-ворота, canary. И те же ворота - для автоматических ретрейнов: ретрейн по крону без проверок превращает автоматизацию в конвейер доставки плохих моделей.
Три контура с объяснением, почему данных нет в обычном CI, и принцип единых ворот - системный ответ.
На чём валят
- −CI гоняет только pytest - сломанные данные доезжают до прода зелёными.
- −Ретрейн по крону без ворот качества - плохие данные → авто-деплой плохой модели.
- −Неидемпотентные шаги - бэкфилл задвоил агрегаты.
- −Кандидат и чемпион на разных срезах - «улучшение» из разницы данных.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.
- Что такое автоматический retraining-триггер и когда он опасен?A)Это ручная кнопка, которую дата-сайентист нажимает раз в квартал после большого код-ревью модели командойB)Это полный и бессрочный запрет на переобучение модели после её первого выката в продакшенC)Это откат модели на предыдущую версию строго в тот момент, когда падает её онлайн-метрика в продеD)Авто-переобучение по расписанию или дрифту; опасно без валидации — задеплоит модель хуже на грязных данных
показать ответ и разбор
+D)Авто-переобучение по расписанию или дрифту; опасно без валидации — задеплоит модель хуже на грязных данных// разбор: Retraining-триггер запускает переобучение автоматически — по расписанию или при обнаружении дрифта. Опасность: если между обучением и выкатом нет gate на качество и данные, конвейер тихо задеплоит модель, обученную на битом/отравленном срезе, — станет хуже, а никто не заметил. Поэтому авто-ретрейн всегда идёт в связке с валидацией данных и метрики плюс возможность отката.
- Авто-ретрейн выкатил модель, онлайн-метрика упала, хотя офлайн-валидация на holdout прошла. Какого контроля не хватило в CD?A)Постепенного выката с gate на онлайн-метрику (canary/shadow) и авто-rollback, а не только офлайн-гейтаB)Не хватило исключительно увеличения размера отложенной holdout-выборки в несколько раз при офлайн-валидацииC)Проблема только в том, что модель обучали на слишком коротком по числу эпох цикле градиентного спускаD)Основная причина — устаревшая версия библиотеки для инференса на продакшен-сервере данной модели
показать ответ и разбор
+A)Постепенного выката с gate на онлайн-метрику (canary/shadow) и авто-rollback, а не только офлайн-гейта// разбор: Офлайн-метрика на holdout может быть хорошей, а онлайн — просесть: сместилось распределение, holdout нерепрезентативен, прокси-метрика не совпала с бизнесом. CD должен катить постепенно — shadow/canary на малой доле трафика с гейтом на живую метрику и автоматическим откатом при просадке. Один офлайн-гейт не ловит расхождение офлайн/онлайн.
- CI для ML-пайплайна гоняет юнит-тесты кода. Какой класс проверок специфичен для ML и часто забыт?A)Проверка стиля кода линтером — для ML-пайплайна этого набора проверок достаточно на практикеB)Нагрузочное тестирование фронтенда, который отображает предсказания модели конечным пользователям сервисаC)Проверки данных и контракта фичей: схема, типы, диапазоны, доля пропусков, распределения на входеD)Ручной визуальный просмотр каждого отдельного предсказания дежурным аналитиком перед каждым релизом модели
показать ответ и разбор
+C)Проверки данных и контракта фичей: схема, типы, диапазоны, доля пропусков, распределения на входе// разбор: Код может быть корректен, а пайплайн — сломаться из-за данных: поехала схема источника, колонка сменила тип, выросла доля пропусков, распределение фичи уплыло. CI для ML дополняют data-тестами и проверкой контракта фичей (Great Expectations, схемы, статистики), ловящими «плохие данные» до обучения/деплоя. Линтинг и нагрузка фронта важны, но не покрывают ML-специфику, а ручной просмотр не масштабируется.
- Чем blue-green деплой модели отличается от canary?A)Blue-green шлёт трафик обеим версиям поровну, а canary отдаёт весь трафик новой версии сразуB)Blue-green держит две полные среды и переключает весь трафик разом; canary льёт новой версии сначала малую долюC)Это два названия одного и того же подхода — разницы между blue-green и canary на практике практически нетD)Canary мгновенно заменяет старую версию, а blue-green выкатывает новую по одному запросу за раз
показать ответ и разбор
+B)Blue-green держит две полные среды и переключает весь трафик разом; canary льёт новой версии сначала малую долю// разбор: Blue-green держит две полные среды (старую blue и новую green) и переключает весь трафик разом, с мгновенным откатом на blue при проблеме. Canary выкатывает новую версию постепенно — сначала 1-5% трафика, следя за метриками, затем наращивает. Blue-green проще и быстрее по переключению, canary безопаснее ловит регресс на малой доле. Оба снижают риск релиза, но устроены по-разному.
- Пайплайн обучения перезапустили после сбоя, и он частично задублировал данные и артефакты. Какого свойства не хватило?A)Большей вычислительной мощности кластера — на более мощном железе этот сбой попросту не случился быB)Более частых коммитов кода в git, чтобы можно было откатиться на предыдущую рабочую версию скриптаC)Более подробного логирования — сами по себе подробные логи предотвратили бы повторную запись данных при рестартеD)Идемпотентности: повторный запуск шага должен давать тот же результат без дублей (перезапись по ключу/партиции)
показать ответ и разбор
+D)Идемпотентности: повторный запуск шага должен давать тот же результат без дублей (перезапись по ключу/партиции)// разбор: Пайплайны падают и перезапускаются — это норма, поэтому шаги делают идемпотентными: повторный запуск на тех же входах даёт тот же результат и не плодит дубли (перезапись партиции по ключу-дате, upsert по id, атомарная публикация артефакта). Без идемпотентности рестарт после частичного успеха задваивает строки и ломает воспроизводимость. Мощность, логи и коммиты полезны, но проблему повторной записи не решают.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.