在 Kubernetes 上部署一个深度学习模型

标签: kubernetes 深度学习 模型 | 发表时间:2021-09-01 23:34 | 作者:[email protected] (linux)
出处:https://linux.cn/

了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型。

随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的开发进行规模化与产业化?这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模,模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。

本文演示了如何使用  Kubermatic Kubernetes 平台 对图像识别预测的深度学习模型进行部署、扩展与管理。

Kubermatic Kubernetes 平台是一个生产级的开源 Kubernetes 集群管理工具,提供灵活性和自动化,与机器学习/深度学习工作流程整合,具有完整的集群生命周期管理。

开始

这个例子部署了一个用于图像识别的深度学习模型。它使用了  CIFAR-10 数据集,包含了 60,000 张分属 10 个类别的 32x32 彩色图,同时使用了  Apache MXNet 的  Gluon 与 NVIDIA GPU 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型,可以查阅其  入门指南

使用训练集中的样本对模型训练 200 次,只要训练误差保持缓慢减少,就可以保证模型不会过拟合。下方图展示了训练的过程:

深度学习模型训练 loss 图

训练结束后,必须保存模型训练所得到的参数,以便稍后可以加载它们:

  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 主要可以分为三个部分。首先,Docker 会下载 Python 的基础镜像。然后,Docker 会使用 Python 的包管理工具  pip 安装  requirements.txt 记录的包。最后,Docker 会通过执行  python app.py 来运行你的脚本。

  5. 构建 Docker 容器:

        sudo docker build -t kubermatic-dl:latest .
    

    这条命令使用  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>
    

    给镜像打上 tag

  3. 使用

        sudo docker images
    

    命令检查你的镜像的 ID。

部署你的模型到 Kubernetes 集群

  1. 首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据  快速开始 创建一个 Kubernetes 集群。

    创建一个 Kubernetes 集群

  2. 下载用于访问你的集群的  kubeconfig,将它放置在下载目录中,并记得设置合适的环境变量,使得你的环境能找到它:

    Kubernetes 集群示例

  3. 使用  kubectl 命令检查集群信息,例如,需要检查  kube-system 是否在你的集群正常启动了就可以使用命令  kubectl cluster-info

    查看集群信息

  4. 为了在集群中运行容器,你需要创建一个部署用的配置文件( deployment.yaml),再运行  apply 命令将其应用于集群中:

        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
    

    获取请求图像识别 API 的 IP 地址

  7. 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试:

    马

    狗

    测试 API

总结

在这篇教程中,你可以创建一个深度学习模型,并且使用 Flask 提供  REST API 服务。它介绍了如何将应用放在 Docker 容器中,如何将这个镜像上传到 Docker Hub 中,以及如何使用 Kubernetes 部署你的服务。只需几个简单的命令,你就可以使用 Kubermatic Kubernetes 平台部署该应用程序,并且开放服务给别人使用。


via:  https://opensource.com/article/20/9/deep-learning-model-kubernetes

作者: Chaimaa Zyani 选题: lujun9972 译者: chunibyo-wly 校对: wxy

本文由  LCTT 原创编译, Linux中国 荣誉推出

相关 [kubernetes 深度学习 模型] 推荐:

在 Kubernetes 上部署一个深度学习模型

- - Linux 中国◆开源社区
了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型. 随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的开发进行规模化与产业化. 这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环.

CTR 预估模型简介--深度学习篇

- - 吴良超的学习笔记
本文主要介绍 CTR 预估中一些深度学习模型,包括 FNN、Wide&Deep、PNN、DIN、 Deep&Cross等. 每个模型会简单介绍其原理、论文出处以及其一些开源实现. FNN 是伦敦大学于 2016 在一篇论文中发表的,模型的结构如下. FNN 假设输入数据的格式是离散的类别特征(表示为 one-hot 编码),且每个特征属于一个 field,通过 embedding 层将高纬稀疏特征映射成低维稠密特征后,再作为多层感知机(MLP)的输入.

CTR 预估模型简介--非深度学习篇

- - 吴良超的学习笔记
本文主要介绍 CTR 预估中常用的一些模型,主要是非深度学习模型,包括 LR、GBDT+LR、FM/FFM、MLR. 每个模型会简单介绍其原理、论文出处以及其一些开源实现. LR + 海量人工特征 是业界流传已久的做法,这个方法由于简单、可解释性强,因此在工业界得到广泛应用,但是这种做法依赖于特征工程的有效性,也就是需要对具体的业务场景有深刻的认识才能提取出好的特征.

雅虎开源分类色情图像的深度学习模型

- - Solidot
雅虎在BSD 2条款许可证下开源了它用于分类NSFW图像的深度学习模型Open nsfw model,源代码发布在GitHub上. 雅虎的模型只针对一类NSFW图像:色情图像,不涉及NSFW的卡通和素描等. 雅虎称,目前还没有识别NSFW图像的开源模型或算法,他们本着合作的精神以及致力于推动NSFW图像识别技术的进步而决定开源它开发的模型.

Airbnb深度学习搜索引擎实践-模型发展历程 – Semocean

- -
该文章是KDD 2019上发表的Airbnb的搜索引擎主要算法的文章,主要介绍了Airbnb算法的演进历程. 还是Airbnb一贯的朴实无华的风格:不在乎有多少创新,更多是工业界结合业务上的算法工程,该文章很难的是文章中不仅介绍了Airbnb的算法,以及使用该算法的出发点和考虑,同时还记录了中间的各种坑,甚至一些失败的实验,真的是经验的无私分享,写作手法更像各大厂内网的技术总结分享文章.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

深度学习二三事

- - FreeBuf.COM | 关注黑客与极客
我知道博客标题中使用否定词很奇怪,但是前几天有一波讨论正好相应于我正在思考的一些问题. 这一切开始于 Jeff Leek 发表的 一篇有关说明在小样本范围内使用深度学习的文章. 要言之,他认为当样本较小时(生物领域中属于常见现象),带有少许参数的线性模型甚至比带有少量层和隐藏单元的深度网络性能更优.

Kubernetes学习(Kubernetes踩坑记)

- - Z.S.K.'s Records
记录在使用Kubernetes中遇到的各种问题及解决方案, 好记性不如烂笔头. prometheus提示 /metrics/resource/v1alpha1 404. 原因: 这是因为[/metrics/resource/v1alpha1]是在v1.14中才新增的特性,而当前kubelet版本为1.13.

kubernetes移除Docker?

- -
两周前,Kubernetes在其最新的Changelog中宣布1.20之后将要弃用dockershime,也就说Kubernetes将不再使用Docker做为其容器运行时. 这一消息持续发酵,掀起了不小的波澜,毕竟Kubernetes+Docker的经典组合是被市场所认可的,大量企业都在使用. 看上去这个“弃用”的决定有点无厘头,那么为什么Kubernetes会做出这样的决定.

关于深度学习&mdash;&mdash;Deep Learning

- - 互联网旁观者
转载自: http://blog.csdn.net/abcjennifer/article/details/7826917. Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,最近研究了机器学习中一些深度学习的相关知识,本文给出一些很有用的资料和心得.