工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图

    深度学习模型强大的学习能力推动了图像、语音、NLP等AI行业技术的进步,但DL模型通常非常复杂,如何方便、快捷、灵活、高效的把学习好的DL模型部署到实际生产环境,一直是工业界头痛的问题,本文给出了一个Docker和Kubernetes部署深度学习模型的简单示例,给大家提供一些思路。

    同时推荐一门不错的深度学习实践课程,需要的朋友自取:

    限时报名 | 超低价重点打造,带学《深度学习》花书训练营!

    这篇文章展示了一个*Basic*示例,展示了如何用Keras构建深度学习模型,用Flask作为REST API来serve模型,并使用Docker和Kubernetes部署模型。

    这不是一个健壮的生产例子。仅仅是一本快速指南,针对那些听说过Kubernetes但还没有尝试过的人入门DL模型部署。

    为此,我在这个过程的每一步都使用谷歌云。原因很简单—我不想在我的Windows 10家庭笔记本电脑上安装Docker和Kubernetes,谷歌云非常有效。

    额外的好处是可以很容易复现下文描述的步骤,因为你可以使用我所使用的精确的规范来运行所有的事情。

    另外,如果你担心成本,不要担心。谷歌为新账户提供了几百美元的免费credit,我甚至没有为我将要向你展示的任何东西耗费多少credit。


为什么为ML和数据科学设计Kubernetes

    Kubernetes,以及更广泛的新流行词,cloud-native,正在席卷全球。别担心——你持怀疑态度是对的。我们都已经看到技术炒作泡沫变成了人工智能、大数据和云计算等等。Kubernetes是否也会出现同样的情况,目前还不清楚。

    但是在你今天在数据科学外行指导下,我对使用Kubernetes的变革性原因既没有理解,也没有兴趣。我的动机很简单。我想部署、扩展和管理一个REST API,它可以提供模型预测服务。正如你会看到的,Kubernetes让这变得非常容易。

    让我们开始吧。


目录

    1、使用谷歌云创建你的环境

    2、使用Keras、Flask和Docker构建深度学习模型

    3、使用Kubernetes部署所述模型

    4、尽情享受你新获得的知识


    步骤1 -使用谷歌云创建环境

    我在Google计算引擎上使用一个小虚拟机来构建、serve和dockerize一个深度学习模型。没有要求你也这样做。我试图在我的Windows 10笔记本电脑上安装最新版本的Docker CE (社区版)。但失败了。我决定花费(仅仅使用免费的谷歌云Credit)比自己安装Docker更好地利用我的时间。你可以自己选择。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图1

    要启动Google Cloud虚拟机,请打开屏幕左侧的功能区。选择计算引擎。

    然后选择“create instance”。你可以在下面的照片中看到,我已经运行了一个实例。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图2

    下一步是选择我们想要使用的计算大小。默认( read :cheapest)设置应该只工作一个小时,但是考虑到我们最多只需要这个虚拟机大约1个小时,我选择了拥有15GB内存的4vCPU。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图3

    接下来,我选择要使用的操作系统和磁盘空间。选择“Boot Disk”编辑默认值。我选择Centos 7作为我的操作系统,并将磁盘数量从10GB增加到100 GB。我不需要选择操作系统( Centos )。然而,我建议将磁盘大小增加到超过10gb,因为我们创建的Docker容器每个都是大约1GB。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图4

    创建虚拟机之前的最后一步是设置防火墙规则以允许HTTP / S。完全透明,我不确定是否需要这一步。在我们将虚拟机部署到Kubernetes之前,我将向你展示如何编辑防火墙设置来测试虚拟机上的API。所以检查这些boxes是否足够—还有更多的工作要做。我只是没有回去尝试这个教程而没有检查它们。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图5

不确定是否需要此步骤

    现在点击“Create”。太棒了!困难的部分基本上已经完成了!

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图6


    步骤2 -使用Keras构建深度学习模型

    现在,让我们将SSH引入我们的虚拟机,开始构建我们的模型。最简单的方法就是点击虚拟机旁边的SSH图标(如下所示)。这会在浏览器中打开一个终端。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图7

    1、删除现有版本的Docker

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图8

    请注意,如果你选择Centos 7以外的操作系统,这些命令会有所不同。


    2、安装最新版本的Docker

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图9


    3、启动Docker并运行测试脚本

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图10

    如果你看到一个输出,看起来像下面的消息,就都准备好了。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图11


    4、创建我们的深度学习模型

    首先,拷贝Adrian Rosebrock编写的脚本。Adrian创建了一个优秀的简短教程,讲述了如何用Keras创建深度学习模型,并用Flask来serve模型。你可以深入阅读该教程:https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html。

    我们必须对Adrian的脚本进行两次关键编辑,才能让它运行。如果你不关心Docker和Tensorflow的具体情况,可以跳过这两段。

    我们需要改的第一件事与Docker有关。本地运行应用程序时,flask在本地主机上默认端口( 127 . 0 . 0…)serve该应用程序。这在运行Docker Container时会引起一些问题。解决办法很简单。调用app.run ( )时,将URL指定为0.0.0.0,就像app.run一样( host = ‘ 0.0.0.0 ‘ )。现在,我们的应用程序在本地主机和外部IP上都可用。

    下一个问题涉及Tensorflow。当我运行Adrian的原始脚本时,我无法成功调用模型。我阅读了这个Github问题,并对代码进行了更改。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图12

    说实话,我不知道这是为什么。但确实如此。所以让我们把这个东西运行起来。


    首先,让我们创建一个名为keras-app的新目录,并移动到该目录中

    mkdir keras-app
    cd keras-app

    现在,创建一个名为app.py的python文件。你可以使用自己选择的文本编辑器。我更喜欢用vim。要创建和打开应用程序,请键入:

    vim app.py

    点击“i”键进入编辑模式。现在,你可以粘贴以下代码了。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图13

    复制了上述代码后,点击“Esc”键退出编辑模式。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图7

    然后,通过键入: x来保存和关闭文件。


    5 .创造一个requirements.txt文件

    现在回到正题上。我们将在Docker容器中运行这个代码。因此,为了做到这一点,我们需要首先创建一个requirements.txt。这个文件将包含我们的代码运行所一些package,例如flask,keras等等。这样,无论我们将Docker容器移动到哪里,底层服务器都能够安装我们的代码所需的依赖项。

    就像以前一样,通过vim来创建和编辑requirements . txt的内容。

    将以下内容复制到requirements.txt中,并像以前一样保存和关闭

    keras
    tensorflow
    flask
    gevent
    pillow
    requests


    6、创建Dockerfile

    太好了!现在让我们创建Dockerfile。这是Docker将根据Dockerfile来创建运行环境和执行project。

    FROM python:3.6
    WORKDIR /app
    COPY requirements.txt /app
    RUN pip install -r ./requirements.txt
    COPY app.py /app
    CMD [“python”, “app.py”]~

    我们正在做的是:指示Docker下载Python 3的基本image。完成后,要求Docker使用Python包管理器pip安装requirements . txt中的以来。

    之后,我们告诉Docker通过Python应用程序运行我们的脚本。


    7、建造Docker container(容器)

    继续进行下一步。现在,让我们构建并测试我们的应用程序。

    要构建我们的Docker container,请运行:

    sudo docker build -t keras-app:latest .

    这指示Docker为位于我们当前工作环境目录keras-app,构建一个容器。

    这个命令需要一两分钟才能完成。幕后正在发生的事情是Docker正在创建Python 3.6的image,并安装需求中列出的软件包。


    8、运行Docker container

    现在让我们运行Docker容器来测试我们的应用程序:

    sudo docker run -d -p 5000:5000 keras-app

    关于数字5000 : 5000的简短说明—在这里,我们告诉Docker让5000端口对外可用,并转发我们的本地应用到该端口(该端口也在本地5000上运行)

    通过运行sudo docker ps -a 来检查容器的状态。你应该看到这样的东西(下面)

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图14


    9 、测试我们的模型

    随着我们模型的运行,现在是测试它的时候了。这个模型接受一张狗的照片作为输入,并返回狗的品种。在Adrian的报告中,他提供了一个示例图像,我们将使用同样的图像。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图15

    从终端运行:

    curl -X POST -F image=@dog.jpg
‘http://localhost:5000/predict’

    确保“dog . jpg”在你当前的目录中(或者提供到该文件的适当路径)

    你应该会看到这样的结果:

    {“predictions”:
    [{“label”:”beagle”,”probability”:0.987775444984436},
    {“label”:”pot”,”probability”:0.0020967808086425066},
    {“label”:”Cardigan”,”probability”:0.001351703773252666},
    {“label”:”Walker_hound”,”probability”:0.0012711131712421775},
    {“label”:”Brittany_spaniel”,”probability”:0.0010085132671520114}],”success”:true} 

    我们可以看到,我们的模型正确地将狗归类为小猎犬。太棒了!你已经成功地用Keras训练了一个深度学习模型,用Flask来serve该模型,并用Docker包装它。艰难的部分结束了。现在,让我们用Kubernetes来部署这个容器


步骤3—使用Kubernetes部署模型

    下一部分讲的很快。

    1、创建Docker中心账户(如果你没有)

    我们做的第一件事就是把我们的模型上传到Docker Hub。(如果你没有Docker Hub账户,现在就创建一个—别担心,这是免费的)。我们这样做的原因是,我们不会将我们的容器实际移动到Kubernetes集群。相反,我们将指示Kubernetes从集中托管的服务器(即Docker Hub )安装我们的容器。


    2 .登录你的Docker hub账户

    创建Docker Hub帐户后,通过sudo docker login从命令行登录。你需要提供你的用户名和密码,就像你登录网站一样。

    如果你看到这样的信息:

    Login Succeeded 

    然后你成功登录。现在让我们进入下一步。


    3 .给你的容器贴标签

    我们需要在我们的容器上贴标签,然后才能上传。把这一步想象成给我们的容器起一个名字。

    首先,运行sudo docker images,找到我们keras – app容器的image id。

    输出应该如下所示:

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图16

    现在,让我们标记我们的keras – app。请务必遵循我的格式,用你的特殊值替换image id和docker hub id的值。

    #Format
    sudo docker tag /
    #My Exact Command – Make Sure To Use Your Inputs
    sudo docker tag ddb507b8a017 gcav66/keras-app 


    4 .把我们的容器推到Docker hub

    现在我们可以推容器了。在shell中运行:

    #Format
    sudo docker push / 

    #My exact command
    sudo docker push gcav66/keras-app 

    现在,如果你导航回Docker Hub的网站,你应该会看到你的Keras – App存储库。干得好!我们已经准备好了。


    5 .创建Kubernetes集群

    从谷歌云主屏幕中,选择Kubernetes引擎

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图17

    然后创建一个新的Kubernetes集群

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图18

    接下来,我们将定制集群中节点的大小。我选择了带15 Gb RAM的4vCPUS。你可以用较小的集群来尝试这个。请记住,默认设置增加了3个节点,因此你的群集将拥有你配置资源的3倍,即在我的情况下,45 Gb的RAM。我有点懒,选择了更大的尺寸,因为我们的Kubernetes集群不会运行很长时间。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图19

    之后,只需单击“create”。你的集群需要一两分钟才能运转起来。

    现在让我们连接到集群。单击“Run in Cloud Shell”,调出Kubernetes集群的控制台。请注意,这是一个独立于虚拟机的shell环境,你在这里创建并测试了Docker容器。我们可以在虚拟机上安装Kubernetes,但是谷歌的Kubernetes服务会自动为我们安装。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图20

    现在我们在Kubernetes运行Docker container。请注意,图像标签只是指向我们在Docker Hub上托管的Docker image。此外,我们将使用- Port指定我们希望在Port 5000上运行我们的应用程序。

    kubectl run keras-app –image=gcav66/keras-app –port 5000 

    在Kubernetes,容器都在豆荚(pods)里运行。我们可以通过键入kubictl get pod来验证我们的pod正在运行。如果你在下面看到这样的东西,说明已经准备好了。

    gustafcavanaugh@cloudshell:~ (basic-web-app-test)$ kubectl get pods
    NAME READY STATUS RESTARTS AGE
    keras-app-79568b5f57-5qxqk 1/1 Running 0 1m 

    既然我们的pod还活着并且正在运行,我们需要将我们的pod通过80端口暴露给外界访问。这意味着任何访问我们部署的IP地址的人都可以访问我们的API。这也意味着我们不必像以前一样在我们的URL之后指定讨厌的端口号(告别: 5000 )。

    kubectl expose deployment keras-app —
type=LoadBalancer –port 80 –target-port 5000 

    我们快要接近成功了!现在,我们通过运行kubicl get服务来确定我们服务的部署状态(以及我们需要调用API的URL )。同样,如果这个命令的输出看起来像我下面的一样,说明成功了。

    gustafcavanaugh@cloudshell:~ (basic-web-app-test)$ kubectl get service
    NAME TYPE CLUSTER-IP EXTERNAL-IP
PORT(S) AGE
    keras-app LoadBalancer 10.11.250.71 

    35.225.226.94 80:30271/TCP 4m
    kubernetes ClusterIP 10.11.240.1
443/TCP 18m 

    牢记你的keras应用程序的集群IP,因为现在是关键时刻。打开你的本地终端(或者你手边有dog image的地方),运行以下命令调用API:

    curl -X POST -F image=@dog.jpg ‘http:///predict’ 

    尽情享受结果吧!

    如下所示,API正确返回了图片的Beagle标签。

    $ curl -X POST -F image=@dog.jpg ‘http://35.225.226.94/predict’
{“predictions”:                       [{“label”:”beagle”,”probability”:0.987775444984436},
    {“label”:”pot”,”probability”:0.0020967808086425066},
    {“label”:”Cardigan”,”probability”:0.001351703773252666},
    {“label”:”Walker_hound”,”probability”:0.0012711131712421775},

    {“label”:”Brittany_spaniel”,”probability”:0.0010085132671520114}],”success”:true} 


步骤4 -结束

    在本教程中,我们使用Keras和Flask训练并提供了一个深度学习模型作为REST API。然后,我们将该应用程序放入Docker容器中,将容器上传到Docker Hub,并将其与Kubernetes一起部署。

    Kubernetes只用了两个命令就部署了我们的应用程序,并向世界展示了它。拍拍自己的背——你应该感到自豪。

    现在,我们可以对这个项目做出许多改进。首先,我们应该将运行flask应用程序的python web服务器从本地python服务器更改为类似gunicorn的生产级服务器。我们还应该探索Kubernetes的扩展和管理特性,我们几乎没有提到这一点。最后,可以尝试从头开始构建Kubernetes环境。

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图21
扫描下方二维码可以订阅哦!
工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图22
工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图23

DeepLearning_NLP

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图24

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图25

深度学习与NLP

工业级实战 - 一文教会你基于Docker在Kubernetes上部署深度学习模型插图24

       商务合作请联系微信号:lqfarmerlq

    发送中

    点赞