MLflow в облаке

В этой статье я расскажу о том, как размещать mlflow в облаке (AWS и GCP), проводить эксперименты по машинному обучению, регистрировать параметры, метрики и сохранять модель в реестре моделей.
Что такое млфлоу?
mlflow — это платформа с открытым исходным кодом, которая управляет сквозным жизненным циклом машинного обучения. Его основные функции:
- Отслеживание экспериментов: поддерживает все эксперименты машинного обучения и возможность запрашивать их.
- Воспроизводимость: он упаковывает код машинного обучения и может воспроизводить эти результаты на любой платформе.
- Развертывание: возможность развертывания моделей машинного обучения в различных средах (например, AWS Sagemaker, запуск в облаке GCP и т. д.).
- Реестр моделей: хранение нескольких версий модели в централизованном репозитории.
Мы можем запускать mlflow на локальных машинах, но размещение в облаке имеет свои преимущества.
- Мы можем использовать облачное хранилище, вычислительную мощность, безопасность и т. д.
- Централизованный просмотр всех экспериментов от каждого члена команды
У нас есть следующие 3 основных компонента в mlflow:
- Панель инструментов: это пользовательский интерфейс, в котором мы можем видеть список экспериментов, параметры модели, метрики и т. д. для каждого эксперимента.
- Meta Store: он использует серверную базу данных (MySql) для хранения всех экспериментов, параметров, показателей и т. д.
- Artifactory Store: он использует это для больших файлов, таких как сериализованная модель. Обычно мы используем распределенные файловые системы, такие как Amazon S3 или GCP Cloud Storage.
- Докер
- База данных MySql
- Распределенная файловая система

На приведенной выше диаграмме архитектуры показаны все сервисы AWS, которые нам нужны, и как они взаимодействуют для размещения mlflow на AWS. Мы собираемся запустить mlflow с помощью бессерверного AWS Fargate.
Во-первых, нам нужно создать файл докера, который упаковывает mlflow и его зависимости. Мы определяем следующие зависимости в требованиях.txt
Файл докера для установки mlflow и запуска сервера
В файле докера есть ведро и другие сведения о подключении к базе данных в качестве переменных, эти значения будут настроены как переменные среды в определении задачи Fargate.
Получив файл докера, запустите приведенную ниже команду, чтобы создать образ докера.
docker build -t mlflowtracker .

Теперь нам нужно отправить образ Docker, который мы создали локально, в реестр контейнеров в AWS.
# Login
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
Далее нам понадобится MySql для mlflow для хранения метаинформации, для чего мы собираемся создать экземпляр AWS RDS MySql.
Чтобы узнать, как создать MySql в AWS RDS, нажмите здесь.
Нам нужно создать корзину S3 для mlflow для хранения артефактов модели. Перейдите в консоль aws, найдите s3, укажите имя сегмента и убедитесь, что вы заблокировали весь публичный доступ, и нажмите «Создать сегмент».

Далее нам нужно создать кластер AWS ECS, выбрав fargate в качестве вычисления. Перейдите в консоль aws, найдите службу эластичных контейнеров и нажмите «Создать кластер». На странице создания кластера укажите имя кластера, выберите vpc и подсеть. По умолчанию будет выбрана опция fargate.

В ECS задача — это объект уровня детализации, который запускает образ докера, он похож на модуль в kubernetes. Итак, нам нужно создать определение задачи, которое будет использовать образ докера, который мы загрузили в ECR. Здесь мы определяем значения переменных среды. Чтобы создать определение задачи, перейдите в Amazon Elastic Container Service > Определения задач > Создать новое определение задачи и укажите имя задачи, URI изображения, которое мы загрузили в ECR, порт контейнера и переменные среды.

Во время создания определения задачи выберите роль ecsTaskExecution , которая создается AWS автоматически, убедитесь, что вы добавили политику доступа s3, чтобы она могла читать и записывать в корзину s3.
После создания определения задачи нам нужно создать службу, которая использует созданное выше определение задачи. При создании службы мы можем выбрать минимальное и максимальное количество необходимых нам задач (я выбрал только 1 задачу), чтобы она могла автоматически масштабироваться. На этом этапе у нас есть возможность создать балансировщик нагрузки.
Чтобы создать службу ECS, перейдите в раздел Amazon Elastic Container Service >clusters >cluster_name> Создайте и укажите имя службы, выберите определение задачи и ее версию, которые мы создали ранее, введите минимальное и максимальное количество задач, выберите vpc в разделе сети, выберите приложение балансировщик нагрузки в разделе балансировщика нагрузки и укажите имя, порт списка, имя целевой группы


Как только мы создадим сервис, он раскрутит необходимое количество задач, мы можем использовать URL-адрес балансировщика нагрузки для запуска панели мониторинга mlflow.
Примечание. Балансировщик нагрузки использует группу безопасности, которая определяет входящие и исходящие сетевые правила. Вам необходимо изменить/добавить правила, чтобы получить доступ к пользовательскому интерфейсу mlflow.
Теперь, когда мы разместили mlflow на AWS, давайте запустим эксперимент по машинному обучению из нашей локальной сети, указав на mlflow в облаке.
После запуска эксперимента мы можем увидеть все параметры, метрики и модель в mlflow, которые мы записывали во время эксперимента.

MLflow на GCP

На приведенной выше диаграмме архитектуры показаны сервисы GCP, которые нам нужны, и то, как они взаимодействуют для размещения mlflow на GCP. Мы собираемся запустить mlflow с помощью бессерверного GCP Cloudrun.
Мы можем использовать тот же Dockerfile и requirements.txt (пожалуйста, обратитесь к разделу MLflow в AWS), за исключением того, что нам нужно изменить boto3 на google-cloud-storage.
Переменные внутри Dockerfile для артефакта по умолчанию, сведения о подключении к базе данных будут настроены как переменные среды в google cloudrun.
Выполните следующие команды, чтобы создать, пометить и отправить образ Docker в Google Container Registry (GCR).
# Build docker image
docker build -t mlflowtracker-gcp .
# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker
# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest
# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest

Мы создали экземпляр БД, теперь нужно создать базу данных и пользователя, чтобы mlflow мог использовать эти данные для подключения к базе данных. На странице SQL нажмите «Базы данных» и нажмите «Создать базу данных», укажите имя базы данных. Аналогичным образом нажмите на ссылку пользователей и укажите имя пользователя и пароль.


Нам нужно создать сегмент облачного хранилища для mlflow для хранения артефактов модели. Чтобы создать корзину облачного хранилища, найдите облачное хранилище в консоли GCP, нажмите кнопку «Создать», укажите имя корзины, регион и нажмите «Создать».

Мы собираемся создать облачный сервис в gcp, который будет использовать образ докера, который мы загрузили в реестр контейнеров. Чтобы создать экземпляр запуска в облаке, перейдите на страницу запуска в облаке, нажмите «Создать службу», выберите образ контейнера, который мы загрузили в GCR, укажите порт контейнера, значения ЦП и памяти, минимальные и максимальные экземпляры для автоматического масштабирования и переменные среды.


Примечание. Убедитесь, что учетная запись службы, которую вы выбрали в cloudrun, имеет доступ к облачному хранилищу, в противном случае загрузка артефактов модели завершится ошибкой.
Теперь, когда мы разместили mlflow на GCP, давайте запустим эксперимент по машинному обучению из нашей локальной сети, указав на mlflow в облаке.
После запуска эксперимента мы можем увидеть все параметры, метрики и модель в mlflow, которые мы записывали во время эксперимента.

Примечание. Мы создали все облачные ресурсы вручную с помощью консоли. Рекомендуется использовать инфраструктуру как код (Terraform или CloudFormation).
Я надеюсь, что вы получили очень хорошее представление о том, как мы можем размещать mlflow на облачных платформах AWS и GCP и проводить эксперименты по машинному обучению в облаке.
Счастливого обучения !!