使用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服務。

原文在這裏

(若是須要轉載,請聯繫咱們哦,尊重知識產權人人有責)

相關文章
相關標籤/搜索