像Google一樣構建機器學習系統 - 在阿里雲上搭建Kubeflow Pipelines

芊寶寶發表於2019-05-06

介紹

機器學習的工程複雜度,除了來自於常見的軟體開發問題外,還和機器學習資料驅動的特點相關,這就帶來了其工作流程鏈路更長,資料版本失控,實驗難以跟蹤、結果難以重現,模型迭代成本巨大等一系列問題。為了解決這些機器學習特有的問題,很多企業構建了內部機器學習平臺來管理機器學習生命週期,其中最有名的是Google的Tensorflow Extended,Facebook的FBLearner Flow,Uber的Michelangelo,遺憾的是這些平臺都需要繫結在公司內部的基礎設施之上,無法徹底開源。而這些機器學習平臺的骨架就是機器學習工作流系統,它可以讓資料科學家靈活定義自己的機器學習流水線,重用已有的資料處理和模型訓練能力,進而更好的管理機器學習生命週期。

像Google一樣構建機器學習系統 - 在阿里雲上搭建Kubeflow Pipelines

談到機器學習工作流平臺,Google的工程經驗非常豐富,它的TensorFlow Extended機器學習平臺支撐了Google的搜尋,翻譯,視訊等核心業務;更重要的是其對機器學習領域工程效率問題的理解深刻,

Google的Kubeflow團隊於2018年底開源了Kubeflow Pipelines(KFP), KFP的設計與Google內部機器學習平臺TensorFlow Extended一脈相承,唯一的區別是KFP執行在Kubenretes的平臺上,TFX是執行在Borg之上的。

什麼是Kubeflow Pipelines

Kubeflow Pipelines平臺包括:

  • 能夠執行和追蹤實驗的管理控制檯
  • 能夠執行多個機器學習步驟的工作流引擎(Argo)
  • 用來自定義工作流的SDK,目前只支援Python

而Kubeflow Pipelines的目標在於:

  • 端到端的任務編排: 支援編排和組織複雜的機器學習工作流,該工作流可以被直接觸發,定時觸發,也可以由事件觸發,甚至可以實現由資料的變化觸發
  • 簡單的實驗管理: 幫助資料科學家嘗試眾多的想法和框架,以及管理各種試驗。並實現從實驗到生產的輕鬆過渡。
  • 通過元件化方便重用: 通過重用Pipelines和元件快速建立端到端解決方案,無需每次從0開始的重新構建。

在阿里雲上執行Kubeflow Pipeline

看到Kubeflow Piplines的能力,大家是不是都摩拳擦掌,想一睹為快?但是目前國內想使用Kubeflow Pipeline有兩個挑戰:
1.Pipelines需要通過Kubeflow部署;而Kubeflow預設元件過多,同時通過Ksonnet部署Kubeflow也是很複雜的事情。 2.Pipelines本身和谷歌雲平臺有深度耦合,無法在執行其他雲平臺上或者裸金屬伺服器的環境。

為了方便國內的使用者安裝Kubeflow Pipelines,阿里雲容器服務團隊提供了基於Kustomize的Kubeflow Pipelines部署方案。和普通的Kubeflow基礎服務不同,Kubeflow Pipelines需要依賴於mysql和minio這些有狀態服務,也就需要考慮如何持久化和備份資料。在本例子中,我們藉助阿里雲SSD雲盤作為資料持久化的方案,分別自動的為mysql和minio建立SSD雲盤。

您可以在阿里雲上嘗試一下單獨部署最新版本Kubeflow Pipelines。

前提條件

在Linux和Mac OS環境,可以執行

opsys=linux  # or darwin, or windows
curl -s https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest |\
  grep browser_download |\
  grep $opsys |\
  cut -d '"' -f 4 |\
  xargs curl -O -L
mv kustomize_*_${opsys}_amd64 /usr/bin/kustomize
chmod u+x /usr/bin/kustomize複製程式碼

在Windows環境,可以下載kustomize_2.0.3_windows_amd64.exe

  • 在阿里雲容器服務建立Kubernetes叢集, 可以參考 文件

部署過程

1.通過ssh訪問Kubernetes叢集,具體方式可以參考文件

2.下載原始碼

yum install -y git
git clone --recursive https://github.com/aliyunContainerService/kubeflow-aliyun複製程式碼

3.安全配置

3.1 配置TLS證照。如果沒有TLS證照,可以通過下列命令生成

yum install -y openssl
domain="pipelines.kubeflow.org"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout kubeflow-aliyun/overlays/ack-auto-clouddisk/tls.key -out kubeflow-aliyun/overlays/ack-auto-clouddisk/tls.crt -subj "/CN=$domain/O=$domain"複製程式碼
如果您有TLS證照,請分別將私鑰和證照儲存到kubeflow-aliyun/overlays/ack-auto-clouddisk/tls.keykubeflow-aliyun/overlays/ack-auto-clouddisk/tls.crt

3.2 配置admin的登入密碼

yum install -y httpd-tools
htpasswd -c kubeflow-aliyun/overlays/ack-auto-clouddisk/auth admin
New password:
Re-type new password:
Adding password for user admin複製程式碼

4.首先利用kustomize生成部署yaml

cd kubeflow-aliyun/
kustomize build overlays/ack-auto-clouddisk > /tmp/ack-auto-clouddisk.yaml複製程式碼

5.檢視所在的Kubernetes叢集節點所在的地域和可用區,並且根據其所在節點替換可用區,假設您的叢集所在可用區為cn-hangzhou-g,可以執行下列命令

sed -i.bak 's/regionid: cn-beijing/regionid: cn-hangzhou/g' \
    /tmp/ack-auto-clouddisk.yaml

sed -i.bak 's/zoneid: cn-beijing-e/zoneid: cn-hangzhou-g/g' \
    /tmp/ack-auto-clouddisk.yaml複製程式碼
建議您檢查一下/tmp/ack-auto-clouddisk.yaml修改是否已經設定

6.將容器映象地址由gcr.io替換為registry.aliyuncs.com

sed -i.bak 's/gcr.io/registry.aliyuncs.com/g' \
    /tmp/ack-auto-clouddisk.yaml複製程式碼
建議您檢查一下/tmp/ack-auto-clouddisk.yaml修改是否已經設定

7.調整使用磁碟空間大小, 比如需要調整磁碟空間為200G

sed -i.bak 's/storage: 100Gi/storage: 200Gi/g' \
    /tmp/ack-auto-clouddisk.yaml複製程式碼

8.驗證pipelines的yaml檔案

kubectl create --validate=true --dry-run=true -f /tmp/ack-auto-clouddisk.yaml複製程式碼

9.利用kubectl部署pipelines

kubectl create -f /tmp/ack-auto-clouddisk.yaml複製程式碼

10.檢視訪問pipelines的方式,我們通過ingress暴露pipelines服務,在本例子中,訪問ip是112.124.193.271。而Pipelines管理控制檯的連結是:https://112.124.193.271/pipeline/

kubectl get ing -n kubeflow
NAME             HOSTS   ADDRESS           PORTS     AGE
ml-pipeline-ui   *       112.124.193.271   80, 443   11m複製程式碼

11.訪問pipelines管理控制檯

如果使用自簽發證照,會提示此連結非私人連結,請點選顯示詳細資訊, 並點選訪問此網站。

像Google一樣構建機器學習系統 - 在阿里雲上搭建Kubeflow Pipelines

請輸入步驟2.2中的使用者名稱admin和設定的密碼

像Google一樣構建機器學習系統 - 在阿里雲上搭建Kubeflow Pipelines

這時就可以使用pipelines管理和執行訓練任務了。

像Google一樣構建機器學習系統 - 在阿里雲上搭建Kubeflow Pipelines

Q&A

1.為什麼這裡要使用阿里雲的SSD雲盤?

這是由於阿里雲的SSD雲盤可以設定定期的自動備份,保證pipelines中的後設資料不會丟失。

2.如何進行雲盤備份?

如果您想備份雲盤的內容,可以為雲盤 手動建立快照 或者 為硬碟設定自動快照策略 按時自動建立快照。

3.如何清理Kubeflow Piplines部署?

這裡的清理工作分為兩個部分:

  • 刪除Kubeflow Pipelines的元件
kubectl delete -f /tmp/ack-auto-clouddisk.yaml複製程式碼
  • 通過釋放雲盤分別釋放mysql和minio儲存對應的兩個雲盤

4.如何使用現有云盤作為資料庫儲存,而避免自動建立雲盤?

請參考文件

總結

本文為您初步介紹了Kubeflow Pipelines的背景和其所要解決的問題,以及如何在阿里雲上通過Kustomize快速構建一套服務於機器學習的Kubeflow Pipelines,後續我們會分享如何利用Kubeflow Pipelines開發一個完整的機器學習流程。


原文連結

本文為雲棲社群原創內容,未經允許不得轉載。


相關文章