Kubeflow實戰: 入門介紹與部署實踐
阿新 • • 發佈:2020-08-08
> 更多內容關注專輯:
[機器學習實戰](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU1NjY0NTQxNw==&action=getalbum&album_id=1461769020725985283&subscene=159&subscene=21&scenenote=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU1NjY0NTQxNw%3D%3D%26mid%3D2247484864%26idx%3D1%26sn%3Dc92d1a457f22c2d422e1f0f82c70e6d7%26chksm%3Dfbc0a886ccb7219078a7845d59fa414bf64149edd4f6b46e79181c8e888c8339155a65dcc369%26scene%3D21%23wechat_redirect#wechat_redirect)
# 1 介紹
Kubeflow是在k8s平臺之上針對機器學習的開發、訓練、優化、部署、管理的工具集合,內部整合的方式融合機器學習中的很多領域的開源專案,比如Jupyter、tfserving、Katib、Fairing、Argo等。可以針對機器學習的不同階段:資料預處理、模型訓練、模型預測、服務管理等進行管理。只要安裝了k8s,可以在本地、機房、雲環境中部署。
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220412127-172022411.png)
# 2 開發工具集
機器學習的目標最終還是為了在生產環境或者業務場景中使用,但這個過程卻是很複雜的,需要進行資料載入、切分、預處理、特徵工程、模型訓練、驗證、超引數調優、模型部署等等;為了正常使用模型,還需要在模型上線後,持續不斷的輸入資料才能得到預測的結果。
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220521499-1108546346.png)
人工構建整個過程並進行維護是很複雜的,使用Kubeflow可以節省很多成本。比如在構建模型時,可以選擇你喜歡的演算法框架進行模型開發,試驗階段可以通過Jupyter進行互動式的程式設計,基於Pipeline構建整個訓練過程的工作流實現各種處理邏輯,基於Katib進行超引數的自動優化;生產環境中,可以使用TFJob等進行分散式訓練,基於KFServing等進行線上模型的服務,基於Metadata或TensorBoard進行模型的監控。
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220537431-1319765050.png)
# 3 使用場景
擴充套件性:Kf基於k8s可以達到可擴充套件、可移植、分散式ML平臺, 通過Kf你可以輕鬆管理整個AI生命週期,比如在模型部署的時候自動進行擴容、在試驗階段自由建立筆記本。由於底層基於K8s來提供一致性與高可靠,使用者可以更聚焦於上層的演算法模型設計,而不用過多的關注底層構建。
迭代性:構建高質量的機器學習模型可能需要快速的迭代,Kf提供友好的UI介面支援快速追蹤對比實驗結果,你可以很方便的決定哪個模型訓練效果更好。Kf內部提供Jupyter筆記本,支援如Tensorflow、Pytorch等流行的深度學習框架。模型訓練配置簡單,方便進行分散式訓練、部署,提升端到端的開發過程。
混合性:機器學習模型的訓練可能涉及多個團隊、多個叢集和雲環境的共享,Kf支援主流的雲平臺,提供各個環境之間的移植性。你可以在本地開發模型、在叢集的GPU上進行訓練、最後部署到雲環境中,快速的開發模式和高效的部署使得整個過程就像單機操作一樣。
超參調優:在模型訓練中,超引數調優是很關鍵也很複雜的過程,對模型最終的準確度和效能有很大的影響,手動嘗試各種超引數的組合非常浪費時間。Kf通過Katib來支援自動超引數優化,這種自動優化會節省大量的計算時間,提高模型優化的效率。
持續整合:Kf目前並沒有這個方面成型的產品,但是可以通過Pipeline元件來實現。Pipeline支援建立可重複的工作流,可以自動觸發整個工作流的重跑以及模型的訓練。
# 4 部署
Kubeflow的部署其實很簡單,主要是依賴的映象大多出自Google因此會遇到很多網路問題。解決辦法推薦是通過阿里雲映象手動下載docker映象,然後tag成目標映象;或者直接修改kustomize中的映象地址。
安裝時需要下載kfctl並按照文件配置環境變數,比如我試過Ubuntu 18,可以參考下面的文件:https://www.kubeflow.org/docs/started/k8s/kfctl-k8s-istio/,大致流程如下:
```
1 到地址中下載對應的kfctl,darwin為mac,linux為其他,不支援windows
https://github.com/kubeflow/kfctl/releases/tag/v1.0.2
2 壓縮包解壓縮
tar -xvf kfctl_v1.0.2_.tar.gz
3 配置環境變數 vi /etc/profile
export PATH=$PATH:""
export KF_NAME=<自定義名稱>
export BASE_DIR=
export KF_DIR=${BASE_DIR}/${KF_NAME}
export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml"
4 更新環境變數
source /etc/profile
5 執行命令
mkdir -p ${KF_DIR}
cd ${KF_DIR}
kfctl apply -V -f ${CONFIG_URI}
6 檢視安裝服務
kubectl -n kubeflow get all
```
整個安裝過程很緩慢,尤其是前期需要安裝cert-manager進行許可權控制,需要等服務正常。
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220714804-1803233305.png)
中間會有大量的映象報錯ImagePullBackOff,這表示映象拉取失敗。解決辦法:
```
1 檢視具體pod的詳情
kubectl describe pod admission-webhook-bootstrap-stateful-set-0 -n kubeflow
2 去阿里雲映象站搜尋映象
docker pull registry.cn-hangzhou.aliyuncs.com/pigeonw/ingress-setup
3 重新命名
sudo docker tag registry.cn-hangzhou.aliyuncs.com/pigeonw/ingress-setup:latest gcr.io/kubeflow-images-public/ingress-setup:latest
4 修改kustomize中的配置
cd ./kustomize/webhook/base
sudo vim deployment.yaml
修改映象拉取策略
imagePullPolicy: IfNotPresent
原來如果是Always表示總是會去拉取遠端映象,IfNotPresent表示本地不存在時才會拉取
5 修改完成後等待一會,如果狀態還沒有變成Running,可以執行
kfctl apply -f kfctlxxx.yaml 重新建立
```
都部署成功後,大致可以看到如下的執行狀態,僅供參考:
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220811110-290595824.png)
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220819028-1664814615.png)
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220829144-1299678228.png)
# 5 使用
部署成功後,通過埠對映可以支援在外部訪問:
```
export NAMESPACE=istio-system
kubectl port-forward --address 0.0.0.0 -n ${NAMESPACE} svc/istio-ingressgateway 8080:80
```
然後訪問目標地址即可,如localhost:8080,自定義namespace後可以看到如下畫面:
![](https://img2020.cnblogs.com/blog/449064/202008/449064-20200807220745379-343858210.png)
後面將會分享Notebook、Pipeline、Katib等的使用,感謝