Автор Самсон ЧЖАНГ, Data Scientist

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

  1. Почему важно отслеживать данные и модельные эксперименты?

2. Как DVC разумно управляет вашими наборами данных для обучения ваших моделей машинного обучения поверх Git

3. Как легко MLflow отслеживает ваши эксперименты и помогает вам их сравнивать?

4. Эта статья: Пример использования. Легко отслеживайте эксперименты с моделями с помощью DVC и MLflow.

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

В этой статье мы покажем рабочий процесс отслеживания экспериментальных моделей с помощью Pytorch Lightning, MLflow и DVC в печально известной задаче классификации «Кошки против собак».

Сочетание MLflow и DVC обеспечивает полный опыт отслеживания модельных экспериментов. Мы также будем использовать автоматическое ведение журнала MLflow с Pytorch Lightning (многие другие библиотеки совместимы с автоматическим ведением журнала), чтобы снять большую часть веса ведения журнала.

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

Предпосылки

Вы можете сами попробовать выполнить следующие шаги из базового кода https://github.com/zhangsamson/cats_dogs_classification_mlflow_dvc

Обратите внимание, что репозиторий уже настроен с папкой .dvc/. В новом репозитории используйте «dvc init», чтобы расширить репозиторий git до репозитория DVC. После этого вы сможете запускать команды dvc.

Содержимое кода репозитория

Код содержит:

  • Скрипт для разделения набора данных на обучающие/проверочные/тестовые подмножества
  • Загрузчик данных
  • Скрипт обучения сверточной нейронной сети (Pytorch)
  • Блокнот для поиска лучшей модели и оценки на тестовом наборе

Установить зависимости

Вы можете найти README.md с подробными инструкциями по установке.

Вы будете:

  • создать новую среду conda с помощью python 3.9
  • установить зависимости DVC и MLflow
  • установить библиотеки
  • Питорч 1.8.2 (ЛТС)
  • Питорч Молния 1.5.10
  • Нампи
  • Панды

(Рекомендуется) Настройте git pre-commit hooks для DVC. Ради этой демонстрации я не буду использовать хуки, чтобы явно показать рабочий процесс с DVC.

Начинайте экспериментировать, давайте практиковаться!

Создайте новую экспериментальную ветку

В репозитории git создайте новую ветку, чтобы начать новый эксперимент.

Импортируйте набор данных «Кошки против собак» с помощью реестра наборов данных DVC.

  1. Импорт данных из реестра наборов данных. Набор данных «кошки против собак» разделен на набор «поезд» и набор «тест». Тестовый набор будет использоваться в качестве резервного подмножества только для оценки.
    На этом этапе вам необходимо настроить собственный реестр наборов данных. Вы также можете:

По умолчанию команда dvc import импортирует последний коммит в ветку master/main. Это эквивалентно dvc get + dvc add. Основное отличие dvc get от dvc import в том, что последний не только скачивает данные, но и отслеживает набор данных (dvc get + dvc add) и сохраняет реестр исходных данных в файле .dvc. Исходная информация необходима dvc для переключения между версиями данных (см. следующий шаг).

Содержимое cat_vs_dogs.dvc вы должны получить:

Если вы заглянете в реестр данных, то заметите, что есть две помеченные версии набора данныхcats_vs_dogs (тег git):

  1. Для демонстрации давайте воспользуемся самой старой версией набора данныхcats_dogs_v1.0 для обучения нашей первой модели. Он содержит 1000 изображений для обучения и 800 изображений для тестирования.

Когда мы используем реестр данных из другого репозитория DVC, мы должны использовать команду «обновление dvc» вместо «проверки dvc», поскольку проверка использует только информацию о коммите нижестоящего проекта. Реестр данных опирается на локальное хранилище файлов, не требующее особой аутентификации, поэтому вы можете просто напрямую обновить свой набор данных.

Обновленный контент кошки_vs_dogs.dvc:

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

  1. Создайте конвейер предварительной обработки данных с помощью команды запуска dvc.

Эта команда создает конвейер данных DVC, который запускает команду «python split_data.py», только если изменяется хотя бы одна из зависимостей split_data.py или набор данных images/cats_vs_dogs. Он автоматически регенерировал файлы data_splits/{train,validation,test}.csv.

Вы также должны получить 2 новых файла dvc.yaml и dvc.lock, которые соответственно отслеживают описание вашего пайплайна и связанные с ним данные:

Содержимое dvc.yaml:

Содержимое dvc.lock:

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

Код обучения

  1. Давайте посмотрим на классификатор CNN (в Pytorch), который мы собираемся тренировать:

В Pytorch Lightning LightningModule одновременно является torch.nn.Module, то есть архитектурой модели и системой обучения (оптимизаторы, этапы обучения/валидации/тестирования, регистраторы). Здесь архитектура, которую мы используем для нашей модели, — MobilenetV2. Функция потерь, которую мы оптимизируем, называется бинарной кросс-энтропийной потерей (BCE). Мы также будем использовать показатель точности (два класса сбалансированы) для интерпретации, поскольку потери BCE трудно интерпретировать.

  1. Перед тренировкой давайте взглянем на скрипт train_cats_dogs.py.

Во-первых, установите случайные семена для воспроизводимости.

Вспомогательная функция pytorch_lightning.seed_everything устанавливает семена генератора случайных чисел python, numpy и pytorch.

Во-вторых, мы используем API MLflow Python для создания нового именованного эксперимента, если он не существует, в противном случае просто извлекаем существующий эксперимент, чтобы добавить к нему дополнительные эксперименты. Это облегчит поиск. Для любого эксперимента задайте название эксперимента.

Если вы работаете локально, вы также можете вручную создать новый эксперимент с помощью команды mlflow experiments create --experiment-name "Cats vs dogs classification".

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

Результаты, показанные в этой статье, получены с этими параметрами. Но не стесняйтесь адаптировать гиперпараметры к имеющимся у вас ресурсам для запуска этого обучающего скрипта (batch_size, gpus). Вы получите другие результаты, но вы все равно можете следовать инструкциям.

Мы инициализируем загрузчики данных для программы обучения

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

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

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

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

И, наконец, программа обучения с отслеживанием MLflow. При создании прогона командой mflow.start() не забудьте установить теги. Это будет полезно для поиска эксперимента.

  1. Теперь вы можете начать обучение на наборе данных версии «cats_dogs_v1.0».

Вы можете начать отслеживать показатели обучения (локально):

Pytorch Lightning автоматически регистрирует лучшую контрольную точку для сохранения в соответствии с заданной пользователем метрикой.

  1. Точность проверки 0,515 кажется довольно низкой, она не подходит. Текущая используемая скорость обучения составляет 1e-1. Это может быть слишком много для проблемы компьютерного зрения, поэтому давайте посмотрим, поможет ли снижение скорости обучения до 1e-2. И не забудьте зафиксировать изменения:
  1. Обучить новую модель (python train_cats_dogs.py)

Точность на проверочном наборе составляет 0,74. Это лучше, чем предыдущий запуск. Давайте посмотрим на некоторые прогнозы. Запустите блокнот «search_experiments.ipynb». Он извлекает лучшую модель из лучшего прогона (в соответствии с точностью при проверке) среди двух, которые мы создали до сих пор.

Точность теста 0,61 и точность проверки 0,74 не близки. Разница показывает, что модель слишком приспособлена к тренировочному набору, и общие результаты не так уж велики, хотя они все еще лучше, чем точность обучения предыдущего прогона (0,51).

  1. К счастью, вашей команде удалось получить 1000 новых обучающих выборок. Новая версия набора данных «cats_dogs_v2.0» содержит 2000 изображений для обучения и 800 изображений для тестирования. С удвоением размера набора данных можно надеяться, что производительность улучшится.

Обновите версию набора данных с помощью dvc:

И не забудьте снова запустить конвейер обработки данных, так как ваш набор данных изменился. Здесь не нужно выполнять dvc run, так как конвейер уже существует и описан в dvc.yaml. Вместо этого используйте dvc repro.

Зафиксируйте изменения:

И, наконец, снова запустите свой тренировочный скрипт.

Точность проверки 0,748 и точность теста 0,7 ближе, чем значения предыдущего запуска. Добавление большего количества обучающих выборок уменьшило переоснащение по сравнению с предыдущим запуском. Но кривая точности проверки показывает, что обучение все еще нестабильно.

  1. Скорость обучения 1e-2 все еще выглядит немного высокой. Сократим его до 1e-4. Подтвердите и снова запустите сценарий обучения

Точность обучения, валидации и испытаний превышает 0,97. Кривая проверки также стабильна. Большой ! Может быть немного переобучения, поскольку точность обучения равна 1, но общая производительность по-прежнему велика и близка к тому, что мы можем ожидать от такого рода задач.

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

Вы также можете использовать интерфейс сравнения параллельных прогонов, выбрав 4 прогона для сравнения и нажав кнопку «Сравнить», чтобы отобразить графики визуализации показателей (см. рис. 17, 18) и сравнить параметры прогона ( см. рисунок 19).

Завершите экспериментальную фазу, объединив свою экспериментальную ветку с «основной» веткой.

Заключение

Поздравляем, вы узнали о:

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

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

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

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