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

Эта статья находится в:

Вступление:

Я присоединился к Future Demand 2 года назад в качестве инженера-программиста, и в течение последнего года мы с моей командой работали с Metaflow, и в этой статье я хочу обобщить наш опыт его использования.

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

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

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

Что такое Metaflow?

Metaflow - это платформа, которая помогает специалистам по данным управлять, развертывать и запускать свой код в производственной среде. И это ускоряет процесс разработки, отслеживая эксперименты, проводимые специалистами по данным.

Pre Metaflow:

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

Если вернуться на шаг назад во времени, то этот код изначально был написан на Jupyter. Затем он был извлечен и переработан нашей командой для запуска в качестве чистых скриптов Python для автоматизации.

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

В игру вступает Metaflow:

В то время наш код машинного обучения можно было описать как DAG (направленный ациклический граф).

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

Самостоятельного управления рабочим процессом не было преимуществ, поэтому мы решили использовать фреймворк для запуска и управления кодом за нас.
Использование фреймворка может помочь нам во многих аспектах. Например, автоматизация, распараллеливание, оркестровка, отработка отказа (возобновление после сбоя определенного шага) и т. Д.

Проведя небольшое исследование, мы нашли много вариантов, таких как (Luigi, Airflow, Metaflow, MLflow), и, поскольку мы были впечатлены высоким уровнем интеграции между Metaflow и AWS, мы решили использовать Metaflow.

Терминология Metaflow:

Metaflow Flow:

Поток - это основная концепция в Metaflow, это часть кода, описывающая шаги, которые вы хотите выполнить, и порядок выполнения этих шагов.

Давайте рассмотрим DAG, представленный на изображении ниже:

В принципе, этот поток можно реализовать с помощью python:

А поток можно легко выполнить следующим образом:

Metaflow Run:

Концепция запуска Metaflow - по крайней мере для меня - была чем-то новым и умным.
По сути, каждый раз, когда вы или любой другой член команды запускаете поток - локально или на AWS - все метаданные, связанные с потоком, будут автоматически сохраняться для последующего использования в центральной базе данных или на S3.

Например:

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

Сервис Metaflow:

Как я уже упоминал в предыдущем разделе, отслеживается каждый запуск Metaflow, но как это происходит?
Короче говоря, работает клиентский сервер API (на AWS).
Мы называем это метасервисом Metaflow, и каждый раз, когда поток выполняется (локально или на AWS), все метаданные о вашем запуске будут передаваться в центральную базу данных - под капотом - с использованием мета услуга.

Примеры использования Metaflow:

Я упомяну некоторые примеры использования, в которых мы могли бы извлечь пользу из Metaflow и как это могло бы значительно упростить наш процесс разработки и развертывания:

Отслеживание и управление версиями:

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

Должен быть более удобный способ сделать это, верно?

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

Проверить ваши исторические прогоны очень просто, и это можно объяснить с помощью этого фрагмента кода:

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

Масштабирование и облачная интеграция:

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

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

В последнем фрагменте кода и с помощью пакетного декоратора для шага a мы принудительно выполнили этот точный шаг на AWS, используя запрошенные ресурсы памяти и ЦП, при этом используя наши IDE для выполнения кода.

Развертывание:

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

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

Это пример:

И поток был отражен как конечный автомат пошаговых функций на AWS:

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

Вот как выглядят пошаговые функции для наших потоков на AWS:

Позже мы построили простой конвейер развертывания и прикрепили его к нашим репозиториям кода. Каждый раз, когда кто-то отправлял новые изменения в определенную ветку, все изменения отражались непосредственно в соответствующей пошаговой функции.

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

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

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

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

Отладка и возобновление неудачных потоков:

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

Наконец-то …

В заключение, использование Metaflow в некоторых аспектах было для нас так же важно, как и использование Git для самого кода. И это дало нашим специалистам по обработке данных возможность управлять своим кодом на протяжении всего его жизненного цикла до развертывания. Кроме того, это дало нам (инженерам) больше времени, чтобы сосредоточиться на других частях системы.

Прежде чем ты уйдешь …

Спасибо за чтение! Надеюсь, вам понравилась статья ... Если вы хотите связаться со мной, не стесняйтесь связаться со мной по адресу [email protected] или в моем профиле LinkedIn, также вы можете подписывайтесь на меня на Medium, чтобы узнать больше.