原文:https://www.maartengrootendorst.com/blog/quantization/
顧名思義,大型語言模型的規模通常過于龐大,難以在消費級硬件上運行。這類模型的參數量可達數十億級別,通常需要配備大容量顯存的GPU來加速推理過程。
為此,越來越多的研究聚焦于通過優化訓練方式、引入適配器等技術縮小模型規模。其中一項關鍵技術便是 量化。
本文將以語言建模為背景,系統介紹量化技術領域,通過逐層剖析核心概念助您建立直觀認知。我們將深入解析量化的各類方法、實際應用場景及其底層原理。
作為可視化指南,文中將包含大量圖表輔助建立量化技術的直觀理解!
第一部分: LLM的核心挑戰
LLM
的名稱源于其龐大的參數規模。當今主流模型通常包含數十億參數(主要為 權重),其存儲開銷極為昂貴。
在推理過程中,激活值由輸入數據與權重相乘產生,其規模同樣可能非常龐大。
因此,我們需要以最高效的方式表示數十億個數值,最大限度減少存儲特定值所需的空間占用。
讓我們從基本原理出發,在探討優化方法之前,先深入理解數值的原始表示方式。
數值表示方法
數值通常以浮點數(計算機科學中稱為 floats)形式表示,即帶有小數點的正負實數。
這些數值通過「比特位數」(二進制數字)進行編碼。IEEE-754 標準定義了如何用比特位數構成三個功能組件來表示數值:符號位、指數位 以及 小數位(或稱尾數)。
通過這三個組件的比特值組合,可計算出對應的具體數值:
一般而言,分配的比特位數越多,數值表示的精度就越高:
內存約束條件
可用的比特位數越多,所能表示的數值范圍就越大。
特定表示方法所能容納的數值區間稱為 動態范圍,而相鄰兩個數值之間的間隔則稱為 精度。
這些比特位數具備一個實用特性:可精確計算設備存儲給定數值所需的內存空間。鑒于8比特(bit)組成1字節(byte),我們可以為大多數浮點表示方法建立基礎計算公式。
注意:實際應用中,推理過程所需的(V)RAM容量還需考慮其他因素,例如上下文長度和模型架構設計。
現在假設我們有一個包含700億個參數的模型。大多數模型原生采用32位浮點數(常稱為 全精度)表示,僅加載模型就需要占用280GB內存空間。
因此,盡可能減少表示模型參數所需的比特位數(在訓練過程中也是如此!)變得極具必要性。然而,隨著精度的降低,模型的準確性通常也會隨之下降。
我們希望在減少數值表示所需比特位數的同時保持準確性……這正是 量化 技術的關鍵價值所在!
第二部分: 量化技術導論
量化的核心目標是將模型參數從高位寬表示(如32位浮點數)轉換為低位寬表示(如8位整數)。
當減少用于表示原始參數的比特位數時,通常會導致一定程度的精度損失(表現為粒度降低)。
為了直觀演示這種效果,我們可以任取一張圖像,僅使用8種色彩來呈現它:
本圖片基于Slava Sidorov 的原作進行修改并適配。
注意放大后的區域相較于原圖顯得更‘粗糙’,這是因為我們使用了更少的顏色來進行表示。量化的核心目標是通過減少表征原始參數所需的比特位數(類比顏色數量),在最大限度保持參數原始精度的前提下實現高效存儲
常用數據類型
首先,我們對比分析常規數據類型與32位(即 全精度 或 FP32)表示方式的差異:
FP16浮點格式
以下展示從32
位浮點格式(FP32)轉換為16
位浮點格式(即 半精度 或 FP16)的實例:
值得注意的是,FP16的數值表示范圍相較FP32存在顯著縮減
BF16
為實現與原始FP32
相近的數值覆蓋范圍,研究者提出了_bfloat16_(BF16)這種“截斷式FP32”的浮點格式:
BF16
雖然與FP16
占用相同的存儲空間(16
位),但其數值表示范圍更廣,因此被廣泛應用于深度學習領域。
INT8
當我們將比特位數進一步降低時,便會進入基于整數的表示方法范疇,而不再使用浮點表示法。以FP32
浮點格式轉換為8比特的INT8
為例,其比特位數將縮減至原始值的四分之一:
具體硬件條件下,基于整數的運算速度可能優于浮點運算,但這一優勢并非絕對成立。然而,通常當使用較少比特位數時,計算速度會顯著提升。
每減少一個比特位,都需要通過映射操作將初始的FP32
浮點表示'壓縮'到更低位寬中。
實際上,我們無需將完整的FP32
范圍[-3.4e38, 3.4e38]映射到INT8
,只需找到將模型參數的實際數據范圍適配到INT8
的方法即可。
常見的壓縮/映射方法包括 對稱量化 和 非對稱量化 ,這些都屬于 線性映射 的范疇。
接下來我們將具體分析這些從FP32到INT8的量化方法。
對稱量化
對稱量化的核心原理是將原始浮點數值范圍對稱地映射到以零為中心的量化空間。通過前文示例可以觀察到,量化前后的數值分布始終保持著以零為中心的對稱特性。
這種方法的顯著特征是:浮點空間中的零值經過量化后,在量化空間中仍精確保持為零值。
對稱量化的一種典型形式稱為絕對值最大(absmax)量化。
給定一組數值,我們以 最高 絕對值(α)作為范圍來進行線性映射。
注意數值范圍[-127, 127]表示受限區間。無約束范圍設定為[-128, 127],具體取值取決于所采用的量化方法。
由于該映射是以零為中心的線性變換,其計算公式較為簡明。
我們通過以下公式計算比例因子(s):
其中 b 表示目標量化字節數(8字節),
α 表示輸入張量中的最大絕對值,
隨后使用計算得到的比例因子 s 對輸入值 x 執行量化:
代入實際數值后可得以下表達式:
若要還原原始FP32
浮點格式數值,可使用先前計算的 比例因子(s)對量化值進行逆量化。
量化解量化過程還原原始值的操作流程如下:
可見部分數值(如3.08和3.02)在INT8量化時均被映射為整數值36。 當將數值解量化恢復為FP32浮點格式時,其精度會有所損失且無法再保持原有的區分度。
這種現象通常被稱為 量化誤差,可通過計算原始值與解量化值之間的差值來量化評估。
通常使用的比特位數越少,產生的量化誤差往往越大。
非對稱量化
與對稱量化不同,非對稱量化的數值分布并不以零點為對稱中心。該方法將浮點數值范圍的最小值(β)和最大值(α)分別映射至量化范圍的極值區間。
我們將要深入探討的方法被稱為 零點量化。
是否注意到零點位置發生了偏移?這正是其被稱為 非對稱量化 的原因。在[-7.59, 10.8]數值范圍內,最小值與最大值到零點的距離呈現不對稱性。
基于零點的位置偏移特性,需計算INT8數值范圍的零點值以實現精確的線性映射。與對稱量化類似,我們仍需計算比例因子(_ s_),但此時使用INT8取值范圍[-128, 127]的差值進行計算:
需要注意的是,由于該方法要求計算INT8范圍內的零點(_ z_)用于權重調整,操作步驟相對復雜。依照既定方法,我們代入量化公式:
若要將INT8量化模型解量化回FP32格式,需使用預先計算的比例因子(_ s_)和零點參數(_ z_)
除此之外,解量化過程本身較為直觀:
將對稱量化與非對稱量化方法并列對比時,二者的核心差異立即可辨:
請注意對稱量化天然的零中心特性與非對稱量化的偏移分布形成鮮明對比
范圍映射與數值截斷
在前文案例中,我們已深入解析如何將向量值域映射至低比特位表示的方法盡管這種方法可以映射向量的全部取值范圍,但它存在一個顯著缺陷——即會產生 離群值。
假設存在如下取值的向量:
注意觀察其中一個值明顯大于其他所有值,可視為離群值。若將該向量的全部取值范圍進行映射,則所有較小值都會被壓縮至相同的低比特表示形式,從而喪失其差異性特征:
這正是前文使用的absmax
量化方法。需注意的是,若不實施截斷操作,非對稱量化同樣會出現類似現象。
作為替代方案,我們可以選擇_截斷_特定數值。截斷的核心在于重新設定原始值的動態范圍,使得所有異常值統一歸為相同數值。
如下例所示,若手動將動態范圍設定為[-5, 5],該區間外的所有值無論大小都將被統一映射為-127或127:
該方法的核心優勢在于能大幅降低 正常值域數據 的量化誤差。但相應地,異常值數據 的量化誤差會增大。
校準過程
本例中展示的是通過主觀選擇[-5, 5]范圍的簡易實現方式。該范圍的選擇過程稱為_校準_,其核心目標是尋找既能覆蓋最大數據量又能最小化量化誤差的最優區間。
需注意,不同類型的參數在執行此校準步驟時存在差異性。
權重(及偏置項)
由于大語言模型(LLM)的權重和偏置項在模型運行前就已確定,因此可將其視為 靜態 參數。以Llama 3約20GB的模型文件 為例,其主要構成部分即為權重和偏置項。
鑒于偏置項數量級(百萬級)遠小于權重參數(十億級),通常采用更高精度(如INT16)存儲偏置項,而量化優化的核心目標集中在權重處理。
針對已知且保持靜態的權重參數,選擇量化范圍的校準技術主要包括:
手動選定輸入范圍的 百分位點 ;
通過優化原始權重與量化權重之間的 均方誤差 (MSE)進行校準;
最小化原始數據與量化值間的 信息熵 (KL散度)。

若采用百分位數選擇策略,將產生與先前討論相似的數值截斷現象。
激活值
在大型語言模型(LLM)中持續更新的輸入通常被稱為「激活值」。
需要注意的是,這些數值之所以稱為激活值,是因為它們通常會通過某些激活函數(如Sigmoid
或ReLU
)進行處理。
與權重不同,在推理過程中,激活值會隨著輸入數據的變化而動態改變,因此對其進行精確量化頗具挑戰。
由于這些數值會在每個隱藏層處理后更新,我們只有在模型執行推理、輸入數據流經網絡時才能確定其具體值。
總體而言,校準權重和激活值的量化方法可分為兩大類:
訓練后量化(PTQ)
訓練 完成 后量化
量化感知訓練(QAT)
訓練/微調 過程中 量化
訓練后量化(PTQ)是目前最主流的量化方法之一。該技術要求在模型完成訓練后,對其參數(含權重和激活值)執行量化操作。
權重 的量化可采用對稱量化或非對稱量化方法。而 激活值 的量化則需通過模型推理獲取其潛在分布,因其數值范圍無法預先確定。激活值的量化主要包含兩種形式:
動態 量化
靜態 量化
當數據通過隱藏層后,系統會收集其產生的激活值:
基于這些激活值的分布特征,可計算出量化輸出所需的 零點 (z)和 比例因子 (s):
該過程會在數據每次流經新的網絡層時重復執行因此,每個網絡層都具有獨立的 z 和 s 參數值,從而形成差異化的量化方案。
靜態量化
與動態量化不同,靜態量化不在推理過程中實時計算 零點 (z)和 比例因子(s),而是采用預先計算的方式。為確定這些參數值,需使用校準數據集輸入模型以收集潛在的數據分布:
完成數據收集后,即可計算出推理階段執行量化所需的 s 和 z 參數值。在實際執行推理時,s 和 z 參數值不會實時計算,而是采用全局統一值對所有激活值進行量化處理。
總體而言,動態量化通常具有更高精度,因其專門針對每個隱藏層獨立計算 s 和 z 參數值。但這種方式可能增加計算耗時,需實時執行參數值的計算過程。
相較之下,靜態量化雖然精度稍遜,但由于已預存固定的 s 和 z 量化參數,執行效率顯著更高。
4比特量化技術前沿
實踐證明,突破8
比特以下的量化存在顯著挑戰,量化誤差會隨著比特位數的減少呈指數級增長。當前主要通過智能量化策略實現6
比特、4
比特乃至2
比特的突破(但行業普遍不建議采用低于4
比特的方案)。
我們將深入解析HuggingFace
社區廣泛采用的兩種代表性方法:
GPTQ (全模型
GPU
部署方案)GGUF (支持部分層
CPU
卸載方案)
GPTQ
算法堪稱4
比特量化領域最著名的實踐方法之一1
該算法采用非對稱量化方法,并逐層進行處理:每一層在進入下一層前均獨立完成量化:
在此逐層量化過程中,算法首先將層的權重轉換為逆海森矩陣作為模型損失函數的二階導數,海森矩陣揭示了模型輸出對各個權重變化的敏感程度。簡而言之,它實際上反映了層中每個權重的(逆)重要性
與海森矩陣中較小值對應的權重更為關鍵,因為這些權重的微小擾動可能導致模型性能的顯著波動
在逆海森矩陣中,數值越低表示該權重越“重要”。
接下來,我們首先對權重矩陣中第一行的權重進行量化,隨后執行解量化操作:
通過該過程,我們可以計算量化誤差(q),并利用預先計算的逆海森矩陣( )對其進行加權處理。本質上,我們基于權重的重要性創建了一個加權量化誤差:
接下來,我們將這個加權量化誤差重新分配到該行中的其他權重上,從而保持網絡的整體功能和輸出特性。
例如,針對第二個權重(即0.3( )),我們會將量化誤差( )乘以該權重的逆海森矩陣值( )后進行累加:
我們可以對當前行中的第三個權重執行相同操作:
我們持續迭代執行這種加權量化誤差的重新分配過程,直至所有權重值完成量化。
該方法行之有效的原因在于,神經網絡中的權重通常具有相互關聯性。因此,當某個權重出現量化誤差時,相關權重會通過逆海森矩陣(inverse-Hessian
)進行協同更新。
注意:研究者 采用了多項優化技巧以提升計算效率和模型性能,包括為海森矩陣引入阻尼因子、實施「惰性批處理」策略,以及采用Cholesky分解進行信息預計算。我們強烈推薦觀看該YouTube技術講解視頻 以深入理解本主題。 技術提示:如需針對推理速度進行極致優化的量化方案,請重點關注EXL2 框架的實現。GGUF格式
雖然GPTQ算法是實現大型語言模型全量GPU部署的優秀量化方案,但在實際硬件條件受限時,此時可借助GGUF格式的層級卸載特性,將模型任意計算層動態分配至CPU執行。2
當顯存(VRAM)不足時,該方案允許您同時利用CPU
和GPU
進行協同計算。
GGUF
量化方法迭代更新頻繁,其具體實現可能因位量化級別的不同而有所差異。然而,其通用量化原理可概括如下:
首先,將神經網絡某層的權重矩陣分割為多個'超塊',每個超塊包含若干'子塊'集合。從這些區塊結構中,可提取出比例因子(s)和alpha參數(α):
對于特定'子塊'的量化處理,可采用先前所述的 absmax 絕對值最大化量化方法。需特別注意,該方法通過將權重值與比例因子(s)相乘實現量化縮放:
比例因子雖基于'子塊'數據計算得出,但最終需使用'超塊'的獨立比例因子完成量化過程:
這種分層量化機制利用'超塊'的比例因子( )對'子塊'比例因子( )進行二次量化。
各比例因子的量化級別可能不同,通常'主'模塊的比例因子比'子'模塊具有更高的精度。
為便于理解,我們將以三種量化位寬(2位、4位和6位)為例進行說明:
技術說明:根據量化類型的不同,需通過附加最小值參數(m)對零點進行校準。這些量化模型的量化方式與比例因子(s)保持一致。
關于所有量化級別的概述,請參考原始拉取請求 。 如需了解基于重要性矩陣的量化方法,請查閱此拉取請求 。
第四部分: 量化感知訓練
在第三部分中,我們演示了如何在模型訓練完成 后 實施量化操作。該方法的局限性在于:量化過程未與模型實際訓練流程相結合。
量化感知訓練(QAT)正是為此而設計。區別于訓練后量化(PTQ)的事后處理方式,QAT通過在訓練 過程中 同步學習量化參數來實現優化。
由于量化誤差在訓練階段即被納入優化目標,QAT相比PTQ具有更高的精度優勢。具體實現流程如下:
在訓練過程中,會引入所謂的「fake」偽量化操作。該過程首先將權重量化至INT4
等低精度格式,隨后反量化為FP32
浮點格式:
通過這種方式,模型可以在訓練過程中將量化過程納入考量,包括損失計算和權重更新的全過程。
量化感知訓練(QAT)致力于尋找「wide」寬域極小值以降低量化誤差,因為「narrow」窄域極小值通常會產生更大的量化誤差。
例如,假設在反向傳播過程中未考慮量化效應。根據梯度下降算法,我們會選擇損失值最小的權重參數。然而,若該權重處于「narrow」窄域極小值區域,將會引發較大的量化誤差。
相反地,若將量化納入考量,則會在「wide」寬域極小值區域選擇不同的更新權重,從而顯著降低量化誤差。
因此,盡管訓練后量化(PTQ
)在高精度(如FP32
浮點格式)下表現更優,但量化感知訓練(QAT
)在低精度(如INT4
)下的實際部署效果更佳,這正是量化技術追求的目標。
1位大型語言模型時代:比特網絡
如先前所述,4
位量化已屬極小規模,但若進一步壓縮至更低位寬會如何?
比特網絡 應運而生,其采用單1
位量化表示模型權重,每個權重僅取**-1或1**兩種值。3
該方法通過將量化過程深度集成至Transformer
架構實現。
值得注意的是,作為多數大型語言模型基石的Transformer
架構,其核心計算單元由線性層構成:
這些線性層通常以FP16浮點格式等高精度數值表示,且承載了模型絕大部分權重參數。
比特網絡通過其創新設計的比特線性層替代傳統線性層:
比特線性層與標準線性層功能一致,通過權重矩陣與激活值的乘積運算生成輸出結果。
相比之下,比特線性層采用1位量化表示模型權重,并利用INT8
格式編碼激活值:
與量化感知訓練(QAT
)類似,比特線性層在訓練過程中會執行'模擬量化'操作,用于評估權重和激活值量化后的效果:
技術說明:原論文使用γ作為參數符號,但為保持與本文示例符號體系一致,此處統一采用α。 需特別指出,此處的β參數與零點量化中的定義不同,它表示平均絕對值。
下面我們將分步驟詳解比特線性層的實現機制。
權重量化
在訓練階段,權重首先以INT8
格式存儲,隨后通過_符號函數_的基礎策略量化為1
位精度。
其核心原理是將權重分布中心歸零處理:將零值左側數據統一映射為-1
,右側數據映射為1
。
系統會持續追蹤β(平均絕對值**)**參數,該值將用于后續的逆量化過程。
激活值量化
在激活值量化環節,比特線性層運用 絕對值最大化量化 技術,將FP16
格式的激活值轉換為INT8
精度,以滿足矩陣乘法(×)運算的高精度要求。
系統會持續記錄α(最大絕對值)參數,該值將用于后續的逆量化過程。
逆量化
我們持續追蹤了α(激活值的最大絕對值) 和 β(權重的平均絕對值),這些參數將幫助我們將激活值解量化回FP16
浮點格式。
輸出激活值通過{α, γ}參數組進行重新縮放,以將其逆量化為原始精度:
至此流程完成!該方法相對簡單直觀,使得模型僅需用 -1 和 1 兩個數值即可表征。
應用此方法后,研究者發現模型規模越大,1
位量化模型與全精度FP16
訓練模型之間的性能差異越小。
但此現象僅存在于大型模型(參數量>300億),較小模型的性能差距仍較為明顯。
所有大語言模型均采用1.58比特量化
比特網絡1.58b 的提出旨在改進前文所述的擴展性問題4
這種創新方法中,每個權重不僅可以是 -1 或 1,現在還可取 0 作為值,從而形成三元權重體系。值得注意的是,僅引入 0 值就顯著提升了比特網絡的性能,并大幅加速了計算過程。
零值的威力
為何添加0
值能產生如此顯著的性能提升?其核心機制完全體現在 矩陣乘法 的優化上!
首先,我們需要理解標準矩陣乘法的基本運算原理。在進行輸出計算時,需執行權重矩陣與輸入向量的乘積運算。下圖直觀展示了權重矩陣第一層的首次乘積累加運算過程:
需要特別指出,該運算包含兩個關鍵步驟:相乘(單個權重與輸入值逐元素相乘)和累加(將所有乘積結果求和)。
與之形成對比的是,比特網絡1.58b采用的三元權重機制通過以下規則有效規避了乘法運算:
1: 需要累加當前值
0: 舍棄當前值
-1:需要減去該數值時
因此,當權重完成1.58
位量化后,我們僅需進行加法運算即可:
該方案不僅能大幅提升計算速度,還可實現特征篩選功能。
通過將指定權重置零,可直接忽略該參數,避免了傳統1
位表征必須進行的加減運算。
量化技術
比特網絡1.58b
采用改進型 絕對值均值量化 方案,此方法基于先前介紹的絕對值最大化量化改進而來。
該方法通過壓縮權重參數分布,并基于絕對均值(α)執行數值量化處理。最終將量化結果取整至-1
、0
或1
三個離散值:
相較原版比特網絡,激活值量化機制僅存在一項改進:激活值的縮放范圍從原有的[ 0 , 2??1 ]區間調整為采用區間[ -2??1 , 2??1 ],而非使用 絕對值最大化量化 方法。
至此,實現1.58
比特量化主要依靠兩個關鍵技術:
引入 0 值構建三元表示[-1, 0, 1]
針對權重的 絕對值均值量化
通過僅使用計算高效的1.58
比特參數,最終我們獲得了輕量化模型!
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.