Как обучать и развертывать модели XGBoost в качестве конечных точек с помощью SageMaker

Начать работу с Amazon SageMaker может быть сложно, так как существует множество приемов, о которых AWS просто ожидает, что вы узнаете… В свою очередь, как только вы освоите их, вы сможете значительно ускорить развертывание своих моделей машинного обучения, не беспокоясь о Docker и настройке до вычислительных ресурсов.

Цель этого поста — максимально упростить начало работы с SageMaker и дать вам краткий обзор того, что нужно для развертывания классификатора XGBoost, как это обычно делается в отраслевой настройке. Большинство руководств представляют собой прямое повторение документации AWS и не очень применимы, если вы хотите адаптировать свои модели к реальной проблеме. Например, использование образца XGBoost Customer Churn Notebook работает только для прогнозирования вероятности класса, а не самих отдельных классов (0 или 1).

Что мы будем строить

Если вы похожи на меня и хотели бы завести щенка, но из-за нехватки места просто не можете в данный момент, мы можем, по крайней мере, делать проекты, в которых они участвуют, верно? Давайте создадим простую модель XGBoost, которая сообщает людям, следует ли им завести бигля или немецкую овчарку, в зависимости от размера их дома.

В частности, мы собираемся использовать фиктивный набор данных, который состоит из переменной X, представляющей площадь дома в квадратных футах, и целевой переменной y, равной 0 (бигль) или 1 (немецкая овчарка). Для простоты мы установили, что бигль наиболее подходит для домов площадью менее 500 кв. футов, а немецкая овчарка — для домов площадью более 500 кв. футов.

Прежде чем мы углубимся в это, вам может быть интересно, во сколько мне обойдется обучение SageMaker? Согласно Странице цен AWS и при условии, что вы будете работать в регионе Восток 1 США, написание сценария обучения займет у вас около 4 часов, 0,5 часа из обучение модели и 1 час тестирования конечной точки, в конечном итоге это обойдется менее чем в 1 доллар США!

On-demand Notebook Instance
(ml.t2.medium): $0.0464/hr * 4hr  = $0.2
Training Instance
(ml.m4.xlarge): $0.24/hr * 0.5hr  = $0.12
Real-time Inference
(ml.m4.xlarge): $0.24/hr * 1hr    = $0.24
Total                               <$1

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

👉 Шаги

  1. Необходимо подготовить экземпляр Notebook
  2. Храните данные обучения/проверки в корзине S3.
  3. Обучайте и выводите артефакт модели машинного обучения в корзину S3
  4. Развертывание и тестирование SageMaker Inference Endpoint

1. Создайте экземпляр SageMaker (SM) Jupyter Notebook.

Дайте ему имя:

Вы можете оставить роль IAM по умолчанию, чтобы разрешить SM доступ к вашим корзинам S3:

После подготовки экземпляра Notebook вы можете запустить Jupyter Lab и запустить среду Conda Python 3.

Боковое примечание (если бы жизнь была такой простой)

Как мы обычно обучаем XGBoost локально

Однако это не будет работать в SageMaker, поскольку они хотят, чтобы мы использовали их собственный класс Estimator вместо прямого импорта библиотеки XGBoost, и должны хранить наши наборы данных для обучения и тестирования внутри S3 как часть рабочего процесса SageMaker. Но запустите приведенный выше фрагмент кода в блокноте, чтобы увидеть результат.

2. Храните данные в S3

На этом этапе мы повторно используем наши df_train и df_test (см. выше) и сохраняем их в корзине S3 по умолчанию, которая будет привязана к нашему экземпляру ноутбука.

Давайте перейдем к нашей корзине S3, чтобы убедиться, что наши наборы данных для обучения и проверки правильно сохранены:

Отлично, наборы данных успешно загружены в S3, и мы готовы к следующему шагу.

3. Обучайте и сохраняйте артефакт модели машинного обучения

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

В гиперпараметрах мы должны использовать целевую функцию "multi:softmax" вместо "binary:logistic", поскольку она производит только вероятности, а не сами двоичные значения (0 или 1).

4. Разверните и протестируйте конечную точку

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

Если все прошло успешно, должен появиться такой вывод:

Вы можете найти весь код Jupyter Notebook здесь.

Заключительные слова

Развертывание таких моделей машинного обучения — это здорово, но как теперь мы можем позволить всем в Интернете вызывать эту конечную точку и выяснять, какой идеальный щенок подходит для их конкретного дома?

Короткий ответ: с помощью Lambda и API Gateway.

Если вы хотите узнать больше, перейдите к моей следующей статье, где мы подробно расскажем о том, как написать лямбда-функцию для обработки входных запросов (т.е. области дома) и создать REST API с использованием API Gateway для приема запросы со стороны клиента.

Но если вы просто хотели протестировать SageMaker, выполните следующие действия по очистке.

Очистите, чтобы не нести расходы!

1. Удалите развернутую конечную точку, запустив

xgb_predictor.delete_endpoint()

2. Остановить экземпляр SageMaker Notebook

Спасибо за прочтение. Если этот пост помог вам сэкономить время или решить проблему, не забудьте нажать кнопку "Подписаться"! Всегда очень признателен.

Источники изображений

[1] https://commons.wikimedia.org/wiki/File:Beagle_puppy_Cadet.jpg

[2] https://pxhere.com/ru/photo/1003603