基于重排序的新量化方法RPTQ:實現(xiàn)大型語言模型的 3 比特量化
大型語言模型(LLMs)在各種任務上表現(xiàn)出色,但由于其龐大的模型規(guī)模,部署方面存在挑戰(zhàn)。
在這篇論文中,來自后摩智能、騰訊 AI Lab、華中科技大學、北京大學、伊利諾伊理工學院的研究人員發(fā)現(xiàn)量化大型語言模型的主要挑戰(zhàn)來自于通道之間不同的激活范圍,而不僅僅是離群值問題。
作者提出了一種新穎的基于重排序的量化方法 RPTQ,解決了量化大型語言模型激活的問題。RPTQ 通過重新排列激活中的通道,然后將它們分簇進行量化,從而降低通道范圍差異的影響。
此外,作者通過避免顯式重新排序來減少存儲和計算開銷。該工作首次將 LLM 模型的激活量化推向 3 比特。激活值的 3 比特量化同時也能與權重的 3 比特量化共同使用,大幅度降低了大型欲言模型的開銷。
論文地址:https://arxiv.org/abs/2304.01089
開源地址:https://github.com/hahnyuan/RPTQ4LLM
大規(guī)模語言模型(LLMs)在各種任務中展現(xiàn)出了卓越的性能,但由于它們的巨大模型大小,它們的部署面臨著挑戰(zhàn)。例如一個 66B 模型包含 660 億個參數(shù),需要大量內存進行存儲。另外隨著序列長度和批處理大小的增加,內存消耗問題變得更加嚴重,因為激活也需要消耗大量的內存,例如 Self-attention 中的鍵和值緩存(Key/Value Cache)。然而,單個 GPU 或服務器并沒有足夠的內存容量來存儲如此龐大的模型權重和中間激活。因此,LLM 需要被分割成多個塊并存儲在不同的設備中。由于權重和激活存儲在不同的設備上,在計算過程中需要在這些設備之間傳輸數(shù)據,導致顯著的帶寬和能量消耗。
為了克服 LLMs 在模型規(guī)模上的挑戰(zhàn),模型量化已成為一種有前途的方法。該技術涉及使用低位整數(shù)對 LLMs 的權重和激活進行量化,從而顯著降低存儲和運行這些模型的成本。具體而言,量化有助于減少保存張量的內存要求,并加速計算密集型操作,例如矩陣乘法和線性層。通過量化權重和激活,減少了存儲和通信開銷,提高了效率和推理速度。
圖 1 不同通道的數(shù)值分布情況。每個點都代表一個激活通道中的 (最大值,最小值)。
最近,GPTQ 使用 PTQ 成功地將 LLMs 的權重量化為 4 bit 或 3 bit。然而,對 LLMs 中的激活進行量化仍然是一項具有挑戰(zhàn)性的任務。
從圖 1 中可以得出兩個觀察結果:
1)一些通道具有顯著的異常值,其最大或最小值比其他通道大幾百倍。以前的研究也已經發(fā)現(xiàn)了這個問題并針對異常值提出了特殊處理。
2)不同的通道在數(shù)值范圍上有顯著差異。使用相同的量化參數(shù)來量化不同的通道可能會導致顯著的量化誤差。即使兩個通道具有相同的異常值絕對值,它們在數(shù)值范圍上也可能存在很大的變化。
將整個張量使用相同的量化參數(shù)進行量化的每張量量化技術可能不太有效。原因是將量化范圍設置為覆蓋大范圍的數(shù)值范圍可能導致數(shù)值較小的通道產生較大的量化誤差,而將其設置為覆蓋小范圍的數(shù)值范圍可能導致對異常值的顯著截斷,并導致顯著的量化誤差。例如,一個通道可能具有 - 100 到 - 50 的值范圍,而另一個通道可能具有 80 到 100 的值范圍。試圖通過將范圍從 - 100 到 100 量化來覆蓋它們的范圍將導致兩個通道產生顯著的量化誤差。這是以前的研究中尚未有效解決的一個挑戰(zhàn)。
圖 2 解決激活量化問題的不同方法對比。
為了解決激活中通道差異的問題,作者提出了一種新穎的基于重新排序的訓練后量化方法 RPTQ。
如圖 2 所示,該方法將數(shù)值范圍相似的通道聚類在一起,然后對每個聚類中的值使用相同的量化參數(shù)進行量化。為了實施基于重排序的量化方法,作者首先使用校準數(shù)據集作為推理輸入,從中導出每個激活通道的最大值和最小值。
接下來,他們采用 KMeans 算法將不同通道劃分為 g 個簇,基于每個通道的最大值和最小值形成的點。一旦建立了簇,他們就進行通道重排序,將來自同一簇的通道放置在相近的位置。這樣,具有類似最大值和最小值的通道被組合在一起,并共享一組通用的量化參數(shù)。在重排序過程之后,作者對每個簇內的激活進行量化。這種方法為每個簇單獨計算量化參數(shù)(縮放因子 s 和零點 z),確保這些參數(shù)專門針對相應的通道。
最終,該方法確保了每個簇的量化都得到優(yōu)化,減少了量化誤差。
圖 3:一重排權重和激活的量化 Transformer 層的推斷過程失意圖。重排索引用符號 R1 到 R5 表示。
顯式重排是一種運行時重新排列激活中通道的操作,需要將不同通道的數(shù)據從一個內存位置物理移動到另一個位置,因此對于具有大量通道的大型模型,重排過程可能非常耗時。此外,存儲源和目標激活張量會增加內存開銷。因此,作者提出了避免顯式重新排序的策略,從而降低了計算開銷,提高了推理效率。
如圖 3 所示,作者重新排序線性層的權重,使它們能夠直接按照排序順序產生激活。此外,作者修改了 LayerNorm 的方法,使其能夠直接產生重新排序的激活,從而省去了在推理過程中進行顯式通道調整。
作者在三種不同的位寬配置下評估了 OPT 的性能:W4A16、W4A8 和 W4A4。此外,作者還開發(fā)了一種新的量化方案,W4A4KV、W4A3KV 和 W3A3KV,只對主要內存的消耗 —— 鍵緩存和值緩存(Key/Value Cache)進行量化。根據表格,可以得出以下觀察結果:一般而言,隨著激活量化位寬的減少,模型的性能會下降。但在大多數(shù)情況下,這種退化并不顯著。對于某些任務,性能下降不到 1%,甚至有所提高。
LLM 的內存開銷來自三個方面:首先,設備內存中權重的存儲,可以通過量化來顯著減少。其次,在網絡執(zhí)行期間生成的臨時激活需要分配設備內存。這些臨時激活可以在使用后釋放,因此不會對整體內存使用造成顯著影響。最后,鍵和值緩存(Key/Value Cache)對預測后續(xù)單詞是必要的。當批次大小和序列長度很大時,鍵和值緩存占用了大部分內存。
表中展示了不同設置下的內存使用情況,可以發(fā)現(xiàn)較低比特的激活可以顯著減少內存使用,特別是在批次大小和序列長度較大的情況下。具體而言,當批次大小為 64,序列長度為 8192 時,OPT-66b 下的 W4A4 配置相比 W4A16 配置節(jié)省了超過 900GB 的內存。因此,采用 RPTQ 對激活量化可以極大地減少在長文本任務或大批量場景中的內存壓力。