Как создавать интерфейсы прикладного программирования (API) для размещения моделей машинного обучения с использованием Zappa, Python, Flask и AWS

Оглавление:

1. Введение в бессерверные технологии
2. Разрешения IAM на AWS
3. Разработка приложения Flask
4. Развертывание с помощью Zappa
5. Защита API с помощью ключей

1. Введение

По мере того, как компании по всему миру начинают наращивать свои возможности в области обработки данных и машинного обучения, в последние месяцы наблюдается значительный рост процесса развертывания конечных точек с помощью бессерверных вычислений. Согласно недавней статье, посвященной DataDog [1], бессерверные архитектуры большинства облачных провайдеров (AWS, GCP и т. д.) в настоящее время широко применяются более чем у 50% клиентов. Несмотря на то, что существует множество движущих сил и причин для этого серьезного изменения в адаптации, важно предварить эту статью тем, что, хотя бессерверные вычисления могут быть лучшим решением для многих приложений, это определенно не лучшее решение для всех из них. Имея это в виду, давайте подробнее рассмотрим некоторые ключевые преимущества бессерверной методологии.

Сосредоточьтесь на бизнес-логике — «Сосредоточьтесь на том, что, а не на том, как»

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

Эффективность, масштабируемость и надежность — «Масштабируемость всегда имеет ключевое значение»

Еще одним важным преимуществом бессерверной инфраструктуры является возможность увеличения и уменьшения масштаба по мере необходимости с оплатой по факту использования. Поставщик обрабатывает почти все элементы, связанные с масштабируемостью, а также управляет необходимыми ресурсами. Однако это происходит за счет ограниченного доступа к определенным настройкам времени выполнения. Возможность увеличения и уменьшения масштаба по мере необходимости также значительно способствует снижению затрат, как показано на рис. 2. Здесь мы видим, что традиционная масштабируемость достигается поэтапно, в то время как бессерверная система более линейна.

Удобство и простота развертывания

Бессерверные архитектуры предлагают множество преимуществ по сравнению с полноценными серверными аналогами. Одним из самых больших преимуществ является простота использования, когда речь идет о развертывании вашей инфраструктуры и последующем управлении ею. Zappa может обрабатывать оба этих элемента с помощью CloudFormation, который по сути представляет собой IaC (инфраструктура как код). Имея это в виду, давайте продолжим и начнем!

2. Разрешения IAM на AWS

Прежде чем мы начнем работу с Zappa, давайте по порядку получим разрешения в AWS. Сначала перейдите к IAM в AWS, нажмите «Группы пользователей» и создайте новую группу. Мы можем назвать эту группу «zappa_group».

Создав группу, нажмите «Добавить разрешения», а затем «Создать встроенную политику».

Перейдите на вкладку JSON и добавьте к ней следующую политику:

Эта политика даст Zappa возможность создавать инфраструктуру и соответствующим образом маркировать ее для вас. Обратите внимание, что вам нужно будет изменить AWS_ACCOUNT_NUMBER на соответствующий номер. Вы можете найти это в раскрывающейся вкладке, щелкнув свое имя пользователя в верхней правой части экрана.

Теперь перейдите в «Пользователи» и создайте нового пользователя. Мы можем назвать этого пользователя «zappa_user». Не стесняйтесь менять имена, если чувствуете себя более творчески! Добавьте пользователя в созданную вами группу, чтобы предоставить ему соответствующие разрешения. Когда вы закончите, обязательно запишите ключ доступа и секрет.

Перейдите в командную строку терминала и добавьте свои ключи. Вы можете использовать vim для локального редактирования файла ключей aws:

vim ~/.aws/credentials

Оказавшись в редакторе, нажмите «I», чтобы вставить новый контент и добавить свои ключи. Если у вас уже есть здесь профиль с именем по умолчанию, я бы порекомендовал вам создать новый профиль с именем «zappa»:

[zappa] 
aws_access_key_id = ADD_KEY_HERE 
aws_secret_access_key = ADD_SECRET_HERE

На этом мы закончили с разрешениями на AWS и теперь можем отложить наше внимание на Zappa.

3. Разработка приложения Flask

Теперь, когда у нас есть некоторые сведения о бессерверных методах, давайте продолжим и подготовим приложение Flask. Наша цель здесь будет состоять в том, чтобы обучить простую модель машинного обучения с помощью scikit-learn, сохранить артефакты и загрузить их в API Flask.

Мы можем начать с создания нового каталога, войдя в каталог:

mkdir sklearn-zappa-ml-with-preprocessing
cd sklearn-zappa-ml-with-preprocessing

Давайте теперь создадим новую виртуальную среду под названием «venv» и активируем ее:

virtualenv venv
source venv/bin/activate

Давайте теперь продолжим и установим интересующие библиотеки. Для этого руководства нам, конечно же, понадобится zappa для развертывания, flask для структурирования приложения, scikit-learn для управления нашей моделью и joblib для сохранения и загрузки нашей модели:

pip install zappa scikit-learn flask joblib

Давайте продолжим и активируем виртуальную среду еще раз после установки наших библиотек:

source venv/bin/activate

Давайте продолжим и создадим новый каталог с именем train и другой с именем models, а в каталоге поезда мы создадим файл с именем train.py:

mkdir train
mkdir models
cd train
vim train.py

В файл train.py мы добавим следующий код:

Напомним, что наша цель здесь — обучить образец модели и продемонстрировать, что мы можем загрузить как сам классификатор, так и артефакт предварительной обработки. Если вы проверите каталог моделей, вы увидите два файла joblib.

Вернувшись в основной каталог, давайте теперь создадим новый файл с именем app.py:

vim app.py

В этом файле мы подготовим нашу структуру API. Мы импортируем наши библиотеки, загрузим модели и подготовим два маршрута: один маршрут к основному каталогу «/», а другой — к «/predict»:

К настоящему времени у нас должна быть следующая структура каталогов:

sklearn-zappa-ml-with-preprocessing
    |__ venv
    |__ models
        |__ rfc.joblib
        |__ scaler.joblib
    |__ train
        |__ train.py
    |__ app.y

Мы можем протестировать нашу модель, запустив сервер Flask:

python3 app.py

Используя Postman [2], вы можете протестировать API, создав POST-запрос к локальному серверу:

4. Развертывание с Zappa

Теперь, когда мы убедились, что наше приложение работает локально, давайте приступим к настройке Zappa. Мы можем начать с использования функции инициализации в Zappa:

zappa init

По мере прохождения процесса инициализации вам будет предложено ввести несколько пунктов:

  • Среда. Вы можете указать интересующую среду, такую ​​как разработка, тестирование или производство. Для целей этого руководства введите «dev»
  • Путь к приложению: здесь вам нужно указать путь к вашему основному приложению. Мы можем использовать значение по умолчанию «app.app».
  • Имя сегмента. Здесь вы можете указать интересующий сегмент AWS S3. Я рекомендую вам позволить Zappa сделать это за вас, оставив значение по умолчанию.
  • Глобальный: вы можете использовать эту функцию для оптимизации распространения. Для целей этого руководства введите «n», которое является значением по умолчанию, чтобы пропустить эту функцию.

По завершении этого процесса Zappa сгенерирует в вашем текущем каталоге файл с именем zappa_settings.json. Идите вперед и откройте файл, чтобы проверить настройки. Открыв файл, добавьте две новые пары ключ-значение: «slim_handler» и «tags». Конфигурация slim_handler будет использоваться для оптимизации процесса развертывания, поскольку мы используем scikit-learn — относительно большую библиотеку. Кроме того, «теги» будут использоваться для обеспечения того, чтобы наша созданная инфраструктура была правильно помечена для целей организации и выставления счетов.

{
“dev”: {
    “app_function”: “app.app”,
    “profile_name”: “zappa”,
    “project_name”: “sklearn-zappa-m”,
    “runtime”: “python3.8”,
    “s3_bucket”: “zappa-123456789”,
    “slim_handler”: true,
    “tags”: {
        “Project”: “ZappaProject”,
        “Stage”: “dev”
        }
    }
}

Убедившись, что настройки верны, вы можете приступить к развертыванию API с помощью следующей команды:

zappa deploy dev

Это подготовит вашу инфраструктуру для обслуживания конечных точек Flask, которые мы подготовили ранее. В конечном счете, есть два основных компонента, о которых нужно знать: шлюз API, который управляет внешним трафиком к вашему API, и AWS Lambda, скрипт, содержащий логику вашего приложения.

По завершении процесса развертывания Zappa вернет вам URL-адрес со структурой, подобной следующей:

https://123456789.execute-api.us-east-2.amazonaws.com/dev

Вы можете еще раз протестировать развертывание своего приложения, используя postman и добавив «/predict» в конце URL-адреса выше. Вы должны получить успешный ответ со статусом 200, похожим на то, что мы видели ранее.

5. Защита API с помощью ключей

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

Перейдите к шлюзу API в своей учетной записи AWS. Вы должны увидеть приложение, которое вы только что развернули, в списке на этой странице. Если нет, убедитесь, что выбран правильный регион.

Идите вперед и нажмите на API, а затем нажмите на Ресурсы с левой стороны. Нажмите на ресурс под названием {proxy+}, и вы увидите что-то похожее на рисунок ниже:

Вы можете видеть, что для ключа API в настоящее время установлено значение «Не требуется». Нажмите «ЛЮБОЙ» чуть ниже и «Запрос метода». Измените «Требуется ключ API» на «Истина». Обратите внимание, что для того, чтобы использовать это, нам нужно будет ОБА сгенерировать ключ и добавить его в план использования.

Вы можете сгенерировать ключ, щелкнув Ключи API в левой части экрана. Нажмите «Действия» и «Создать ключ API».

Затем создайте новый план использования. Дайте плану имя и описание, а затем задайте необходимые параметры регулирования и квоты. Нажмите «Далее», а затем добавьте ключ API в план использования.

Теперь у вас должно быть все готово. Вы можете протестировать ключ на Postman, добавив ключ в заголовки вашего запроса. Ключ должен быть «x-api-key», а значение должно быть сгенерированным ключом.

Теперь у вас есть бессерверная модель машинного обучения, развернутая и защищенная на AWS! Напомним, что одним из основных преимуществ этого метода развертывания модели является то, что вы будете использовать модель «оплата по мере использования», гарантируя, что вам не будут выставлять бессмысленные счета, даже когда вы неактивны.

Использованная литература:

[1] https://www.prnewswire.com/news-releases/datadogs-2022-state-of-serverless-report-finds-serverless-reaching-mainstream-adoption-301560418.html

[2] https://www.postman.com/