本文是騰訊深度學習系列文章的第三篇,聚焦於騰訊深度學習平臺Mariana中深度卷積神經網絡Deep CNNs的多GPU模型並行和數據並行框架。算法
將深度卷積神經網絡(Convolutional Neural Networks, 簡稱CNNs)用於圖像識別在研究領域吸引着愈來愈多目光。因爲卷積神經網絡結構很是適合模型並行的訓練,所以以模型並行+數據並行的方式來加速Deep CNNs訓練,可預期取得較大收穫。Deep CNNs的單機多GPU模型並行和數據並行框架是Mariana的一部分,Mariana技術團隊實現了模型並行和數據並行技術加速Deep CNNs訓練,證明模型拆分對減小單GPU上顯存佔用有效,而且在加速比指標上獲得顯著收益,同時能夠以較快速度訓練更大的深度卷積神經網絡,提高模型準確率。性能優化
圖像識別是深度卷積神經網絡得到成功的一個典型應用範例。服務器
圖1揭示了一個具備5個卷積層和3個全鏈接層的深度卷積神經網絡,該模型可應用於圖像分類。網絡
圖1 ImageNet深度卷積神經網絡模型框架
使用GPU訓練深度卷積神經網絡可取得良好的效果[1][2],自2012年使用Deep CNNs模型在ImageNet圖像分類挑戰中取得突破性成績,2013年的最佳分類結果也是由Deep CNNs模型取得。基於此,Mariana技術團隊指望引入Deep CNNs來解決或優化圖像分類問題和圖像特徵提取問題,以提高在相應用例場景中的效果。性能
在將CNN應用於圖像相關領域的算法研究以及CNN訓練平臺搭建的實踐過程當中,受限於單個GPU上的顯存大小(例如:服務器採購的顯卡Tesla K20c可用顯存爲4.8GB,ImageNet 2012論文[1]中用到的網絡佔用顯存大約3.9GB),在嘗試調整參數和網絡規模的實驗中,每每難以存儲下更大規模的深度卷積神經網絡模型,使得包含較多參數的網絡不能在單GPU上訓練,須要經過多GPU模型並行技術,拆分模型到多個GPU上存儲和訓練來解決。學習
隨着訓練數據集擴充、模型複雜度增長,即便採用GPU加速,在實驗過程當中也存在着嚴重的性能不足,每每須要十餘天時間才能達到模型的收斂,不能知足對於訓練大規模網絡、開展更多試驗的需求。測試
考慮到上述問題,在Mariana的Deep CNNs多GPU並行訓練框架中,經過設計模型拆分方法、模型並行執行引擎和優化訪存性能的Transfer Layer,並吸取在數據並行方面設計經驗,實現了多GPU加速的模型並行和數據並行版本。優化
本文描述多GPU加速深度卷積神經網絡訓練系統的模型並行和數據並行實現方法及其性能優化,依託多GPU的強大協同並行計算能力,結合目標Deep CNNs模型在訓練中的並行特色,實現快速高效的深度卷積神經網絡訓練。ui
多GPU模型並行+數據並行指望達到下述目標:充分利用Deep CNNs模型的可並行特色,結合SGD(Stochastic Gradient Descent,隨機梯度降低)訓練的數據並行特性,加速模型訓練過程;突破顯存大小限制,使得訓練超過單GPU顯存的模型成爲可能,並預期經過訓練更復雜的網絡來得到更好的模型效果。
上述目標完成後,系統能夠更快地訓練圖1中目標Deep CNNs模型。模型拆分到不一樣GPU上可減小對單GPU顯存佔用,適用於訓練更深層次、更多參數的卷積神經網絡。
在圖像識別應用中,深度卷積神經網絡模型的卷積層計算量大,全鏈接層參數多。所以,如何劃分計算資源,經過模型並行和數據並行兩個數據/計算組織層次上來加速訓練是框架設計首要解決的問題。
圖像做爲輸入數據,其數據量龐大,且須要預處理過程,所以在Batch訓練時磁盤I/O、數據預處理工做也要消耗必定時間。經典的用計算時間掩蓋I/O時間的方法是引入流水線,所以如何設計一套有效的流水線方法來掩蓋I/O時間和CPU處理時間,以使得總體耗時只取決於實際GPU訓練時間,是一個重要問題。
模型並行是將一個完整Deep CNNs網絡的計算拆分到多個GPU上來執行而採起的並行手段,結合並行資源對模型各並行部分進行合理調度以達到模型並行加速效果是實現模型並行的關鍵步驟。
多GPU系統經過UVA(Unified Virtual Address,統一虛擬地址)技術,容許一顆GPU在kernel計算時訪問其餘GPU的設備內存(即顯存),但因爲遠程設備存儲訪問速度遠遠低於本地存儲訪問速度,實際性能不佳。所以在跨GPU的鄰接層數據訪問時,須要關注如何高效利用設備間數據拷貝,使全部計算數據本地化。
模型並行是:適當拆分模型到不一樣的計算單元上利用任務可並行性達到整個模型在計算過程當中並行化效果。
如圖2所示,揭示了從單GPU訓練到多GPU模型並行訓練的相異之處,主要在於:在使用單GPU訓練的場景下,模型不進行拆分,GPU顯存上存儲整個模型;模型並行的場景下,將模型拆分到多個GPU上存儲,所以在訓練過程當中每一個GPU上實際只負責訓練模型的一部分,經過執行引擎的調度在一個WorkerGroup內完成對整個模型的訓練。
圖2從單GPU訓練到多GPU模型並行訓練的概要視圖
多GPU並行系統從功能上劃分爲用於讀取和分發數據的Training Data Dispatcher和用於作模型並行訓練的GPU Worker,如圖3所示。訓練數據從磁盤文件讀取到CPU主存再拷貝到GPU顯存,故此設計在各Worker計算每batch數據時,由Training Data Dispatcher從文件中讀取並分發下一batch數據,以達到用計算時間掩蓋I/O時間的設計目標。
圖3 2 GPU模型並行系統框架示意
基於mini-batch的訓練,現有技術方案在訓練深度卷積神經網絡時,每次從數據文件中讀入和處理1個batch數據,在GPU計算某一batch時由CPU預讀取和預處理下一batch。
可是隨着訓練集圖片像素數增大,讀取和處理時間隨之增長,因爲採用多GPU技術加速了單個batch計算時間,數據處理的性能問題隨之而來,須要減小數據處理的用時,以使最終加速效果取決於計算用時。
如圖4所示,整體看來,在深度卷積神經網絡訓練過程當中始終是在執行一條三階段並行的流水線:計算本次batch數據——處理下次batch數據——讀入再下次batch數據。
圖4數據處理和計算流水線
數據並行以劃分Worker Group爲基本組織形式,模型並行以在Worker Group內劃分Worker爲基本組織形式,並行訓練的調度資源來源於CPU線程,計算資源來源於GPU卡。因爲GPU卡一般意義上被當作是一種加速卡或協處理器卡,必須在基於CPU的主機上下文中被調用來作計算,所以遵循1個CPU線程綁定1張GPU卡可以發揮多GPU共同參與計算時的並行性效能。
表1 4 GPU模型並行+數據並行CPU線程、GPU與Worker Group、Worker綁定關係
在實際生產環境中,安裝多GPU服務器的硬件體系結構如圖5所示,示例中揭示了一個8 GPU節點服務器的硬件配置,每兩個GPU Slot鏈接在一個GPU專用PCI槽位上再經過PCIe Switch將GPU Slot 0,1,2,3鏈接在一顆CPU上,GPU Slot 4,5,6,7鏈接在另外一顆CPU上,兩顆CPU經過IOH(Input Output Hub)鏈接。
圖5硬件體系結構
模型並行的來源是Deep CNNs網絡只在特定層(如輸入層、全鏈接層)與其餘層有全面的鏈接,而其餘較爲獨立的直線鏈接關係便可做爲模型的可並行部分。將模型的可並行部分拆分到多個GPU上,同時利用多個GPU的計算能力各執行子模型的計算,能夠大大加快模型的單次前向-後向訓練時間。
圖6模型並行中的模型劃分方案示意
Deep CNNs網絡的層次模型其實是一張有向無環圖(DAG圖),分配到每一個模型並行Worker上的層集合,是有向無環圖的拓撲排序子集,全部子集組成整個網絡的1組模型。
考慮極端情景:須要訓練超大規模Deep CNNs模型,或者使用計算能力相對較強、顯存較小(通常在1GB~3GB)的桌面級GeForce系列GPU,則利用模型自己的並行性這種基本的模型劃分方法將再也不適用。須要將模型再作拆分以保證單個GPU都能存儲下對應的子模型。
如圖7所示,描述了將模型按「十字形」劃分到4 Worker上訓練的情景,不只拆分了模型的可並行部分,也雖然這樣的劃分在Worker 0和Worker2之間,Worker 1和Worker 3之間達到並行加速效果,卻能使得整個模型得以存儲在4 GPU上。這種模型劃分方法可以適用於訓練超大規模網絡等特殊模型的需求。
圖7 「十字形」模型劃分方案示意
每一個模型並行Worker上以一個模型並行執行引擎負責調度本Worker上子模型的執行過程。執行引擎控制全部Worker上的子模型完成前向和後向計算,各自對子模型完成參數更新後,到達主線程同步點,開始下一mini-batch訓練。
多GPU模型並行和數據並行的Deep CNNs模型replicas及劃分結構如圖8所示,在使用4 GPU的場景下,劃分了2組Worker Group用於數據並行;每一個Worker Group內劃分2個Worker用於模型並行。
圖8對ImageNet網絡的模型並行和數據並行劃分
實驗環境爲一臺搭載8核心Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz的服務器,內存爲48GB,服務器安裝了4塊NVIDIA Tesla K20c GPU,單GPU顯存大小爲4.8GB。
訓練一樣的Deep CNNs模型,相比於單GPU,使用多GPU結合不一樣並行模式的加速效果以下表所示:
表2不一樣並行配置的加速比
對於目標Deep CNNs模型,在單GPU訓練時(對照實驗)顯存佔用量爲3.99GB;使用2 GPU模型並行訓練時單個GPU上顯存佔用量爲2.15GB,而且在訓練相同迭代時訓練集、測試集錯誤率效果都與對照實驗徹底相同;抽樣比照參數一致性,被抽樣的參數(同對照實驗相比)也都是同樣。
嘗試更改Deep CNNs模型,訓練一個更大的網絡,增長濾波器數目,減少步長,增長中間卷積層feature map數目,訓練時所需顯存將達到9GB以上,使用單個Tesla K20c GPU(4.8GB顯存)沒法開展訓練實驗;而多GPU模型並行訓練實驗中該模型的錯誤率對比圖1模型下降2%。
圖9爲圖像標籤識別的示例,經過對兩千多類物體的圖像進行訓練,可實現對常見物體的自動識別。
圖9應用效果展現
本文描述了騰訊深度學習平臺Mariana中深度卷積神經網絡Deep CNNs的多GPU模型並行和數據並行框架,經過多個Worker Group實現了數據並行,同一Worker Group內多個Worker實現模型並行。框架中實現了三階段並行流水線掩蓋I/O、CPU處理時間;設計並實現了模型並行引擎,提高了模型並行計算執行效率;經過Transfer Layer解決了數據存儲訪問效率問題。此框架顯著提高了深度卷積神經網絡訓練速度,解決了當前硬件條件下訓練大模型的難題。
深度卷積神經網絡有着普遍的應用場景:在圖像應用方面,Deep CNNs可應用於類似圖片檢索、圖片的自動標註和人臉識別等。在廣告圖片特徵提取方面,考慮Deep CNNs可以很好地學習到圖像特徵,咱們嘗試將其用於廣告點擊率預估(Click-Through Rate Prediction,pCTR)模型中。
[1] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E. Hinton. (2012) ImageNet Classification with Deep Convolutional Neural Networks. In Advances in Neural Information Processing 25 (NIPS 2012), MIT Press, Cambridge, MA.
[2] Ossama Abdel-Hamid, Abdel-rahman Mohamed, Hui Jiang, Gerald Penn. (2012) Applying Convolutional Neural Networks Concepts to Hybrid NN-HMM Model for Speech Recognition. ICASSP’12, 2012.
[3] Jeffrey Dean, Greg S. Corrado, Rajat Monga, et al, and Andrew Y. Ng. (2012) Large Scale Distributed Deep Networks. In Advances in Neural Information Processing 25 (NIPS 2012), MIT Press, Cambridge, MA.
[4] Omry Yadan, Keith Adams, Yaniv Taigman, Marc’Aurelio Ranzato. (2014) Multi-GPU Training of ConvNets. arXiv: 1312.5853v4 [cs.LG], Feb. 18th, 2014.