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