TensorFlow on Kubernetes(下)

TensorFlow on Kubernetes(下)

在上一回我們提到 TensorFlow 分散式運算功能,並列舉一些 TensorFlow 在分散式中的問題,如叢集的管理、行程生命週期管理等,皆為預設的 TensorFlow 框架無法處理的問題。而這些問題正好是 Kubernetes 拿手之領域。本篇將利用 Kubernetes 建構一套 TensorFlow 分散式運算服務平台,其功能與架構如下圖所示,我們將依序建構該系統元件:

Kubernetes

首先須建立一個 Kubernetes 來提供操作與建構 TensorFlow 使用,其架構如下所示:

節點使用虛擬機,作業系統為`Ubuntu 16.04 Server LTS`,細節資訊如下表:

透過 Kube-ansible 工具來進行部署測試環境,在開始進行前需要先下載並安裝 Vagrant 與 Virtualbox 工具,並透過以下步驟執行:

$ git clone https://github.com/kairen/kube-ansible.git
$ cd kube-ansible
$ ./setup-vagrant -n 3 -m 4096
Cluster Size: 1 master, 3 node.
VM Size: 1 vCPU, 4096 MB
VM Info: ubuntu16, virtualbox
Start deploying?(y): y

完成後即可透過 vagrant 進到虛擬機操作 Kubernetes:

$ vagrant ssh master1
$ kubectl get node
NAME         STATUS         AGE       VERSION
master1      Ready,master   2h        v1.6.2
node1        Ready          2h        v1.6.2
node2        Ready          2h        v1.6.2
node3        Ready          2h        v1.6.2

Kubernetes 叢集部署完成後,接著在 master1節點安裝 NFS Server提供共享儲存,依據以下執行指令:

$ sudo apt-get install -y nfs-kernel-server
$ sudo mkdir -p /var/nfs
$ cat <EOF > /etc/exports
/var/nfs *(rw,sync,no_subtree_check)
EOF
$ sudo systemctl restart nfs-server.service

TensorFlow Applications

完成部署 Kubernetes 後,即可開始進行 TensorFlow 應用程式的建置。在此提供以下範例程式提供抓取使用:

$ git clone https://github.com/kairen/workshop413.git
$ cd workshop413/k8s/lab01
$ ls
client.yml &nbsp;pv.yml &nbsp;tensorboard.yml &nbsp;worker.yml

在此將看到四個檔案。

首先須建立一個 Persistent Volume 與 Persistent Volume Claim 來提供共享儲存,編輯 pv.yml 修改以下內容:

nfs:
path: /var/nfs
server: 172.16.35.13

完成後,透過 kubectl 指令來建立儲存,並查看狀態:

$ kubectl create -f pv.yml
$ kubectl get pv,pvc

若看到STATUS>顯示為 Bound,表示儲存建立成功。

接著建立 Master service,編輯 client.yml檔案,修改以下部分內容:

externalIPs:
- 172.16.35.9

完成後,同樣利用 kubectl 指令來建立 Master service,並查看狀態:

$ kubectl create -f client.yml
$ kubectl get svc,po
NAME               CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
svc/kubernetes     192.160.0.1       <none>          443/TCP          3h
svc/tf-client      192.175.52.16     ,172.16.35.9    8888:30805/TCP   1m
NAME                              READY     STATUS    RESTARTS   AGE
po/tf-client-998136869-3f8x9      1/1       Running   0          1m

當狀態顯示為Running,即可透過瀏覽器開啟http://172.16.35.9:8888。

雖然現在有了 Master service,但缺少實際執行運算的節點,因此可透過 worker.yml 檔案來建立 Worker service,編輯該檔案修改以下內容:

externalIPs:
- 172.16.35.9

完成後,透過指令建立 Worker service,並查看狀態:

$ kubectl create -f worker.yml
$ kubectl get svc, po
...
po/tf-worker-1891917189-q9v58     1/1       Running   0          1m

Worker 建立完成後,即可透過瀏覽器開啟 http://172.16.35.9:8888/ 進入 Jupyter 來執行與互動:

最後將建立視覺化應用程式,利用 tensorboard.yml 檔案來描述建立 Tensorboard,編輯檔案並修改一下內容:

externalIPs:
- 172.16.35.9

完成後,透過指令建立 Tensorboard service,並查看狀態:

$ kubectl create -f tensorboard.yml
$ kubectl get po,svc
NAME                              READY     STATUS    RESTARTS   AGE
po/tf-dashboard-237766735-m9qt5   1/1       Running   0          1m
..
NAME               CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
svc/tf-dashboard   192.174.81.212    ,172.16.35.9    6006:32621/TCP   1m
...

Tensorboard service 建立完成後,即可透過瀏覽器開啟 http://172.16.35.9:6006/ 進入 Tensorboard 來查看視覺化後的運算過程。

Summary

利用 Kubernetes 管理 TensorFlow ,將使系統管理變的更加便利與簡單,當叢集故障時,可以很快得知問題點,並能透過 Kubernetes Monitoring 與 Logging 來深入查找問題點。然而對於分散式程式行程的管理,將不再需要透過手動方式啟動 TensorFlow 的 Master 及 Worker,僅須透過 YAML 定義 Kubernetes 的 Deployment 與 Service 的功能描述,就能夠快速建立服務。在儲存部分,由於 TensorFlow 官方分散式運算框架並不提供相關共享式儲存功能,因此造成資料無法共享之問題,但透過 Kubernetes 的 Persistent Volume 與 Persistent Volume Claim 功能,即可將資料進行共享,提供給不同應用程式使用。將Kubernetes 使用在 TensorFlow 分散式運算上,可帶來許多有趣的情境,如 TensorFlow on Kubernetes Workshop 即展示了四種情境用法,有興趣的朋友們可參考其內容進行實作。

<全文完>

撰文: 白凱仁/迎棧科技軟體工程師

訂閱電子報

Select list(s)*

 

Loading