百度PRNN:增強GPU伸縮性,RNN訓練最高提速30倍

轉自:https://blog.csdn.net/zdy0_2004/article/details/51778833

http://geek.csdn.net/news/detail/84745

儘管有各種深度學習加速器,神經網絡的大小依然受限於計算平臺的能力。百度硅谷人工智能實驗室高級研究員Greg Diamos在最近的ICML 2016上發表了一篇PRNN(Persistent RNNs)的論文相關英文訪談),介紹了他在深度學習平臺GPU可擴展性方面的最新工作。但在此之前,Greg Diamos已經在Github上發佈一篇博客文章簡要解釋了PRNN的工作和效果,本文爲這篇文章的譯文。PRNN已經在Github上開源,感興趣的讀者可以自行下載。

1. 簡介

在SVAIL(百度硅谷人工智能實驗室),我們的使命是創造能夠對數以億計的人們產生深遠影響的AI技術。我們相信,達到這個目標的一種良好方式是提高語音識別的準確性,這將通過在更大數據集上使用深度學習算法實現。這些算法需要大量的運算,所以系統的內存大小和計算吞吐量會限制數據量以及我們可以訓練的神經網絡大小。所以搞清楚如何更有效地運行深度學習是一大挑戰。這麼做可以讓我們在更大數據集上訓練更大的模型,目前已經提高了語音識別的準確性。在這裏,我們將要討論一項新技術,它能加快深度遞歸神經網絡(Recurrent Neural Networks)的訓練。

2. 將遞歸層映射到硬件上

圖片描述

我們兩個語音識別模型的密集計算集中於遞歸層(上圖中藍色部分),所以這種優化直接針對這部分網絡。

2.1 用矩陣乘法實現RNN

圖片描述

通常實現遞歸神經網絡的方式是進行一系列的矩陣乘法操作,參見前一篇博文以及上圖。這包括從片外存儲器中爲每一個時間步長加載遞歸權重矩陣U和活化向量H。

在高性能存儲器上,比如GPU,片外存儲器要比片上存儲器(如寄存器文件和高速緩存)慢的多,效率更低。所以當小批量數據相對較大(每GPU大約64或更高)時,矩陣乘法最高效,因爲遞歸權重可以從片外存儲器上一次性加載,並在小批量的每個樣例上重複使用。

然而,使用較大的小批量有幾個缺點:

  • 在訓練網絡的時候會增加內存佔用量。
  • 在單GPU中會並行地耗盡可用的數據。
  • 它會使模型部署複雜化。

應該清楚,在每塊GPU上使用較大的小批量會佔用更多的內存。在許多時間步長上訓練RNN時,存儲活化向量需要的內存要比網絡權重多許多。

例如,存儲一個有1200個單元,每個單元是32位浮點數的簡單RNN的權重,大約需要5.7MB的內存,但是存儲一個小批量大小爲64和700個時間步長的活化向量,則需要215MB的內存。所以,增加小批量的大小會直接導致訓練模型所需內存的增加。

還需要明確的是,每個GPU上使用較大的小批量會並行地耗盡可用的數據,這些數據可能已經用於多GPU上傳播計算。使用512小批量大小的算法,每GPU小批量大小爲4,可以使用128塊GPU,但是每GPU小批量大小爲64的話,只能使用16塊GPU。使用128塊GPU以最高效率來訓練單個模型對許多讀者來說似乎有些苛刻,但這對我們很重要,因爲這可以讓我們測試語音識別精度是否會隨着網絡大小和數據容量的增長而持續提高。

最後,在每塊GPU上使用大批量,會複雜化模型部署,因爲在同一GPU上,多用戶流需要被同時調度處理。這在嵌入式應用(比如運行在手機上的語音識別)中非常困難,因爲通常只有單個用戶。在雲服務上部署也同樣困難,因爲多用戶流必須在單個服務器上同時調度以達到良好的能源效率,但是不能有太多的流,因爲會增加時延。

2.2 使用持久內核

所以,我們想找到一種方法來一次性加載遞歸權重並且多次使用它們,而不增加小批量大小。

這將允許我們:

  • 使用同樣的硬件訓練更大或更深的網絡。
  • 在更多的GPU上大規模進行網絡訓練。
  • 使少併發用戶的模型部署更有效。

對於GPU,片上存儲器上最大的資源分佈於數千個線程的各個寄存器文件中。例如,英偉達TitanX GPU的寄存器文件內存有6.3MB,足夠存儲約有1200個活化向量的遞歸層。持久內核利用這個寄存器文件內存來緩存遞歸權重並且在多個時間步長上重複使用它們。

然而,如果單個線程在網絡權重的各個子集上工作,那麼它們必須進行通信,對於當前的時間步長,需要將每個部分的計算結果結合在一起,同時還要爲其他線程創建的下一個時間步長讀取更新的活化向量。這意味着,數千個GPU線程需要在每個時間步長內保持通信並且相互同步。這種類型的同步不受CUDA或OpenCL的支持,因爲相比單線程塊而言,GPU不能保證更多的線程會同時運行。然而,它們通常是許多線程同時運行,特別是在像TitanX這樣的更大GPU上。我們可以通過在GPU上實現一種形式的搶先多任務處理來解決這個限制,各個線程使用全局障礙直接進行同步,但最終會超時並退出。CPU上的一個運行時系統監控着過早退出的線程,然後重啓內核(重新從內存中加載權重)直到所有任務都成功。在實踐過程中,如果只有這個程序使用GPU,並且我們不啓動太多的線程,那麼全局障礙幾乎不會超時。

圖片描述
比起基於矩陣乘法的實現,這種方法在小批量上顯著提高了性能。批量大小爲4的情況下,性能從90GFLOPs變成了2.8TFLOPs,大約提升了30倍。

2.3 可能的替代方法

爲解決性能問題,通常會有多種可能的解決方案。本節會介紹除了持久RNN以外的技術來減少訓練RNN的內存使用量以及每塊GPU小批量的大小。我們已經發現,對於我們的語音識別模型,它們沒有持久RNN有效。然而這種技術可能在其他情況下效果不錯。

  • 隨時間截短反向傳播
  • 使用CPU內存緩存活化向量
  • 並行化RNN模型

2.3.1 隨時間截短反向傳播

隨時間截短反向傳播能夠減少反向傳播過程中存儲活化向量所需的內存,在處理語義剩餘部分之前,它會以固定數量的時間步長進行前向和反向傳播。這種方法會顯著減少訓練網絡所需的內存,因爲只有固定數量的時間步長的活化向量需要被存儲,但這樣做會在長時間依賴上丟失梯度信息。在我們的系統中,我們發現,相比於在整個語義上使用反向傳播,使用隨時間截短反向傳播會丟失大約20%的語音識別精度。所以對於我們的語音識別模型,我們不採用隨時間截短反向傳播這種方式。

2.3.2 使用CPU內存緩存活化向量

另外一種規避GPU內存限制的方式是在CPU的片外存儲器上緩存用於反向傳播的活化數據,CPU片外存儲器通常比GPU片外存儲器大很多。這是以系統分級存儲體系(例如CPU DRAM,SSD緩存,磁盤等)的更高級別,存儲用於反向傳播的活化向量一般策略的一種特殊情況。如果從CPU中向後、向前拷貝數據所需的時間比網絡中前向傳播和反向傳播中算術運算所需的時間少,那麼這種方法有效。然而,對於我們的情況,單個節點上,網絡在8塊GPU的速度已經夠快了,從CPU DRAM中向後、向前傳播數據會導致整個系統2-4倍的性能下降。此外,它還會佔用我們用來實現節點之間並行化數據規約操作的處理器內連接帶寬。所以對我們的系統來說這麼做沒有意義。一般而言,這種方法更適合於每塊CPU上有更少GPU的系統,或者更慢的RNN實現的系統。

2.3.3 並行化RNN模型

最後一種減少每塊GPU所需內存的方式是使用並行化模型對多GPU上的各個遞歸層進行分區。這種方式仍然使用矩陣乘法來進行RNN的前向和反向傳播操作,但在多GPU上對各個矩陣乘法進行分佈式計算。仍然需要使用較大的小批量來使矩陣乘法更高效,但它分配於多個GPU上,所以每塊GPU上小批量的效率會降低。這種方法在每個時間步長內進行高昂的GPU之間的同步操作,用來結合分佈式乘法的結果,所以當遞歸層非常大時,這麼做纔有意義,比如在4塊TitanX GPU上每個遞歸層有5000個活化向量。這種方法可以結合使用持久RNN,持久RNN在中等大小的遞歸層上效率更佳,模型並行RNN在超大遞歸層上效果更好。

3. 結論

這項工作表明,RNN權重可以高效地存儲在GPU寄存器中,並可以通過這種方法來進行高吞吐量計算。這大大提高了在低小批量大小上的性能,從而能夠在同樣硬件上訓練更深的模型,並在更多的GPU上大規模訓練模型。

3.1 訓練更深的模型

將小批量大小從64降低到4,活化內存的佔用節省了16倍。訓練語音識別所需的大部分內存是用來爲反向傳播存儲活化向量的,而不是用來存儲網絡權重,所以這種節省直接增加了我們可以訓練的模型大小。我們現在可以在GPU內存中使用110層的深度遞歸網絡,這比我們之前的7層模型深了一個數量級。

3.2 並行化擴展數據到多個GPU

減少每塊GPU的小批量大小同樣可以將數據並行化擴展到多個GPU上,而不需要改變算法批量大小。我們通常使用512或1024的算法小批量大小來訓練網絡,因爲更大的值會減慢模型訓練速度。在每塊GPU上使用小批量大小爲64可以在8到16塊GPU上訓練一個模型,而使用大小爲4的小批量可以在128到256塊GPU上訓練同樣的模型。

3.3 展望未來

隨着未來GPU有更多的硬件線程,更大的片上存儲容量,以及更低精度的浮點運算操作,使用這種方式訓練出模型的層的大小會隨之增加。這項工作重點在於深度語音網絡中的RNN,但這種方法同樣可以應用於GRU和LSTM,這將通過分佈式GPU線程中權重矩陣實現。

原則上,這種方法也可以應用於其他類型的處理器上,例如AMD或Intel的大型GPU可以在線程寄存器文件中緩存遞歸權重。多核處理器,比如Intel Xeon和Xeon PHI可以將遞歸權重緩存在L1和L2緩存中。FPGA可以將權重分佈在芯片RAM塊上。

我們希望社區中的其他人可以將持久RNN運用於在更大數據集上訓練更大、更深的遞歸神經網絡。

原文:Persistent RNNs - 30 times faster RNN layers at small mini-batch sizes 



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