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

Но в качестве отправной точки я попытался упростить начальное развертывание модели машинного обучения в Google Kubernetes Engin (GKE) за 6 простых шагов. Я также предоставил скелет репозитория кода, чтобы предоставить API для любой модели, использующей Django, и развернуть его на GKE.

Основы развертывания модели машинного обучения (и используемых технологий) –

  • Создайте модель и получите код прогноза (используя Hugging Face)
  • Напишите службу для предоставления API (с использованием Python Django)
  • Получить базу данных для хранения входных данных и прогнозов (используя Sqlite)
  • Создайте контейнерное приложение (используя Docker)
  • Разверните контейнерное приложение (используя Kubernetes для простого развертывания, управления и масштабирования приложений)

Давайте начнем прямо сейчас (не стесняйтесь также обращаться к ссылкам ниже, если это необходимо)

Шаг 1. Настройте репозиторий с API Django.

  • Клонируйте репозиторий здесь — в этом репозитории есть код для развертывания модели gpt2-medium для генерации текста из библиотеки обнимающих лиц.
git clone https://github.com/vedvasu/deploy-gcp-kubernetes.git
  • Настройте и протестируйте сервис на локальном хосте
# Setup a virtual environment
cd deploy-gcp-kubernetes
python3 -m pip install --user virtualenv
python3 -m venv venv
source venv/bin/activate
# Install Requirements
cd django_app
pip install --upgrade pip
pip install -r requirements.txt
# Run migrations
python manage.py makemigrations gpt2
python manage.py migrate
# Create a superuser
export DJANGO_SUPERUSER_USERNAME="username"
export DJANGO_SUPERUSER_PASSWORD="password"
export DJANGO_SUPERUSER_EMAIL="[email protected]"
python manage.py createsuperuser --noinput
python manage.py runserver
# Try the API now on the browser - http://127.0.0.1:8000/generate/

  • Мы также можем запросить базу данных, чтобы увидеть исторические прогнозы.
# Try the explorer API with usename and password set above
http://127.0.0.1:8000/explorer/play
SELECT * from gpt2_generatedtext     

Шаг 2. Установите докер и попробуйте запустить докеризованную службу на локальном хосте.

  • Установите докер отсюда и запустите его на своей локальной машине. Запуск docker ps подтвердит установку.
  • Давайте теперь создадим образ докера и проверим, работает ли служба докера.
# From inside the `django_app` directory build the docker image
docker build -f ../docker/Dockerfile -t django-app:latest .
docker ls
docker run -p 8000:8000 django-app
# Try the model API now - http://127.0.0.1:8000/generate/

Шаг 3: Создайте учетную запись Google Cloud и установите интерфейс командной строки Google Cloud.

  • Бесплатный аккаунт с кредитами 300$ можно создать здесь.
  • Создайте новый проект из консоли со следующими конфигами:
Project Name: Django GCP Kubernetes
Project Id: gcp-kubernetes-1        # The same will be used later
  • Загрузите Google Cloud CLI здесь. Следуйте инструкциям и убедитесь, что учетная запись, проект и т. д. настроены правильно.
# Execute from the download folder in the same virtual environment
./google-cloud-sdk/install.sh
./google-cloud-sdk/bin/gcloud init         # Setup for project_id
# From a new shell check is the `gcloud` is working
cd deploy-gcp-kubernetes
source venv/bin/activate
cd django_app
gcloud
  • Настройте Kubernetes и установите инструмент командной строки kubectl
gcloud components install kubectl
kubectl version

Шаг 4. Создайте репозиторий в реестре Google Artifacts и отправьте образ докера.

  • Включите Реестр артефактов из консоли Google Cloud.
  • Теперь давайте создадим репозиторий, в котором будет храниться образ докера для приложения, которое будет развернуто в Kubernetes Engine.
gcloud config set project gcp-kubernetes-1
gcloud artifacts locations list     #Check for available locations
gcloud artifacts repositories create django-gcp-kubernetes --repository-format=docker --location=us-central1 --description="Docker repository"
  • Создайте образ Docker и отправьте его в реестр артефактов.
# The name of image has to in specific format
docker build -f ../docker/Dockerfile -t us-central1-docker.pkg.dev/gcp-kubernetes-1/django-gcp-kubernetes/django-app:v1 .
gcloud auth configure-docker us-central1-docker.pkg.dev
# Push the image to the Artifacts Registry 
docker push us-central1-docker.pkg.dev/gcp-kubernetes-1/django-gcp-kubernetes/django-app:v1

Шаг 5. Создайте кластер в кластере Google Kubernetes и разверните приложение Django.

  • Включите Google Kubernetes Engine из консоли Google Cloud.
  • Создайте новый кластер для развертывания службы
# Create a cluster with name "cluster-1" with 16GB RAM machine
gcloud container clusters create cluster-1 --zone us-central1-c 
    --machine-type e2-standard-4
# Configure kubectl for "cluster-1"
gcloud components install gke-gcloud-auth-plugin
gke-gcloud-auth-plugin --version
gcloud container clusters get-credentials cluster-1 
    --zone=us-central1-c
kubectl get nodes
  • Разверните сервис (образ докера из реестра артефактов)
kubectl create deployment django-app --image=us-central1-docker.pkg.dev/gcp-kubernetes-1/django-gcp-kubernetes/django-app:v1
kubectl scale deployment django-app --replicas=3
kubectl autoscale deployment django-app --cpu-percent=80 --min=1 --max=5
kubectl get pods

Шаг 6. Сделайте сервис общедоступным

# Explose the service on the public domain (Will take 4-5 min)
kubectl expose deployment django-app --name=django-app-service --type=LoadBalancer --port 80 --target-port 8000
kubectl get service
# Try the model API now (Replace the IP with your EXTERNAL-IP)
http://104.197.243.125/generate/

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

Большое спасибо Manjunath Mugali и Diksha Tripath за активное сотрудничество в этом блоге и за помощь в решении множества вопросов.

Ресурсы: