Поиск по сайту:

Как развернуть модель глубокого обучения в 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 и создать образ контейнера с вашей моделью.

  1. Загрузите, установите и запустите 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
  2. Создайте каталог, в котором вы сможете упорядочить свой код и зависимости:

    mkdir kubermatic-dl
    cd kubermatic-dl
  3. Создайте файл requirements.txt, содержащий пакеты, которые должен запустить код:

    flask
    gluoncv
    matplotlib
    mxnet
    requests
    Pillow
  4. Создайте файл 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.

  5. Создайте контейнер Docker:

    sudo docker build -t kubermatic-dl:latest .

    Это предписывает Docker создать контейнер для кода в вашем текущем рабочем каталоге kubermatic-dl.

  6. Убедитесь, что ваш контейнер работает, запустив его на локальном компьютере:

    sudo docker run -d -p 5000:5000 kubermatic-dl
  7. Проверьте состояние вашего контейнера, запустив sudo docker ps -a:

    (Чаймаа Зями, CC BY-SA 4.0)

Загрузите модель в Docker Hub.

Прежде чем вы сможете развернуть модель в Kubernetes, она должна быть общедоступной. Сделайте это, добавив его в Docker Hub. (Вам необходимо будет создать учетную запись Docker Hub, если у вас ее нет.)

  1. Войдите в свою учетную запись Docker Hub:

    sudo docker login
  2. Пометьте изображение, чтобы вы могли обращаться к нему для управления версиями при загрузке в 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)

  3. Проверьте идентификатор своего изображения, запустив sudo docker images.

Разверните модель в кластере Kubernetes.

  1. Создайте проект на платформе Kubermatic Kubernetes, а затем создайте кластер Kubernetes, используя краткое руководство.

    (Чаймаа Зями, CC BY-SA 4.0)

  2. Загрузите kubeconfig, используемый для настройки доступа к вашему кластеру, измените его на каталог загрузки и экспортируйте в свою среду:

    (Чаймаа Зями, CC BY-SA 4.0)

  3. Используя kubectl, проверьте информацию о кластере, например, о службах, которые kube-system запускает в вашем кластере:

    kubectl cluster-info

    (Чаймаа Зями, CC BY-SA 4.0)

  4. Чтобы запустить контейнер в кластере, вам необходимо создать развертывание (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
  5. Чтобы предоставить доступ к вашему развертыванию внешнему миру, вам нужен объект службы, который создаст доступный извне IP-адрес для вашего контейнера:

    kubectl expose deployment kubermatic-dl-deployment  --type=LoadBalancer --port 80 --target-port 5000
  6. Ты почти там! Проверьте свои службы, чтобы определить статус вашего развертывания и получить IP-адрес для вызова API распознавания изображений:

    kubectl get service

    (Чаймаа Зями, CC BY-SA 4.0)

  7. Проверьте свой 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 развернула приложение и представила его всему миру.

Статьи по данной тематике: