作者在之前的文章《在SkyForm ECP上運行深度學習框架》中介紹過深度學習框架運行在kubernetes上的優勢,以及這種實踐方式的基本架構。
社區中也出現了很多tensorflow on kubernetes的方案,比如最早使用jinja模板的方案(https://github.com/tensorflow/ecosystem/tree/master/kubernetes),以及後來的kubeflow(https://github.com/google/kubeflow)和Tensorflow/k8s(https://github.com/tensorflow/k8s),都是為了能夠更好的把tensorflow運行在kubernetes上,簡化手工搭建tensorflow集群時的繁瑣工作。
其中Tensorflow/k8s用kubernetes的CRD定義新的資源類型TFJob,可以在TFJob中定義PS、Worker和TensorBoard的信息,方便創建一個分布式的tensorflow集群。
SkyForm ECP的AIaaS方案和社區方案的一個簡單對比如下:
Tensorflow/k8s
kubeflow
AIaaS方案
深度學習框架支持
Tensorflow
Tensorflow
Tensorflow,Mxnet,Caffe
Hybrid MPI Jobs
不支持
不支持
支持
深度學習工作流
JupyterHub,Tensorflow training,Tensorflow serving
只支持Tensorflow training,沒有工作流
Jupyter,
Tensorflow training,Tensorflow serving
Gangscheduling
不支持
不支持
支持,自研
任務控制器
專門針對Tensorflow的控制器
專門針對Tensorflow的控制器
自研通用的HybridJob控制器
其它
無
無
完整的多租戶、日誌、存儲、監控方案
SkyForm ECP平臺不但支持Tensorflow、Mxnet、Caffe等多種深度學習框架,而且集成了OpenFace等AI應用,以及經過嚴格測試開箱即用的算法框架。
SkyForm ECP的AIaaS方案核心技術詳解
目前Kubernetes社區關於深度學習的方案基本都僅支持單一框架,同時調度器的功能也很簡單。在實際的應用中還存在以下不足:
為了解決上述問題,SkyForm ECP平臺中提出了一種HybridJob混合任務的概念,使用CRD定義HybridJob任務類型,開發了HybridJob Controller控制器對HybridJob任務進行處理。HybridJob中支持對每種任務設置最大副本數和最小副本數,以便在集群資源緊張時動態調整。
同時在SkyForm ECP中設計了新的調度器——Gang Scheduler,它在分配資源的過程中,不再將Pod單獨調度,而是把相互關聯的Pod作為一個整體來打包調度,避免只有部分Pod調度成功但是訓練任務不能正常執行,已啟動的Pod浪費集群資源的情況。具體的工作流程如下圖所示:
1 . 用戶使用kubectl或在Portal提交HybridJob資源對象,HybridJobController根據提交的HybridJob信息生成對應的pod;
2 . Gang scheduler參考集群當前資源情況,決定在minReplicas-maxReplicas範圍內運行哪些pod;
3 . 對已成功調度的pod進行bind操作,並將其提交到kubernetes集群中運行。
HybridJob Controller是SkyForm研發的一種混合任務控制器,可以在Hybridjob中同時創建PS和Worker等多種不同類型的任務。HybridJob的模型如下:
HybridJob中可以有多個ReplicaSpec,每個ReplicaSpec代表一種任務類型。每個任務類型可以自定義最小副本數minReplicas和最大副本數maxReplicas,任務實際運行的Pod數在最小副本數和最大副本數之間。其中,最小副本數是任務運行必須滿足的副本數,如果任務調度後獲得資源的Pod數目小於最小副本數,表示調度失敗,等待下個周期重新調度;最大副本數是副本數的上限。具體運行的Pod數目是根據集群的實際可用資源動態調整的。HybridJob和每個ReplicaSpec都有狀態信息記錄,可以分別查看它們的當前狀態。
Gang Scheduler是一種Pod組調度器,它保證了只有組中的minReplicas條件滿足時才會真正創建Pod。這樣的做法不僅在集群資源緊張的時候更靈活地調度資源,而且能有效防止資源死鎖。
Gang Scheduler的特性主要包括兩點:
Gang Scheduler具體的調度流程如下:
1 . 以minReplicas數目為目標分別調度每個ReplicaSpec。
2 . 調度成功後,以maxReplicas為上限分別調度每個ReplicaSpec,調度過程中考慮每個ReplicaSpec的優先級,優先級越高,其所屬Pod的調度概率就越大。
3 . 根據調度結果修改調度組的狀態,如果ReplicaSpec最終獲得資源的Pod數目小於minReplicas,則認為該任務調度失敗,調度失敗後釋放其中已調度成功的pod資源,重新添加調度組到queue;調度成功bind所有已調度成功的pod。
4 . HybridJob Controller監聽Pod的狀態,根據Pod實際運行情況修改HybridJob的狀態,刪除未綁定的多餘Pod。
本節以Tensorflow為例展示SkyForm ECP平臺,在平臺上應用Tensorflow的訓練過程如下圖所示:
1 . 上傳訓練代碼和數據:目前支持的後端存儲類型包括nfs和glusterfs。也可以創建jupyter應用在線開發。
2 . 啟動訓練任務:在應用市場選擇tensorflow,填寫存儲信息、任務啟動命名、PS的最小和最大副本數、Worker的最小和最大副本數等參數,點擊部署運行訓練任務,在以下動圖中可以看到實際運行的副本數在最小和最大副本數之間,具體數目由gang scheduler根據集群的資源使用情況動態調整;訓練過程中可以查看每個Pod的實時日誌;訓練完成後可以在存儲卷中查看生成的model信息;TensorBord提供的外部埠可訪問TensorBoard服務。
3 . 啟動Serving:在應用市場選擇serving,填寫存儲信息,model的位置,以及model的名稱信息,填寫serving的副本數及資源需求;選擇是否啟用HPA對serving服務做自動伸縮,或者在serving服務部署後手動更改serving服務的副本數。
4 . 測試Serving:在demo應用中輸入serving的服務地址及埠,進行手寫數字識別。
5 . 重新運行任務:重新運行任務支持修改任務啟動命令,傳入新的訓練參數;每次重新執行任務都會根據集群當前的資源情況進行調度,決定實際運行的Pod副本數。
SkyForm ECP平臺上實踐了多種深度學習框架,針對實際應用中存在的部分問題進行了改進,並取得了一些效果。但還有許多特殊需求和技術問題需要進一步地研究開發,主要包括: