壓縮而不失智:LLM 量化技術(shù)深度解析
像我們這樣的大語言模型,多少有點(diǎn)“養(yǎng)尊處優(yōu)”。我們鐘愛龐大的參數(shù)規(guī)模、海量的內(nèi)存和強(qiáng)悍的 GPU。但當(dāng)有人試圖在手機(jī)或配備低性能 GPU 的筆記本電腦上運(yùn)行我們時,現(xiàn)實(shí)便會毫不留情地給我們一記耳光。
工程師們?nèi)绾未_保我們在微型設(shè)備上依然能流暢智能地運(yùn)行?
答案就是:量化技術(shù)(quantization) —— 它是現(xiàn)代 AI 模型部署中的一項(xiàng)核心技術(shù)。
讓我們花點(diǎn)時間,真正理解它。
什么是量化技術(shù)?
量化的本質(zhì)在于降低數(shù)值的存儲精度。LLM的所有運(yùn)算都離不開數(shù)字——每個權(quán)重參數(shù)、每次激活值、每一個注意力分?jǐn)?shù),全都建立在浮點(diǎn)數(shù)運(yùn)算之上。這些數(shù)值流暢、連續(xù)、無限精確。
image.png
但計(jì)算機(jī)呢?它們更喜歡固定、離散的存儲單元(比如整數(shù)而不是高精度浮點(diǎn)數(shù))。要么你的數(shù)據(jù)能塞進(jìn)去,要么就塞不進(jìn)去。就像你試圖把整個衣柜塞進(jìn)一個登機(jī)箱一樣,裝得下就裝,裝不下就沒辦法。這時候,量化技術(shù)站出來說:
“嘿,大語言模型,如果每個數(shù)字不再使用 32 位精度,而是砍到 8 位,甚至 4 位呢?你幾乎察覺不到差別,但我們能省下大量內(nèi)存。”
32 位浮點(diǎn)數(shù)(FP32)→ 黃金標(biāo)準(zhǔn)
8 位整數(shù)(INT8)→ 依然智能,體積要小得多
4 位整數(shù)(INT4)→ 超緊湊,只是稍微健忘一點(diǎn)
好吧,但大語言模型為什么要在乎這個?
因?yàn)楝F(xiàn)在的 LLM 實(shí)在太臃腫了。數(shù)十億參數(shù)需要數(shù)十億個數(shù)字。一個 70B 參數(shù)的模型若用 FP32 表示,需要 280 GB——這已經(jīng)不是模型了,這是存儲災(zāi)難。
量化能把這種情況:“我得靠一整個服務(wù)器集群才能跑這個東西”
變成這樣:“嘿,我或許能在筆記本上運(yùn)行它,甚至在手機(jī)上也行!”
本質(zhì)上這就是 AI 模型的瘦身方案 —— 在保持智能的前提下剔除冗余數(shù)據(jù)。
但是,壓縮數(shù)字精度不會損害模型質(zhì)量嗎?
有時候確實(shí)會。但量化的精髓(也是整門技術(shù)的重點(diǎn))在于:
在模型最不敏感的地方降低精度
在模型最核心的地方保留準(zhǔn)確性
量化在大語言模型生命周期中的位置:訓(xùn)練 vs 推理
在我搞清楚“量化是什么”之后,下一個問題便接踵而至:
“挺酷的,但我們到底什么時候做量化?是在訓(xùn)練期間?訓(xùn)練之后?還是兩個階段都需要?”
事實(shí)證明,時機(jī)的選擇非常關(guān)鍵,因?yàn)榇笳Z言模型非常挑剔。你是在它們學(xué)習(xí)過程中就引入量化,還是等它們已經(jīng)記牢所有模式后再量化,表現(xiàn)會大不相同。
2.1 訓(xùn)練后量化(Post-Training Quantization, PTQ)
可以把 PTQ 想象成給模型貼一張便利貼提醒:
“嘿,我要把你的某些數(shù)字四舍五入了,試著適應(yīng)一下。”
你直接拿一個已經(jīng)完全訓(xùn)練好的模型,然后進(jìn)行:
- FP32 → INT8 或 INT4
- 可能還會用一些花哨的取整技巧
優(yōu)點(diǎn)是:
- 快速又便宜:無需重新訓(xùn)練一個 70B 參數(shù)的龐然大物
- 易于實(shí)驗(yàn):可以先試試 INT8,看模型是否撐得住,再大膽嘗試更低精度
缺點(diǎn)是(我是吃了虧才明白的):
- 精度可能下降:某些網(wǎng)絡(luò)層對量化極其敏感
- 異常值影響大:如果某個權(quán)重特別大,會破壞整個量化尺度,導(dǎo)致所有參數(shù)在壓縮后嚴(yán)重失真。
- 有時需要保留原精度層:LayerNorm、嵌入層(embedding layers)或語言模型頭(LM head)可能得保持在 FP16 精度
2.2 量化感知訓(xùn)練(Quantization-Aware Training, QAT)
QAT 是更成熟、更系統(tǒng)的做法。與其等模型學(xué)完后再強(qiáng)迫它適應(yīng)低精度,不如從一開始訓(xùn)練時就讓它習(xí)慣。
我探索 QAT 時是這么做的:
- 在訓(xùn)練過程中插入“偽量化層”(fake quantization layers):模型在學(xué)習(xí)時就看到低精度的數(shù)字
- 使用直通估計(jì)器(straight-through estimators)讓梯度正常流動,使模型能主動適應(yīng)
- 到訓(xùn)練結(jié)束時,權(quán)重天然具備對量化噪聲的魯棒性
優(yōu)點(diǎn)是:
- 最終準(zhǔn)確率更高,尤其在極低精度(如 INT4 或 3-bit)時
- 推理更穩(wěn)定,意外更少
- 可以進(jìn)行激進(jìn)量化而不丟失模型的“聰明勁兒”
缺點(diǎn)(我注意到的):
- 耗時:哪怕只部分重訓(xùn) 7B–70B 的模型,成本也很高
- 工程投入大:需要謹(jǐn)慎集成到訓(xùn)練流程中
如何選擇(根據(jù)我的實(shí)驗(yàn)和閱讀):
- PTQ → 首選方案。便宜、快速,在 INT8 上效果出奇地好,配合智能取整策略,INT4 也常常有效
- QAT → 僅當(dāng)你需要最后那 1–2% 的準(zhǔn)確率,或要做極低精度(如 4-bit 以下)量化時才用
- 混合方案 → 先做 PTQ,同時將某些關(guān)鍵層回退到 FP16,再對核心層做輕量微調(diào)(近似 mini-QAT)
為什么選擇在哪個階段進(jìn)行量化如此重要?
我意識到,量化不只是一個數(shù)學(xué)技巧 —— 它會徹底改變整個部署流程:
- 對純推理任務(wù),PTQ 往往勝出:顯存占用更少,吞吐量更高
- 對需要訓(xùn)練+部署的完整工作流程,QAT 可能更劃算:最終模型更小,長上下文處理能力也更強(qiáng)
選擇在哪個階段進(jìn)行量化的問題歸根結(jié)底是:
你是想要快速、便宜、基本夠用,還是謹(jǐn)慎、稍慢、接近完美?
量化技術(shù)背后的運(yùn)作機(jī)制
在我搞清楚“何時”量化之后,就不得不弄明白“量化究竟是怎么實(shí)現(xiàn)的”。老實(shí)說,這個過程出人意料地優(yōu)雅。量化的核心思想很簡單:
把連續(xù)且無限精確的數(shù)字,映射到一組有限的離散值上,并盡可能保留模型的“智能”。
image.png
3.1 理解縮放因子(Scale)與零點(diǎn)(Zero-Point)
想象模型中的這樣一個權(quán)重:
0.8921374650012345我們真的需要這么多小數(shù)位嗎?不需要。量化技術(shù)是這樣做的:
- 選擇一個縮放因子(s)→ 決定每個“區(qū)間”有多寬
- 選擇一個零點(diǎn)(z)→ 將我們的整數(shù)對齊到實(shí)際數(shù)據(jù)的范圍
公式看起來挺花哨,但概念上其實(shí)很簡單:
quantized_value = round(original_value / scale) + zero_point當(dāng)你想還原回 FP32 時:
dequantized_value = (quantized_value - zero_point) * scale3.2 對稱量化 vs 非對稱量化
我發(fā)現(xiàn),并不是所有量化都一樣:
- 對稱量化(Symmetric quantization) → 零點(diǎn)為 0,區(qū)間以 0 為中心對稱
優(yōu)點(diǎn):更簡單,效率極高
常用于權(quán)重
- 非對稱量化(Asymmetric quantization) → 零點(diǎn)可調(diào),正負(fù)范圍不一定相等
優(yōu)點(diǎn):能更好地捕捉偏態(tài)分布
常用于激活值(activations),因?yàn)樗鼈兺ǔ2皇且?0 為中心的
3.3 按張量量化 vs 按通道量化:粒度很重要
起初,我嘗試了按張量量化(per-tensor quantization):整個權(quán)重矩陣使用一套縮放因子和零點(diǎn)。很簡單,但有時會出現(xiàn)災(zāi)難性失效。為什么呢?因?yàn)?Transformer 很挑剔 —— 權(quán)重矩陣中有些行的數(shù)值很大,有些則很小。若整行共用一套縮放因子,結(jié)果會是:
- 小數(shù)值被擠進(jìn)同一個區(qū)間(導(dǎo)致精度損失)
- 或大數(shù)值被截?cái)啵óa(chǎn)生巨大誤差)
解決方案?按通道(per-channel,即按行)量化。
- 每一行都有自己獨(dú)立的縮放因子(和可能的零點(diǎn))
- 保留了數(shù)值的相對差異
- 與帶來的收益相比,其額外的內(nèi)存開銷微乎其微
3.4 取整與截?cái)啵何⑿≌`差,重大影響
量化并非魔法。它會引入兩類誤差:
- 取整誤差(Rounding error) → 實(shí)際值與其最接近的量化區(qū)間值之間的差異
- 截?cái)嗾`差(Clipping error) → 當(dāng)數(shù)值超出可表示范圍時被強(qiáng)行裁剪
像 GPTQ 或 SmoothQuant 這樣的現(xiàn)代 LLM 量化方案,核心就是通過巧妙的取整方法或?qū)娱g重平衡(rebalancing)來最小化這些誤差(后面會細(xì)說)。
3.5 如何選擇量化精度
這是我每天都要面對的問題:
FP32 → INT8 → INT4 → … 我最多能壓縮到多少位?
我的經(jīng)驗(yàn)是:通常先從 INT8 開始 —— 安全又經(jīng)濟(jì),只有在采用高級取整技術(shù)時,才嘗試 INT4。低于 4 比特的量化尚處于實(shí)驗(yàn)階段,除非你準(zhǔn)備好對模型進(jìn)行微調(diào),否則風(fēng)險很高。
3.6 一個直觀的比喻
這是我的思維模型:
image.png
- 每個權(quán)重 = 一件衣服
- 每個量化區(qū)間 = 行李箱里的一個隔層
- 縮放因子 = 你的隔層有多大
- 零點(diǎn) = 第一個隔層從哪兒開始
量化為何有時會帶來副作用
量化并非魔法 —— 如果我們不夠謹(jǐn)慎,它可能會微妙地破壞模型性能。這些誤差主要來源于以下幾個方面:
image.png
1)取整誤差:將 FP32 精度的數(shù)值映射到 INT8/INT4 會引入微小的精度損失。
- 單次誤差很小,但在 Transformer 中,微小的取整誤差會跨層累積。
- 結(jié)果:導(dǎo)致注意力分布或詞元概率發(fā)生細(xì)微變化,有時甚至?xí)l(fā)模型幻覺。
2)截?cái)嗾`差:異常值會迫使量化因子變大。
- 這使得大多數(shù)權(quán)重被壓縮到少數(shù)幾個區(qū)間內(nèi) → 有效精度大幅下降。
- 實(shí)例:LayerNorm 層中一個罕見的大激活值若被截?cái)啵涂赡軐?dǎo)致模型不穩(wěn)定。
快速應(yīng)對:采用百分位數(shù)法確定縮放因子,代替極值法,或?qū)γ舾袑犹厥馓幚怼?/p>
3)網(wǎng)絡(luò)層敏感度差異:并非所有網(wǎng)絡(luò)層對量化的反應(yīng)都相同:
- 注意力投影層(Attention projections) & 語言模型頭(LM head) → 高度敏感
- LayerNorm 層 → 極度敏感,通常需保持 FP16 精度
- MLP 層 → 中等敏感,可耐受 INT8/INT4
- 嵌入層(Embeddings) → 中高度敏感,需要小心處理
高級量化技術(shù)
在經(jīng)歷了取整、截?cái)嗪兔舾芯W(wǎng)絡(luò)層帶來的種種挑戰(zhàn)后,研究人員和工程師們開發(fā)出一些巧妙的方法,使得 LLM 即使在 4 位精度下也能表現(xiàn)出色。以下是我了解到的一些核心技術(shù)。
image.png
5.1 GPTQ:基于 Hessian 矩陣的智能取整
核心思想:并非所有取整誤差都同等重要。某些權(quán)重對模型輸出的影響更大。
GPTQ 通過分析模型的二階敏感度(Hessian 矩陣)來識別哪些權(quán)重可以安全地進(jìn)行取整處理。
效果:即使在大模型中,INT4 權(quán)重量化也能幾乎保持原始精度。
5.2 AWQ:激活感知量化
激活值與權(quán)重相互作用,如果在對權(quán)重進(jìn)行取整時不考慮激活值的分布范圍,可能會損害模型性能。
AWQ 根據(jù)激活值的統(tǒng)計(jì)特征來調(diào)整權(quán)重量化策略,從而降低推理過程中的誤差風(fēng)險。
5.3 SmoothQuant:層間平衡技術(shù)
痛點(diǎn):某些網(wǎng)絡(luò)層的激活值范圍過大,導(dǎo)致均勻量化效率低下。
SmoothQuant 會在不同層之間對權(quán)重和激活值進(jìn)行重新縮放,但保證它們相乘后的結(jié)果(即模型的輸出)保持不變。
優(yōu)勢:實(shí)現(xiàn)更平滑的量化,大幅減小精度損失。
5.4 HQQ 與混合方法
該方法將 Hessian 信息與混合精度或分組量化技術(shù)相結(jié)合。
思路:對層中“安全”的部分使用低比特精度,而對敏感部分保留更高精度。
該技術(shù)在對生產(chǎn)級模型進(jìn)行 INT4 或更低比特量化時尤為實(shí)用。
5.5 混合精度回退機(jī)制
有些網(wǎng)絡(luò)層天生抗拒被量化。
常見策略:將 LayerNorm、LM Head(語言模型輸出頭)以及部分嵌入層維持在 FP16 精度,其余部分則量化為 INT4/INT8。
權(quán)衡:雖略微增加內(nèi)存占用,卻能換來模型質(zhì)量的大幅提升。
KV 緩存量化
如果你曾嘗試用大語言模型處理長上下文任務(wù),一定對此深有體會:KV 緩存會瘋狂占用內(nèi)存。每個生成的詞元都要為每一層保存鍵(Key)矩陣和值(Value)矩陣,而模型動輒擁有數(shù)十億參數(shù),內(nèi)存很快就會被吃光。量化技術(shù)此時便派上用場。
image.png
6.1 為什么 KV 緩存很重要
在解碼過程中,Transformer 會為每個歷史詞元存儲鍵(K)和值(V)。
這樣就能在計(jì)算注意力時訪問所有先前詞元,無需重復(fù)計(jì)算。
問題在于:對于長提示詞(如 8K+ 詞元)和超大模型(70B+ 參數(shù)),緩存可能占用大部分 GPU 內(nèi)存。
6.2 INT8/INT4 KV 緩存
將鍵和值以更低精度(如 INT8 或 INT4)存儲,可大幅減少內(nèi)存占用。
精度損失極小,因?yàn)樽⒁饬C(jī)制對 K/V 矩陣中的微小取整噪聲具有較強(qiáng)的容忍度。
用一種更為直觀的方式理解:注意力機(jī)制包容性強(qiáng),就像聽 128kbps 的歌曲 —— 細(xì)節(jié)雖有損失,但整體旋律依舊清晰。
6.3 反量化 or 直接在整數(shù)域中進(jìn)行計(jì)算
兩種實(shí)現(xiàn)方式:
1)動態(tài)反量化(Dequant on-the-fly)
- 在計(jì)算注意力時,將 INT8/INT4 臨時轉(zhuǎn)回 FP16
- 有輕微計(jì)算開銷,但內(nèi)存效率高
2)在整數(shù)域中直接計(jì)算(Compute directly in integer domain)
- 充分利用支持低精度運(yùn)算的硬件(如支持 INT8 的 GPU)
- 速度更快、內(nèi)存數(shù)據(jù)移動量更少,但工程實(shí)現(xiàn)稍復(fù)雜
6.4 實(shí)用建議
將 KV 緩存量化與分層混合精度結(jié)合使用,效果最佳。
INT8 KV 緩存通常很安全;若使用 INT4,建議配合高級取整策略(如 GPTQ 或 AWQ)。
務(wù)必在長序列上進(jìn)行測試 —— 短上下文的基準(zhǔn)測試無法暴露潛在的模型幻覺或詞元錯位問題。
量化技術(shù)實(shí)戰(zhàn)工作流
在深入研究了量化的原理、誤差來源和高級技巧后,我意識到真正的挑戰(zhàn)不在于理解量化,而在于如何安全地實(shí)施它而不破壞模型。以下是我的實(shí)踐方法。
7.1 準(zhǔn)備校準(zhǔn)數(shù)據(jù)集
在調(diào)整任何權(quán)重之前,首先準(zhǔn)備一個體量小但具有代表性的數(shù)據(jù)集:
- 包含 100-500 條覆蓋模型典型任務(wù)的輸入序列
- 目的:記錄每一層激活值的數(shù)值范圍和分布形態(tài),從而為后續(xù)的量化過程提供準(zhǔn)確的統(tǒng)計(jì)依據(jù)。
- 原因:如果推理時的激活值分布與校準(zhǔn)數(shù)據(jù)偏差過大,INT4 量化可能會失敗
7.2 逐層確定精度
并非所有網(wǎng)絡(luò)層都能同等程度地適應(yīng) INT4 精度:
- MLP 層和大多數(shù)注意力權(quán)重 → 采用 INT4
- 嵌入層 → 若存在風(fēng)險則采用 INT8
- LayerNorm、LM Head 及有時首個投影層 → 回退至 FP16 精度
7.3 執(zhí)行量化操作
首先進(jìn)行訓(xùn)練后量化(PTQ),通常將所有權(quán)重轉(zhuǎn)為 INT8,檢查模型輸出
然后使用 GPTQ 或 AWQ 逐步將 MLP /注意力層降至 INT4
始終將敏感網(wǎng)絡(luò)層保持在 FP16 精度
此階段是迭代過程:應(yīng)用量化 → 測試 → 調(diào)整網(wǎng)絡(luò)層精度
7.4 評估與調(diào)試
這是理論照進(jìn)現(xiàn)實(shí)的環(huán)節(jié):
- 使用真實(shí)場景的提示詞進(jìn)行測試,而非僅依賴基準(zhǔn)數(shù)據(jù)集
- 檢查是否出現(xiàn)幻覺、詞元錯位或推理能力下降
- 若某網(wǎng)絡(luò)層表現(xiàn)異常,可選擇性地恢復(fù)其精度或嘗試按通道縮放
7.5 微調(diào)(可選步驟)
對于激進(jìn)的低比特量化(如 INT4、混合 3-4 位量化),有時需要進(jìn)行輕量級的量化感知微調(diào):
- 在校準(zhǔn)數(shù)據(jù)上訓(xùn)練幾個 epoch
- 讓模型適應(yīng)量化引入的噪聲
- 通常能將 INT4 的性能表現(xiàn)提升至接近 FP16 水平
7.6 部署就緒
當(dāng)量化穩(wěn)定后:
- KV 緩存也進(jìn)行量化(INT8/INT4),提升內(nèi)存效率
- 對那些被特意保留為較高精度的層,已采取保護(hù)措施
- 模型已通過長上下文任務(wù)測試
最終成果:內(nèi)存占用更小,推理速度更快,精度損失微乎其微。當(dāng)?shù)谝淮慰吹?70B 參數(shù)的模型在單張 GPU 上流暢運(yùn)行時,那種感覺堪稱神奇。
應(yīng)用場景
image.png
- 端側(cè) AI(On-Device AI):量化讓我能直接在筆記本、邊緣設(shè)備甚至手機(jī)上運(yùn)行大語言模型。過去需要多卡 GPU 服務(wù)器的模型,如今單張 GPU 就能裝下,讓 AI 能夠進(jìn)行實(shí)時交互,擺脫云端延遲。我用它來做筆記、進(jìn)行代碼補(bǔ)全、當(dāng)離線聊天助手 —— 就像把一臺超級計(jì)算機(jī)裝進(jìn)了背包里。
- 高性價比的云端部署(Cost-Efficient Cloud Deployment):即使在云端,量化也能大幅降低 GPU 內(nèi)存占用,使單個節(jié)點(diǎn)能夠服務(wù)更多用戶,大幅節(jié)省運(yùn)維成本。例如,如果一個 13B 模型在 INT4 精度下的表現(xiàn)幾乎與 FP16 相當(dāng),但 GPU 內(nèi)存占用減少了一半,這樣使得預(yù)算有限的團(tuán)隊(duì)也可以部署高性能的 LLM。
- 長上下文應(yīng)用(Long-Context Applications):通過降低 KV 緩存的內(nèi)存占用,使得處理長文檔成為可能。借助 INT8 或 INT4 的 KV 緩存,我成功實(shí)現(xiàn)了整本書籍的摘要生成、分析法律合同,甚至維持?jǐn)?shù)小時的連續(xù)對話而不會爆內(nèi)存。這讓虛擬助手、教學(xué)系統(tǒng)和摘要工具能無縫處理超長上下文。
- 多模型協(xié)作流水線(Multi-Model Pipelines):量化模型在混合流水線中表現(xiàn)尤為出色。我經(jīng)常用小型 INT4 模型做初步篩選或生成初始建議,再將結(jié)果交給更大的模型進(jìn)行最終推理。若無量化技術(shù),并行調(diào)度多個模型會很容易超出內(nèi)存限制。而現(xiàn)在,就像在一臺機(jī)器上部署了一整個 AI 專家團(tuán)隊(duì)。
- 研究與實(shí)驗(yàn)(Research and Experimentation):最后,量化技術(shù)讓實(shí)驗(yàn)變得更快速、更便宜。我可以在消費(fèi)級 GPU 上迭代新架構(gòu)、測試模型消融實(shí)驗(yàn)或微調(diào)模型,無需等待昂貴的專用硬件。這極大加速了我們的學(xué)習(xí)與實(shí)驗(yàn)進(jìn)程,讓大模型研究變得更加觸手可及。



































