大模型量化技術原理:總結

[toc]

近年來,隨著Transformer、MOE架構的提出,使得深度學習模型輕松突破上萬億規(guī)模參數(shù),從而導致模型變得越來越大,因此,我們需要一些大模型壓縮技術來降低模型部署的成本,并提升模型的推理性能。
模型壓縮主要分為如下幾類:

  • 模型剪枝(Pruning)
  • 知識蒸餾(Knowledge Distillation)
  • 模型量化

本系列將針對一些常見大模型量化方案(GPTQ、LLM.int8()、SmoothQuant、AWQ等)進行講述。

前面的一系列文章針對目前主流的一些量化方法進行了介紹。

基本概念

簡介

模型量化是一種用于減少神經(jīng)網(wǎng)絡模型大小和計算量的技術,將模型參數(shù)(如:權重)從高精度數(shù)據(jù)類型(如:float32)轉換為低精度數(shù)據(jù)類型(如:int8 或 fp4)。模型量化通過以更少的位數(shù)表示數(shù)據(jù),可以減少模型尺寸,進而減少在推理時的內存消耗,并且在一些低精度運算較快的處理器上可以增加推理速度,同時仍然可以保持模型的性能。

模型量化的粒度

  • per-tensor(又名 per-layer)量化:每層或每個張量只有一個縮放因子,張量內的所有值都被這個縮放因子量化。
  • per-channel 量化:卷積核的每個通道都有不同的縮放因子。
  • per-token 量化:針對激活而言,針對每一行進行量化。在LLM中,通常與per-channel 量化搭配使用,如:逐Token量化激活,逐通道量化權重。
  • per-group/group-wise:,以組為單位。正如 Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT 中所說的那樣,分組量化的一個特殊情況是,將每個密集矩陣視為一組,每個矩陣都可以有自己的量化范圍。而更普遍的情況是將每個密集矩陣按輸出神經(jīng)元進行分割,每個連續(xù)的 N 輸出神經(jīng)元作為一個組。比如:GPTQ、AWQ中使用128個元素為一組進行量化。有些地方也稱為子通道分組(Sub-channel-wise)量化,即將通道劃分為更小的子組,以實現(xiàn)更細粒度的精度控制。

下圖展示了不同的量化粒度;其中,d為模型大小/隱藏狀態(tài)維度;h是一個MHSA(多頭自注意)中的Head數(shù)。

下面展示了一些量化方法中不同量化對象的量化粒度:

image.png

模型量化對象

  • Weight:權重量化是最常見的量化對象。量化權重可達到減少模型內存占用空間。權重在訓練完后固定,數(shù)值范圍與輸入無關,可離線完成量化,通常相對容易量化;
  • Activation:實際上激活往往是占內存使用的大頭,因此量化激活不僅可以大大減少內存占用。更重要的是,結合權重量化可以充分利用整數(shù)計算獲得模型推理性能的提升。但激活輸出隨輸入變化而變化,需要統(tǒng)計數(shù)據(jù)動態(tài)范圍,通常更難量化。
  • KV Cache:除了權重和激活量化之外,在大語言模型中的 KV 緩存也會消耗不少的內存。 因此,量化 KV 緩存對于提高模型長序列生成的吞吐量至關重要。
  • Gradient:相對上面的量化對象,略微小眾一些,主要用于訓練場景。在訓練深度學習模型時,梯度通常是浮點數(shù),量化梯度可以在分布式計算中減少通信開銷,同時,也可以減少反向傳播時的開銷。

靜態(tài)量化與動態(tài)量化

通常,對于激活而言,靜態(tài)量化是指如果采用具有代表性的校準數(shù)據(jù)集來為其生成縮放因子和零點,這些參數(shù)在模型的整個生命周期中保持不變。靜態(tài)量化的優(yōu)點在于推理時的計算效率較高,因為它不需要在運行時動態(tài)計算量化參數(shù)。然而,由于量化參數(shù)是固定的,靜態(tài)量化可能會引入一些量化誤差,從而影響模型的精度

而動態(tài)量化是指在每次前向傳遞期間計算激活的最小值和最大值,以提供動態(tài)的縮放因子以實現(xiàn)高精度。動態(tài)量化的優(yōu)點在于它可以更準確地表示模型的激活值,因為它考慮了運行時的實際數(shù)據(jù)分布。然而,這種方法的缺點是可能會增加計算開銷,因為需要在運行時計算量化參數(shù)。動態(tài)量化適合于那些對模型精度要求較高的應用場景,尤其是當模型的輸入數(shù)據(jù)分布變化較大時。

目前,常見的是對激活使用靜態(tài)量化,其中最小/最大范圍是在離線校準階段計算的。但由于LLM中激活范圍差異巨大,將導致準確度顯著下降。

離線量化與在線量化

離線量化是指模型上線前進行量化并生成縮放因子,而在線量化是指模型運行時進行量化。

動態(tài)與靜態(tài)量化的區(qū)別在于是否使用校準集,而離線與在線量化的區(qū)別則是量化的時機不同。簡單理解就是說離線靜態(tài)量化是指在模型上線推理前使用校準集生成縮放因子,對權重和激活進行量化。在線動態(tài)量化是指在模型上線推理時,在每次前向傳播過程中實時生成縮放因子,對模型對權重和激活進行量化。
離線動態(tài)量化通常是指對權重在運行前先進行量化,對激活在運行時進行動態(tài)量化。

線性量化與非線性量化

根據(jù)量化數(shù)據(jù)表示的原始數(shù)據(jù)范圍是否均勻,還可以將量化方法分為線性量化和非線性量化。實際的深度神經(jīng)網(wǎng)絡的權重和激活值通常是不均勻的;因此,理論上使用非線性量化導致的精度損失更小,但在實際推理中非線性量化的計算復雜度較高,通常使用線性量化。
下面著重介紹線性量化的原理。假設 r 表示量化前的浮點數(shù),量化后的整數(shù) q 可以表示為:

q=clip(round(\frac{r}{s})+z,qmin,qmax)

其中,round(\cdot)clip(\cdot) 分別表示取整和截斷操作,q_{min}q_{max}是量化后的最小值和最大值。

s為縮放系數(shù),表示數(shù)據(jù)量化的間隔,其求解方式為 s=\frac{r_{max}-r_{min}}{q_{max}-q_{min}}r_{max}、r_{min}分別表示輸入浮點數(shù)據(jù)中的最大值和最小值, q_{max}、q_{min}分別表示量化后最大定點值和最小定點值。
z 是表示數(shù)據(jù)偏移的偏置。 z 為 0 的量化被稱為對稱量化, z 不為 0 的量化稱為非對稱量化。對稱量化可以避免量化算子在推理中計算z相關的部分,降低推理時的計算復雜度;非對稱量化可以根據(jù)實際數(shù)據(jù)的分布確定最小值和最小值,可以更加充分的利用量化數(shù)據(jù)信息,使得量化導致的損失更低。

量化數(shù)據(jù)類型

LLM主要有三種類型量化:

  • 僅權重量化:只量化每個線性層的權重張量W。
  • 權重激活量化:量化每個線性層的輸入激活X和權重張量W。
  • KV緩存量化:量化每個自注意力塊中的鍵張量K和值張量V。

下面列舉了業(yè)界的一些量化數(shù)據(jù)類型的典型方案。

針對僅權重量化:

  • 對于 W8A16 量化,代表方法有 MinMax
  • 對于 W6A16 量化,代表方法有 FP6-LLM
  • 對于 W4A16 量化,代表方法有 AWQ、GPTQ、SpQR、OmniQuant、QuIP#
  • 對于 W3A16 量化,代表方法有 GPTQ、SpQR、OmniQuant、QuIP#
  • 對于 W2A16 量化,代表方法有 OmniQuant、QuIP、QuIP#

針對權重激活量化:

  • 對于 W8A8 量化,代表方法有 LLM.int8()、SmoothQuant、ZeroQuant
  • 對于 W6A6 量化,代表方法有 OmniQuant
  • 對于 W4A8 量化,代表方法有 QoQ
  • 對于 W4A4 量化,代表方法有 Atom 、QuaRot、OmniQuant

針對 KV Cache量化:

  • KV8:INT8(LMDeploy、TensorRT-LLM)、FP8(TensorRT-LLM、vLLM)
  • KV4:Atom、QuaRot、QoQ
  • KV3:KVQuant
  • KV2:KVQuant、KIVI

量化分類

根據(jù)應用量化壓縮模型的階段,可以將模型量化分為:

  • 量化感知訓練(Quantization Aware Training, QAT):在模型訓練過程中加入偽量化算子,通過訓練時統(tǒng)計輸入輸出的數(shù)據(jù)范圍可以提升量化后模型的精度,適用于對模型精度要求較高的場景;其量化目標無縫地集成到模型的訓練過程中。這種方法使LLM在訓練過程中適應低精度表示,增強其處理由量化引起的精度損失的能力。這種適應旨在量化過程之后保持更高性能。
  • 量化感知微調(Quantization-Aware Fine-tuning,QAF):在微調過程中對LLM進行量化。主要目標是確保經(jīng)過微調的LLM在量化為較低位寬后仍保持性能。通過將量化感知整合到微調中,以在模型壓縮和保持性能之間取得平衡。
  • 訓練后量化(Post Training Quantization, PTQ):在LLM訓練完成后對其參數(shù)進行量化,只需要少量校準數(shù)據(jù),適用于追求高易用性和缺乏訓練資源的場景。主要目標是減少LLM的存儲和計算復雜性,而無需對LLM架構進行修改或進行重新訓練。PTQ的主要優(yōu)勢在于其簡單性和高效性。但PTQ可能會在量化過程中引入一定程度的精度損失。

模型量化方法精要

最近兩年,業(yè)界誕生了很多關于LLM量化方法,比如:LLM.int8() 和 SmoothQuant 都屬于 round-to-nearest (RTN) 量化。針對激活中的離群值,SmoothQuant 給出了與 LLM.int8() 不同的解題思路。既然激活的量化比權重的量化難得多,那么可以通過一個平滑系數(shù),把二者的難度綜合一下。GPT-Q 則是把量化問題視作優(yōu)化問題,逐層尋找最優(yōu)的量化權重。AWQ方法則基于不是所有權重都是同等重要的這一發(fā)現(xiàn),其中只有 0.1%-1% 的權重(salient weights)對模型精度貢獻更大,并且這些權重取決于激活值分布而不是權重分布。該方法的量化過程類似于 SmoothQuant,差異主要在于 scale 是基于激活值分布計算得到的。而 SmoothQuant 的 scale 是在校準樣本上根據(jù)權重和激活值通過公式計算獲得。

下面總結了目前業(yè)界主流的大模型量化方法。

RTN

RTN(Round to Nearest)量化是最簡單的量化方法,就是采取四舍五入的方式,把量化權重近似到最近的整數(shù)上。對于LLM而言,由于大量異常值的存在,如果單獨使用RTN量化,對精度影響較大。通常會采用一些方式抑制異常值之后,再使用RTN量化。

LLM-QAT

特點:訓練感知量化、無數(shù)據(jù)知識蒸餾、對稱 MinMax 均勻量化(線性量化)、逐通道權重量化,逐 Token 激活量化,逐 Token KV緩存量化

大語言模型中,權重和激活都存在顯著的異常值。這些異常值對量化過程有顯著影響,因為它們會增加量化步長,同時降低中間值的精度。因此,在量化過程中裁剪這些異常值不利于 LLM 的性能。

在訓練的初始階段,任何基于裁剪的方法都會導致異常高的困惑度,從而丟失大量信息,并且通過事實證明很難通過微調來恢復。 因此,選擇保留這些異常值。

此外,在具有門控線性單元(GLU)的模型中,激活權重大多是對稱分布的。 因此,為權重和激活選擇對稱 MinMax 量化,對權重采用逐通道量化,對激活采用逐 Token 量化。

同時,大語言模型推理工程中的KV緩存也會消耗不少的內存,對于 KV 緩存進行逐 Token量化,Key和Value是由 Token 生成的。 在生成過程中,當前的 Key 和 Value 都會被量化,并存儲它們對應的縮放因子。在 QAT 的訓練過程中,對 key 和 value 的整個激活張量進行量化。并通過將量化函數(shù)集成到梯度計算中,確保使用量化的鍵值對進行有效的訓練。

QLoRA

特點:量化感知微調、分頁優(yōu)化器、雙量化

QLoRA 將預訓練模型量化為 4 比特,然后添加一小組可學習的LoRA權重,這些權重通過量化權重的反向傳播梯度進行微調。無論何時使用 QLoRA 權重張量,都會將張量反量化為 BFloat16,然后執(zhí)行 16 位矩陣乘法。

在QLoRA 中,提出了兩種技術實現(xiàn)來保證 4 比特微調的精度——NF4量化和雙量化。NF4數(shù)據(jù)類型對正態(tài)分布數(shù)據(jù)比INT4/FP4更優(yōu)。雙量化對第一次量化后的那些常量再進行一次量化,進一步減少存儲空間。

此外,還引入了分頁優(yōu)化器,以防止梯度檢查點期間的內存峰值,從而導致內存不足的錯誤;在過去,這些錯誤使得大模型難以在單臺機器上進行微調。使用此功能為優(yōu)化器狀態(tài)(Optimizer)分配分頁內存,然后在 GPU 內存不足時將其自動卸載到 CPU 內存,并在優(yōu)化器更新需要時將其加載回 GPU 內存。

LLM.int8()

特點:W8A8、推理性能差、在模型加載時進行量化、不需要校準集

LLM.int8()是一種采用混合精度分解的量化方法。該方案先做了一個矩陣分解,對絕大部分權重和激活用8bit量化(vector-wise)。對離群特征的幾個維度保留16bit,對其做高精度的矩陣乘法。

LLM.int8() 通過三個步驟完成矩陣乘法計算:

  • 從輸入的隱含狀態(tài)中,按列提取異常值 (離群特征,即大于某個閾值的值)。
  • 對離群特征進行 FP16 矩陣運算,對非離群特征進行量化,做 INT8 矩陣運算;
  • 反量化非離群值的矩陣乘結果,并與離群值矩陣乘結果相加,獲得最終的 FP16 結果。

GPTQ

特點:W4A16、量化速度慢、離線靜態(tài)量化

GPTQ(論文:GPTQ: ACCURATE POST-TRAINING QUANTIZATION FOR GENERATIVE PRE-TRAINED TRANSFORMERS) 是一種僅權重量化方法,其中模型權重被量化為 int4 數(shù)值類型,而激活值則保留在 float16。在推理階段,模型權重被動態(tài)地反量化回 float16 并在該數(shù)值類型下進行實際的運算;同 OBQ 一樣,GPTQ還是從單層量化的角度考慮,希望找到一個量化過的權重,使的新的權重和老的權重之間輸出的結果差別最小。

GPTQ 將權重分組(如:128列為一組)為多個子矩陣(block)。對某個 block 內的所有參數(shù)逐個量化,每個參數(shù)量化后,需要適當調整這個 block 內其他未量化的參數(shù),以彌補量化造成的精度損失。因此,GPTQ 量化需要準備校準數(shù)據(jù)集。

GPTQ 量化過程如下圖所示。首先,使用 Cholesky 分解求解 Hessian 矩陣的逆,然后在給定的步驟中對連續(xù)列的塊(粗體)進行量化,并在該步驟結束時更新剩余的權重(藍色)。量化過程在每個塊內遞歸應用,白色中間列表示當前正在被量化。

GPTQ 的創(chuàng)新點如下:

  • 取消貪心算法:OBS 采用貪心策略,先量化對目標影響最小的參數(shù);但 GPTQ 發(fā)現(xiàn)直接按順序做參數(shù)量化,對精度影響也不大。這項改進使得參數(shù)矩陣每一行的量化可以做并行的矩陣計算(這意味著我們可以獨立地對每一行執(zhí)行量化。即所謂的 per-channel quantization)。對于大模型場景,這項改進使得量化速度快了一個數(shù)量級;
  • Lazy Batch-Updates:OBQ 對權重一個個進行單獨更新,作者發(fā)現(xiàn)性能瓶頸實際在于GPU的內存帶寬,而且同一個特征矩陣W不同列間的權重更新是不會互相影響的。因此作者提出了延遲批處理的方法,通過延遲一部分參數(shù)的更新,一次處理多個(如:128)列,來緩解帶寬的壓力,大幅提升了計算速度。
  • Cholesky(喬萊斯基) 分解:用 Cholesky 分解(一種分解矩陣的方法)求海森矩陣的逆,提前計算好所有需要的信息,在增強數(shù)值穩(wěn)定性的同時,后續(xù)更新的過程中再計算,進一步減少了計算量。

GPTQ的偽代碼如下所示。

SmoothQuant

特點:離線靜態(tài)量化、逐通道對權重縮放,逐 Token對激活縮放,W8A8(對權重進行per-tensor或per-channel,對激活進行per-token或per-tensor)

SmoothQuant是一種同時確保準確率且推理高效的訓練后量化 (PTQ) 方法,可實現(xiàn) 8 比特權重與激活 (W8A8) 量化。

針對大模型而言,權重很容易量化,對于激活值,由于異常值的存在,導致激活則較難量化。作者對比了 per-channel、per-token、per-tensor 激活量化方案。在這幾種不同的激活量化方案中。per-tensor量化是最高效的實現(xiàn)方式。但只有逐通道量化(per-channel)保留了精度,但它與 INT8 GEMM Kernel 不兼容。即per-channel量化不能很好地映射到硬件加速的GEMM內核(硬件不能高效執(zhí)行,從而增加了計算時間)。

為了進行 vector-wise quantization 以有效利用 INT8 GEMM Kernel,我們只能使用外部維度(即激活的維度 T 和 權重的維度 C_0)的縮放因子,不能使用內部維度(即通道內維度 C_i)。因此,先前的工作對激活都采用了per-token量化,但并不能降低激活的難度。

于是 SmoothQuant 提出了一種數(shù)學上等價的逐通道縮放變換(per-channel scaling transformation),通過引入平滑因子s來平滑激活異常值,數(shù)學上等效的變換將量化難度從激活轉移到權重上,從而使模型易于量化,保持精度的同時,還能夠保證提升推理速度。

根據(jù)量化方式不同,作者提出三種策略 O1、O2、O3,其計算延遲依次降低。SmoothQuant的O1和O2級成功地保持了浮點精度,而O3級(per-tensor static)雖然延遲更低,但平均精度下降了0.8%,可能是因為靜態(tài)收集的統(tǒng)計數(shù)據(jù)與真實評估樣本的激活統(tǒng)計數(shù)據(jù)之間的差異。

在我們實際使用過程中,在SmoothQuant平滑后,對應的存儲和計算精度都可以是 INT8 或者 FP8,可以利用 INT8 或者 FP8 的 TensorCore 進行計算。在實現(xiàn)細節(jié)上,權重支持 Per-tensor 和 Per-channel 的量化,激活值支持 Per-tensor 和 Per-token 的量化。

AWQ

特點:W4A16,per-group量化(INT4-g128),量化速度慢

AWQ(AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration)方法源于“權重對于LLM的性能并不同等重要”的觀察,存在約(0.1%-1%)顯著權重對大模型性能影響太大,通過跳過這1%的重要權重(salient weight)不進行量化,可以大大減少量化誤差。

具體如下圖所示,左邊的(a)使用RTN量化誤差較大,中間的(b)通過保留1%的重要權重不量化,量化誤差明顯降低。但是該方法采用混合精度計算并不是硬件高效的方式。右邊則是使用AWQ進行激活感知的僅權重(即W4A16)量化方法,通過逐通道縮放以保護顯著權重來減少量化誤差,這種方法不存在硬件效率低下的問題。

盡管我們只做了權重量化,但要找到顯著的權重通道,我們應該根據(jù)激活分布而不是權重分布,與較大激活幅度(activation magnitudes)相對應的權重通道更加突出,因為它們處理了更重要的特征。

對于原始的RTN量化,y=Q(\mathbf{w})\mathbf{x} = \Delta \cdot \text{Round}(\frac{\mathbf{w}}{\Delta}) \mathbf{x}

作者通過對顯著權重引入一個s,進行公式的等價變化。即將 w 與 s (s>1)相乘, 然后,再用 x 除以 s。具體如下:

Q(w\cdot s)\cdot \frac{x}{s} = \Delta^{'} \cdot \text{Round}(\frac{ws}{\Delta^{'}}) \cdot x \cdot \frac{1}{s}

最終發(fā)現(xiàn)與原始的量化誤差比值為 \frac{\Delta^{'}}{\Delta} \cdot \frac{1}{s}。給定 \Delta^{'}\approx\Deltas>1, 顯著權重 w 的相對誤差較小。

為了同時考慮顯著權重和非顯著權重,作者選擇自動搜索每個輸入通道最佳縮放因子,使某一層量化后的輸出差最小。從形式上看,希望優(yōu)化以下目標:

\mathbf{s}^* = arg_{\mathbf{s}}min \mathcal{L}(\mathbf{s}), \quad \mathcal{L}(\mathbf{s})=\lVert Q(\mathbf{W}\cdot diag(\mathbf{s})) (diag(\mathbf{s})^{-1} \cdot \mathbf{X}) - \mathbf{W}\mathbf{X} \lVert

由于量化函數(shù)不可微,我們無法直接用梯度反向傳播來優(yōu)化問題。有一些技術依賴于近似梯度,但我們發(fā)現(xiàn)它仍然存在收斂不穩(wěn)定的問題。

為了使這一過程更加穩(wěn)定,我們通過分析影響縮放因子選擇的因數(shù),為最佳縮放比例定義了一個搜索空間。

\mathbf{s}=\mathbf{s_X}^{\alpha}, \quad \alpha^*=\arg_{\alpha} min\mathcal{L}(\mathbf{s_X}^{\alpha})

其中,s僅與激活s_X的大小有關,s_X是激活的平均幅值(每個通道),這里僅使用單個超參數(shù)α來平衡顯著通道和非顯著通道的保護。我們可以通過在 [0, 1] 區(qū)間內進行快速網(wǎng)格搜索(grid search)來找到最佳的 α(0 表示我們不進行縮放;1 對應于最激進的縮放)。

此外,作者還通過應用權重剪裁來進一步最小化 MSE 誤差,因為剪裁權重可以進一步幫助減少 Q(w\cdot s)\cdot \frac{x}{s} = \Delta^{'} \cdot \text{Round}(\frac{ws}{\Delta^{'}}) \cdot x \cdot \frac{1}{s} 中的 \Delta^{'};從而減少量化誤差。

SpQR

特點:僅權重量化、雙層量化(對量化元數(shù)據(jù)進一步進行量化)、非對稱(最小-最大)量化

之前的 LLM 量化算法同等對待低敏感度權重和高敏感度權重;然而這可能會導致次優(yōu)量化。

SpQR 提出隔離此類異常值,并以 SpQR 格式有效地對給定模型進行編碼。為了利用所得結構,還開發(fā)了一種基于壓縮稀疏行(CSR)格式的專門稀疏矩陣乘法算法。為了使用 SpQR 進行逐個token生成,將這種稀疏算法與 3-4 比特權重的密集量化矩陣乘法結合起來。與LLM 生成 16 比特推理相比,SpQR 將 LLMs 的內存占用減少了約 3.4 倍或更多,從而實現(xiàn)小于1%的精度損失。

具體工作原理如下:

  • 首先,確定并隔離離群權重,發(fā)現(xiàn)對其量化會導致不成比例的高誤差。因此,將這些權重保持高精度,使用一個稀疏矩陣單獨保存;而其他權重存儲在低得多的精度中,例如:3 比特格式。
  • 其次,由于重要參數(shù)往往以行或者列聚集,因此實現(xiàn)了一種具有非常小的組大小(group size)的分組量化的變體,例如:16 個連續(xù)元素。同時,將量化縮放(scales)本身量化為 3 比特表示(壓縮量化元數(shù)據(jù))。

ZeroQuant

特點:W8A8、對權重矩陣使用分組量化、對激活進行逐Token動態(tài)量化,不需要校準激活范圍

對于權重矩陣進行分組量化,將整個權重矩陣分成64或128組。同時在設計時考慮了 GPU Ampere 架構(例如: A100)的硬件約束,計算單元基于 Warp Matrix Multiply and Accumulate (WMMA) 的分片大小,實現(xiàn)最佳加速。

對于激活采用逐Token量化并動態(tài)計算每個Token的最小/最大范圍,以減少激活引起的量化誤差。同時,為了降低應用逐 Token 量化導致的量化和反量化成本(引入了額外的操作,導致 GPU 計算單元和主存之間產(chǎn)生昂貴的數(shù)據(jù)移動開銷),ZeroQuant 構建了一個高度優(yōu)化的推理后端,例如:采用Kernel融合技術將量化算子與其先前的算子(如:層歸一化)融合,以減輕逐 Token 量化的數(shù)據(jù)移動成本。類似地,在將最終 FP16 結果寫回到下一個 FP16 算子(如:GeLU)的主存之前,使用權重和激活量化縮放因子縮放 INT32 累加,以減輕不同 GeMM 輸出的反量化成本。

ZeroQuant-V2

特點:新增了模型參數(shù),拖累了推理的性能

一種稱為低秩補償(LoRC)的優(yōu)化方法,該方法通過新增兩個兩個低秩矩陣來近似量化誤差,該方式以最小的模型參數(shù)大小的增加來提升模型質量的恢復。同時兩個低秩矩陣也可以量化為 8 比特,而不會出現(xiàn)任何性能差異。

ZeroQuant-FP

特點:W4A8、FP4、FP8

通過調查顯示,對于 LLMs,FP8 激活始終優(yōu)于其INT8激活 ,并且在參數(shù)超過 10 億的模型中,性能優(yōu)勢變得更加明顯。對于權重量化,FP4 表現(xiàn)出與 INT4 相當(即使不是更優(yōu))的性能,從而簡化了在 H100 等支持 FP 的硬件上的部署。

本文對權重進行FP4量化對激活進行FP8量化。選擇使用的方法與 GPTQ 保持一致。根據(jù) ZeroQuant-V2 ,本文應用了細粒度權重量化(FGQ),并對激活進行 token-wise 量化。此外,本文還將研究ZeroQuant-V2中提出的附加特征 LoRC(低秩補償),其目的是通過采用低秩矩陣分解來減少權重的量化誤差。

由于 W4A8 在 H100 NVIDIA 硬件中的實際軟件實現(xiàn)是需要轉換 W 的 FP4 以匹配 A 中使用的 FP8 精度。直接反量化然后再次量化的方法可能會對推理效率產(chǎn)生不利影響。

為了解決這個問題,我們提出了位移(bit-shifting)方法。這意味著,我們不讓等式(Q(x) = INT(x ? Z)/S ? Z)中定義的 S 為任何實值比例因子,而是將 S 限制為 2 的冪,即 S = 2^n,n ∈ N(當n為負數(shù)時,S可以表示分數(shù);當n不為負數(shù)時,S可以表示整數(shù)。)。

本文實現(xiàn)了兩種方法:

  • (M1) 映射到由 2 的冪表示的最接近的值,即讓新的scale為 \hat{S} = 2^{\lceil \log_2(S)\rceil}
  • (M2) 首先收集scales形成向量 \mathbf{S} = [S_1, S_2, \ldots, S_n] 。然后取組中的最大值(通常,該集合由矩陣的(多)行組成),記為S_{\max},將這些元素S_{\max}/S_i調整為2的冪表示,然后定義 \hat{S}_i = S_{\max}/ 2^{\lceil \log_2(S_{\max}/S_i)\rceil}。與 (M1) 相比,這提供了更好的近似值。

注意:這種使用 2 的冪的限制,無論是使用 (M1) 還是 (M2),都可以簡化計算,特別是在基于二進制邏輯操作的數(shù)字系統(tǒng)中。這是優(yōu)化計算效率和保持模型性能的方法的關鍵要素。

FP6-LLM(W6A16)

特點:W6A16

FP6量化的一個挑戰(zhàn)是缺乏針對這種不規(guī)則位寬的高效GPU KERNEL設計。在 FP6-LLM 中設計并實現(xiàn)了TC-FPx,第一個具有 Tensor Core 支持的用于FP6和各種量化位寬(6位、5位、3位等)的浮點權重的GPU系統(tǒng)設計方案,緩解了LLM推理期間的“內存墻”問題。TC-FPx打破了底層GPU硬件的限制,允許GPU支持涉及任意位寬模型權重的矩陣乘法計算。在TC-FPx中,Tensor Cores用于矩陣乘法的密集計算,而SIMT Cores在運行時有效地用于權重反量化,將模型權重反量化為FP16類型,Tensor Core基于此進行計算。它具有以下關鍵創(chuàng)新:

  • 運行前比特層級的數(shù)據(jù)排布轉換。用以解決權重具有不規(guī)則位寬時不友好的內存訪問挑戰(zhàn),實現(xiàn)GPU內存的最優(yōu)訪問;
  • 運行時高效的SIMT計算。用以最小化權重反量化的運行時開銷;
  • 全棧的高效流水線設計。其 SIMT Core 計算、Tensor Core 計算和GPU內存訪問進行高效調度,最大程度提升性能。

平均而言, FP6 kernel 在 NVIDIA A100 GPU 上進行(因decoder的矩陣形狀狹長而導致參數(shù)矩陣的訪存成為瓶頸的)矩陣乘法時,處理速度比FP16 cuBLAS 基準提高了2.1倍。值得注意的是,通過FP6量化實現(xiàn)的 FP6 kernel 使LLaMA-70b 模型能夠在單個 A100 GPU 上運行。這使得其在批處理大小小于32的LLM推理任務中,性能比FP16基準高出1.69到2.65倍。

盡管FP6量化帶來了顯著的好處,但當前實現(xiàn)仍面臨一些限制。值得注意的是,在 GEMM 因批處理較大或有充足的GPU內存而使得瓶頸變?yōu)門ensor Core計算時,本文的僅權重量化kernel可能無法保持其性能優(yōu)勢,尤其是與廠商的優(yōu)化庫如cuBlas相比。然而,本文系統(tǒng)的低內存占用仍是一個關鍵優(yōu)勢。目前僅支持非混合專家(Non-MoE)結構。此外,當前系統(tǒng)僅與FP16輸入模型兼容,因為當前實現(xiàn)的FP6 Kernel僅支持處理FP16的激活。

KIVI

特點:在線量化、對Token的KV緩存進行分組,在組內對K緩存逐通道量化,對V緩存逐Token量化,KV2

KIVI開發(fā)了一種 2 位非對稱 KV 緩存量化方法。通過實驗證明對 Key 緩存按通道進行量化,對 Value 緩存按Token進行量化能夠有效保持模型的精度。

由于LLM新生成的Token的Key和Value緩存是按順序到達的。從實現(xiàn)的角度來看,逐Token的Value緩存量化可以與流式場景很好地結合在一起,新量化的張量按Token維度直接附加到現(xiàn)有的量化的Value緩存中。然而,對于逐通道的 Key 緩存量化,量化過程跨越不同的Token,因此,不能直接在流式場景中實現(xiàn)。為了解決這個問題,KIVI 將 Token 的KV緩存分成兩部分,即分組部分和余留部分。分組部分將每 G 個 Token 的 KV 緩存分為一組。在組內分別進行逐Token的Value緩存量化和逐通道的Key緩存量化。而余留部分則保留全精度不進行量化。

IntactKV

特點:保持關鍵詞元的KV緩存無損

IntactKV先使用全精度模型生成關鍵詞元的無損 KV 并將其緩存下來,量化模型在推理時就能直接使用無損的關鍵詞元表征,從而有效提升量化模型精度。通過利用LLM推理時的公共前綴防止給量化模型的推理帶來任何額外開銷。即IntactKV只包含公共前綴,那么全精度模型在生成IntactKV后就可以被釋放。

此外,緩存的IntactKV還可以作為模型的額外參數(shù)做校準來進一步彌補量化誤差。比如:在大小為128的校準集上做輕量化訓練,可學習參數(shù)僅為緩存下來的IntactKV,損失函數(shù)采用量化模型和全精度模型輸出的 MSE 損失。

KVQuant

特點:離線量化、基于校準集量化無需進行分組

KVQuant 通過結合幾種新穎的方法來緩解 KV 緩存量化的精度損失。具體的優(yōu)化技術如下:

一、逐通道(Per-Channel)對 Key 進行量化,通過調整 Key 激活的量化維度以更好地匹配分布;按通道對Key進行量化也在同期的工作KIVI中被探索,該工作將同一通道中的大幅度值組合在一起以最小化量化誤差。他們的按通道量化方法需要進行細粒度分組,同時保持KV緩存的一部分為fp16精度。而本工作則展示了通過利用離線校準集,可以準確地執(zhí)行按通道量化,而不需要進行分組。

二、在 RoPE 之前對 Key 進行量化,在旋轉位置嵌入之前量化Key激活,以減輕其對量化的影響;同時,為了能夠在RoPE之前量化Key,作者開發(fā)了一個融合Kernel,以在反量化后高效應用RoPE。

三、非均勻 KV 緩存量化,通過導出每層敏感度加權的非均勻數(shù)據(jù)類型,以更好地表示分布;

四、按向量(Per-Vector)密集和稀疏量化,分別隔離每個向量的異常值,以最大限度地減少量化范圍中的偏差。

五、Attention Sink 感知量化,由于 Attention Sink 現(xiàn)象,模型對第一個Token中的量化誤差異常敏感。通過僅保留第一個Token為FP16 來確保模型的精度。

六、在逐通道量化中,更新在線縮放因子是具有挑戰(zhàn)性的,因為每個傳入通道對應的縮放因子可能需要在 KV 緩存中添加新Token時進行更新。因此,離線(即在運行推理之前使用校準數(shù)據(jù))計算統(tǒng)計數(shù)據(jù)。采用逐通道量化有效地進行離線校準,從而避免了在線更新縮放因子的需要。對于逐Token量化,由于存在異常的 Value tokens ,離線校準縮放因子是具有挑戰(zhàn)性的。因此,每個傳入Token在線計算縮放因子和異常值閾值。通過卸載到CPU來有效地在線計算每個Token的異常值閾值。通過利用定制的量化函數(shù)實現(xiàn)來壓縮激活,可以在線執(zhí)行逐 Token 的 Value 量化而不會影響性能。

Atom

特點:W4A4KV4、對異常值應用INT8量化

為了在保持準確性的同時將LLMs量化到極低比特精度,Atom結合了一系列針對LLM特性量身定制的量化機制。具體如下:

一、通過對權重和激活進行混合精度量化與通道重排序,提高量化準確性。同時由于8位(如:FP8和INT8)足以表示異常值,因此對異常值應用INT8量化。

二、細粒度分組量化將矩陣分成子組并在每個子組內獨立進行量化,在準確性提升和反量化開銷之間提供了權衡。

三、采用動態(tài)量化,為每次推理中的每個激活矩陣定制量化參數(shù)。為了控制動態(tài)量化的開銷,作者像ZeroQuant的實現(xiàn)一樣,將量化操作融合到先前的算子中。由于非對稱量化可能會導致顯著的運行時開銷,因為需要大量的額外計算。為了在吞吐量和準確性之間取得平衡,作者采用具有精心選擇的裁剪閾值進行對稱量化;同時,還在量化權重矩陣時引入了GPTQ,因為這是一個離線過程,可以在不犧牲運行時效率的情況下提升準確性。

四、對KV緩存以注意力頭的粒度應用非對稱低比特量化,以保持高精度。

QuaRot

特點:W4A4KV4

由于量化激活很困難,因為它們有較大的異常值。以前的工作依賴于使用校準集來表征異常特征,并在推理期間將它們保留在更高的精度。而本文通過使用隨機Hadamard變換旋轉模型輸入來解決異常特征問題。作者利用計算不變性的思想,將Hadamard變換融合到權重矩陣中,從而得到一個沒有異常特征的等效網(wǎng)絡。這使得權重、激活和KV緩存可以量化到4比特,而模型精度損失很小。QuaRot由兩個階段組成。

  • 第一階段,對模型權重進行運算(以全精度),并在模型的前向傳播中插入兩個額外的哈達瑪(Hadamard)運算(哈達瑪矩陣是一種方塊矩陣。它的矩陣元素僅包含1或-1。其矩陣中不同的行具備正交性質),有效地抑制了異常值通道。
  • 第二階段,使用某種現(xiàn)有方法(GPTQ、RTN等)量化權重,并在前向傳播中添加量化操作以實現(xiàn)激活的在線量化。

默認情況下,使用GPTQ量化權重,而激活則使用簡單的RTN方案進行在線量化。

QoQ

特點:W4A8KV4

為了實現(xiàn) W4A8KV4 量化精度的理論吞吐量優(yōu)勢,同時不犧牲大語言模型的有效性。QoQ算法采用漸進式分組量化、SmoothAttention和各種通用量化優(yōu)化功能。

具體如下:

漸進式分組量化:給定權重張量,首先應用逐通道(per-channel)對稱INT8量化,然后,進一步在中間權重張量上應用逐組(per-group)非對稱INT4量化。對于 W4A8 GEMM 計算,4位量化權重張量將首先根據(jù)上述方程反量化為中間8位量化權重張量,然后執(zhí)行INT8矩陣乘法,就好像是 W8A8 逐通道(per-channel)量化一樣。此外,QoQ引入了一個保護范圍,允許將反量化操作融合到 W4A8 GEMM Kernel 中,實現(xiàn)全寄存器級并行,最小化CUDA Core開銷。

SmoothAttention:由于Key矩陣在每個Attention頭中都有固定的異常值通道。受SmoothQuant的啟發(fā),作者提出通過逐通道(per-channel)因子縮小 Key 緩存中的異常通道。為了消除SmoothAttention縮放額外Kernel調用開銷,將縮放因子融合到前一層的權重中。

LLM量化通用優(yōu)化:塊輸入模塊旋轉(受Quarot、Quip的啟發(fā),通過乘以旋轉矩陣來旋轉塊輸入激活)、塊輸出模塊平滑(受SmoothQuant的啟發(fā))、激活感知的通道重排序(使得具有相似顯著性的通道在同一個量化組,降低精度損失)、權重裁剪(減少量化誤差)。

量化對大模型的影響

該部分參考:Evaluating Quantized Large Language Models

量化對模型精度的影響

  • 越大的模型對于權重和KV Cache量化容忍度更高,而對權重-激活值量化容忍度更低。出現(xiàn)這種現(xiàn)象的原因可以通過數(shù)據(jù)分布發(fā)現(xiàn):模型越大,分布在權重和KV Cache中的離群值越少,而分布在激活值中的離群值越多。
    • 小模型的 INT4 僅權重量化會導致精度大幅下降,但這種影響會隨著模型大小的增加而減弱。
    • INT8 激活導致小型模型的準確度下降最小,但較大的模型表現(xiàn)出更大的下降。
  • 利用專家混合(MoE)技術增加模型大小并不一定增強模型對量化的容忍度。
  • 在大多數(shù)任務上,大部分LLMs可以通過W4或KV4量化保持其性能。當將LLMs量化到W3或KV3時,所有模型家族中小型模型的性能都會明顯下降。此外,對于W2或KV2,大多數(shù)模型都會經(jīng)歷顯著的性能損失。
  • 對于權重-激活量化,W4A8 可以達到良好性能。W4A4量化將嚴重影響LLMs的效果。在具有大批量大小和長文本的實際應用中,一種常見做法是同時量化權重和KV緩存。對于短文本任務,W8KV4幾乎無損失。對于長文本任務,W8KV8是更好的選擇。

量化對不同任務類型能力的影響

自然語言處理能力

基本自然語言處理能力包括語言建模、自然語言理解、自然語言生成能力。

對于多數(shù)自然語言處理任務,大多數(shù)大模型可以采用W4、W4A8、KV4、W8KV4量化位寬,幾乎沒有性能損失(<2%)。

當使用極低的位寬時,如W2或W4A4,若想使用SOTA量化方法將模型性能恢復到類似于FP16的水平是一個很大的挑戰(zhàn)。

涌現(xiàn)能力

大模型的涌現(xiàn)能力包括上下文學習、指令跟隨、多步推理、自我校準能力。四類涌現(xiàn)能力對于量化的容忍度由高到低依次為:上下文學習指令跟隨>多步推理自我校準。

上下文學習任務:

對于上下文學習任務,適當增加例子數(shù)量(由0到5)可以提升模型(或量化模型)的性能;但例子過多(~10個)時模型性能不會持續(xù),甚至略有下降。

多步推理任務:

在多步推理任務中,數(shù)學推理對于量化的容忍度低于常識推理。對于數(shù)學推理任務,模型量化后會出現(xiàn)一些量化前沒有出現(xiàn)的錯誤,主要的錯誤類型包括抄寫錯誤、漏看條件、計算錯誤、邏輯錯誤。

總的來說,對于較小的模型(小于13B),W8或KV8適合于維持多步推理和自我校準能力。對于較大的模型(大于13B),W4或KV4適合于維持上下文學習、指令跟隨、多步推理、自我校準的涌現(xiàn)能力。此外,對于大多數(shù)大語言模型,W4A8不會導致顯著的性能損失,但W4A4會導致所有模型完全喪失涌現(xiàn)能力。

對話能力

多數(shù)模型在W8、W8A8、KV4量化位寬下對話能力幾乎不損失。當量化位寬為W3、KV3時,模型輸出會出現(xiàn)語句重復、無意義符號;當量化位寬降低至W2、W4A4、KV2時,模型輸出會出現(xiàn)詞語重復,有時會輸出隨機詞語。

長文本能力

相較于短文本(<4k),輸入長文本(>4k)時模型性能對權重和kv cache量化容忍度更低。對于長文本任務,多數(shù)模型對KV Cache量化的容忍度低于對權重、權重-激活量化。因此在多數(shù)情況下,推薦使用W4、W4A8、KV8量化位寬執(zhí)行長文本任務。

量化對于模型推理性能的影響

  • Weight-only量化可以顯著加速decoding階段,從而改善端到端延遲。
  • 關于prefill階段,Weight-only量化可能實際上會增加延遲。
  • 隨著批量大小和輸入長度的增加,Weight-only量化所帶來的加速效果逐漸減小。
  • 對于較大的模型,Weight-only量化提供了更大的益處,因為較大模型尺寸的內存訪問開銷顯著增加。

如何選擇正確量化方法最佳實踐

下面是TensorRT-LLM中選擇量化方法的最佳實踐。量化方法包含三個主要組成部分:

  • 權重精度格式
  • 激活精度格式
  • 校準算法

通常,在小批量推理場景(批量大小≤4)的情況下,推理通常是“內存限制”。在內存限制推理中,吞吐量受權重加載時間(從 GPU 內存到 GPU 緩存)的限制,即推理受到內存帶寬的限制。因此,僅權重量化方法(例如:INT4 AWQ 或 INT4-FP8 AWQ,此外還可以考慮微軟的FP6-LLM方案)可提供不錯的性能提升。

對于大批量推理場景(例如:批量大小≥16),內存帶寬和計算密度都成為關鍵因素。因此,建議選擇權重和激活同時量化以及使用具有較低精度計算Kernel的量化方法。對于批量大小 ≥ 16,量化方法的選擇是特定于模型的。建議優(yōu)先使用 FP8,因為 FP8 幾乎不會導致精度下降,并且性能強大。如果 FP8 性能不能滿足您的要求,可以嘗試 INT4-FP8 AWQ。如果部署在 Ampere GPU 或更早版本上,建議使用 INT4 AWQ 或 INT8 SQ。

根據(jù)特定的使用場景,用戶可能對精度下降和校準時間有不同的容忍度。下表是TensorRT-LLM中如何選擇量化方法的總結。其中,性能和影響是在 10 多個流行的 LLMs 上測量的而來。

量化方法 小批量性能 大批量性能 精度下降 詳情
FP8 非常低 - 使用 min-max 校準進行 FP8 逐張量(per-tensor)權重和激活量化。
- 將 FP16/BF16 模型壓縮至原始大小的 50%。
- 校準時間:分鐘。
- 通過 TensorRT、TensorRT-LLM 進行部署。支持的 GPU 架構:Ada、Hopper 及更高版本。
INT8 SmoothQuant - 使用SmoothQuant校準的變體進行 8 位整數(shù)量化。
- 逐通道權重量化、逐張量激活量化。
- 將 FP16/BF16 模型壓縮至原始大小的 50%。
- 校準時間:分鐘。
- 使用 TensorRT、TensorRT-LLM 進行部署。大多數(shù) GPU 都支持。
INT4 Weights only AWQ (W4A16) - - 通過AWQ校準進行 4 位整數(shù)僅權重量化(group-wise/block-wise)。
- - 將 FP16/BF16 模型壓縮至原始大小的 25%。
- 校準時間:數(shù)十分鐘。
- 通過 TensorRT-LLM 進行部署。支持的 GPU:Ampere 及更高版本。
INT4-FP8 AWQ (W4A8) - 使用 AWQ校準進行4 位整數(shù)權重量化(group-wise/block-wise)、FP8 激活量化(per-tensor)
- 將 FP16/BF16 模型壓縮至原始大小的 25%。
- 校準時間:數(shù)十分鐘
- 通過 TensorRT-LLM 部署。支持的 GPU:Ada、Hopper 及更高版本。

結語

本文總結了目前市面上主流的大模型量化方案以及講述了如何根據(jù)特定的場景選擇合適的量化算法。

碼字不易,如果覺得我的文章能夠能夠給您帶來幫助,期待您的點贊收藏加關注~~

參考文檔:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容