50s完成7B模型量化,4bit達(dá)到新SOTA,大模型低比特量化有新招了 | NeurIPS 2024 Oral
消除激活值(outliers),大語言模型低比特量化有新招了——
自動化所、清華、港城大團(tuán)隊最近有一篇論文入選了NeurIPS 2024(Oral Presentation),他們針對LLM權(quán)重激活量化提出了兩種正交變換,有效降低了outliers現(xiàn)象,達(dá)到了4-bit的新SOTA。
簡單理解,在大語言模型(LLM)中,有一些中間層輸出的數(shù)值(激活值 Activation)會變得非常大,它們被稱為“outliers(離群值)”,這些 outliers給模型量化帶來了挑戰(zhàn)。
補(bǔ)充一下,量化可以將模型中的數(shù)值從浮點數(shù)轉(zhuǎn)換為整數(shù),以減少模型的大小和計算需求。
而一旦在量化過程中存在大量outliers,會導(dǎo)致量化后的模型性能下降。
明白了這層道理, 我們再來看他們團(tuán)隊的一項名為DuQuant的新研究。
首先, 他們發(fā)現(xiàn)在LLM的前饋網(wǎng)絡(luò) (FFN) 模塊中的down_proj層, 存在明顯的Massive Outliers(非常大的激活值)。
這種outliers不同于以往發(fā)現(xiàn)的Normal Outliers,表現(xiàn)為大于絕對值幾百的異常值并局限于個別的tokens中——
它們導(dǎo)致現(xiàn)有的量化算法(如SmoothQuant和OmniQuant)在將模型的權(quán)重和激活值量化為4位二進(jìn)制數(shù)時表現(xiàn)不佳。
對此,團(tuán)隊提出了一種新的量化方法,叫做DuQuant。
DuQuant通過學(xué)習(xí)旋轉(zhuǎn)和置換變換矩陣,在Activation矩陣內(nèi)部將outliers轉(zhuǎn)移到其他通道,最終得到平滑的激活矩陣,從而大幅降低了量化難度。
實驗顯示,使用DuQuant方法,在4位權(quán)重和激活量化的設(shè)置下,模型達(dá)到了SOTA。
同時,DuQuant的訓(xùn)練非??焖?,可以在50s內(nèi)完成7B模型的量化過程,即插即用。
背景
在每個Transformer塊的常見模塊中,多頭自注意力(MSA)和前饋網(wǎng)絡(luò)(FFN)基本上都由線性層組成,將其表示為:
其中是激活輸入,
表示權(quán)重矩陣。
模型量化通過將浮點數(shù)(FP16, BF16)表示的模型權(quán)重或激活值轉(zhuǎn)換為低位的浮點數(shù)或整數(shù)來減少內(nèi)存占用,權(quán)重激活量化可以通過使用低比特乘法的算子進(jìn)一步加快模型推理的速度。
該工作重點關(guān)注低比特整型量化,目標(biāo)是獲得更好的硬件支持。
具體來說, ??位量化過程將FP16張量??映射為低位整數(shù)???? :
符號? · ?表示最接近的舍入操作, ?是量化步長, ??表示零點。
遵循主流量化方法,作者對激活??采用逐token量化,對權(quán)重??采用逐通道量化,這意味著為??的每個token分配不同的步長( ??? ? ???x1),為??的每個輸出通道分配不同的步長。
動機(jī)(Motivation)
據(jù)作者介紹,他們首次在實驗中發(fā)現(xiàn),LLM FFN模塊中的down_proj layer存在明顯的Massive Outliers(非常大的激活值),表現(xiàn)為絕對值大于幾百的異常值并局限于個別的token中。
PS:先前工作發(fā)現(xiàn)Massive Outliers存在于每個transformer block的輸出中,DuQuant的作者進(jìn)一步將其定位在FFN模塊中。
論文:https://link.zhihu.com/?target=https%3A//eric-mingjie.github.io/massive-activations/index.html
這些Massive Outliers造成SmoothQuant和OmniQuant等算法在4bit WA量化中表現(xiàn)較差。
△圖1:Massive outliers顯著加大了低比特權(quán)重激活量化的難度
圖1(a)(b)對比了普遍常見的Normal Outliers,和在FFN中出現(xiàn)的Massive Outliers。
SmoothQuant通過將激活值除以每通道平滑因子并將其乘回權(quán)重矩陣,嘗試將量化難度從激活值轉(zhuǎn)移到權(quán)重。
具體來說,SmoothQuant使用逐通道的平滑對角矩陣,記為?? ,將原始線性層重新表達(dá)為:??=?? · ??=(?? ·??)(??-1 · ??),對角矩陣??中的元素???? 的計算方式為:
其中α是一個超參數(shù),表示遷移強(qiáng)度。
然而,作者觀察到在輸入端進(jìn)行這種轉(zhuǎn)移可能會導(dǎo)致權(quán)重矩陣也出現(xiàn)明顯的難以量化的outliers(如圖1(d)所示),這一問題的根源在于Massive Outliers使平滑因子???? 變得異常大。
此外,極大的outliers還可能導(dǎo)致基于優(yōu)化的方法出現(xiàn)梯度爆炸的問題,所以基于梯度優(yōu)化的OmniQuant和AffineQuant等工作會直接跳過down_proj layer,直接退化為SmoothQuant的處理方式。
這些preliminary experiments都表明需要一種更新更好的方式處理兩種outliers,特別是平滑掉down_proj輸入側(cè)的Massive Outliers。
方法
DuQuant提出通過學(xué)習(xí)旋轉(zhuǎn)和置換變換矩陣,在Activation矩陣內(nèi)部將outliers轉(zhuǎn)移到其他通道,最終得到平滑的激活矩陣,從而大幅度降低了量化難度。
(a) 逐步展示了DuQuant算法對Normal outlier的處理過程,(b) DuQuant顯著降低了Massive outlier,(c)一個Tony Example說明DuQuant有效降低了激活矩陣的量化難度。
△圖2:DuQuant算法說明
簡單來說,DuQuant算法包含三個步驟:
1)旋轉(zhuǎn)矩陣的構(gòu)造有效利用了特定outlier channel的位置索引,作者使用了分塊對角的旋轉(zhuǎn)矩陣,在每個block內(nèi)部通過貪心算法將outlier平攤到其他的channels中。
2)由于block size的限制,可能導(dǎo)致某些block在旋轉(zhuǎn)之后組內(nèi)的平均值大于其他blocks,因此作者進(jìn)一步使用通道置換技術(shù)重新分配activation channel,使用zigzag順序排列使各組均值的方差大幅減小。
3) 進(jìn)一步執(zhí)行一次旋轉(zhuǎn)變換達(dá)到更均勻的activation分布,從而大幅降低了量化難度。
旋轉(zhuǎn)矩陣:作者希望應(yīng)用旋轉(zhuǎn)矩陣??進(jìn)行行或列變換,減輕Normal Outliers和Massive Outliers的影響。
由于Massive Outliers通常隨機(jī)分布在激活空間中,直接找到能夠通過單次旋轉(zhuǎn)變換減輕outliers的最優(yōu)旋轉(zhuǎn)矩陣??是具有挑戰(zhàn)性的。
為了解決這一問題,作者采用帶有先驗知識的貪心搜索方法來計算旋轉(zhuǎn)矩陣,從而近似理想的旋轉(zhuǎn)矩陣??。
具體來說,的計算包括以下步驟:
1、識別outliers主要集中的特征維度 ,即:,其中, ??????表示??中第??行和第??列的元素。
2、基于搜索到的維度,構(gòu)建旋轉(zhuǎn)矩陣如下:
是用于交換激活值的第1列和第d(1) 列的交換矩陣,表示一個正交初始化的旋轉(zhuǎn)矩陣,其第一行均勻分布。
這樣做的目的是通過變換后減輕第1列中的outliers。
為了進(jìn)一步增加隨機(jī)性,保留減輕outliers后的第1列,并通過與隨機(jī)正交矩陣??’相乘,隨機(jī)旋轉(zhuǎn)其他列。
3、設(shè)N為貪心搜索的步數(shù),則近似的旋轉(zhuǎn)矩陣,其中
。每個???? 根據(jù)公式(2)和識別到的特征維度d(??) 構(gòu)建。
通過這種構(gòu)建方式,可以確保近似的最優(yōu)旋轉(zhuǎn)矩陣能夠有效減輕具有較大幅度的outliers,而不僅僅是使用隨機(jī)選擇的正交旋轉(zhuǎn)矩陣。
然而,直接構(gòu)建整個旋轉(zhuǎn)矩陣非常耗時,并且會導(dǎo)致大量的內(nèi)存開銷。
為了實現(xiàn)快速矩陣乘法,參考Training Transformer with 4ibts ,作者選擇以分塊的方式近似旋轉(zhuǎn)矩陣。
其中,表示第??個塊的方陣,該矩陣按照上述三步構(gòu)建。塊的數(shù)量K通過K=C??n/2n計算得出。
通道置換矩陣:盡管采用了塊對角旋轉(zhuǎn)矩陣來提高時間和存儲效率,但其專注于局部信息的特性帶來了進(jìn)一步減少outliers的潛在限制。
由于在每個小塊內(nèi)進(jìn)行的旋轉(zhuǎn)變換無法整合跨不同塊的信息,一個塊中可能有相對較大的outliers,而另一個塊中則有較小的outliers,導(dǎo)致不同塊之間存在較高的方差。
因此,作者提出利用通道置換矩陣平衡不同blocks之間outliers的幅度。
具體來說,在每個小塊中,將維度d??中最大的outlier記為O??。
同時, Mb??表示第??個塊中所有O??的平均值,其中??=1,2,……,K ,各個塊之間激活幅度的方差可以表示為:
作者引入了之字形置換矩陣P 。
具體來說,通過生成一個之字形序列,首先將激活值最高的通道分配給第一個塊,接著,將激活值次高的通道按遞減順序分配到后續(xù)的塊,直到第K個塊。
在到達(dá)最后一個塊后,順序反轉(zhuǎn),從下一個激活值最高的通道開始,按遞增順序分配。
這個往復(fù)模式貫穿所有塊,確保沒有單個塊持續(xù)接收最高或最低激活值的通道。
通過使用之字形置換,DuQuant實現(xiàn)了不同塊之間outliers的均衡分布,從而能夠使用額外的旋轉(zhuǎn)變換進(jìn)一步平滑outliers,如圖2所示。
需要注意的是:
1、通道置換其實是非常重要的一步,也很簡單快速(對于推理效率的影響很小,可見后面實驗部分),既可以避免像SpinQuant那樣復(fù)雜的訓(xùn)練流程,也比QuaRot的Hadamard旋轉(zhuǎn)性能表現(xiàn)更好。
2、旋轉(zhuǎn)矩陣和置換變換矩陣都是正交矩陣,保證了????輸出的不變性,作者還通過嚴(yán)謹(jǐn)?shù)睦碚撏茖?dǎo)了證明了兩種變換有效降低了量化誤差,具體證明可以閱讀Paper里面的Appendix。
實驗
在4-bit setting下達(dá)到了SOTA的效果,DuQuant驗證了LLaMA、Vicuna、Mistral系列模型,在PPL、QA、MMLU和MT-Bench等任務(wù)上都明顯提升了量化模型的性能。
此外作者還在LongBench評測了量化模型長文本生成的能力,DuQuant同樣大幅超過了baselines。
△DuQuant在LLaMA3-8B的低比特量化中顯著超過了基線方法
上面是DuQuant在LLaMA3模型的量化效果,更多的模型和task上的表現(xiàn)可以參見論文。
硬件測速也證明了DuQuant在pre-filing階段可以達(dá)到2.08倍的加速比,在decoding階段有效降低了3.50倍內(nèi)存開銷。
同時如右圖所示,DuQuant相比INT4推理帶來額外的10%左右速度開銷,微高于QuaRot,但帶來更多性能提升。
此外,DuQuant與使用Hadamard旋轉(zhuǎn)矩陣的QuaRot主要有以下兩點不同:
1、DuQuant構(gòu)造的旋轉(zhuǎn)矩陣?yán)昧讼闰炛R(具體的outlier channel索引),因此它可以比QuaRot更好地平滑激活空間,如下圖展示了DuQuant單次旋轉(zhuǎn)和Hadamard旋轉(zhuǎn)對LLaMA2-7B Attention Key_proj輸入的變換效果。
2、QuaRot依賴于耗時的GPTQ算法來提升性能,而作者引入的通道置換矩陣可以幫助DuQuant在極短時間內(nèi)進(jìn)一步平衡outliers的分布,兩種正交變換可以同時平滑權(quán)重矩陣的空間,降低權(quán)重矩陣的量化難度,從而取得更好效果。
小結(jié)一下,DuQuant通過兩種正交變換,利用activation激活值的先驗知識達(dá)到了比QuaRot中Hadamard旋轉(zhuǎn)更好的量化效果。
該工作獲得了審稿人一致的高度評價,并最終被選為Oral Presentation,錄取率0.4%。
更多細(xì)節(jié)歡迎查閱原論文。
項目主頁:https://duquant.github.io/
論文:https://arxiv.org/abs/2406.01721
代碼:https://github.com/Hsu1023/DuQuant