Отслеживание экспериментов, происхождение моделей и простое развертывание моделей машинного обучения

Здравствуйте, любители НЛП! В эти недели я пишу статьи на важную тему выпуска моделей машинного обучения в производство и, в более общем плане, о практиках MLOps. Вслед за моей последней статьей, которая вводит в тему MLOps, сегодня я покажу, как использовать популярную платформу MLOps с открытым исходным кодом, то есть MLflow. Наслаждаться! 😄

MLflow и MLOps

MLflow — это платформа с открытым исходным кодом для управления жизненным циклом системы машинного обучения. MLflow создан компанией DataBricks.

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

Набор методов, которые касаются всех этих аспектов производственных систем машинного обучения, называется MLOps (Машинное обучение + Операции) или ModelOps (Модель + Операции).

Возможности Млфлов

MLFlow выполняет четыре основные функции для проектов машинного обучения:

  • MLflow Tracking: отслеживание экспериментов, например. какой код был использован для модели, какой набор данных, какой гиперпараметр и какие показатели были достигнуты с использованием какого набора тестов. Отслеживание родословной моделей позволяет проводить воспроизводимые эксперименты.
  • Проекты MLflow: способ упаковки кода ML, позволяющий легко воспроизводить эксперименты и делиться ими с другими специалистами по данным.
  • Модели MLflow: способ сохранения моделей ML, чтобы их можно было легко запустить в производство с использованием различных платформ логического вывода (например, пользовательской виртуальной машины, AWS Sagemaker или Azure ML).
  • Реестр моделей MLflow: Предоставление центрального хранилища моделей, включающего управление версиями моделей, переходы между этапами и аннотации.

Давайте рассмотрим эти возможности на практике на примере кода.

Пример кода MFlow

В следующем примере кода вы увидите, как:

  • Подготовьте код для экспериментов с MLflow.
  • Проведите эксперименты.
  • Следите за пробегами с разными моделями.
  • Обслуживание модели с помощью MLflow.

Подготовьте код для экспериментов с MLflow

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

Прежде чем начать, я бы посоветовал поработать внутри виртуальной среды Python, чтобы избежать конфликтов с другими библиотеками, уже установленными на вашем компьютере. Давайте создадим новую виртуальную среду myvenv.

Далее нам нужно активировать виртуальную среду myvenv.

Теперь мы можем работать со свежей новой средой Python без ранее установленных библиотек! Затем вы можете установить MLflow с помощью pip.

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

Давайте поработаем с некоторыми моделями для задачи бинарной классификации поддельных синтетических данных, поэтому давайте создадим каталог binary-classification-fake-data внутри каталога experiments.

Теперь мы можем добавить несколько файлов в папку binary-classification-fake-data. Начнем с файла data.csv.

Затем мы создаем файл train_logistic_regression.py, который обучает модель логистической регрессии, используя данные из data.csv.

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

  • Некоторые параметры считываются из командной строки, например расположение набора данных и гиперпараметры модели. Это позволяет использовать этот код с разными наборами данных и для настройки гиперпараметров.
  • Весь конвейер машинного обучения находится внутри диспетчера контекста mlflow.start_run(), что позволяет вести журнал в одном и том же запуске MLflow. Если вы не передадите этой функции имя прогона, она создаст новое имя с нуля.
  • Мы регистрируем параметры запуска с помощью mlflow.log_param() .
  • Мы регистрируем метрики модели (в данном случае среднюю точность на тренировочном наборе) с помощью mlflow.log_metric() .
  • В конце концов, мы экспортируем модель, используя mlflow.sklearn.log_model(). Обратите внимание, что мы используем функцию log_model() из пакета mlflow.sklearn, которая сообщает MLflow, что экспортируемая модель является моделью sklearn. MLflow может автоматически создавать службы логического вывода для многих наиболее часто используемых платформ машинного обучения, таких как sklearn, TensorFlow и PyTorch.

Далее мы создаем файл conda.yaml, описывающий среду, в которой должен запускаться наш train_logistic_regression.py. В файле указана версия Python и необходимые библиотеки Python.

Наконец, мы создаем файл MLproject, который на самом деле является файлом YAML, который содержит инструкции о том, как проводить эксперименты с использованием файлов train_logistic_regression.py и conda.yaml.

Файл MLproject содержит:

  • Описание среды выполнения, в которой мы хотим, чтобы наша среда выполнялась (т. е. среда, описанная в файле conda.yaml). Также возможно использование образов Docker.
  • Список точек входа для каждого сценария обучения. Теперь у нас есть только один скрипт с точкой входа train_logistic_regression, который запускает python train_logistic_regression.py с соответствующими параметрами.

Ваши каталоги должны выглядеть так.

Теперь мы готовы запустить наши эксперименты!

Проведение экспериментов с MLflow

Вернемся к командной строке и выполним следующую команду в каталоге experiments, которая создаст эксперимент MLflow с именем BinaryClassification.

После выполнения вы заметите, что MLflow создал новый каталог mlruns внутри каталога experiments. Каталог mlruns содержит историю всех экспериментов и экспортированных моделей. Также можно заставить MLflow использовать внешнюю базу данных (например, MySQL) для записи родословных и внешнее хранилище (например, AWS S3) для хранения артефактов, таких как модели машинного обучения.

Затем создадим два запуска эксперимента BinaryClassification, используя точку входа train_logistic_regression из файла MLproject с двумя разными значениями гиперпараметра C.

Каждый запуск может занять некоторое время, так как ваши модели тренируются!

Визуализируйте результаты экспериментов с помощью пользовательского интерфейса MLflow.

Давайте выполним следующую команду внутри каталога experiments, чтобы запустить пользовательский интерфейс, который показывает результаты экспериментов и запусков.

Сервер пользовательского интерфейса по умолчанию работает на http://localhost:5000. Вот как это выглядит!

Затем вы должны выбрать эксперимент BinaryClassification в левом ящике, и вам будут представлены результаты его запусков.

Оба прогона достигли средней точности 0,667, что является самым высоким показателем, которого может достичь линейная модель с нашими данными. Давайте тогда посмотрим, как обучить RandomForestClassifier и использовать его с MLflow!

Следите за пробегами с разными моделями

Давайте запишем файл train_random_forest.py в каталог binary-classification-fake-data. Он очень похож на сценарий train_logistic_regression.py, но на этот раз мы используем модель RandomForestClassifier и принимаем в качестве гиперпараметра переменную n_estimators вместо C.

Затем нам нужно изменить MLproject, добавив новую точку входа, которая запускает скрипт train_random_forest.py.

Наконец, давайте создадим новый запуск. Запустите следующую команду в каталоге experiments.

Возвращаясь к пользовательскому интерфейсу MLflow, мы видим, что новый запуск достиг средней точности 0,833, что является максимальным значением, которое можно получить в нашем наборе данных с помощью любой модели. Большой!

Каждый, у кого есть доступ к серверу MLflow (если он установлен на отдельной машине), теперь может видеть происхождение экспериментов всех других специалистов по данным и запускать их снова по своему желанию!

Обслуживание модели MLflow

Щелкнем по модели RandomForestClassifier в пользовательском интерфейсе MLflow. Нам будет представлена ​​страница, содержащая множество описаний запуска:

  • Мы видим каталог, содержащий артефакты, созданные прогоном с функцией mlflow.sklearn.log_model(). Эти артефакты сохраняются в каталоге mlruns внутри подкаталога относительного запуска. Мы не будем углубляться в детали того, что это за файлы, но обратите внимание, что есть файл model.pkl (т. е. наша обученная модель sklearn, сериализованная с помощью библиотеки pickle), а другие файлы описывают среду выполнения, в которой модель должна использоваться, и как ее загружать. это. Прочитайте эту страницу MLflow, чтобы узнать больше о формате модели MLflow.

  • Есть также фрагменты кода, которые показывают, как загрузить сохраненную модель для обслуживания модели.

Теперь, когда у нас есть представление о том, как модели сохраняются, давайте запустим следующую команду для локального обслуживания обученной модели RandomForestClassifier (чей идентификатор запуска «3a2cd685f8df4443a682ec5be861e918», как показано в пользовательском интерфейсе). Обратите внимание, что мы также указываем, что нужно запускать его на порту 1234.

Вот и все, теперь мы готовы отправить несколько запросов прогнозирования в нашу модель! Давайте создадим HTTP-запрос к конечной точке /invocations, передав некоторые данные для прогнозирования.

Запрос возвращает [0, 1, 0], что является правдоподобным результатом, учитывая наши обучающие данные.

Подробнее о вариантах использования MLflow

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

  • Команды специалистов по обработке и анализу данных могут развернуть сервер отслеживания MLflow для регистрации и сравнения результатов нескольких пользователей, работающих над одной и той же проблемой. Команда может попробовать разные алгоритмы для решения одной и той же проблемы, а затем снова запустить те же алгоритмы на новых данных, чтобы сравнить модели в будущем. Более того, любой желающий может скачать и запустить другую модель.
  • Крупные организации могут обмениваться проектами, моделями и результатами с помощью MLflow. Любая команда может запускать код другой команды с помощью проектов MLflow, поэтому организации могут объединять полезные шаги обучения и подготовки данных, которые могут использовать другие команды, или сравнивать результаты многих команд над одной и той же задачей. Более того, инженерные группы могут легко перемещать рабочие процессы от исследований и разработок к подготовке к производству.
  • Инженеры-технологи могут одинаково развертывать модели из различных библиотек машинного обучения, хранить модели в виде файлов в системе управления по своему выбору и отслеживать, из какого запуска была получена модель.
  • Исследователи и разработчики с открытым исходным кодом могут публиковать код на GitHub в формате проекта MLflow, что упрощает запуск кода с помощью команды mlflow run github.com/... для всех.

Выводы и дальнейшие шаги

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

Возможные следующие шаги:

Спасибо за чтение! Если вы хотите узнать больше о НЛП, не забудьте подписаться на NLPlanet на Medium, LinkedIn, Twitter и присоединяйтесь к нашему новому Discord серверу!