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, остальные разбираются в тренажёре.
- Как безопасно выкатить новую версию модели вместо текущей в проде?A)Просто заменить файл модели глубокой ночью и потом внимательно следить за логами сервисаB)Сразу пустить сплит 50/50, чтобы как можно быстрее собрать статистикуC)Shadow → канарейка с guardrail → постепенная раскатка с откатомD)Выкатить сразу на всех пользователей, но с заметно пониженным порогом
показать ответ и разбор
+C)Shadow → канарейка с guardrail → постепенная раскатка с откатом// разбор: Shadow ловит технические расхождения (латентность, ошибки, сдвиг скоров) бесплатно для юзеров; канарейка ограничивает радиус поражения; финальную ценность подтверждает A/B. Ключевая дисциплина — мгновенный откат (роутинг версий, а не перезаливка) и совместное версионирование модели, фичей и препроцессинга: артефакт без своего пайплайна невалиден.
- Зачем логировать предсказания модели вместе с поданными фичами, а не только финальные решения?A)Прежде всего ради формального соответствия требованиям регламента GDPRB)Логирование фичей якобы строго запрещено внутренними политиками безопасности данных компанииC)Сырьё ML-цикла: разбор инцидентов, детект дрейфа, датасеты, реплейD)Чтобы за счёт этого заметно уменьшить итоговый размер обученной модели
показать ответ и разбор
+C)Сырьё ML-цикла: разбор инцидентов, детект дрейфа, датасеты, реплей// разбор: Реконструировать «какие фичи были в тот момент» задним числом почти невозможно (источники уехали) — а логи предсказаний дают point-in-time датасет бесплатно. Реплей логов — способ оценить модель-кандидата до A/B. Практика: сэмплирование для тяжёлых фичей, PII-маскирование, схема с версией модели/фичей в каждой записи.
- Модель в проде «сломалась» после планового переобучения: скоры сместились, конверсия просела. Каких предохранителей не хватило в пайплайне переобучения?A)Переобучение — неизбежный риск, предохранителей практически нетB)Автовалидация перед промоушеном: holdout vs текущая, PSI скоров, канарейка, откатC)Достаточно обычного ручного согласования каждого релиза модели с менеджеромD)Просто переобучать заметно чаще, чтобы каждая конкретная ошибка жила меньше
показать ответ и разбор
+B)Автовалидация перед промоушеном: holdout vs текущая, PSI скоров, канарейка, откат// разбор: Continuous training без continuous validation — генератор инцидентов: битая партиция данных тихо портит трейн. Гейт промоушена: новая модель обязана не проиграть текущей на holdout и не сдвинуть скоры сверх порога без объяснения; вход пайплайна защищают data-контракты (схема, доли пропусков, диапазоны). Плюс канарейка и кнопка отката — как у любого деплоя.
- Чем инференс модели отличается от обучения?A)На инференсе модель как раз подбирает свои веса, а на обучении лишь выдаёт готовые предсказанияB)Обучение подбирает веса по данным; инференс применяет готовую модель к входуC)Инференс и обучение — это два названия одного и того же процессаD)Обучение выполняется на CPU, а инференс на GPU
показать ответ и разбор
+B)Обучение подбирает веса по данным; инференс применяет готовую модель к входу// разбор: Обучение — дорогой оффлайн-процесс подбора весов по размеченным данным. Инференс — быстрый прогон уже обученной модели на новом входе ради предсказания. Именно инференс живёт в проде под требованиями латентности и надёжности, поэтому его оптимизируют (батчинг, квантование), а обучение гоняют отдельно.
- Зачем обученную модель разворачивают как сервис, а не гоняют в ноутбуке?A)Чтобы развёрнутая модель могла самостоятельно дообучаться прямо во время работыB)Ноутбук не способен выполнить инференс обученной моделиC)Это требуется для соответствия требованиям регуляторовD)Чтобы приложения слали запросы и получали предсказания надёжно и масштабируемо
показать ответ и разбор
+D)Чтобы приложения слали запросы и получали предсказания надёжно и масштабируемо// разбор: Развёртывание как сервиса даёт приложениям стабильный API для предсказаний, а команде — масштабирование под нагрузку, версионирование, мониторинг и откат. Ноутбук инференсить умеет, но не выдержит прод-трафик и не даст этих гарантий. Отсюда и требования: латентность, доступность, воспроизводимость версий модели и фич.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.