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