Экспериментируйте с начальной загрузкой и повышайте производительность с помощью шаблонов Python в контексте машинного обучения

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

Мотивация

Ожидание завершения скриптов — моя абсолютная любимая мозоль. Это не только пустая трата времени, но и постоянное переключение контекста отвлекает и утомляет. Одним из серьезных правонарушителей является эксперимент по отмыванию денег, который длится от нескольких минут до нескольких дней. Неотъемлемая часть жизненного цикла разработки, эксперимент ML проводится каждый раз, когда вы хотите оценить свою модель по новому набору гиперпараметров (как при оптимизации гиперпараметров), изучить новые функции (выбор функций) или опробовать новую архитектуру модели. В некотором смысле функции и архитектуры моделей — это просто прославленные формы гиперпараметров. Эксперимент ML всегда можно рассматривать как настройку ограниченного набора бинарных гиперпараметров, чтобы максимизировать вашу метрику оценки.

Конечно, у вас может хватить дисциплины, чтобы прочитать Бишопа в первый раз, когда вы проводите свой 10-минутный эксперимент. Но после десятой итерации, скорее всего, экспериментальная усталость сработает, и вместо этого вы отойдете от Reddit. Есть ли способ, если не сократить время ожидания, то, по крайней мере, объединить несколько экспериментов? Ответ положительный.

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

Начиная

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

  1. Предпосылки
  • Cookiecutter: установите cookiecutter вместе с $~ pip install cookiecutter
  • Регион AWS: его можно найти в правом верхнем углу консоли AWS, например, eu-central-1.
  • wandb_key: вам нужно будет создать учетную запись и скопировать ключ wandb, найденный здесь https://wandb.ai/authorize.
  • Шаблон. Наконец, загрузите шаблон с помощью следующей команды:

2. Добавление собственного кода

  • src/demo.py Этот файл содержит код вашего параметризованного эксперимента, а также входные параметры вверху. В нашем случае он оценивает модель XGBoost в наборе данных Boston.
  • wandb/sweep.yamlФайл yaml определяет диапазон значений, которые будут исследованы. Для этой демонстрации мы решили запустить поиск по сетке для 180 различных комбинаций гиперпараметров. Есть несколько других стратегий, кроме поиска по сетке, таких как байесовская оптимизация, которые вы можете изучить здесь.

3. Выполнение вашего приложения

$~ cd ml-exp/
Initialize AWS resources (done only once)
$~ ./cli.py init
Build and push the Docker application to AWS
$~ ./cli.py docker
Pull the trigger
$~ ./cli.py run 20

К этому моменту вы инициализируете необходимые ресурсы на AWS и встроите приложение в контейнер Docker, который работает на 20 разных серверах.

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

Под капотом wandb заботится о координации эксперимента. Он вводит гиперпараметры в ваш парк контейнеров, которые работают параллельно и независимо друг от друга. После того, как гиперпараметр оценивается контейнером AWS, wandb извлекает результат и объединяет все на панели инструментов параллельного графика. Довольно круто?

Don't forget to tear down your AWS resources when you're done
$~ ./cli.py clean

Заключение

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

Если вам нужно больше огневой мощи, я бы порекомендовал вам ознакомиться с полноценным репозиторием lightning-hydra-template, который имеет гораздо больше функций.

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

Большое спасибо за чтение. Я с нетерпением жду ваших ценных отзывов!