Kubeflow使用Kubernetes进行机器学习GPU分布式训练
Kubeflow使用Kubernetes進行機器學習
Kubeflow是Google推出的基于kubernetes環境下的機器學習組件,通過Kubeflow可以實現對TFJob等資源類型定義,可以像部署應用一樣完成在TFJob分布式訓練模型的過程。最初的設計是將Kubernetes和Tensorflow結合實現對Tensorflow分布式訓練的支持。但是僅僅實現對Tensorflow的支持還是遠遠不夠的,Kubeflow社區又陸續對各種深度學習框架進行支持,例如:MXNet,?Caffee,?PyTorch等。使得機器學習算法同學只需關心算法實現,而后續的模型訓練和服務上線都交給平臺來做,解放算法同學使其專做自己擅長的事兒。
在繼續介紹Kubeflow之前, 先簡單介紹下真正的機器學習模型服務上線都需要經歷哪些階段,如下圖所示:
?
?
注意:上圖的每種顏色代表對一個階段的處理
從上圖可以看出一個機器學習模型上線對外提供服務要經過:數據清洗驗證,數據集切分,?訓練,構建驗證模型,?大規模訓練,模型導出,模型服務上線,?日志監控等階段。Tensorflow 等計算框架解決了最核心的部分問題,但是距離生產化,產品化,以及企業級機器學習項目開發,還有一段距離。比如:?數據收集,?數據清洗,?特征提取,?計算資源管理,?模型服務,?配置管理,?存儲,?監控,?日志等等。
?
?
好了機器學習服務上線的基本流程介紹之后,接下來繼續介紹Kubeflow.
Kubeflow核心組件介紹
- jupyter?多租戶NoteBook服務
- Tensorflow?PyTorch?MPI?MXnet?Chainer?當前主要支持的機器學習引擎
- Seldon?提供在Kubernetes上對機器學習模型的部署
- TF-Serving?提供對Tensorflow模型的在線部署,支持版本控制及無需停止線上服務,切換模型等功能
- Argo?基于Kubernetes的工作流引擎
- Ambassador?對外提供統一服務的網關(API Gateway)
- Istio?提供微服務的管理,Telemetry收集
- Ksonnet?Kubeflow使用ksonnet來向kubernetes集群部署需要的k8s資源
而Kubeflow利用Kubernetes的優勢:
- 原生的資源隔離
- 集群化自動化管理
- 計算資源(CPU/GPU)自動調度
- 對多種分布式存儲的支持
- 集成較為成熟的監控,告警
將機器學習各個階段涉及的組件已微服務的方式進行組合并已容器化的方式進行部署,提供整個流程各個系統的高可用及方便的進行擴展。
?
?
Kubeflow 部署安裝
實驗環境
硬件環境
服務器配置:
- GPU卡型號: Nvidia-Tesla-K80
- 網卡: 千兆(注意:在進行對大數據集進行訓練時,千兆的網卡會是瓶頸)
cephfs服務配置:
- 網卡:萬兆(注意:通過ceph對數據存儲時,ceph集群需要與Kubernetes同機房,否則延遲會對加載數據集的影響非常高)
注意:服務器的GPU驅動和Nvidia-docker2.0的部署安裝之前介紹過,這里就不介紹了。
軟件環境:
- kubernetes version: v1.12.2(注意: 需要安裝kube-dns)
- kubeflow version: v0.3.2
- jsonnet version: v0.11.2
Kubeflow 安裝
- 安裝ksonnet
| 1 2 3 4 5 6 7 8 | # export KS_VER=0.11.2 # export KS_PKG=ks_${KS_VER}_linux_amd64 # wget -O /tmp/${KS_PKG}.tar.gz https://github.com/ksonnet/ksonnet/releases/download/v${KS_VER}/${KS_PKG}.tar.gz \--no-check-certificate# mkdir -p ${HOME}/bin # tar -xvf /tmp/$KS_PKG.tar.gz -C ${HOME}/bin # export PATH=$PATH:${HOME}/bin/$KS_PKG |
關于ksonnet的更多信息請查看官網:https://ksonnet.io/
- 安裝Kubeflow
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # export KUBEFLOW_SRC=/home/wangxigang/kubeflow # mkdir ${KUBEFLOW_SRC} # cd ${KUBEFLOW_SRC} # export KUBEFLOW_TAG=v0.3.2# curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash# export KUBEFLOW_REPO=/home/wangxigang/kubeflow/scripts # export KFAPP=/home/wangxigang/kubeflow/kubeflow_ks_app# ${KUBEFLOW_REPO}/scripts/kfctl.sh init ${KFAPP} --platform none # cd ${KFAPP} # ${KUBEFLOW_REPO}/scripts/kfctl.sh generate k8s # ${KUBEFLOW_REPO}/scripts/kfctl.sh apply k8s |
關于kubeflow的更多信息請查看官網:https://v0-3.kubeflow.org/docs/started/getting-started/
當上面的所有安裝步驟都正常完成之后,先查看kubeflow在kubernetes集群deployment資源對象的啟動狀態:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@localhost]# kubectl get deployment -n kubeflow NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE ambassador 3 3 3 3 11d argo-ui 1 1 1 1 11d centraldashboard 1 1 1 1 11d modeldb-backend 1 1 1 1 11d modeldb-db 1 1 1 1 11d modeldb-frontend 1 1 1 1 11d mxnet-operator 1 1 1 1 11d spartakus-volunteer 1 1 1 1 11d studyjob-controller 1 1 1 1 11d tf-job-dashboard 1 1 1 1 11d tf-job-operator-v1alpha2 1 1 1 1 11d vizier-core 1 1 1 1 11d vizier-db 1 1 1 1 11d vizier-suggestion-bayesianoptimization 1 1 1 1 11d vizier-suggestion-grid 1 1 1 1 11d vizier-suggestion-hyperband 1 1 1 1 11d vizier-suggestion-random 1 1 1 1 11d workflow-controller 1 1 1 1 11d |
ok,通過狀態我們發現現在服務啟動正常,在查看下各個deployment下各個服務的pod的狀態:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@localhost]# kubectl get pods -n kubeflow NAME READY STATUS RESTARTS AGE ambassador-c97f7b448-8qgbg 3/3 Running 1 8d ambassador-c97f7b448-bspqt 3/3 Running 1 8d ambassador-c97f7b448-vq6mn 3/3 Running 1 8d argo-ui-7495b79b59-b2hlg 1/1 Running 0 8d centraldashboard-798f8d68d5-gxx4g 1/1 Running 0 8d modeldb-backend-d69695b66-dxr44 1/1 Running 0 8d modeldb-db-975db58f7-wshd4 1/1 Running 0 8d modeldb-frontend-78ccff78b7-xr7h7 1/1 Running 0 8d mxnet-operator-6c49b767bc-nj995 1/1 Running 19 8d spartakus-volunteer-94bbd5c86-7xmfd 1/1 Running 0 8d studyjob-controller-7df5754ddf-pqqgt 1/1 Running 0 8d tf-hub-0 1/1 Running 0 8d tf-job-dashboard-7499d5cbcf-cct2q 1/1 Running 0 8d tf-job-operator-v1alpha2-644c5f7db7-v5qzc 1/1 Running 0 8d vizier-core-56dfc85cf9-qdrnt 1/1 Running 973 8d vizier-db-6bd6c6fdd5-h549q 1/1 Running 0 11d vizier-suggestion-bayesianoptimization-5d5bc5685c-x89lm 1/1 Running 0 8d vizier-suggestion-grid-5dbfc65587-vv4gs 1/1 Running 0 8d vizier-suggestion-hyperband-5d9997fb99-hr9pj 1/1 Running 0 8d vizier-suggestion-random-7fccb79977-5mggb 1/1 Running 0 8d workflow-controller-d5cb6468d-29kmf 1/1 Running 0 8d |
ok,現在服務都是正常的,接下來讓我們通過Ambassador來訪問kubeflow部署到k8s集群中的各個組件。
注意: 由于官方默認使用的鏡像都是google鏡像倉庫的,所以在部署時可能出現墻的問題
訪問Kubeflow UIs
由于Kubeflow使用Ambassador作為kubeflow統一的對外網關,其它的內部服務都是通過使用它來對外提供服務。具體如下圖所示:
?
?
接下來我們使用kubectl的port-forwarding來對Ambassador Service進行端口轉發,在本地對Kubeflow進行訪問:
| 1 2 3 4 | # export NAMESPACE=kubeflow # kubectl --kubeconfig /etc/kubernetes/kubeconfig port-forward -n ${NAMESPACE} `kubectl --kubeconfig /etc/kubernetes/kubeconfig get pods -n ${NAMESPACE} --selector=service=ambassador -o jsonpath='{.items[0].metadata.name}'` 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80 |
通過瀏覽器進行本地localhost:8080訪問:
?
?
通過Kubeflow UIs可以針對不同的功能進行使用,如使用Jupyter Notebook進行對應用的全過程計算:開發、文檔編寫、運行代碼和展示結果。
?
?
通過Kubeflow UIs訪問TF-operator來對基于Tensorflow的模型進行多機多卡的分布式訓練。
?
?
好了,這篇文章簡單的介紹了Kubeflow及其安裝流程,關于文章介紹的服務組件太多,需要自行去深入了解了,就不詳細介紹了。在接下來的文章會介紹基于kubeflow對Tensorflow和MXNet模型進行多機多卡的分布式訓練。
總結
現在國外的Google,微軟,亞馬遜,Intel以及國內的阿里云,華為云,小米云,京東云, 才云等等公司都在發力Kubeflow,并結合kubernetes對多種機器學習引擎進行多機多卡的大規模訓練,這樣可以做到對GPU資源的整合,并高效的提高GPU資源利用率,及模型訓練的效率。并實現一站式服務,將機器學習服務上線的整個workflow都在Kubernetes平臺實現。減輕機器學習算法同學的其它學習成本,專心搞算法。這勢必給Devops的同學帶來更高的跳挑戰。相信未來Kubeflow會發展的更好。
?
基于 kubeflow 測試 MXNet 分布式訓練
?
1 準備測試的訓練鏡像
?
示例代碼: https://github.com/deepinsight/insightface
?
Dockerfile 文件內容:
?
?
2 創建分布式網絡文件系統數據卷(cephfs)
?
?
由于我們是基于 kubernetes 的 pv 和 pvc 的方式使用數據卷,所有集群中需要事先安裝好 storage-class install,這樣當用戶創建 pvc 時,會通過 storage-class 自動的創建 pv。
?
當創建好 pv 之后,用戶可以將該數據卷 mount 到自己的開發機上,并將需要訓練的數據集移到該數據卷。用于之后創建訓練 worker pod 的時候,掛載到 worker 容器中,供訓練模型使用。
?
3 創建 mxnet 分布式訓練任務
?
?
4 創建訓練任務
?
kubectl create -f insightface-train.yaml復制代碼
?
5 查看任務運行情況
?
?
?
6 查看訓練日志的信息
?
登錄到具體的 node 計算節點通過 docker logs 命令查看訓練的日志:
?
docker logs -f fc3d73161b27復制代碼
?
?
總結
?
雖然已經完成了 mxnet 結合 kubeflow 實現大規模的分布式訓練,但是除了功能上的基本跑通,還存在很多因素影響分布式訓練的性能,如: GPU 服務器的網絡帶寬,普通的我們使用的以太網因為通信延遲的原因,會大大影響多機擴展性。InfiniBand(IB)網絡和 RoCE 網絡因為支持 RDMA,大大降低了通信延遲,相比之下,20G 的以太網格延遲會大大提升。當然,對于現有的普通以太網絡,也可以通過別的方法優化通信帶寬的減少,比方說梯度壓縮。通過梯度壓縮,減少通信帶寬消耗的同時,保證收斂速度和精度不會有明顯下降。MXNet 官方提供了梯度壓縮算法,按照官方數據,最佳的時候可以達到兩倍的訓練速度提升,同時收斂速度和精度的下降不會超過百分之一。還有如果使用分布式網絡文件系統進行數據集的存儲,如果解決吞吐量和網絡延遲的問題。以及本地磁盤是否是 SSD,還是在訓練時是否需要對大文件的數據集進行 record.io 文件格式的處理及訓練前數據集的切分等等問題,都需要更進一步的處理。
?
參考
- http://stevenwhang.com/tfx_paper.pdf
- https://www.kubeflow.org/
- https://opensource.com/article/18/6/kubeflow
- https://www.oliverwyman.com/content/dam/oliver-wyman/v2/events/2018/March/Google_London_Event/Public%20Introduction%20to%20Kubeflow.pdf
總結
以上是生活随笔為你收集整理的Kubeflow使用Kubernetes进行机器学习GPU分布式训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue路由基本操作
- 下一篇: java 存储png文件_vue图片上传