使用Kubernetes和TensorFlow Serving将神经网络镜像分类进行弹性扩容

导言

Google近日3月23-24日在美国旧金山举办首次谷歌云平台(Google Cloud Platform) GCP NEXT大会,参会人数超过2000人。GCP NEXT大会以机器学习、资料中心和云端安全为主要议题,为将来GCP发展作战略规划。html

其中,关于机器学习,谷歌发布了云端机器学习平台(Cloud Machine Learning),为开发者和企业用户提供一整套包含视听及翻译的应用API,例如Cloud Translate API和Cloud Vision API。除了machine learning,谷歌去年就推出了机器学习开放原始码平台TensorFlow,鼓励开发者利用该平台来开发创新应用服务。如今TensorFlow和Kubernetes相结合,将创建更为强大的机器学习模型,扩充功能,开启人工智能机器学习在谷歌云端的新纪元。node

在2011年,谷歌开发了一个内部深度学习基础设施叫作“DistBelief”,这个设施容许谷歌人建立更大的神经网络和扩容实训成千上万个核心。最近几年,谷歌引进了TensorFlow,也就是它的二代机器学习系统。TensorFlow的特色是通用,灵活的,便携的,易于使用,最重要的是,它是使用开源社区开发的。git

图片描述

将机器学习引入到你的产品的过程包括建立和训练数据集模型。github

引入机器学习到你的产品这个过程涉及到建立和训练模型在你的数据集上,而后push模型到生产过程来提供请求。在这篇博客中,咱们将会展现给大家如何经过TensorFlow使用Kubernetes,TensorFlow是一个高性能,知足应用程序的扩展需求,为机器学习模型提供开源服务系统。docker

如今让咱们以镜像做为例子。假设你的应用程序须要可以在一系列类别中正确的识别一个镜像。好比,给出下面这个可爱的小狗图,你的系统应该将它归类到猎犬这一类。json

图片描述

你能够经过TensorFlow使用从ImageNet数据集上面trained的Inception-v3模型,来实现图像分类。这个数据集包含图片和标签,容许TensorFlow学习者train一个模型,该模型能够被用在生产过程当中。api

图片描述

一旦模型被训练和输出,TensorFlow服务使用该模型来进行推理——基于客户提供的新数据的预言。在咱们的例子中,客户在gRPC请求提交镜像分类,gRPC是一个来自谷歌的高性能,开源RPC的框架。安全

图片描述

推理能够是十分资源密集型的。咱们的服务器执行如下TensorFlow来处理它接收到的每个分类的要求。Inception-v3模型有超过2700万个参数,每次运算推理(inference)运行57亿浮点。服务器

图片描述

幸运地,这就是Kubernetes能够帮助到咱们的地方。Kubernetes分布推断请求处理跨集群使用外部负载均衡器。集群中的每一个pod都包含一个TensorFlow服务于Docker镜像,还有TensorFlow服务为基础的gRPC服务器,以及一个trained的Inception-v3模型。这个模型以文件集描述TensorFlow图的形式呈现,模型权重,资产等等。既然全部东西都是整齐的打包好放到一块儿,那么咱们就可使用Kubernetes Replication Controller动态的扩展复制pods,以此来跟上服务要求。网络

为了帮助你本身试一试,咱们写了一个tutorial教程,它展现了如何建立TensorFlow服务Docker容器来给Inception-v3镜像分类模型提供服务,安装Kubernetes集群,而且应对该集群运行分类请求。咱们但愿这个教程可以让你更加容易地去整合机器学习到你本身的程序上,以及用Kubernetes扩大规模。学习更多关于TensorFlow,请看下文补充:

用TensorFlow Serving和Kubernetes给Inception模型提供服务

这个tutorial展现了如何使用TensorFlow Serving组件在容器里面的运用,以此来服务TensorFlow模型,还展现了如何用Kubernetes配置服务中的集群。

为了解更多关于TensorFlow服务的信息,咱们推荐《TensorFlow服务初级教程》和《TensorFlow服务教程》。

为了解更多关于TensorFlow Inception模型,咱们推荐《Inception in TensorFlow》。

  • Part0 展现的是怎样为配置建立一个TensorFlow服务Docker

  • Part1 展现的是如何在本地容器运行镜像

  • Part2 展现了如何在kubernetes上配置

Part0: 建立一个Docker镜像

请参考《经过Docker使用TensorFlow服务》来了解建立过程当中的更多细节。

运行容器

咱们使用Dockerfile.devel来建立一个基底镜像$USER/tensorflow-serving-devel,而后使用建立好的镜像来启动本地容器。

$ docker build -t $USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile.devel .$ docker run --name=inception_container -it $USER/tensorflow-serving-devel

在容器中克隆,配置以及建立TensorFlow服务

在运行的容器中,咱们克隆,配置以及建立TensorFlow服务。而后测试运行 inception_inference(网址:点击

root@c97d8e820ced:/# git clone --recurse-submodules https://github.com/tensorflow/servingroot@c97d8e820ced:/# cd serving/tensorflowroot@c97d8e820ced:/serving/tensorflow# ./configureroot@c97d8e820ced:/serving# cd ..root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/...root@c97d8e820ced:/serving# ls
AUTHORS          LICENSE    RELEASE.md  bazel-bin       bazel-out      bazel-testlogs  tensorflow          zlib.BUILD
CONTRIBUTING.md  README.md  WORKSPACE   bazel-genfiles  bazel-serving  grpc            tensorflow_servingroot@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_inference
E tensorflow_serving/example/inception_inference.cc:362] Usage: inception_inference --port=9000 /path/to/exports

容器中的输出Inception

在容器中,咱们运行inception_export.py(点击)使用发布的Inception model training checkpoint(点击)来出口inception模型。咱们使用训练有素的现成的动态检查点来恢复直接推理,而且直接输出它。

root@c97d8e820ced:/serving# curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gzroot@c97d8e820ced:/serving# tar xzf inception-v3-2016-03-01.tar.gzroot@c97d8e820ced:/serving# ls inception-v3
README.txt  checkpoint  model.ckpt-157585root@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_export --checkpoint_dir=inception-v3 --export_dir=inception-export
Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585.
Successfully exported model to inception-exportroot@c97d8e820ced:/serving# ls inception-export
00157585root@c97d8e820ced:/serving# [Ctrl-p] + [Ctrl-q]

提交镜像到配置

注意咱们从上述指令的容器中分离出来而不是终止它,由于咱们想要为Kubernetes配置提交全部的修改到新的镜像 $USER/inception_serving

$ docker commit inception_container $USER/inception_serving$ docker stop inception_container

Part1:在本地Docker容器运行

让咱们在本地用建立的镜像测试一下服务流程。

$ docker run -it $USER/inception_serving
  • 开启服务器

在容器中运行gRPC服务器

root@f07eec53fd95:/# cd servingroot@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_inference --port=9000 inception-export &> inception_log &[1] 45
  • 查询服务器

用inception_client.py.(点击)。客户端经过gRPC用一个命令行参数发送一个指定的镜像到服务器。而后查找ImageNet同义词集合和元数据文件,而且返回到人类可读的分类。

root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_client --server=localhost:9000 --image=/path/to/my_cat_image.jpg
8.976576 : tabby, tabby cat
8.725506 : Egyptian cat
6.883981 : tiger cat
2.659257 : lynx, catamount
2.028728 : window screenroot@f07eec53fd95:/serving# exit

它运行起来了!服务器成功地分类了你的cat镜像!

Part2:在kubernetes上配置

在这一节里,咱们使用Part0中建立的容器镜像来配置一个服务集群,用的是Google Cloud Platform中的Kubernetes。

  • Cloud项目登陆
    这里咱们假设你已经建立而且已经登录了名“ tensorflow-serving”gcloud项目。

$ gcloud auth login --project tensorflow-serving
  • 建立一个容器集群

首先,咱们为服务配置建立一个Google Container Engine集群。

$ gcloud container clusters create inception-serving-cluster --num-nodes 5
Creating cluster inception-serving-cluster...done.
Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster].
kubeconfig entry generated for inception-serving-cluster.
NAME                       ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
inception-serving-cluster  us-central1-f  1.1.8           104.197.163.119  n1-standard-1  1.1.8         5          RUNNING

为gcloud容器命令设置默认集群,而且发送集群凭证到kubectl。

$ gcloud config set container/cluster inception-serving-cluster$ gcloud container clusters get-credentials inception-serving-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for inception-serving-cluster.

首先,咱们给$USER/inception_serving 镜像贴上标签,用Container Registry格式以及咱们的项目名称,

$ docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception

下面咱们push镜像到Registry,

$ gcloud docker push gcr.io/tensorflow-serving/inception
  • 建立Kubernetes ReplicationController 和服务
    配置包括不一样的副本inception_inference 被一个kubernetes Replication Controller服务器控制。副本是由Kubernetes以及外部负载均衡起暴露在外部的。

咱们使用那个Kubernetes公式inception_k8s.json的例子建立他们。

$ kubectl create -f tensorflow_serving/example/inception_k8s.json
replicationcontroller "inception-controller" created
service "inception-service" created

来看一下副本控制器和pods:

$ kubectl get rc
CONTROLLER             CONTAINER(S)          IMAGE(S)                              SELECTOR               REPLICAS   AGE
inception-controller   inception-container   gcr.io/tensorflow-serving/inception   worker=inception-pod   3          20s

$ kubectl get pod
NAME                         READY     STATUS    RESTARTS   AGE
inception-controller-bbcbc   1/1       Running   0          1m
inception-controller-cj6l2   1/1       Running   0          1m
inception-controller-t1uep   1/1       Running   0          1m

来看一下服务的状态:

$ kubectl get svc
NAME                CLUSTER_IP      EXTERNAL_IP      PORT(S)    SELECTOR               AGE
inception-service   10.15.242.244   146.148.88.232   9000/TCP   worker=inception-pod   3m
kubernetes          10.15.240.1     <none>           443/TCP    <none>                 1h

$ kubectl describe svc inception-service
Name:     inception-service
Namespace:    default
Labels:     <none>
Selector:   worker=inception-pod
Type:     LoadBalancer
IP:     10.15.242.244
LoadBalancer Ingress: 146.148.88.232
Port:     <unnamed> 9000/TCP
NodePort:   <unnamed> 32006/TCP
Endpoints:    10.12.2.4:9000,10.12.4.4:9000,10.12.4.5:9000
Session Affinity: None
Events:
  FirstSeen LastSeen  Count From      SubobjectPath Reason      Message
  ───────── ────────  ───── ────      ───────────── ──────      ───────
  4m    3m    2 {service-controller }     CreatingLoadBalancer  Creating load balancer
  3m    2m    2 {service-controller }     CreatedLoadBalancer   Created load balancer

任何东西上传或者运行都须要时间。服务的外部IP地址就在LoadBalancer旁边被列出来。

  • 查询模型

咱们如今能够从咱们的本地主机外部地址查询服务。

$ bazel-bin/tensorflow_serving/example/inception_client --server=146.148.88.232:9000 --image=/path/to/my_cat_image.jpg
8.976576 : tabby, tabby cat
8.725506 : Egyptian cat
6.883981 : tiger cat
2.659257 : lynx, catamount
2.028728 : window screen

你已经在Kubernetes里成功部署了inception服务。

原文在这里

(若是须要转载,请联系咱们哦,尊重知识产权人人有责)

相关文章
相关标签/搜索