Модели машинного обучения становятся критически важными для бизнеса, помогая оптимизировать процессы и принимать более обоснованные решения. Однако их актуальность и точность могут быстро снижаться из-за изменения данных. Автоматическое переобучение моделей в продакшене решает эту проблему, обеспечивая обновление и улучшение моделей без значительных временных затрат.
В этой статье мы рассмотрим процесс автоматического переобучения моделей ML в продакшене, используя инструменты MLOps. Обсудим интеграцию таких инструментов, как AirFlow и Spark, с CI/CD пайплайнами, а также создание конфигурационного модуля, позволяющего разработчикам сосредоточиться на моделях, не углубляясь в инфраструктурные детали.

Обычно DevOps пайплайны строятся на основе CI/CD инструментов, таких, как сборка образов и деплой на Kubernetes. Однако в контексте машинного обучения требуются более специфичные инструменты, такие, как AirFlow и Spark.
Для интеграции Spark с Kubernetes мы используем специальные операторы, которые управляют запуском SparkApplication и созданием Spark сессий в рамках Pod. AirFlow работает с DAG — ацикличными графами, описываемыми на Python. Эти технологии имеют свои способы запуска: от отдельных манифестов Kubernetes до скриптов на Python.
Так, для обучения и запуска моделей мы разработали Python-модуль, который на основе входной конфигурации от разработчика позволяет обучать и выкладывать модели без глубоких знаний инфраструктуры. Модуль служит связующим звеном между знаниями DS о модели и инфраструктурой.
DS создают конфигурационный файл в своём репозитории для работы с нашим модулем. В файле указывается информация о модели: время и интервал запуска DAG-ов, параметры для Spark-сессии, версия Python для запуска модели и другие параметры для обучения, выкладки и мониторинга. Задача модуля — взять пользовательскую конфигурацию, создать на её основе Spark Application, DAG и разместить всё это в AirFlow Scheduler в рамках пайплайна, написанного на Jenkins.
Процесс начинается с загрузки кода и его тестирования. После проверок кода происходит сборка окружения модели и сохранение архива с ним в S3 хранилище.
Вы возможно удивитесь и спросите «А где Docker образы?». Здесь мы отказались от стандартного подхода со сборкой Docker-образов в пользу хранения tar.gz архивов по следующим причинам:
-
Скорость: сборка и загрузка архива занимает меньше времени, чем создание и загрузка больших Docker-образов.
-
Отладка: имея архив с окружением, можно легко его скачать, например, в JupyterLab, создать новое окружение и протестировать модель.
После подготовки окружения и его сохранения, модуль MLOps создает необходимые манифесты на основе конфигурации пользователя и передает их в AirFlow. Пайплайн Jenkins на этом завершает свою работу и все дальнейшие действия происходят в AirFlow.
Теперь у нас есть готовое окружение для работы модели, DAG для AirFlow и манифест для запуска SparkApplication в кластере. Мы можем запустить обучение.
В рамках DAG используем популярный Spark Operator, который создает Spark сессии и ожидает их завершения.
-
Первая таска запускает сессию Spark: в Kubernetes создаётся сущность Spark Application, манифест которой был передан в Scheduler на предыдущем этапе. Spark Application создает Pod, в котором начинается обучение модели.
-
Вторая таска Spark Wait отслеживает состояние Spark Application после его создания.
После завершения обучения также выполняется проверка точности модели (quality gate). Если модель проходит проверку, она помечается в MLFlow соответствующей меткой и может участвовать в дальнейших циклах запуска и переобучения. Для инференса и мониторинга DAG имеет аналогичную структуру.
Давайте ещё раз посмотрим верхнеуровнего, что происходит.
У нас есть конфигурационный файл от DS, на основе которого у нас подготавливается DAG в Jenkins пайплайне. В нашем подходе в репозитории с моделью у DS находятся скрипты обучения, инференса, проверки качества и мониторинга.
Если у нас запущен пайплайн по обучению, то в DAG запускается обучение и последующая проверка качества. Если у нас запущен пайплайн инференса, то запускается соответствующий скрипт. Аналогичное происходит и с мониторингом. Параметры для всех DAG-ов и SparkApplications выставляются в зависимости от того, что указано в конфигурации от DS.
Таким образом у нас реализованы процесса как обучения, так и запуска моделей с проверкой их качества. В случае если модель теряет свою точность, то это может отследить DAG мониторинга и впоследствии запустить её автоматическое переобучение и выкладку.
Однако, после настройки процессов возникает вопрос: как объединить работу пайплайнов на нескольких стендах для применения переобучения в продакшене? Здесь нам помогает технический пайплайн, который занимается промоутингом моделей по стендам.
Как ранее было сказано, в репозитории с моделью у DS есть скрипты для реализации логики обучения, выкладки, проверки качества и мониторинга. После обучения и проверки качества скрипт возвращает результат и обращается к нашему пайплайну с промоутером.
В последних версиях MLFlow были добавлены тэги и алиасы для разных версий модели. Тэги в MLFlow позволяют добавлять метаданные к моделям и их версиям для их описания и классификации, что облегчает поиск и управление. Алиасы служат для создания удобных ссылок на конкретные версии моделей, что упрощает переключение между ними и управление их состояниями (например, production, staging).
Логика промоутера проста:
-
Если модель обучена качественно, ставится тэг
successи выставляется алиас с названием стенда, который не может повторяться для других версий одной модели и четко помечает актуальную. Далее запускается пайплайн выкладки и копирование окружения в S3 хранилище на следующем стенде. -
Если модель не проходит проверку качества, она помечается тэгом
failed, но продолжает существовать.
У нас есть четыре среды: разработка MDP (model development platform), две для тестирования SIM (system of inference models) INT/LT и продакшн SIM Prom. На среде разработки DS создают модель и запускают её обучение. После проверки качества промоутер запускает инференс и параллельно отправляет окружение на следующий стенд.
Модель запускается и тестируется на средах разработки, тестирования и последовательно проталкивается на продакшн. Когда модель успешно проходит тестирование и выдерживает нагрузку, она запускается на продакшене и работает в штатном режиме с периодическими проверками от мониторинга. В случае падения точности, мониторинг отслеживает это, модель переобучается и запускается заново.
Автоматическое переобучение моделей машинного обучения в продакшене является важным шагом для обеспечения их актуальности и точности. В этой статье мы рассмотрели ключевые аспекты внедрения данного процесса в достаточно популярную связку AirFlow и Spark.
Мы рассмотрели, как можно организовать инфраструктуру и интеграцию специализированных инструментов, чтобы минимизировать участие разработчиков в инфраструктурных задачах и позволить им сосредоточиться на создании и улучшении моделей.
Применение этих практик и инструментов позволяет значительно улучшить производительность и надежность моделей машинного обучения, а также ускорить процесс их внедрения в продакшен. Это, в свою очередь, способствует более эффективному использованию данных и повышению качества бизнес-процессов.
Надеемся, что представленные рекомендации и примеры помогут вам в реализации автоматического переобучения моделей в вашей организации, и вы сможете извлечь максимальную пользу.
ссылка на оригинал статьи https://habr.com/ru/articles/821447/
Добавить комментарий