登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 673|回复: 0

怎样利用 Kubernetes 轻松摆设深度学习模子

[复制链接]

386

主题

12

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
36
发表于 2018-10-16 16:06:34 | 显示全部楼层 |阅读模式 来自 江苏徐州
泉源:呆板之心


lqmb9qbbSYY9Vs61.jpg
本文展示了怎样用 Keras 构建深度学习模子的简朴示例,将其作为一个用 Flask 实现的 REST API,并利用 Docker 和 Kubernetes 举行摆设。本文给出的并不是一个鲁棒性很好的可以或许用于生产的示例,它只是为那些听说过 Kubernetes 但没有动手实验过的人编写的快速上手指南。
为此,我在这个过程的每个步调中都利用了 Google Cloud。如许做的缘故原由很简朴——我并不想在我的 Windows 10 家用条记本上安装 Docker 和 Kubernetes。而谷歌云能很好地支持这二者的工作。别的,你可以正确地按照我接下来所利用的规范流程举行操纵,这可以资助你更轻易地复现我的步调。而且,你也不消担心实践这篇文章的本钱。谷歌为新账户提供了几百美金的免费额度,而实现本文示例所需的费用只不外是九牛一毛。
为什么要将 Kubernetes 用于呆板学习和数据科学?
Kubernetes 及其附属的盛行概念「云原生」(cloud-native)正席卷环球。别担心——你有所猜疑是对的。我们都见证过铺天盖地的「人工智能」、「大数据」、「云盘算」等术语的技能泡沫。Kubernetes 是否也会发生雷同的环境,另有待观察。
但是,现在很多对数据科学一孔之见的人会误导我们,以是我对转而利用 Kubernetes 的缘故原由并不感爱好也不明白。我的动机很简朴,我盼望摆设、扩展、管理一个可以或许提供猜测本领的 REST API。在下文中,你会看到 Kubernetes 会使这统统非常轻易。
让我们开始吧!
大纲
1. 利用 Google Cloud 创建你的情况。
2. 利用 Keras、Flask 和 Docker 提供深度学习模子接口。
3. 利用 Kubernetes 摆设上述模子。
4. 享受你所把握的新知识吧!
步调 1:利用 Google Cloud 创建你的情况
我在谷歌盘算引擎上利用一个小型假造机来构建、摆设、docker 化深度学习模子。你并不肯定非要这么做。我曾试过在我的 Windows 10 条记本上安装最新版本的 Docker CE(Community Edition),但是失败了。因此我决定直接利用免费的 Google Cloud 额度,这比弄清怎样安装 Docker 能更好地使用我的时间。你可以选择是否要如许做。
cknMmbM4kMKwvmEc.jpg
要想启动一台 Google Cloud 假造机,你可以打开屏幕左侧的工具栏。选择 Compute Engine。接着,选择「Create Instance」。如下图所示,我已经拥有了一个正在工作的假造机实例。
o2nHZ42kNhJg45DO.jpg
下一步,你必要选择你想要利用的盘算规模。默认的(最自制的)呆板设置也可以很好地工作,但是思量到我们最多只必要利用这个假造机约莫 1 小时,我选择了内存为 15GB 的 4vCPU 设置。
UQXECyxEKEemeEme.jpg
接下来,我将选择要利用的操纵体系和磁盘空间。选择「Boot Disk」来编辑默认值。这里我选择了 Centos 7 作为操纵体系,并将磁盘的巨细从 10GB 增长到了 100GB。现实上,并不肯定要像我一样选择 Centos 操纵体系。但是,我发起将磁盘巨细增长到 10GB 以上,由于我们创建的每个 Docker 容器的巨细都约莫为 1GB。
H6k0MUjv9H9dj6XE.jpg
创建假造机的末了一步是设置防火墙答应利用 HTTP/S。诚然,我并不知道是否必要这个步调。在摆设 Kubernetes 之前,我将展示怎样编辑防火墙设置以在假造机上测试我们的 API。因此,仅仅检察这些对话框是不敷的,我们另有更多的工作要做。从前我并没有检察这些对话框,如今我重新试试按照这个教程去做。
T595950FUhQHlQFF.jpg
我并不确定是否必要此步调。
如今单击「Creat」按钮。很好,困难的部门根本上已经完成了。
fpBA20OVvozpFIAo.jpg
步调 2:利用 Keras 构建深度学习模子
如今,让我们利用 SSH 毗连到假造机,并开始构建模子。最简朴的方法是单击下图所示的假造机旁边的 SSH 图标。这个操纵会在你的欣赏器中打开一个终端。
vQ8955ffchpv59q2.jpg
1. 卸载已有的 Docker 版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine请留意,假如你利用的操纵体系不是 Centos 7,指令大概差别。
2. 安装最新版 Docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2sudo yum-config-manager — add-repo http://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce3. 启动 Docker 并运行测试脚本
sudo systemctl start dockersudo docker run hello-world假如你看到下图所示的返回效果,你就完成了 Docker 的摆设。
Hello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.4. 创建我们的深度学习模子
我们将复制一段 Adrian Rosebrock 写的脚本。Adrian 写了一篇很棒的教程,关于怎样使用 Keras 构建深度学习模子并利用 Flask 摆设它。教程拜见:http://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html
我们必要对 Adrian 的脚本举行两处关键的修改,才气使其运行。假如你不关心 Docker 和 TensorFlow 的技能细节,请跳过下面两段。
我们要修改的第一个地方与 Docker 有关。在当地运行应用步伐时,默认的 flask behavior 会在当地主机(127.0.0...)上提供应用步伐服务。在 Docker 容器内运行时,这大概会产生一些题目。办理的方法很简朴。当调用 app.run() 时,利用 app.run(host='0.0.0.0') 将 URL 设置为 0.0.0.0。如许,我们的应用就可以在当地主机和外部 IP 上同时利用了。
下一个题目涉及 TensorFlow。当我运行 Adrian 的原始脚本时,我无法乐成调用模子。于是,我阅读了下面这个 Github issue(http://github.com/tensorflow/tensorflow/issues/14356),并对代码举行了修改。
global graphgraph = tf.get_default_graph()...with graph.as_default(): preds = model.predict(image)说真话,我也不知道为什么如许做就行得通。但它确实做到了。以是就如许运行吧。
起首,创建一个名为 keras-app 的新文件夹,并将当前的路径移动到该文件夹中。
mkdir keras-appcd keras-app如今我们创建一个名为 app.py 的文件。你可以本身选择要利用的编辑器。我在这里选用 vim,输入下面的指令创建并打开 app.py:
vim app.py打开文件后,敲击键盘上的「i」键,进入插入模式。如今你可以把下面的代码粘贴进去:
# USAGE# Start the server:# python app.py# Submit a request via cURL:# curl -X POST -F [email protected] 'http://localhost:5000/predict'# import the necessary packagesfrom keras.applications import ResNet50from keras.preprocessing.image import img_to_arrayfrom keras.applications import imagenet_utilsfrom PIL import Imageimport numpy as npimport flaskimport ioimport tensorflow as tf# initialize our Flask application and the Keras modelapp = flask.Flask(__name__)model = Nonedef load_model(): # load the pre-trained Keras model (here we are using a model # pre-trained on ImageNet and provided by Keras, but you can # substitute in your own networks just as easily) global model model = ResNet50(weights="imagenet") global graph graph = tf.get_default_graph()def prepare_image(image, target): # if the image mode is not RGB, convert it if image.mode != "RGB": image = image.convert("RGB") # resize the input image and preprocess it image = image.resize(target) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = imagenet_utils.preprocess_input(image) # return the processed image return [email protected]("/predict", methods=["POST"])def predict(): # initialize the data dictionary that will be returned from the # view data = {"success": False} # ensure an image was properly uploaded to our endpoint if flask.request.method == "POST": if flask.request.files.get("image"): # read the image in PIL format image = flask.request.files["image"].read() image = Image.open(io.BytesIO(image)) # preprocess the image and prepare it for classification image = prepare_image(image, target=(224, 224)) # classify the input image and then initialize the list # of predictions to return to the client with graph.as_default(): preds = model.predict(image) results = imagenet_utils.decode_predictions(preds) data["predictions"] = [] # loop over the results and add them to the list of # returned predictions for (imagenetID, label, prob) in results[0]: r = {"label": label, "probability": float(prob)} data["predictions"].append(r) # indicate that the request was a success data["success"] = True # return the data dictionary as a JSON response return flask.jsonify(data)# if this is the main thread of execution first load the model and# then start the serverif __name__ == "__main__": print(("* Loading Keras model and Flask starting server..." "please wait until server has fully started")) load_model() app.run(host='0.0.0.0')当你复制以上代码后,敲击「Esc」键退出插入模式。
然后输入 :x,生存并关闭文件。
5. 创建一个 requirements.txt 文件
如今回到正题。我们将在 Docker 容器中运行这段代码。为了做到这一点,我们起首要创建一个 requirements.txt 文件。这个文件将包罗代码必要运行的步伐包(如 keras、flask 等)。如许一来,无论我们将 Docker 容器装载在那里,底层的服务器都可以或许安装代码所需的依靠。
kerastensorflowflaskgeventpillowrequests6. 创建 Dockerfile
很好!如今让我们创建 Dockerfile。这是 Docker 将要读取的文件,用它来构建和运行我们的项目。
FROM python:3.6WORKDIR /appCOPY requirements.txt /appRUN pip install -r ./requirements.txtCOPY app.py /appCMD ["python", "app.py"]~如今,我们正引导 Docker 下载一个 Python 3 的底子镜像。然后,要求 Docker 利用 Python 步伐包管理器 pip 安装 requirements.txt 文件中具体指定的包。
接着,我们让 Docker 通过 python app.py 指令运行我们的脚本。
7. 创建 Docker 容器
现在统统希望顺遂,如今让我们构建并测试我们的应用步伐。
为了构建我们的 Docker 容器,我们必要运行如下指令:
sudo docker build -t keras-app:latest .该指令将引导 Docker 为我们当前工作空间的文件夹 keras-app 中的代码构建一个容器。
这个指令必要一到两分钟才气运行完成。在此过程中,Docker 会下载一个 python 3.6 的镜像而且安装 requirements.txt 中列出的包。
8. 运行 Docker 容器
如今,让我们运行 Docker 容器来测试我们的应用步伐。
sudo docker run -d -p 5000:5000 keras-app注:通过上面的指令中的数字 5000:5000,我们告诉 Docker 让端口 5000 处于外部可用状态,并把我们的当地应用步伐指向该端口(它也在端口 5000 上当地运行)。
你可以通过运行 sudo docker ps -a 检察 Docker 容器的状态。你应该看到如下图所示的效果:
[gustafcavanaugh@instance-3 ~]$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd82f65802166 keras-app "python app.py" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp nervous_northcutt9. 测试模子
我们的模子可以或许乐成运行后,是时间测试一下它的性能了。该模子将狗的图片作为输入,并返回狗的品种。在 Adrian 的 repo 中,他提供了一个示例图片,我们在这里也将利用它。
J3oOb4x4JG45xHxo.jpg
在终端中运行:
curl -X POST -F [email protected] 'http://localhost:5000/predict'确保你当前的文件夹中有狗狗的图片「dog.jpg」(或提供精确的文件路径),你会看到下面的运行效果:
{"predictions":[{"label":"beagle","probability":1},{"label":"pot","probability":1},{"label":"Cardigan","probability":1},{"label":"Walker_hound","probability":1},{"label":"Brittany_spaniel","probability":1}],"success":true}我们可以看到,模子精确地将狗狗分类为小猎犬。太棒了!你已经乐成地用 Keras 运行了一个预练习好的深度学习模子,而且利用 Flask 摆设其服务、用 Docker 将其封装了起来。至此,我们已经完成了困难的部门。如今让我们用 Kubernetes 摆设该容器。
步调 3:用 Kubernetes 摆设我们的模子
1. 创建一个 Docker Hub 账户(假如你没有的话)
我们要做的第一件事是将模子上传到 Docker Hub 上。假如你还没有 Docker 账户,请创建一个,别担心,这是免费的。我们如许做的缘故原由是,我们不会将容器物理移动到 Kubernetes 集群上,而是引导 Kubernetes 在会合托管服务器(即 Docker Hub)上安装我们的容器。
2. 登录 Docker Hub 账户
创建好 Docker Hub 账户后,你可以通过 sudo docker login 指令从下令行登录。你必要提供用户名、暗码,就像你登录网站一样。
假如你看到下面的信息:
Login Succeeded那么你就乐成登录了。如今让我们举行下一步。
3. 对容器定名
在上传容器之前,我们必要为容器打标签。你可以将此步调看做为容器定名。
起首,运行 sudo docker images,并定位 keras-app 容器的镜像 id。
输出应该如下所示:
REPOSITORY TAG IMAGE ID CREATED SIZE keras-app latest ddb507b8a017 About an hour ago 1.61GB如今,我们可以为 keras-app 打标签了。请务必遵照我的格式,并将镜像 id 和 docker hub id 的值更换为你本身指定的值。
#Formatsudo docker tag  /#My Exact Command - Make Sure To Use Your Inputssudo docker tag ddb507b8a017 gcav66/keras-app4. 将容器 push 到 Docker Hub 上
如今可以 push 我们的容器了。在 shell 中运行以下行:
#Formatsudo docker push /#My exact commandsudo docker push gcav66/keras-app如今,假如你返回到 Docker Hub 网站,你就可以看到你的 keras-app repo 了。很好,接下来,我们将进入末了一步。
5. 创建一个 Kubernetes 集群
在 Google Cloud 的主页上选择 Kubernetes Engine:
VL3PJLzZ50lP83xb.jpg
接着创建一个新的 Kubernetes 集群:
vCP8erRkLweEbdlC.jpg
接下来,我们将自界说该集群中节点的规模。我选择了内存为 15GB、4vCPU 的设置。你可以在更小的集群上举行实验。请记着,默认设置包罗 3 个节点,以是整个集群会拥有 3 倍于你所选择的资源(即,在本例中为 45GB 内存)。我在这里偷个懒,选择了更大的规模,如许我们的 Kubernetes 集群不会运行太长时间。
IZ1AZK30vI0234i4.jpg
接着,只需点击 Creat。等上一两分钟,你的集群就能运转了。
如今让我们毗连到集群。点击 Run in Cloud Shell,就可以为 Kubernetes 集群提供控制台。请留意,这是假造机中的一个单独 shell 情况,你在这里可以创建并测试 Docker 容器。我们可以在假造机上安装 Kubernetes,谷歌的 Kubernetes 服务会主动为我们完成这个步调。
iMa9uWXM3dMAL0qw.jpg
如今,在 Kubernetes 上运行我们的 docker 容器。请留意,镜像标签仅指向我们在 Docker Hub 上托管的 docker 镜像。别的,我们通过——port 指定我们想在端口 5000 上运行应用。
kubectl run keras-app --image=gcav66/keras-app --port 5000在 Kubernetes 中,容器都在 pod(容器聚集)中运行。我们可以输入 kubectl get pods 来验证我们的 pod 是否正在运行。假如你看到下面的效果,你就完成了设置。
gustafcavanaugh@cloudshell:~ (basic-web-app-test)$ kubectl get podsNAME READY STATUS RESTARTS AGEkeras-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就要完成了!如今,运行 kubectl get service 来确定我们的摆设(以及我们调用 API 所需的 URL)的状态。同样地,假如下令的输出效果和下图所示的效果雷同,你就完成了这一步!
gustafcavanaugh@cloudshell:~ (basic-web-app-test)$ kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkeras-app LoadBalancer 10.11.250.71 35.225.226.94 80:30271/TCP 4mkubernetes ClusterIP 10.11.240.1  443/TCP 18m如今是关键时候了!请获取 keras 应用步伐的 cluster-ip。打开当地终端(大概存有狗狗照片的地方),运行 curl -X POST -F [email protected] 'http:///predict' 指令调用 API。
享受你的实行效果吧!
如下所示,API 精确地为该图返回了「小猎犬」的标签。
$ curl -X POST -F [email protected] 'http://35.225.226.94/predict'{"predictions":[{"label":"beagle","probability":1},{"label":"pot","probability":1},{"label":"Cardigan","probability":1},{"label":"Walker_hound","probability":1},{"label":"Brittany_spaniel","probability":1}],"success":true}步调 4:封装
在本教程中,我们利用 Keras 和 Flask 实现了一个深度学习模子,并将其摆设为 REST API。然后我们把这个应用步伐放在 Docker 容器中,将该容器上传至 Docker Hub,而且利用 Kubernetes 对其举行摆设。
只必要两个指令,Kubernetes 就摆设好了我们的应用步伐并向外部提供服务。你应该为此而感到自大。
如今,我们可以对这个项目做出许多改进。起首,我们应该将运行 flask 应用步伐的 python web 服务器从当地 python 服务器更换为 gunicorn 如许的生产级服务器。我们还应该探索 Kubernetes 的扩展和管理特性,这是本文中险些没有涉及到的。末了,我们可以实验重新开始创建一个 kuberenetes 情况。




上一篇:LAMP(Ubuntu16+PHP7.0)安装WordPress
下一篇:FastDFS分布式文件上传体系的搭建
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-17 17:38 , Processed in 0.056873 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表