MLflow — это платформа с открытым исходным кодом, предназначенная для управления полным жизненным циклом машинного обучения. Databricks создали его как внутренний проект для решения проблем, с которыми они сталкиваются в своих собственных процессах разработки и развертывания машинного обучения. Позже MLflow был выпущен как проект с открытым исходным кодом в июне 2018 года.
В качестве инструмента управления полным жизненным циклом MLflow содержит следующие компоненты.
Все эти возможности можно установить на машину для разработки, чтобы инженеры могли экспериментировать в свое удовольствие, не беспокоясь о том, чтобы испортить производственную установку.
Все файлы, используемые для установки и настройки MLflow, можно найти в нашем репозитории Github .
В документации MLFlow перечислено не менее 6 вариантов установки MLFlow. Это может показаться излишним, но эти варианты учитывают разные предпочтения для базы данных и разные уровни сложности сети.
Вариант, который лучше всего подходит для организации, в которой есть несколько команд, использующих большие наборы данных и создающих модели, которые сами по себе могут стать довольно большими, показан ниже. Этот вариант требует настройки трех серверов — сервера отслеживания, базы данных PostgreSQL и хранилища объектов S3 — наша реализация будет использовать MinIO.
Сервер отслеживания — это единая точка входа с компьютера инженера-разработчика для доступа к функциям MLflow. (Не обманывайтесь его названием — он содержит все перечисленные выше компоненты — отслеживание, модель, проекты и репозитории.) Сервер отслеживания использует PostgreSQL для хранения сущностей. Сущностями являются прогоны, параметры, метрики, теги, примечания и метаданные. (Подробнее о запусках позже.) Сервер отслеживания в нашей реализации обращается к MinIO для хранения артефактов. Примерами артефактов являются модели, наборы данных и файлы конфигурации.
Что хорошо в современных инструментах, доступных сегодня инженерам, так это то, что вы можете эмулировать производственную среду, включая выбор инструментов и подключение к сети, с помощью контейнеров. Именно это я и покажу в этом посте. Я покажу, как использовать Docker Compose для установки описанных выше серверов как сервисов, работающих в контейнере. Кроме того, конфигурация MLflow настроена таким образом, что при желании вы можете использовать существующий экземпляр MinIO. В этом посте я покажу, как развернуть новый экземпляр MinIO, но в файлах нашего репозитория Github есть файл docker-compose, который показывает, как подключиться к существующему экземпляру MinIO.
Ниже приведен список всего, что необходимо установить. В этот список входят серверы, которые станут сервисами в контейнерах (MinIO, Postgres и MLFlow), а также необходимые вам SDK (MinIO и MLflow).
Докер Рабочий стол
Сервер отслеживания MLFlow через Docker Compose
Сервер MinIO через Docker Compose
PostgresSQL через Docker Compose
MLFlow SDK через установку pip
MinIO SDK через установку pip
Начнем с Docker Desktop, который будет служить хостом для наших сервисов Docker Compose.
Вы можете найти подходящую установку для вашей операционной системы на сайте Docker. Если вы устанавливаете Docker Desktop на Mac, вам необходимо знать, какой чип использует ваш Mac — Apple или Intel. Вы можете определить это, щелкнув значок Apple в верхнем левом углу вашего Mac и выбрав пункт меню «Об этом Mac».
Теперь мы готовы установить наши сервисы.
Сервер отслеживания MLFLow, PostgresSQL и MinIO будут установлены как службы с использованием файла Docker Compose, показанного ниже.
version: "3.3" services: db: restart: always image: postgres container_name: mlflow_db expose: - "${PG_PORT}" networks: - backend environment: - POSTGRES_USER=${PG_USER} - POSTGRES_PASSWORD=${PG_PASSWORD} - POSTGRES_DATABASE=${PG_DATABASE} volumes: - ./db_data:/var/lib/postgresql/data/ healthcheck: test: ["CMD", "pg_isready", "-p", "${PG_PORT}", "-U", "${PG_USER}"] interval: 5s timeout: 5s retries: 3 s3: restart: always image: minio/minio container_name: mlflow_minio volumes: - ./minio_data:/data ports: - "${MINIO_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" networks: - frontend - backend environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ADDRESS=${MINIO_ADDRESS} - MINIO_PORT=${MINIO_PORT} - MINIO_STORAGE_USE_HTTPS=${MINIO_STORAGE_USE_HTTPS} - MINIO_CONSOLE_ADDRESS=${MINIO_CONSOLE_ADDRESS} command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 tracking_server: restart: always build: ./mlflow image: mlflow_server container_name: mlflow_server depends_on: - db ports: - "${MLFLOW_PORT}:5000" networks: - frontend - backend environment: - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY} - MLFLOW_S3_ENDPOINT_URL=http://s3:${MINIO_PORT} - MLFLOW_S3_IGNORE_TLS=true command: > mlflow server --backend-store-uri postgresql://${PG_USER}:${PG_PASSWORD}@db:${PG_PORT}/${PG_DATABASE} --host 0.0.0.0 --serve-artifacts --artifacts-destination s3://${MLFLOW_BUCKET_NAME} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MLFLOW_PORT}/"] interval: 30s timeout: 10s retries: 3 volumes: db_data: minio_data: networks: frontend: driver: bridge backend: driver: bridge
Стоит отметить несколько вещей, которые помогут вам устранить проблемы, если что-то пойдет не так. Во-первых, и MinIO, и PostgreSQL используют локальную файловую систему для хранения данных. Для PostgreSQL это папка db_data, а для MinIO — папка minio_data. Если вы когда-нибудь захотите начать чистую установку заново, удалите эти папки.
Далее, этот файл Docker Compose управляется конфигурацией. Например, вместо жесткого кодирования имени базы данных PostgreSQL в `mlflow`, имя берется из файла `config.env`, показанного ниже, с использованием следующего синтаксиса в файле Docker Compose — `${PG_DATABASE}`.
# Postgres configuration PG_USER=mlflow PG_PASSWORD=mlflow PG_DATABASE=mlflow PG_PORT=5432 # MLflow configuration MLFLOW_PORT=5000 MLFLOW_BUCKET_NAME=mlflow # MinIO access keys - these are needed by MLflow MINIO_ACCESS_KEY=XeAMQQjZY2pTcXWfxh4H MINIO_SECRET_ACCESS_KEY=wyJ30G38aC2UcyaFjVj2dmXs1bITYkJBcx0FtljZ # MinIO configuration MINIO_ROOT_USER: 'minio_user' MINIO_ROOT_PASSWORD: 'minio_pwd' MINIO_ADDRESS: ':9000' MINIO_STORAGE_USE_HTTPS: False MINIO_CONSOLE_ADDRESS: ':9001' MINIO_PORT=9000 MINIO_CONSOLE_PORT=9001
Все переменные среды, необходимые этим службам, настраиваются в этом файле. Этот файл конфигурации также содержит информацию, необходимую для взаимодействия этих служб друг с другом. Обратите внимание, что именно использование переменных среды сообщает серверу отслеживания MLFlow, как получить доступ к MinIO. Другими словами, URL-адрес (включая номер порта), ключ доступа, секретный ключ доступа и сегмент. Это подводит меня к моему последнему и самому важному моменту об использовании Docker Compose: при первом запуске этих сервисов службы отслеживания MLflow не будут работать, потому что вам нужно будет сначала войти в пользовательский интерфейс MinIO, получить ключи и создать корзину. который служба отслеживания будет использовать для хранения артефактов.
Давайте сделаем это сейчас. Запустите службы в первый раз, используя команду ниже.
docker-compose --env-file config.env up -d --build
Убедитесь, что вы запускаете эту команду в том же каталоге, где находится ваш файл Docker Compose.
Теперь мы можем получить наши ключи и создать корзину с помощью пользовательского интерфейса MinIO.
В браузере перейдите по адресу «localhost:9001». Если вы указали другой порт для адреса консоли MinIO в файле docker-compose, используйте вместо него этот порт. Войдите в систему, используя пользователя root и пароль, указанные в файле config.env.
После входа в систему перейдите на вкладку «Ключи доступа» и нажмите кнопку «Создать ключ доступа».
Вы попадете на страницу «Создать ключ доступа».
Ваш ключ доступа и секретный ключ не сохраняются, пока вы не нажмете кнопку «Создать». Не уходите с этой страницы, пока это не будет сделано. Не беспокойтесь о копировании ключей с этого экрана. После того, как вы нажмете кнопку «Создать», вам будет предоставлена возможность загрузить ключи в вашу файловую систему (в файле JSON). Если вы хотите использовать MinIO SDK для управления необработанными данными, создайте еще один ключ доступа и секретный ключ, пока вы находитесь на этой странице.
Затем создайте корзину с именем mlflow. Это просто: перейдите на вкладку «Корзины» и нажмите кнопку «Создать сегмент».
Получив ключи и создав корзину, вы можете завершить настройку служб, остановив контейнеры, обновив config.env, а затем перезапустив контейнеры. Команда ниже остановит и удалит ваши контейнеры.
docker-compose down
Заново:
docker-compose --env-file config.env up -d --build
Далее давайте запустим пользовательский интерфейс MLflow и убедимся, что все работает.
Перейдите к `localhost:5000`. Вы должны увидеть пользовательский интерфейс MLflow.
Потратьте некоторое время, чтобы изучить все вкладки. Если вы новичок в MLflow, ознакомьтесь с концепцией запусков и экспериментов.
Пакет MLflow Python представляет собой простую установку через pip. Я рекомендую установить его в виртуальной среде Python.
pip install mlflow
Дважды проверьте установку, перечислив библиотеку MLflow.
pip list | grep mlflow
Вы должны увидеть библиотеку ниже.
mlflow 2.5.0
Вам не требуется прямой доступ к MinIO, чтобы воспользоваться преимуществами функций MLflow — MLflow SDK будет взаимодействовать с экземпляром MinIO, который мы настроили выше. Однако вы можете захотеть напрямую взаимодействовать с этим экземпляром MinIO, чтобы управлять данными, прежде чем они будут переданы в MLflow. MinIO — отличный способ хранить всевозможные неструктурированные данные. MinIO полностью использует базовое оборудование, поэтому вы можете сохранять все необходимые необработанные данные, не беспокоясь о масштабировании или производительности . MinIO включает функции репликации сегментов для синхронизации данных в нескольких местах. Кроме того, когда-нибудь ИИ будет регулироваться; когда этот день наступит, вам понадобятся корпоративные функции MinIO ( блокировка объектов , управление версиями , шифрование и юридические блокировки ), чтобы защитить ваши хранящиеся данные и убедиться, что вы случайно не удалите что-то, что может запросить регулирующий орган.
Если вы установили пакет Python MLflow в виртуальной среде, установите MinIO в той же среде.
pip install minio
Дважды проверьте установку.
pip list | grep minio
Это подтвердит, что библиотека Minio установлена, и отобразит используемую вами версию.
minio 7.1.15
В этом посте представлен простой рецепт настройки MLflow и MinIO на машине разработки. Целью было сэкономить ваше время и усилия на исследовании серверов MLflow и конфигурации docker-compose.
Было приложено все усилия, чтобы сохранить точность этого рецепта. Если у вас возникнет проблема, сообщите нам об этом, написав нам по адресу [email protected] или присоединившись к обсуждению на нашем общем канале Slack .
Вы готовы начать кодирование и обучение моделей с помощью MLflow и MinIO.
Также опубликовано здесь .