分佈式深度學習GPU管理之Tiresias

來自論文Tiresias:A GPU Cluster Manager for Distributed Deep Learning

概述

給一個龐大的GPU集羣,在實際的應用中,現有的大數據調度器會導致長隊列延遲低的性能,該文章提出了Tiresias,即一個GPU集羣的調度器,專門適應分佈式深度學習任務,該調度器能夠有效率的調度並且合適地放置深度學習任務以減少他們的任務完成時間(JCT(Job Completion Time)),一個深度學習任務執行的時間通常是不可預知的,該文章提出兩種調度算法,基於局部信息的離散化二維Gittins索引(Discretized Two Dimensional Gittins index)以及離散化二維LAS,對信息不可知並且能夠降低平均的JCT,在實驗中JCT能夠快5.5倍,相比於基於Apache YARN的資源管理

介紹

許多平臺提供方建立了GPU集羣,共享給用戶來滿足日益增長的深度學習任務數量,根據Microsoft的跟蹤分析,至2016年深度學習任務數量每年增長10.5倍,高效的任務調度智能的GPU分配是減少集羣平均JCT並且最大化GPU利用率的關鍵因素.

通過觀察,得知現有的集羣管理設計的兩個主要限制:

1. 由於訓練時間不可預知的樸素調度

雖然**最短優先(SJF)最短保持時間優先(SRTF)**可以被用於減少JCT,但是這兩個算法都需要任務的執行時間,而深度學習任務的執行時間通常是未知的,通常我們訓練到誤差收斂爲止。

我們可以做一個簡單的假設,即任務有平滑的誤差曲線,運行直到完成,在實際生產系統中可能並非如此。

目前內部的解決方案繼承於Apache YARN的容量調度器,該調度器是爲大數據任務構建的,它只執行基本的策略,例如非搶佔的調度策略,結果是用戶會遭受長隊列延遲,甚至對於很小的任務都要等待數個小時。

2. 在任務佈置方面過於激進的合併

現有集羣管理器還嘗試將DDL任務合併到具有足夠GPU的最小數量的服務器上,舉個例子,一個需要16個GPU的任務在每個服務器都是4個GPU的集羣中需要至少4個服務器,如果不能完全滿足則會被阻塞,在此之下的假設是網絡要儘量避免變成瓶頸或者浪費GPU週期

該文章提出了Tiresias,一個共享的GPU管理器,解決了上述的問題,即調度和放置的問題。爲了保重Tiresias是實際可用的以及容易被部署,基於對生產任務的跟蹤的分析,訓練細節的度量以及兩個簡單但有效的想法。除此之外,有意地讓Tiresias對用戶透明。

第一個想法
第一個想法是一個新的調度框架2DAS,可以當任務的執行時間不確定時減少JCT,在此框架下提出了兩種調度算法:

  • Discretized 2D-LAS
  • Discretized 2D Gittins index

Gittins索引策略是單服務器場景下用於優化JCT的策略,其中JCT的分佈是已知的。
同樣的,傳統的**LAS((Least-Attained Service)**算法也是被廣泛用於任務時間不可預知的場景下,例如數據中心的網絡調度。

上述兩個方案都是給任務一個優先級,前者使用Gittins索引,後者直接應用收到的任務(隨着時間會改變,任務會按照優先級來進行調度)

使用上述策略到DDL調度問題會面對兩個挑戰:

  • 當計算任務優先級的時候,我們需要同時考慮空間(GPU的個數)以及時間(多久)兩個維度
  • 由於優先級會持續發生變化,任務會持續地被搶佔,雖然當開始和停止一個流是簡單的情況下,網絡是可以容忍的,但搶佔一個任務是花費較大的,我們需要將數據和模型從內存和GPU那複製回去。爲了防止侵略性的任務搶佔,應用優先級離散化於兩個上述算法,即一個任務的優先級只能改變固定的值

綜上所述,有先驗的任務執行時間的分佈的情況下選用基於Gittins索引的算法,如果沒有先驗知識的話則選用LAS算法

第二個想法

第二個想法是使用模型結構來儘可能地鬆弛化合並放置的約束,我們發現只有某些確定類型的DL模型是對是否合併是敏感的,敏感度是由於其張量大小分佈的偏差。我們利用這種直覺將任務分成兩類:

  • 對於合併敏感(高度偏差)
  • 其他

我們實現了一個RDMA網絡分析庫,能夠通過網絡級別的活動判別分佈式深度學習任務的模型結構,通過利用這個庫Tiresias就可以智能地放置任務。

Tiresias首先在一個測試環境運行任務幾個迭代,然後根據之前度量的總結標準以確定最好的放置策略。

貢獻

  • Tiresias是第一個對於信息不可知的GPU資源管理,也是第一個考慮了兩個維度(時間和空間)以及優先級離散化的調度
  • Tiresias使用一個簡單的,外部可觀察的,模型特殊的標準來判別什麼時候放鬆worker的GPU合併的約束
  • 該設計有實用性和易部署性,並且性能顯著提高

背景和動機

分佈式機器學習(DDL)

這裏,我們關注數據的並行化,數據的並行化是目前流行的分佈式深度學習框架的公共部分。

數據的並行化

如上圖所示,每一個Worker有一個GPU,運行本地的深度學習模型副本,訓練集被劃分成等大小的部分分配給Worker們,所有的任務同步訓練,一個被觀察到的事實是這樣的架構能夠更快的收斂,相比於異步的分佈式訓練。

固定時間的迭代
深度學習訓練是按迭代的方式工作的,在每一個輪次,worker要做一次前向和反向的計算,接着worker將本地的結果互相更新深度學習模型,稱之爲模型聚集(Model Aggregation),由於每一個迭代的計算時間都是差不多的,故迭代的時間是高度可預測的。

參數服務器架構
參數服務器,簡稱PS(Parameter Server),這種架構是最流行的模型聚集的方法,參數服務器掌握主要的深度學習模型副本,使用從所有worker那裏得到的本地結果來更新模型,然後worker在每個迭代的一開始拉回參數來更新本地的模型,一個深度學習任務可以有多個參數服務器。

測試和錯誤的探索
爲了得到一個高質量的模型,需要對超參數的各種組合進行探索,稱爲超參數調優(hyperparameter-tuning),用戶可以用AutoML等搜索工具來進行高效的探索。在AutoML中,許多帶着不同超參數設置的深度學習任務被生成來訓練相同的任務,其中的大多數由於隨機的誤差或者低質量的提升會被消除。利用一開始測試階段的反饋,AutoML能夠搜索新的參數配置以及產生大量新的任務,當然其中只有少數擁有較高的質量。

挑戰

該文章主要針對分佈式深度學習集羣管理面臨的主要挑戰,這些挑戰來自於分佈式深度學習訓練的特性,並且並不特別針對Microsoft集羣

不可預測的作業時間
現有的解決方案用於預測深度學習任務訓練時間都假設:

  • 擁有平滑的誤差曲線
  • 到達他們的訓練目標並結束

然而,很多較弱的模型在訓練錯誤的探索階段,它們的誤差曲線不像最好的模型那麼平滑。

誤差曲線

深度學習任務什麼時候停止亦是不確定的。
通常來說,用戶會定義最大的迭代輪數以應對當模型到達不了預期的誤差的情況,即便如此,一個有效的資源管理設計也是不能依賴於誤差曲線進而預測任務的結束時間的。

過度侵略性的任務合併

在模型聚集階段嘗試減少網絡的通信在分佈式訓練中是一種通用的優化,因爲網絡可能是性能瓶頸並且浪費GPU週期。

然而,許多現存的GPU管理在放置分佈式深度學習任務時盲目地遵從一個合併約束,特別地,他們將作業的所有組件(參數服務器和Worker)分配給相同或最小數量的服務器

一個分佈式深度學習作業如果不能合併通常會等待,即使集羣中有足夠的空閒資源,雖然這個約束是爲了高性能,但是會導致更長的隊列延遲和低的資源利用。

爲了理解這個約束的重要性,我們運行4個8GPU併發的任務,使用不同的放置策略(隨機,經常性的合併),在8個4GPU服務器集羣上,每個任務使用8個參數服務器(和Worker數目一致)。

任務合併的約束

上述性能都以合併策略作爲基準進行標準化。Worker的位置主要影響了VGG系列和AlexNet。然而集羣的操作者和用戶都不能告訴一個任務究竟屬於哪個類別。

搶佔的時間開銷

現有的生產集羣不能搶佔,由於大量的時間開銷。 爲了表現這個問題,我們人工測試了在本地停止和重啓一個分佈式機器學習任務。在停止階段,主要的Worker會記錄當前的模型到共享的內存,該記錄的文件當重啓的時候會被載入。

重啓和停止的時間開銷

潛在的收益

我們可以通過減輕兩個方面來獲得巨大的收益
1. 任務如果沒有確切的持續時間,就不能被很好地調度
我們可以通過日誌學習到時間的分佈,進而使用Gittins索引策略,該策略廣泛用於傳統的多臂老虎機問題,進而降低平均的JCT。即使沒有時間的分佈,我們可以使用LAS算法。

2. 分佈式深度學習任務應該被經常合併
雖然合併任務的位置可以最大程度減小通信的時間,但是我們發現有的分佈式深度學習任務對於位置是敏感的

將智能的放置策略和調度策略結合,可以將平均JCT提高至少5倍

Tiresias的設計

主要是兩個模塊的設計,一個是調度器,一個是放置管理,以及用於學習任務特性的分析器

整體架構

主要是圍繞兩個目標,一個是用戶,一個是操作者

1. 最小化平均JCT
2. 高GPU利用率

Tiresias有額外的目標來平衡上述兩個目標

3. 任務不能無限的飢餓

給出一些實際的假設:

  1. 在線的任務到達: 任務被用戶提交,一個任務的資源需求是給定的,但是優先級是未知的。
  2. 未知的任務持續時間:由於非平滑的誤差曲線和不確定的停止,一個任務的持續時間無法預知,不過任務持續時間的分佈是可以通過日誌獲取。
  3. 未知的任務特性:一個用戶不知道也不能控制深度學習框架怎麼分配tensor到參數服務器,以及相應的偏差。
  4. All-or-nothing資源分配:資源服務器和Worker需要同時活躍

任務的生命週期: Tiresias目的是優化先前的目標,同時不需要對任務資源需求,持續時間等做任何的假設。

給出整體的架構圖

架構圖

調度

整個系統的設計目標是,最小化平均JCT,增加集羣利用率以及避免飢餓

我們觀察到搶佔式的調度式必需的,需要應用搶佔來避免HOL(Head-of-line)阻塞,一些小的任務會被大的任務阻塞住。這是FIFO調度的缺陷,對於搶佔的算法有許多,比如分時間片,SJF和SRTF。

Gandvia就是用分時間片來調度的。然而基於分時的算法目的在於公平分享達到隔離,並不是爲了最小化JCT。而SJF和SRTF由於預測一個任務的持續時間很困難也不可行。只考慮GPU個數也不夠有效,需要同時考慮任務的持續時間。

爲什麼是二維調度

通過回顧基於時間或大小的啓發式方法,我們認爲在具有有限GPU資源的羣集上調度DDL作業時,僅考慮一個方面(空間或時間)是不夠的。 在SRTF調度程序中,具有較短剩餘時間的大型作業可佔用許多GPU,從而導致許多小型但新提交的作業出現不可忽略的排隊延遲

如果調度程序是最小優先(例如,GPU的數量),則即使大型作業接近完成也可能被小作業流阻塞。

比較

這個圖比較的是:

  • 最小優先SF
  • SRTF
  • 最小保持服務優先SRSF

其中前兩個是單維度的,第三個是考慮兩個維度,表將SRSF作爲基準進行標準化
可以看出SRSF是要比一維的調度策略要優的

2DAS調度器

2DAS是對傳統LAS的擴展,同時考慮了時間和空間,它會賦予任務一個優先級,這個優先級和時間以及空間有關。

而這個優先級函數有不同的情況,當有沒有先驗知識的時候,即沒有任務持續時間的分佈的時候,使用LAS算法,如果有先驗分佈,則使用Gittins索引

我們將該算法和SRSF進行對比

2DAS對比SRSF

由於SRSF是有充分的先驗知識,故平均JCT比較短爲9.3,而Gittins是10,LAS是11.7

優先級離散化

使用連續的優先級會導致一系列的搶佔和一系列的重啓,對於分佈式深度學習任務來說,搶佔和重啓的代價很高,過多的搶佔會導致2DAS不可用,爲了解決這個問題,基於傳統的**多級別反饋隊列(MLFQ)**算法實現優先級離散化的框架

即,將原有的一個隊列變成K個隊列

MLFQ

給出一個任務的生命週期圖

任務的生命週期

放置

給定一個任務,需要參數服務器以及Worker,如果有足夠的資源,Tiresias需要知道是否在儘可能少的機器中合併一些任務的GPU或者去分發它們,前者在微軟的的生產集羣中實現,故一個任務即使資源足夠也可能被放置在等待隊列。

該文章使用ILP,即瞬間線性規劃來優化這個分配問題。

合併對於任務來說重要嗎?

深度學習模型中對於合併敏感的一般都有較大的張量, 原因是模型聚合中的消息大小與模型的結構密切相關。 例如,TensorFlow中的模型由許多張量組成。 每個張量都被包裝爲單個通信消息。因此,DDL中的消息大小分佈取決於模型的張量大小分佈。 張量大小通常分佈不均勻; 有時存在巨大的張量,其中包含這些模型中的大部分參數。 因此,聚合較大的張量會更嚴重地受到網絡爭用的影響,而較小張量的傳輸往往會相互交錯。

利用這個直覺,設計了Tiresias的分析器,用於分析每個模型的偏差程度,再使用放置的算法

總結

與Apache YARN的容量調度程序(YARNCS)和Gandiva相比,Tiresias旨在最小化平均JCT。 與Optimus不同,Tiresias可以在沒有或具有部分先驗知識的情況下有效地安排工作(表2)。 此外,Tiresias可以根據Tiresias pro fi ler自動捕獲的模型結構巧妙地放置DDL作業。

分析

給出JCT的優化效果

JCT

平均JCT,Tiresias要高YARN-CS5倍左右,中位數JCT則最多高出27倍

GPU利用率
GPU利用率看上去則差不多

長隊列延遲的效果
長隊列延遲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章