随着企业越来越多地使用人工智能 (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 的训练,只要验证误差保持缓慢下降且不会导致模型过拟合。下图显示了训练过程

(Chaimaa Zyami, 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
检查容器的状态
(Chaimaa Zyami, 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>
(Chaimaa Zyami, CC BY-SA 4.0)
- 通过运行
sudo docker images
检查您的镜像 ID。
将模型部署到 Kubernetes 集群
- 在 Kubermatic Kubernetes Platform 上创建一个项目,然后使用快速入门教程创建一个 Kubernetes 集群。
(Chaimaa Zyami, CC BY-SA 4.0)
- 下载用于配置对集群访问的
kubeconfig
,将其更改为下载目录,并将其导出到您的环境中
(Chaimaa Zyami, CC BY-SA 4.0)
- 使用
kubectl
,检查集群信息,例如kube-system
在您的集群上启动的服务
kubectl cluster-info
(Chaimaa Zyami, 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
(Chaimaa Zyami, CC BY-SA 4.0)
- 使用外部 IP 通过这两张图片测试您的 API
(Chaimaa Zyami, CC BY-SA 4.0)
(Chaimaa Zyami, CC BY-SA 4.0)
(Chaimaa Zyami, CC BY-SA 4.0)
总结
在本教程中,您创建了一个深度学习模型,该模型将作为使用 Flask 的 REST API 提供服务。它将应用程序放入 Docker 容器中,将容器上传到 Docker Hub,并使用 Kubernetes 部署它。然后,只需几个命令,Kubermatic Kubernetes Platform 就部署了该应用程序并将其暴露于世界。
评论已关闭。