騰訊深度學習平臺(譯)

1 介紹

1.1     背景

騰訊提供了一些列Internet服務,比如擁有3.9億左右月激活用戶的微信(WeChat)、以及8.4億左右QQ用戶和6.4億左右的QZone用戶。這些數據是來自於2014年第一季度。騰訊擁有超過100PB數據,這些數據由不同的應用以及不同的用戶產生的,用戶生成的數據比如有照片、語音和視頻。

近些年深度學習在大數據挖掘已經成爲一個熱點,也在不同領域取得了突破性的進展,比如語音識別(automatic speech recognition)和圖像識別。深度學習能給騰訊的很多應用帶來實質性改變,比如微信中的語音和圖像識別、QQ和QZone的廣告投放。

當然如果想要深度學習在騰訊真正發揮作用,必須考慮三方面的因素。

l  需要具備大量的計算能力和有效的並行框架去訓練模型。比如:在微信中用於識別中文和英文的ASR(Automatic Speech Recognition)語音識別模型採用的是一個深層的神經網絡(DNN)去訓練,該模型大約有超過5000萬參數,然後用100億訓練實例,如果只使用單個CPU去訓練可能需要花上好幾年時間,或者採用單個GPU去訓練可能花上幾個月時間

l  對於訓練大型模型,必要的支持能提高模型質量。在CNNs中,通過增加更多Map

Filter(小塊區域映射) 和更多的層可以提高分類的準確率。

l  靈活的框架對於做不同模型選擇實驗是相當有幫助的,模型選擇包括:選擇模型架構、尋找優化方法、以及微調一個高性能模型的超參數

爲了解決上面的三方面因素,並行框架必須在模型訓練更快、更大、更易用。

 

一般並行框架分爲兩種:數據並行(Data parallelism)和模型並行(model

parallelism),這兩種框架是由Google DistBelief引進的,採用的是CPU組成的集羣。

由Google COTS系統以及Facebook的Multi-GPU也才採用這種並行方案,這些系統是

由GPU服務組成的。下面我們簡單區分一下數據並行和模型並行,簡單來講數據並行就

是把數據分成多份(每份稱爲mini-batch),每份數據跑一個模型副本,然後用每個模

型計算出來的梯度(gradients)去更新參數;模型並行就是把模型切分開來,讓每個計

算節點計算模型一部分,然後在計算過程中做內部交互。模型並行除了提高性能外,也

減少每個節點內存消耗,由此它有可能處理更大的模型。

      除了一些公司內部特有的框架,在一些開源社區裏面也有一些使用CPUs和GPUs的深

    度學習框架。然而這些開源社區的框架不適合騰訊內部的需求。因爲這些開源社區使用

    的是單核多線程或者單GPU作爲訓練框架,缺乏有效的並行方案。

1.2 平臺介紹

爲了支持深度學習,我們構建了Mariana深度學習平臺,這個平臺可以讓模型訓練更快,

讓超大模型訓練成爲可能以及更方便的做實驗。

         經驗表明,構建一個通用的平臺去解決一些列業務(微信中語音和圖像識別、QQ和Qzone中的CTR預估)相當困難。因爲不同的應用更強調是的特殊業務場景。

由此Mariana構建了三個並行架構1.) 多GPUs的數據並行框架,應用於DNNs

2.) 多GPUs的模型並行和數據並行框架,應用於CNNs  3.) CPU集羣模型並行和數據並行框架,應用於大規模的DNNs。

    Mariana在簡化深度學習實驗和減輕算法工程師負擔做出了很大的努力。Mariana提供一些列服務,這些服務主要包括:內建的算法、靈活的調整超參數、檢查點(checkpoint)和週期重啓、生成自動測試報告以及訓練任務的監控。

    Mariana已經被應用到騰訊的很多業務之中,比如在微信中的語音識別和圖像識別、在QQ和Qzone中廣告點擊率預測,在這些業務中,深度學習已經在過去一年中真正發揮出了它的優勢。

    Mariana主要架構是採樣GPU服務器,每臺服務器裝配4或者6塊GPU卡,當然Mariana也採樣CPU服務器。

    多GPU的數據並行框架(建立DNN模型)服務於微信中的語音識別功能,根據實驗數據表明一臺6GPUs計算能力大約是單GPU計算能力的4.6倍。多GPU的模型並行和數據並行框架(建立CNN模型)服務於微信中的圖像識別以及QQ的CTR預估上,根據實驗數據表明4GPUs的計算能力大約是單GPU計算能力2.52倍。他們的CPU集羣也是被用於建立語音設別模型上。

2            Multi-GPU數據並行DNN

2.1     業務場景

Mariana內部包括Multi-GPU的深度網絡(DNN),該深度網絡首要的應用範圍是語音識別(ASR)。語音識別是把輸入音頻信號分類成不同的三音素(triphones),在這裏我們把。在我們的語音識別模型中,採用了4-6隱層的全連接深度網絡去訓練音頻數據,該模型大約有5000萬個參數。

         ASR屬於計算密集型的,它需要大量計算資源,而僅僅需要1G內存,所以GPU是一個很好的備選方案,因爲GPU相對於CPU而言有高性能計算,但是就內存相比而言顯得很有限。爲了更好的利用單個服務器上的多GPUs,我們首先爲ASR選擇一種有效並行方案,該方案採用的是能提高1.5倍2GPUs(一個服務器)。然而模型並行對於ASR來說在擴展性有一定限制,當超過2GPUs也不能達到很好的性能。因爲我們才數據並行的multi-GPU 框架。

2.2     架構

在執行數據並行訓練時,每個工作組(workergroup)去承擔一個模型副本訓練。因爲深

度網絡沒有模型並行,所以每個工作組只包括一個GPU。

         multi-GPU的數據並行深度網絡架構使用一個運行在CPU上的driver程序去控制訓練過程(同步SGD)。Driver程序每次從文件系統上讀取一批數據塊(mini-batch)到內存,接着從內存拷貝到GPU內存。然後driver程序等待所有的GPUs,當所有的GPUs訓練本次的mini-batch結束後,driver程序協調在所有的GPUs之間的參數交互。

2.3     參數交換

參數交換過程可以參照圖1,交換過程從邏輯上看有個三個階段。首先,梯度收集階段,

在該階段從所有GPUs 收集計算出來的梯度;其次,參數更新階段,在該階段用收集的梯度更行模型;最後,參數分發階段,在該階段把更行過的模型同步所有的GPUs上。從物理上看,參數交換是通過PCIe或者輸入輸出hub(IOH)去連接GPUs。對於一臺多GPUs的服務器,GPUs是通過PCIe以一顆樹狀結構相連。對於超過4GPUs的單臺服務器,這些GPUs先分成兩組,然後通過IOH相連。參數交換的性能被PCIe和IOH的帶寬限制,對於PCIe2.0 速度大約是4-6GB/s,這對於NVIDIA Tesla K20系列GPUs來說是相當慢,該系列GPUs帶寬大約在200+GB/s。由此用更多的GPUs做數據並行,參數交換成爲一個瓶頸。


圖1

2.4     線性劃分拓撲

爲了提高參數交換性能,我們採用了一種創新的拓撲結構,該結構的主要目的是減少總

的數據拷貝和最大化利用GPUs之間的帶寬。一種直接的方法是採用星狀拓撲結構,在這種結構中每個GPUs複製它自己的梯度到其他所有的GPUs上。對於N個GPUs,將有N2/ 2梯度被複制,複製數據很明顯不是最少的。另一種通用的拓撲結構是樹狀結構,在該拓撲中從樹的葉子節點開始收集梯度一直到根節點,但是不是所有的GPUs帶寬被利用。

         在這篇論文中,我們提出了一種線性劃分拓撲,在圖2我們演示N(e.g. N=6)個GPUs如何去收集梯度。


圖2(從上到下,是數據流沒移動一次後,數據分佈情況)

         在線性劃分拓撲中,我們把模型和模型的梯度劃分N/2 partitions,然後給每個partition分配一個GPU。在每個週期,每個partition被傳到鄰近的GPU上並與之合併,同時保證N/2個數據流不相交。在N-1個週期結束後,每個partition收集了該partion在所有GPU上的梯度,然後更新梯度到模型partion。分發階段分發最新模型到所有GPUs。

         線性劃分拓撲性能可以按照下面方法估計。假定T0是在2GPUs之間拷貝整個模型的時間,然後在N個GPUs之間交換一個mini-batch的參數所需要的時間如等式1。所以參數交換時間有個上界4 T0 ,因此線性劃分是比較容易的擴展到8或者更多GPU

                  

3    CPU集羣架構

3.1 應用需求

    Mariana還包含一個基於CPU集羣的分佈式DNN架構。DNNCPU集羣的目標是支持兩類應用:1. 擁有佔用大量內存的大模型,適合進行mini-batch計算,還擁有大量的訓練數據,對於這類應用,要同時做到模型並行和數據並行,CPU集羣適用於這種場景。2.已有的基於CPU訓練的應用。通過分發數據,只需要很小的改動,就可以變成分佈式的版本。

3.2 APIs和架構

DNN CPU集羣架構引入了節點與消息的抽象,採用BSP(Bulk Synchronous Parallel)編程範式。一個節點可以是一個神經單元、或者一組連續的神經單元、甚至是整個DNN模型。節點的API包括一些方法,用來支持在參數交換中,梯度的序列化和參數的反序列化。CPU集羣中的DNN作業,是通過多輪異步SGD來訓練的。

客戶端命令行工具用來提交DNN作業,資源管理系統調度master、workers和參數服務。其中,master負責把訓練數據拆分成多個任務,在workers間調度任務,做容錯。還要通過心跳管理作業、任務、workers的狀態,並把狀態記錄到數據庫中。master會收集worker和參數服務器的counter。WebUI與master連接,展示DNN作業的狀態和counter。在一組worker中要選出一個coordinator,通過BSP範式,在worker間的每一個mini-batch中,協調模型參數的傳遞。worker負責真正的計算工作,並在一組worker間傳遞消息,以支持模型並行。每一個參數服務器保存一部分模型,然後通過與相關的worker交互,收集梯度,並更新最新的模型。參數服務器定期會把模型寫入分佈式文件系統來做持久化

 

4            應用和評估

Mariana當前被應用到語音識別、圖像識別和廣告CTR預估上。GPU服務器配置如下:

4-6NVIDIATesla K20c GPUs(4.8GB 內存) 、2個8-core Intel(R)Xeon(R) CPU E5-2640 v2 @2.00GHz、48GB內存、4Seagate 2 TB SATA 硬盤(使用RAID5陣列)。在語音識別中一臺服務器中使用6GPUs,而在圖像識別中使用4GPUs

4.1  語音識別

語音識別當前被用在騰訊的微信,比如:微信中的語音輸入、語音開放平臺、翻譯語音

到文本。對於語音輸入,用戶對微信講話,然後獲取相應的文本信息併發送給朋友。對於開放語音平臺,第三方公司可以集成語音識別功能到他們自己的產品中。對於翻譯語音到文本,用戶按住接收到的語音,然後它自動轉化成文本。

    當前Mariana已經成爲微信中使用各種語音識別功能的基石, multi-GPU數據並行爲主,CPU集羣爲輔。ASR主要包括聲音模型、語言模型、解碼器。聲音模型是通過深度網絡能更有效的撲捉聲音信號分佈。在訓練聲音模型時候,我們使用了一個包括616輸入節點、4個隱藏層、一個softmax輸出層(包括16000節點)深度網絡,該網絡包括5000萬個參數。爲了使深度網絡訓練穩定,需要億級別的樣本。

 

4.2 圖像識別

圖像識別在騰訊裏面主要是應用在微信中,然後我們是以ImageNet作爲一個基準。在

Mariana中,我們主要使用multi-GPU 的模型並行和數據並行框架去訓練深度CNNs。我們通過Mariana在ImageNet 2012訓練集上(120w圖片,大於1000個不同類別)去訓練模型。通過使用模型並行和數據並行,我們考慮了4中不同的配置情況去觀察影響並行的因素。

         用我們的深度CNN架構,2GPUs(模型並行)的速度是單GPU的1.71倍。4GPUs(使用模型並行和數據並行)加速了2.52倍。對於4GPUs(數據並行),加速是2.67。

 

5            相關工作

一些其他的框架也被使用加速深度學習。比如:

Google DistBelief是一個CPU集羣,採用的是數據並行和模型並行去訓練深度網絡,該框架大約包括10億參數,1萬個CPU。DistBelief提供了DownpourSGD和Sandblaster L-BFGS ,被使用去訓練語音識別和2.1w個ImageNet分類。

    Krizhevsky設計的深度卷積神經網絡能夠獲得Top5的錯誤率在LSVRC-2012 1000-category,該框架使用的2GPUs模型並行,並使用了Cuda-Convnet,Cuda-Convnet是一個開源工具包,支持單GPU。Cuda-Convnet2對於多GPUs提升了性能,但是目前沒有開源。

    Google COTS HPC系統使用的數據並行和模型並行GPU服務器,這些服務器是使用Infiniband和MPI互聯。COTS用3臺GPU服務器在幾天時間內處理10億個參數網絡。

    Facebook multi-GPU深度卷積網絡(CNN)使用的數據並行和模型並行去訓練CNN模型

    一些開源的工具包如下:

    Caffe提供了快速的CNN訓練,以及深度網絡學習算法。每天能夠處理超過4000萬張圖片,用的GPU型號是NVIDIA K40 或者TitanGPU

    Kaldi是一個語音識別工具包,採用的c++和CUDA代碼,運行在CPU或者GPU

    Theano是一個python庫,能改運行在CPU或者GPU上

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