сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · MLOps

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, остальные разбираются в тренажёре.

  1. #cicd_orchestration1 / 5
    Что такое автоматический retraining-триггер и когда он опасен?
    A)Это ручная кнопка, которую дата-сайентист нажимает раз в квартал после большого код-ревью модели командой
    B)Это полный и бессрочный запрет на переобучение модели после её первого выката в продакшен
    C)Это откат модели на предыдущую версию строго в тот момент, когда падает её онлайн-метрика в проде
    D)Авто-переобучение по расписанию или дрифту; опасно без валидации — задеплоит модель хуже на грязных данных
    показать ответ и разбор
    +D)Авто-переобучение по расписанию или дрифту; опасно без валидации — задеплоит модель хуже на грязных данных

    // разбор: Retraining-триггер запускает переобучение автоматически — по расписанию или при обнаружении дрифта. Опасность: если между обучением и выкатом нет gate на качество и данные, конвейер тихо задеплоит модель, обученную на битом/отравленном срезе, — станет хуже, а никто не заметил. Поэтому авто-ретрейн всегда идёт в связке с валидацией данных и метрики плюс возможность отката.

  2. #cicd_orchestration2 / 5
    Авто-ретрейн выкатил модель, онлайн-метрика упала, хотя офлайн-валидация на holdout прошла. Какого контроля не хватило в CD?
    A)Постепенного выката с gate на онлайн-метрику (canary/shadow) и авто-rollback, а не только офлайн-гейта
    B)Не хватило исключительно увеличения размера отложенной holdout-выборки в несколько раз при офлайн-валидации
    C)Проблема только в том, что модель обучали на слишком коротком по числу эпох цикле градиентного спуска
    D)Основная причина — устаревшая версия библиотеки для инференса на продакшен-сервере данной модели
    показать ответ и разбор
    +A)Постепенного выката с gate на онлайн-метрику (canary/shadow) и авто-rollback, а не только офлайн-гейта

    // разбор: Офлайн-метрика на holdout может быть хорошей, а онлайн — просесть: сместилось распределение, holdout нерепрезентативен, прокси-метрика не совпала с бизнесом. CD должен катить постепенно — shadow/canary на малой доле трафика с гейтом на живую метрику и автоматическим откатом при просадке. Один офлайн-гейт не ловит расхождение офлайн/онлайн.

  3. #cicd_orchestration3 / 5
    CI для ML-пайплайна гоняет юнит-тесты кода. Какой класс проверок специфичен для ML и часто забыт?
    A)Проверка стиля кода линтером — для ML-пайплайна этого набора проверок достаточно на практике
    B)Нагрузочное тестирование фронтенда, который отображает предсказания модели конечным пользователям сервиса
    C)Проверки данных и контракта фичей: схема, типы, диапазоны, доля пропусков, распределения на входе
    D)Ручной визуальный просмотр каждого отдельного предсказания дежурным аналитиком перед каждым релизом модели
    показать ответ и разбор
    +C)Проверки данных и контракта фичей: схема, типы, диапазоны, доля пропусков, распределения на входе

    // разбор: Код может быть корректен, а пайплайн — сломаться из-за данных: поехала схема источника, колонка сменила тип, выросла доля пропусков, распределение фичи уплыло. CI для ML дополняют data-тестами и проверкой контракта фичей (Great Expectations, схемы, статистики), ловящими «плохие данные» до обучения/деплоя. Линтинг и нагрузка фронта важны, но не покрывают ML-специфику, а ручной просмотр не масштабируется.

  4. #cicd_orchestration4 / 5
    Чем 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 безопаснее ловит регресс на малой доле. Оба снижают риск релиза, но устроены по-разному.

  5. #cicd_orchestration5 / 5
    Пайплайн обучения перезапустили после сбоя, и он частично задублировал данные и артефакты. Какого свойства не хватило?
    A)Большей вычислительной мощности кластера — на более мощном железе этот сбой попросту не случился бы
    B)Более частых коммитов кода в git, чтобы можно было откатиться на предыдущую рабочую версию скрипта
    C)Более подробного логирования — сами по себе подробные логи предотвратили бы повторную запись данных при рестарте
    D)Идемпотентности: повторный запуск шага должен давать тот же результат без дублей (перезапись по ключу/партиции)
    показать ответ и разбор
    +D)Идемпотентности: повторный запуск шага должен давать тот же результат без дублей (перезапись по ключу/партиции)

    // разбор: Пайплайны падают и перезапускаются — это норма, поэтому шаги делают идемпотентными: повторный запуск на тех же входах даёт тот же результат и не плодит дубли (перезапись партиции по ключу-дате, upsert по id, атомарная публикация артефакта). Без идемпотентности рестарт после частичного успеха задваивает строки и ломает воспроизводимость. Мощность, логи и коммиты полезны, но проблему повторной записи не решают.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.