AI模型,規模至關重要。 儘管部分人工智慧專家警告,大型語言模型(LLMs)的規模擴展正遭遇效能報酬遞減的問題,但各公司仍持續推出規模更大的AI工具。Meta最新的Llama版本擁有驚人的2兆個參數,定義了該模型。 隨著模型規模的增長,其能力也隨之提升。然而,能耗需求和模型運行所需的時間也同步增加,導致碳足跡擴大。為緩解這些問題,人們轉向使用較小、能力較弱的模型,並盡可能在模型參數中使用較低精度的數字。 但還有一條路徑,可以在維持龐大模型高效能的同時,減少運行時間和能耗。這種方法涉及善用大型AI模型中的「零值」。 對於許多模型而言,大多數參數——即權重和激活值——實際上是零,或者非常接近零,以至於可以將其視為零而不損失準確性。這種特性被稱為「稀疏性」(sparsity)。稀疏性為計算節省提供了巨大的機會:無需浪費時間和能源進行零值的加法或乘法運算,這些計算可以直接跳過;也無需在記憶體中儲存大量的零值,只需儲存非零參數即可。 不幸的是,現今流行的硬體,如多核心中央處理器(CPUs)和圖形處理器(GPUs),並不能自然地充分利用稀疏性。要完全發揮稀疏性的優勢,研究人員和工程師需要重新思考並重新架構設計堆疊的每個部分,包括硬體、低階韌體和應用軟體。 在我們史丹佛大學的研究團隊中,我們開發了(據我們所知)第一個能夠高效計算各種稀疏和傳統工作負載的硬體。儘管不同工作負載的節能效果差異很大,但我們的晶片平均能耗僅為CPU的七十分之一,運算速度平均快了八倍。為此,我們必須從頭開始設計硬體、低階韌體和軟體,以利用稀疏性。我們希望這僅是硬體和模型開發的開端,未來將實現更節能的AI。 什麼是稀疏性? 神經網路及其輸入資料都以數字陣列的形式表示。這些陣列可以是單維(向量)、二維(矩陣)或更多維(張量)。一個稀疏向量、矩陣或張量,其大部分元素都是零。稀疏程度各不相同,但當零值佔任何類型陣列的50%以上時,它就能從稀疏性專用的計算方法中受益。相反,非稀疏的物件——即與總元素數量相比,零值很少的物件——則稱為「稠密」(dense)。 稀疏性可以是自然存在的,也可以是人為誘導的。例如,社交網路圖會是自然稀疏的。想像一個圖,其中每個節點(點)代表一個人,每條邊(連接點的線段)代表一種友誼。由於大多數人彼此不是朋友,因此代表所有可能邊的矩陣將大部分是零。其他流行的AI應用,例如其他形式的圖學習和推薦模型,也包含自然發生的稀疏性。 通常,一個四乘四的矩陣在記憶體中佔用16個空間,無論有多少零值。如果矩陣是稀疏的,意味著大部分值為零,則可以更有效地表示為「纖維樹」(fibertree):一個由代表包含非零元素的行_i_座標「纖維」組成,連接到代表包含非零元素的列_j_座標纖維,最終連接到非零值本身。為了將纖維樹儲存在電腦記憶體中,每個纖維的「段」(或端點)與座標和值一起儲存。 除了自然發生的稀疏性之外,稀疏性也可以透過多種方式在AI模型中誘導產生。兩年前,Cerebras的一個團隊展示,在不損失任何準確性的情況下,可以將大型語言模型中高達70%至80%的參數設為零。Cerebras特別在Meta的開源Llama 7B模型上展示了這些結果,但這些概念也適用於其他LLM模型,如ChatGPT和Claude。 稀疏性的優勢 稀疏運算的效率源於兩個基本特性:能夠壓縮掉零值,以及零值便利的數學特性。稀疏運算中使用的演算法和專用硬體都利用了這兩個基本概念。 首先,稀疏資料可以被壓縮,使其以「稀疏」方式儲存(即使用稀疏資料類型)時更具記憶體效率。壓縮還能提高處理大量資料時的資料移動能源效率。這最好透過一個例子來理解。以一個四乘四的矩陣為例,其中有三個非零元素。傳統上,這個矩陣會原樣儲存在記憶體中,佔用16個空間。這個矩陣也可以壓縮成稀疏資料類型,去除零值,只儲存非零元素。在我們的例子中,這會使記憶體空間從稠密、未壓縮版本的16個減少到13個。這些記憶體節省會隨著稀疏性和矩陣大小的增加而增加。 傳統上,向量與矩陣相乘需要16個乘法步驟和16個加法步驟。使用稀疏數字格式,計算成本取決於問題中重疊的非零值數量。在此範例中,整個計算僅需三個查找步驟和兩個乘法步驟即可完成。 除了實際的資料值之外,壓縮資料還需要中繼資料(metadata)。非零元素的行和列位置也必須儲存。這通常被認為是一種「纖維樹」結構:列出包含非零元素的行標籤,並連結到非零元素的列標籤,然後再連結到這些元素中儲存的值。 在記憶體中,情況會更複雜一些:每個非零值的行和列標籤都必須儲存,以及指示預期有多少此類標籤的「段」(segments),以便中繼資料和資料可以清晰地劃分。 在稠密、未壓縮的矩陣資料類型中,值可以一次一個或並行存取,其位置可以透過簡單的方程式直接計算。然而,存取稀疏、壓縮資料中的值需要查找行索引的座標,並利用該資訊「間接」查找列索引的座標,最後才能到達值。根據稀疏資料值的實際位置,這些間接查找可能極其隨機,使得計算具有資料依賴性,並需要即時分配記憶體查找。 其次,零的兩個數學特性讓軟體和硬體可以跳過大量的計算。任何數字乘以零都會得到零,因此無需實際進行乘法運算。任何數字加上零都會返回該數字本身,因此也無需進行加法運算。 在矩陣向量乘法中,這是AI工作負載中最常見的操作之一,除了涉及兩個非零元素的計算之外,所有計算都可以直接跳過。例如,以上述四乘四矩陣和一個四個數字的向量為例。在稠密計算中,向量的每個元素都必須與每行中對應的元素相乘,然後相加,以計算最終向量。在這種情況下,這將需要16次乘法運算和16次加法(或四次累加)。 在稀疏計算中,只需考慮向量的非零元素。對於每個非零向量元素,可以使用間接查找來找到任何對應的非零矩陣元素,並且只需對這些元素進行乘法和加法。在所示範例中,將只執行兩次乘法步驟,而不是16次。 GPU與CPU的困境 不幸的是,現代硬體並不適合加速稀疏計算。例如,假設我們要執行矩陣向量乘法。在最簡單的情況下,在單一CPU核心中,向量的每個元素將依序相乘,然後寫入記憶體。這很慢,因為我們一次只能執行一次乘法。因此,人們轉而使用支援向量運算的CPU或GPU。有了這些硬體,所有元素都可以並行相乘,大大加快了應用程式的速度。現在,想像矩陣和向量都包含極度稀疏的資料。向量化的CPU和GPU將大部分精力花在乘以零上,執行完全無效的計算。 新一代的GPU(如NVIDIA Ampere架構和TensorRT)能夠在硬體上利用部分稀疏性,但僅限於一種稱為「結構化稀疏性」(structured sparsity)的特定類型。結構化稀疏性假設每四個相鄰參數中,有兩個是零。然而,有些模型從「非結構化稀疏性」(unstructured sparsity)中受益更多——即任何參數(權重或激活值)都可以是零並被壓縮掉,無論其位置和相鄰元素為何。GPU可以在軟體中執行非結構化稀疏計算,例如透過cuSparse GPU函式庫。然而,對稀疏計算的支援通常有限,且GPU硬體未被充分利用,將耗能的計算浪費在額外開銷上。 在軟體中執行稀疏計算時,現代CPU可能比GPU計算是更好的選擇,因為它們設計得更具彈性。然而,CPU上的稀疏計算通常會因為用於查找非零值的間接查找而成為瓶頸。