計(jì)算在我們的日常生活和整個(gè)社會(huì)中變得越來越重要。雖然晶體管數(shù)量每兩年翻一番的趨勢(shì)(稱為摩爾定律)可能即將結(jié)束,但計(jì)算繼續(xù)發(fā)揮著至關(guān)重要的作用。但我們指的不是運(yùn)行占用資源的后臺(tái)應(yīng)用程序或玩視覺最密集的游戲。
我們正在談?wù)撚?jì)算在世代發(fā)現(xiàn)中的生產(chǎn)應(yīng)用。計(jì)算已成為許多職業(yè)中必不可少的工具,具有計(jì)算生物學(xué)、人工智能和機(jī)器學(xué)習(xí)等專業(yè)子領(lǐng)域,以及金融、天氣等行業(yè)的復(fù)雜計(jì)算算法。其中一些領(lǐng)域是在過去十年中出現(xiàn)的。
計(jì)算硬件的進(jìn)步與計(jì)算應(yīng)用程序的實(shí)際影響之間存在相關(guān)性。對(duì)更強(qiáng)大的計(jì)算的需求推動(dòng)了對(duì)更好硬件的研發(fā),這反過來又使開發(fā)更強(qiáng)大的應(yīng)用程序變得更加容易。值得注意的是,游戲行業(yè)在開發(fā)圖形處理單元(GPU)等專用硬件方面發(fā)揮了重要作用,它已成為機(jī)器學(xué)習(xí)等領(lǐng)域當(dāng)代進(jìn)步的重要組成部分。
在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、建模和其他生產(chǎn)性任務(wù)中使用 GPU 進(jìn)行一般處理的作用越來越大,這反過來又促使改進(jìn)硬件迎合這些應(yīng)用程序,并提供更好的軟件支持。NVIDIA 開發(fā)的張量核心極大地改進(jìn)了訓(xùn)練神經(jīng)網(wǎng)絡(luò)和在現(xiàn)實(shí)世界、實(shí)時(shí)應(yīng)用程序以及各個(gè)領(lǐng)域的其他機(jī)器學(xué)習(xí)任務(wù)中執(zhí)行 AI 推理中的矩陣乘法。
考慮到所有這些,它應(yīng)該很簡單:購買盡可能多的 GPU。但是,要利用GPU的計(jì)算性能,我們必須考慮其他因素。
最先進(jìn)的GPU不僅要花費(fèi)數(shù)千美元,而且對(duì)于某些應(yīng)用程序,它們可能無法很好地?cái)U(kuò)展。應(yīng)用程序的并行性、軟件支持和規(guī)模(以及預(yù)算)都會(huì)影響 CPU 和 GPU 規(guī)格的權(quán)重,以滿足用戶的計(jì)算需求。
并行化基礎(chǔ)知識(shí)
CPU擅長通用計(jì)算,可以計(jì)算我們編程的任何內(nèi)容。高性能CPU可以快速給我們一個(gè)答案,這個(gè)特征就是所謂的延遲:從原因到結(jié)果所需的時(shí)間。
另一方面,GPU 通常被簡潔地描述為以更低的延遲換取更高的吞吐量:衡量隨著時(shí)間的推移將“原因”(即數(shù)據(jù))轉(zhuǎn)化為結(jié)果的數(shù)量。
雖然時(shí)鐘速度不是一切,但它們確實(shí)讓我們了解指令通過設(shè)備的速度。請(qǐng)注意,現(xiàn)代 CPU 的時(shí)鐘速度大約是最新和最偉大的 GPU 的兩倍。
雖然 GPU 中的內(nèi)核單獨(dú)速度不如 CPU 中的內(nèi)核快得多,而且更專業(yè),但它們的數(shù)量要多得多(NVIDIA 高端消費(fèi)類 RTX 16 中有 384,4090 個(gè) CUDA 內(nèi)核),因此對(duì)于可以并行化的操作來說,吞吐量很高。
現(xiàn)代CPU也接受了多核計(jì)算(盡管比它們的GPU表親要極端得多)。這在一定程度上是出于達(dá)到芯片制造中縮放現(xiàn)象的S曲線的平坦部分而采取的舉措。簡而言之,現(xiàn)代 CPU 內(nèi)核如果不遇到嚴(yán)重的散熱問題,就無法獲得更快的速度。
對(duì)于應(yīng)用程序是否優(yōu)先考慮 GPU 或 CPU,基本經(jīng)驗(yàn)法則是 GPU 更適合并行工作。但是,如前所述,CPU 具有較小程度的并行性,并且并非工作負(fù)載中的所有并行化類型都是平等的。
從某種意義上說,矩陣運(yùn)算和進(jìn)化算法都是令人尷尬的平行的;雖然矩陣操作非常適合 GPU 加速,但后者最適合在多個(gè) CPU 內(nèi)核上執(zhí)行。最終,許多實(shí)際應(yīng)用程序的部件嚴(yán)重依賴 CPU 和 GPU 密集型。巧妙地平衡和優(yōu)化兩者可以在速度和計(jì)算可訪問性方面提供額外的收益,正如我們將在現(xiàn)已解散的Uber AI實(shí)驗(yàn)室開發(fā)的深度神經(jīng)進(jìn)化策略的例子中看到的那樣。
并行化的類型
通常,當(dāng)任務(wù)可以分解為不依賴于彼此輸出的獨(dú)立組件時(shí),可以更容易地并行。根據(jù)問題的內(nèi)在特征,并行化有幾種不同的風(fēng)格。我們可以將弗林的計(jì)算機(jī)體系結(jié)構(gòu)分類法用作腳手架。
多程序多數(shù)據(jù)
在 MPMD 中,多個(gè)程序在不同的數(shù)據(jù)集上并行運(yùn)行。每個(gè)程序都獨(dú)立于其他程序運(yùn)行,它們可以在群集中的不同處理器或節(jié)點(diǎn)上運(yùn)行。這種類型的并行化通常用于高性能計(jì)算應(yīng)用程序,其中需要同時(shí)執(zhí)行多個(gè)程序才能實(shí)現(xiàn)所需的性能。
多指令多數(shù)據(jù)
MIMD 類似,但可以通過缺少中央控制過程來區(qū)分。多個(gè)處理器同時(shí)在不同的數(shù)據(jù)集上執(zhí)行不同的指令。每個(gè)處理器都是獨(dú)立的,可以執(zhí)行自己的程序或指令序列。這種類型的并行化通常用于分布式計(jì)算,其中不同的處理器處理問題的不同部分。
單指令多數(shù)據(jù)
在 SIMD 中,多個(gè)處理器同時(shí)對(duì)不同的數(shù)據(jù)集執(zhí)行相同的指令。這種類型的并行化通常用于需要并行處理大量數(shù)據(jù)的應(yīng)用程序,例如圖形處理和科學(xué)計(jì)算。例如,在圖像處理中,可以使用 SIMD 將相同的操作應(yīng)用于圖像中的所有像素。
單程序多個(gè)數(shù)據(jù)
在SPMD中,多個(gè)處理器同時(shí)在不同的數(shù)據(jù)集上執(zhí)行相同的程序。每個(gè)處理器可以獨(dú)立地對(duì)自己的數(shù)據(jù)進(jìn)行操作,但它們都執(zhí)行相同的代碼。這種類型的并行化通常用于集群計(jì)算,其中單個(gè)程序在集群中的多個(gè)節(jié)點(diǎn)上執(zhí)行,每個(gè)節(jié)點(diǎn)處理輸入數(shù)據(jù)的不同部分。它類似于 MIMD,但所有處理器都執(zhí)行相同的程序。
阿姆達(dá)爾定律:并行化的極限
并行化可以為密集型算法帶來顯著的加速和節(jié)能,但算法中無法并行化的部分(稱為阿姆達(dá)爾定律)可以獲得多少是有限的。
阿姆達(dá)爾定律是一個(gè)公式,描述了當(dāng)程序在多個(gè)處理器上并行運(yùn)行時(shí)可以實(shí)現(xiàn)的最大加速比。它考慮了可以并行化的程序百分比和必須按順序運(yùn)行的百分比。
該公式指出,可以實(shí)現(xiàn)的最大加速比受程序的順序部分的限制。換句話說,如果一個(gè)程序有 80% 的代碼可以并行運(yùn)行,20% 的代碼必須按順序運(yùn)行,那么即使使用無限數(shù)量的處理器,也可以實(shí)現(xiàn)的最大加速比為 5 倍。這是因?yàn)闊o論使用多少處理器,20% 的順序部分將始終花費(fèi)相同的時(shí)間來執(zhí)行。
為了實(shí)現(xiàn)可能的最大加速,重要的是要確定程序的哪些部分可以并行化并相應(yīng)地優(yōu)化它們。此外,所使用的硬件應(yīng)設(shè)計(jì)為最小化程序順序部分的影響。
總體而言,阿姆達(dá)爾定律是使用并行計(jì)算時(shí)需要理解的重要概念,因?yàn)樗兄跒榭梢詫?shí)現(xiàn)的潛在加速設(shè)定切合實(shí)際的期望,并指導(dǎo)優(yōu)化工作。
何時(shí)使用 CPU 與 GPU 的示例:最佳用例
在理想情況下,在為給定用例規(guī)劃計(jì)算硬件時(shí)是否強(qiáng)調(diào) GPU 或 CPU 的清單非常簡短:“是否有適用于此用例的高效 GPU 實(shí)現(xiàn)?
某些 GPU 實(shí)現(xiàn)比其他實(shí)現(xiàn)更好,在某些情況下,強(qiáng)制具有大量不可并行化組件的算法在 GPU 上運(yùn)行弊大于利,尤其是在 GPU VRAM 內(nèi)存和系統(tǒng) RAM 之間移動(dòng)數(shù)據(jù)存在大量開銷的情況下。
編譯源代碼:專注于CPU(和內(nèi)存)
編譯源代碼是 GPU 通常不會(huì)發(fā)揮作用的一個(gè)領(lǐng)域。在規(guī)劃主要用于構(gòu)建大型代碼庫的系統(tǒng)時(shí),CPU 性能更為重要,擁有足夠的內(nèi)存 (RAM) 尤為重要。
在構(gòu)建具有大量專用于讀取/寫入磁盤的開銷的大型代碼庫時(shí),不要忘記投資像 NVMe 存儲(chǔ)這樣的快速存儲(chǔ)技術(shù)。
最好的英特爾CPU通常具有比AMD系列略好于單線程性能,但這有時(shí)只等同于更好的構(gòu)建時(shí)間。查看各種語言的 CPU 編譯基準(zhǔn)測(cè)試 openbenchmarking.org。請(qǐng)記住,更多內(nèi)核并不總是意味著更多更好;以最佳預(yù)算價(jià)位找到最佳 CPU,不僅可以節(jié)省時(shí)間和金錢,還可以降低能耗和 TCO。
深度學(xué)習(xí):GPU 主導(dǎo)
現(xiàn)代機(jī)器學(xué)習(xí)的特點(diǎn)是深度學(xué)習(xí),具有多層非線性轉(zhuǎn)換的模型,大多以點(diǎn)積和卷積等矩陣運(yùn)算的形式實(shí)現(xiàn)。這些操作本質(zhì)上是可矢量化的:我們可以將許多此類操作批處理在一起,并在一次正向傳遞中執(zhí)行它們。換句話說,現(xiàn)代神經(jīng)網(wǎng)絡(luò)的構(gòu)建塊在很大程度上是可并行化的。
GPU 當(dāng)之無愧地成為深度學(xué)習(xí)管道(尤其是訓(xùn)練)的黃金標(biāo)準(zhǔn)和常見做法。NVIDIA GPU 擁有超過十年的研發(fā)經(jīng)驗(yàn),強(qiáng)調(diào)深度學(xué)習(xí)。GPU 硬件對(duì)神經(jīng)網(wǎng)絡(luò)的適用性引發(fā)了良性循環(huán)的縮影,因?yàn)樗?lì)了對(duì)改進(jìn)線性代數(shù)基元、專門的低精度數(shù)據(jù)類型和張量核等功能開發(fā)更好的支持。
訓(xùn)練全尺寸 AI 模型需要分布式計(jì)算、大量財(cái)務(wù)和超級(jí)計(jì)算機(jī)訪問方面的專業(yè)知識(shí)。微調(diào)小型或中型LLM可以使用具有大量板載VRAM的高端消費(fèi)類或?qū)I(yè)GPU。
進(jìn)化算法:多核 CPU 重點(diǎn)
雖然深度學(xué)習(xí)和反向傳播可能是當(dāng)今最著名的機(jī)器學(xué)習(xí)類型,但仍存在進(jìn)化算法更有效的情況。
進(jìn)化算法涉及計(jì)算許多不同變體的“適應(yīng)性”,這些變體被稱為個(gè)體。對(duì)于這類問題,進(jìn)化算法已被證明與傳統(tǒng)的強(qiáng)化學(xué)習(xí)方法一樣好。
計(jì)算群體中每個(gè)個(gè)體的適應(yīng)度通??梢圆⑿型瓿?,而無需等待其他個(gè)體完成。SPMD 和 MPMD 算法不需要管理器或中央控制器,通常用于這些類型的計(jì)算。像AMD的EPYC或Ryzen Threadripper這樣的CPU,特別適合運(yùn)行這些類型的算法,并且可以使用消息傳遞接口(MPI)標(biāo)準(zhǔn)相互通信。
尋找平衡:優(yōu)化 GPU 和 CPU 的使用以實(shí)現(xiàn)深度神經(jīng)進(jìn)化
雖然深度神經(jīng)網(wǎng)絡(luò)非常適合在強(qiáng)大的GPU上進(jìn)行矢量處理,而進(jìn)化算法也有利于在多核CPU上并行實(shí)現(xiàn),但有時(shí)我們兩者都需要。優(yōu)化 GPU 和 CPU 資源的使用對(duì)于提高深度神經(jīng)進(jìn)化的性能至關(guān)重要,深度神經(jīng)進(jìn)化涉及用于優(yōu)化深度神經(jīng)網(wǎng)絡(luò)的進(jìn)化算法。
我們?cè)?CPU 上同時(shí)利用進(jìn)化算法的 SPMD/MPMD 范式,在 GPU 上同時(shí)利用神經(jīng)網(wǎng)絡(luò)的 SIMD 數(shù)學(xué)原語。利用 CPU 和 GPU 功能可確保實(shí)現(xiàn)這些最佳性能和效率。
除了優(yōu)化 GPU 和 CPU 的使用外,選擇優(yōu)化算法的正確超參數(shù)也很重要。群體大小、突變率和交叉率等超參數(shù)會(huì)顯著影響優(yōu)化過程的性能。通常需要仔細(xì)調(diào)整才能獲得最佳結(jié)果。
哪些應(yīng)用程序是 GPU 密集型應(yīng)用程序,哪些應(yīng)用程序是 CPU 密集型應(yīng)用程序?
除了 GPU 對(duì)神經(jīng)網(wǎng)絡(luò)的適用性之外,HPC 中許多感興趣的問題都基于物理學(xué),例如計(jì)算流體動(dòng)力學(xué)或粒子模擬。物理學(xué)具有局部性的便利性,即物體僅受其附近其他物體的影響。
這樣做的計(jì)算結(jié)果是,物理相互作用的許多方面都可以并行建模,例如在更新粒子狀態(tài)之前計(jì)算粒子云上的力。這意味著許多基于物理的應(yīng)用程序的大部分都可以在GPU上有效實(shí)現(xiàn)。
對(duì)于基于物理的問題,GPU 實(shí)現(xiàn)的存在通常是確定給定應(yīng)用程序是否可以從強(qiáng)調(diào) GPU 硬件的系統(tǒng)中受益所需的唯一考慮因素。大多數(shù)主要的分子動(dòng)力學(xué)軟件包現(xiàn)在都具有良好的GPU支持,包括AMBER,GROMACS等。
正如AlphaFold和其他深度學(xué)習(xí)突破所表明的那樣,神經(jīng)網(wǎng)絡(luò)可以很容易地補(bǔ)充計(jì)算生物學(xué)。
另一方面,CPU 密集型應(yīng)用程序源于數(shù)據(jù)庫管理和虛擬機(jī)。CPU 對(duì)于代碼編譯非常重要,例如運(yùn)行我們的操作系統(tǒng),這是一個(gè)大型代碼網(wǎng)絡(luò),使我們的系統(tǒng)能夠運(yùn)行,更不用說指示哪些任務(wù)將轉(zhuǎn)到我們的 GPU。CPU 充當(dāng)計(jì)算機(jī)的委派人和工頭。
雖然并非所有 GPU 實(shí)現(xiàn)都是平等的,但許多 HPC 應(yīng)用程序現(xiàn)在都受益于并行化。有了良好的GPU支持,在大多數(shù)領(lǐng)域加速算法的重要部分在很大程度上要?dú)w功于專用于在屏幕上顯示數(shù)百萬像素的硬件。隨著深度學(xué)習(xí)的進(jìn)步,GPU 通用計(jì)算的進(jìn)步進(jìn)一步加速。
隨著其他領(lǐng)域強(qiáng)大的GPU增強(qiáng)模擬成為普遍做法,我們可以期待硬件專業(yè)化和算法改進(jìn),即使面對(duì)摩爾定律和Dennard縮放的崩潰。隨著更先進(jìn)的指令集和高效架構(gòu)的開發(fā),計(jì)算的轉(zhuǎn)變將是CPU和GPU之間的結(jié)合。
審核編輯:郭婷
評(píng)論
查看更多