Как развернуть модель глубокого обучения в Kubernetes
Узнайте, как развертывать, масштабировать и управлять моделью глубокого обучения, которая обеспечивает прогнозирование распознавания изображений с помощью платформы Kubermatic Kubernetes.
По мере того как предприятия расширяют использование искусственного интеллекта (ИИ), машинного обучения (ML) и глубокого обучения (DL), возникает критический вопрос: как они могут масштабировать и индустриализировать разработку ML? Эти разговоры часто фокусируются на модели машинного обучения; однако это лишь один шаг на пути к полному решению. Чтобы обеспечить промышленное применение и масштабирование, разработка модели должна включать повторяемый процесс, учитывающий критические действия, которые предшествуют и следуют за разработкой, включая внедрение модели в общедоступное развертывание.
В этой статье показано, как развертывать, масштабировать и управлять моделью глубокого обучения, которая предоставляет прогнозы по распознаванию изображений с помощью платформы Kubermatic Kubernetes.
Kubermatic Kubernetes Platform — это инструмент управления кластерами Kubernetes с открытым исходным кодом промышленного уровня, который обеспечивает гибкость и автоматизацию для интеграции с рабочими процессами машинного обучения и глубокого обучения с полным управлением жизненным циклом кластера.
Начать
В этом примере развертывается модель глубокого обучения для распознавания изображений. Он использует набор данных CIFAR-10, состоящий из 60 000 цветных изображений 32x32 в 10 классах, с библиотекой Gluon в Apache MXNet и графическими процессорами NVIDIA для ускорения рабочей нагрузки. Если вы хотите использовать предварительно обученную модель в наборе данных CIFAR-10, ознакомьтесь с руководством по началу работы.
Модель обучалась в течение 200 эпох, пока ошибка проверки продолжала медленно уменьшаться, не вызывая переобучения модели. На этом графике показан процесс обучения:
(Чаймаа Зями, CC BY-SA 4.0)
После обучения важно сохранить параметры модели, чтобы их можно было загрузить позже:
file_name = "net.params"
net.save_parameters(file_name)
Как только модель будет готова, поместите код прогнозирования на сервер Flask. Это позволяет серверу принимать изображение в качестве аргумента своего запроса и возвращать прогноз модели в ответе:
from gluoncv.model_zoo import get_model
import matplotlib.pyplot as plt
from mxnet import gluon, nd, image
from mxnet.gluon.data.vision import transforms
from gluoncv import utils
from PIL import Image
import io
import flask
app = flask.Flask(__name__)
@app.route("/predict",methods=["POST"])
def predict():
if flask.request.method == "POST":
if flask.request.files.get("img"):
img = Image.open(io.BytesIO(flask.request.files["img"].read()))
transform_fn = transforms.Compose([
transforms.Resize(32),
transforms.CenterCrop(32),
transforms.ToTensor(),
transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])])
img = transform_fn(nd.array(img))
net = get_model('cifar_resnet20_v1', classes=10)
net.load_parameters('net.params')
pred = net(img.expand_dims(axis=0))
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
ind = nd.argmax(pred, axis=1).astype('int')
prediction = 'The input picture is classified as [%s], with probability %.3f.'%
(class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar())
return prediction
if __name__ == '__main__':
app.run(host='0.0.0.0')
Контейнеризация модели
Прежде чем вы сможете развернуть свою модель в Kubernetes, вам необходимо установить Docker и создать образ контейнера с вашей моделью.
Загрузите, установите и запустите Docker:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce sudo systemctl start docker
Создайте каталог, в котором вы сможете упорядочить свой код и зависимости:
mkdir kubermatic-dl cd kubermatic-dl
Создайте файл
requirements.txt
, содержащий пакеты, которые должен запустить код:flask gluoncv matplotlib mxnet requests Pillow
Создайте файл Dockerfile, который Docker будет читать для построения и запуска модели:
FROM python:3.6 WORKDIR /app COPY requirements.txt /app RUN pip install -r ./requirements.txt COPY app.py /app CMD ["python", "app.py"]~
Этот Dockerfile можно разбить на три этапа. Сначала он создает файл Dockerfile и дает указание Docker загрузить базовый образ Python 3. Затем он просит Docker использовать менеджер пакетов Python
pip
для установки пакетов вrequirements.txt
. Наконец, он сообщает Docker запустить ваш скрипт черезpython app.py
.Создайте контейнер Docker:
sudo docker build -t kubermatic-dl:latest .
Это предписывает Docker создать контейнер для кода в вашем текущем рабочем каталоге
kubermatic-dl
.Убедитесь, что ваш контейнер работает, запустив его на локальном компьютере:
sudo docker run -d -p 5000:5000 kubermatic-dl
Проверьте состояние вашего контейнера, запустив
sudo docker ps -a
:
(Чаймаа Зями, CC BY-SA 4.0)
Загрузите модель в Docker Hub.
Прежде чем вы сможете развернуть модель в Kubernetes, она должна быть общедоступной. Сделайте это, добавив его в Docker Hub. (Вам необходимо будет создать учетную запись Docker Hub, если у вас ее нет.)
Войдите в свою учетную запись Docker Hub:
sudo docker login
Пометьте изображение, чтобы вы могли обращаться к нему для управления версиями при загрузке в Docker Hub:
sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name> sudo docker push <your-docker-hub-name>/<your-app-name>
(Чаймаа Зями, CC BY-SA 4.0)
- Проверьте идентификатор своего изображения, запустив
sudo docker images
.
Разверните модель в кластере Kubernetes.
Создайте проект на платформе Kubermatic Kubernetes, а затем создайте кластер Kubernetes, используя краткое руководство.
(Чаймаа Зями, CC BY-SA 4.0)
-
Загрузите
kubeconfig
, используемый для настройки доступа к вашему кластеру, измените его на каталог загрузки и экспортируйте в свою среду:
(Чаймаа Зями, CC BY-SA 4.0)
Используя
kubectl
, проверьте информацию о кластере, например, о службах, которыеkube-system
запускает в вашем кластере:kubectl cluster-info
(Чаймаа Зями, CC BY-SA 4.0)
Чтобы запустить контейнер в кластере, вам необходимо создать развертывание (
deployment.yaml
) и применить его к кластеру:apiVersion: apps/v1 kind: Deployment metadata: name: kubermatic-dl-deployment spec: selector: matchLabels: app: kubermatic-dl replicas: 3 template: metadata: labels: app: kubermatic-dl spec: containers: - name: kubermatic-dl image: kubermatic00/kubermatic-dl:latest imagePullPolicy: Always ports: - containerPort: 8080
kubectl apply -f deployment.yaml
Чтобы предоставить доступ к вашему развертыванию внешнему миру, вам нужен объект службы, который создаст доступный извне IP-адрес для вашего контейнера:
kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000
Ты почти там! Проверьте свои службы, чтобы определить статус вашего развертывания и получить IP-адрес для вызова API распознавания изображений:
kubectl get service
(Чаймаа Зями, CC BY-SA 4.0)
Проверьте свой API с помощью этих двух изображений, используя внешний IP-адрес:
(Чаймаа Зями, CC BY-SA 4.0)
(Чаймаа Зями, CC BY-SA 4.0)
(Чаймаа Зями, CC BY-SA 4.0)
Краткое содержание
В этом руководстве вы создали модель глубокого обучения, которая будет использоваться в качестве REST API с помощью Flask. Он поместил приложение в контейнер Docker, загрузил контейнер в Docker Hub и развернул его с помощью Kubernetes. Затем с помощью всего лишь нескольких команд платформа Kubermatic Kubernetes развернула приложение и представила его всему миру.