Полное руководство по расширенному использованию MLflow

Введение

MLflow — это мощный инструмент, о котором часто говорят из-за его возможностей отслеживания экспериментов. И легко понять почему — это удобная платформа для регистрации всех важных деталей ваших экспериментов по машинному обучению, от гиперпараметров до моделей. Но знаете ли вы, что MLflow может предложить больше, чем просто отслеживание экспериментов? Эта универсальная платформа также включает в себя такие функции, как проекты MLflow, реестр моделей и встроенные параметры развертывания. В этом посте мы рассмотрим, как использовать все эти функции для создания полного и эффективного конвейера машинного обучения.

Для полных новичков в MLflow это руководство может оказаться слишком сложным, поэтому я настоятельно рекомендую вам посмотреть эти два видео, прежде чем погрузиться в это!

Настраивать

В этом проекте мы будем работать локально, поэтому обязательно правильно настройте локальную среду. Для проекта требуются три основные зависимости — mlflow , pyenv и kaggle . Хотя MLflow можно установить просто с помощью pip, вам нужно будет следовать отдельным инструкциям для настройки pyenv и kaggle.

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

Обзор проекта

Перейдите в папку mlflow_models, и вы увидите следующую структуру:

Вот краткий обзор каждого файла в этом проекте:

  • MLProject — файл в стиле yaml, описывающий проект MLflow.
  • python_env.yaml — список всех зависимостей окружения для запуска проекта.
  • train_hgbt.py и train_rf.py — обучающие скрипты для моделей HistGradientBoosterTree и RandomForest с использованием определенных гиперпараметров
  • search_params.py — скрипт для поиска гиперпараметров.
  • utils — папка содержит все служебные функции, используемые в проекте

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

  1. Скачать данные с Kaggle
  2. Загрузите и предварительно обработайте данные
  3. Настройте модель случайного леса (RF) на 10 итераций
  4. Зарегистрируйте лучшую радиочастотную модель и запустите ее в производство
  5. Разверните модели с помощью встроенного REST API.

После того, как мы закончим, вы можете самостоятельно повторить шаги 2–5 для модели HistGradientBoostedTrees. Прежде чем перейти к проекту, давайте посмотрим, как эти шаги могут поддерживаться MLflow.

Компоненты Млфлов

Вообще говоря, MLflow состоит из 4 компонентов — отслеживания, проектов, моделей и реестра.

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

Обзор конвейера

Данные

Данные будут загружаться автоматически при запуске конвейера. В качестве наглядного примера я буду использовать набор данных Loan Default (CC0: лицензия Public Domain), но вы можете настроить его, переписав параметр training_data и изменив имена столбцов на соответствующие.

MLProject и файлы окружения

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

python_env.yaml содержит точную версию Python, необходимую для выполнения конвейера, а также исчерпывающий список всех необходимых пакетов.

Эти два файла были необходимы для создания необходимой среды для запуска проекта. Теперь давайте посмотрим на реальные скрипты (точки входа), которые будет выполнять конвейер.

Обучение и отслеживание экспериментов

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

Эксперимент начинается, когда мы определяем контекст MLflow, используя with mlflow.start_run(). В этом контексте мы используем mlflow.log_metrics для сохранения показателей PR AUC (см. функцию eval_and_log_metrics для получения дополнительной информации) и mlflow.sklearn.log_model для сохранения конвейера предварительной обработки и моделирования. Таким образом, когда мы загружаем конвейер, он выполняет всю предварительную обработку вместе с выводом. Довольно удобно, если вы спросите меня!

Настройка гиперпараметров

Настройка гиперпараметров выполняется с помощью пакета Hyperopt в search_params.py. Много кода позаимствовано из официального репозитория mlflow, но я попытался его немного упростить. Самая сложная часть этого скрипта — понять, как структурировать эти раунды настройки, чтобы они казались связанными с основным запуском проекта. По сути, когда мы запускаем search_params.py с помощью MLflow, мы хотим убедиться, что структура экспериментов выглядит следующим образом:

Как видите, скрипт search_params ничего не делает, кроме как указывает, какие параметры train_rf.py следует использовать следующими (например, глубины 10, 2 и 5) и каким должен быть идентификатор родительского прогона (в приведенном выше примере это 1234). При изучении сценария обязательно обратите внимание на следующие детали.

  • Когда мы определяем mlflow.start_runcontext, нам нужно убедиться, что для параметра nested установлено значение True.
  • Когда мы запускаем train_rf.py (или train_hgbt.py ), мы явно передаем run_id и делаем его равным ранее созданному child_run запуску.
  • Нам также нужно передать правильныйexperiment_id

Пожалуйста, посмотрите пример ниже, чтобы понять, как все это работает в коде. Функция eval будет оптимизирована функцией минимизации Hyperopt.

Фактическая функция настройки относительно проста. Все, что мы делаем, — это инициализируем запуск эксперимента MLflow (родительский запуск всех остальных запусков) и оптимизируем целевую функцию, используя предоставленное пространство поиска.

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

Запуск радиочастотного конвейера

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

mlflow run -e search_params --experiment-name loan . -P model_type=rf

Разберем эту командную строку:

  • mlflow run . означает, что мы хотим запустить проект в этой папке
  • -e search_params указывает, какие из точек входа в файле MLProject мы хотим запустить
  • --experiment-name loan делает название эксперимента равным «заем». Вы можете установить любое значение, но запишите его, так как оно понадобится вам позже.
  • -P model_type=rf задает для параметра model_type в скрипте search_params значение «rf» (он же «случайный лес»).

Когда мы запускаем эту строку, должны произойти четыре вещи:

  1. Виртуальная среда Python будет создана
  2. Будет запущен новый эксперимент под названием заем.
  3. Данные Kaggle будут загружены во вновь созданную папку data
  4. Начнется поиск гиперпараметров

Когда эксперименты завершены, мы можем проверить результаты в пользовательском интерфейсе MLflow. Чтобы получить к нему доступ, просто введите команду mlflow ui в командной строке. В пользовательском интерфейсе выберите эксперимент «ссуда» (или как вы его назовете) и добавьте свою метрику в представление экспериментов.

Лучшая модель RF достигла тестового PR AUC 0,104 и заняла 1 минуту для обучения. В целом, настройка гиперпараметров заняла около 5 минут.

Зарегистрируйте модель

К настоящему времени мы обучили, оценили и сохранили 10 моделей Random Forest. Теоретически вы можете просто перейти в пользовательский интерфейс, чтобы найти лучшую модель, вручную зарегистрировать ее в своем реестре моделей и продвигать ее в производство. Однако лучше сделать это в коде, так как тогда вы можете автоматизировать этот шаг. Это именно то, что охватывает блокнот model_search.ipynb. Используйте его, чтобы следовать разделам ниже.

Прежде всего, нам нужно найти лучшую модель. Чтобы сделать это программно, вам нужно собрать все эксперименты по настройке гиперпараметров (их 10) и отсортировать их по тестовой метрике.

Ваши результаты будут другими, но главная цель здесь — получить правильный параметр best_run. Обратите внимание, что если вы изменили название эксперимента, вам нужно будет изменить его и в этом скрипте. Идентификаторы родительского запуска можно найти в пользовательском интерфейсе, если щелкнуть родительский эксперимент (в данном случае названный capable-ray-599).

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

Если вам удалось получить предсказание — поздравляю, вы все сделали правильно! Наконец, регистрация модели и продвижение ее в производство также не составляет труда.

Выполнение этих двух строк кода регистрирует вашу модель и продвигает ее в сегмент «Производство» внутри компании. Все, что это делает, — это меняет способы доступа к моделям и их метаданным, но это невероятно мощно в контексте управления версиями моделей. Например, в любой момент мы можем сравнить версию 1 с версией 2, когда она выйдет.

Если вы перейдете на вкладку «Модели» пользовательского интерфейса, вы действительно увидите, что есть модель с именем loan_model, и ее версия 1 в настоящее время находится в производственной корзине. Это означает, что теперь мы можем получить доступ к модели по ее имени и этапу, что очень удобно.

Служить модели

Самый простой способ обслуживания модели — сделать это локально. Обычно это делается для проверки конечной точки и получения ожидаемых результатов. Обслуживать с помощью MLflow довольно просто, особенно когда мы уже зарегистрировали модель. Все, что вам нужно сделать, это запустить эту командную строку:

mlflow models serve — model-uri models:/loan_model/Production -p 5001

Эта строка запустит локальный сервер, на котором будет размещена ваша модель (которая называется loan_model и в настоящее время находится на стадии Production) на порту 5001. Это означает, что вы сможете отправлять запросы на конечную точку localhost:5001/invocations и получать прогнозы обратно (с учетом что запросы правильно отформатированы).

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

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

Краткое содержание

Если вам удалось зайти так далеко и все работает — поаплодируйте себе! Я знаю, что это было много, так что давайте подытожим все, чего вы достигли на данный момент.

  1. Вы увидели и поняли, как структурировать свой проект с помощью MLflow Projects.
  2. Вы понимаете, где в скрипте мы регистрируем наши параметры, метрики и модели и как search_params.py вызывает train_rf.py
  3. Теперь вы можете запускать проекты MLflow и просматривать результаты в пользовательском интерфейсе MLflow.
  4. Вы знаете, как найти лучшую модель, как добавить ее в реестр моделей и как программно продвигать ее в рабочую корзину.
  5. Вы можете обслуживать модели из реестра моделей локально и вызывать конечную точку, чтобы сделать прогноз.

Что дальше?

Я настоятельно рекомендую вам проверить свои навыки, попытавшись запустить конвейер для модели Gradient Boosted Trees, а затем развернуть модель HGBT. Все необходимые скрипты вам доступны, так что вам остается только настроить пайплайн и выполнить развертывание самостоятельно. Попробуйте, и если вы столкнетесь с какими-либо проблемами или у вас возникнут вопросы, не стесняйтесь оставлять их в разделе комментариев.