作者 | 崔皓
審校 | 重樓
開篇
在當(dāng)今人工智能領(lǐng)域,大語言模型(LLM)正以前所未有的速度發(fā)展。隨著模型參數(shù)的不斷增加,大模型變得愈發(fā)“聰明”,在語言理解、文本生成、知識問答等眾多任務(wù)中展現(xiàn)出了卓越的性能,為自然語言處理等相關(guān)領(lǐng)域帶來了巨大的變革。
然而,這種參數(shù)規(guī)模的急劇增長也帶來了一系列挑戰(zhàn)。在模型推理階段,需要大量的硬件資源來支撐。顯存作為存儲模型參數(shù)的關(guān)鍵部件,其容量需求也隨之大幅提升。當(dāng)GPU執(zhí)行大模型的向量運(yùn)算時,需要依次將顯存中的數(shù)據(jù)加載到GPU運(yùn)算寄存器、緩存,最終加載到具體的SM(流式多處理器)中進(jìn)行計算。

但在這個模型參數(shù)的搬運(yùn)過程中,往往會成為推理的瓶頸,導(dǎo)致推理速度變慢,效率降低。 為了解決這一問題,量化技術(shù)應(yīng)運(yùn)而生。量化的核心思想是將模型變小,通過降低模型參數(shù)的精度,減少數(shù)據(jù)的存儲空間和傳輸量,從而加速參數(shù)從顯存搬運(yùn)到運(yùn)算單元的過程,進(jìn)而加快整個計算過程,最終提升推理效率。本文將主要圍繞如何降低模型大小展開,重點(diǎn)探討通過算法優(yōu)化的方式來壓縮模型的策略,旨在為提升LLM推理加速提供有效的解決方案。
模型參數(shù)量化
在探索降低模型大小以加速 LLM 推理的過程中,對模型進(jìn)行量化是一種極為有效的減少模型參數(shù)的方法。我們首先要了解,模型主要由參數(shù)和代碼兩部分構(gòu)成。在模型的訓(xùn)練階段,它會不斷學(xué)習(xí)數(shù)據(jù)中的特征和規(guī)律,并將學(xué)習(xí)到的這些內(nèi)容以權(quán)重或參數(shù)的形式保存下來。 一般而言,模型越大,其在處理各種復(fù)雜任務(wù)時就會表現(xiàn)得越精準(zhǔn)、越 “聰明”,這是因?yàn)樗軌驅(qū)W習(xí)和存儲更多的數(shù)據(jù)特征和模式。
而與之對應(yīng)的是,模型越大,其包含的參數(shù)數(shù)量就越多,并且這些參數(shù)的精度也越高。以著名的 GPT-3 為例,它有多個不同規(guī)模的版本,其中最大的版本具有 1750 億個參數(shù)。
這里提到的精度,常見的有 FP32、FP16、INT8 等。FP32 即單精度浮點(diǎn)數(shù),它使用 32 位二進(jìn)制來表示一個浮點(diǎn)數(shù),F(xiàn)P16 就是 16 位二進(jìn)制來表示一個浮點(diǎn)數(shù),INT8 就是 8 位二進(jìn)制表示一個整數(shù)。
如下圖所示,F(xiàn)loat16 和 Float32 以科學(xué)計數(shù)法的形式展示。

Float16 和 Float32 的展示方式可以通過如下公式理解:

- Sign(符號位):1 位,0 表示正數(shù),1 表示負(fù)數(shù)。
- Exponent(指數(shù)位):表示指數(shù)部分,需減去一個 “偏移量(Bias)” 來表示正負(fù)指數(shù)。
- Bias(偏移量):2指數(shù)位長度?1?1,例如:Float16: 25-1-1=15
- Fraction(小數(shù)位 / 尾數(shù)位):表示有效數(shù)字的小數(shù)部分,結(jié)合隱含的 “1.” 形成完整的有效數(shù)字。
通過上圖可以看出,模型參數(shù)精度越高,模型就更加精準(zhǔn),所需的存儲空間就越高,推理時需要傳輸?shù)牧烤驮酱螅托枰嗟挠布Y源。反之,低精度的參數(shù),例如 INT8,所需的存儲空間就越小,推理時需要傳輸?shù)牧烤驮叫。托枰俚挠布Y源。
在實(shí)際應(yīng)用中,為了提高效率,像 GPT - 3 這類模型也會采用量化技術(shù)將其量化為更低的精度,如 INT8 等。
其實(shí)原理在前面也介紹過,參數(shù)精度越高,參數(shù)所占用的存儲空間就越大,也就意味著需要更多的顯存來存儲這些參數(shù)。在數(shù)據(jù)傳輸過程中,大量的數(shù)據(jù)需要從顯存搬運(yùn)到運(yùn)算單元,這就容易成為推理的瓶頸,導(dǎo)致推理速度變慢。因此,為了提高推理效率,通常采用的通用方法就是降低參數(shù)的精度,這種降低參數(shù)精度的操作就被稱為量化。通過量化,可以在一定程度上犧牲模型的精度,換取更小的模型大小和更快的推理速度,從而有效緩解硬件資源的壓力,提升整體的推理性能。
后訓(xùn)練量化
在前面的討論中,我們已經(jīng)了解到提升LLM推理效率可以通過量化模型參數(shù)來實(shí)現(xiàn),例如將原本的FP32精度降低到INT8,這樣能顯著減少模型大小和計算量,從而加快推理速度。然而,凡事有利就有弊,這種操作就像一把雙刃劍。對模型參數(shù)進(jìn)行量化,固然能帶來效率上的提升,但同時也會降低模型的精度,進(jìn)而影響模型的精準(zhǔn)性。
畢竟,模型之所以能夠表現(xiàn)出強(qiáng)大的智能,很大程度上依賴于其較高的精度,精度越高,模型的推理能力往往越強(qiáng)。為了在降低模型精度的同時,又不降低模型的精準(zhǔn)性,也就是要讓模型既小又快,還能保持相對較高的智能水平,這時后訓(xùn)練量化(Post - Training Quantization,PTQ)技術(shù)應(yīng)運(yùn)而生。
后訓(xùn)練量化在LLM推理加速的研究中,是一項(xiàng)關(guān)鍵的模型壓縮技術(shù)。它具有獨(dú)特的優(yōu)勢,無需對模型進(jìn)行額外的訓(xùn)練或微調(diào),這大大節(jié)省了時間和計算資源。PTQ通過使用少量校準(zhǔn)數(shù)據(jù),能夠?qū)㈩A(yù)訓(xùn)練好的高精度模型(如FP32或FP16)的權(quán)重和/或激活值轉(zhuǎn)換為低精度格式(如INT4或INT8)。在實(shí)際應(yīng)用中,高精度的模型雖然具有較好的性能,但往往占用大量的內(nèi)存和計算資源,這在資源受限的環(huán)境中會成為部署和推理的瓶頸。而PTQ的出現(xiàn),正是為了解決這一問題。其目的在于顯著減少模型的內(nèi)存占用和計算開銷,從而提高LLM的推理效率,使得大型語言模型能夠在更多的設(shè)備上快速、高效地運(yùn)行。
PTQ的兩大階段分解
現(xiàn)有的量化方法通常是多種技術(shù)的組合,為了更好地理解這些復(fù)雜的量化方法,研究人員將量化過程解耦為兩個關(guān)鍵步驟。
如下圖所示,在量化之前要進(jìn)行“預(yù)量化變換”,在量化之后要執(zhí)行“量化誤差緩解”。

預(yù)量化變換 (Pre - quantization Transformation)
此階段的目的是在量化之前對數(shù)據(jù)(權(quán)重和激活值)進(jìn)行預(yù)處理。在模型的數(shù)據(jù)中,存在著離群值(Outliers),這些離群值的存在會給量化帶來困難。預(yù)量化變換的核心問題就是減輕離群值的影響,將其平坦和順滑,使得數(shù)據(jù)更利于量化。在LLM技術(shù)中,AWQ(采用縮放Scaling)就對應(yīng)這一階段。
前面這句話看上去太抽象了,說人話就是,由于量化之后模型中的參數(shù)會出現(xiàn)一些特別“大”或者特別“小”的值,就好像一個人不合群,我們把這種值稱為“離群值(Outliers)”。我們擔(dān)心這種“離群值(Outliers)”在量化過程中把模型的精度“帶跑偏”,所以需要讓其“平坦和順滑”,可以理解為對“刺頭”進(jìn)行打磨棱角。
量化誤差緩解 (Quantization Error Mitigation)
該階段的主要任務(wù)是在量化過程中或之后補(bǔ)償量化引入的誤差。當(dāng)進(jìn)行低比特量化時,不可避免地會導(dǎo)致精度損失,這是量化過程中需要解決的核心問題。在LLM技術(shù)里,GPTQ(采用自補(bǔ)償Self - compensation)對應(yīng)這一階段,它致力于解決低比特量化導(dǎo)致的精度損失問題。
這里還是需要用人話解釋一遍,在完成對模型參數(shù)降低精度之后,會出現(xiàn)降低過頭的情況。就好像為了節(jié)約成本,把一大幫大學(xué)生員工換成了一幫中學(xué)生,你擔(dān)心這幫中學(xué)生的素質(zhì)無法勝任工作,于是對其能力或者素質(zhì)進(jìn)行“補(bǔ)償”。
好了到這里我們知道在模型量化的前后分別存在兩個階段:預(yù)量化變換和量化誤差緩解。那么就需要對應(yīng)兩個算法實(shí)現(xiàn)這兩個階段完成的任務(wù)。
如下圖所示,前后兩個階段需要通過 AWQ-激活感知權(quán)重量化(Activation - aware Weight Quantization)和 GPTQ-生成式預(yù)訓(xùn)練 Transformer 量化(Generative Pre -trained Transformers Quantization)兩個算法來實(shí)現(xiàn)。

下面我們會針對這兩個算法進(jìn)行討論。
激活感知權(quán)重量化(Activation - aware Weight Quantization)
AWQ是一種權(quán)重獨(dú)有(Weight-Only)量化方法,專注于通過縮放進(jìn)行預(yù)量化轉(zhuǎn)換 。AWQ的核心理念是識別并“保護(hù)”模型中對輸出影響最大的“顯著權(quán)重”(Salient Weights)。為什么要找這個所謂的顯著權(quán)重呢?
鑒別顯著權(quán)重
在大型語言模型(LLM)的推理過程中,并非所有權(quán)重都對推理結(jié)果有著同等程度的影響。僅有0.1% - 1%的小部分顯著權(quán)重對模型輸出精度起著關(guān)鍵作用。如果能夠精準(zhǔn)地鑒別出這一小部分顯著權(quán)重,并使其保持原來的高精度(如FP16),而對其他權(quán)重進(jìn)行低比特量化,那么就可以在幾乎不損失模型精度的前提下,大幅降低模型的內(nèi)存占用,同時顯著提升推理速度。這對于提高LLM在實(shí)際應(yīng)用中的效率和性能具有重要意義。
那么如何漸變顯著權(quán)重,如下圖所示,總結(jié)了幾個方法的效果。
Perplexity(困惑度,PPL)是衡量語言模型性能的關(guān)鍵指標(biāo),可理解為 “模型預(yù)測下一個詞時的平均‘困惑程度’”,數(shù)值越低,模型性能越好。模型對文本的概率預(yù)測越準(zhǔn)確,PPL 越低。
直接說結(jié)論就是,基于激活值分布挑選(based on act)的方式相比FP16幾乎沒有精度損失。說明基于激活值分布來鑒別顯著權(quán)重能夠更精準(zhǔn)地找到對模型輸出精度至關(guān)重要的權(quán)重,從而在量化過程中有效地保留關(guān)鍵信息,保證模型在低比特量化后的性能。

隨機(jī)挑選
隨機(jī)挑選顯著權(quán)重的方法簡單粗暴,就是隨機(jī)選出0.1% - 1%的權(quán)重作為顯著權(quán)重。然而,這種方法缺乏科學(xué)性,沒有考慮到權(quán)重在模型中的實(shí)際作用和重要性,就如同“聽天由命”一般,難以保證挑選出的權(quán)重能夠真正對模型精度產(chǎn)生關(guān)鍵影響。
基于權(quán)重分布挑選(base on W)
這種方法是對權(quán)重矩陣(例如自注意力機(jī)制中的相關(guān)矩陣)中的元素按絕對值大小由大到小進(jìn)行排序,認(rèn)為絕對值越大的元素越顯著,然后選擇前0.1% - 1%的元素作為顯著權(quán)重。很多傳統(tǒng)的量化方法都采用這種方式來挑選顯著權(quán)重,它基于權(quán)重本身的數(shù)值特征進(jìn)行判斷,但可能沒有充分考慮到權(quán)重在模型計算過程中的實(shí)際作用。
基于激活值分布挑選(based on act)
這里的激活值是指與權(quán)重矩陣作矩陣乘法(matmul)運(yùn)算的輸入值。例如在自注意力機(jī)制中,計算相關(guān)結(jié)果時,對應(yīng)的輸入值就是相應(yīng)權(quán)重矩陣的激活值。該方法按激活值絕對值大小由大到小排序,絕對值越大越顯著,選擇前0.1% - 1%的元素作為顯著權(quán)重。通過激活值來判斷權(quán)重的重要性,能夠更直接地反映出權(quán)重在模型實(shí)際計算中的影響力。
實(shí)驗(yàn)評估結(jié)果
作者對上述三種方法進(jìn)行了實(shí)驗(yàn),并將困惑度(PPL,值越小越好)作為評估指標(biāo)。
放大(Scaling)
在LLM推理加速中,對顯著權(quán)重保留FP16格式、其他權(quán)重采用INT4格式雖能提升效率,卻也帶來新問題。當(dāng)權(quán)重矩陣中不同格式元素并存,存儲時需設(shè)計復(fù)雜結(jié)構(gòu)管理,計算取數(shù)要額外邏輯判斷,編寫kernel函數(shù)更是抽象難維護(hù),無疑增加了操作難度與出錯風(fēng)險。為解決這些難題,使用了一個變通方法——Scaling,以此簡化存儲與計算過程,讓后續(xù)操作更順暢高效。
來做個實(shí)驗(yàn)驗(yàn)證這個方法,如下圖所示,三種不同的量化方式的結(jié)果。

- 圖(a):RTN 量化(基準(zhǔn)方法)
A.過程:將 FP16 精度的權(quán)重FP16直接量化為 INT3 精度。
B.結(jié)果: perplexity(PPL,語言模型的“困惑度”,數(shù)值越低性能越好)為 43.2,性能較差。
C.原因:直接量化會丟失大量精度,導(dǎo)致模型表達(dá)能力下降。
- 圖(b):保留 1% 關(guān)鍵權(quán)重為 FP16(混合精度嘗試)。
A.過程:通過激活分布識別“關(guān)鍵權(quán)重(salient weights)”,將這些權(quán)重保留為 FP16 精度,其余量化為低精度。
B.結(jié)果:PPL 從 43.2 降至 13.0,性能大幅提升。
C.問題:“混合精度格式(MixPrec)”在硬件上效率差,因?yàn)橛布y以高效處理不同精度的混合計算。
- 圖(c):AWQ 方法(激活感知的量化方法)
A.過程:遵循“激活感知”原則,先對權(quán)重按通道進(jìn)行縮放(scale)計算激活的“平均幅值(average mag.)”,再基于縮放因子 alpha 調(diào)整權(quán)重,最后量化為 INT3。
B.結(jié)果:PPL 同樣達(dá)到 13.0,既保留了關(guān)鍵權(quán)重的精度,又采用統(tǒng)一的 INT3 精度,兼顧了性能和硬件效率。
大語言模型量化時,直接低精度量化會導(dǎo)致性能暴跌(圖a);若保留少量關(guān)鍵權(quán)重為高精度,性能會恢復(fù)但硬件效率差(圖b);AWQ 方法通過“按通道縮放+統(tǒng)一低精度量化”,在保護(hù)關(guān)鍵權(quán)重的同時保證了硬件效率,實(shí)現(xiàn)了性能與效率的平衡。
需要說明的是,量化時放大顯著權(quán)重(即乘較大縮放因子)可降低量化誤差;對于非顯著權(quán)重,乘以較小縮放因子,減少關(guān)注。這就是縮放(Scaling)方法,通過調(diào)整激活值與權(quán)重間的縮放因子,實(shí)現(xiàn)降低誤差和保證權(quán)重顯著特性的目的。上述說明,只是對縮放因子的結(jié)論,推導(dǎo)過程不在這里展開。可以查看如下論文,我把鏈接放到結(jié)尾。
《AWQ: ACTIVATION-AWARE WEIGHT QUANTIZATION FOR ON-DEVICE LLM COMPRESSION AND ACCELERATION》
到這里 AWQ 整個過程差不多就說完了,總結(jié)為下面表格:
步驟 | 機(jī)制 | 描述與來源 |
1.識別顯著權(quán)重 | 基于激活值的感知 | AWQ 基于一個核心觀察:并非所有權(quán)重都同等重要3。要確定哪些權(quán)重通道是顯著的,應(yīng)該參考激活值的分布,而非權(quán)重本身的分布。 |
2.等效變換 | 數(shù)學(xué)等效縮放 | AWQ 使用等效變換Y=XW=(X^)(W^),將量化難度從難以處理的激活值分布轉(zhuǎn)移到權(quán)重上。該變換在數(shù)學(xué)上不改變模型的輸出結(jié)果。 |
3.確定縮放因子 | 離線收集統(tǒng)計信息 | AWQ 通過離線收集激活值(X)的統(tǒng)計信息(例如最大幅度),來確定最優(yōu)的每通道縮放因子 (S)。 |
4.保護(hù)與量化 | 放大顯著權(quán)重 | 縮放因子 S 用于放大那些被判定為顯著的權(quán)重通道 W^=S?W。這種放大操作旨在保護(hù)這些關(guān)鍵權(quán)重,使其在隨后量化到低比特(如 INT4)時,能夠保留更多有效信息。 |
在 AWQ 算法的最后,再補(bǔ)充一下 S 縮放因子的內(nèi)容:
為實(shí)現(xiàn)自動計算縮放因子(scaling)從而最小化量化誤差,原本需找到權(quán)重矩陣每個通道的縮放系數(shù),使公式 4 最小化。但量化函數(shù)不可微,且公式非凸,無法用梯度下降法求解。
激活值越大,對應(yīng)通道越顯著,應(yīng)分配更大縮放系數(shù)降低量化誤差。于是統(tǒng)計各通道平均激活值作為縮放因子,并引入變量平衡顯著與非顯著通道系數(shù),問題轉(zhuǎn)化為新的形式。同時,為防止過大或過小,進(jìn)行了數(shù)據(jù)標(biāo)準(zhǔn)化。
你可以采用 “Fast Grid Search” 方法在 [0, 1] 區(qū)間找,實(shí)際是在此區(qū)間平均取 20 個數(shù),逐個計算不同情況下的 MSE 損失,損失最小的即為最佳,進(jìn)而確定最佳縮放因子。
AWQ 實(shí)現(xiàn)
說完了 AWQ 的原理之后,再來看看 AWQ 的實(shí)現(xiàn)。說到實(shí)現(xiàn)就不得不提到AutoAWQ 。
AutoAWQ 是一個易于使用的用于 4 位量化模型的工具包。它通過實(shí)現(xiàn)激活感知權(quán)重量化(Activation - aware Weight Quantization, AWQ)算法對大語言模型(LLMs)進(jìn)行量化。相比 FP16,AutoAWQ 能將模型推理速度提升 3 倍,同時將內(nèi)存需求降低 3 倍。該工具包是在麻省理工學(xué)院(MIT)的原始工作基礎(chǔ)上創(chuàng)建和改進(jìn)而來的。目前, AutoAWQ 已被 vLLM 項(xiàng)目完全采用。
可以使用如下命令對其進(jìn)行安裝:
pip install autoawq此默認(rèn)安裝方式不包含外部內(nèi)核,推理過程依賴Triton。這種安裝方式較為基礎(chǔ),適合對內(nèi)核沒有特殊需求,希望快速使用AutoAWQ的用戶。
帶內(nèi)核的發(fā)布版本使用如下命令進(jìn)行安裝。
pip install autoawq[kernels]需要注意的是,這種安裝方式要求你使用的torch版本與內(nèi)核構(gòu)建時所使用的最新torch版本相匹配。
針對英特爾CPU和英特爾XPU優(yōu)化性能的主分支安裝,使用如下命令進(jìn)行:
pip install autoawq[cpu]下面代碼使用 AWQ 和 Transformers 庫,將 Mistral-7B-Instruct-v0.2 模型通過 AWQ 方法量化為 4 位精度,并保存量化后的模型和分詞器,實(shí)現(xiàn)模型壓縮的同時盡可能保留性能。
# 導(dǎo)入AWQ量化所需的模型類和Transformers的分詞器類
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
# 原始模型的路徑(Hugging Face Hub上的Mistral-7B-Instruct-v0.2模型)
model_path = 'mistralai/Mistral-7B-Instruct-v0.2'
# 量化后模型的保存路徑
quant_path = 'mistral-instruct-v0.2-awq'
# 量化配置參數(shù):啟用零點(diǎn)(zero_point),分組大小128,權(quán)重量化為4位,版本為GEMM
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }
# 從預(yù)訓(xùn)練模型路徑加載原始模型
model = AutoAWQForCausalLM.from_pretrained(model_path)
# 從預(yù)訓(xùn)練模型路徑加載對應(yīng)的分詞器,trust_remote_code=True允許加載模型相關(guān)的自定義代碼
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 對模型進(jìn)行量化,傳入分詞器和量化配置
model.quantize(tokenizer, quant_config=quant_config)
# 保存量化后的模型到指定路徑
model.save_quantized(quant_path)
# 保存分詞器到與量化模型相同的路徑
tokenizer.save_pretrained(quant_path)
# 打印提示信息,表明模型已量化并保存
print(f'Model is quantized and saved at "{quant_path}"')GPTQ 生成式預(yù)訓(xùn)練 Transformer 量化
通過前面的介紹,我們發(fā)現(xiàn)對于 PTQ( 后訓(xùn)練量化)而言,將GPTQ置于量化誤差緩解階段(第二階段),能夠清晰地將其與AWQ(預(yù)量化變換)區(qū)分開來。AWQ主要解決量化前的預(yù)處理問題,它通過縮放操作來平滑數(shù)據(jù)中的離群值,使得數(shù)據(jù)分布更適合進(jìn)行量化。

而GPTQ則聚焦于量化之后(或伴隨量化過程)的精度修復(fù)問題。GPTQ,即生成式預(yù)訓(xùn)練Transformer量化(Generative Pre - trained Transformers Quantization),是后訓(xùn)練量化(PTQ)中量化誤差緩解(Quantization Error Mitigation)這一關(guān)鍵階段的代表性技術(shù)。
GPTQ功能定位
量化誤差緩解旨在應(yīng)用特定技術(shù)來補(bǔ)償量化過程中引入的誤差,以此提高模型的性能。在量化過程中,由于對模型參數(shù)進(jìn)行了離散化處理,不可避免地會引入誤差,這些誤差可能會影響模型的準(zhǔn)確性和性能。量化誤差緩解技術(shù)就是為了應(yīng)對這一問題而存在的。
GPTQ核心機(jī)制
GPTQ是一種僅對權(quán)重進(jìn)行量化的方法,它基于近似二階信息,采用一次性(one - shot)的權(quán)重量化方式。該方法構(gòu)建在OBQ(Optimal Brain Quantization)方法之上,利用Hessian矩陣來指導(dǎo)誤差補(bǔ)償。Hessian矩陣包含了函數(shù)的二階導(dǎo)數(shù)信息,通過利用Hessian矩陣,GPTQ能夠更準(zhǔn)確地解決量化引入的誤差以及最優(yōu)權(quán)重擾動問題,從而在量化過程中更好地保持模型的性能。
GPTQ 的核心包含了自補(bǔ)償(Self - compensation)機(jī)制,利用近似二階信息(Hessian矩陣)來指導(dǎo)補(bǔ)償過程。雖然 Hessian矩陣計算極為復(fù)雜,但我們可以通過一個簡化的2×2權(quán)重塊來清晰地演示其“逐列量化 - 計算誤差 - 補(bǔ)償”的流程。
數(shù)值演示:逐列補(bǔ)償機(jī)制
步驟1:量化第一列 (W?)

步驟2:對剩余權(quán)重 (W?) 進(jìn)行補(bǔ)償

步驟3:量化更新后的第二列 (W?')

總結(jié)

Hessian矩陣在自補(bǔ)償中的作用
由于在描述 GPTQ 進(jìn)行自補(bǔ)償?shù)臅r候,提到了Hessian矩陣,這里對其的作用稍微進(jìn)行解釋。我們可以把Hessian矩陣看作是模型里的一張“敏感度地圖”或者“誤差影響評估工具”。
我們將模型的性能用損失函數(shù) (L) 來衡量,把它想象成一個復(fù)雜地形的高度。而模型的權(quán)重 (W) 就如同在這個地形上所處的當(dāng)前位置。我們的目標(biāo)是通過移動 (W) 來到達(dá)地形的最低點(diǎn),也就是讓損失函數(shù)達(dá)到最小值。
量化過程就像是對模型權(quán)重進(jìn)行了一次微小且不可避免的推搡,這種推搡就是權(quán)重擾動 δ。這個擾動會使得模型性能下降,在“地形”上表現(xiàn)為引入了損失誤差?。
Hessian矩陣 (H) 描述的是這個“損失地形”的曲率,也就是損失函數(shù)的二階導(dǎo)數(shù)。在不同的方向上,曲率大小不同,對模型的影響也不同。
- 曲率大的方向(敏感):當(dāng)某個方向上的曲率很大時,意味著Hessian矩陣在該方向上的值較大。在這種情況下,沿著這個方向?qū)?quán)重進(jìn)行微小的擾動 δ,就會導(dǎo)致巨大的損失誤差 ?。這些方向?qū)?yīng)的權(quán)重就是模型中最“顯著”或最“敏感”的權(quán)重。
- 曲率小的方向(不敏感):如果某個方向上的曲率較小,說明量化引起的誤差對模型的影響不大。
通過Hessian矩陣,GPTQ可以了解到量化某個參數(shù)時,它會對最終結(jié)果造成多大的影響。這樣,在進(jìn)行量化操作時,GPTQ就能明確對于高敏感度的權(quán)重,需要給予更高優(yōu)先級的補(bǔ)償。
GPTQ 實(shí)現(xiàn)
最早實(shí)現(xiàn) GPTQ 的開源項(xiàng)目是 AutoGPTQ,后來該項(xiàng)目沒有繼續(xù)維護(hù)了,進(jìn)而開源團(tuán)隊轉(zhuǎn)戰(zhàn)GPT - QModel 。GPT - QModel是一款極具實(shí)用性且生產(chǎn)就緒的大型語言模型(LLM)壓縮與量化工具包。工具包通過與 HF Transformers、vLLM 和 SGLang 集成,實(shí)現(xiàn)了在 CPU 和 GPU 上的硬件加速推斷,能夠充分發(fā)揮不同硬件的計算優(yōu)勢,顯著提升推理效率。目前,GPT - QModel 支持多種量化方法,涵蓋 GPTQ、AWQ、QQQ、GPTAQ、EoRa、GAR 等,這些方法各有特點(diǎn),能滿足不同場景下對模型壓縮和量化的需求。
可以通過如下命令進(jìn)行安裝:
pip install -v gptqmodel --no-build-isolation
uv pip install -v gptqmodel --no-build-isolation如下代碼使用 datasets 和 gptqmodel 庫,將 Llama-3.2-1B-Instruct 模型通過 GPTQ 方法量化為 4 位精度。過程包括加載校準(zhǔn)數(shù)據(jù)集、配置量化參數(shù)、加載模型并執(zhí)行量化,最后保存量化后的模型,實(shí)現(xiàn)模型壓縮。
# 導(dǎo)入加載數(shù)據(jù)集的工具和GPTQ量化相關(guān)的類
from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig
# 原始模型的ID(Hugging Face Hub上的Llama-3.2-1B-Instruct模型)
model_id = "meta-llama/Llama-3.2-1B-Instruct"
# 量化后模型的保存路徑
quant_path = "Llama-3.2-1B-Instruct-gptqmodel-4bit"
# 加載校準(zhǔn)數(shù)據(jù)集(用于量化過程中的參數(shù)校準(zhǔn)):
# 加載allenai/c4數(shù)據(jù)集中的en/c4-train.00001-of-01024.json.gz文件,
# 選取訓(xùn)練集的前1024條數(shù)據(jù),并提取其中的"text"字段
calibration_dataset = load_dataset(
"allenai/c4",
data_files="en/c4-train.00001-of-01024.json.gz",
split="train"
).select(range(1024))["text"]
# 定義量化配置:權(quán)重量化為4位,分組大小為128
quant_config = QuantizeConfig(bits=4, group_size=128)
# 根據(jù)模型ID和量化配置加載模型
model = GPTQModel.load(model_id, quant_config)
# 對模型進(jìn)行量化:使用校準(zhǔn)數(shù)據(jù)集,設(shè)置批次大小為1(可根據(jù)GPU顯存調(diào)整batch_size以加速量化)
model.quantize(calibration_dataset, batch_size=1)
# 將量化后的模型保存到指定路徑
model.save(quant_path)參考文獻(xiàn):
https://arxiv.org/pdf/2306.00978
https://arxiv.org/pdf/2210.17323
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。



































