用Python/Keras/Flask/Docker在Kubernetes上部署深度学习模型

简单到老板也可以亲自部署

这篇博文演示了如何通过Docker和Kubernetes,用Keras部署深度学习模型,并且通过Flask提供REST API服务。

这个模型并不是强壮到可供生产的模型,而是给Kubernetes新手一个尝试的机会。我在Google Cloud上部署了这个模型,而且工作的很好。另外用户可以用同样的步骤重现以上功能。如果用户担心成本,Google提供了大量免费机会,这个演示基本没有花钱。

为什么用Kubernetes来做机器学习和数据科学

Kubernetes以及Cloud Native,正在席卷整个世界,我们已经感受到了。我们正处在一个由AI/Big Data/Cloud驱动的技术风暴中心,Kubernetes也正在加入这个中心。

但是如果从数据科学角度看并没有使用Kubernetes的特殊原因。但是从部署,扩展和管理REST API方面来看,Kubernetes正在实现简易化的特性。

步骤预览:

在Google Cloud上创建用户

使用Keras/Flask/Docker搭建一个REST API的机器学习模型服务

用Kubernetes部署上述模型

enjoy it

步骤一:在Google Cloud上创建用户

我在Google Compute Engine上创建了一个对外提供服务的容器化深度学习模型,当然Google平台并不是必须的,只要能够安装Docker,随便选择平台模式。

进入Google云平台,点击左侧屏幕选择Compute Engine,启动Google Cloud VM。然后选择“Create Instance”,可以看到已经运行的实例。

下一步选择计算资源。默认设置就足够,因为只是演示,我选择了4vCPUs和15G内存。

选择操作系统和磁盘大小。我选择了CentOS 7,100G硬盘。建议磁盘大于10G,因为每个Docker容器有1G大小。

最后一步是配置允许HTTP/S工作的防火墙策略。建议选择全部透明,以便减少麻烦。

选择“Create”,一切进展顺利。

步骤二:用Keras创建深度学习模型

SSH登录到虚机开始建立模型。最简单方式就是点击虚机下方的SSH图标,会在浏览器中打开一个终端。

1、删除预装Docker

2、安装最新Docker版本

3、启动容器运行测试脚本

以下是正确输出:

4、创建深度学习模型这里会借用Adrian Rosebrock的一个脚本,他提供了使用Keras的深度学习模型并通过Flask提供服务的教程,可以从这里[1]访问。

这个模型可以直接执行。但是我修改了两个配置信息:

首先,改变了容器配置,默认flask使用127.0.0....作为默认服务地址,这会在容器内部运行时出现问题。我将它修改成0.0.0.0,这样就可以实现对外和对内都可以工作的IP地址。

第二是关于Tensorflow的配置,可以从GitHub中找到这个问题描述[2]。

运行脚本,首先创建专用目录:

创建app.py文件: vim app.py

5、创建requirements.txt文件

为了在容器内运行代码,需要创建requirements.txt文件,其中包括需要运行的包,例如keras、flask、一起其它相关包。这样无论在哪里运行代码,依赖包都保持一致。

6、创建Dockerfile

首先让容器自行下载Python 3安装image,然后让Python调用pip安装requirements.txt中的依赖包,最后运行python app.py。

7、创建容器

在keras-app目录下创建容器,后台开始安装Python 3 image等在步骤6中定义的操作。

8、运行容器

用 sudo docker ps-a检查容器状态,应该看到如下输出:

9、测试模型

现在可以测试此模型。用狗的照片作为输入,可以返回狗的品种。在Adrian的示例中都有该图片,我们也使用它们,并保存自工作目录下,命名为dog.jpg。

执行命令:

应该得到如下输出:

可以看到此模型成功将狗归类为比格犬。下一步,我们用Kubernetes部署容器模型。

第三步:用Kubernetes部署模型

1、创建Docker Hub账号

第一步需要在Docker hub上传模型,以便使用Kubernetes集中管理。

2、登录到Docker Hub

sudo docker login, 登录到Docker Hub,应该看到如下输出:

3、给容器打标签

给模型容器命名,上传前先给它打标签。

sudo docker images,应该得到容器的id,输出如下:

打标签命令如下:

4、将模型容器上传到Docker Hub

运行命令如下:

5、创建Kubernetes集群

在Google Cloud Home界面,选择Kubernetes Engine。

创建新集群:

选择集群内节点资源,因为要启动三个节点(每个节点4vCPU和15G内存),至少需要12vCPU和45G内存。

连接集群,Google’s Kubernetes自动会在VM上安装Kubernetes。

在Kubernetes中运行容器:

确认是否Pod正确运行 kubectlgetpods,输出如下:

为了安全起见,将服务端口暴露与80端口:

确认服务正常启动: kubectlgetservice,正常输出如下:

提取cluster-IP,并将其合并于服务提交命令: curl-X POST-F image=@dog.jpg'http:///predict',得到正常输入如下:

第四步:总结

本文提供了一个使用Keras和Flask提供REST API服务的深度学习模型,并把它集成到容器内部,上传到Docker Hub,并用Kubernetes部署,非常容易地实现了对外提供服务和访问。

现在,我们可以对这个项目进行很多改进。对于初学者,可以改变本地Python服务到更加强壮的gunicorn;可以横向扩展Kubernetes,实现服务扩容;也可以从头搭建一套Kubernetes环境。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181108B0CM2F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券