https://kairen.github.io/2018/03/15/tensorflow/kubeflow/
Kubeflow 是 Google 開源的機器學習工具,目標是簡化在 Kubernetes 上運行機器學習的過程,使之更簡單、可攜帶與可擴展。Kubeflow 目標不是在於重建其他服務,而是提供一個最佳開發系統來部署到各種基礎設施架構中,另外由於使用 Kubernetes 來做為基礎,因此只要有 Kubernetes 的地方,都能夠執行 Kubeflow。
該工具能夠建立以下幾項功能:
用於建議與管理互動式 Jupyter notebook 的 JupyterHub。
可以設定使用 CPU 或 GPU,並透過單一設定調整單個叢集大小的 Tensorflow Training Controller。
用 TensorFlow Serving 容器來提供模型服務。
Kubeflow 目標是透過 Kubernetes 的特性使機器學習更加簡單與快速:
在不同基礎設施上實現簡單、可重複的攜帶性部署(Laptop <-> ML rig <-> Training cluster <-> Production cluster)。
部署與管理松耦合的微服務。
根據需求進行縮放。
節點資訊
本次安裝作業系統採用Ubuntu 16.04 Server,測試環境為實體機器:
IP Address Role vCPU RAM Extra Device
172.22.132.51 gpu-node1 8 16G GTX 1060 3G
172.22.132.52 gpu-node2 8 16G GTX 1060 3G
172.22.132.53 master1 8 16G 無
事前準備
使用 Kubeflow 之前,需要確保以下條件達成:
所有節點正確安裝指定版本的 NVIDIA driver、CUDA、Docker、NVIDIA Docker,請參考 安裝 Nvidia Docker 2。
(option)所有 GPU 節點安裝 cuDNN v7.1.2 for CUDA 9.1,請至 NVIDIA cuDNN 下載。
tarxvfcudnn−9.1−linux−x64−v7.1.tgz
t
a
r
x
v
f
c
u
d
n
n
−
9.1
−
l
i
n
u
x
−
x
64
−
v
7.1.
t
g
z
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
所有節點以 kubeadm 部署成 Kubernetes v1.9+ 叢集,請參考 用 kubeadm 部署 Kubernetes 叢集。
Kubernetes 叢集需要安裝 NVIDIA Device Plugins,請參考 安裝 Kubernetes NVIDIA Device Plugins。
建立 NFS server 並在 Kubernetes 節點安裝 NFS common,然後利用 Kubernetes 建立 PV 提供給 Kubeflow 使用:
在 master 執行
sudo apt-get update && sudo apt-get install -y nfs-server
sudo apt-get update && sudo apt-get install -y nfs-server
sudo mkdir /nfs-data
echo“/nfs−data∗(rw,sync,norootsquash,nosubtreecheck)”|sudotee−a/etc/exports
e
c
h
o
“
/
n
f
s
−
d
a
t
a
∗
(
r
w
,
s
y
n
c
,
n
o
r
o
o
t
s
q
u
a
s
h
,
n
o
s
u
b
t
r
e
e
c
h
e
c
k
)
”
|
s
u
d
o
t
e
e
−
a
/
e
t
c
/
e
x
p
o
r
t
s
sudo /etc/init.d/nfs-kernel-server restart
在 node 執行
sudo apt-get update && sudo apt-get install -y nfs-common
安裝ksonnet 0.9.2,請參考以下:
sudo apt-get update && sudo apt-get install -y nfs-common 安裝ksonnet 0.9.2,請參考以下:
wget https://github.com/ksonnet/ksonnet/releases/download/v0.9.2/ks_0.9.2_linux_amd64.tar.gz
tarxvfks0.9.2linuxamd64.tar.gz
t
a
r
x
v
f
k
s
0
.9
.2
l
i
n
u
x
a
m
d
64.
t
a
r
.
g
z
sudo cp ks_0.9.2_linux_amd64/ks /usr/local/bin/
$ ks version
ksonnet version: 0.9.2
jsonnet version: v0.9.5
client-go version: 1.8
部署 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 套件至應用程式目錄:
cdmy−kubeflow
c
d
m
y
−
k
u
b
e
f
l
o
w
ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow
kspkginstallkubeflow/core
k
s
p
k
g
i
n
s
t
a
l
l
k
u
b
e
f
l
o
w
/
c
o
r
e
ks pkg install kubeflow/tf-serving
$ ks pkg install kubeflow/tf-job
然後建立 Kubeflow 核心元件,該元件包含 JupyterHub 與 TensorFlow job controller:
kubectlcreatenamespacekubeflow
k
u
b
e
c
t
l
c
r
e
a
t
e
n
a
m
e
s
p
a
c
e
k
u
b
e
f
l
o
w
kubectl create clusterrolebinding tf-admin –clusterrole=cluster-admin –serviceaccount=default:tf-job-operator
$ ks generate core kubeflow-core –name=kubeflow-core –namespace=kubeflow
啟動收集匿名使用者使用量資訊,如果不想開啟則忽略
ksparamsetkubeflow−corereportUsagetrue k s p a r a m s e t k u b e f l o w − c o r e r e p o r t U s a g e t r u e ks param set kubeflow-core usageId $(uuidgen)
部署 Kubeflow
ksparamsetkubeflow−corejupyterHubServiceTypeLoadBalancer
k
s
p
a
r
a
m
s
e
t
k
u
b
e
f
l
o
w
−
c
o
r
e
j
u
p
y
t
e
r
H
u
b
S
e
r
v
i
c
e
T
y
p
e
L
o
a
d
B
a
l
a
n
c
e
r
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 80/TCP 45m service=ambassador
ambassador-admin ClusterIP 10.107.24.138 8877/TCP 45m service=ambassador
k8s-dashboard ClusterIP 10.111.128.104 443/TCP 45m k8s-app=kubernetes-dashboard
tf-hub-0 ClusterIP None 8000/TCP 45m app=tf-hub
tf-hub-lb ClusterIP 10.105.47.253 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 <