輕鬆擴展機器學習能力:如何在Rancher上安裝Kubeflow

隨著機器學習領域不斷發展,對於處理機器學習的團隊來說,在1台機器上訓練1個模型已經有些難以為繼,並且現在業界的共識是機器學習已經不僅僅是簡單的模型訓練。

在模型訓練之前、過程中和之後,需要進行許多活動,對於要生成自己的ML模型的團隊來說尤其如此。下圖常常被引用來說明此類情況:

對於許多團隊來說,將機器學習的模型從研究環境應用到生產環境這一過程困難重重,背負很大的壓力。糟糕的是,市面上處理每類問題的工具都數量驚人,而這些海量工具都有望解決你所有的機器學習難題。

但是整個團隊學習新工具通常很耗時,並且將這些工具集成到你當前的工作流程中也並不容易。這時,或許可以考慮Kubeflow,這是為需要建立機器學習流水線的團隊而打造的一個機器學習平台,它包括許多其他工具,可以用於服務模型和調整超參數。Kubeflow嘗試做的是將同類最好用的ML工具整合在一起,並將它們集成到一個平台中。


來源://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 //nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
% curl -s -L //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 //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功能之一:應用商店!

默認情況下,Rancher自帶了許多已經經過測試的應用程式。此外,我們還可以自行添加整個Helm Chart到應用商店裡。

點擊Apps,然後點擊【Manage Catalogs】

然後選擇【Add Catalog】:

填寫以下值:

點擊【Create】,回到【Apps】頁面。稍微等待一會兒,你將看到helm部分有了許多應用程式。你可以點擊【Refresh】來查看進程:

現在,在搜索框內輸入nfs,然後你將看到2個條目:

其中一個正是我們要找的:nfs-client-provisioner。點擊它,然後你將看到:

這是可用於nfs-client-provisioner的chart的所有選項,你將需要使用它們來填寫以下內容:

填寫完畢後,你可以點擊【Launch】按鈕。等待一會兒,讓Kubernetes下載Docker鏡像,並將一切設置完畢。所有操作都完成後,你將看到以下頁面:

我真的太喜歡應用商店這個功能了,它是我最喜歡的功能之一,因為它的存在,使得在集群上安裝和監控應用程式變得簡單和方便。

Step1:下載並安裝kfctl

這是Kubeflow的控制工具,與kubectl類似。你可以從Kubeflow的release頁面下載它。

然後,解壓文件並將二進位文件放入你的$PATH中。

Step2:安裝Kubeflow

首先,指定一個文件夾存儲所有的Kubeflow YAML文件。

$ export KFAPP=~/kfapp

下載kfctl配置文件:

wget //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-crdsistio-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.197.63   <none>        15020:30585/TCP,**80:31380/TCP**,443:31390/TCP,31400:31400/TCP,15029:32613/TCP,15030:32445/TCP,15031:30765/TCP,15032:32496/TCP,15443:30576/TCP   61m

在本例中,它是80:31380,這意味著你可以通過//localhost:31380 訪問Kubeflow UI:

如果你成功地看到了這個頁面,那麼恭喜你,你已經成功設置Kubeflow🎉

結 論

在本文中,我們首先探討了為什麼需要諸如Kubeflow這類工具——以控制機器學習本身的複雜性。接下來,我們按照步驟為集群進行機器學習工作做好了準備,尤其需要確保該集群可以利用可用的NVIDIA GPU。

在設置NFS時,我們探索了Rancher的應用商店,並將Helm Chart添加到應用商店中。它為我們提供了在Kubernetes集群上可以安裝的所有Kubernetes應用程式。最後,我們完成了在集群上安裝Kubeflow的步驟。