# 論文閱讀 : AWQ
提出一種硬體友善的低位元權重量化方法,稱為 AWQ (Activation-aware Weight Quantization),目標是讓大型語言模型(LLM)可部署於邊緣裝置(on-device),同時保有準確度與效率。

**問題背景**
- 大型語言模型雖強,但部署在邊緣裝置上有兩大挑戰:
- 模型過大
- 裝置資源有限
- 在地運行 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 混合)

控制變因:選擇部分通道不量化(保留為 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 模型為例)

| 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 量化誤差
### 實驗結果

### 方法優勢
| 優點 | 說明 |
| ----------------------- | ----------------------------------- |
| **無需回歸或反向傳播** | 不像 GPTQ 等方法需要重建或梯度學習 |
| **低依賴 Calibration Set** | 只使用 activation 平均值,不易過擬合 |
| **支援泛化能力** | 可應用於不同任務 / 多模態,不被 calibration 資料集侷限 |
| **資料需求少** | 幾百個樣本就可完成量化流程 |
| **硬體友善** | 沒有混合精度、無需特殊 kernel,易於落地部署 |
## 系統實作

### 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 系列結果

- 結果:
- AWQ consistently beats RTN 和 GPTQ(含/不含 reorder)
- 在所有模型尺寸與世代中,AWQ 的 perplexity 最低
### Mistral / Mixtral 結果
- AWQ 同樣在這些架構中表現最好
### Instruction-tuned 模型(Vicuna)

- 使用 GPT-4 對 Vicuna-7B 和 Vicuna-13B 的回答進行雙向比較評分(共 160 回合)
- 結果:
- AWQ 明顯優於 RTN 與 GPTQ,在兩種模型規模中皆成立
- AWQ 不僅能量化基礎模型,也適用於經 instruction tuning 微調過的模型
### 多模態模型(VLMs)

- 測試模型:OpenFlamingo-9B, LLaVA-13B
- 測試任務:視覺問答(VQA)、多模態推理(visual reasoning)
- 結果:
- AWQ 在多模態模型中也能保持精度,表現不輸 GPTQ
- 首個有效支持多模態模型量化的輕量化方法之一
### Data Efficiency & Generalization

#### 少量資料就能量化良好
- 傳統方法(如 GPTQ)需重建或反向傳播,仰賴較大的校準資料集
- AWQ 僅需量測 activation 大小 → 僅需極小校準集
- OPT-6.7B / INT3-g128 結果:
- 使用 16 條樣本的 AWQ ≈ GPTQ 使用 192 條樣本
- AWQ 校準資料需求 低 10 倍
#### 對校準資料分布的魯棒性
- 實驗設計:
- 兩組不同分布的校準資料集:PubMed Abstracts vs Enron Emails
- 測試:cross-distribution(校準和測試資料不一致)
- 結論:AWQ 對分布改變影響 非常小,適合真實世界應用場景(資料異質性高)
### Speedup Evaluation

#### 設定
- 測試平台:
- 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}
$$