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

Шаги по развертыванию приложения:
1. Создайте API для своей модели.
2. Докеризация.
3. Отправка в AWS ECR (Amazon Elastic Container Registry). chart
5. Создайте узлы Cluster и Worker в EKS
6. Установите пакет helm в кластере
7. Получите доступ к API для тестирования и выводов

Создать API

Для создания API для вашего приложения доступны различные инструменты с открытым исходным кодом, такие как Flask, FastAPI и т. д. В этом случае мы будем использовать Flask, если вы хотите использовать другие, такие как FastAPI, это тоже нормально.

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

Чтобы кодировать, пожалуйста, клонируйте этот репозиторий:

git clone https://github.com/VivekSinghDS/optimal-image-compression.git

Чтобы настроить среду, выполните pip install -r requirements_flask.txt , чтобы не возникало конфликтов, связанных с зависимостями.

После того, как репозиторий клонирован, для приложения настроено несколько файлов. Часть того, как создается это приложение, выходит за рамки этого блога, так как мы сосредоточимся в основном на части развертывания. Теперь, открыв predict_flask.py, вы можете сделать вывод, запустив сервер на порту 5000 с помощью следующей команды gunicorn --bind=0.0.0.0:5000 predict_flask:app

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

Вышеприведенный код представляет собой простую проверку работоспособности, которая настроена по пути «/» и возвращает строковый ответ «ok». Теперь мы можем захотеть создать файл докеров для контейнеризации нашего приложения. Ниже приведен файл докеров, который я написал для того же.

FROM python:3.8.8
WORKDIR /app
COPY requirements_flask.txt requirements_flask.txt
RUN pip install -r requirements_flask.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--bind=0.0.0.0:5000", "predict_flask:app"]

Выполните docker build -t optimal-image:v1 ., и образ будет создан для вас. Вы можете выполнить docker images, чтобы просмотреть некоторые характеристики вашего изображения. Чтобы проверить, работает ли докер-контейнер на должном уровне, просто введите и выполните docker run -p 5000:5000 optimal-image:v1 и откройте эту ссылку.

Отправка изображения в ECR

Чтобы выполнить следующие шаги, вам необходимо иметь учетную запись AWS, потому что мы будем отправлять именно этот образ из контейнера с именем «optimal-image» в Amazon ECR. Amazon ECR — это полностью управляемый реестр контейнеров Docker, созданный и поддерживаемый для того, чтобы разработчики могли сосредоточиться на процессе развертывания, а не на разных вещах, тем самым объединяя все в одном месте.

Создать репозиторий очень просто, перейдите в Amazon ECR и выберите «Начать». Вам будет предложено окно, показанное ниже, где вы можете ввести имя вашего репозитория.

Выберите настройки, как указано, и создайте репозиторий. Следующий процесс может занять ~ 3 минуты, и как только он будет выполнен, вы получите представление, похожее на изображение, показанное ниже.

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

aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-2.amazonaws.com

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

После завершения аутентификации мы готовы пометить наши образы докеров в репозиторий. Это можно сделать с помощью следующей команды.

docker tag optimal-image:v1 406342097594.dkr.ecr.us-east-1.amazonaws.com/rest-api-optimal:v1

После пометки нам нужно отправить то же самое в репозиторий, присутствующий в облаке.

docker push 406342097594.dkr.ecr.us-east-1.amazonaws.com/rest-api-optimal:v1

После завершения отправки вы увидите, что внутри вашего репозитория создана версия с именем «v1», которая содержит ваш образ.

Построить диаграмму HELM

Чтобы начать использовать helm, убедитесь, что он у вас установлен. Если нет, установите его здесь. После завершения установки выполните следующую команду

helm create api-optimal-chart

Следующий код создаст диаграмму, как указано выше. Поскольку мы имеем дело с развертыванием базового уровня без какой-либо безопасности, нам не понадобится большинство этих файлов. После удаления файлов yaml «hpa», «ingress» и «serviceaccount» мы получим следующую структуру нового файла.

Теперь нам нужно заполнить код для различных файлов, присутствующих в этой структуре. Обновите values.yaml следующим фрагментом кода. Обратите внимание, что вам нужно заполнить URI вашего изображения везде, где я написал свой :)

replicaCount: 1
image:
repository: 406342097594.dkr.ecr.us-east-1.amazonaws.com/rest-api-optimal:v1
pullPolicy: Always
application:
name: rest-api

Для deployment.yaml внесите следующие изменения

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: rest-api
name: {{.Values.application.name}}
spec:
replicas: {{.Values.replicaCount}}
selector:
matchLabels:
app: rest-api
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: rest-api
spec:
containers:
- image: {{.Values.image.repository}}
name: api
imagePullPolicy: {{.Values.image.pullPolicy}}
resources: {}
ports:
- containerPort: 5000
status: {}

Наконец, измените файл services.yaml следующим образом:

apiVersion: v1
kind: Service
metadata:
name: {{.Values.application.name}}
labels:
run: {{.Values.application.name}}
spec:
ports:
- port: 5000
protocol: TCP
selector:
app: {{.Values.application.name}}
type: LoadBalancer

Теперь, когда все файлы настроены, мы можем просто запаковать их с помощью команды helm package api-optimal-chart

Как только ваша упаковка будет готова, давайте перейдем к Amazon EKS, чтобы создать кластер и прикрепить туда этот пакет.

Amazon EKS

Начните с ввода EKS в поле поиска, и вы получите возможность самостоятельно создать кластер. Прежде чем перейти сюда, выберите соответствующие роли для создания кластера, так как они вам понадобятся.

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

Теперь нам нужно аутентифицировать ваш EKS с помощью терминала, чтобы мы могли установить туда наш пакет helm. Для того же введите следующую команду. С другой стороны, вам понадобится kubectl и установка оттуда же может быть выполнена здесь

aws eks --region region-code update-kubeconfig --name cluster_name

После того, как вы закончите заполнять свои значения, вы получите что-то вроде этого

Нам также нужна группа узлов для обработки каждого запроса в разных модулях, и для этого давайте создадим группу узлов.

После того, как вы настроили свою группу узлов, вы увидите что-то вроде этого в качестве настройки по умолчанию. Теперь мы подошли к последнему шагу, на котором мы установим наш пакет helm на этот кластер. Делается это следующей командой.

helm install api-production api-optimal-chart-0.1.0.tgz

После написания этого вы получите подсказку, как показано ниже.

Приведенное выше сообщение указывает на то, что развертывание прошло успешно, и доступ к URL-адресу можно получить, введя kubectl get svc.

Затем сгенерированный IP-адрес можно использовать для проверки работоспособности нашей проверки работоспособности. Просто посетите свой URL-адрес и выполните следующие действия.

http://af83ebca10d2d47cebab49b2029cc9ba-1295005931.us-east-1.elb.amazonaws.com:5000/
http://{ your url here }:5000/

Со следующим сообщением «ok» мы уверены, что следующий API работает. Давайте проверим функциональность для того же самого.

Чтобы проверить то же самое, давайте отправим запрос на завивание со следующими параметрами, как указано.

curl --location --request POST 'http://af83ebca10d2d47cebab49b2029cc9ba-1295005931.us-east-1.elb.amazonaws.com:5000/predict' \
--header 'Content-Type: application/json' \
--data-raw '{
    "image_path":"https://images.contentstack.io/v3/assets/blt5ac836f818fcdeb2/blt588212a6b0619c3d/62d4ed04a80c6d36eaa140a7/sample20.jpg"
}'

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

🙂 Спасибо, что оставались со мной так долго, если у вас есть какие-либо сомнения, не стесняйтесь комментировать их и давайте подключимся к Linkedin, чтобы узнать больше таких обновлений.

Github: https://github.com/VivekSinghDS
Linkedin: https://www.linkedin.com/in/vivek-singh-4a3204189/