Kubeflow 專案致力於使 ML Workflow 發展更具簡易性、可攜帶性和規模性。 Kubeflow於2017年底正式開源,並於2018年5月發布了首個0.1版本,至今 kubeflow 各項目發展迅速,而我參與 2018 KubeCon Shanghai
聆聽好幾場來自 各大企業與 Google等議程,分享 Kubeflow 導入企業實際應用情境,深刻感受到 kubeflow 在開源社區與貢獻者中重視度,在快速發展下至於1月宣布 Kubeflow 0.4 穩定版本正式發佈。
#此篇主要記錄操作 kubflow v0.4.1 部署與更新概述。
Related Posts
# Quickly get running with your ML Workflow
使用Kubeflow的新型Jupyter筆記本電腦產品,創建筆記本電腦比以往更容易。選擇已安裝最流行的機器學習庫的精選圖像,或帶上您自己的自定義圖像。
Kubeflow 0.4提供了以下主要功能和更新:
- 更新 JupyterHub UI 介面,可以更輕鬆生成附有
PVC
的 Jupyter Notebook,直觀選擇常用或自定義 Image,提供方便管理創建對 CPU / Memory / GPU 資源具有更多配置並生成 Jupyter notebooks
- alpha版本 fairing,一個簡化Library數據科學家建立並直接從 Notebook 開始訓練任務模型
- 用於 ML 工作流的 Kubeflow Pipelines,通過重啟具有不同數據資料與更新數據pipeline來加速 productizing models 過程
- Katib 支援 TFJob,使更容易比較不同的超參數性能來進行模型優化
- TFJob 和 PyTorch operators 升為 Beta版本,使數據科學家能夠針對更穩定 API對其訓練任務進行編譯,並更容易切換在訓練之間使用的框架
Reference
事前準備
部署 Kubeflow 之前,需要確保以下條件達成:
所有 kubernetes 叢集節點
確認已經安裝 NVIDIA Driver、CUDA、Docker、NVIDIA Docker,以下此篇文章部署實驗環境版本資訊 (kubernetes v1.11.2):
- CUDA Version: 10.0.130
- Driver Version: 410.48
- Docker Version: 18.03.0-ce
- NVIDIA Docker: 2.0.3
Storage 儲數據方式是採用建立 NFS server
,配置 PV 提供給 Kubeflow 使用:
部署 Kubeflow
安裝ksonnet
Kubeflow 利用 ksonnet 打包和部署其組件配置,可以更輕鬆地管理複雜部署。
安裝 ksonnet v0.3.1 版本
1 2 3 4 5 6 7 8 9
| $ export KS_VER=0.13.1 $ export KS_PKG=ks_${KS_VER}_linux_amd64
$ wget ${KS_PKG}.tar.gz https://github.com/ksonnet/ksonnet/releases/download/v${KS_VER}/${KS_PKG}.tar.gz \ --no-check-certificate $ tar xvf $KS_PKG.tar.gz $ sudo cp $KS_PKG/ks /usr/local/bin/ $ chmod +x /usr/local/bin/ks
|
確認 ksonnet 版本
1 2 3 4
| $ ks version ksonnet version: 0.13.1 jsonnet version: v0.11.2 client-go version: kubernetes-1.10.4
|
部署儲存需求 PVC
在kubeflow v0.4版本中,Kubeflow 依賴 katib-mysql
、pipeline-mino
、pipeline-mysql
這三個有狀態服務。而這些服務需要提前部署儲存空間:
實驗為測試採用快速部署,所以簡單建立三個 NFS PV
儲存空間供給服務使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $ for i in $(seq 1 3); do cat <<EOF | kubectl create -f - apiVersion: v1 kind: PersistentVolume metadata: name: kubeflow-pv${i} spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce nfs: server: {NFS-server IP} path: /nfs-data/kubeflow-pv EOF done
... persistentvolume/kubeflow-pv1 created persistentvolume/kubeflow-pv2 created persistentvolume/kubeflow-pv3 created
|
下載 Kubeflow 相關 repo
本節將說明如何利用 ksonnet 來部署 Kubeflow 到 Kubernetes 叢集中
下載GitHub中Kubeflow設置所需配置:
1 2 3 4 5 6 7 8 9 10
| $ KUBEFLOW_SRC=mykfsrc $ mkdir ${KUBEFLOW_SRC} $ cd ${KUBEFLOW_SRC}
$ export KUBEFLOW_TAG=v0.4.1
$ curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash
|
下載後 $KUBEFLOW_SRC
目錄下會多kubeflow、scripts資料夾:
1 2 3 4 5
| $ tree -L 1 . ├── deployment ├── kubeflow └── scripts
|
執行安裝腳本配置與部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ cd ../ $ KUBEFLOW_REPO=$(pwd)/mykfsrc
$ KFAPP=mykfapp $ ${KUBEFLOW_REPO}/scripts/kfctl.sh init ${KFAPP} --platform none
$ cd ${KFAPP} $ ${KUBEFLOW_REPO}/scripts/kfctl.sh generate k8s
$ NAMESPACE=kubeflow $ kubectl create ns ${NAMESPACE}
$ ${KUBEFLOW_REPO}/scripts/kfctl.sh apply k8s
|
#注意: 官方部署預設為 default,這邊部署有特別給 kubeflow
命名空間,如果要移除kubeflow,可直接 刪除kubeflow Namespace,所有物件也會被刪除
其中的KF_ENV為ksonnet定義的部署環境,這裡直接設為default
完成後檢查 Kubeflow 元件部署結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| $ kubectl -n kubeflow get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ambassador-5cf8cd97d5-2tfqg 1/1 Running 1 8m 10.244.2.167 k8s-g3 <none> ambassador-5cf8cd97d5-4rbcx 1/1 Running 1 8m 10.244.4.44 k8s-g1 <none> ambassador-5cf8cd97d5-q6dnh 1/1 Running 1 8m 10.244.3.104 k8s-g2 <none> argo-ui-7c9c69d464-6hljq 1/1 Running 0 7m 10.244.2.171 k8s-g3 <none> centraldashboard-6f47d694bd-bn55x 1/1 Running 0 8m 10.244.3.106 k8s-g2 <none> jupyter-0 1/1 Running 0 8m 10.244.3.105 k8s-g2 <none> katib-ui-6bdb7d76cc-bfd72 1/1 Running 0 6m 10.244.3.114 k8s-g2 <none> metacontroller-0 1/1 Running 0 7m 10.244.3.109 k8s-g2 <none> minio-7bfcc6c7b9-h9bw5 1/1 Running 0 7m 10.244.2.172 k8s-g3 <none> ml-pipeline-6fdd759597-k5hds 1/1 Running 1 7m 10.244.2.173 k8s-g3 <none> ml-pipeline-persistenceagent-5669f69cdd-9tjdm 1/1 Running 0 6m 10.244.2.174 k8s-g3 <none> ml-pipeline-scheduledworkflow-9f6d5d5b6-ddtbs 1/1 Running 0 6m 10.244.3.111 k8s-g2 <none> ml-pipeline-ui-67f79b964d-brjlt 1/1 Running 0 6m 10.244.3.112 k8s-g2 <none> mysql-6f6b5f7b64-hbxpl 1/1 Running 0 7m 10.244.3.110 k8s-g2 <none> pytorch-operator-6f87db67b7-d5hq4 1/1 Running 0 7m 10.244.3.108 k8s-g2 <none> studyjob-controller-774d45f695-wwznk 1/1 Running 0 6m 10.244.3.115 k8s-g2 <none> tf-job-dashboard-5f986cf99d-295kw 1/1 Running 0 7m 10.244.2.168 k8s-g3 <none> tf-job-operator-v1beta1-5876c48976-sk8gf 1/1 Running 0 7m 10.244.3.107 k8s-g2 <none> vizier-core-fc7969897-86ffs 1/1 Running 0 6m 10.244.2.179 k8s-g3 <none> vizier-core-rest-6fcd4665d9-rtpz6 1/1 Running 0 6m 10.244.2.177 k8s-g3 <none> vizier-db-777675b958-l966s 1/1 Running 0 6m 10.244.2.178 k8s-g3 <none> vizier-suggestion-bayesianoptimization-54db8d594f-lghgh 1/1 Running 0 6m 10.244.2.175 k8s-g3 <none> vizier-suggestion-grid-6f5d9d647f-6pjt9 1/1 Running 0 6m 10.244.2.176 k8s-g3 <none> vizier-suggestion-hyperband-59dd9bb9bc-9knsd 1/1 Running 0 6m 10.244.3.113 k8s-g2 <none> vizier-suggestion-random-6dd597c997-9xkrq 1/1 Running 0 6m 10.244.2.180 k8s-g3 <none> workflow-controller-5c95f95f58-ncv9d 1/1 Running 0 7m 10.244.2.170 k8s-g3 <none>
|
#補充 關閉 Kubeflow使用報告 (可選擇)
部署後會附加收集匿名用戶數據記錄,以協助改進 Kubeflow,這邊官方也提供禁用說明
1 2 3 4 5 6 7 8 9 10 11
| $ kubectl delete -n kubeflow deploy spartakus-volunteer $ cd ../ $ cd ${KFAPP}/ks_app/ $ ks delete default -c spartakus $ ks component rm spartakus
... INFO removing environment component component-name=spartakus INFO Removing component parameter references ... INFO Deleting component "spartakus" INFO Successfully deleted component 'spartakus'
|
訪問 Kubeflow Web UI
Kubeflow 提供了一系列 Web UI:
- Argo UI
- JupyterHub
- Tfjob Dashboard
- Katib Dashboard
- Pipeline Dashboard
首先,透過Service查看一下目前pod狀態
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| $ kubectl -n kubeflow get svc -o wide -w NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR ambassador ClusterIP 10.103.129.210 <none> 80/TCP 3m service=ambassador ambassador-admin ClusterIP 10.100.125.72 <none> 8877/TCP 3m service=ambassador argo-ui NodePort 10.97.105.61 <none> 80:30965/TCP 2m app=argo-ui centraldashboard ClusterIP 10.98.13.76 <none> 80/TCP 3m app=centraldashboard jupyter-0 ClusterIP None <none> 8000/TCP 3m app=jupyter jupyter-lb ClusterIP 10.108.219.1 <none> 80/TCP 3m app=jupyter katib-ui ClusterIP 10.102.139.110 <none> 80/TCP 2m app=vizier,component=ui minio-service ClusterIP 10.105.24.96 <none> 9000/TCP 2m app=minio ml-pipeline ClusterIP 10.99.180.136 <none> 8888/TCP,8887/TCP 2m app=ml-pipeline ml-pipeline-tensorboard-ui ClusterIP 10.103.12.204 <none> 80/TCP 2m app=ml-pipeline-tensorboard-ui ml-pipeline-ui ClusterIP 10.97.153.108 <none> 80/TCP 2m app=ml-pipeline-ui mysql ClusterIP 10.108.186.1 <none> 3306/TCP 2m app=mysql tf-job-dashboard ClusterIP 10.104.211.110 <none> 80/TCP 3m name=tf-job-dashboard vizier-core NodePort 10.97.61.73 <none> 6789:30710/TCP 2m app=vizier,component=core vizier-core-rest ClusterIP 10.107.134.95 <none> 80/TCP 2m app=vizier,component=core-rest vizier-db ClusterIP 10.98.2.75 <none> 3306/TCP 2m app=vizier,component=db vizier-suggestion-bayesianoptimization ClusterIP 10.104.57.93 <none> 6789/TCP 2m app=vizier,component=suggestion-bayesianoptimization vizier-suggestion-grid ClusterIP 10.111.0.101 <none> 6789/TCP 2m app=vizier,component=suggestion-grid vizier-suggestion-hyperband ClusterIP 10.100.181.37 <none> 6789/TCP 2m app=vizier,component=suggestion-hyperband vizier-suggestion-random ClusterIP 10.101.159.47 <none> 6789/TCP 2m app=vizier,component=suggestion-random
|
這時候就可以透過 Central UI
引導訪問不同的 Kubeflow 服務,由於暴露安全性問題,官方教學是透過本機使用 port forward 訪問,但這邊為實驗測試是直接修改 Kubernetes Service,透過NodePort
來直接連線:
1 2 3 4 5
| $ kubectl -n kubeflow edit svc ambassador
sessionAffinity: None type: NodePort status:
|
再次查看Service確認NodePort 對應 Port
1 2 3
| $ kubectl -n kubeflow get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR ambassador NodePort 10.103.129.210 <none> 80:32078/TCP 14m service=ambassador
|
完成後連接 http://Master_IP:Port
即可看到 kubeflow Central UI
測試 Jupyter Notebook
Kubeflow v0.4 更新 JupyterHub UI介面,創建Jupyter Notebook 比之前配置更容易。可以選擇已安裝最新版本的 ML Images,或附上自己自定義Image,即可配置Spawn
生成。
這邊需要再次先建立一個 NFS PV
來提供給 Kubeflow Jupyter使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ cat <<EOF | kubectl create -f - apiVersion: v1 kind: PersistentVolume metadata: name: jupyter-notebook-pv spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce nfs: server: {NFS-server IP} path: /nfs-data/jupytertest EOF
|
NFS PV
建立好後這邊 UI 點選Jupyter Notebook登入測試,並輸入任意帳號密碼
進行登入:
Spawner Optinos 這邊可以輸入Notebook 資源,包含 Image、CPU、Memory、GPU數量、Workspace Volume、Data Volumes,最後點選Spawn來完成建立 Server,如下圖所示:
配置叢集節點GPU分配需求
配置好後及快速生成一個乾淨並帶有GPU使用的 Jupyter Notebook
Kubeflow Pipelines UI (待補)
Kubeflow主要是為了簡化在Kubernetes上面運行機器學習任務的流程,最終希望能夠實現一套完整工作流(workflow)模型。所謂工作流,或者稱之為流水線(pipelines),來實現 ML 從數據到模型的一整套 End-to-End 的過程 :
# 相關文章(補充)
Summary
此篇文章介紹 kubeflow v0.4 發佈資訊更新資訊與部署流程,但由於 kubeflow 開源專案更新速度太快,要對於每項服務都測試需要花時間慢慢整理,至於 v0.4 針對 pipline 核心組件值得花時間研究,後續也會介紹更多Components應用操作。
近日開始協助貢獻更新 kubeflow/website
範例與錯誤資訊,希望能為 kubeflow 做更多的推廣
Reference