輕鬆擴充套件機器學習能力:如何在Rancher上安裝Kubeflow
阿新 • • 發佈:2020-05-20
隨著機器學習領域不斷髮展,對於處理機器學習的團隊來說,在1臺機器上訓練1個模型已經有些難以為繼,並且現在業界的共識是機器學習已經不僅僅是簡單的模型訓練。
在模型訓練之前、過程中和之後,需要進行許多活動,對於要生成自己的ML模型的團隊來說尤其如此。下圖常常被引用來說明此類情況:
![](https://oscimg.oschina.net/oscnet/up-95776a24a0431e7ffa1b3b0376af95ada29.png)
對於許多團隊來說,將機器學習的模型從研究環境應用到生產環境這一過程困難重重,揹負很大的壓力。糟糕的是,市面上處理每類問題的工具都數量驚人,而這些海量工具都有望解決你所有的機器學習難題。
但是整個團隊學習新工具通常很耗時,並且將這些工具整合到你當前的工作流程中也並不容易。這時,或許可以考慮Kubeflow,這是為需要建立機器學習流水線的團隊而打造的一個機器學習平臺,它包括許多其他工具,可以用於服務模型和調整超引數。Kubeflow嘗試做的是將同類最好用的ML工具整合在一起,並將它們整合到一個平臺中。
![](https://oscimg.oschina.net/oscnet/up-60052ed8d0268b14b194301c0c7e8bda18d.png)
*來源:https://www.kubeflow.org/docs/started/kubeflow-overview/*
顧名思義,Kubeflow應該部署在Kubernetes上,既然你是通過Rancher的平臺閱讀到這篇文章,那麼你大概率已經在某個地方部署了Kubernetes叢集。
值得注意的是,Kubeflow中的“flow”並不是表示Tensorflow。Kubeflow也能夠與PyTorch一起使用,甚至可以與任何ML框架一起使用(不過支援得最好的框架還是Tensorflow和PyTorch)。
在本文中,我將向你展示如何儘可能簡單地安裝Kubeflow。如果在你的叢集上已經有GPU設定,則過程將更為簡單。如果尚未設定,那麼你需要執行一些額外的設定步驟,因為許多機器學習需要執行在NVIDIA GPU上。
## 在Kubeflow上設定GPU支援
假設你已經安裝了Docker 19.x。
### 1、 安裝NVIDIA 容器執行時
在所有帶有GPU的節點上:
```
% distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
% curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
% curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
% sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
% sudo apt-get install nvidia-container-runtime
```
現在,修改Docker守護程序(Daemon)執行時欄位:
```
% sudo vim /etc/docker/daemon.json
```
貼上以下內容:
```
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
```
現在重啟Docker守護程序:
```
% sudo systemctl restart docker
```
### 2、 安裝NVIDIA裝置外掛
在master節點上,建立NVIDIA裝置外掛:
```
% kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml
```
接下來,正式開始安裝Kubeflow。
## 安裝Kubeflow
> 注意:在撰寫本文時,Kubeflow的最新版本是1.0。它與Kubernetes 1.14和1.15版本相容。
### Step0:設定動態Volume配置
在我們安裝Kubeflow之前,我們需要設定動態配置。
一種方法是使用Rancher的`local-path-provisioner`,其中使用了基於`hostPath`的節點持久卷。設定非常簡單:將其指向節點上的路徑並部署YAML檔案。缺點是無法控制volume容量限制。
另一種方法是使用網路檔案系統(NFS),我將在下文展示具體步驟。
#### 在Master節點上設定網路檔案系統
假設你將大部分資料儲存在本地,那麼你需要設定NFS。在這裡,我假設 NFS server位於master節點`10.64.1.163`上。
首先,為NFS安裝依賴項:
```
% sudo apt install -y nfs-common nfs-kernel-server
```
然後,建立一個根目錄:
```
% sudo mkdir /nfsroot
```
將以下條目新增到`/etc/exports`:
```
/full/path/to/nfsroot 10.64.0.0/16(rw,no_root_squash,no_subtree_check)
```
請注意,`10.64.0.0`是節點的CIDR,而不是Kubernetes Pod CIDR。
接下來,通過以下命令將共享目錄匯出為sudo:
```
% sudo exportfs -a
```
最後,要使所有配置生效,請按如下所示重新啟動NFS核心伺服器:
```
% sudo systemctl restart nfs-kernel-server
```
另外,確保`nfs-kernel-server`在伺服器(重新)啟動時啟動:
```
% sudo update-rc.d nfs-kernel-server enable
```
#### 在worker節點上設定NFS
為NFS安裝依賴項:
```
% sudo apt install -y nfs-common
```
#### 安裝NFS Client Provisioner
現在,我們可以安裝NFS Client Provisioner——並且終於可以向你們安利我最愛的Rancher功能之一:應用商店!
![](https://oscimg.oschina.net/oscnet/up-467f8c0afa8ab523e55f257c4489ff160a5.JPEG)
預設情況下,Rancher自帶了許多已經經過測試的應用程式。此外,我們還可以自行新增整個Helm Chart到應用商店裡。
點選Apps,然後點選【Manage Catalogs】
![](https://oscimg.oschina.net/oscnet/up-6782cbc8ad1f2fadfe45a65ea58a94e10aa.JPEG)
然後選擇【Add Catalog】:
![](https://oscimg.oschina.net/oscnet/up-9b69f61ffb51f7ab0af1e9f4ced3817e98a.JPEG)
填寫以下值:
![](https://oscimg.oschina.net/oscnet/up-b3107466a4a16261d81e69c5dbcd689234f.JPEG)
點選【Create】,回到【Apps】頁面。稍微等待一會兒,你將看到helm部分有了許多應用程式。你可以點選【Refresh】來檢視程序:
![](https://oscimg.oschina.net/oscnet/up-3c3c3f0472fb5e26a5f58062a842198c843.JPEG)
現在,在搜尋框內輸入nfs,然後你將看到2個條目:
![](https://oscimg.oschina.net/oscnet/up-3a74f27c42b8b80ea0f22d2c2ee49a495c9.JPEG)
其中一個正是我們要找的:`nfs-client-provisioner`。點選它,然後你將看到:
![](https://oscimg.oschina.net/oscnet/up-b3e64de7a48dc73d9d56cc799de7c5be113.JPEG)
這是可用於`nfs-client-provisioner`的chart的所有選項,你將需要使用它們來填寫以下內容:
![](https://oscimg.oschina.net/oscnet/up-e122a5b16376e315c6d9bc06be5da56379d.JPEG)
填寫完畢後,你可以點選【Launch】按鈕。等待一會兒,讓Kubernetes下載Docker映象,並將一切設定完畢。所有操作都完成後,你將看到以下頁面:
![](https://oscimg.oschina.net/oscnet/up-b49cd4023d7cbf2de00d148e37b7e8bbaee.JPEG)
我真的太喜歡應用商店這個功能了,它是我最喜歡的功能之一,因為它的存在,使得在叢集上安裝和監控應用程式變得簡單和方便。
### Step1:下載並安裝kfctl
這是Kubeflow的控制工具,與kubectl類似。你可以從Kubeflow的[release頁面下載](https://github.com/kubeflow/kfctl/releases/tag/v1.0.2 "release頁面下載")它。
然後,解壓檔案並將二進位制檔案放入你的`$PATH`中。
### Step2:安裝Kubeflow
首先,指定一個資料夾儲存所有的Kubeflow YAML檔案。
```
$ export KFAPP=~/kfapp
```
下載`kfctl`配置檔案:
```
wget https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml
```
請注意:如果你已經安裝了Istio,則需要編輯`kfctl_k8s_istio.v1.0.2.yaml`並刪除`istio-crds`和`istio-install`應用程式條目。
然後,匯出`CONFIG_URI`:
```
$ export CONFIG_URI="/path/to/kfctl_k8s_istio.v1.0.2.yaml"
```
接下來,你需要指定一堆環境變數,這些環境變數將指示Kubeflow配置檔案下載到的位置:
```
export KF_NAME=kubeflow-deployment
export BASE_DIR=/opt
export KF_DIR=${BASE_DIR}/${KF_NAME}
```
安裝Kubeflow:
```
% mkdir -p ${KF_DIR}
% cd ${KF_DIR}
% kfctl apply -V -f ${CONFIG_URI}
```
你需要一些時間等待一切都設定完畢。
### 訪問Kubeflow UI
要訪問UI,我們需要知道Web UI所在的埠:
```
% kubectl -n istio-system get svc istio-ingressgateway
```
返回以下內容:
```
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.43.1