Автор Самсон ЧЖАНГ, специалист по данным в LittleBigCode 🚀

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

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

Почему такой инструмент, как MLflow?

С более чем 250 миллионами загрузок и 12,6 тысячами звезд на Github с 2018 года MLflow — это бесплатный инструмент с открытым исходным кодом (под лицензией Apache License 2.0), изначально разработанный и запущенный Databricks. Это инструмент, который может способствовать нескольким этапам жизненного цикла проекта машинного обучения, таким как отслеживание экспериментов для обучения модели, оценка модели, управление версиями модели и ее развертывание.

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

Одна из функций, которые мне действительно нравятся в MLflow, — это его функция автоматического ведения журнала, которая избавляет вас от написания шаблонного кода для регистрации общих параметров, таких как параметры оптимизатора, истории потерь и метрик. Он поддерживает популярные платформы машинного обучения/глубокого обучения, такие как Scikit-learn, Keras, Pytorch-lightning, lightGBM и многие другие.

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

До и во время тренировки

Версия кода (Git)

  • Какой код используется для обработки данных и обучения модели;
  • Гиперпараметры обучения.

Рабочая обстановка

  • Conda, pip-зависимости;
  • Аппаратные ресурсы (ЦП, ГП, ТПУ и т. д.).

Параметры модели

  • Алгоритм;
  • Параметры.

Результаты обучения

  • Контрольные точки веса модели;
  • Показатели эффективности.

Используемый набор данных

Для отслеживания наборов данных больше подходит DVC, который можно использовать вместе с Git и MLflow.

После этапа обучения

Возникает несколько вопросов по эксплуатации модели:

  • Как воспроизвести одно и то же обучение (гиперпараметры, используемый набор данных и т. д.) и результаты, даже после пересмотра кода, чтобы получить те же результаты?
  • Когда существует несколько контрольных точек обучения, как загрузить конкретную контрольную точку?
  • Поделитесь моделью с членами команды. Какие предварительные условия/настройка необходимы для того, чтобы другие участники могли запустить модель в своей системе?

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

Здесь на сцену выходит MLFlow. MLflow предназначен для эффективного решения всех этих задач.

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

Вместо этого я сосредоточусь на том, чтобы поделиться своими мыслями о:

  • Лучшие практики, с которыми я столкнулся, экспериментируя с MLflow;
  • Проблемы настройки удаленного сервера для MLflow и альтернативы с использованием управляемых служб облачного провайдера, которые интегрируют MLflow;
  • Как команда может управлять своим рабочим процессом git с множеством параллельных экспериментов во многих ветках git в многопользовательской среде.

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

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

За и против

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

Основные команды и интерфейс отслеживания

MLflow прост в использовании. Он имеет простой и понятный API. Можно начать отслеживать параметры и метрики с простых вызовов, таких как mlflow.start_run() для начала отслеживания нового эксперимента, указав его id и имя, и использовать методы mlflow.log для сохранения метрик и артефактов (файлов, метрик, моделей, и т. д.).

Визуальный интерфейс запуска одного эксперимента

MLflow имеет веб-интерфейс, который делает визуализацию запуска эксперимента, которую можно запустить с помощью команды «mlflow ui» (локально):

При запуске регистрируется вся информация, необходимая для воспроизводимости:

  • Git фиксирует хеш;
  • Гиперпараметры обучения и версия набора данных (рис. 3);
  • Метрики обучения, кривые (которые могут заменить метрики тензорной доски) (рисунок 4);
  • Архитектура модели, параметры (рис. 5).

Интерфейс сравнения нескольких экспериментов

Еще одна замечательная особенность MLflow — это, безусловно, параллельное сравнение нескольких прогонов.

Благодаря параллельным графикам координат (см. рис. 7) и параллельным таблицам параметров прогона и показателей (см. рис. 8) можно получить краткий обзор параметров, которые привели к наилучшему прогону в соответствии с отслеживаемой метрикой.

В этом интерфейсе сравнения нескольких прогонов можно просматривать метрические графики, сравнивающие разные прогоны (см. рис. 9).

MLflow и удаленные серверы

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

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

Эта проблема известна, поэтому некоторые облачные провайдеры предлагают управляемые услуги по настройке вашего сервера MLflow (и хранилища артефактов) на Microsoft Azure (ML), AWS и Google Cloud Platform.

Студия машинного обучения Azure

Microsoft Azure идет дальше и полностью интегрирует MLflow в Azure ML и готов к использованию прямо из коробки.

Чтобы начать отслеживать эксперименты машинного обучения с удаленным сервером MLflow, достаточно просто установить URI отслеживания удаленного сервера:

Не стесняйтесь проверять документацию для альтернативных методов аутентификации.

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

Просматривая детали конкретного прогона, вы также можете найти параметры модели (см. рис. 5) и ваши сохраненные модели и артефакты (см. рис. 6).

Лучшие практики MLflow

Назовите свои эксперименты и свои прогоны

Это упрощает поиск по экспериментам (mlflow ui или программно). MLflow может назначать значения по умолчанию, такие как «по умолчанию», и работать с ним, но это непонятно для правильного отслеживания.

Назовите свои прогоны mlflow.start_run(experiment_id=experiment_id, run_name="cats_vs_dogs_mobilenet_20200101"), используя аргумент «run_name».

Выберите метрики и параметры

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

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

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

Вы можете установить пары ключ-значение, которые описывают особенности вашего запуска, например, «модель»: «xgboost», если вы работаете с xgboost. Это упрощает поиск с помощью API поиска MLflow.

Используйте сценарии Python вместо блокнотов для отслеживания экспериментов.

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

В следующем примере исходный код запускается из блокнота Jupyter: значение «источник» не имеет значения для целей отслеживания, а поле «версия» (хеш фиксации git) пусто (см. рис. 7).

Не стесняйтесь создавать новые ветки и новый коммит для каждого эксперимента.

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

Установите начальные числа генератора случайных чисел для библиотек, которые вы используете.

Pytorch, tensorflow, numpy, python.random и т. д. Это необходимо для воспроизводимости эксперимента, потому что в параметризации модели часто присутствует случайность с инициализацией случайных весов, что препятствует полной воспроизводимости вашего эксперимента, случайные разбиения набора данных…

GitPython можно использовать для автоматической фиксации Git при запуске нового запуска.

Управление ветками git и экспериментами с MLflow

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

Когда вы отслеживаете эксперименты с MLFlow и Git, быстро возникает проблема: может быть создано множество «мертвых» веток (десятки, даже сотни). Как правило, среди ваших многочисленных экспериментов во множестве веток только несколько веток являются хорошими кандидатами для развертывания.

Эта ситуация вызывает много вопросов:

  • Должны ли мы отбрасывать ветки, которые не показывают хороших результатов?
  • Если да, то эксперименты, хранящиеся в MLflow, будут указывать на несуществующие коммиты, что сделает отслеживание неполным, а удаление связанных экспериментов MLflow будет означать стирание всех следов экспериментов, что не рекомендуется.
  • Если нет, мы также должны хранить все эксперименты MLflow, иначе это не позволит отслеживать эксперименты.
  • Допустим, мы хотим сохранить все ветки для отслеживаемости экспериментов. Как мы справимся с возможными сотнями экспериментальных ветвей?

Решение

Решение, которое я рекомендую здесь, состоит в том, чтобы сохранить все экспериментальные ветки и объединить только ветки с лучшими результатами в основную/разработочную ветку (см. рис. 15).

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

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

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

Сложные случаи

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

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

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

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

При запуске эксперимента по удалению в MLflow статус запуска меняется с "активен" на "удален". Они до сих пор есть в хранилище. Используйте mlflow gc, чтобы безвозвратно удалить прогоны со статусом удалено из хранилища.

Заключение

MLflow — это особенно мощный инструмент, упрощающий отслеживание экспериментов (метрики, журналы, артефакты, версии данных), поскольку он хранит всю необходимую информацию и предоставляет удобный пользовательский интерфейс для анализа в режиме реального времени. Он имеет комплексный API Python, который легко интегрируется в ваш код без какого-либо шаблонного кода. Его можно легко использовать локально или удаленно, поскольку большинство облачных провайдеров (AWS, Microsoft Azure, GCP) поддерживают хостинг серверов. Его функция автоматического ведения журнала, которая поддерживает большинство библиотек машинного обучения (XGBoost, Pytorch-lightning, Keras, Scikit-learn и т. д.), позволяет легко и быстро начинать эксперименты.

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

Часто задаваемые вопросы: больше о MLflow

Эта статья входит в серию статей об инструментах и ​​методах MLOps для отслеживания данных и модельных экспериментов. Опубликованы четыре статьи:

  1. Введение: Почему важно отслеживать данные и модельные эксперименты? Как такие инструменты, как DVC и Mlflow, могут решить эту проблему
  2. Как DVC разумно управляет вашими наборами данных для обучения ваших моделей машинного обучения поверх git
  3. Как Mlflow легко отслеживает ваши эксперименты и помогает их сравнивать (эта статья)
  4. Вариант использования: легко отслеживайте эксперименты с моделями с помощью DVC и Mlflow (скоро будет доступно).

Не стесняйтесь переходить к другим статьям, если вы уже знакомы с концепциями, представленными в этой статье!

Я настоятельно рекомендую вам начать с прочтения Введение в отслеживание экспериментов с данными и моделями, если это еще не сделано.

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

Ознакомьтесь со всеми статьями LittleBigCode, нажав здесь: https://medium.com/hub-by-littlebigcode

Следите за нами на Linkedin и Youtube + https://LittleBigCode.fr/en