Поиск оптимальных настроек для вывода с помощью AWS Lambda с использованием SageMaker Hyperparameter Tuning и Locust

Недавно я опубликовал пошаговое руководство по развертыванию бессерверных моделей с помощью Amazon SageMaker Pipelines, Amazon API Gateway и AWS Lambda.

С AWS Lambda вы платите только за то, чем пользуетесь. Стоимость Lambda зависит от количества запросов, продолжительности выполнения и объема памяти, выделенной функции. Итак, сколько памяти вы должны выделить для своей функции вывода?

В этом посте я покажу, как вы можете использовать задания SageMaker Hyperparameter Tuning (HPO) и инструмент нагрузочного тестирования для автоматической оптимизации соотношения цена / производительность вашей бессерверной службы логического вывода.

Мы будем повторно использовать двоичный файл модели XGBoost и контейнер вывода Lambda, как в моем предыдущем посте, для вывода. Мы укажем диапазон лямбда-памяти и заставим SageMaker найти оптимальное значение для использования на основе совокупной оценки задержки-памяти. SageMaker выполнит множество заданий, каждое из которых создаст службу вывода, загрузит ее и вернет оценку для оптимизации. Мы будем использовать Locust и оболочку Invokust для нагрузочного тестирования из рабочих мест SageMaker.

Обзор пошагового руководства

Мы найдем оптимальное распределение памяти для Lambda за 3 шага:

  • Сначала мы создадим и удалим службы вывода из заданий SageMaker Training с помощью Boto3.
  • Затем мы проведем нагрузочное тестирование сервисов с помощью Invokust и сгенерируем совокупный балл по соотношению цена-производительность.
  • Наконец, я покажу, как можно запустить задание SageMaker HPO, чтобы автоматически найти оптимальное значение памяти.

Предпосылки

Чтобы просмотреть этот пример, убедитесь, что у вас есть следующее:

  1. Мы будем повторно использовать контейнер и двоичный файл модели из моей предыдущей публикации для службы бессерверного вывода. Перед тем, как начать, убедитесь, что вы знакомы с этим примером.
  2. Ознакомьтесь с заданиями оптимизация гиперпараметров (HPO) в SageMaker.
  3. Получите доступ к среде SageMaker с помощью Studio, Notebook Instance или с вашего ноутбука.
  4. Этот репозиторий GitHub клонирован в вашу среду, чтобы следовать инструкциям.

Шаг 1. Создание и удаление служб вывода из заданий SageMaker Training с помощью Boto3

Во-первых, мы будем использовать Boto3 для создания простых сервисов вывода на основе API Gateway и AWS Lambda. Каждое задание SageMaker Training начинается с создания службы, а затем ее удаление перед завершением.

Для обучающих заданий мы будем использовать PyTorch Estimator и скрипты из папки source_dir. Здесь мы больше заинтересованы в использовании предоставленного контейнера, чем в самой структуре.

Точкой входа в контейнер является entry_point.py, и вы можете найти скрипты boto3 в папке стека.

Создание лямбда-функции с помощью Boto3

Для создания сервиса мы будем использовать классы ApiGateway и LambdaFunction.

Ниже представлен класс LambdaFunction с простыми функциями создания и удаления:

Ключевые параметры лямбда-функций:

  • container: URI изображения контейнера с кодом вывода в нем.
  • model_s3_uri: расположение двоичного файла модели в S3.
  • память: память, выделенная для функции. Это зависит от входных данных SageMaker HPO.
  • role: роль IAM, которую берет на себя функция.

Шаг 2. Нагрузочное тестирование службы логических выводов и присвоение ей оценки соотношения цены и качества.

Когда создается служба логического вывода, наш entry_point.py выполняет нагрузочный тест, чтобы получить производительность ответа на задержку.

Для этого мы используем Locust, инструмент для нагрузочного тестирования с открытым исходным кодом, написанный на Python и удобный для разработчиков. Invokust - это оболочка для запуска Locust из самого Python без необходимости использования командной строки locust. Это упрощает запуск тестера нагрузки из задания SageMaker Training.

Режим сценария SageMaker упрощает установку этих зависимостей с помощью файла requirements.txt.

Создание пользователя locust API с примером полезной нагрузки

Ниже вы можете найти пример поведения пользователя для Locust:

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

Запуск нагрузочного теста и оценка службы вывода

Затем мы используем Invokust для имитации 1000 пользователей, частоты появления 100 и времени выполнения 1 минуты для нагрузочного теста:

Это позволит нам собирать статистику по службе вывода. В частности, мы хотим использовать статистику 95-го процентиля для времени отклика в качестве ключевого показателя для оценки производительности службы.

Ниже приведен фрагмент кода для нагрузочного тестирования из нашей точки входа:

В строке 11 мы вычисляем базовую совокупную оценку для службы вывода. В иллюстративных целях мы просто умножаем лямбда-память и 95-й процентиль времени отклика, чтобы получить число. Это число, которое мы попросим SageMaker свести к минимуму при выполнении задания HPO.

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

Шаг 3. Запуск задания SageMaker HPO для поиска оптимального соотношения цены и качества.

Теперь мы готовы приступить к работе с SageMaker HPO! Ниже вы можете найти пример записной книжки для запуска с нашим кодом:

Задание HPO будет использовать байесовский поиск и пытаться минимизировать совокупный балл нашей службы вывода. Это необходимо для поиска оптимального соотношения времени ожидания и памяти (стоимости) на основе нашей модели XGBoost.

Анализ результатов вашей работы в HPO

Когда ваша работа HPO завершится, вы можете перейти к консоли SageMaker и найти ее результаты. На вкладке Лучшее учебное задание вы можете найти минимальный балл, найденный SageMaker, и связанную с ним лямбда-память, которую вы можете использовать в своей службе вывода.

Быстрый просмотр журналов CloudWatch для этого задания показывает время отклика 53 мс для этой службы вывода:

Заключение

В этом посте я показал, как можно использовать Amazon SageMaker для оптимизации соотношения цены и производительности бессерверной службы вывода. В моем предыдущем посте о бессерверном развертывании с SageMaker Pipelines я выделил 1024 МБ для функции Lambda. Используя SageMaker HPO, мы автоматически обнаруживаем, что можем выделить вместо этого 300 МБ, но при этом получить ответ службы с задержкой 53 мс. Это трехкратная разница в распределении памяти!

А как насчет использования этого шаблона для оптимизации других стеков инфраструктуры: конечных точек SageMaker, KFServing и т. Д.? Не стесняйтесь делиться своими идеями.