Данила Кузнецова и Натальи Царьковой.

Введение

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

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

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

Выбор правильных инструментов для организации этапов конвейера затруднен из-за их огромного разнообразия. Мы сузили наш выбор до трех: Kubeflow Pipelines, Airflow и Prefect.

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

Проблема

Наша команда использует Kubeflow Pipelines. Выбор Kubeflow был обусловлен наличием Kubernetes и коллег, имевших опыт работы с настройкой Kubeflow и Kubernetes. Как это часто бывает в жизни, сотрудники ушли на другие проекты, и в какой-то момент мы начали задумываться, а есть ли инструмент, который подходил бы под наши нужды лучше, чем Kubeflow?

Нам не понравилось несколько вещей в Kubeflow. Во-первых, необходимость подготовки файлов .yaml для каждого компонента пайплайна была неясной. Во-вторых, невозможно запустить пайплайн Kubeflow локально, без предварительной установки Kubernetes и сборки образа с вашим кодом. Это значительно замедлило процесс отладки. В-третьих, процесс CI/CD, который создавал образы Docker и развертывал конвейер в кластере Kubeflow, занимал до 10 минут в зависимости от рабочей нагрузки Gitlab. CI/CD был необходим для внесения даже малейших изменений в код моделей, что могло привести к часам ожидания.

В нашем случае нам нужно было иметь дело только с рабочими процессами машинного обучения. В то же время модели отличаются сложностью архитектуры и необходимостью работы с большими объемами данных.

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

Давайте рассмотрим каждый из инструментов и их ключевые особенности.

Обзор оркестраторов

В качестве меры популярности каждого инструмента мы можем использовать количество звезд Github, указанное ниже:

Airflow уже несколько лет является одним из самых популярных инструментов оркестровки.

Расход воздуха

Airflow — это платформа для создания, мониторинга и организации конвейеров. Этот проект Python с открытым исходным кодом был создан в 2014 году компанией Airbnb, а с 2016 года разрабатывается Airflow Apache Software Foundation.

Apache Airflow позволяет проектировать, планировать и отслеживать сложные рабочие процессы. Он может запускать код Python, работать в кластере Hadoop, выполнять команды Bash, поднимать контейнеры и модули Docker в Kubernetes, запрашивать вашу базу данных и многое другое. Airflow используется для организации конвейеров в различных областях, а не только в машинном обучении. Наиболее распространенным примером является конвейер данных, который извлекает данные из одного источника, преобразует их и сохраняет в другом источнике, таком как база данных.

По состоянию на 2023 год Airflow является самым популярным оркестратором на рынке.

Трубопроводы Kubeflow

Kubeflow — это бесплатная платформа машинного обучения с открытым исходным кодом, которая позволяет развертывать конвейеры в Kubernetes. Kubeflow был выпущен в 2017 году разработчиками из Google, Cisco, IBM, Red Hat и других технологических компаний. Kubeflow работает поверх Kubernetes, полностью интегрирован с ним и использует преимущества кластерных функций, таких как масштабируемость и гибкое управление ресурсами. «Kube» в Kubeflow означает инструмент оркестрации для контейнерных приложений Kubernetes. «Flow» означает, что Kubeflow стоит рядом с другими планировщиками рабочих процессов, такими как ML Flow и Airflow. Kubeflow позиционирует себя в основном как инструмент для организации пайплайнов машинного обучения.

префект

Prefect — относительно новый, но перспективный инструмент для оркестровки, появившийся в 2018 году. Инструмент позиционирует себя как замена Airflow, отличаясь большей гибкостью и простотой. Это проект с открытым исходным кодом; однако есть платная облачная версия для отслеживания рабочих процессов.

Привлекательной особенностью Prefect для нас была возможность легко построить конвейер из функций, а также отлаживать/запускать его локально без какой-либо сложной настройки среды. Конвейер «hello world» занял у нас всего несколько строк кода! И для установки требуется только установка библиотеки Prefect Python с помощью pip.

Наш подход

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

Результаты и выводы этого эксперимента описаны ниже.

Преимущества

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

Воздушный поток:

  • Интерфейс очень интуитивно понятен и прост в использовании, с различными визуализациями и протоколированием процесса.
  • Организация экспериментов, запусков и конвейеров в веб-интерфейсе: все запуски и действия существуют внутри конвейера (меньше визуальной перегруженности по сравнению с Kubeflow).
  • Работает в заданной среде и не требует образов Docker для пайплайнов. Таким образом, нет необходимости в сложной CI/CD. Также пайплайны регистрируются автоматически.
  • Airflow — зрелый и популярный инструмент, а его большое сообщество также предоставляет документацию и поддержку. Ответы на большинство вопросов можно легко найти в Интернете.
  • Airflow интегрируется со многими инструментами через операторов, таких как MySqlOperator, BashOperator, SparkSubmitOperator и т. д.

Кубфлоу:

  • Kubeflow предоставляет большую гибкость в организации пайплайнов и их версий: может быть несколько версий одного и того же пайплайна и все они сохраняются, а не только последняя. Откатиться на любую предыдущую версию несложно.
  • Поддержка пользовательских сред для разных пайплайнов благодаря контейнеризации. Это может быть очень полезно в случае нескольких моделей машинного обучения, использующих разные версии Python или модуля.
  • Каждый проект машинного обучения может быть отдельным репозиторием Git с CI/CD, который регистрирует пайплайны в Kubeflow.
  • И последнее, но не менее важное: в нашем случае не было необходимости переходить на другую систему.

Префект

  • Легко настроить локально и запустить конвейер «hello world». В целом локальная отладка и выполнение очень удобны.
  • Плавное развертывание: легко создать новый конвейер, а также другую версию уже существующего, и для этого требуется всего одна строка кода.
  • Дальнейшее взаимодействие с конвейером также интуитивно понятно в отношении запуска, планирования или изменения конвейеров. Конвейеры сгруппированы вместе в соответствии с версией. В целом, веб-интерфейс прост в использовании.
  • SSO-вход через почту.

Недостатки

Воздушный поток:

  • В среде воздушного потока должны быть все библиотеки, которые импортируются во все DAG. Без использования контейнеризации все конвейеры Airflow запускаются в одной среде. Это приводит к ограничениям в использовании экзотических библиотек или конфликтующих версий модулей для разных проектов.
  • Конвейеры не версионируются, и всегда используется последний код.
  • Существует сильное ограничение на структуру и организацию кода: все DAG должны находиться в одной папке, чтобы они попали в airflow. Это означает, что все модели должны находиться в одном репозитории.

Кубфлоу:

  • Запуск локального конвейера возможен только в том случае, если на вашем компьютере установлен Kubernetes. Правильно настроить Kubernetes, а также поддерживать его сложно. Установка Kubeflow поверх него… Ну ладно.
  • Отсутствие структуры в запусках и пайплайнах: каждый отдельный прогон представлен строкой в ​​общем списке всех прогонов, без какой-либо группировки. При этом штатные прогоны и пайплайны показаны отдельно.
  • В общем, графический интерфейс не интуитивно понятен. а простые операции требуют слишком много действий. Например, для обновления запланированного конвейера до последней версии требуется создать новый конвейер, поместить его в расписание, а затем удалить старый.
  • Для каждого обновления конвейера требуется CI/CD, включая перестроение образа и повторную регистрацию конвейера, что может занять много времени.
  • Может быть случай, когда пользователь хочет запустить рабочие процессы за указанный исторический период. Например, если конвейер несколько раз выдавал ошибку в прошлом месяце, и нам нужно перезапустить неудавшиеся запуски конвейера. В Airflow этот процесс известен как обратная засыпка, тогда как Kubeflow не поддерживает автоматические запуски конвейера в разные периоды времени в прошлом.

Префект:

  • Если поток не упакован в один файл, его невозможно зарегистрировать с одной машины и запустить на другой. Все вспомогательные файлы должны быть помещены в контейнер Docker, что обычно требует настройки конвейера CI/CD. Все это затрудняет использование Prefect в случае сложных пайплайнов с участием вспомогательных файлов.
  • Это сравнительно новый инструмент, который пока не имеет развитого и зрелого сообщества. На самом деле доступно только два источника информации: Slack-канал и официальная документация. В интернете мало информации.
  • В настоящее время Prefect переходит с версии 1 на вторую версию, и сроки не так ясны. В рамках этого перехода может потребоваться миграция потоков с версии 1 на версию 2.
  • Локальная версия имеет ограниченный функционал: для полной версии требуется подключение к облаку. Использование облачной версии может вызвать опасения в отделе безопасности. Иногда нежелательно, чтобы сервер был подключен к Интернету или передал производственные данные (в данном случае метаданные конвейера) третьей стороне.

Краткое содержание

Итак, суммируем плюсы и минусы каждого инструмента:

Заключение. Что использовать?

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

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

Кубфлоу. Если вы уже используете Kubernetes и хотите запустить конвейеры машинного обучения, Kubeflow — правильный выбор.

Пост скриптум

Мы надеялись, что будет явный победитель. Но по мере того, как мы углублялись в аспекты каждого оркестратора, мы поняли, что выбор будет непростым. В конечном итоге, изучив, как можно преодолеть некоторые неудобства в Kubeflow, мы решили продолжить его использование. Несмотря на то, что пользовательский интерфейс мог бы улучшить ясность, мы не хотели отказываться от преимуществ настроенной CI/CD и контейнеризации, которые позволяли нам использовать разные среды. Также для наших проектов удобно разрабатывать каждый пайплайн ML в отдельных репозиториях Git.

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

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