比GPU快15倍,CPU算法訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)“超車”成功

原創(chuàng) 青蘋(píng)果、LZM 數(shù)據(jù)實(shí)戰(zhàn)派 美國(guó)萊斯大學(xué)計(jì)算機(jī)系助理教授 Anshumali Shrivastava 深度神經(jīng)網(wǎng)絡(luò)(deep neural networks,DNN)是人工智能的有力工具,在某些任務(wù)上的表現(xiàn)甚至已經(jīng)超越人類專家的水平。對(duì)這類網(wǎng)絡(luò)的訓(xùn)練,可以看作是一系列矩陣運(yùn)算操作,特別適合交給 GPU 運(yùn)算,它們運(yùn)算效率遠(yuǎn)高于 CPU,但是成本僅僅是 CPU 的 3 倍。 但是現(xiàn)在,情況已有所不同。 近日,來(lái)自美國(guó)萊斯大學(xué)(Rice University)的計(jì)算機(jī)科學(xué)家們證實(shí),一種基于 CPU 的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練算法的訓(xùn)練速度遠(yuǎn)超過(guò) GPU 算法,最高速度比后者快 15 倍。 論文名為 Accelerating SLIDE Deep Learning on Modern CPUs: Vectorization, Quantizations, Memory Optimizations, and More 。該工作的突出貢獻(xiàn)在于,提供了在現(xiàn)代 CPU 上實(shí)現(xiàn)深度學(xué)習(xí)的隨機(jī)算法的幾個(gè)新視角。 正如作者之一、萊斯大學(xué)助理教授 Anshumali Shrivastava 所說(shuō):“當(dāng)前,訓(xùn)練成本問(wèn)題是人工智能的現(xiàn)實(shí)瓶頸。一些公司每周花費(fèi)上百萬(wàn)美元用于訓(xùn)練和微調(diào)神經(jīng)網(wǎng)絡(luò)…… 整個(gè)工業(yè)界都把目光集中于一類改進(jìn) —— 加速矩陣操作。大家都在尋找專用硬件和架構(gòu)加速矩陣運(yùn)算,甚至開(kāi)始探討堆疊專用硬件來(lái)適應(yīng)某一個(gè)深度學(xué)習(xí)模型。 但是,如果我們把目光稍稍移開(kāi),將注意力放回到算法上,可以一切都會(huì)不同。” SLIDE 算法 早在 2019 年,Shrivastava 的實(shí)驗(yàn)室團(tuán)隊(duì)就開(kāi)始了算法層面加速深度學(xué)習(xí)訓(xùn)練的努力,他們將深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練問(wèn)題轉(zhuǎn)化為搜索問(wèn)題,使用哈希表解決。 他們的 “次線性深度學(xué)習(xí)處理引擎”(sub-linear deep learning engine, SLIDE)是專門根據(jù) CPU 設(shè)計(jì)的,是一種基于 C++ 實(shí)現(xiàn)的、在 CPUs 上比 GPUs 更快地訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的算法。該算法克服了 AI 領(lǐng)域產(chǎn)業(yè)發(fā)展的一個(gè)主要障礙,有力證明了在不依賴于 GPUs 等專業(yè)級(jí)加速硬件的情況下,依舊可以實(shí)現(xiàn)對(duì)深度學(xué)習(xí)技術(shù)的加速。 SLIDE 結(jié)合了智能哈希隨機(jī)算法和 CPU 上中等規(guī)模的多核并行性,這種思路遵循自適應(yīng)稀疏 /dropout 的路線,根據(jù)神經(jīng)元的激活情況,只需更新一小部分神經(jīng)元,便可以精確地訓(xùn)練神經(jīng)網(wǎng)絡(luò)。 尤其是,SLIDE 采用局部敏感哈希(LSH, Locality Sensitive Hash)方法自適應(yīng)地識(shí)別每次更新過(guò)程中的神經(jīng)元。目前 SLIDE 已被證明,在訓(xùn)練數(shù)以百萬(wàn)計(jì)的參數(shù)神經(jīng)模型方面要比 GPU 更快。 在本文中,團(tuán)隊(duì)認(rèn)為目前 SLIDE 的實(shí)現(xiàn)并未發(fā)揮其最佳性能,因?yàn)槿鄙佻F(xiàn)代 CPU 的助力。研究的重點(diǎn)便是優(yōu)化 X86 架構(gòu)的現(xiàn)有 SLIDE 實(shí)現(xiàn)。特別的是,團(tuán)隊(duì)展示了借助 AVX(Advanced Vector Extensions)-512 指令集,SLIDE 的計(jì)算是如何進(jìn)行向量化的。 此外,團(tuán)隊(duì)還強(qiáng)調(diào)了不同類型的內(nèi)存優(yōu)化和量化的機(jī)會(huì)。也就是說(shuō),他們堅(jiān)定地認(rèn)為,如果將所有這些方法結(jié)合起來(lái),可以在相同的硬件下,實(shí)現(xiàn)高達(dá) 7 倍的計(jì)算速度。 為了驗(yàn)證上述假設(shè),團(tuán)隊(duì)將實(shí)驗(yàn)專注于大型的推薦和 NLP 模型上。 在兩臺(tái)Intel最近推出的兩款不同的CPU服務(wù)器上評(píng)估了優(yōu)化的SLIDE系統(tǒng)及其有效性,分別是Cooper Laker服務(wù)器(CPX)和Cascade Lake服務(wù)器(CLX),并與5個(gè)基準(zhǔn)進(jìn)行了對(duì)照。 這兩種處理器的相同之處是都支持VX-512指令。而差異在于,只有CPX機(jī)器支持bloat16。兩者的具體架構(gòu)如下: CPX是新的第三代Intel Xeon可擴(kuò)展處理器,支持基于VX512的BF16指令。它擁有Intel x86_64架構(gòu),4個(gè)28核CPU總共112個(gè)核,能夠與超線程并行運(yùn)行224個(gè)線程。L3緩存大小大約為39MB,L2緩存約為1MB。 CLX是不支持BF16指令的“老一輩”可擴(kuò)展處理器。它采用Intel x86 64架構(gòu),具有雙24核處理器(Intel Xeon Platinum 8260L CPU @ 2.40GHz)總計(jì)48核。使用超線程,可以運(yùn)行的并行線程的最大數(shù)量達(dá)到96。L3緩存大小約為36MB,L2緩存約為1MB。 對(duì)比的基準(zhǔn)展示如下: l V100 GPU上的full-softmax tensorflow 實(shí)現(xiàn); l CPX上的full-softmax tensorflow 實(shí)現(xiàn); l CLX上的full-softmax tensorflow 實(shí)現(xiàn); l CPX上的Naive SLIDE; l CLX上的Naive SLIDE。 結(jié)果顯示,就 wall lock time 而言,SLIDE 在中等的 CPU 上訓(xùn)練一個(gè)約 2 億參數(shù)的神經(jīng)網(wǎng)絡(luò),比在 NVIDIA V100 GPU 上優(yōu)化的 TensorFlow 實(shí)現(xiàn)要快得多。而且最令人興奮的是,SLIDE 相比其他基線而言,可以更快達(dá)到任意的精度水平。 大量的優(yōu)化空間 與未優(yōu)化的 SLIDE 相比,在同樣的硬件基礎(chǔ)上,團(tuán)隊(duì)采用的優(yōu)化工作可以使訓(xùn)練時(shí)間提高 2-7 倍。這一系列優(yōu)化工作包括: 內(nèi)存合并技術(shù)(Memory Coalescing)和緩存利用率: 大多數(shù)機(jī)器學(xué)習(xí)任務(wù)都與內(nèi)存相關(guān)聯(lián)。它們需要批量讀取連續(xù)地?cái)?shù)據(jù),然后更新存儲(chǔ)在主存中的大量參數(shù)。SLIDE 實(shí)現(xiàn)的情況也類似。 了解 CPU 中的內(nèi)存加載機(jī)制: 當(dāng)所有線程執(zhí)行一個(gè)加載指令時(shí),最有利的方案是讓所有線程訪問(wèn)連續(xù)的全局內(nèi)存位置。在這種情況下,硬件可以將這些內(nèi)存訪問(wèn)合并為對(duì)連續(xù) DRAM 位置的單個(gè)訪問(wèn)。因此,大多數(shù)線程都直接從緩存加載,這至少是從 DRAM 加載速度的 3 倍。然而,包括 SLIDE 在內(nèi)的大多數(shù)隨機(jī)算法都忽略了這一現(xiàn)象,因?yàn)樗鼈兗俣▋?nèi)存訪問(wèn)模式是隨機(jī)的,足以利用緩存。團(tuán)隊(duì)成員發(fā)現(xiàn) SLIDE 有主要的內(nèi)存碎片(memory fragmentation),這無(wú)疑增加了數(shù)據(jù)訪問(wèn)延遲 —— 碎片內(nèi)存會(huì)降低 CPUs 上的高速緩存利用率。SLIDE 中的內(nèi)存碎片存在兩個(gè)顯著的原因:(1)數(shù)據(jù)內(nèi)存碎片和(2)參數(shù)內(nèi)存碎片。 刪除數(shù)據(jù)內(nèi)存碎片: SLIDE 使用稀疏數(shù)據(jù)集和稀疏激活。考慮到非零(non-zeros)的變量數(shù)目,通常采用的選擇是使用不同的數(shù)組(或向量)來(lái)存儲(chǔ)各種數(shù)據(jù)實(shí)例。但是,這會(huì)導(dǎo)致不必要的緩存丟失。SLIDE 使用了 HOGWILD 風(fēng)格的并行模式,其中多個(gè)不同的線程同時(shí)處理數(shù)百個(gè)數(shù)據(jù)實(shí)例。使用 SLIDE 中的稀疏格式的標(biāo)準(zhǔn)實(shí)現(xiàn),每個(gè)線程將訪問(wèn)來(lái)自完全不同的 DRAM 內(nèi)存位置的數(shù)據(jù),這不會(huì)利用緩存,特別是跨所有線程共享的 L3 緩存。 團(tuán)隊(duì)使用的方法并未分割每個(gè)數(shù)據(jù)實(shí)例,而是創(chuàng)建一個(gè)長(zhǎng)連續(xù)向量,連續(xù)存儲(chǔ)一批數(shù)據(jù)實(shí)例的非零索引和值。為了跟蹤非零的變量個(gè)數(shù),需要保留其他偏移量。這些偏移值將用于直接索引任何數(shù)據(jù)實(shí)例的起始位置。在實(shí)際應(yīng)用中,常常使用數(shù)百個(gè)線程并行處理數(shù)百到數(shù)千個(gè)數(shù)據(jù)實(shí)例。因此,當(dāng)從 DRAM 中查找第一個(gè)數(shù)據(jù)實(shí)例時(shí),批處理中的大多數(shù)連續(xù)數(shù)據(jù)元素都被加載 / 預(yù)取(loaded/pre-fetched)進(jìn)來(lái)。 刪除參數(shù)內(nèi)存碎片: 在 SLIDE 算法中,每一層的每個(gè)神經(jīng)元都被獨(dú)立激活,激活神經(jīng)元的身份依賴于輸入。因此,每個(gè)輸入實(shí)例都通過(guò)查詢哈希表來(lái)動(dòng)態(tài)選擇神經(jīng)元。非常高的稀疏性(作為 SLIDE 算法的關(guān)鍵優(yōu)勢(shì))通常會(huì)確保兩個(gè)不同的線程選擇一組幾乎 “毫無(wú)瓜葛” 的神經(jīng)元。然而,在復(fù)雜的多核環(huán)境中,數(shù)百個(gè)數(shù)據(jù)批被并行處理,產(chǎn)生大量的經(jīng)過(guò)處理的神經(jīng)元。因此,在每個(gè)批處理中可能需要幾個(gè)相鄰的神經(jīng)元。這種現(xiàn)象為內(nèi)存合并技術(shù)(Memory Coalescing)創(chuàng)造了另一個(gè)機(jī)會(huì)。在此階段,團(tuán)隊(duì)確保即使神經(jīng)元是獨(dú)立的實(shí)體,同一層的神經(jīng)元權(quán)值在主存中是連續(xù)的,以提高緩存效率。需要注意的是,團(tuán)隊(duì)保留了一大塊的連續(xù)內(nèi)存,其中包含給定層中的不同神經(jīng)元權(quán)重。 超線程(HT, Hyper-Threading)用于 HOGWILD 風(fēng)格更新: 超線程允許處理器從實(shí)際上來(lái)加倍其核數(shù),并同時(shí)執(zhí)行兩倍多的線程,在線程之間來(lái)回跳轉(zhuǎn),在另一個(gè)線程停止時(shí)執(zhí)行指令。因?yàn)?SLIDE 梯度更新是 HOGWILD 風(fēng)格的數(shù)據(jù)并行和異步,所以超線程提供了一個(gè)顯著的提升。由于 SLIDE 內(nèi)存訪問(wèn)的隨機(jī)特性,線程確實(shí)會(huì)因?yàn)榫彺驽e(cuò)過(guò)而停止。從這一點(diǎn)上看,超線程確實(shí)是有利的,因?yàn)榱硪粋€(gè)線程可以利用等待時(shí)間來(lái)處理不同的數(shù)據(jù)實(shí)例。 用 AVX-512 進(jìn)行向量化: 摩爾定律(Moore's Law)通過(guò)額外的內(nèi)核和更寬的 SIMD(單指令,多數(shù)據(jù))寄存器持續(xù)提供更高的并行性,從而確保了在幾代硬件上的性能改進(jìn)。AVX(Advanced Vector Extensions)-512 是針對(duì) x86 集架構(gòu)的 512 位 SIMD 指令的更新版本。要執(zhí)行 CPU 指令,如加法、乘法等,操作值必須加載到寄存器中。超時(shí)寄存器的大小已經(jīng)增加,允許更大值的存儲(chǔ)和操作,并允許多個(gè)值存儲(chǔ)在單個(gè)更寬的寄存器中。這是為進(jìn)行向量化,后來(lái)擴(kuò)展出來(lái)的功能。現(xiàn)在大多數(shù) CPUs 都包含 64 位寄存器,但是一些較新的處理器則包含多達(dá) 512 位的寄存器。該系統(tǒng)使用 AVX-512 指令,其指令允許對(duì)駐留在 512 位寄存器中的值的 “向量” 進(jìn)行單個(gè)操作,如加法操作等。簡(jiǎn)單舉例來(lái)說(shuō),假設(shè)希望對(duì)兩個(gè)數(shù)組進(jìn)行成對(duì)加法,每個(gè)數(shù)組包含 16 個(gè) 32 位整數(shù)。在這種情況下,便可以考慮將每個(gè)數(shù)組加載到 512 位寄存器中,并利用單個(gè)操作將它們相加,然后將產(chǎn)生的結(jié)果值返回到一個(gè)新數(shù)組中。圖 2 給出了示例。 SLIDE 中的 AVX-512: 向量化 ADAM 參數(shù)更新是一件非常簡(jiǎn)單的任務(wù)。根據(jù)標(biāo)準(zhǔn)向量公式來(lái)更新權(quán)重矩陣中的每一項(xiàng)。鑒于所有的矩陣都表示為連續(xù)的內(nèi)存塊,因此可以將此過(guò)程從 2D 循環(huán)簡(jiǎn)化為 1D 循環(huán)。從本質(zhì)上而言,就是取了一個(gè) 1D 循環(huán),以 16 或 32 的增量遍歷內(nèi)存中的數(shù)組(假設(shè)權(quán)重表示為 32 位或 16 位浮點(diǎn)數(shù))。圖 3 給出了對(duì)速度、動(dòng)量和梯度更新進(jìn)行向量化的示例。 哈希計(jì)算: SLIDE 中一個(gè)重要的計(jì)算瓶頸就是哈希計(jì)算。SLIDE 使用 LSH 對(duì)高激活神經(jīng)元進(jìn)行采樣。特別是,SLIDE 使用了最近提出的 DTWA 哈希算法,該算法可以很好地處理稀疏數(shù)據(jù)。為了有效地向量化這個(gè) LSH 函數(shù),團(tuán)隊(duì)成員預(yù)先計(jì)算了所有索引的隨機(jī)映射。然后,使用標(biāo)準(zhǔn)的 AVX-512 向量化指令,對(duì)每個(gè) bin 中的最大操作進(jìn)行聚合。 BF16 優(yōu)化: 腦浮點(diǎn)格式(BF16, Brain floating-point format)使用計(jì)算機(jī)內(nèi)存中的 16 位來(lái)表示一個(gè)浮點(diǎn)數(shù)。它已在硬件加速機(jī)器學(xué)習(xí)中得到了廣泛應(yīng)用。與 FP32 相比,BF16 將尾數(shù)從 23 位截?cái)嗟?7 位,同時(shí)保留了 8 位的指數(shù)。團(tuán)隊(duì)提出了兩種利用 BF16 加速訓(xùn)練過(guò)程的模式。具體地,第一種模式是用 BF16 格式表示激活和權(quán)重。第二種模式表示在 BF16 中激活,同時(shí)更新 FP32 中的參數(shù),以避免在提高速度的同時(shí)降低訓(xùn)練質(zhì)量,主要是考慮到用 16 位操作替換 32 位操作可能會(huì)提高計(jì)算速度。與此同時(shí),它還通過(guò)對(duì)相同數(shù)量的指令加倍操作次數(shù)來(lái)增強(qiáng)了 AVX-512 的性能。 實(shí)驗(yàn)和分析 團(tuán)隊(duì)成員在三個(gè)真實(shí)的公共數(shù)據(jù)集上評(píng)估了框架和其他基線模型:Amazon670K(用于推薦系統(tǒng)的 Kaggle 數(shù)據(jù)集)、WikiLSH-325K 數(shù)據(jù)集和 Text8(NLP 中的數(shù)據(jù)集)。詳細(xì)統(tǒng)計(jì)數(shù)據(jù)見(jiàn)下表 1: 在圖 6 中,團(tuán)隊(duì)展示了所有方法在掛鐘訓(xùn)練時(shí)間和 P@1(Precision@1)方面的性能。結(jié)果顯示了該團(tuán)隊(duì)提出的優(yōu)化 SLIDE 在 CPX 和 CLX(深綠色和淺綠色)上訓(xùn)練時(shí)間均優(yōu)于其他基準(zhǔn)。其中,首行(Top row)代表所有數(shù)據(jù)集的時(shí)間收斂圖,而底行(Bottom row)顯示了所有數(shù)據(jù)集的柱狀圖。 下表 2 提供了三個(gè)數(shù)據(jù)集上的詳細(xì)數(shù)值結(jié)果: 下表 3 中,研究者展示了 BF16 指令對(duì)每個(gè) epoch 平均訓(xùn)練時(shí)間的影響。結(jié)果表明,在 Amazon-670K 和 WikiLSH325K 上,激活和權(quán)重中使用 BF16 指令分別將性能提升了 1.28 倍和 1.39 倍。然而,在 Text8 上使用 BF16 沒(méi)有產(chǎn)生影響。 下表 4 展示了在有無(wú) AVX-512 的情況下,優(yōu)化 SLIDE 在三個(gè)數(shù)據(jù)集上的每個(gè) epoch 平均訓(xùn)練時(shí)間對(duì)比。結(jié)果表明,AVX-512 的向量化將平均訓(xùn)練時(shí)間減少了 1.2 倍。由于運(yùn)行計(jì)算相同,因此數(shù)據(jù)集的準(zhǔn)確性保持不變。 這支研究團(tuán)隊(duì)真誠(chéng)希望,這項(xiàng)工作能夠激發(fā)更多關(guān)于新算法及其優(yōu)化 CPU 實(shí)現(xiàn)的更多研究,以用于大規(guī)模深度學(xué)習(xí)工作負(fù)載。 “基于哈希表的加速策略已經(jīng)超越了 GPU,但是 CPU 還在繼續(xù)進(jìn)步”,本研究的學(xué)生作者、萊斯大學(xué)研究生 Shabnam Daghaghi 說(shuō),“我們利用 CPU 的先進(jìn)技術(shù)加強(qiáng) SLIDE。我們想說(shuō)明,如果你不再拘泥于加速矩陣運(yùn)算,你可以利用現(xiàn)在 CPU 的力量,以 15 倍的速度訓(xùn)練人工智能模型。” 今天,CPU 仍是最普遍存在的計(jì)算硬件,設(shè)計(jì)適合于 CPU 的 AI 算法,這類研究或許應(yīng)該受到更多的重視。 Reference: 1、https://arxiv.org/abs/2103.10891 2、https://github.com/RUSH-LAB/SLIDE
登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP