---
# System prepended metadata

title: '論文閱讀 : AWQ'

---

# 論文閱讀 : 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}
$$