Поиск оптимальных настроек для вывода с помощью 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, чтобы автоматически найти оптимальное значение памяти.
Предпосылки
Чтобы просмотреть этот пример, убедитесь, что у вас есть следующее:
- Мы будем повторно использовать контейнер и двоичный файл модели из моей предыдущей публикации для службы бессерверного вывода. Перед тем, как начать, убедитесь, что вы знакомы с этим примером.
- Ознакомьтесь с заданиями оптимизация гиперпараметров (HPO) в SageMaker.
- Получите доступ к среде SageMaker с помощью Studio, Notebook Instance или с вашего ноутбука.
- Этот репозиторий 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 и т. Д.? Не стесняйтесь делиться своими идеями.