單機訓練速度提升 640 倍!獨家解讀快手商業廣告模型 GPU 訓練平臺...

2020-12-13 IT之家

近期,快手宣布將在2020年春節前實現3億DAU,快手商業化營收步伐也隨之加速。快手從2018年「商業化元年」開始推行個性化的廣告推薦。截止5月底,快手DAU已經突破2億。隨著用戶和使用時長的迅速增長,為了更好地挖掘海量用戶和實時數據的核心價值,推薦模型需要快速迭代,從而對用戶興趣遷移的做出迅捷的反應。因此,模型訓練效率成為連接商業效率和用戶興趣的關鍵一環。

基於歷史原因,行業內推薦模型的訓練大都通過CPU來實現。然而隨著模型從Logistic Regression到深度神經網絡的演化以及硬體的發展,基於CPU的訓練系統或許已經不再是最合適的解決方案了。本著不盲從、不抄襲、堅持原創技術路線的原則,快手西雅圖FeDA智能決策實驗室推出了名為"Persia"的基於GPU的廣告推薦訓練系統。以往需要50臺CPU機器訓練20小時的系統,如今只需要一臺普通的GPU機器在一到兩小時完成,單機效率提升高達640倍。這意味著:

·以往使用五十臺計算機,一天只能嘗試一個新想法,新系統只需一臺計算機,一兩個小時就能嘗試一個新想法。

·以往同時只能有一兩個同學嘗試新模型,新系統可以讓很多同學同時嘗試各自的新想法。

這套系統已經在快手商業化內部迅速推廣使用,讓大家可以快速試錯和測試新模型以及特徵。項目發起者是一位來自羅切斯特大學的實習生。他提出的GPU解決方案得到他在羅切斯特大學的導師、FeDA智能決策實驗室負責人劉霽和公司內很多算法策略專家的肯定。

FeDA實驗室隨即成立了項目組,並決定以項目發起人最喜愛的漫畫角色Persia(「佩爾西亞」)命名,展開了緊鑼密鼓的開發。團隊首先以PyTorch為基礎平臺著手解決各種技術難題,然後實現並優化TensorFlow版本。經過4個月的開發和通力合作,Persia GPU廣告訓練系統初步成型。系統同時支持PyTorch和TensorFlow兩套方案,以方便模型開發同學的不同偏好。目前,Persia已支持多個業務項目,每位研發人員只需要一臺機器便可以迅速地迭代試錯。

快手AI概覽

Persia背後的技術

Persia實現高效訓練背後的技術包含GPU分布式訓練、高速數據讀取等多個方面。

一、GPU分布式運算加速模型訓練效率

近年來,GPU訓練已在圖像識別、文字處理等應用上取得巨大成功。GPU訓練以其在卷積等數學運算上的獨特效率優勢,極大地提升了訓練機器學習模型,尤其是深度神經網絡的速度。然而,在廣告模型中,由於大量的稀疏樣本存在(比如用戶id),每個id在模型中都會有對應的Embedding向量,因此廣告模型常常體積十分巨大,以至於單GPU無法存下模型。目前往往將模型存在內存中,由CPU進行這部分巨大的Embedding層的運算操作。這既限制了訓練的速度,又導致實際生產中無法使用比較複雜的模型——因為使用複雜模型會導致CPU對給定輸入計算時間過長,無法及時響應請求。

廣告模型的構成:在廣告模型中,模型往往由下圖中的三部分構成:

l用戶id、廣告id等構成的Embedding層。每個id對應一個預設大小的向量,由於id數量往往十分巨大,這些向量常常會佔據整個模型體積的99%以上。假設我們有m1種這樣的id: {idi}i=1m1,它們對應的Embedding層{Ei}i=1m1將會輸出m1個向量:{Ei(idi)}i=1 m1。

l圖像信息、LDA等實數向量特徵。這部分將會與id對應的Embedding vector組合在一起,輸入到DNN中預測點擊率等。假設我們有m2種這樣的向量:{densei}i=1m2。

l DNN。這部分是一個傳統神經網絡,接受Embedding vector和實數向量特徵,輸出點擊率等希望預測的量:prediction=DNN([E1(idi),E2(id2),…,Em1(idm1),dense1,dense2,…,densem2])。

Persia使用多種技術訓練廣告模型,我們將在接下來幾節依次介紹。

1.大模型Embedding分片訓練

廣告模型的Embedding部分佔模型體積和計算量的大部分。很有可能無法放入單個GPU的顯存中。為了使用GPU運算以解決CPU運算速度過慢的問題,但又不受制於單GPU顯存對模型大小的限制,Persia系統使用多GPU分散存儲模型,每個GPU只存儲模型一部分,並進行多卡協作查找Embedding向量訓練模型的模式。

Persia將第i個Embedding層Ei放入第(i%總顯卡數)個顯卡中,從而使每個顯卡只存放部分Embedding。與此同時,實數向量特徵和DNN部分則置於第0個顯卡中。在使用Persia時,它將自動在各個顯卡中計算出{Ei}i=1m1的值(如果對於一個Embedding輸入了多個id,則計算其中每個值對應的Embedding vector的平均),並傳送給第0個顯卡。第0個顯卡會合併這些Embedding vector和實數向量特徵,輸入DNN中進行預測。

當求解梯度時,第0個顯卡會將各個Embedding層輸出處的導數傳回各個顯卡,各個顯卡各自負責各自Embedding的反向傳播算法求梯度。大致結構如下圖所示:

GPU分配的負載均衡:由於將Embedding依次分配在每個GPU上,可能導致部分GPU負載顯著高於其他GPU,為了讓每個GPU都能充分發揮性能,Persia訓練系統還支持對Embedding運算在GPU上進行負載均衡。

給定k個GPU,當模型的m1個Embedding層對應GPU負載分別為l1,l2,…,lm1,Persia將會嘗試將Embedding分為k組S1,S2,…,Sk,並分別存放在對應GPU上,使得每組∑i∈Sjli,∀j大致相等。這等價於如下優化問題:

minS1,…,SkVariancej[∑i∈Sjli],

s.t.∑i∈SjVi≤C,

其中Vi是第i個模型的大小,C是單個GPU的顯存大小。Persia使用貪心算法得到該問題的一個近似解,並依此將不同Embedding均勻分散在不同GPU上,以達到充分利用GPU的目的。當需要精確求解最優的Embedding放置位置時,Persia還可以通過integer optimization給出精確解。

2.簡化小模型多GPU分布訓練

當模型大小可以放入單個GPU時,Persia也支持切換為目前在圖像識別等任務中流行的AllReduce分布訓練模式。這樣不僅可以使訓練算法更加簡單,在某些情景下還可以加快訓練速度。

使用這種訓練模式時,每個GPU都會擁有一個同樣的模型,各自獲取樣本進行梯度計算。在梯度計算後,每個GPU只更新自己顯存中的模型。需要注意的是即使模型可以置於一個GPU的顯存中,往往Embedding部分也比較大,如果每次更新都同步所有GPU上的模型,會大大拖慢運算速度。因此Persia在AllReduce模式下,每次更新模型後,所有GPU使用AllReduce同步DNN部分,而Embedding部分每隔幾個更新才同步一次。這樣,即不會損失太多信息,又保持了訓練速度。

此外,在TensorFlow上,Persia還支持TensorFlow的"Replicated", "PS", "PS" + "Asynchronous"模式多卡訓練,它們的主要區別如下圖:

二、模型準確度提升

同步更新:由於普遍使用的傳統異步SGD有梯度的延遲問題,若有n臺計算機參與計算,每臺計算機的梯度的計算實際上基於n個梯度更新之前的模型。在數學上,對於第t步的模型xt,傳統異步SGD的更新為:

xt+1←xt−learning rate×g(xt−τt),

其中g(xt−τt)是訓練樣本的損失函數在τt個更新之前的模型上的梯度。而τt的大小一般與計算機數量成正比,當計算機數量增多,xt−τt與xt相差就越大,不可避免地導致模型質量的降低。Persia的訓練模式在Embedding分片存儲時沒有這種延遲問題,而在AllReduce模式下也僅在Embedding層有常數量級的延遲,因此模型質量也有所提升。

優化算法:與此同時,Persia還可以使用Adam等momentum optimizer,並為其實現了sparse版本的更新方式,比PyTorch/TensorFlow內置的dense版本更新在廣告任務上快3x-5x。這些算法在很多時候可以在同樣時間內得到比使用SGD或Adagrad更好的模型。

三、訓練數據分布式實時處理

快手Persia的高速GPU訓練,需要大量數據實時輸入到訓練機中,由於不同模型對樣本的需求不同,對於每個新實驗需要的數據格式可能也不同。因此Persia需要:

·簡單靈活便於修改的數據處理流程,

·可以輕易並行的程序架構,

·節約帶寬的數據傳輸方式。

為此,Persia系統實現了基於Hadoop集群的實時數據處理系統,可以應不同實驗需求從HDFS中使用任意多計算機分布式讀取數據進行多級個性化處理傳送到訓練機。傳輸使用高效消息隊列,並設置多級緩存。傳輸過程實時進行壓縮以節約帶寬資源。

1.並行數據處理

數據處理pipeline:為了使Persia獲取數據的方式更靈活,Persia使用dataflow構建數據處理pipeline。在Persia中可以定義每一步處理,相當於一個函數,輸入為上一個處理步驟的輸出,輸出提供給下一個處理步驟。我們定義這些函數為{fi}i=1p。在Persia中,這些函數可以單獨定義修改。在每個函數的入口和出口,Persia有數據隊列緩存,以減少每個函數獲取下一個輸入的時間。這些函數的運行可以完全並行起來,這也是pipeline的主要目的。以在食堂就餐為例,pipeline的運行就像這樣:

數據壓縮和傳輸:全部處理之後,數據處理任務會將數據組成mini-batch並使用zstandard高速壓縮每個batch,通過ZeroMQ將壓縮數據傳輸給訓練機進行訓練。定義batching操作為函數B,壓縮操作為函數C,則每個數據處理任務相當於一個函數C(B(fp(fp−1(⋯f1(raw data from HDFS)))))。

Queue server:在Hadoop集群中Persia將啟動多個數據處理任務,每個數據處理任務之間完全獨立。數據處理任務本身並不知道處理哪些數據,而是通過請求訓練機得知訓練數據的位置。這樣的好處是,在Persia中訓練機可以應自己需求動態控制使用什麼樣的訓練數據,而數據處理任務相當於一個無狀態的服務,即使訓練機更換了新的訓練任務也不需要重啟數據處理任務。具體來說,在Persia中訓練機會啟動一個queue server進程,該queue server將會應數據處理任務的請求返回下一個需要讀取的數據文件。Persia的每個數據處理任務會同時從queue server請求多個文件,並行從HDFS讀取這些文件。

整個系統的構造如下圖:

2.實時訓練

由於Persia的數據處理任務在獲取數據時完全依賴於訓練機的指示,Persia支持對剛剛生成的數據進行在線訓練的場景,只需要使queue server返回最近生成的數據文件即可。因此,Persia在訓練時的數據讀取模式上非常靈活,對queue server非常簡單的修改即可支持任意數據讀取的順序,甚至可以一邊訓練一邊決定下一步使用什麼數據。

3.更快的數據讀取速度:訓練機共享內存讀取數據

由於訓練機要同時接收從不同數據處理任務發送來的大量數據,並進行解壓縮和傳輸給訓練進程進行實際訓練的操作,接收端必須能夠進行並行解壓和高速數據傳輸。為此,Persia使用ZeroMQ device接收多個任務傳輸而來的壓縮數據,並使用多個解壓進程讀取該device。每個解壓進程獨立進行解壓,並與訓練進程共享內存。當結束解壓後,解壓進程會將可以直接使用的batch樣本放入共享內存中,訓練任務即可直接使用該batch進行訓練,而無需進一步的序列化反序列化操作。

訓練效果

Persia系統在單機上目前實現了如下訓練效果:

·數據大小:百T數據。

·樣本數量:25億訓練樣本。

·8卡V100計算機,25Gb帶寬:總共1小時訓練時間,每秒64萬樣本。

·8卡1080Ti計算機,10Gb帶寬:總共不到2小時訓練時間,每秒40萬樣本。

·4卡1080Ti達30萬樣本/秒,2卡1080Ti達20萬樣本/秒。

·Persia同樣數據上Test AUC高於原ASGD CPU平臺。

·Persia支持很大batch size,例如25k。

綜上,Persia不僅訓練速度上遠遠超過CPU平臺,並且大量節省了計算資源,使得同時嘗試多種實驗變得非常方便。

展望:分布式多機訓練

未來,Persia系統將展開分布式多GPU計算機訓練。有別於成熟的計算機視覺等任務,由於在廣告任務中模型大小大為增加,傳統分布式訓練方式面臨計算機之間的同步瓶頸會使訓練效率大為降低。Persia系統將支持通訊代價更小、系統容災能力更強的去中心化梯度壓縮訓練算法。據快手FeDA智能決策實驗室負責人劉霽介紹,該算法結合新興的異步去中心化訓練(Asynchronous decentralized parallel stochastic gradient descent, ICML 2018)和梯度壓縮補償算法(Doublesqueeze: parallel stochastic gradient descent with double-pass error-compensated compression, ICML 2019),並有嚴格理論保證,快手Persia系統在多機情景下預計還將在單機基礎上做到數倍到數十倍效率提升。

相關焦點

  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    先進的深度學習模型參數正以指數級速度增長:去年的GPT-2有大約7.5億個參數,今年的GPT-3有1750億個參數。雖然GPT是一個比較極端的例子但是各種SOTA模型正在推動越來越大的模型進入生產應用程式,這裡的最大挑戰是使用GPU卡在合理的時間內完成模型訓練工作的能力。
  • 32分鐘訓練神經機器翻譯,速度提升45倍
    在之後的一項研究《Understanding Back-Translation at Scale》中,我們展示了這一速度大幅提升的訓練設置如何讓我們利用單語文本訓練準確得多的模型。在本研究中,我們實施了一個已知的自動監控和防止溢出程序,並將訓練時間從近 24 小時減至 8.25 小時,速度提升 2.9 倍而沒有降低模型質量。接下來,我們通過所謂的累積更新,延遲了模型更新來減少 GPU 之間的通信。
  • 單機《星際爭霸2》AI,不用GPU集群,支持多種訓練環境
    今天,有人在Github開源了他潛心研究一年半的成果,一個新手和資深研究人員都能受益的深度強化學習框架,單機運行速度快、方便調式,支持多種強化學習訓練環境。上周結束的 AI Challenger 星際爭霸競賽,讓 AI 挑戰星際爭霸這個議題又稍稍火了一把。雖然這屆冠軍使用的仍然是硬編碼方法,但從其他解決方案中不難看出,AI 算法的佔比在不斷提升。
  • 飛槳帶你了解:基於百科類數據訓練的ELMo中文預訓練模型
    ELMo 模型簡介 ELMo ( Embeddings from Language Models )是重要的通用語義表示模型之一,以雙向 LSTM 為網路基本組件,以 Language Model 為訓練目標,通過預訓練得到通用的語義表示,將通用的語義表示作為 Feature 遷移到下遊 NLP 任務中,會顯著提升下遊任務的模型性能。
  • 9個讓PyTorch模型訓練提速的技巧
    **任何使用Pytorch進行深度學習模型研究的人,如研究人員、博士生、學者等,我們在這裡談論的模型可能需要你花費幾天的訓練,甚至是幾周或幾個月。Lightning是在Pytorch之上的一個封裝,它可以自動訓練,同時讓研究人員完全控制關鍵的模型組件。Lightning 使用最新的最佳實踐,並將你可能出錯的地方最小化。我們為MNIST定義LightningModel並使用Trainer來訓練模型。
  • 模型也可以上網課?!一文看懂服務型蒸餾訓練方案
    EDL項目可以使雲上深度學習模型的訓練和推理變得更容易和更有效。而服務型蒸餾訓練方案就是EDL項目結合百度飛槳開源深度學習平臺而推出了一種新的訓練方案,可謂出身名門!由於Student模型和Teacher模型的解耦,所以服務型蒸餾訓練可以使用異構的資源,也就是把Student模型和Teacher模型的部署到不同的設備上。原先受限於顯存大小而難以部署到單個GPU卡上的蒸餾網絡可以通過該方式部署到不同卡上。提升訓練速度。
  • 9個技巧讓你的PyTorch模型訓練變得飛快!
    **任何使用Pytorch進行深度學習模型研究的人,如研究人員、博士生、學者等,我們在這裡談論的模型可能需要你花費幾天的訓練,甚至是幾周或幾個月。Lightning是在Pytorch之上的一個封裝,它可以自動訓練,同時讓研究人員完全控制關鍵的模型組件。Lightning 使用最新的最佳實踐,並將你可能出錯的地方最小化。我們為MNIST定義LightningModel並使用Trainer來訓練模型。
  • 深度學習訓練時 GPU 溫度過高?輸入這幾行命令就能迅速降溫
    新買回來的不帶水冷公版GPU,在滿負載運行的時候,溫度從室溫馬上飆升到85度,而且模型訓練不是幾分鐘完事,很有可能要長期保持在高溫狀態下運行,讓如此昂貴的GPU一直發燒真是讓人太心疼!  一、如果你有顯示器(X server)可以完全按照上面提到的文章《從零開始組裝深度學習平臺》操作,這裡貼出關鍵步驟為:1.
  • 百度引入Ring Allreduce算法,大規模提升模型訓練速度
    訓練的神經網絡模型的訓練速度顯著提高。    高效並行訓練的需求隨著神經網絡參數越來越龐大,從幾億個參數與到數十億參數,所需的GPU運算節點也在增加。然而,節點數量越多,整個系統的效率就會降低。深度學習在多個GPU上訓練神經網絡通常比較困難,因為大家普遍採用的方法是,讓多個GPU把數據發送給一個reducer GPU上,這會造成一種通信瓶頸,整個訓練速度會因此拖慢。而
  • 飛槳帶你了解:基於百科類數據訓練的 ELMo 中文預訓練模型
    ELMo模型簡介  ELMo(Embeddings from Language Models) 是重要的通用語義表示模型之一,以雙向 LSTM 為網路基本組件,以 Language Model 為訓練目標,通過預訓練得到通用的語義表示,將通用的語義表示作為 Feature 遷移到下遊 NLP 任務中,會顯著提升下遊任務的模型性能。
  • 2分31秒,騰訊雲創造128卡訓練ImageNet新記錄
    例如,在CIFAR-10數據集上訓練的ResNet模型有16個可調的超參數,當多數超參數的取值為連續域的情況下,如此少量的超參數仍然可能造成組合爆炸。 訓練時間長。隨著深度學習模型越來越複雜,對算力的需求也越來越高(2012年到2018年,對算力的需求增長2000倍+ )。
  • ...訓練速度可提升數倍,如何用「稀疏學習」從頭開始訓練稀疏網絡?
    雷鋒網 AI 科技評論:《從頭開始訓練稀疏網絡:在不損失性能的情況下加速訓練速度》這篇博文介紹的是我和 Luke Zettlemoyer 通過在整個訓練期間保持神經網絡的稀疏性從而加速訓練速度的一項工作。這項工作證明,通過完善稀疏動量算法,可以在短短一次訓練中用稀疏隨機權值來初始化一個神經網絡,並使其達到密集網絡的性能水平。
  • 一行代碼讓訓練速度提升2倍,飛槳自動混合精度技術詳解
    但是在深度學習領域,模型的參數、數據集的規模等等動輒就是以億為單位,甚至更大,因此當模型訓練成功之時,放一首張靚穎的「終於等到你」作為背景音樂實在是太應景了。那如果現在向你推薦一款神器,可以實現訓練速度翻倍,訪存效率翻倍,你心動嗎?
  • 超越Google 快手落地業界首個萬億參數推薦精排模型
    Google日前發布了首個萬億級模型 Switch Transformer 參數量達到1.6萬億 其速度是Google之前開發的最大語言模型 T5-XXL 的4倍。然而快手萬億參數精排模型總的參數量超過1.9萬億 規模更大 且已經投入實踐。下面就讓我們通過快手精排模型的發展史 一起揭秘它內部的的技術密碼吧!
  • 浪潮AI伺服器NF5488A5的實測數據分享,單機最大推理路數提升88%
    近日,在GTC China元腦生態技術論壇上,中科極限元、趨動科技、睿沿科技等元腦生態夥伴分享了多個場景下浪潮AI伺服器NF5488A5的實測數據,結果表明浪潮NF5488A5大幅提升了智能語音、圖像識別等AI模型的訓練和推理性能,促進了產業AI解決方案的開發與應用。
  • TensorFlow 2.4正式支持多工作節點多GPU分散訓練機器學習模型
    深度學習函數庫TensorFlow釋出最新版本2.4,該版本支持新的分散式訓練策略,Keras還更新了混合精度功能,加速模型訓練工作,此外,TensorFlow 2.4提供Python開發者,熟悉的數值運算函數庫NumPy支持,而用於監控和診斷的分析工具也有更新,以支持新加入的功能。
  • PyTorch系列 | 如何加快你的模型訓練速度呢?
    譯者 | kbsc13("算法猿的成長"公眾號作者)原文 | https://towardsdatascience.com/speed-up-your-algorithms-part-1-pytorch-56d8a4ae7051聲明 | 翻譯是出於交流學習的目的,歡迎轉載,但請保留本文出於,請勿用作商業或者非法用途本文將主要介紹如何採用
  • 運動啟蒙階段的速度訓練模型
    速度的獲得很大程度上來自對短跑技能的學習以及更加出色的肌肉協調性。   那些不注重全方面發展的兒童,可能存在四肢協調性不良的問題。由於手臂動作會直接影響到腿部動作的頻率,因此手臂和肩部的協調性不足會阻礙兒童快速跑動能力的提升。造成這一問題的原因在於,處於青春期的男孩會因包括睪酮在內的激素分泌增加而獲得力量的提升,女孩則因為較低的激素水平而在力量的提升方面趨於平緩。
  • 斯坦福DAWNBench放新榜:華為雲ModelArts訓練推理雙第一,模型訓練...
    3月20日,史丹福大學發布最新的DAWNBench榜單,華為雲ModelArts一站式AI開發平臺,獲得圖像識別總訓練時間及推理性能榜單雙料冠軍。史丹福大學DAWNBench是全球人工智慧領域最權威的競賽之一,是用來衡量端到端的深度學習模型訓練和推理性能的國際權威基準測試平臺,相應的排行榜反映了當前業界深度學習平臺技術的領先性。
  • 當代研究生應當掌握的5種Pytorch並行訓練方法(單機多卡)
    在打開 b 站 「學習」 之前看著那空著一半的顯卡決定寫點什麼餵飽它們~因此,從 V100-PICE/V100/K80 中各拿出 4 張卡,試驗一下哪種分布式學習庫速度最快!這下終於能把剩下的顯存吃完啦,又是老師的勤奮好學生啦(我真是個小機靈鬼)!