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

ML System Design: сервинг и деплой

Зачем это спрашивают

Сервинг - где ML встречается с продом, и вопрос «batch или online» проверяет инженерную трезвость: умеешь ли ты не строить лишнего. Рядом - раскатка без пожара и версии, которые не расползаются.

// Правило темы: online-сервинг это плата сложностью; плати только за нужную свежесть.

Три режима сервинга

Batch - предсказать заранее и отдать из хранилища: churn-скоры, сегменты. Дёшево, просто, отказоустойчиво - дефолт, когда контекст запроса не нужен. Online - REST/gRPC по запросу, когда ответ зависит от «здесь и сейчас». Streaming - по событию в потоке.

Выбор диктуют свежесть и латентность, а не мода. Ночного батча хватает удивительно часто.

// Латентность-бюджет раскладывай по цепочке: сеть + фичи + инференс + постобработка. Чаще всего съедают походы за фичами во внешние сторы, а не сама модель.

batch / online / streaming
заранее / по запросу / по событию - по свежести и латентности

Раскатка модели как кода

Стандартная лестница: shadow - дублируем трафик на новую модель, ответы не отдаём, сравниваем; canary - малый процент живого трафика с наблюдением; полный раскат. И горячий rollback на прошлую версию - минуты, не часы.

Финальный судья - A/B: офлайн-метрика лучше не значит бизнес-метрика лучше; катим через эксперимент с guardrail'ами.

// Версионируется тройка: модель + код фичей + препроцессинг. Разъехавшиеся версии фичей на трейне и сервинге - классика тихой деградации, которую офлайн не видит.

shadow / canary
трафик без влияния / малая доля с наблюдением
training-serving skew
фичи на сервинге считаются иначе, чем на трейне

Оптимизация инференса - после профиля

Инструменты: квантизация, дистилляция, батчинг запросов, кэш горячих ответов. Но сначала профиль цепочки: если 80% латентности - поход за фичами, ускорение модели даст 20%.

Кэш - самый дешёвый «ускоритель»: готовые ответы для горячих ключей, эмбеддинги, фичи.

// Порядок всегда один: измерь → найди узкое место → чини его. Оптимизация по интуиции - любимый способ потратить спринт впустую.

Как отвечать: «Batch или online-сервинг - как выберешь?»

Два вопроса: нужен ли контекст запроса и какая свежесть предсказания реально двигает метрику. Churn-скор или сегменты не меняются от клика - ночной batch: дёшево, просто, отказоустойчиво. Рекомендации на текущую сессию или антифрод по транзакции - online, тут контекст и есть сигнал. Промежуточный вариант - batch-предрасчёт с online-доранжированием лёгкой моделью. И если выбрал online - раскладываю латентность-бюджет по цепочке заранее: чаще всего его съедают фичи из сторов, а не инференс.

Выбор из требований с готовностью НЕ строить сложное - ровно та трезвость, которую ищут в system design.

На чём валят

  • Online-сервинг там, где хватает ночного батча, плата сложностью за ненужную свежесть.
  • Раскат на 100% без canary и плана отката.
  • Фичи на сервинге другим кодом, чем на трейне, skew, невидимый в офлайне.
  • Оптимизировать модель, когда 80% латентности - поход за фичами.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 9, остальные разбираются в тренажёре.

  1. #serving_deployment1 / 5
    Как безопасно выкатить новую версию модели вместо текущей в проде?
    A)Просто заменить файл модели глубокой ночью и потом внимательно следить за логами сервиса
    B)Сразу пустить сплит 50/50, чтобы как можно быстрее собрать статистику
    C)Shadow → канарейка с guardrail → постепенная раскатка с откатом
    D)Выкатить сразу на всех пользователей, но с заметно пониженным порогом
    показать ответ и разбор
    +C)Shadow → канарейка с guardrail → постепенная раскатка с откатом

    // разбор: Shadow ловит технические расхождения (латентность, ошибки, сдвиг скоров) бесплатно для юзеров; канарейка ограничивает радиус поражения; финальную ценность подтверждает A/B. Ключевая дисциплина — мгновенный откат (роутинг версий, а не перезаливка) и совместное версионирование модели, фичей и препроцессинга: артефакт без своего пайплайна невалиден.

  2. #serving_deployment2 / 5
    Зачем логировать предсказания модели вместе с поданными фичами, а не только финальные решения?
    A)Прежде всего ради формального соответствия требованиям регламента GDPR
    B)Логирование фичей якобы строго запрещено внутренними политиками безопасности данных компании
    C)Сырьё ML-цикла: разбор инцидентов, детект дрейфа, датасеты, реплей
    D)Чтобы за счёт этого заметно уменьшить итоговый размер обученной модели
    показать ответ и разбор
    +C)Сырьё ML-цикла: разбор инцидентов, детект дрейфа, датасеты, реплей

    // разбор: Реконструировать «какие фичи были в тот момент» задним числом почти невозможно (источники уехали) — а логи предсказаний дают point-in-time датасет бесплатно. Реплей логов — способ оценить модель-кандидата до A/B. Практика: сэмплирование для тяжёлых фичей, PII-маскирование, схема с версией модели/фичей в каждой записи.

  3. #serving_deployment3 / 5
    Модель в проде «сломалась» после планового переобучения: скоры сместились, конверсия просела. Каких предохранителей не хватило в пайплайне переобучения?
    A)Переобучение — неизбежный риск, предохранителей практически нет
    B)Автовалидация перед промоушеном: holdout vs текущая, PSI скоров, канарейка, откат
    C)Достаточно обычного ручного согласования каждого релиза модели с менеджером
    D)Просто переобучать заметно чаще, чтобы каждая конкретная ошибка жила меньше
    показать ответ и разбор
    +B)Автовалидация перед промоушеном: holdout vs текущая, PSI скоров, канарейка, откат

    // разбор: Continuous training без continuous validation — генератор инцидентов: битая партиция данных тихо портит трейн. Гейт промоушена: новая модель обязана не проиграть текущей на holdout и не сдвинуть скоры сверх порога без объяснения; вход пайплайна защищают data-контракты (схема, доли пропусков, диапазоны). Плюс канарейка и кнопка отката — как у любого деплоя.

  4. #serving_deployment4 / 5
    Чем инференс модели отличается от обучения?
    A)На инференсе модель как раз подбирает свои веса, а на обучении лишь выдаёт готовые предсказания
    B)Обучение подбирает веса по данным; инференс применяет готовую модель к входу
    C)Инференс и обучение — это два названия одного и того же процесса
    D)Обучение выполняется на CPU, а инференс на GPU
    показать ответ и разбор
    +B)Обучение подбирает веса по данным; инференс применяет готовую модель к входу

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

  5. #serving_deployment5 / 5
    Зачем обученную модель разворачивают как сервис, а не гоняют в ноутбуке?
    A)Чтобы развёрнутая модель могла самостоятельно дообучаться прямо во время работы
    B)Ноутбук не способен выполнить инференс обученной модели
    C)Это требуется для соответствия требованиям регуляторов
    D)Чтобы приложения слали запросы и получали предсказания надёжно и масштабируемо
    показать ответ и разбор
    +D)Чтобы приложения слали запросы и получали предсказания надёжно и масштабируемо

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

дальше

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

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