Попрощайтесь с утомительным отслеживанием экспериментов и мониторингом запутанных моделей

Я до сих пор помню этот болезненный период, когда мы с товарищем по команде работали над проектом машинного обучения (ML).

Кропотливо и старательно мы вручную переносили результаты наших бесчисленных экспериментов в Google Sheet и распределяли сохраненные модели по папкам. Конечно, мы пытались максимально автоматизировать этот процесс, но управление нашими экспериментами по машинному обучению все еще оставалось непростым делом.

Если описанная выше ситуация похожа на вашу, надеюсь, эта статья поможет вам и уменьшит вашу боль.

Будучи одним из лучших решений с открытым исходным кодом (см. Другие инструменты здесь) для управления экспериментами ML, MLflow значительно улучшит ваше благосостояние (как специалиста по данным, специалиста по машинному обучению и т. Д.) И позволит вам и вашей команде оставаться в здравом уме, пока отслеживание ваших моделей 💪.

Как мне может помочь MLflow?

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

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

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

В нашем примере фрагмента кода ниже мы разместили комментарии над всеми строками кода, относящимися к MLflow.

В общем, в нашем примере есть три основных раздела:

1. Настройка эксперимента: здесь мы устанавливаем имя эксперимента (mlflow.set_experiment()) и путь (mlflow.set_tracking_uri()) для регистрации выполнения перед запуском с mlflow.start_run().

2. Обучение модели: здесь нет ничего особенного, просто обычное обучение модели.

3. Ведение журнала: параметры журнала (mlflow.log_params()), показатели (mlflow.log_metric()) и модель (mlflow.sklearn.log_model()).

После запуска кода вы можете выполнить mlflow ui в своем терминале, и будет ссылка на вашу панель управления MLflow.

Просто и аккуратно, правда? 😎

Однако то, что мы показали вам до сих пор, относится к локальной среде. Что, если мы захотим сотрудничать с другими товарищами по команде? Здесь может пригодиться удаленный сервер, и в следующем разделе статьи вы узнаете, как это сделать.

Шаги по развертыванию MLflow в Google Cloud

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

  1. Настроить виртуальную машину для обслуживания MLflow
  2. Создать корзину Cloud Storage для хранения наших моделей
  3. Запустить сервер MLflow
  4. Добавить аутентификацию пользователя через обратный прокси с Nginx
  5. Изменить код, чтобы разрешить доступ к серверу MLflow

1. Настройте виртуальную машину (ВМ)

Наш первый шаг - настроить экземпляр виртуальной машины Compute Engine через консоль Google Cloud.

а) Включите Compute Engine API после входа в консоль Google Cloud.

б) Запустите Google Cloud Shell.

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

c) Создайте экземпляр виртуальной машины Compute Engine.

Введите в Google Cloud Shell следующее, чтобы создать экземпляр виртуальной машины с именем mlflow-server.

gcloud compute instances create mlflow-server \
--machine-type n1-standard-1 \
--zone us-central1-a \
--tags mlflow-server \
--metadata startup-script='#! /bin/bash
sudo apt update
sudo apt-get -y install tmux
echo Installing python3-pip
sudo apt install -y python3-pip
export PATH="$HOME/.local/bin:$PATH"
echo Installing mlflow and google_cloud_storage
pip3 install mlflow google-cloud-storage'

Краткое описание параметров в приведенном выше коде:

  • тип машины указывает количество ЦП и ОЗУ для нашей виртуальной машины. Вы можете выбрать другие типы из этого списка.
  • зона относится к зоне центра обработки данных, в которой находится ваш кластер. Вы можете выбрать где-нибудь, не слишком далеко от ваших пользователей.
  • теги позволяют нам идентифицировать экземпляры при добавлении правил сетевого брандмауэра позже.
  • сценарий запуска метаданных предоставляет сценарий bash, который будет выполняться при загрузке нашего экземпляра с установкой различных необходимых пакетов.

г) Создать правило брандмауэра

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

gcloud compute firewall-rules create mlflow-server \
--direction=INGRESS --priority=999 --network=default \
--action=ALLOW --rules=tcp:5000 --source-ranges=0.0.0.0/0 \
--target-tags=mlflow-server

2. Создайте сегмент облачного хранилища.

Запустите приведенный ниже код в Google Cloud Shell, заменив ‹BUCKET_NAME› на уникальное имя по вашему выбору. В этом ведре мы будем хранить наши модели позже.

gsutil mb gs://<BUCKET_NAME>

3. Запустите сервер MLflow.

Теперь мы подключимся по SSH к нашему экземпляру mlflow-server.

Перейдите на страницу Compute Engine и нажмите кнопку SSH для своего экземпляра. Должен появиться терминал для вашего экземпляра виртуальной машины.

Пока терминал готовится, обратите внимание на внутренний и внешний IP-адреса вашего экземпляра mlflow-server, который отображается на странице Compute Engine. Они нам понадобятся позже.

Перед запуском нашего сервера MLflow давайте быстро проверим, все ли установлено. Поскольку выполнение нашего сценария запуска займет несколько минут, возможно, не все пакеты были установлены, если вы слишком быстро подключитесь по SSH. Чтобы убедиться, что MLflow установлен, введите в терминале:

mlflow --version

Вы должны увидеть версию MLflow, если она была установлена. Если нет, не беспокойтесь, либо подождите еще немного, либо выполните команды в нашем сценарии bash на шаге 1c, чтобы вручную установить пакеты.

Если MLflow был установлен, теперь мы можем открыть новое окно с помощью tmux, выполнив:

tmux

И запустите наш сервер MLflow, запустив приведенный ниже код, заменив ‹BUCKET_NAME› и ‹INTERNAL_IP› соответственно на имя сегмента на шаге 2 и ваш внутренний IP-адрес, указанный ранее.

mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--default-artifact-root gs://<BUCKET_NAME> \
--host <INTERNAL_IP>

Если вы видите что-то похожее на снимок экрана ниже, поздравляем, ваш сервер MLflow запущен и работает 😄. Теперь вы можете посетить <External_IP>:5000 в своем браузере, чтобы просмотреть панель управления MLflow.

4. Добавьте аутентификацию пользователя.

Если вы не возражаете, чтобы любой, у кого есть ваш внешний IP-адрес, мог просматривать вашу панель управления MLflow, вы можете пропустить этот шаг. Но я предполагаю, что вы не такой эксгибиционист, верно? Или вы? 😱

Чтобы добавить аутентификацию пользователя, сначала остановим наш сервер MLflow, нажав Ctrl+c. А затем произнесите знаменитую фразу Терминатора «Я вернусь», прежде чем отсоединить наше окно Ctrl+b d.

а) Установите Nginx и Apache Utilities

В главном окне нашего терминала выполните:

sudo apt-get install nginx apache2-utils

Nginx настроит наш веб-сервер, а Apache Utilities предоставит нам доступ к команде htpasswd, которую мы будем использовать затем для создания файла паролей.

б) Добавить файл паролей

Выполните следующее, заменив ‹USERNAME› на крутое имя.

sudo htpasswd -c /etc/nginx/.htpasswd <USERNAME>

Затем установите свой пароль, который никто не сможет расшифровать.

Если вам нужна вечеринка, просто опустите аргумент -c, чтобы добавить дополнительных пользователей:

sudo htpasswd /etc/nginx/.htpasswd <ANOTHER_USER>

в) Включить пароль и обратный прокси

Нам нужно настроить Nginx, чтобы наш файл паролей вступил в силу, и настроить обратный прокси для нашего сервера MLflow. Мы делаем это, изменяя default файл блока сервера:

sudo nano /etc/nginx/sites-enabled/default

Измените файл, заменив содержимое в location тремя полужирными линиями:

server {
  location / {
    proxy_pass http://localhost:5000;
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }
}

Нажмите Ctrl+x y Enter, чтобы сохранить изменения и выйти из редактора.

Перезапустите Nginx, чтобы изменения вступили в силу:

sudo service nginx restart

Создайте новый сеанс с tmux или повторно подключитесь к нашему предыдущему сеансу tmux:

tmux attach-session -t 0

Снова запустите наш сервер MLflow, но на этот раз наш хост установлен на localhost:

mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--default-artifact-root gs://<BUCKET_NAME> \
--host localhost

г) Включить HTTP-трафик

Наконец, мы включаем HTTP-трафик для нашего экземпляра, чтобы разрешить доступ к нашему веб-серверу Nginx, выполнив действия, описанные в этой ссылке. По сути, когда вы нажимаете на наш экземпляр mlflow-server на странице Compute Engine, вы можете редактировать и выбирать Разрешить HTTP-трафик и Разрешить HTTPS-трафик в разделе Брандмауэр.

Теперь, если вы посетите свой внешний IP-адрес (оставьте : 5000, только внешний IP-адрес), вам будет предложено ввести учетные данные. Введите имя пользователя и пароль, которые вы установили ранее, и «Open Sesame», ваша панель управления MLflow снова перед вашими глазами.

5. Измените код для доступа к серверу.

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

а) Создайте и загрузите сервисный аккаунт json

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

б) Пип установить google-cloud-storage локально

Для доступа к облачному хранилищу Google требуется установить пакет google-cloud-storage как на клиенте, так и на сервере. Мы установили пакет на сервер с помощью нашего сценария запуска, поэтому вам просто нужно установить его локально.

c) Настройте учетные данные как переменные среды

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

  • ‹GOOGLE_APPLICATION_CREDENTIALS›: Путь к загруженному ключу служебного аккаунта.
  • ‹MLFLOW_TRACKING_USERNAME›: Имя пользователя
  • ‹MLFLOW_TRACKING_PASSWORD›: Пароль
import os
# Set path to service account json file
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = <GOOGLE_APPLICATION_CREDENTIALS>
# Set username and password if authentication was added
os.environ['MLFLOW_TRACKING_USERNAME'] = <MLFLOW_TRACKING_USERNAME>
os.environ['MLFLOW_TRACKING_PASSWORD'] = <MLFLOW_TRACKING_PASSWORD>

d) Установите внешний IP-адрес в качестве URI отслеживания MLflow.

Ранее в нашем примере кода mlflow.set_tracking_uri() был установлен как путь к локальной папке. Теперь установите значение ‹EXTERNAL_IP›: 80, например « Http://35.225.50.9:80 ».

mlflow.set_tracking_uri(<EXTERNAL_IP>:80)

Теперь вы можете легко сотрудничать со своим товарищем по команде и записывать свои модели на сервер. 👏 👏 👏

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

Мы надеемся, что благодаря приведенному выше руководству вы теперь можете развернуть MLflow как локально, так и в Google Cloud для управления своими экспериментами по ML. Кроме того, после ваших экспериментов MLflow останется полезным для мониторинга вашей модели после того, как вы развернете ее в производственной среде.

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

использованная литература