MLOps: развёртывание ML-моделей в продакшн, пайплайны и мониторинг

MLOps превращает обученную модель в сервис, за которым кто-то следит: у версий есть история, выпуск идёт по процедуре, качество измеряется, переобучение повторяется, а к прошлой версии можно вернуться по инструкции. Берём модель из ноутбука аналитика, из вашей команды или от прежнего подрядчика, упаковываем в сервис в вашем контуре и фиксируем, кто за что отвечает. Свою модель строим только тогда, когда готовой нет.

Обследование модели и данных — от 200 000 ₽Работаем с готовой моделью, в том числе чужойИсходники, реестр и пайплайны в вашем репозитории с первого коммита

С чем приходят

Когда нужен MLOps, а не ещё одна модель

Модель живёт в ноутбуке

Она обучена и показывает хорошие цифры у аналитика, но запускается руками, зависит от его окружения, а файл весов лежит на личном диске. Если он уйдёт в отпуск, прогноз не обновится.

Качество в работе никто не измеряет

Сервис отвечает, ошибок в журнале нет, а ответы модели не сверяются с тем, что случилось на самом деле. Деградация может тянуться месяцами, и о ней узнают по жалобам.

Переобучение — разовая акция

Модель обучили на данных прошлого года, а обновление зависит от того, вспомнит ли кто-то. Нет записи, на чём обучена текущая версия, и повторить её нельзя.

Модель досталась по наследству

Подрядчик ушёл, остались веса и скрипт. Неизвестно, на каких данных учили и с какими версиями библиотек, и никто не проверял, что те же входы дают те же ответы.

Состав

Из чего состоит контур: шесть частей и минимум для каждой

Минимум делаем всегда. Больше берём по требованиям задачи, лишнее в объём не включаем. Сама модель описана на странице разработки моделей машинного обучения.

Часть контура
Что это
Минимум
Когда нужно больше
Часть контураВерсиикод, данные, параметры
Что этоКакой код, срез данных и параметры дали эту модель
МинимумКод в репозитории, срез данных зафиксирован ссылкой или контрольной суммой, параметры лежат в файле
Когда нужно большеДанные большие или исправляются задним числом: версионируем выгрузки отдельным инструментом, например DVC
Часть контураРеестр моделейкаталог выпущенных версий
Что этоМесто, где у каждой версии записаны метрики, срез данных, автор и статус
МинимумКаталог на MLflow или таблица в вашей базе со статусами «кандидат», «в работе», «снята»
Когда нужно большеНесколько моделей и команд, согласование выпуска
Часть контураСервискак модель отвечает
Что этоМодель в контейнере с понятным интерфейсом и проверкой входных данных
МинимумВеб-сервис на FastAPI либо пакетный запуск по расписанию
Когда нужно большеМного запросов одновременно, жёсткое время ответа, несколько копий сервиса за балансировщиком
Часть контураПайплайн обученияповторяемое переобучение
Что этоСкрипт, который по команде собирает данные, обучает и сравнивает результат с текущей версией
МинимумПайплайн в оркестраторе вроде Airflow, каждый запуск записывается
Когда нужно большеПереобучение по событиям, отдельные модели по группам
Часть контураМониторингздоровье и качество
Что этоРаботоспособность сервиса, распределения входов, доля пустых и необычных значений
МинимумМетрики в Prometheus, панели в Grafana, оповещение названному ответственному
Когда нужно большеКачество по размеченным данным, которые приходят с задержкой, сравнение версий на живом потоке
Часть контураВыпуск и откаткак менять версию
Что этоВыпуск через запись в реестре и откат на предыдущую версию по письменной инструкции
МинимумВыпуск через CI/CD с проверками до выхода, прошлая версия остаётся наготове
Когда нужно большеПостепенный перевод запросов на новую версию
Развёртывание

Как модель отдаёт ответ: пакетно, по запросу или внутри другой системы

Способ выбирается по тому, когда нужно решение. От него зависят железо, мониторинг и стоимость сопровождения.

Пакетный запуск по расписанию

Модель раз в ночь или раз в неделю считает все позиции и пишет результат в таблицу, откуда его берёт 1С, отчёт или кабинет. Так обычно работают прогноз закупок и расчёт риска поломки. Время ответа не важно, результат легко пересчитать, но данные стареют между запусками, и это нужно показывать пользователю.

Сервис с ответом по запросу

Система отправляет данные и сразу получает ответ: оценка заявки, подсказка оператору, классификация обращения. Здесь появляются требования к времени ответа, к числу одновременных запросов и к тому, что делать, если сервис недоступен. Обязательны проверка входных данных, ограничение времени ожидания и запасной сценарий: правило, прошлый результат или передача человеку.

Что проверяем до выпуска в любом режиме

  • Воспроизводимость. На тех же входах в вашей среде получаются те же ответы, что на стенде разработки.
  • Одинаковые признаки. Расчёт входных величин написан один раз и применяется и при обучении, и в сервисе, иначе модель в работе видит не то, что видела при обучении.
  • Зафиксированное окружение. Образ собирается заново без доступа в интернет.
  • Поведение на плохих данных. Пустые поля, неизвестные значения, нули вместо чисел: сервис отвечает ошибкой или запасным результатом, а не случайным числом.
  • Скорость на вашем железе. Время ответа измеряется там, где модель будет работать.
Пайплайн

Пайплайн обучения: пять шагов, что проверяем на каждом и где он ломается

Пайплайн нужен, чтобы переобучение не зависело от настроения и памяти одного человека. Каждый шаг пишет результат в журнал запуска. Выпуск в работу — отдельное решение названного человека, а не побочный эффект запуска.

Шаг
Что происходит
Что проверяем
Где ломается
ШагСбор данныхвыгрузка из учёта
Что происходитВыгрузка за период по расписанию, срез фиксируется и получает идентификатор
Что проверяемЧисло строк, диапазон дат и доля пропусков находятся в ожидаемых рамках
Где ломаетсяИсточник поменял формат, данные исправили задним числом
ШагПодготовка признаководна функция на обучение и сервис
Что происходитВходные величины рассчитываются общим кодом и для обучения, и для работы
Что проверяемНа одних и тех же записях значения признаков в обучении и в сервисе совпадают
Где ломаетсяРасчёт продублирован в двух местах и разошёлся
ШагОбучениев зафиксированном окружении
Что происходитЗапуск в контейнере с известными версиями библиотек, параметры в файле
Что проверяемТот же код на том же срезе даёт метрики в пределах ожидаемого разброса
Где ломаетсяСлучайность без зафиксированного зерна, библиотеки обновились сами
ШагСравнение с текущей версиейна периоде вне обучения
Что происходитОценка на периоде, которого модель не видела, по набору проверок, а не по одной цифре
Что проверяемНовая версия не хуже текущей по главным метрикам и по важным группам записей
Где ломаетсяСравнение на перемешанных данных
Мониторинг

Мониторинг модели: что видно сразу, а что приходит с задержкой

Работающий сервис не означает работающую модель. Следим за тремя уровнями.

Общая схема — в статье «Что такое MLOps простыми словами», разбор дрейфа и отката — в материале «Как следить за моделью в продакшене».

Уровень сервиса

Отвечает ли сервис, как быстро, сколько запросов завершилось ошибкой. Это видно сразу.

Уровень данных

Что приходит на вход: доля пустых полей, диапазоны значений, новые категории, которых не было при обучении, сдвиг распределений относительно обучающего периода. Это видно в день возникновения. Но сдвиг входов — повод посмотреть, а не повод автоматически переобучать: входы могут сдвинуться, а качество остаться прежним.

Уровень качества

Сравнение ответов модели с фактом. Факт приходит позже: заказ выкуплен через неделю, станок отказал через месяц, клиент ушёл через квартал. Поэтому качество считается с задержкой на тех записях, по которым правильный ответ уже известен. Пока он не пришёл, смотрим косвенные признаки: долю отклонённых человеком подсказок и число ручных исправлений.

Кому уходит сигнал

Оповещение без адресата превращается в шум. Для каждого сигнала записано, кто получает его первым и что проверяет. Порог ставим по выборке вашего процесса, глядя на спокойные месяцы.

Сигналы

Что делать, когда сработало оповещение: сигнал, причина, действие

Заготовка для регламента. На ваших данных строки будут другими, вопросы остаются теми же.

Сигнал
Вероятная причина
Первое действие
Кто решает
СигналВыросла доля пропусковпустые поля на входе
Вероятная причинаИсточник перестал отдавать поле или поменял формат
Первое действиеПроверить выгрузку, включить значение по умолчанию либо остановить автоматическое использование ответов
Кто решаетВладелец данных
СигналСместились распределения входовсдвиг данных
Вероятная причинаИзменились продукт, цены, сезон, состав клиентов
Первое действиеСравнить с периодом обучения и оценить качество на свежей размеченной выборке
Кто решаетВладелец модели
СигналУпало качество по фактумодель устарела
Вероятная причинаИзменился процесс или накопились изменения во входах
Первое действиеВернуть прошлую версию или переобучить на свежих данных и сравнить по стандартной процедуре
Кто решаетВладелец процесса вместе с владельцем модели
СигналВыросло время ответа или число ошибокнагрузка или ресурсы
Вероятная причинаВыросло число запросов, не хватает памяти, обновилась зависимость
Первое действиеОткатить образ сервиса на предыдущий, затем разобрать причину
Кто решаетОтветственный по сопровождению в рабочее время
Контур

Как это работает в закрытом контуре

Нет доступа в интернет

Пакеты и образы берутся из внутреннего зеркала и реестра контейнеров.

Данные не покидают периметр

Обучение идёт на ваших серверах, выгрузки лежат во внутреннем хранилище, обращения к реестру и журналу ограничены по ролям. Для данных ограниченного доступа облачные сервисы чаще не подходят по требованиям заказчика.

Видеокарты нужны не всегда

Модели для таблиц, как правило, считаются на процессорах. Видеокарта нужна нейросетям и языковым моделям, потребность оцениваем на обследовании.

Права и журнал

Видно, кто выпустил версию, на каких данных и кто имел доступ к выгрузке.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Цена называется по итогам обследования, остановиться можно после любой ступени. Внутри вилки цену двигают состояние модели и кода, число моделей и источников, требования ко времени ответа и строгость приёмки.

Обследование: модель, данные, контур

Что за модель, где она обучалась и работает, кто владеет данными и решениями на её основе. На выходе список разрывов, целевой контур и вилка бюджета. Вычитается из первого этапа, если продолжаете с нами.

200 000 ₽ · 2–3 недели

Обследование: несколько моделей и систем

Несколько моделей, источников и потребителей, обмены с 1С и хранилищем. Добавляется схема обменов и матрица источников.

350 000 ₽ · 3–4 недели

Лёгкий пилот: одна модель в сервисе

Версии, реестр, сервис или пакетный запуск и оповещения по главным сигналам для одной модели. Подходит, если модель уже есть.

150 000–400 000 ₽ · 2–8 недель

Тяжёлый пилот: пайплайн и мониторинг качества

Повторяемое переобучение, сравнение версий, мониторинг качества по размеченным данным, интеграция с вашими системами и регламент выпуска.

400 000–1 200 000 ₽ · 2–3 месяца

Вывод в эксплуатацию

Опытная эксплуатация на боевых данных, регламент выпуска и отката, обучение ответственных, передача исходников и инструкций. Этапы с отдельной приёмкой.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽ · от 3 месяцев

Сопровождение

Присмотр за мониторингом, разбор срабатываний, плановые обновления и переобучение с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

Недели 1–3 — Обследование

Читаем код модели, смотрим данные и места, где её ответы используются. Проверяем, воспроизводится ли результат. Итог: список разрывов и вилка бюджета.

Дальше 2–8 недель — Лёгкий пилот

Упаковываем одну модель в сервис или пакетный запуск, заводим реестр и версии, настраиваем главные сигналы мониторинга.

Параллельно — Проверка воспроизводимости

Собираем модель заново с нуля в чистом окружении по инструкции и сверяем ответы с текущей версией. Расхождения разбираем до выпуска.

2–3 месяца — Пайплайн и мониторинг качества

Если задача требует, делаем повторяемое переобучение, сравнение версий и регламент выпуска и отката. Откат пробуем на практике.

Дальше — Опытная эксплуатация и передача

Работаем на боевых данных, смотрим срабатывания, уточняем пороги. Передаём исходники, образы, инструкции и регламент. Дальше развитие или сопровождение.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Исходный код сервиса, пайплайнов и настроек в вашем репозитории с первого коммита.
  • Реестр моделей, выгрузки и журнал запусков на ваших серверах.
  • Инструкция по сборке с нуля, по выпуску и по откату, проверенная на практике.
  • Регламент: кто владеет данными, моделью и решением, кто получает сигналы.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не строим общую платформу данных и не внедряем систему целиком за десятки миллионов: делаем контур под ваши модели.
  • Не держим ваши модели и данные у себя и не оказываем хостинг.
  • Не дежурим круглосуточно: сигналы мониторинга разбираются в рабочее время по записанному регламенту.
  • Не проводим аттестацию и не имеем лицензии ФСТЭК.
  • Не обещаем качество модели заранее: его измеряем на вашей выборке.
  • Не берём работы дешевле 150 000 ₽.
Граница

MLOps, разработка модели или вывод пилота в эксплуатацию: где граница

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

Если вы развёртываете языковую модель на своём сервере, то основу описывает страница LLM на своём сервере, а скорость и загрузку железа разбирает страница про оптимизацию инференса. MLOps здесь добавляет версии, оценку качества и порядок обновления.

Присмотр после выпуска — сопровождение. Если модель оказалась частью чужой системы, которую сначала надо понять, начинают с аудита кода и архитектуры.

Инструменты

На чём собираем

Модели, версии и пайплайны
  • Python, scikit-learn, градиентный бустинг и PyTorch по задаче
  • MLflow или таблица в вашей базе для реестра и метрик
  • DVC или версионирование выгрузок в хранилище
  • Airflow или планировщик, который у вас уже есть
Сервис, мониторинг и развёртывание
  • FastAPI, ONNX Runtime там, где нужна скорость на процессоре
  • Docker, внутренний реестр образов, GitLab CI
  • Prometheus и Grafana, библиотеки проверки дрейфа вроде Evidently
  • PostgreSQL и S3-совместимое хранилище на ваших серверах
Материалы

Материалы по теме

Статья

Что такое MLOps простыми словами и когда он нужен

Чем модель отличается от обычного кода, что такое дрейф данных и когда MLOps не нужен.

  • Дрейф данных
  • Что входит на практике
  • Когда не нужен
Читать →
Статья

Как подготовить данные для ИИ-пилота

Что проверить в данных до начала работ: выгрузка, разметка, права.

  • Выгрузка
  • Разметка
  • Права на данные
Читать →
Статья

Почему ИИ-пилоты не доходят до продуктива

Где пилот застревает между демонстрацией и ежедневной работой.

  • Владелец результата
  • Интеграция
  • Критерий приёмки
Читать →
Заявка

Разберём, как ваша модель выйдет в работу и как за ней следить

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

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: mlops и развёртывание моделей

Сколько стоит внедрение MLOps?

Обследование стоит 200 000 ₽ за одну-две модели и 350 000 ₽ за несколько моделей и систем; оно вычитается из первого этапа, если продолжаете с нами. Пилот с упаковкой одной модели — 150 000–400 000 ₽, с пайплайном и мониторингом качества — 400 000–1 200 000 ₽. Вывод в эксплуатацию — от 1 500 000 ₽ этапами по 300 000–700 000 ₽, сопровождение — от 20 000 ₽ в месяц.

Нужен ли MLOps, если модель одна?

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

Можно ли взять модель, которую сделали не вы?

Да. Сначала собираем модель заново в чистом окружении и сверяем ответы. Если исходников обучения нет, а есть только файл весов, говорим об этом заранее: такую модель можно упаковать в сервис, но переобучить без данных и кода нельзя.

Как часто переобучать модель?

Календарное правило подходит редко. Частота определяется тем, как быстро меняются данные и процесс, и тем, что показывает мониторинг качества. Для медленных процессов переобучение раз в квартал или раз в год, для быстрых — по сигналу.

Как понять, что модель стала хуже, если факт приходит с задержкой?

Пока факт не пришёл, смотрим косвенные признаки: сдвиг входов, долю пустых значений, число ручных исправлений и отклонённых человеком подсказок. Когда факт приходит, считаем качество на этих записях и сравниваем с периодом приёмки.

Кому принадлежат модель, пайплайн и данные?

Вам. Исходный код, конфигурации, обученные модели и документация передаются по акту, порядок передачи прав записывается в договоре. Персональные данные граждан России обычно должны храниться на серверах в России.

Как устроено сопровождение?

Ежемесячно: 20 000, 60 000 или 120 000 ₽ в месяц, до 4, 12 или 25 часов. Часы уходят на разбор срабатываний мониторинга, плановые обновления и переобучение. Сверх пакета — 5 000 ₽ в час по согласованию до начала. Круглосуточного дежурства нет.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.