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