Metaflow — отличный инструмент для конвейеров MLOps благодаря своим мощным функциям, таким как управление версиями, отслеживание и легкая масштабируемость. Однако есть существенный недостаток: он глубоко интегрирован с AWS, что может стать препятствием для локального развертывания или для организаций, которые предпочитают избегать облачных зависимостей. В этой статье мы рассмотрим решение, которое использует Docker и Minio, чтобы сделать локальное развертывание Metaflow реальностью. Этот подход не только устраняет зависимость от AWS, но также позволяет локально использовать DAG Metaflow и функции просмотра артефактов.
Вы можете найти репозиторий GitHub для этого развертывания здесь.

Предварительные условия

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

  • Докер
  • Docker Compose
  • Виртуальная среда Python с установленным boto3
  • Извлечение похожих изображений

Для установки docker и docker Compose просто установите их с помощью apt.

sudo apt install docker docker-compose

Для установки boto вам необходимо сначала создать среду Python:

python3 -m venv .venv

После создания среды активируйте ее и установите boto3 с помощью pip:

source /path/to/venv/folder/bin/activate
pip install boto3

Для извлечения образов Docker я создал один образ, который вам нужно было собрать, и отправил его в ghcr (реестр контейнеров GitHub). Некоторые изображения, которые я использую, взяты из репозитория Metaflow Service. Вы можете сами проверить репозиторий и собрать его локально, если хотите.

Чтобы получить изображения из Github, вам необходимо сначала войти в систему с помощью Docker. Вам понадобится ваше имя пользователя и токен личного доступа github. Когда у вас будут готовы учетные данные, войдите в ghcr:

docker login ghcr.io your_username your_token

Вы можете извлекать изображения по отдельности или клонировать репозиторий этой статьи и извлекать изображения, выполнив следующую команду:

docker-comopse up

Список изображений, которые вам нужно вытащить:

  • netflixoss/metaflow_metadata_service:v2.4.3
  • ghcr.io/rezashabrang/metaflow-ui-backend:latest
  • postgres:15.3
  • minio/minio:RELEASE.2023–03–20T20–16–18Z

Теперь вы готовы развернуть свой локальный сервер Metaflow.

Создать ведро Минио

Поскольку Metaflow глубоко интегрирован с системой хранения Amazon S3, нам нужно протестировать эту систему, выбрав собственное хранилище BLOB-объектов. Minio — выбранное хранилище BLOB-объектов. Metaflow необходим URL-адрес корзины, совместимый с S3, например s3://your-bucket, для предоставления некоторых специфических функций, таких как просмотр DAG и проверка артефактов. Мы собираемся предоставить этот URL здесь.

С этого момента я буду использовать образец файла docker-compose, доступный в репозитории.

Вы можете скопировать файл .env.example, переименовать его в .env и работать с ним, но ОБЯЗАТЕЛЬНО измените учетные данные при развертывании в рабочей среде.

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

docker-compose up -d mf-minio

Теперь перейдите в консоль minio по адресу http://localhost:9001. Вы должны увидеть что-то вроде этого.

Войдите в систему, используя учетные данные в файле .env, указанные для MINIO_ACCESS_KEY и MINIO_SECRET_KEY.

Вы можете создать сегмент из консоли или просто запустить эту команду, используя сценарий create_bucket.py в репозитории.

python create_bucket.py --access-key minioadmin --secret-key minioadmin --bucket-name metaflow

измените аргументы access-key и secret-key соответственно.

Теперь у вас есть URL-адрес S3, подобный этому s3://metaflow, который с помощью некоторых конфигураций переменных среды вы можете использовать в службе Metaflow.

Установка переменных среды

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

В сервисе Metaflow есть 3 сервиса: метаданные, миграция и UI-Backend. UI-Backend — это основной сервис, которому для правильной работы функций требуется сегмент S3. Переменные среды, которые необходимо установить и обновить при создании сегмента в файле env, следующие.

  • METAFLOW_DEFAULT_DATASTORE: Должно быть установлено значение s3
  • METAFLOW_DATASTORE_SYSROOT_S3:Адрес сегмента S3, в этом примере это s3://metaflow
  • METAFLOW_S3_ENDPOINT_URL:Адрес, по которому создается сегмент в нашем мини-сервере, который находится http://mf-minio:9000/ внутри сеть докер-контейнеров.

Запустите команду, чтобы запустить сервер Metaflow.

docker-compose up -d

Запуск потока на вашем сервере Metaflow

Теперь, когда ваша среда Metaflow настроена для локального развертывания, вы можете запустить конвейер Metaflow так же, как и в AWS. Функции DAG и просмотра артефактов, среди прочего, теперь доступны локально.

Для локального запуска конвейера вам необходимо установить некоторые переменные env перед выполнением сценария конвейера или, если вы зафиксировали код конвейера, вам необходимо установить некоторые переменные env. В зависимости от выбранного вами метода (локально или в сети докеров) вам необходимо правильно установить связанные переменные env для вашей корзины minio и службы метапотока.

В репозитории есть пример конвейера с именем sample_pipe.py. Для локального запуска этого сценария на вашем ноутбуке вы можете запустить эту команду.

METAFLOW_SERVICE_URL=http://localhost:8080 METAFLOW_DEFAULT_METADATA="service" METAFLOW_DEFAULT_DATASTORE=s3 METAFLOW_DATASTORE_SYSROOT_S3=s3://metaflow METAFLOW_S3_ENDPOINT_URL=http://localhost:9000/ AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin python sample_pipe.py run

Как вы можете видеть, сначала я указал переменные env, которые указывают на мою службу метапотока и корзину minio, а затем запускаю конвейер.

Теперь перейдите в пользовательский интерфейс метапотока по адресу http://localhost:8083 и наслаждайтесь DAG, захватами стандартного вывода и артефактами.

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

Проверка артефактов

Как вы видели в предыдущем примере, как я инициировал свой конвейер, устанавливая переменные среды, вам нужно сделать это, когда вы хотите просмотреть свои артефакты или запустить данные.
Конвейеры MLOps существуют по множеству причин, о которых я говорю. не вдаваясь в подробности в этой статье, но одним из преимуществ, которые они предоставляют, является возможность проверять и просматривать артефакты, создаваемые в ходе их выполнения.
Поскольку эти задачи в большинстве случаев носят экспериментальный характер и когда мы сделайте это, вероятно, мы хотим просто проверить артефакты, лучшим инструментом для задач такого типа, вероятно, является блокнот jupyter. Чтобы использовать Jupyter с конфигурацией для правильной загрузки артефактов, нам также необходимо запустить сервер с правильными переменными среды. Для этого мы можем использовать эту команду для запуска сервера Jupyter, который правильно настроен для получения артефактов с нашего сервера Metflow.

METAFLOW_SERVICE_URL=http://localhost:8080 METAFLOW_DEFAULT_METADATA="service" METAFLOW_DEFAULT_DATASTORE=s3 METAFLOW_DATASTORE_SYSROOT_S3=s3://metaflow METAFLOW_S3_ENDPOINT_URL=http://localhost:9000/ AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin jupyter notebook - no-browser - NotebookApp.allow_origin='*'.

Запустив эту команду, вы увидите сгенерированный вами токен в журналах.

Вы можете использовать параметр VSCode Существующий сервер Jupyter… при выборе ядра в файле блокнота Jupyter и использовать этот URL-адрес.
Обратите внимание, что вам нужно удалить дерево. часть в URL. Например, URL-адрес, который мне нужно скопировать в VSCode для изображения выше, выглядит следующим образом.

http://localhost:8888/?token=45b39b8596938e65c3ca05721bceb893cd0fa91c4695037a

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

Пример:

from metaflow import Task
Task('SampleFlow/5/p1/20', attempt=0)['hi'].data

Резюме и заключение

В этой статье мы рассмотрели, как настроить Metaflow для локального развертывания, освободив его мощные возможности MLOps из-под контроля AWS. Используя Docker для контейнеризации и Minio для локального хранилища объектов, вы можете освободиться от облачных зависимостей, сохранив при этом замечательные функции Metaflow. Благодаря этой настройке организации могут развертывать свои конвейеры MLOps и управлять ими на своих условиях, раскрывая весь потенциал Metaflow в локальной среде. Удачного метапотока!