Как организовать контейнеризацию и развёртывание моделей
Что проверяют
Понимаете ли вы, что модель это артефакт со своей версией, и знаете ли, чем отличается вывод от обучения.
Как отвечать
По шагам, от сборки до эксплуатации.
Упаковка. В образ кладётся код вывода и зафиксированные версии зависимостей. Веса модели обычно не вшивают в образ, а забирают при старте из хранилища объектов или реестра моделей: иначе каждая переобученная версия требует пересборки образа, а сам образ раздувается до гигабайтов. Сборка многоэтапная, база облегчённая, файл исключений обязателен.
Версионирование. Модель это артефакт с версией, метриками и происхождением: на каких данных и с какими параметрами обучена. Для этого есть реестр (MLflow и подобные). Без него невозможно ответить, какая версия сейчас в проде и почему качество изменилось.
Сервинг. Простой случай это FastAPI с обёрткой вокруг предсказания. Для нагрузки берут специализированные серверы: Triton, TorchServe, BentoML, KServe. Они дают пакетирование запросов, работу с несколькими моделями и управление ускорителями.
Ускорение вывода. Перевод в ONNX или TensorRT, квантизация, обрезка. Это часто сокращает задержку в разы и позволяет обойтись процессором вместо ускорителя, что напрямую влияет на стоимость.
Развёртывание. Kubernetes с масштабированием по нагрузке, отдельный пул узлов с ускорителями, если они нужны. Проверки готовности обязательны: модель грузится долго, и до её загрузки трафик слать нельзя. Прогрев первым запросом снимает эффект холодного старта.
Выкатка. Постепенная или теневая: новая версия получает копию трафика, но её ответы не используются, а сравниваются со старой. Затем канареечный выпуск на долю пользователей.
Мониторинг двух видов: технический (задержка, ошибки, использование ускорителя) и продуктовый (распределение предсказаний, дрейф входных данных, качество на размеченной части). Дрейф данных заметен раньше, чем падение качества, потому что разметка приходит с задержкой.
Где спотыкаются
Вшивают веса в образ и получают гигабайтные сборки.
Не делают проверку готовности и льют трафик на незагруженную модель.
Развёртывают без отката и без сравнения со старой версией.
Следят только за задержкой и не замечают дрейфа данных.