輕松擴(kuò)展機(jī)器學(xué)習(xí)能力:如何在Rancher上安裝Kubeflow
隨著機(jī)器學(xué)習(xí)領(lǐng)域不斷發(fā)展,對(duì)于處理機(jī)器學(xué)習(xí)的團(tuán)隊(duì)來(lái)說(shuō),在1臺(tái)機(jī)器上訓(xùn)練1個(gè)模型已經(jīng)有些難以為繼,并且現(xiàn)在業(yè)界的共識(shí)是機(jī)器學(xué)習(xí)已經(jīng)不僅僅是簡(jiǎn)單的模型訓(xùn)練。
在模型訓(xùn)練之前、過程中和之后,需要進(jìn)行許多活動(dòng),對(duì)于要生成自己的ML模型的團(tuán)隊(duì)來(lái)說(shuō)尤其如此。下圖常常被引用來(lái)說(shuō)明此類情況:
對(duì)于許多團(tuán)隊(duì)來(lái)說(shuō),將機(jī)器學(xué)習(xí)的模型從研究環(huán)境應(yīng)用到生產(chǎn)環(huán)境這一過程困難重重,背負(fù)很大的壓力。糟糕的是,市面上處理每類問題的工具都數(shù)量驚人,而這些海量工具都有望解決你所有的機(jī)器學(xué)習(xí)難題。
但是整個(gè)團(tuán)隊(duì)學(xué)習(xí)新工具通常很耗時(shí),并且將這些工具集成到你當(dāng)前的工作流程中也并不容易。這時(shí),或許可以考慮Kubeflow,這是為需要建立機(jī)器學(xué)習(xí)流水線的團(tuán)隊(duì)而打造的一個(gè)機(jī)器學(xué)習(xí)平臺(tái),它包括許多其他工具,可以用于服務(wù)模型和調(diào)整超參數(shù)。Kubeflow嘗試做的是將同類最好用的ML工具整合在一起,并將它們集成到一個(gè)平臺(tái)中。
來(lái)源:https://www.kubeflow.org/docs/started/kubeflow-overview/
顧名思義,Kubeflow應(yīng)該部署在Kubernetes上,既然你是通過Rancher的平臺(tái)閱讀到這篇文章,那么你大概率已經(jīng)在某個(gè)地方部署了Kubernetes集群。
值得注意的是,Kubeflow中的“flow”并不是表示Tensorflow。Kubeflow也能夠與PyTorch一起使用,甚至可以與任何ML框架一起使用(不過支持得最好的框架還是Tensorflow和PyTorch)。
在本文中,我將向你展示如何盡可能簡(jiǎn)單地安裝Kubeflow。如果在你的集群上已經(jīng)有GPU設(shè)置,則過程將更為簡(jiǎn)單。如果尚未設(shè)置,那么你需要執(zhí)行一些額外的設(shè)置步驟,因?yàn)樵S多機(jī)器學(xué)習(xí)需要運(yùn)行在NVIDIA GPU上。
在Kubeflow上設(shè)置GPU支持
假設(shè)你已經(jīng)安裝了Docker 19.x。
1、 安裝NVIDIA 容器運(yùn)行時(shí)
在所有帶有GPU的節(jié)點(diǎn)上:
- % 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
現(xiàn)在,修改Docker守護(hù)進(jìn)程(Daemon)運(yùn)行時(shí)字段:
- % sudo vim /etc/docker/daemon.json
粘貼以下內(nèi)容:
- {
- "default-runtime": "nvidia",
- "runtimes": {
- "nvidia": {
- "path": "/usr/bin/nvidia-container-runtime",
- "runtimeArgs": []
- }
- }
- }
現(xiàn)在重啟Docker守護(hù)進(jìn)程:
- % sudo systemctl restart docker
2、 安裝NVIDIA設(shè)備插件
在master節(jié)點(diǎn)上,創(chuàng)建NVIDIA設(shè)備插件:
- % kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml
接下來(lái),正式開始安裝Kubeflow。
安裝Kubeflow
注意:在撰寫本文時(shí),Kubeflow的最新版本是1.0。它與Kubernetes 1.14和1.15版本兼容。
Step0:設(shè)置動(dòng)態(tài)Volume配置
在我們安裝Kubeflow之前,我們需要設(shè)置動(dòng)態(tài)配置。
一種方法是使用Rancher的local-path-provisioner,其中使用了基于hostPath的節(jié)點(diǎn)持久卷。設(shè)置非常簡(jiǎn)單:將其指向節(jié)點(diǎn)上的路徑并部署YAML文件。缺點(diǎn)是無(wú)法控制volume容量限制。
另一種方法是使用網(wǎng)絡(luò)文件系統(tǒng)(NFS),我將在下文展示具體步驟。
在Master節(jié)點(diǎn)上設(shè)置網(wǎng)絡(luò)文件系統(tǒng)
假設(shè)你將大部分?jǐn)?shù)據(jù)存儲(chǔ)在本地,那么你需要設(shè)置NFS。在這里,我假設(shè) NFS server位于master節(jié)點(diǎn)10.64.1.163上。
首先,為NFS安裝依賴項(xiàng):
- % sudo apt install -y nfs-common nfs-kernel-server
然后,創(chuàng)建一個(gè)根目錄:
- % sudo mkdir /nfsroot
將以下條目添加到/etc/exports:
- /full/path/to/nfsroot 10.64.0.0/16(rw,no_root_squash,no_subtree_check)
請(qǐng)注意,10.64.0.0是節(jié)點(diǎn)的CIDR,而不是Kubernetes Pod CIDR。
接下來(lái),通過以下命令將共享目錄導(dǎo)出為sudo:
- % sudo exportfs -a
最后,要使所有配置生效,請(qǐng)按如下所示重新啟動(dòng)NFS內(nèi)核服務(wù)器:
- % sudo systemctl restart nfs-kernel-server
另外,確保nfs-kernel-server在服務(wù)器(重新)啟動(dòng)時(shí)啟動(dòng):
- % sudo update-rc.d nfs-kernel-server enable
在worker節(jié)點(diǎn)上設(shè)置NFS
為NFS安裝依賴項(xiàng):
- % sudo apt install -y nfs-common
安裝NFS Client Provisioner
現(xiàn)在,我們可以安裝NFS Client Provisioner——并且終于可以向你們安利我最愛的Rancher功能之一:應(yīng)用商店!
默認(rèn)情況下,Rancher自帶了許多已經(jīng)經(jīng)過測(cè)試的應(yīng)用程序。此外,我們還可以自行添加整個(gè)Helm Chart到應(yīng)用商店里。
點(diǎn)擊Apps,然后點(diǎn)擊【Manage Catalogs】
然后選擇【Add Catalog】:
填寫以下值:
點(diǎn)擊【Create】,回到【Apps】頁(yè)面。稍微等待一會(huì)兒,你將看到helm部分有了許多應(yīng)用程序。你可以點(diǎn)擊【Refresh】來(lái)查看進(jìn)程:
現(xiàn)在,在搜索框內(nèi)輸入nfs,然后你將看到2個(gè)條目:
其中一個(gè)正是我們要找的:nfs-client-provisioner。點(diǎn)擊它,然后你將看到:
這是可用于nfs-client-provisioner的chart的所有選項(xiàng),你將需要使用它們來(lái)填寫以下內(nèi)容:
填寫完畢后,你可以點(diǎn)擊【Launch】按鈕。等待一會(huì)兒,讓Kubernetes下載Docker鏡像,并將一切設(shè)置完畢。所有操作都完成后,你將看到以下頁(yè)面:
我真的太喜歡應(yīng)用商店這個(gè)功能了,它是我最喜歡的功能之一,因?yàn)樗拇嬖?,使得在集群上安裝和監(jiān)控應(yīng)用程序變得簡(jiǎn)單和方便。
Step1:下載并安裝kfctl
這是Kubeflow的控制工具,與kubectl類似。你可以從Kubeflow的release頁(yè)面下載它:
https://github.com/kubeflow/kfctl/releases/tag/v1.0.2
然后,解壓文件并將二進(jìn)制文件放入你的$PATH中。
Step2:安裝Kubeflow
首先,指定一個(gè)文件夾存儲(chǔ)所有的Kubeflow YAML文件。
- $ export KFAPP=~/kfapp
下載kfctl配置文件:
- wget https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml
請(qǐng)注意:如果你已經(jīng)安裝了Istio,則需要編輯kfctl_k8s_istio.v1.0.2.yaml并刪除istio-crds和istio-install應(yīng)用程序條目。
然后,導(dǎo)出CONFIG_URI:
- $ export CONFIG_URI="/path/to/kfctl_k8s_istio.v1.0.2.yaml"
接下來(lái),你需要指定一堆環(huán)境變量,這些環(huán)境變量將指示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}
你需要一些時(shí)間等待一切都設(shè)置完畢。
訪問Kubeflow UI
要訪問UI,我們需要知道Web UI所在的端口:
- % kubectl -n istio-system get svc istio-ingressgateway
返回以下內(nèi)容:
- 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,這意味著你可以通過http://localhost:31380訪問Kubeflow UI:
如果你成功地看到了這個(gè)頁(yè)面,那么恭喜你,你已經(jīng)成功設(shè)置Kubeflow🎉
結(jié) 論
在本文中,我們首先探討了為什么需要諸如Kubeflow這類工具——以控制機(jī)器學(xué)習(xí)本身的復(fù)雜性。接下來(lái),我們按照步驟為集群進(jìn)行機(jī)器學(xué)習(xí)工作做好了準(zhǔn)備,尤其需要確保該集群可以利用可用的NVIDIA GPU。
在設(shè)置NFS時(shí),我們探索了Rancher的應(yīng)用商店,并將Helm Chart添加到應(yīng)用商店中。它為我們提供了在Kubernetes集群上可以安裝的所有Kubernetes應(yīng)用程序。最后,我們完成了在集群上安裝Kubeflow的步驟。