編者按: 如何在資源受限的設備上高效部署大語言模型,同時還儘可能保持其性能表現?
我們今天為大家帶來的這篇文章,作者的核心觀點是:量化技術通過在模型精度與效率之間尋找最優平衡點,使得大語言模型能夠在資源受限的設備上高效部署,而幾乎不降低其"智能水平"。
文章從量化的基本原理出發,深入剖析了訓練後量化(PTQ)與量化感知訓練(QAT)的適用場景,詳細解釋了縮放因子、零點、對稱/非對稱量化等關鍵技術細節,並進一步探討了高級量化技術(如 GPTQ、AWQ、SmoothQuant)以及 KV 緩存量化等前沿方法。作者還結合實戰經驗,梳理出一套可落地的量化工作流,並展示了量化在端側 AI、低成本雲部署、長上下文處理等場景中的巨大價值。
作者 | Bhavishya Pandit
編譯 | 嶽揚
像我們這樣的大語言模型,多少有點"養尊處優"。我們鍾愛龐大的參數規模、海量的內存和強悍的 GPU。但當有人試圖在手機或配備低性能 GPU 的筆記本電腦上運行我們時,現實便會毫不留情地給我們一記耳光。
工程師們如何確保我們在微型設備上依然能流暢智能地運行?
答案就是:量化技術(quantization) ------ 它是現代 AI 模型部署中的一項核心技術。
讓我們花點時間,真正理解它。
01 什麼是量化技術?
量化的本質在於降低數值的存儲精度。 LLM的所有運算都離不開數字------每個權重參數、每次激活值、每一個注意力分數,全都建立在浮點數運算之上。這些數值流暢、連續、無限精確。
但計算機呢?它們更喜歡固定、離散的存儲單元(比如整數而不是高精度浮點數)。要麼你的數據能塞進去,要麼就塞不進去。就像你試圖把整個衣櫃塞進一個登機箱一樣,裝得下就裝,裝不下就沒辦法。這時候,量化技術站出來説:
"嘿,大語言模型,如果每個數字不再使用 32 位精度,而是砍到 8 位,甚至 4 位呢?你幾乎察覺不到差別,但我們能省下大量內存。"
32 位浮點數(FP32)→ 黃金標準
8 位整數(INT8)→ 依然智能,體積要小得多
4 位整數(INT4)→ 超緊湊,只是稍微健忘一點
好吧,但大語言模型為什麼要在乎這個?
因為現在的 LLM 實在太臃腫了。數十億參數需要數十億個數字。一個 70B 參數的模型若用 FP32 表示,需要 280 GB------這已經不是模型了,這是存儲災難。
量化能把這種情況:"我得靠一整個服務器集羣才能跑這個東西"
變成這樣:"嘿,我或許能在筆記本上運行它,甚至在手機上也行!"
本質上這就是 AI 模型的瘦身方案 ------ 在保持智能的前提下剔除冗餘數據。
但是,壓縮數字精度不會損害模型質量嗎?
有時候確實會。但量化的精髓(也是整門技術的重點)在於:
在模型最不敏感的地方降低精度
在模型最核心的地方保留準確性
02 量化在大語言模型生命週期中的位置:訓練 vs 推理
在我搞清楚"量化是什麼"之後,下一個問題便接踵而至:
"挺酷的,但我們到底什麼時候做量化?是在訓練期間?訓練之後?還是兩個階段都需要?"
事實證明,時機的選擇非常關鍵,因為大語言模型非常挑剔。你是在它們學習過程中就引入量化,還是等它們已經記牢所有模式後再量化,表現會大不相同。
2.1 訓練後量化(Post-Training Quantization, PTQ)
可以把 PTQ 想象成給模型貼一張便利貼提醒:
"嘿,我要把你的某些數字四捨五入了,試着適應一下。"
你直接拿一個已經完全訓練好的模型,然後進行:
- FP32 → INT8 或 INT4
- 可能還會用一些花哨的取整技巧
優點是:
- 快速又便宜:無需重新訓練一個 70B 參數的龐然大物
- 易於實驗:可以先試試 INT8,看模型是否撐得住,再大膽嘗試更低精度
缺點是(我是吃了虧才明白的):
- 精度可能下降:某些網絡層對量化極其敏感
- 異常值影響大:如果某個權重特別大,會破壞整個量化尺度,導致所有參數在壓縮後嚴重失真。
- 有時需要保留原精度層:LayerNorm、嵌入層(embedding layers)或語言模型頭(LM head)可能得保持在 FP16 精度
2.2 量化感知訓練(Quantization-Aware Training, QAT)
QAT 是更成熟、更系統的做法。與其等模型學完後再強迫它適應低精度,不如從一開始訓練時就讓它習慣。
我探索 QAT 時是這麼做的:
- 在訓練過程中插入"偽量化層"(fake quantization layers):模型在學習時就看到低精度的數字
- 使用直通估計器(straight-through estimators)讓梯度正常流動,使模型能主動適應
- 到訓練結束時,權重天然具備對量化噪聲的魯棒性
優點是:
- 最終準確率更高,尤其在極低精度(如 INT4 或 3-bit)時
- 推理更穩定,意外更少
- 可以進行激進量化而不丟失模型的"聰明勁兒"
缺點(我注意到的):
- 耗時:哪怕只部分重訓 7B--70B 的模型,成本也很高
- 工程投入大:需要謹慎集成到訓練流程中
如何選擇(根據我的實驗和閲讀):
- PTQ → 首選方案。便宜、快速,在 INT8 上效果出奇地好,配合智能取整策略,INT4 也常常有效
- QAT → 僅當你需要最後那 1--2% 的準確率,或要做極低精度(如 4-bit 以下)量化時才用
- 混合方案 → 先做 PTQ,同時將某些關鍵層回退到 FP16,再對核心層做輕量微調(近似 mini-QAT)
為什麼選擇在哪個階段進行量化如此重要?
我意識到,量化不只是一個數學技巧 ------ 它會徹底改變整個部署流程:
- 對純推理任務,PTQ 往往勝出:顯存佔用更少,吞吐量更高
- 對需要訓練+部署的完整工作流程,QAT 可能更划算:最終模型更小,長上下文處理能力也更強
選擇在哪個階段進行量化的問題歸根結底是:
你是想要快速、便宜、基本夠用,還是謹慎、稍慢、接近完美?
03 量化技術背後的運作機制
在我搞清楚"何時"量化之後,就不得不弄明白"量化究竟是怎麼實現的"。老實説,這個過程出人意料地優雅。量化的核心思想很簡單:
把連續且無限精確的數字,映射到一組有限的離散值上,並儘可能保留模型的"智能"。
3.1 理解縮放因子(Scale)與零點(Zero-Point)
想象模型中的這樣一個權重:
0.8921374650012345
我們真的需要這麼多小數位嗎?不需要。量化技術是這樣做的:
- 選擇一個縮放因子(s)→ 決定每個"區間"有多寬
- 選擇一個零點(z)→ 將我們的整數對齊到實際數據的範圍
公式看起來挺花哨,但概念上其實很簡單:
quantized_value = round(original_value / scale) + zero_point
當你想還原回 FP32 時:
dequantized_value = (quantized_value - zero_point) * scale
3.2 對稱量化 vs 非對稱量化
我發現,並不是所有量化都一樣:
- 對稱量化(Symmetric quantization) → 零點為 0,區間以 0 為中心對稱
- 優點:更簡單,效率極高
- 常用於權重
- 非對稱量化(Asymmetric quantization) → 零點可調,正負範圍不一定相等
- 優點:能更好地捕捉偏態分佈
- 常用於激活值(activations),因為它們通常不是以 0 為中心的
3.3 按張量量化 vs 按通道量化:粒度很重要
起初,我嘗試了按張量量化(per-tensor quantization):整個權重矩陣使用一套縮放因子和零點。很簡單,但有時會出現災難性失效。為什麼呢?因為 Transformer 很挑剔 ------ 權重矩陣中有些行的數值很大,有些則很小。若整行共用一套縮放因子,結果會是:
- 小數值被擠進同一個區間(導致精度損失)
- 或大數值被截斷(產生巨大誤差)
解決方案?按通道(per-channel,即按行)量化。
- 每一行都有自己獨立的縮放因子(和可能的零點)
- 保留了數值的相對差異
- 與帶來的收益相比,其額外的內存開銷微乎其微
3.4 取整與截斷:微小誤差,重大影響
量化並非魔法。它會引入兩類誤差:
- 取整誤差(Rounding error) → 實際值與其最接近的量化區間值之間的差異
- 截斷誤差(Clipping error) → 當數值超出可表示範圍時被強行裁剪
像 GPTQ 或 SmoothQuant 這樣的現代 LLM 量化方案,核心就是通過巧妙的取整方法或層間重平衡(rebalancing)來最小化這些誤差(後面會細説)。
3.5 如何選擇量化精度
這是我每天都要面對的問題:
FP32 → INT8 → INT4 → ... 我最多能壓縮到多少位?
我的經驗是:通常先從 INT8 開始 ------ 安全又經濟,只有在採用高級取整技術時,才嘗試 INT4。低於 4 比特的量化尚處於實驗階段,除非你準備好對模型進行微調,否則風險很高。
3.6 一個直觀的比喻
這是我的思維模型:
- 每個權重 = 一件衣服
- 每個量化區間 = 行李箱裏的一個隔層
- 縮放因子 = 你的隔層有多大
- 零點 = 第一個隔層從哪兒開始
04 量化為何有時會帶來副作用
量化並非魔法 ------ 如果我們不夠謹慎,它可能會微妙地破壞模型性能。這些誤差主要來源於以下幾個方面:
1)取整誤差:將 FP32 精度的數值映射到 INT8/INT4 會引入微小的精度損失。
- 單次誤差很小,但在 Transformer 中,微小的取整誤差會跨層累積。
- 結果:導致注意力分佈或詞元概率發生細微變化,有時甚至會引發模型幻覺。
2)截斷誤差:異常值會迫使量化因子變大。
- 這使得大多數權重被壓縮到少數幾個區間內 → 有效精度大幅下降。
- 實例:LayerNorm 層中一個罕見的大激活值若被截斷,就可能導致模型不穩定。
快速應對:採用百分位數法確定縮放因子,代替極值法,或對敏感層特殊處理。
3)網絡層敏感度差異:並非所有網絡層對量化的反應都相同:
- 注意力投影層(Attention projections) & 語言模型頭(LM head) → 高度敏感
- LayerNorm 層 → 極度敏感,通常需保持 FP16 精度
- MLP 層 → 中等敏感,可耐受 INT8/INT4
- 嵌入層(Embeddings) → 中高度敏感,需要小心處理
05 高級量化技術
在經歷了取整、截斷和敏感網絡層帶來的種種挑戰後,研究人員和工程師們開發出一些巧妙的方法,使得 LLM 即使在 4 位精度下也能表現出色。以下是我瞭解到的一些核心技術。
5.1 GPTQ:基於 Hessian 矩陣的智能取整
- 核心思想:並非所有取整誤差都同等重要。某些權重對模型輸出的影響更大。
- GPTQ 通過分析模型的二階敏感度(Hessian 矩陣)來識別哪些權重可以安全地進行取整處理。
- 效果:即使在大模型中,INT4 權重量化也能幾乎保持原始精度。
5.2 AWQ:激活感知量化
- 激活值與權重相互作用,如果在對權重進行取整時不考慮激活值的分佈範圍,可能會損害模型性能。
- AWQ 根據激活值的統計特徵來調整權重量化策略,從而降低推理過程中的誤差風險。
5.3 SmoothQuant:層間平衡技術
- 痛點:某些網絡層的激活值範圍過大,導致均勻量化效率低下。
- SmoothQuant 會在不同層之間對權重和激活值進行重新縮放,但保證它們相乘後的結果(即模型的輸出)保持不變。
- 優勢:實現更平滑的量化,大幅減小精度損失。
5.4 HQQ 與混合方法
- 該方法將 Hessian 信息與混合精度或分組量化技術相結合。
- 思路:對層中"安全"的部分使用低比特精度,而對敏感部分保留更高精度。
- 該技術在對生產級模型進行 INT4 或更低比特量化時尤為實用。
5.5 混合精度回退機制
- 有些網絡層天生抗拒被量化。
- 常見策略:將 LayerNorm、LM Head(語言模型輸出頭)以及部分嵌入層維持在 FP16 精度,其餘部分則量化為 INT4/INT8。
- 權衡:雖略微增加內存佔用,卻能換來模型質量的大幅提升。
06 KV 緩存量化
如果你曾嘗試用大語言模型處理長上下文任務,一定對此深有體會:KV 緩存會瘋狂佔用內存。每個生成的詞元都要為每一層保存鍵(Key)矩陣和值(Value)矩陣,而模型動輒擁有數十億參數,內存很快就會被吃光。量化技術此時便派上用場。
6.1 為什麼 KV 緩存很重要
- 在解碼過程中,Transformer 會為每個歷史詞元存儲鍵(K)和值(V)。
- 這樣就能在計算注意力時訪問所有先前詞元,無需重複計算。
- 問題在於:對於長提示詞(如 8K+ 詞元)和超大模型(70B+ 參數),緩存可能佔用大部分 GPU 內存。
6.2 INT8/INT4 KV 緩存
- 將鍵和值以更低精度(如 INT8 或 INT4)存儲,可大幅減少內存佔用。
- 精度損失極小,因為注意力機制對 K/V 矩陣中的微小取整噪聲具有較強的容忍度。
用一種更為直觀的方式理解:注意力機制包容性強,就像聽 128kbps 的歌曲 ------ 細節雖有損失,但整體旋律依舊清晰。
6.3 反量化 or 直接在整數域中進行計算
兩種實現方式:
1)動態反量化(Dequant on-the-fly)
- 在計算注意力時,將 INT8/INT4 臨時轉回 FP16
- 有輕微計算開銷,但內存效率高
2)在整數域中直接計算(Compute directly in integer domain)
- 充分利用支持低精度運算的硬件(如支持 INT8 的 GPU)
- 速度更快、內存數據移動量更少,但工程實現稍複雜
6.4 實用建議
- 將 KV 緩存量化與分層混合精度結合使用,效果最佳。
- INT8 KV 緩存通常很安全;若使用 INT4,建議配合高級取整策略(如 GPTQ 或 AWQ)。
- 務必在長序列上進行測試 ------ 短上下文的基準測試無法暴露潛在的模型幻覺或詞元錯位問題。
07 量化技術實戰工作流
在深入研究了量化的原理、誤差來源和高級技巧後,我意識到真正的挑戰不在於理解量化,而在於如何安全地實施它而不破壞模型。以下是我的實踐方法。
7.1 準備校準數據集
在調整任何權重之前,首先準備一個體量小但具有代表性的數據集:
- 包含 100-500 條覆蓋模型典型任務的輸入序列
- 目的:記錄每一層激活值的數值範圍和分佈形態,從而為後續的量化過程提供準確的統計依據。
- 原因:如果推理時的激活值分佈與校準數據偏差過大,INT4 量化可能會失敗
7.2 逐層確定精度
並非所有網絡層都能同等程度地適應 INT4 精度:
- MLP 層和大多數注意力權重 → 採用 INT4
- 嵌入層 → 若存在風險則採用 INT8
- LayerNorm、LM Head 及有時首個投影層 → 回退至 FP16 精度
7.3 執行量化操作
- 首先進行訓練後量化(PTQ),通常將所有權重轉為 INT8,檢查模型輸出
- 然後使用 GPTQ 或 AWQ 逐步將 MLP /注意力層降至 INT4
- 始終將敏感網絡層保持在 FP16 精度
此階段是迭代過程:應用量化 → 測試 → 調整網絡層精度
7.4 評估與調試
這是理論照進現實的環節:
- 使用真實場景的提示詞進行測試,而非僅依賴基準數據集
- 檢查是否出現幻覺、詞元錯位或推理能力下降
- 若某網絡層表現異常,可選擇性地恢復其精度或嘗試按通道縮放
7.5 微調(可選步驟)
對於激進的低比特量化(如 INT4、混合 3-4 位量化),有時需要進行輕量級的量化感知微調:
- 在校準數據上訓練幾個 epoch
- 讓模型適應量化引入的噪聲
- 通常能將 INT4 的性能表現提升至接近 FP16 水平
7.6 部署就緒
當量化穩定後:
- KV 緩存也進行量化(INT8/INT4),提升內存效率
- 對那些被特意保留為較高精度的層,已採取保護措施
- 模型已通過長上下文任務測試
最終成果:內存佔用更小,推理速度更快,精度損失微乎其微。當第一次看到 70B 參數的模型在單張 GPU 上流暢運行時,那種感覺堪稱神奇。
08 應用場景
- 端側 AI(On-Device AI) :量化讓我能直接在筆記本、邊緣設備甚至手機上運行大語言模型。過去需要多卡 GPU 服務器的模型,如今單張 GPU 就能裝下,讓 AI 能夠進行實時交互,擺脱雲端延遲。我用它來做筆記、進行代碼補全、當離線聊天助手 ------ 就像把一台超級計算機裝進了揹包裏。
- 高性價比的雲端部署(Cost-Efficient Cloud Deployment) :即使在雲端,量化也能大幅降低 GPU 內存佔用,使單個節點能夠服務更多用户,大幅節省運維成本。例如,如果一個 13B 模型在 INT4 精度下的表現幾乎與 FP16 相當,但 GPU 內存佔用減少了一半,這樣使得預算有限的團隊也可以部署高性能的 LLM。
- 長上下文應用(Long-Context Applications) :通過降低 KV 緩存的內存佔用,使得處理長文檔成為可能。藉助 INT8 或 INT4 的 KV 緩存,我成功實現了整本書籍的摘要生成、分析法律合同,甚至維持數小時的連續對話而不會爆內存。這讓虛擬助手、教學系統和摘要工具能無縫處理超長上下文。
- 多模型協作流水線(Multi-Model Pipelines) :量化模型在混合流水線中表現尤為出色。我經常用小型 INT4 模型做初步篩選或生成初始建議,再將結果交給更大的模型進行最終推理。若無量化技術,並行調度多個模型會很容易超出內存限制。而現在,就像在一台機器上部署了一整個 AI 專家團隊。
- 研究與實驗(Research and Experimentation) :最後,量化技術讓實驗變得更快速、更便宜。我可以在消費級 GPU 上迭代新架構、測試模型消融實驗或微調模型,無需等待昂貴的專用硬件。這極大加速了我們的學習與實驗進程,讓大模型研究變得更加觸手可及。
END
本期互動內容 🍻
❓你覺得未來大模型會默認以量化形式發佈,還是保留"原始精度+按需量化"的模式?
本文經原作者授權,由 Baihai IDP 編譯。如需轉載譯文,請聯繫獲取授權。
原文鏈接:
https://bhavishyapandit9.substack.com/p/deep-dive-into-quantization-of-llms