利用 Kubeflow 來管理 TensorFlow 應用程式 (下)

利用 Kubeflow 來管理 TensorFlow 應用程式 (下)

利用 Kubeflow 來管理 TensorFlow 應用程式 (下)

部署 Kubeflow

本節將說明如何利用 ksonnet 來部署 Kubeflow 到 Kubernetes 叢集中。首先在master節點初始化 ksonnet 應用程式目錄

$ ks init my-kubeflow

如果遇到以下問題的話,可以自己建立 GitHub Token 來存取 GitHub API,請參考 Github rate limiting errors。

ERROR GET https://api.github.com/repos/ksonnet/parts/commits/master: 403 API rate limit exceeded for 122.146.93.152.

接著安裝 Kubeflow 套件至應用程式目錄:

$ cd my-kubeflow $ ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow $ ks pkg install kubeflow/core $ ks pkg install kubeflow/tf-serving $ ks pkg install kubeflow/tf-job

然後建立 Kubeflow 核心元件,該元件包含 JupyterHub 與 TensorFlow job controller:

$ kubectl create namespace kubeflow $ kubectl create clusterrolebinding tf-admin --clusterrole=cluster-admin --serviceaccount=default:tf-job-operator $ ks generate core kubeflow-core --name=kubeflow-core --namespace=kubeflow # 啟動收集匿名使用者使用量資訊,如果不想開啟則忽略 $ ks param set kubeflow-core reportUsage true $ ks param set kubeflow-core usageId $(uuidgen) # 部署 Kubeflow $ ks param set kubeflow-core jupyterHubServiceType LoadBalancer $ ks apply default -c kubeflow-core

詳細使用量資訊請參考 Usage Reporting 。

完成後檢查 Kubeflow 元件部署結果:

$ kubectl -n kubeflow get po -o wide NAME READY STATUS RESTARTS AGE IP NODE ambassador-7956cf5c7f-6hngq 2/2 Running 0 34m 10.244.41.132 kube-gpu-node1 ambassador-7956cf5c7f-jgxnd 2/2 Running 0 34m 10.244.152.134 kube-gpu-node2 ambassador-7956cf5c7f-jww2d 2/2 Running 0 34m 10.244.41.133 kube-gpu-node1 spartakus-volunteer-8c659d4f5-bg7kn 1/1 Running 0 34m 10.244.152.135 kube-gpu-node2 tf-hub-0 1/1 Running 0 34m 10.244.152.133 kube-gpu-node2 tf-job-operator-78757955b-2jbdh 1/1 Running 0 34m 10.244.41.131 kube-gpu-node1

這時候就可以登入 Jupyter Notebook,但這邊需要修改 Kubernetes Service,透過以下指令進行:

$ kubectl -n kubeflow get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR ambassador ClusterIP 10.101.157.91 <none> 80/TCP 45m service=ambassador ambassador-admin ClusterIP 10.107.24.138 <none> 8877/TCP 45m service=ambassador k8s-dashboard ClusterIP 10.111.128.104 <none> 443/TCP 45m k8s-app=kubernetes-dashboard tf-hub-0 ClusterIP None <none> 8000/TCP 45m app=tf-hub tf-hub-lb ClusterIP 10.105.47.253 <none> 80/TCP 45m app=tf-hub # 修改 svc 將 Type 修改成 LoadBalancer,並且新增 externalIPs 指定為 Master IP。 $ kubectl -n kubeflow edit svc tf-hub-lb ... spec: type: LoadBalancer externalIPs: - 172.22.132.41 ...

測試 Kubeflow

開始測試前先建立一個 NFS PV 來提供給 Kubeflow Jupyter 使用:

$ cat <<EOF | kubectl create -f - apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce nfs: server: 172.22.132.41 path: /nfs-data EOF

完成後連接 http://Master_IP,並輸入任意帳號密碼進行登入。

登入後點選Start My Server按鈕來建立 Server 的 Spawner options,預設會有多種映像檔可以使用:

若 CUDA 版本不同,請自行修改 GCP Tensorflow Notebook image 或是 Kubeflow Tensorflow Notebook image 重新建構。

如果使用 GPU 請執行以下指令確認是否可被分配資源:

$ kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu" NAME GPU kube-gpu-master1 <none> kube-gpu-node1 1 kube-gpu-node2 1

最後點選Spawn來完成建立 Server,如下圖所示:

這邊先用 CPU 進行測試,由於本篇是安裝 CUDA 9.1 + cuDNN 7,因此要自己建構映像檔。

接著等 Kubernetes 下載映像檔後,就會正常啟動,如下圖所示:

當正常啟動後,點選New > Python 3建立一個 Notebook 並貼上以下範例程式:

from __future__ import print_function import tensorflow as tf hello = tf.constant('Hello TensorFlow!') s = tf.Session() print(s.run(hello))

正確執行會如以下圖所示:

若想關閉叢集的話,可以點選Control Plane

另外由於 Kubeflow 會安裝 TF Operator 來管理 TFJob,這邊可以透過 Kubernetes 來手動建立 Job:

$ kubectl create -f https://raw.githubusercontent.com/kubeflow/tf-operator/master/examples/tf_job.yaml $ kubectl get po NAME READY STATUS RESTARTS AGE example-job-ps-qq6x-0-pdx7v 1/1 Running 0 5m example-job-ps-qq6x-1-2mpfp 1/1 Running 0 5m example-job-worker-qq6x-0-m5fm5 1/1 Running 0 5m

若想從 Kubernetes 叢集刪除 Kubeflow 相關元件的話,可執行下列指令達成:

$ ks delete default -c kubeflow-core

Prev: 使用 kubefed 建立 Kubernetes Federation(On-premises)

Next: Kubernetes NVIDIA Device Plugins

回顧:利用 Kubeflow 來管理 TensorFlow 應用程式 (上)

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