徐渙霖 顧嘉臻 康 昱 周揚帆
1(復旦大學計算機科學技術學院 上海 200433) 2(上海市智能信息處理重點實驗室 上海 200433) 3(微軟亞洲研究院 北京 100080)
深度學習技術已經在自然語言處理[1]、圖像分類[2]和推薦系統[3]等眾多領域中被證明是卓有成效的,甚至在特定領域中超越了人類的表現[4]。這使得深度學習模型被廣泛地訓練和部署。通常情況下,一個深度學習模型會包含數以千萬計的參數。為了能盡可能提高深度學習應用的開發效率,通用計算能力更強的圖形處理單元(GPU)被大量應用于模型訓練中。
因此近年來隨著深度學習應用的普及,GPU越來越被認為是一種重要的計算資源。云端提供GPU計算設備的服務正變得流行。諸如Google Cloud、Amazon Web Service和Microsoft Azure等云平臺,已經向開發者提供了GPU云計算服務。出于商業考慮,云服務供應商通常會利用虛擬化技術使得多個應用程序之間共享一個GPU設備[5],以最大化經濟效益。因此當用戶使用云服務來訓練其深度學習模型時,其使用的GPU設備可能同時為其他用戶執行訓練進程[6]。在運行適當的深度學習模型組合時,GPU云平臺的資源利用率有望得到提高,但也可能導致整體訓練效率的大幅度下降。如何在這種情境下優化GPU資源分配成為一個值得研究的問題。
我們希望通過研究說明,各種類型的深度學習模型在一個GPU設備上同時訓練時,訓練進程的具體性能表現和原因。此研究結果可以為提高GPU云平臺資源利用率和優化深度學習模型訓練進程的調度提供參考,使用戶和服務提供商受益。為了達到這個目標,我們精心設計了四個研究問題,并通過相關實驗研究來回答這些問題。研究結果提供了訓練不同的深度學習模型組合時的性能表現,并且展示了訓練進程性能表現與模型屬性之間的關系。
我們在本節提出了四個研究問題。通過回答這些問題,旨在更好地了解在一個GPU設備上同時訓練多個深度學習模型的性能表現。首先定義共享訓練的概念。
定義1如果訓練深度學習模型A和B的進程同時在同一個GPU設備上運行,則稱之為深度學習模型A和B的共享訓練。
GPU設備的內存資源對模型訓練非常重要,因為GPU內存大小決定訓練進程是否可以正常運行至結束。在這種情況下,現有的深度學習開發框架的默認設置傾向占用盡可能多的GPU內存。因此,第一個研究問題如下。
問題1當一個深度學習模型單獨占用GPU設備訓練時,分配不同的GPU內存大小是否會影響它的訓練進程運行時間?
這種獨占資源的調度使得一個GPU設備每次只能訓練一個深度學習模型。如果用于訓練的應用程序實際上只需要很少的GPU內存,就將導致資源的浪費。這在GPU云平臺中尤其不可取。一種提高資源利用率的樸素方案是讓一個GPU設備同時運行多個深度學習模型的訓練進程。然而在一個GPU設備上共享訓練多個深度學習模型時,訓練進程的整體效率尚不明確。我們對幾個具有代表性的深度學習模型組合進行了實驗,旨在討論共享訓練將使訓練性能受到多大程度的影響,不同深度學習模型組合的具體性能表現如何。第二個研究問題如下。
問題2當共享訓練深度學習模型A和B時,是否會影響深度學習模型A的訓練進程運行時間?如果是,那么模型組合類型是否與訓練運行時間變化有聯系?是否存在共享訓練效率更高的情況?
在回答以上問題后,我們進而研究為什么兩個深度學習模型共享訓練會對互相的訓練進程性能進行產生影響。為了后續研究,分析了不同深度學習模型的底層運算屬性。第三個研究問題如下。
問題3不同深度學習模型的運算屬性是否存在顯著差異?
深度學習模型訓練進程所需系統資源主要分為GPU核心的計算資源和數據交換的I/O資源。不同類型的模型對計算資源和I/O資源的需求不同。一個深度學習模型可能是I/O密集型或(/和)計算密集型的。在共享訓練中,不同進程可能會相互爭奪計算和I/O資源。這種資源競爭可能導致整體性能下降。所以第四個研究問題如下。
問題4共享訓練時是否存在系統資源競爭的情況?如果是,是否是導致每個訓練進程性能下降的因素?
首先測試共享訓練時的進程性能表現。由于在模型的訓練過程中每次迭代的時間是相對穩定的,可以使用每次迭代的時間來近似表示模型的總訓練時間。首先獨立訓練每個模型并記錄它們的訓練時間,再將這些深度學習模型兩兩組合進行共享訓練,以獲得各模型組合的整體訓練性能表現。定義性能退化系數的概念如下。

性能退化系數rAB可以表明模型A和B在共享訓練中,模型A的性能退化情況,系數越大性能退化越嚴重。如果兩個模型的共享訓練比分別獨立訓練更快,那么共享訓練是有益的。共享訓練下總訓練時間更短的條件的推導過程如下。
首先,假設模型A和B獨占GPU時的訓練時間分別為tA和tB,共享訓練時的性能退化系數分別為rAB和rBA。則模型A和B共享訓練時的總訓練時間t可以表示為:
如果有t 綜上所述,對于模型A和B,如果我們得到rAB和rBA,可以知道:1) 模型A和B的共享訓練相對于每個模型獨立訓練的性能差別;2) 模型A和B在共享訓練和分別獨立訓練兩種情況下,哪種的總訓練時間更短。 進一步研究共享訓練時進程性能下降的原因。通常,GPU計算和I/O操作的工作負載是影響深度學習模型訓練性能的兩個主要因素。與GPU計算相關的屬性包括進程內的計算操作執行率等。與I/O相關的屬性包括進程所需的內存大小、總體數據讀取請求速率和總體數據寫入請求速率等。以上這些屬性描述了深度學習模型訓練進程的總體執行特性。我們檢驗了不同深度學習模型的屬性是否存在顯著差異。進而比較了在共享訓練的過程中,GPU核心利用率和I/O吞吐量與獨立訓練相比有什么區別,目標是探究共享訓練中是否存在系統資源競爭以及對進程性能的影響。為了驗證假設結果的相關性,進行KS檢驗和卡方檢驗來進一步保證結果的有效性。 以上的研究旨在展示深度學習模型在共享訓練過程中的表現以及造成這種現象的潛在原因。為了證明以上實驗結果的普遍性,我們在不同的GPU設備上重復了相同的實驗,并對實驗結果進行了比較。 我們重點關注三類有代表性的深度學習模型,分別是全連接神經網絡[7](FCNs)、卷積神經網絡[8](CNNs)和遞歸神經網絡[9](RNNs)。這些模型的建模能力是互補的[10],并在眾多領域得到了廣泛應用。由于深層FCNs的應用受到限制,使用5層全連接網絡作為FCNs的代表[10]。為了研究不同結構的CNN,我們實現并測試了兩個具有代表性的CNN模型,即VGG-19[11]和ResNet-50[2]。LSTM[1]用于建模序列結構,我們將其作為RNNs的代表。實驗中涉及到的模型配置和相應的數據集的細節如表1所示。 表1 實驗模型和數據集的相關細節 實驗中涉及的所有深度學習模型全部利用TensorFlow 1.13實現,Python版本號為3.6,實驗GPU為NVIDIA GTX 1080Ti,測試服務器系統為Ubuntu 16.04,配置了CUDA Toolkit 9.0和cuDNN 7.0。 為了回答問題1,首先通過配置GPU內存系數,來調整訓練深度學習模型的應用程序可用的GPU內存大小,接著以獨占GPU的模式訓練四個目標深度學習模型。對每個模型進行1 000次迭代的訓練,并記錄訓練進程執行的總時間作為訓練性能表現的指標。為了保證統計學上的意義,對每種配置分別進行3次訓練,計算時間的平均值作為結果。該實驗結果如表2所示。表2中的小數表示在該GPU內存系數配置下與使用全部內存(系數為1.0)的訓練時間的比值。 表2 不同GPU內存大小下的性能變化情況 從結果可以發現,當分配的GPU內存足夠使訓練進程正常運行后,訓練進程的運行時間變化與GPU內存系數增加沒有顯著關系。 結論1當深度學習模型獨占GPU訓練時,如果分配的GPU內存大小已經足夠訓練進程正常運行,那么額外分配的GPU內存對訓練時間沒有顯著影響。 將之前實驗的四種模型進行兩兩組合,對這些組合進行共享訓練,分別記錄總訓練時間。為了模擬實際應用中的情況,首先在系統后臺運行訓練模型A的進程,然后啟動訓練模型B的進程,來研究共享訓練模式對模型A的訓練進程的性能影響。給每個進程分配所需的最少GPU內存,在共享訓練的模式下進行1 000次迭代,并將得到的執行時間與相同配置在獨占GPU模式下訓練的進程執行時間相除,得到比值作為性能退化系數記錄下來。結果如表3所示。 表3 不同模型組合的共享訓練性能退化比率 可以看出,在共享訓練時每個模型相比于獨立訓練都會出現不同程度的性能退化。不同的模型組合的性能變化差別非常顯著。同時根據之前的討論,當rAB×rBA 結論2共享訓練會使單個模型的訓練進程運行時間延長。模型組合類型與訓練運行時間變化情況存在聯系,且一些模型組合的共享訓練效率比分別獨立訓練更高。 為了研究模型屬性與共享訓練的關系,需要分析不同的深度學習模型的底層運算屬性是否存在區別。我們利用TensorFlow框架內建的分析功能,收集訓練進程運行時所有涉及到的運算符種類和其執行時間百分比形成一個運行時運算符集合。 圖1以FCN模型為例,展示了運行時運算符集合的分布情況。該模型的運行時運算符集合內包含Mul運算符,并且其數值標記為38%。即表示在該模型中Mul運算符消耗38%的訓練時間。 圖1 FCN模型的運算符運行時間百分比 在收集到所有模型的運算符集合分布情況后,計算它們的標準化Jaccard相似度。度量結果見表4。可以看出,不同深度學習模型的訓練進程執行的底層操作差距確實非常顯著。 表4 不同模型運算符集合間的Jaccard相似度 結論3不同深度學習模型的底層運算屬性存在顯著差異。 在明確了不同模型的運算屬性存在差異后,我們進一步研究了不同情況下訓練時模型各運算符的CPU和GPU執行時間。表5展示了FCN模型的相關結果。可以看出,共享訓練與獨占訓練比較,模型各運算符GPU執行時間的分布情況幾乎相同,而CPU執行時間分布情況表現出顯著差異。 表5 不同FCN模型組合共享訓練與獨占訓練的總計、CPU和GPU執行時間的Jaccard相似性 以上的實驗結果,尤其是共享訓練與獨占訓練差異很大的CPU執行時間,表明應該深入研究深度學習模型訓練時的I/O操作和GPU運算操作情況。我們利用NVIDIA的nvprof工具記錄訓練進程的兩個度量指標,進程的資源加載和存儲事務共計為I/O事務,展示了系統I/O請求情況;GPU指令數表明GPU設備上的計算請求情況。結果如圖2所示。 圖2 模型每秒的操作情況(對數刻度) 可以看出,每個模型的操作量與表1中的模型參數規模呈正相關。同時聯系表3中的數據,訓練進程的操作量越大,使得共享訓練中其他模型性能退化得越多。所以可以得到如下結論。 結論4如果參與共享訓練的深度學習模型的參數規模有顯著差異,則較小模型的共享訓練性能退化比較大的更加嚴重。 最后,將探究共享訓練過程中是否存在資源競爭情況及其影響,在該實驗中關注GPU計算和I/O操作的指標。我們將一種模型獨占訓練和將該模型與其他模型組合共享訓練,收集GPU實際占用率作為訓練進程的GPU計算情況指標;收集系統內存到GPU內存的拷貝吞吐量作為訓練進程的I/O操作特性。應用KS檢驗和卡方假設檢驗,驗證獨占訓練和共享訓練下的兩種指標是否屬于同一分布。 圖3和圖4展示了獨占GPU訓練與共享訓練下的拷貝吞吐量直方圖。假設檢驗得到的p值接近于0,這說明吞吐量分布有顯著區別,表明共享訓練會影響系統I/O操作。人工比較了不同模式下的吞吐量,發現共享訓練時的吞吐量出現了顯著下降。 圖3 FCN模型獨占訓練時的系統內存吞吐率 圖4 FCN與FCN模型共享訓練時的系統內存吞吐率 圖5和圖6展示了獨占GPU訓練與共享訓練下的GPU占用率直方圖。假設檢驗的結果表明它們屬于同一分布。人工比較了不同模式下的GPU實際占用率,發現它們幾乎相同。這說明在共享訓練過程中,每個模型的GPU計算過程沒有受到其他模型的顯著影響。 圖5 FCN模型獨占訓練時的GPU實際占用率 圖6 FCN與FCN模型共享訓練時的GPU實際占用率 我們聯系GPU的執行運算的機制分析。由于GPU設備上的不同宿主進程會創建獨立的進程上下文,且不同上下文中的操作在執行時都會被底層驅動程序序列化而順序執行,導致無論模型是獨占GPU訓練還是共享訓練,都會得到幾乎相同的實際占有率。即使調度兩個訓練進程共享訓練,GPU在某一時刻也只能進行一個模型的底層運算。這使得共享訓練時不同的訓練進程輪流占用GPU,導致額外的系統I/O開銷,進而使得進程不能很好地利用內存的空間局部性。 結論5共享訓練時存在I/O操作競爭的情況,并導致了訓練進程性能下降。 為了驗證以上實驗中的共享訓練性能變化情況是否具有普遍性,在性能較弱的GPU設備GTX 1080上重復了所有前面的實驗。我們得到的絕大多數結果與之前在GTX 1080Ti上的結果相似。為了避免冗余,表6展示了最主要的共享訓練性能退化系數情況。可以看到,GTX 1080上的共享訓練性能變化情況與GTX 1080Ti幾乎相同。 表6 GTX 1080上模型組合的共享訓練性能退化比率 結論6共享訓練時的性能變化是普遍存在的,且在相同架構的GPU中性能下降的趨勢是相似的。 根據以上實驗結論,我們提出了優化GPU云平臺進程調度的若干參考原則。 在分配GPU資源時,開發者一般需要考慮GPU內存的分配。根據結論1,可以知道當分配給訓練進程的GPU內存足以完成訓練任務時,繼續分配額外的GPU內存對訓練效率幾乎沒有影響,這將會產生資源的浪費。由此可以得到: 原則1GPU資源調度程序只需確保每個深度學習模型訓練進程已經被分配正常運行所需的最小GPU內存。 當一個深度學習模型訓練進程所需的資源已經滿足時,就可以將剩余的GPU內存分配給其他進程。結論2表明,是否應該同時執行兩個或多個模型訓練進程,取決于具體情況。總結如下: 原則2當模型組合滿足rAB×rBA 結論4顯示在共享訓練時,較小模型的訓練進程性能更容易受到影響。根據結論5,I/O競爭使得每個訓練進程的性能都會不同程度的下降。而結論3表明不同模型的運算屬性差異明顯,這將增加系統的I/O操作量,使得I/O競爭更加嚴重。為了盡量避免這種影響,可以得到: 原則3雖然某些情況下共享訓練可以提高整體訓練效率,但其中某些模型的訓練進程效率可能會嚴重退化。在實踐中為了保證每個用戶的使用體驗,應該盡量讓參數規模和運算屬性相近的模型共享訓練。 根據結論6,我們所提出的以上參考原則適用于所有利用CUDA Toolkit執行通用計算任務的NVIDIA GPU。 為了滿足現代云計算系統中對通用計算,尤其是深度學習相關的應用程序的高性能需求,開發者引入了GPU虛擬化技術[12-13]。Giunta等[14]實現了提高云平臺GPU虛擬化性能的gVirtuS組件。Shi等[15]提供vCUDA以重定向虛擬機中的CUDA API從而啟用GPU加速。還有一系列的研究集中在GPU云平臺的資源管理上[16-17]。Phull等[18]提出了一個驅動的管理框架,以提高GPU集群的資源利用率。Qi等[19]提出了VGRIS框架,用來虛擬化和高效調度云游戲中的GPU資源。Li等[20]分析和評估GPU云計算中多媒體處理服務的定價策略。 深度學習模型的精度在不斷提升的同時,模型的結構和參數規模也變得越來越大,這使得訓練和部署變得困難。因此,一些工作的重點是在保持深度學習模型精度的同時減小模型的規模,使模型更適合在云平臺上訓練和部署[21]。Iandola等[22]提出了一個與AlexNet精度相同的較小的圖像分類模型。Luo等[23]通過從神經元中提取信息來壓縮人臉識別模型。一部分開發者利用分布式訓練的方法提升效率。Storm[24]通過擴展分布式隨機梯度下降來加速訓練神經網絡。Chen等[25]利用數據并行性,通過增量訓練加速深度學習機的訓練。Iandola等[26]設計了FireCaffe,它專注于跨集群擴展深度學習模型訓練,并減少集群間的通信開銷。 本文對深度學習模型在GPU設備上的共享訓練性能進行了研究。我們重點關注在共享GPU設備資源的情況下,深度學習訓練進程的性能表現將如何變化以及產生這種變化的原因。通過實驗研究,我們發現在共享訓練的情況下,每個深度學習模型的訓練進程的執行時間都會延長,部分模型組合的總訓練時間會縮短。造成訓練進程性能退化的主要原因是額外的系統I/O操作使得進程的等待時間變得更長。這也導致規模相差懸殊的模型共享訓練時,小模型的訓練進程性能退化的情況更加嚴重。最后我們證明了以上實驗結論具有普遍性,所總結的原則有助于提高GPU云平臺上的資源利用率。2.2 深度學習模型屬性對共享訓練性能的影響
2.3 其他GPU設備上的結果
3 研究結果
3.1 實驗設置說明

3.2 GPU內存大小對訓練性能的影響

3.3 共享訓練對整體性能的影響

3.4 模型底層運算屬性的情況


3.5 I/O操作和GPU計算特性與共享訓練性能的關系






3.6 其他GPU設備上共享訓練的性能表現

4 實踐建議
5 相關工作
5.1 GPU云平臺資源調度優化
5.2 深度學習模型訓練效率優化
6 結 語