如何在 Kubernetes 上部署深度学习模型

了解如何使用 Kubermatic Kubernetes Platform 部署、扩展和管理深度学习模型,以提供图像识别预测。
76 位读者喜欢这篇文章。
Brain on a computer screen

opensource.com

随着企业越来越多地使用人工智能 (AI)、机器学习 (ML) 和深度学习 (DL),一个关键问题出现了:他们如何扩展和工业化 ML 开发?这些对话通常集中在 ML 模型上;然而,这只是通往完整解决方案的其中一步。为了实现生产中的应用和扩展,模型开发必须包含一个可重复的流程,该流程考虑了开发之前和之后的重要活动,包括将模型部署到面向公众的部署中。

本文演示了如何使用 Kubermatic Kubernetes Platform 部署、扩展和管理深度学习模型,以提供图像识别预测。

Kubermatic Kubernetes Platform 是生产级的开源 Kubernetes 集群管理工具,它提供灵活性和自动化,以便与 ML/DL 工作流程集成,并提供完整的集群生命周期管理。

开始使用

此示例部署了一个用于图像识别的深度学习模型。它使用了 CIFAR-10 数据集,该数据集包含 10 个类别中 60,000 张 32x32 彩色图像,并结合了 Gluon 库(在 Apache MXNet 中)和 NVIDIA GPU 来加速工作负载。如果您想在 CIFAR-10 数据集上使用预训练模型,请查看入门指南

该模型经过 200 个 epoch 的训练,只要验证误差保持缓慢下降且不会导致模型过拟合。下图显示了训练过程

训练后,保存模型参数以便稍后加载至关重要

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 检查容器的状态

将模型上传到 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>
  3. 通过运行 sudo docker images 检查您的镜像 ID。

将模型部署到 Kubernetes 集群

  1. 在 Kubermatic Kubernetes Platform 上创建一个项目,然后使用快速入门教程创建一个 Kubernetes 集群。
  2. 下载用于配置对集群访问的 kubeconfig,将其更改为下载目录,并将其导出到您的环境中

  3. 使用 kubectl,检查集群信息,例如 kube-system 在您的集群上启动的服务
    kubectl cluster-info
  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
  7. 使用外部 IP 通过这两张图片测试您的 API

总结

在本教程中,您创建了一个深度学习模型,该模型将作为使用 Flask 的 REST API 提供服务。它将应用程序放入 Docker 容器中,将容器上传到 Docker Hub,并使用 Kubernetes 部署它。然后,只需几个命令,Kubermatic Kubernetes Platform 就部署了该应用程序并将其暴露于世界。

下一步阅读
User profile image.
Kubermatic 初级数据科学家

评论已关闭。

© . All rights reserved.