В этом руководстве я расскажу вам о развертывании модели машинного обучения на AWS Lambda. Наша модель также будет доступна через API с помощью Amazon API Gateway. В конце концов, мы получим идеальный рецепт действительно безсерверной системы. Давайте сразу перейдем к делу.
Загрузите свою модель в Amazon S3
Первый шаг - загрузить вашу модель в Amazon S3. Если вы не знакомы с Amazon S3, перейдите по этой ссылке, чтобы начать работу: https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html
Создание виртуальной среды
При развертывании в AWS Lambda вам необходимо загрузить виртуальную среду, в которой будет храниться ваш код и зависимости. В папке вашего проекта напишите следующие строки. Во избежание конфликтов вам не следует называть виртуальную среду таким же, как папка проекта.
pip install virtualenv virtualenv your_virtual_environment_name
Чтобы запустить виртуальную среду:
source your_virtual_environment_name/bin/activate
Создание Flask API
Нам понадобится базовое приложение Flask для обработки наших запросов. Приложение загрузит нашу модель из Amazon S3 и вернет прогнозы. Начните с создания файла с именем predictions.py и добавьте код ниже. Обязательно измените BUCKET_NAME и MODEL_FILE_NAME перед переходом к следующему шагу.
Загрузка нашей модели с Amazon S3
Используя библиотеку Boto, мы загружаем нашу модель, ранее сохраненную на Amazon S3, и сохраняем ее на диск для дальнейшего использования.
Создание прогнозов
И последнее, но не менее важное: мы готовы сделать некоторые прогнозы. Метод прогнозирования получает в качестве аргумента данные, отправленные в API. Вам нужно будет добавить код для обработки данных в соответствии с вашей моделью.
Вот как должен выглядеть окончательный файл
Тестирование API
- Чтобы запустить приложение, вы должны создать переменную окружения, чтобы сообщить Flask, какие файлы выполнять:
export FLASK_APP=predictions.py
Вы должны убедиться, что ваш код работает локально, прежде чем развертывать его в AWS.
Установите Flask и запустите вторую команду для запуска вашего приложения:
pip install Flask flask run
Откройте терминал и проверьте свои прогнозы:
curl -d '{"payload": "Insert the data needed for your model to make predictions"}' https://127.0.0.1:5000/
Когда все заработает, можно переходить к следующему шагу.
Развертывание в AWS Lambda
Вместо того, чтобы вручную создавать и настраивать AWS Lambda и API Gateway, мы собираемся использовать библиотеку под названием Zappa.
Zappa упрощает создание и развертывание всех приложений Python WSGI на AWS Lambda + API Gateway.
Важно: перед развертыванием обязательно настройте свои учетные данные AWS. Для получения дополнительной информации посетите: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
В вашей виртуальной среде установите необходимые пакеты:
pip install zappa sklearn boto numpy scipy
Затем инициализируйте Zappa. Когда вас попросят указать имя функции приложения, запишите predictions.app. (или название вашего приложения Flask + .app)
zappa init
AWS Lambda требует, чтобы ваша среда имела максимальный размер 50 МБ, но наша упакованная среда будет иметь размер около 100 МБ. К счастью для нас, Lambda может загружать код из Amazon S3 без особой потери производительности (всего за несколько миллисекунд).
Чтобы активировать эту функцию, вы должны добавить новую строку в свой zappa_settings.json
"slim_handler": true
Теперь вы готовы к развертыванию. Используйте команду развертывания с именем среды, которую вы выбрали при инициализации Zappa.
zappa deploy your-environment-name
По завершении вы увидите свой URL-адрес API в последнем сообщении. Он будет выглядеть так: https://abcdefg.execute-api.us-east-1.amazonaws.com/your-env-name.
Вы можете протестировать свое развертывание с помощью cURL:
curl -d '{"payload": "Insert the data needed for your model to make predictions"}' https://your-api-url.com/your-env
Поздравляю! Вы развернули свою модель в безсерверной инфраструктуре.
Обязательно напишите, если вам понравился этот пост. У меня также скоро появятся отличные статьи о машинном обучении, следите за обновлениями!
Вы также можете связаться со мной @ franksup2 в твиттере.