時間:2024-01-22 16:21:34來源:算力基建
它是如此重要,以至于谷歌目前因涉嫌侵犯 BF16 的創(chuàng)建者而被起訴,索賠 16 億至 52 億美元。所有的目光都集中在數(shù)字格式上,因為它們在過去十年中對人工智能硬件效率的提升起到了很大的作用。較低精度的數(shù)字格式有助于推倒數(shù)十億參數(shù)模型的內(nèi)存墻。
在本文中,我們將從基本原理的基礎(chǔ)上,從數(shù)字格式的基本原理到神經(jīng)網(wǎng)絡(luò)量化的當(dāng)前技術(shù)水平進(jìn)行技術(shù)探討。我們將介紹浮點與整數(shù)、電路設(shè)計注意事項、塊浮點、MSFP、微縮放格式、對數(shù)系統(tǒng)等。我們還將介紹推理的量化和數(shù)字格式的差異以及高精度與低精度訓(xùn)練方法。此外,我們將討論面臨量化和準(zhǔn)確性損失相關(guān)挑戰(zhàn)的模型的下一步發(fā)展。
上述都是設(shè)計一顆AI芯片需要考量的因素。
01. 矩陣乘法
任何現(xiàn)代機(jī)器學(xué)習(xí)模型的大部分都是矩陣乘法。在GPT-3中,每一層都使用大量矩陣乘法:例如,其中一個具體運算是(2048 x 12288)矩陣乘以(12288 x 49152)矩陣,輸出(2048 x 49152)矩陣。
重要的是如何計算輸出矩陣中的每個單獨元素,這可以歸結(jié)為兩個非常大的向量的點積 - 在上面的示例中,大小為 12288。這由 12288 次乘法和 12277 次加法組成,它們累積成一個數(shù)字– 輸出矩陣的單個元素。
通常,這是通過將累加器寄存器初始化為零,然后重復(fù)地在硬件中完成的
乘以 x_i * w_i;
將其添加到累加器中;
每個周期的吞吐量均為 1。經(jīng)過大約 12288 個循環(huán)后,輸出矩陣的單個元素的累加完成。這種“融合乘加”運算 (FMA:fused multiply-add) 是機(jī)器學(xué)習(xí)的基本計算單元:芯片上有數(shù)千個 FMA 單元戰(zhàn)略性地排列以有效地重用數(shù)據(jù),因此可以并行計算輸出矩陣的許多元素,以減少所需的周期數(shù)。
上圖中的所有數(shù)字都需要在芯片內(nèi)部的某個位以某種方式以位表示:
x_i,輸入激活;
w_i,權(quán)重;
p_i,成對乘積;
整個輸出完成累加之前的所有中間部分累加和;
最終輸出總和;
在這個巨大的設(shè)計空間中,當(dāng)今大多數(shù)機(jī)器學(xué)習(xí)量化研究都可以歸結(jié)為兩個目標(biāo):
足夠準(zhǔn)確地存儲數(shù)千億個權(quán)重,同時使用盡可能少的位,從容量和帶寬的角度減少內(nèi)存占用。這取決于用于存儲權(quán)重的數(shù)字格式。
實現(xiàn)良好的能源和面積效率。這主要取決于用于權(quán)重和激活的數(shù)字格式;
這些目標(biāo)有時是一致的,有時是不一致的——我們將深入研究這兩個目標(biāo)。
02. 數(shù)字格式設(shè)計目標(biāo) 1:芯片效率
許多機(jī)器學(xué)習(xí)芯片計算性能的根本限制是功耗。雖然 H100 理論上可以實現(xiàn) 2,000 TFLOPS 的計算能力,但在此之前它會遇到功率限制 - 因此每焦耳能量的 FLOPs 是一個非常需要跟蹤的指標(biāo)。鑒于現(xiàn)代訓(xùn)練運行現(xiàn)在經(jīng)常超過 1e25 次flops,我們需要極其高效的芯片,在數(shù)月內(nèi)吸收(sucking)兆瓦功率,才能擊敗 SOTA。
03. 基本數(shù)字格式
首先,讓我們深入了解計算中最基本的數(shù)字格式:整數(shù)。 一、以 2 為底的正整數(shù)正整數(shù)具有明顯的以 2 為底的表示形式。這些稱為 UINT,即無符號整數(shù)。以下是 8 位無符號整數(shù)(也稱為 UINT8,范圍從 0 到 255)的一些示例。
這些整數(shù)可以有任意位數(shù),但通常僅支持以下四種格式:UINT8、UINT16、UINT32 和 UINT64。
二、負(fù)整數(shù)(Negative integers)
負(fù)整數(shù)需要一個符號來區(qū)分正負(fù)。我們可以將一個指示符放在最高有效位中:例如0011 表示+3,1011 表示–3。這稱為符號-數(shù)值(sign-magnitude)表示。以下是 INT8 的一些示例,其范圍從 –128 到 127。請注意,由于第一位是符號,因此最大值實際上已從 255 減半到 127。 符號-數(shù)值很直觀,但效率很低——您的電路必須實現(xiàn)截然不同的加法和減法算法,而這些算法又不同于沒有符號位的無符號整數(shù)的電路。有趣的是,硬件設(shè)計人員可以通過使用二進(jìn)制補碼表示來解決這個問題,這使得可以對正數(shù)、負(fù)數(shù)和無符號數(shù)使用完全相同的進(jìn)位加法器電路。所有現(xiàn)代 CPU都使用二進(jìn)制補碼。 在 unsigned int8 中,最大數(shù)字 255 是 11111111。如果添加數(shù)字 1,255 會溢出到 00000000,即 0。在signed int8 中,最小數(shù)字是 -128,最大數(shù)字是 127。作為讓 INT8 和 UINT8 共享硬件的技巧資源,-1可以用11111111表示?,F(xiàn)在當(dāng)數(shù)字加1時,它溢出到00000000,按預(yù)期表示0。同樣,11111110 可以表示為-2。
溢出被用作一個功能!實際上,0 到 127 被映射為正常值,128 到 255 被直接映射到 -128 到 -1。
04. 固定點(Fixed Point)
為了更進(jìn)一步,我們可以在現(xiàn)有硬件上輕松創(chuàng)建新的數(shù)字格式,而無需進(jìn)行修改。雖然這些都是整數(shù),但您可以簡單地想象它們是其他東西的倍數(shù)!例如,0.025 只是千分之 25,它可以存儲為整數(shù) 25?,F(xiàn)在我們只需要記住其他地方使用的所有數(shù)字都是千分之幾。 新的“數(shù)字格式”可以表示從 –0.128 到 0.127 的千分之一的數(shù)字,而沒有實際的邏輯變化。完整的數(shù)字仍被視為整數(shù),然后小數(shù)點固定在右起第三位。這種策略稱為定點( fixed point)。 更一般地說,這是一個有用的策略,我們將在本文中多次回顧它 - 如果您想更改可以表示的數(shù)字范圍,請在某處添加比例因子。(顯然,您可以用二進(jìn)制來執(zhí)行此操作,但十進(jìn)制更容易討論)。
05. 浮點(Floating Point)
但定點有一些缺點,特別是對于乘法。假設(shè)您需要計算一萬億乘以一萬億分——尺寸上的巨大差異就是高*動態(tài)范圍*的一個例子。那么 1012和 10-12都必須用我們的數(shù)字格式來表示,所以很容易計算出你需要多少位:從 0 到 1 萬億以萬億分之一的增量計數(shù),你需要 10^24 增量,log2(10^ 24) ~= 80 位來表示具有我們想要的精度級別的動態(tài)范圍。 每個數(shù)字 80 位顯然是相當(dāng)浪費的。您不一定關(guān)心絕對精度,您關(guān)心相對精度。因此,盡管上述格式能夠準(zhǔn)確區(qū)分 1 萬億和 999,999,999,999.999999999999,但您通常不需要這樣做。大多數(shù)時候,您關(guān)心的是相對于數(shù)字大小的誤差量。 這正是科學(xué)記數(shù)法所解決的問題:在前面的示例中,我們可以將一萬億寫為 1.00 * 10^12,將一萬億寫為 1.00 * 10^-12,這樣的存儲空間要少得多。這更復(fù)雜,但可以讓您在相同的上下文中表示極大和極小的數(shù)字,而無需擔(dān)心。 因此,除了符號和值之外,我們現(xiàn)在還有一個指數(shù)。IEEE 754-1985 標(biāo)準(zhǔn)化了行業(yè)范圍內(nèi)以二進(jìn)制存儲該數(shù)據(jù)的方式,而當(dāng)時使用的格式略有不同。主要有趣的格式,32 位浮點數(shù)(“float32”或“FP32”)可描述為 (1,8,23):1 個符號位、8 個指數(shù)位和 23 個尾數(shù)位。
符號位為0表示正,1表示負(fù);
指數(shù)位被解釋為無符號整數(shù) e,并表示比例因子 2 e-127,其值可以介于 2-126-和2127之間。更多指數(shù)位意味著更大的動態(tài)范圍;
尾數(shù)位表示值 1.。更多尾數(shù)位意味著更高的相對精度;
其他位寬已標(biāo)準(zhǔn)化或事實上已采用,例如 FP16 (1,5,10) 和 BF16 (1,8,7)。爭論的焦點是范圍與精度。
FP8(1,5,2 或 1,4,3)最近在 OCP 標(biāo)準(zhǔn)中標(biāo)準(zhǔn)化了一些額外的怪癖,但目前還沒有定論。許多人工智能硬件公司已經(jīng)實現(xiàn)了具有稍微優(yōu)越的變體的芯片,這些變體與標(biāo)準(zhǔn)不兼容。
06. 硅效率(Silicon Efficiency)
回到硬件效率,所使用的數(shù)字格式對硅面積和所需功率有巨大影響。
一、整數(shù)硅設(shè)計電路(Integer Silicon Design Circuit)
整數(shù)加法器是有史以來研究最深入的硅設(shè)計問題之一。雖然實際的實現(xiàn)要復(fù)雜得多,但考慮加法器的一種方法是將它們想象為根據(jù)需要將 1 一直相加并一直加到總和上,因此在某種意義上,n 位加法器正在做一定量的工作到 n 對于乘法,請回想一下小學(xué)的長乘法。我們進(jìn)行 n 位乘以 1 位的乘積,然后最后將所有結(jié)果相加。在二進(jìn)制中,乘以 1 位數(shù)字很簡單(0 或 1)。這意味著 n 位乘法器本質(zhì)上由 n 位加法器的 n 次重復(fù)組成,因此工作量與 n^2 成正比。 雖然實際實現(xiàn)因面積、功率和頻率限制而有很大不同,但通常 1) 乘法器比加法器昂貴得多,但 2) 在低位數(shù)(8 位及以下)時,F(xiàn)MA 的功耗和面積成本更高以及來自加法器的更多相對貢獻(xiàn)((n 與 n^2 縮放).
二、浮點電路(Floating Point Circuits)
浮點單位有很大不同。相反,乘積/乘法相對簡單。 如果恰好有一個輸入符號為負(fù),則符號為負(fù),否則為正。 指數(shù)是傳入指數(shù)的整數(shù)和。 尾數(shù)是傳入尾數(shù)的整數(shù)積。 相比之下,總和相當(dāng)復(fù)雜。 首先,計算指數(shù)差。(假設(shè) exp1 至少與 exp2 一樣大 - 如果沒有,請在說明中交換它們); 將尾數(shù) 2 向下移動 (exp1 - exp2),使其與尾數(shù) 1 對齊; 向每個尾數(shù)添加隱式前導(dǎo) 1。如果一個符號為負(fù),則對尾數(shù)之一執(zhí)行二進(jìn)制補碼; 將尾數(shù)加在一起形成輸出尾數(shù); 如果發(fā)生溢出,則結(jié)果指數(shù)加1,尾數(shù)下移; 如果結(jié)果為負(fù),則將其轉(zhuǎn)換回?zé)o符號尾數(shù)并將輸出符號設(shè)置為負(fù); 對尾數(shù)進(jìn)行歸一化,使其具有前導(dǎo) 1,然后刪除隱式前導(dǎo) 1; 適當(dāng)舍入尾數(shù)(通常舍入到最接近的偶數(shù)); 值得注意的是,浮點乘法的成本甚至比整數(shù)乘法“更少”,因為尾數(shù)乘積中的位數(shù)更少,而指數(shù)的加法器比乘法器小得多,幾乎無關(guān)緊要。 顯然,這也是極其簡化的,特別是我們沒有討論的非正規(guī)和 nan 處理占用了大量的空間。但要點是,在低位數(shù)浮點中,乘積很便宜,而累加則很昂貴。
我們提到的所有部分在這里都非常明顯 - 將指數(shù)相加,尾數(shù)的大型乘法器數(shù)組,根據(jù)需要移動和對齊事物,然后標(biāo)準(zhǔn)化。(從技術(shù)上講,真正的“融合”(“fused”)乘加有點不同,但我們在這里省略了。)
該圖表說明了上述所有要點。有很多東西需要消化,但要點是 INT8 x INT8 的累加和累加到定點 (FX) 的成本是最便宜的,并且由乘法 (“mpy”) 主導(dǎo),而使用浮點作為操作數(shù)或累加格式(通常在很大程度上)由累積成本(“alignadd”+“normacc”)主導(dǎo)。例如,通過使用帶有“定點”累加器的 FP8 操作數(shù)而不是通常的 FP32,可以節(jié)省大量成本。 總而言之,本文和其他論文聲稱 FP8 FMA 將比 INT8 FMA 多占用 40-50% 的硅面積,并且能源消耗同樣更高或更差的說法一直。這是大多數(shù)專用 ML 推理芯片使用 INT8 的主要原因。
07. 數(shù)字格式設(shè)計目標(biāo) 2:準(zhǔn)確性
既然整數(shù)總是更便宜,為什么我們不到處使用 INT8 和 INT16 而不是 FP8 和 FP16呢?這取決于這些格式能夠如何準(zhǔn)確地表示神經(jīng)網(wǎng)絡(luò)中實際顯示的數(shù)字。 我們可以將每種數(shù)字格式視為一個查找表。例如,一個非常愚蠢的 2 位數(shù)字格式可能如下所示:
顯然,這組四個數(shù)字對任何事情都沒有多大用處,因為它缺少太多數(shù)字 - 事實上,根本沒有負(fù)數(shù)。如果表中不存在神經(jīng)網(wǎng)絡(luò)中的數(shù)字,那么您所能做的就是將其四舍五入到最近的條目,這會給神經(jīng)網(wǎng)絡(luò)帶來一點誤差。 那么表中理想的值集是多少?表的大小可以有多小? 例如,如果神經(jīng)網(wǎng)絡(luò)中的大多數(shù)值都接近于零(實際上也是如此),我們希望能夠有很多這些數(shù)字接近于零,這樣我們就可以通過犧牲準(zhǔn)確性來獲得更高的準(zhǔn)確性。哪里沒有。 在實踐中,神經(jīng)網(wǎng)絡(luò)通常是正態(tài)分布或拉普拉斯分布,有時根據(jù)模型架構(gòu)的確切數(shù)值,存在大量異常值。特別是,對于非常大的語言模型, 往往會出現(xiàn)極端異常值,這些異常值很少見,但對模型的功能很重要。
上圖顯示了 LLAMA 65B 部分權(quán)重。這看起來很像正態(tài)分布。如果將此與 FP8 和 INT8 中的數(shù)字分布進(jìn)行比較,很明顯浮點集中在重要的地方 - 接近零。這就是我們使用它的原因!
不過,它仍然與真實分布不太匹配——每次指數(shù)遞增時,它仍然有點太尖了,但比 int8 好得多。 我們可以做得更好嗎?從頭開始設(shè)計格式的一種方法是最小化平均絕對誤差——舍入造成的平均損失量。
08. 對數(shù)系統(tǒng)(Log Number Systems)
例如, Nvidia在HotChips 上宣稱 Log Number System 是繼續(xù)擴(kuò)展過去 8 位數(shù)字格式的可能途徑。使用對數(shù)系統(tǒng)時,舍入誤差通常較小,但存在許多問題,包括極其昂貴的加法器。
NF4 和變體 (AF4) 是 4 位格式,假設(shè)權(quán)重遵循完全正態(tài)分布,則使用精確的查找表來最大限度地減少誤差。但這種方法在面積和功耗方面非常昂貴——現(xiàn)在每個操作都需要查找巨大的條目表,這比任何 INT/FP 操作都要糟糕得多。 存在多種替代格式:posits、ELMA、PAL 等。這些技術(shù)聲稱在計算效率或表示準(zhǔn)確性方面具有多種優(yōu)勢,但尚未達(dá)到商業(yè)相關(guān)規(guī)模。也許其中之一,或者尚未發(fā)表/發(fā)現(xiàn)的一個,將具有 INT 的成本和 FP 的表征準(zhǔn)確性——一些人已經(jīng)做出了這樣的聲明,或者更好。 我們個人對 Lemurian Labs PAL 最有希望,但關(guān)于其數(shù)字格式,還有很多信息尚未披露。他們聲稱其 16 位精度和范圍比 FP16 和 BF16 更好,同時硬件也更便宜。
隨著我們繼續(xù)擴(kuò)展到過去的 8 位格式,PAL4 還聲稱比 HotChips 上的 Nvidia 等對數(shù)系統(tǒng)有更好的分布。他們的紙面聲明令人驚嘆,但目前還沒有硬件實現(xiàn)該格式。
09. 塊號格式(Block Number Formats)
一個有趣的觀察是,元素的大小幾乎總是與張量中附近的元素相似。當(dāng)張量的元素比平常大得多時,附近的元素本質(zhì)上并不重要——它們相對太小,無法在點積中看到。 我們可以利用這一點 - 我們可以在多個元素之間共享一個指數(shù),而不是對每個數(shù)字都使用浮點指數(shù)。這節(jié)省了很多大部分冗余的指數(shù)。 這種方法已經(jīng)存在了一段時間 - Nervana Flexpoint、Microsoft MSFP12、Nvidia VSQ - 直到 2023 年 OCP 的 Microscaling 才出現(xiàn)。 此時,存在一整套可能的格式,具有不同的權(quán)衡。微軟試圖量化硬件的設(shè)計空間:
硬件供應(yīng)商面臨著一個棘手的問題,即嘗試設(shè)計高度專業(yè)化的高效格式,同時又不關(guān)閉可能具有截然不同的數(shù)值分布的未來模型架構(gòu)的大門。
10. 推理(Inference)
上述大部分內(nèi)容都適用于推理和訓(xùn)練,但每種都有一些特定的復(fù)雜性。 推理對成本/功耗特別敏感,因為模型通常只訓(xùn)練一次,但部署到數(shù)百萬客戶。訓(xùn)練也更加復(fù)雜,有許多數(shù)值上有問題的操作(見下文)。這意味著推理芯片在采用更小、更便宜的數(shù)字格式方面通常遠(yuǎn)遠(yuǎn)領(lǐng)先于訓(xùn)練芯片,因此模型訓(xùn)練的格式和模型推理的格式之間可能會出現(xiàn)很大的差距。 有許多工具可以從一種格式適應(yīng)另一種格式,這些工具屬于一個范圍: 一方面,訓(xùn)練后量化(PTQ:post-training quantization)不需要執(zhí)行任何實際的訓(xùn)練步驟,只需根據(jù)一些簡單的算法更新權(quán)重: 最簡單的方法是將每個權(quán)重四舍五入到最接近的值。
The easiest is to simply round each weight to the nearest value. LLM.int8() 將除一小部分以外的所有異常值權(quán)重轉(zhuǎn)換為 INT8; GPTQ 使用有關(guān)權(quán)重矩陣的二階信息來更好地量化; Smoothquant 進(jìn)行數(shù)學(xué)上等效的變換,嘗試平滑激活異常值; AWQ 使用有關(guān)激活的信息來更準(zhǔn)確地量化最顯著的權(quán)重; QuIP 對模型權(quán)重進(jìn)行預(yù)處理,使其對量化不太敏感; AdaRound 將每一層的舍入分別優(yōu)化為二次二元優(yōu)化; 存在許多其他方法并且正在不斷發(fā)布。許多“訓(xùn)練后”量化方法通過使用某種修改后的訓(xùn)練步驟或代理目標(biāo)迭代優(yōu)化量化模型,從而模糊了與訓(xùn)練的界限。這里的關(guān)鍵方面是,這些極大地降低了成本,但現(xiàn)實世界的性能損失通常比人們經(jīng)常吹捧的簡單基準(zhǔn)要大。
另一方面,量化感知訓(xùn)練 (QAT:quantization-aware training) 會改變精度并繼續(xù)訓(xùn)練一段時間以使模型適應(yīng)新的精度。所有量化方法都應(yīng)至少部分使用此機(jī)制,以在現(xiàn)實世界性能中實現(xiàn)最小的精度損失。這直接使用常規(guī)訓(xùn)練過程來使模型適應(yīng)量化機(jī)制,通常被認(rèn)為更有效,但計算成本更高。
11. 訓(xùn)練(Training)
由于向后傳遞,訓(xùn)練稍微復(fù)雜一些。有 3 個 matmul——一個在前向傳遞中,兩個在后向傳遞中。
每個訓(xùn)練步驟最終都會接收權(quán)重,對各種數(shù)據(jù)進(jìn)行一系列矩陣乘法,并產(chǎn)生新的權(quán)重。 FP8 訓(xùn)練更加復(fù)雜。下面是 Nvidia FP8 訓(xùn)練方法的稍微簡化版本。
這個清單的一些顯著特點: 每個 matmul 都是 FP8 x FP8 并累加為 FP32 (實際上精度較低,但 Nvidia 告訴大家它是 FP32),然后量化為 FP8 以用于下一層。累加必須比 FP8 具有更高的精度,因為它涉及對同一大型累加器進(jìn)行數(shù)萬次連續(xù)的小更新,因此每個小更新需要很高的精度才能不向下舍入為零; 每個 FP8 權(quán)重張量都帶有一個比例因子。由于每一層的范圍可能顯著不同,因此縮放每個張量以適應(yīng)該層的范圍至關(guān)重要; 權(quán)重更新(在主框之外)對精度非常敏感,并且通常保持較高的精度(通常為 FP32)。這又歸結(jié)為幅度不匹配——權(quán)重更新與權(quán)重相比很小,因此再次需要精度才能使更新不向下舍入為零; 最后,訓(xùn)練與推理的一大區(qū)別是梯度有更多的極端異常值,這一點非常重要。可以將激活梯度(例如 SwitchBack、AQT)量化為 INT8,但權(quán)重梯度迄今為止抵制了這種努力,必須保留在 FP16 或 FP8 (1,5,2) 中。
中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.surachana.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
rpi-image-gen:樹莓派軟件鏡像構(gòu)建的終...
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測節(jié)拍...
2025-03-31
激光閃耀 智慧引領(lǐng) | WISE MASER 黑武士...
2025-03-20