简单到老板也可以亲自部署
这篇博文演示了如何通过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环境。
领取专属 10元无门槛券
私享最新 技术干货