# 論文閱讀 : AWQ 提出一種硬體友善的低位元權重量化方法,稱為 AWQ (Activation-aware Weight Quantization),目標是讓大型語言模型(LLM)可部署於邊緣裝置(on-device),同時保有準確度與效率。 ![image](https://hackmd.io/_uploads/B1iG0SiUlg.png) **問題背景** - 大型語言模型雖強,但部署在邊緣裝置上有兩大挑戰: - 模型過大 - 裝置資源有限 - 在地運行 LLM 可以: - 降低雲端成本 - 保護用戶隱私 **方法核心(AWQ)** 1. **只保留 0.1%~1% 的關鍵權重(salient weights)不量化** - 可顯著降低量化誤差 - 現並非所有權重都一樣重要。 2. 根據 activation 分佈判斷哪些通道較重要 - 因 activation 大的通道通常處理關鍵特徵 4. 透過數學推導提出:將重要通道加以放大(scaling)可減少量化誤差 - 避免混合精度(mixed-precision)導致的硬體效率問題 5. 使用等效轉換(equivalent transformation)來 scale 通道 - 透過事前收集的 activation 統計資訊進行。 6. 不需要反向傳播或重建(reconstruction) - 所以能良好泛化到不同領域與多模態模型 **實驗結果** - 對比 GPTQ / QAT 等方法,在不同模型(LLaMA、OPT)與任務(語言、數學、程式碼)中表現更佳: - 在通用語言任務、程式碼、數學等領域特定任務表現優異。 - 平均速度提升 3.2~3.3×(相較於 Huggingface FP16) - 能適用於: - instruction-tuned 模型(指令微調過的模型) - 多模態 LLM(首次支援) ## 相關工作 ### 模型量化方法 | 分類 | 說明 | 優劣分析 | | ------------------------------------- | ------------ | ----------------------------- | | **QAT (Quantization-Aware Training)** | 透過反向傳播調整量化參數 | 精準但訓練成本高,不適合 LLM | | **PTQ (Post-Training Quantization)** | 不經過訓練直接量化權重 | 輕量級、能快速應用於 LLM,但低 bit 下精度容易下降 | AWQ 採用 **PTQ 方法**,並針對低 bit 的 **weight-only 量化** 提出創新改進。 ### 大型語言模型的量化 兩種常見設定: 1. **W8A8**:權重與 activation 皆為 INT8 * 代表方法:LLM.int8(), SmoothQuant, ZeroQuant 等 2. **W4A16**:僅量化權重至低位元(如 INT4),activation 保持高精度 * 代表方法:GPTQ、AWQ、FlexGen、NUQMM 等 * **AWQ 屬於此類,主打更少記憶體、推論更快** #### GPTQ 是最接近 AWQ 的方法,但存在問題: * 利用 **second-order information** 重建誤差,但容易 **過擬合校準集** * 對某些模型(如 LLaMA-7B、OPT-66B)還需排序技巧(weight reordering) * 無法良好泛化到多模態或指令微調模型 #### AWQ 的改進: * 不需要重建或 reorder * 泛化能力更好,支援更多 LLM 模型與應用場景 #### System Support for Low-bit Quantized LLMs | 系統 / 方法 | 技術亮點 | 限制 | | ------------------------------------- | ---------------------------- | --------------- | | **GPTQ + GPTQ-for-LLaMA** | INT3 / INT4 kernel、Triton 實作 | 需重建與 reorder | | **FlexGen**、**llama.cpp**、**exllama** | Group-wise INT4,降低 I/O 成本 | 多為特定架構最佳化 | | **FasterTransformer** | 支援 FP16×INT4 GEMM(逐張量量化) | 不支援 group quant | | **LUT-GEMM (NUQMM)** | 使用查表法在 GPU 上進行 bitwise 計算 | 較依賴查表效率 | | **MLC-LLM** | 搭配 TVM / TensorIR 支援多平台部署 | 為同步進行的研究成果 | ## AWQ 方法核心 ### 保留 1% 關鍵權重通道可顯著提升量化後精度 #### 核心觀察 - **LLM 權重的重要性不平均**:只有極少部分的通道對模型性能具有關鍵影響(salient weights) - **即使只保留 0.1%~1% 權重為 FP16,也能顯著降低精度損失** - 效果 **不需進行重建或訓練** ### 實驗設計:檢驗保留關鍵通道的影響(INT3 + FP16 混合) ![image](https://hackmd.io/_uploads/rJdNMUsLee.png) 控制變因:選擇部分通道不量化(保留為 FP16),其餘使用 INT3 * 比較方式: * **隨機挑選通道保留** → 效果有限 * **根據權重大小(L2 norm)選通道** → 效果仍有限 * **根據 activation magnitude 選通道** → 精度顯著提升 #### activation 比 weight 更重要 > Activation 代表了輸入特徵的強度 > → 特徵越強,對應的權重對模型預測越重要 > → 保留這些通道(對應高 activation)能更有效地保留模型能力 #### 限制 * **混合精度(mixed-precision)會使系統實作變得困難** * 會破壞硬體友善性與高效推論的目標 ### 以 Scaling 技術取代保留 FP16 權重 * 解決上一節提到的混合精度實作困難 * **不保留 FP16 權重** * 改為 **對關鍵通道進行 per-channel scaling**,在低 bit 整數內達到類似效果 #### 定義量化公式(INT N-bit) $$ Q(w) = \Delta \cdot \text{Round}\left(\frac{w}{\Delta}\right), \quad \Delta = \frac{\max(|w|)}{2^{N-1}} $$ * $\Delta$ 為量化比例尺,由該群組的最大權重值決定 * 實際運算結果為 $Q(w) \cdot x$ #### 放大權重 → 減少誤差 * 對權重 $w$ 進行放大(乘上 $s > 1$),同時對輸入 $x$ 縮小(除以 $s$): $$ Q(w \cdot s) \cdot \frac{x}{s} $$ * 這樣的處理會得到新的誤差: $$ \text{Err}_{\text{scaled}} = \Delta' \cdot \texttt{RoundErr}\left(\frac{ws}{\Delta'}\right) \cdot x \cdot \frac{1}{s} $$ - 由於: 1. $\texttt{RoundErr}(\cdot)$ 約為常數(小數點後四捨五入誤差平均 0.25) 2. 若 $s$ 不大,$\Delta' \approx \Delta$ 3. 所以整體誤差變小了 $\sim \frac{1}{s}$ #### 實驗驗證(以 OPT-6.7B 模型為例) ![image](https://hackmd.io/_uploads/ry4558iIee.png) | Scaling 值 $s$ | Perplexity (↓越好) | 相對誤差是否下降 | 有效通道比例 Δ 改變 | | ------------------------ | ---------------- | ---------------------------- | --------------- | | $s = 1$(baseline, RTN) | 23.54 | x | - | | $s = 2$ | **11.92** | 顯著下降 | 只有 <5% 通道 Δ 被改變 | | $s = 4$ | 精度反而下降 | 非重要通道誤差被放大(21.2% 通道 Δ 被擴大) | | #### 小結 * 如果 scaling 值 $s$ 太大: * 雖然關鍵通道誤差變小 * 但也會 **擴大非關鍵通道的誤差** * 造成整體模型精度下降 **最佳解在 $s=2$ 附近** ### 搜尋最佳 Scaling 值 找到每個輸入通道(input channel)最佳的 scaling 值 $\mathbf{s}$,以 **最小化量化後輸出與原始輸出之間的誤差**,同時保護 salient 與 non-salient 通道。 #### 優化目標式 $$ \mathbf{s}^* = \arg\min_{\mathbf{s}} \mathcal{L}(\mathbf{s}), \quad \mathcal{L}(\mathbf{s}) = \lVert Q(\mathbf{W} \cdot \text{diag}(\mathbf{s})) \cdot \text{diag}(\mathbf{s})^{-1} \cdot \mathbf{X} - \mathbf{W} \cdot \mathbf{X} \rVert $$ | 符號 | 意義 | | -------------- | --------------------------- | | $\mathbf{W}$ | 原始浮點權重 | | $\mathbf{X}$ | 來自 calibration set 的輸入資料 | | $Q$ | 量化函數(如 INT3、group size=128) | | $\mathbf{s}$ | 每個通道的 scaling 值(要學習的目標) | **不能用 Backpropagation** * $Q(\cdot)$ 是不可微的量化函數,無法直接反向傳播梯度 * 先前文獻有用 **近似梯度**(如 Straight-Through Estimator, STE),但收斂不穩定 ### 替代策略:透過 Activation 統計定義搜尋空間 搜尋空間的簡化表示: $$ \mathbf{s} = \mathbf{s_X}^\alpha, \quad \alpha^* = \arg\min_\alpha \mathcal{L}(\mathbf{s_X}^\alpha) $$ | 符號 | 意義 | | ----------------- | ----------------------------- | | $\mathbf{s\_X}$ | 每個通道 activation 的平均絕對值(表示重要性) | | $\alpha$ | 超參數,用來調控 scaling 強度 | * $\alpha = 0$:不做 scaling(等於原始 RTN) * $\alpha = 1$:最 aggressive 的 scaling(完全依 activation 強度決定) #### 透過 grid search 掃描 $\alpha \in [0, 1]$ 找出誤差最小的 scaling 組合 #### 在量化前對權重進行 clipping,幫助進一步減少 MSE 量化誤差 ### 實驗結果 ![image](https://hackmd.io/_uploads/HyBeWvjUxe.png) ### 方法優勢 | 優點 | 說明 | | ----------------------- | ----------------------------------- | | **無需回歸或反向傳播** | 不像 GPTQ 等方法需要重建或梯度學習 | | **低依賴 Calibration Set** | 只使用 activation 平均值,不易過擬合 | | **支援泛化能力** | 可應用於不同任務 / 多模態,不被 calibration 資料集侷限 | | **資料需求少** | 幾百個樣本就可完成量化流程 | | **硬體友善** | 沒有混合精度、無需特殊 kernel,易於落地部署 | ## 系統實作 ![image](https://hackmd.io/_uploads/BJJAEDoUge.png) ### Arithmetic Intensity (算術強度) $$ \text{AI} = \frac{\text{FLOPs}}{\text{Memory Bytes}} $$ ### 為什麼 W4A16 不容易加速? - 傳統的 W8A8 量化(例如 SmoothQuant): - 權重與 activation 都是 INT8 - 儲存與運算的資料型態一致 - 解量化(dequantization)可內嵌在 kernel 的 epilogue 階段 - AWQ 採用的是 W4A16(權重是 4-bit,activation 是 16-bit): - 資料型態 不一致 - 解量化不能推遲,只能嵌入主運算迴圈中 - 增加實作困難度與效率瓶頸 ### AWQ 能加速 On-Device LLM 1. Prompt (Context) vs Generation 的延遲差異 - Context 阶段(輸入 prompt 處理):快,只需 10ms 處理 200 tokens - Generation 階段(每個 token 輸出):慢,20 個 token 要 310m **推論瓶頸**出在 generation 階段,特別是在 edge 裝置上需要互動式回應的情況下 2. Generation 階段是「記憶體受限型」工作負載(memory-bound) - 以 RTX 4090 為例: - 理論峰值:165 TFLOPS(運算) vs 1TB/s(記憶體頻寬) - 若 算術強度 < 165 FLOPs/Byte,就是記憶體瓶頸 - 實測: - FP16 推論的 generation 階段算術強度 ≈ 1 FLOP/Byte - 明確是 memory-bound,無法靠增加運算單元解決 **唯一解法**:減少記憶體存取量 - 採用 AWQ: - 權重從 FP16 降為 INT4 - 記憶體流量減少 4 倍 - 算術強度提升至 ≈ 4 FLOPs/Byte → 產生更高效能上限 ## 實驗設定 ### 量化方式:Weight-only Grouped Quantization - 採用 **INT3 / INT4 + group size = 128**,這是主流方法中最有效的設定之一 - 所有方法皆採用相同 group size 以公平比較 - **AWQ 的 α 值搜尋**使用 grid search,grid size = 20 - 使用小規模的 calibration set,來自 **The Pile** 資料集(避免 overfitting) ### 測試模型(Models) | 類型 | 模型 | | -------------------- | ------------------------------- | | 基礎語言模型 | LLaMA (7B \~ 70B), LLaMA-2, OPT | | Instruction-tuned 模型 | Vicuna (7B, 13B) | | 多模態模型(VLM) | OpenFlamingo-9B, LLaVA-13B | | MoE 模型 | Mistral, Mixtral | ### 評估指標 - **語言建模任務使用 Perplexity**(WikiText-2)作為主指標 - **Vicuna 使用 GPT-4 評分**,比較量化模型與 FP16 模型的回答質量 - 其他多模態模型使用標準視覺推理與 VQA 任務做評估 ### 比較基準 | 方法 | 特點 | | ------------------------------ | -------------------------------------- | | RTN(round-to-nearest) | 雖簡單但效果不差,為常見 baseline | | GPTQ | 利用 Hessian 重建誤差,SOTA 方法之一 | | GPTQ-Reorder (GPTQ-R) | GPTQ 加上 reorder 技巧,提升特定模型效果 | | ZeroQuant / AdaRound / BRECQ | 未納入,因需 backpropagation,難以擴展至大型模型且表現不穩定 | ### LLaMA 系列結果 ![image](https://hackmd.io/_uploads/rJLMnvnUgl.png) - 結果: - AWQ consistently beats RTN 和 GPTQ(含/不含 reorder) - 在所有模型尺寸與世代中,AWQ 的 perplexity 最低 ### Mistral / Mixtral 結果 - AWQ 同樣在這些架構中表現最好 ### Instruction-tuned 模型(Vicuna) ![image](https://hackmd.io/_uploads/BJho3DhLxl.png) - 使用 GPT-4 對 Vicuna-7B 和 Vicuna-13B 的回答進行雙向比較評分(共 160 回合) - 結果: - AWQ 明顯優於 RTN 與 GPTQ,在兩種模型規模中皆成立 - AWQ 不僅能量化基礎模型,也適用於經 instruction tuning 微調過的模型 ### 多模態模型(VLMs) ![image](https://hackmd.io/_uploads/ryjL6D2Ulx.png) - 測試模型:OpenFlamingo-9B, LLaVA-13B - 測試任務:視覺問答(VQA)、多模態推理(visual reasoning) - 結果: - AWQ 在多模態模型中也能保持精度,表現不輸 GPTQ - 首個有效支持多模態模型量化的輕量化方法之一 ### Data Efficiency & Generalization ![image](https://hackmd.io/_uploads/H18_JOnIlg.png) #### 少量資料就能量化良好 - 傳統方法(如 GPTQ)需重建或反向傳播,仰賴較大的校準資料集 - AWQ 僅需量測 activation 大小 → 僅需極小校準集 - OPT-6.7B / INT3-g128 結果: - 使用 16 條樣本的 AWQ ≈ GPTQ 使用 192 條樣本 - AWQ 校準資料需求 低 10 倍 #### 對校準資料分布的魯棒性 - 實驗設計: - 兩組不同分布的校準資料集:PubMed Abstracts vs Enron Emails - 測試:cross-distribution(校準和測試資料不一致) - 結論:AWQ 對分布改變影響 非常小,適合真實世界應用場景(資料異質性高) ### Speedup Evaluation ![image](https://hackmd.io/_uploads/H1CSfdn8ge.png) #### 設定 - 測試平台: - RTX 4090(桌面) - Jetson Orin(邊緣 GPU) - Laptop 4070(8GB) - 每次生成 200 tokens,batch size = 1,prompt 長度 = 4 - 使用 Huggingface FP16 當 baseline 比較 ### 總結 | 面向 | AWQ 表現 | | --------- | -------------------------------------- | | **資料效率** | 只需數十條校準資料即可穩定量化 | | **異分布泛化** | perplexity 漲幅極小(<1),遠優於 GPTQ | | **推論速度** | 實測 2.7–3.9× 加速 | | **跨平台適應** | GPU / Jetson / CPU / Raspberry Pi 都可運行 | | **系統支援度** | 通用於多種架構,不限於 LLaMA | ## 附註 ### 原始作法 在 weight-only 量化中,我們會將浮點權重 $w$ 映射成整數: $$ Q(w) = \Delta \cdot \text{Round}\left(\frac{w}{\Delta}\right) $$ 這樣做會產生誤差(因為 round 會把原本連續值「逼近」為離散的整數): $$ \text{Err}(Q(w)) = Q(w) - w = \Delta \cdot \text{RoundErr}\left(\frac{w}{\Delta}\right) $$ 這個誤差在實際運算中會被乘到輸入特徵 $x$: $$ \text{輸出誤差} = \text{Err}(Q(w)) \cdot x $$ ### 將 $w$ 放大、將 $x$ 等比例縮小 對關鍵通道,我們將 $w \to w \cdot s$,並對應地將 $x \to x / s$,使原始乘積 $w x$ **不變**,但量化後的誤差卻會下降。 **考慮量化誤差在這樣變換後的新形式:** $$ Q(w \cdot s) \cdot \frac{x}{s} $$ 推導後的誤差是: $$ \text{Err}_{\text{scaled}} = \Delta' \cdot \text{RoundErr}\left(\frac{w \cdot s}{\Delta'}\right) \cdot x \cdot \frac{1}{s} $$