Объединение современной платформы машинного обучения и бессерверной системы

Обзор

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

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

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

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

Благодаря Metaflow специалистам по данным и инженерам по машинному обучению стало проще запускать рабочие процессы машинного обучения как локально, так и с использованием облачных ресурсов (а также быстро переключаться между ними!). Однако облачные ресурсы имеют свои особенности и тонкости, которые не всегда идеальны для науки о данных и машинного обучения:

  • @batch: медленный и зависимый от особенностей AWS. В некоторых случаях, если количество параллельных задач превышает доступные ресурсы, система может замедлиться или выйти из строя. Это работает, но нарушает «отличный опыт разработчиков», который является одной из догм Metaflow.
  • @kube: Несмотря на множество преимуществ, существуют некоторые ограничения на его использование:
    – Сложность: запуск рабочих процессов в кластерах Kubernetes требует определенного уровня технических знаний и знаний Kubernetes.
    – Масштабируемость. Хотя кластеры Kubernetes созданы для масштабируемости, выполнение рабочих процессов не всегда может привести к линейному повышению производительности. В зависимости от сложности рабочего процесса и размера кластера параллельное выполнение задач или в желаемом масштабе может оказаться невозможным.

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

Бессерверные технологии здесь… чтобы помочь

Бессерверные платформына бумаге являются идеальными кандидатами на то, чтобы получить пирог и съесть его: выполнение кода происходит быстро (по сравнению с @batch), а базовые вычисления полностью управляются. и абстрагируется (по сравнению с @kube).

Как сказал мудрец, «теоретически нет разницы между теорией и практикой — но на практике она есть»: при использовании бессерверного решения облачного поставщика есть некоторые компромиссы, которые следует учитывать:

  • Холодный старт: это наиболее распространенная проблема с производительностью, относящаяся к созданию экземпляра контейнера, который будет выполнять код функции, а также к этапу инициализации. Обычно это происходит, когда функция вызывается впервые или изменяется ее конфигурация, когда функция масштабируется или просто когда функция не вызывалась какое-то время. Разница между "холодным" и "теплым" запуском затрудняет последовательное прогнозирование производительности.
  • Ограничения инструментов, инструменты развертывания/упаковки. Инструменты развертывания взаимодействуют с платформой обычно через API, и это затрудняет согласованную обработку зависимостей и развертывание с одной платформы на другую, поскольку эти API не стандартизированы. .
  • Ограничения инструментов, среды выполнения. Функции выполняются с ограниченными ресурсами ЦП, памяти, диска и ввода-вывода, и в отличие от устаревших серверных процессов они не могут работать бесконечно. Это правда, что по мере того, как базовая аппаратная платформа становится более мощной, эти ограничения ресурсов все больше и больше уменьшаются.
  • Привязка к поставщику: сильная зависимость от конкретного поставщика облачных услуг затрудняет или делает дорогостоящим переход к другому поставщику или перенос рабочей нагрузки собственными силами, что создает различные проблемы и риски, такие как:
  • Увеличение затрат на переход: из-за изменения архитектуры приложений, переноса данных и обучения персонала новым инструментам и сервисам.
  • Ограниченная гибкость: использование конкретных поставщиков облачных услуг ограничивает возможность настройки услуг или инфраструктуры, что влияет на возможность внедрения инноваций, оптимизации затрат или адаптации к меняющимся потребностям бизнеса.
  • Зависимость от проприетарных услуг: поставщики облачных услуг предлагают услуги, тесно связанные с их платформой, поэтому может быть сложно переключиться на другого поставщика или воспроизвести эти услуги собственными силами.
  • Ценовые и договорные риски: привязка к конкретному поставщику облачных услуг подвергает риску ценовые и/или договорные риски. Например, поставщики облачных услуг могут повысить цены, изменить соглашение об уровне обслуживания или прекратить предоставление услуг без предварительного уведомления.

В целом, Metaflow — это мощный и гибкий инструмент для управления всем рабочим процессом обработки данных, от приема данных до развертывания модели. Он был разработан с учетом портативности и гибкости, чтобы свести к минимуму вышеупомянутые проблемы и риски, но это правда, что с вычислительной стороны все еще существует необходимость полагаться на некоторые конкретные сервисы облачных провайдеров (AWS и/или Azure), и обычно этим компонентам не хватает гибкости и возможности настройки.

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

Нуволарис 101

Компания Nuvolaris начала с идеи внедрения портативной и открытой платформы на базе бессерверного движка Apache Openwhisk, упрощающей процесс создания и развертывания облачных приложений.

Nuvolaris предоставляет решения и инструменты для решения некоторых из вышеперечисленных проблем:

  • Холодный старт: Nuvolaris использует возможности OpenWhisk для предварительного разогрева заданного количества экземпляров среды выполнения с предопределенным распределением ресурсов (в настоящее время ограничено требованиями к памяти). Это значительно ускорит время выполнения бессерверного действия, поскольку в момент поступления запроса на выполнение функции среда выполнения уже запущена и ожидает обработки запроса. Этого можно добиться без необходимости использования дополнительных компонентов для поддержания функции в рабочем состоянии (например, задания cron). Nuvolaris предоставляет специальные среды выполнения с поддержкой AI/ML, чтобы расширить возможности OpenWhisk и для сценариев AI/ML.
  • Ограничения инструментов, инструменты развертывания/упаковки: Nuvolaris CLI дает возможность развернуть полный бессерверный API, используя возможности пакета OpenWhisk, которые по сути объединяют одну или несколько бессерверных функций на основе структуры на основе папок. Зависимости можно добавить, включив их в папку действий (иногда через диспетчер пакетов, например, в случае действия js) и заархивировав все вместе. В относительно простых случаях вообще нет необходимости вводить конвейеры CI/CD, поскольку развертывание можно полностью контролировать с помощью инструмента nuv CLI. Тем не менее, конвейеры CI/CD являются рекомендуемым подходом для сложных сценариев.
  • Ограничения инструментов, среды выполнения: Nuvolaris дает возможность настраивать конфигурацию OpenWhisk, позволяя развертывать бессерверные функции с определенной памятью и временем ожидания, устанавливая значения, которые могут выходить за рамки типичных ограничений других бессерверных платформ (например, AWS Lambda например). Настройка CPU/GPU еще впереди, но она уже включена в дорожную карту функций Nuvolaris.
  • Привязка к поставщику: Nuvolaris построен на большом и надежном наборе программного обеспечения с открытым исходным кодом, начиная с наиболее важного компонента — бессерверного движка OpenWhisk. Здесь применяется принцип «написать один раз — развернуть везде». В определенной степени это все еще можно считать своего рода привязкой к поставщику, поскольку приложения необходимо разрабатывать на основе предоставленных компонентов, с той разницей, что созданные артефакты могут быть развернуты в любой поддерживаемой среде выполнения Kubernetes и перемещены от одного облачного провайдера. в другой без каких-либо дополнительных усилий по разработке, включая локальные центры обработки данных.

Хотя OpenWisk, лежащий в основе Nuvolaris, обычно ассоциируется с микросервисами, принципиальных причин останавливаться на достигнутом нет. И именно поэтому, начав использовать Metaflow, мы задали себе вопрос:

«Если бессерверная платформа способна выполнять функции, как насчет выполнения @step Metaflow как функции»?

Оказывается, мы можем, и мы объясним, как это сделать, в следующем разделе.

Декоратор @nuvolaris

Наш прототип @nuvolaris реализует декоратор шагов, который может использоваться «планировщиком» Metaflow для развертывания и выполнения бессерверной функции внутри среды выполнения OpenWhisk в качестве альтернативы @batch и @kube для удаленного выполнения.

Пользовательский интерфейс так же прост, как и все функции Metaflow: достаточно добавить декоратор @nuvolaris к функции @step в потоке! Например, следующий небольшой конвейер реализует параллельное выполнение шага через nuvolaris:

from metaflow import FlowSpec, step, nuvolaris

class ForeachFlow(FlowSpec):
    @step
    def start(self):
        self.titles = ['Stranger Things',
                       'House of Cards',
                       'Narcos',
                       'Suburra',
                       'Star Trek',
                       'Mission Impossible',
                       'Mission Impossible 2',
                       'Mission Impossible 3',
                       'Rogue']
        self.next(self.a, foreach='titles')

    @nuvolaris(namespace="nuvolaris", action="each", memory=256, timeout=120000)
    @step
    def a(self):
        self.title = '%s processed' % self.input
        self.next(self.join)

    @step
    def join(self, inputs):
        self.results = [input.title for input in inputs]
        self.next(self.end)

    @step
    def end(self):
        print('\n'.join(self.results))

if __name__ == '__main__':
    ForeachFlow()

При запуске приведенного выше кода Metaflow запускает параллельное выполнение функций @nuvolaris, развертывая за сценой «действие» с указанными параметрами в OpenWhisk и запуская опрос на предмет завершения:

2023-03-21 19:40:01.386 [1679427598783956/start/1 (pid 579034)] Foreach yields 9 child steps.
...
2023-03-21 19:40:04.932 [1679427598783956/a/9 (pid 579231)] creating action each with memory=256 and timeout=120000
...
2023-03-21 19:40:05.448 [1679427598783956/a/9 (pid 579231)] checking completion of nuvolaris activation a731a8fd14924f95b1a8fd14927f9527

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

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

Подводя итог нашему опыту, мы считаем, что Nuvolaris хорошо подходит для Metaflow, предлагая готовые функции, которые особенно подходят для сценариев машинного обучения:

  • Дает возможность легко назначать удаленные вычислительные ресурсы аналогично существующим плагинам @batch и @kube.
  • Nuvolaris будет поддерживать среду выполнения, специфичную для AI/ML:
  • Это обеспечит отличный опыт разработки при экспериментировании с Metaflow, поскольку на время выполнения не влияют проблемы с холодным запуском, и это достигается за счет использования возможностей OpenWhisk для предварительного разогрева и настройки таких сред выполнения.
  • Это упростит бремя управления зависимостями.
  • Можно настроить параметры тайм-аута и памяти, минуя типичное ограничение других бессерверных платформ, таких как, например, AWS Lambda.
  • Возможности противодействия OpenWhisk предлагают надежный способ гарантировать, что длительные и параллельные задачи машинного обучения могут быть выполнены без ущерба для общего выполнения потока.

Где мы сейчас и что будет дальше

В настоящее время плагин Nuvolaris Metaflow поддерживает параметры настройки Openwhisk для пространства имен, имени действия, памяти и времени ожидания; он реализован, начиная с ответвления Metaflow 2.7.14, и выполняет действия через специальную среду выполнения Python Openwhisk с необходимыми демонстрационными зависимостями.

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

  • Добавить поддержку дополнительного параметра настройки OpenWhisk, например количества процессоров.
  • Добавить поддержку выполнения кода Metaflow на оборудовании с поддержкой графического процессора (например, через плагины Kubernetes).
  • Предоставление и поддержка сред выполнения OpenWhisk Python с поддержкой машинного обучения и искусственного интеллекта.
  • Улучшает взаимодействие с API OpenWhisk для запуска и мониторинга выполнения каждой конкретной функции.
  • Интегрируйте @nuvolaris в качестве официального плагина Metaflow. Хорошо, это очень амбициозно, но, поскольку компания с открытым исходным кодом Nuvolaris полностью поддерживает инициативу открытого исходного кода, и вклад в другие успешные проекты вовсе не кажется плохой идеей.

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