mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
4696 字
14 分钟
LLM 量化技术:从 GPTQ 到 AWQ
2025-02-25

本文要点#

大语言模型的参数规模动辄数十亿甚至上千亿,模型权重占用大量存储和内存。以 LLaMA-70B 为例,仅 FP16 权重就需 140GB,相当于两块 A100 80GB 显卡!

模型量化(Quantization) 通过降低权重精度(FP16 → INT8 → INT4),大幅减少存储和内存需求,使得大模型能在消费级硬件上运行。

本文将深入探讨以下量化技术:

  • GPTQ:基于 Hessian 矩阵的后训练量化,逐层优化权重
  • AWQ:激活感知的混合精度量化,保护显著权重通道
  • GGUF/llama.cpp:消费级硬件部署的量化生态
  • KV Cache 量化:减少推理时注意力缓存的内存占用

一、量化基础#

1.1 数值精度#

格式存储需求精度常见用途
FP3232 bits完整精度训练、推理基准
FP1616 bits半精度推理加速
BF1616 bits近似 FP32H100/TPU
INT88 bits1/256 精度量化推理
INT44 bits1/16 精度极致压缩

1.2 量化原理#

量化将浮点权重映射到低精度整数:

xquant=round(x/s+z)x_{quant} = \text{round}(x / s + z)

其中 ss 是缩放因子(scale),zz 是零点(zero point)。

反量化时: xdequant=s(xquantz)x_{dequant} = s \cdot (x_{quant} - z)

对称量化z=0z = 0)是最常见的方案:

xquant=clamp(round(xmax(x))(2b11),2b1,2b11)x_{quant} = \text{clamp}\left(\text{round}\left(\frac{x}{\max(|x|)}\right) \cdot (2^{b-1} - 1), -2^{b-1}, 2^{b-1}-1\right)

其中 bb 为目标位宽(如 INT4 时 b=4b=4)。

1.3 量化误差#

量化引入的误差会影响模型精度:

graph LR A["原始权重<br/>FP16"] --> B["量化<br/>FP16 → INT4"] B --> C["反量化<br/>INT4 → FP16"] C --> D["误差累积"] D --> E["精度损失"]

误差来源:

  1. 舍入误差:浮点到整数的映射,每个权重都有 ±0.5s\pm 0.5 \cdot s 的偏差
  2. 截断误差:超出量化范围的值被截断到最近端点
  3. 异常值放大:少量异常值会拉大量化范围,导致大部分正常值的精度变差

异常值问题是量化精度损失的主要来源。研究发现 Transformer 模型中约 0.1% 的权重通道包含极端异常值(magnitude > 100),这些通道对量化非常敏感。

二、GPTQ:后训练量化#

2.1 核心思想#

GPTQ(Frantar & Alistarh, 2023)是一种**后训练量化(Post-Training Quantization, PTQ)**方法,无需重新训练即可量化模型。

核心思想:逐层优化,找到最小化输出误差的量化参数

GPTQ 的关键优势在于:

  • 无需重新训练模型
  • 量化速度快(LLaMA-65B 约 4 小时)
  • 精度损失极小(INT4 量化 perplexity 增加通常 < 0.5)

2.2 最优大脑量化(OBQ)#

GPTQ 的理论基础来自 OBQ(Optimal Brain Quantization)算法,后者又源自经典的 Optimal Brain Surgeon(OBS)框架。

OBS 框架的核心问题:给定已训练好的模型权重,如果要删除(或量化)某些权重,如何调整剩余权重以最小化对输出的影响?

对于权重矩阵 W\mathbf{W},量化后产生的误差为:

L=WXW^X2=tr((WW^)TH1(WW^))\mathcal{L} = \|\mathbf{W}\mathbf{X} - \hat{\mathbf{W}}\mathbf{X}\|^2 = \text{tr}\left((\mathbf{W} - \hat{\mathbf{W}})^T \mathbf{H}^{-1} (\mathbf{W} - \hat{\mathbf{W}})\right)

其中 H=2XXT\mathbf{H} = 2\mathbf{X}\mathbf{X}^T 是 Fisher 信息矩阵的近似(即 Hessian 矩阵),X\mathbf{X} 是校准数据集上的输入激活。

逐权重贪心量化:OBQ 按照每个权重对输出误差的贡献排序,贪心地选择影响最小的权重优先量化:

wq=argmini(wiquant(wi))2[H1]iiw_q = \text{argmin}_i \frac{(w_i - \text{quant}(w_i))^2}{[\mathbf{H}^{-1}]_{ii}}

量化一个权重后,需要通过 OBS 公式修正剩余权重:

wnew=wwqquant(wq)[H1]qqH,q1\mathbf{w}_{\text{new}} = \mathbf{w} - \frac{w_q - \text{quant}(w_q)}{[\mathbf{H}^{-1}]_{qq}} \cdot \mathbf{H}^{-1}_{\cdot, q}

2.3 GPTQ 的改进:从 OBQ 到可扩展#

OBQ 的原始算法复杂度为 O(d3drow)O(d^3 \cdot d_{row})dd 为列数,drowd_{row} 为行数),对于大模型不可行。GPTQ 做了三个关键改进:

1. 固定列序替代贪心选择

GPTQ 发现贪心选择的排序与自然列序差异不大,因此直接按列顺序量化,将复杂度降低到 O(d2drow)O(d^2 \cdot d_{row})

def gptq_quantize(W, H_inv, bits=4):
"""
GPTQ 核心算法
W: 权重矩阵 [d_row, d_col]
H_inv: Hessian 逆矩阵 [d_col, d_col]
"""
Q = np.zeros_like(W) # 量化后的权重
E = np.zeros_like(W) # 累积误差
for col in range(W.shape[1]):
# 量化当前列
Q[:, col] = quantize(W[:, col], bits)
# 计算量化误差
err_col = (W[:, col] - Q[:, col]) / H_inv[col, col]
# 用 Hessian 逆矩阵修正后续列的权重
# 这是 GPTQ 的核心:不是逐个独立量化,而是考虑权重间相关性
W[:, col+1:] -= err_col[:, None] * H_inv[col, col+1:][None, :]
return Q

2. 批量处理(Block-wise)

将权重列分成大小为 B(通常 B=128)的块,块内精确更新,块间只做近似修正。这使得算法可以高效利用 GPU 矩阵运算。

3. Cholesky 分解

为了避免数值不稳定的 Hessian 逆矩阵求逆运算,GPTQ 使用 Cholesky 分解预先计算所需的对角元素,大幅提升数值稳定性。

2.4 逐层处理流程#

GPTQ 按层独立处理,每一层的量化流程如下:

graph TB A["输入层权重 W"] --> B["用校准数据计算<br/>Hessian 矩阵 H"] B --> C["计算 H 的逆<br/>H^-1"] C --> D["Cholesky 分解<br/>提升数值稳定性"] D --> E["按列顺序量化<br/>Block=128"] E --> F["量化当前列权重"] F --> G["Hessian 修正<br/>更新后续列权重"] G --> H{"所有列<br/>完成?"} H -->|否| F H -->|是| I["输出量化后的层权重"]

校准数据:GPTQ 需要少量校准数据(通常 128 条样本)来计算 Hessian 矩阵。这些数据不需要是训练数据,通用语料(如 C4、WikiText)即可。

2.5 实验结果#

模型精度量化后大小精度损失
LLaMA-65BFP16130GB-
LLaMA-65BINT432.5GB<1%
LLaMA-7BINT43.5GB<1%

三、AWQ:激活感知量化#

3.1 核心思想#

AWQ(Activation-Aware Weight Quantization)由 Lin 等人在 2023 年提出,核心观察是:并非所有权重对量化误差的贡献相同,少量「显著权重」对模型精度至关重要

与 GPTQ 不同,AWQ 的关键创新在于:通过激活分布来识别显著权重,而非通过 Hessian 矩阵。这意味着 AWQ 不需要昂贵的 Hessian 计算,量化速度更快。

3.2 激活感知的显著性度量#

AWQ 定义权重通道 ii 的显著性分数为:

si=E[xi]wis_i = \mathbb{E}[|x_i|] \cdot |w_i|

其中 xix_i 是第 ii 个输入通道的激活值,wiw_i 是对应的权重。

直觉理解:如果一个权重通道的输入激活值很大,那么该通道的量化误差会被放大,因此需要更高精度。

为什么不用纯权重幅度? 研究发现,仅看权重大小不足以判断该通道对输出的影响。有些权重大但输入激活很小,量化后影响不大;有些权重不大但激活很大,量化后影响显著。

3.3 逐通道缩放(Per-Channel Scaling)#

AWQ 不是简单地将显著通道用 INT8、其余用 INT4,而是通过逐通道缩放来保护显著权重。

核心公式:对于权重通道 ii,寻找最优缩放因子 sis_i

w^i=siwi,x^i=xi/si\hat{w}_i = s_i \cdot w_i, \quad \hat{x}_i = x_i / s_i

量化后再反量化:

Quant(siwi)/si\text{Quant}(s_i \cdot w_i) / s_i

通过增大显著通道的 sis_i,等效地增大了该通道的量化精度(因为量化范围内的离散级别更多)。

最优缩放因子通过以下目标搜索:

si=argminsiQuant(siwi)(xi/si)wixis_i^* = \text{argmin}_{s_i} \|\text{Quant}(s_i \cdot w_i) \cdot (x_i / s_i) - w_i \cdot x_i\|

AWQ 使用快速的网格搜索,在 [0,1][0, 1] 范围内以 0.1 为步长搜索最优 sis_i,整个过程非常高效。

3.4 保护显著权重的量化流程#

graph TB A["输入模型 + 校准数据"] --> B["前向传播<br/>收集激活分布"] B --> C["计算每通道<br/>显著性分数"] C --> D["识别 Top-α%<br/>显著通道"] D --> E["搜索最优<br/>逐通道缩放因子"] E --> F["应用缩放后<br/>统一 INT4 量化"] F --> G["存储缩放因子<br/>用于反量化"]

AWQ 的实际量化流程中,所有权重统一量化为 INT4,但通过缩放因子隐式地为显著通道分配了更高的有效精度。这种方法的优势:

  • 无需混合精度运算:推理时全部用 INT4 计算,硬件友好
  • 缩放因子开销极小:仅增加 < 0.1% 的参数量
  • 量化速度快:无需 Hessian 计算,比 GPTQ 快 2-3 倍

3.5 量化流程对比#

graph LR subgraph GPTQ A1["校准数据"] --> A2["计算 Hessian"] A2 --> A3["逐列量化"] A3 --> A4["Hessian 修正"] end subgraph AWQ B1["校准数据"] --> B2["收集激活"] B2 --> B3["显著性分析"] B3 --> B4["缩放 + 统一量化"] end

3.6 AWQ 实验结果#

模型方法量化位宽Perplexity (WikiText2)显存
LLaMA-7BFP16165.6814 GB
LLaMA-7BRTN46.734 GB
LLaMA-7BGPTQ46.094 GB
LLaMA-7BAWQ46.054 GB
LLaMA-70BFP16163.32140 GB
LLaMA-70BGPTQ43.4435 GB
LLaMA-70BAWQ43.4135 GB

四、GGUF:llama.cpp 的量化格式#

4.1 GGML 与 GGUF#

GGUF(原名 GGML)是 llama.cpp 团队开发的量化格式:

  • GGML:C 语言实现的机器学习张量库
  • GGUF:统一量化格式,支持多种量化方法,替代了旧的 GGML 格式

GGUF 相比 GGML 的改进:

  • 可扩展的元数据系统(支持键值对)
  • 向后兼容性保证
  • 支持 mmap 高效加载
  • 更丰富的量化类型选择

4.2 量化类型详解与对比#

GGUF 支持多种量化类型,核心区别在于是否使用「k-quantization」(分层混合精度):

基础量化(均匀量化)

类型位宽描述精度速度适用场景
Q4_04.5 bpw最简单的 4-bit 量化,块大小 32最快快速实验
Q5_05.5 bpw5-bit 均匀量化平衡选择
Q8_08.5 bpw8-bit 均匀量化接近无损

k-quantization(分层混合精度)

类型有效位宽描述精度速度适用场景
Q2_K2.75 bpwattention.qkv 用 4-bit,其余 2-bit很低仅实验用
Q3_K_M3.5 bpw关键层 3-bit + 半精度缩放极致压缩
Q4_K_M4.8 bpw关键层 6-bit,其余 4-bit中高推荐默认
Q5_K_M5.7 bpw关键层更高精度精度优先
Q6_K6.6 bpw全 6-bit + 半精度缩放很高高质量推理

bpw = bits per weight,包含缩放因子等元数据的开销。

4.3 Q4_0 vs Q4_K_M vs Q5_K_M 实际对比#

以 LLaMA-7B 为例的具体对比:

指标Q4_0Q4_K_MQ5_K_M
文件大小3.6 GB4.1 GB4.8 GB
内存占用~4.0 GB~4.5 GB~5.3 GB
Perplexity (WikiText2)6.556.155.82
生成速度 (tok/s, M1 Max)282622
精度损失明显较小极小

选择建议

  • Q4_K_M:性价比最高,推荐作为默认选择
  • Q5_K_M:精度敏感场景(如代码生成、数学推理)
  • Q4_0:纯速度优先,对质量不敏感的场景

4.4 GGUF 文件结构#

// GGUF 文件格式
struct GGUFHeader {
char magic[4]; // "GGUF"
uint32_t version;
uint64_t tensor_count;
uint64_t metadata_kv_count;
// ... 元数据键值对
// ... 张量数据
};

元数据中存储的关键信息:

  • general.architecture:模型架构名称
  • llama.context_length:最大上下文长度
  • llama.embedding_length:嵌入维度
  • llama.block_count:Transformer 层数

五、llama.cpp 生态系统#

5.1 核心特性#

llama.cpp 提供了高效的 CPU/GPU 推理:

  • C/C++ 实现:无需 Python 环境,零依赖
  • Metal 加速:Apple Silicon 原生支持(M1/M2/M3/M4)
  • CUDA kernel:NVIDIA GPU 优化
  • Vulkan 后端:支持 AMD GPU 和其他 Vulkan 兼容设备
  • 批量推理:支持多并发请求
  • 多模态扩展:支持 LLaVA 等视觉语言模型

5.2 使用示例#

# 量化模型
./quantize ./models/LLaMA-7B/ggml-model-f16.gguf ./models/LLaMA-7B/ggml-model-q4_k_m.gguf Q4_K_M
# 推理
./main -m ./models/LLaMA-7B/ggml-model-q4_k_m.gguf \
-n 512 \
-p "The theory of relativity states that"
# 启动 OpenAI 兼容 API 服务
./server -m ./models/LLaMA-7B/ggml-model-q4_k_m.gguf \
--host 0.0.0.0 --port 8080

5.3 性能对比#

实现量化速度 (tok/s)内存
transformers (FP16)-~814GB
llama.cpp (FP16)-~1514GB
llama.cppQ4_K_M~254GB

六、量化误差分析#

6.1 量化位宽与 Perplexity 退化#

量化误差最直观的衡量指标是 Perplexity(困惑度) 的退化程度。以下是基于 LLaMA 系列模型的典型退化数据:

量化位宽代表方法Perplexity 变化相对退化
FP16基线5.680%
INT8RTN5.72+0.7%
INT4GPTQ6.09+7.2%
INT4AWQ6.05+6.5%
INT4RTN6.73+18.5%
INT3GPTQ7.35+29.4%
INT2任意>20>250%

关键发现

  1. INT8 量化几乎无损:perplexity 退化 < 1%,推荐所有部署场景使用
  2. INT4 是性价比甜蜜点:使用 GPTQ/AWQ 后退化约 7%,内存节省 75%
  3. INT3 及以下退化严重:仅在极端资源受限场景考虑
  4. 量化方法的选择很重要:RTN(直接取整)在 INT4 下比 GPTQ/AWQ 差很多

6.2 量化对不同任务的影响#

量化对不同类型任务的敏感度不同:

任务类型INT8 影响INT4 影响说明
文本生成极小最不敏感
问答/摘要极小中等对细节信息有影响
代码生成较大语法准确性下降明显
数学推理精确计算能力受损
长文本理解极小中等注意力机制受影响

实践建议:对于代码生成和数学推理任务,建议至少使用 INT4 的 k-quantization(如 Q4_K_M)或 INT5/INT8。

七、KV Cache 量化#

7.1 为什么需要 KV Cache 量化#

推理过程中,Transformer 需要缓存每一步的 Key 和 Value 向量(KV Cache),以避免重复计算。对于长上下文推理,KV Cache 的内存占用非常可观:

KV Cache Size=2×nlayers×nheads×dhead×seq_len×dtype_size\text{KV Cache Size} = 2 \times n_{\text{layers}} \times n_{\text{heads}} \times d_{\text{head}} \times \text{seq\_len} \times \text{dtype\_size}

以 LLaMA-70B、128K 上下文为例:

  • FP16 KV Cache:2×80×64×128×131072×22 \times 80 \times 64 \times 128 \times 131072 \times 2 \approx 40 GB
  • 这意味着即使模型权重量化到了 35GB,KV Cache 仍然占 40GB!

7.2 KV Cache 量化方法#

方法Key 精度Value 精度内存节省Perplexity 影响
KV16FP16FP16基线
KV8INT8INT850%< 0.1%
KV4INT4INT475%0.5-2%
K4V8INT4INT862.5%0.3-0.8%

7.3 KV Cache 量化对长上下文的影响#

KV Cache 量化对长上下文场景影响尤为显著:

graph TB subgraph "短上下文 (< 4K)" A1["权重内存: 占比 90%+"] A2["KV Cache: 占比 < 10%"] A2 --> A3["KV 量化收益有限"] end subgraph "长上下文 (128K+)" B1["权重内存: 占比 40-50%"] B2["KV Cache: 占比 50-60%"] B2 --> B3["KV 量化至关重要"] end

实践建议

  • 上下文 < 4K:权重量化优先,KV Cache 用 FP16 或 KV8 即可
  • 上下文 4K-32K:KV8 几乎无损,推荐使用
  • 上下文 128K+:考虑 K4V8 混合策略,节省内存同时保持精度

7.4 主框架的 KV Cache 量化支持#

框架KV8KV4混合精度状态
vLLM生产就绪
llama.cpp稳定
TensorRT-LLM生产就绪
transformers实验性

八、综合基准测试#

8.1 量化方法全景对比#

以 LLaMA-70B 为基准的综合对比:

方法位宽模型大小显存占用Perplexity量化时间推理速度
FP1616138 GB140 GB3.32-
INT8 RTN869 GB70 GB3.33< 1 min1.2×
INT4 GPTQ435 GB36 GB3.44~3 h1.5×
INT4 AWQ435 GB36 GB3.41~1 h1.6×
Q4_K_M4.841 GB42 GB3.46~2 h1.4×
Q5_K_M5.749 GB50 GB3.37~2 h1.3×

速度以 FP16 为基准(1×),实际速度取决于硬件和 batch size。

8.2 场景选择决策树#

graph TD A["选择量化方案"] --> B{"GPU 显存 > 80GB?"} B -->|是| C{"追求最高精度?"} B -->|否| D{"显存 > 24GB?"} C -->|是| C1["FP16 或 INT8"] C -->|否| C2["AWQ INT4"] D -->|是| D1{"需要服务 API?"} D -->|否| D2["llama.cpp Q4_K_M<br/>CPU/Mac 推理"] D1 -->|是| D1A["vLLM + GPTQ/AWQ"] D1 -->|否| D1B["llama.cpp Q5_K_M"]

九、实战指南#

9.1 量化方法选择#

场景推荐说明
最佳精度FP16/BF16无量化损失
4-bit 极致压缩Q4_K_M平衡精度与大小
2-bit 实验Q2_K仅适合展示
CPU 推理Q5_K_M精度更好
GPU 服务部署AWQ/GPTQ配合 vLLM/TGI
长上下文场景权重 INT4 + KV8全链路优化

9.2 量化脚本#

from transformers import AutoModelForCausalLM
from auto_gptq import AutoGPTQForCausalLM
from awq import AutoAWQForCausalLM
# === GPTQ 量化 ===
model = AutoGPTQForCausalLM.from_quantized(
"TheBloke/LLaMA-7B-GPTQ",
model_basename="model",
use_safetensors=True,
device="cuda:0"
)
# === AWQ 量化 ===
model = AutoAWQForCausalLM.from_pretrained("meta-llama/LLaMA-7B")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/LLaMA-7B")
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
}
model.quantize(tokenizer, quant_config=quant_config)

9.3 llama.cpp 量化命令参考#

# 将 HuggingFace 模型转换为 GGUF
python convert_hf_to_gguf.py ./models/LLaMA-7B/ --outtype f16
# 量化为不同等级
./quantize ./models/LLaMA-7B/ggml-model-f16.gguf ./models/LLaMA-7B-Q4_K_M.gguf Q4_K_M
./quantize ./models/LLaMA-7B/ggml-model-f16.gguf ./models/LLaMA-7B-Q5_K_M.gguf Q5_K_M
# 启动 API 服务器(支持 OpenAI 格式)
./server -m ./models/LLaMA-7B-Q4_K_M.gguf \
--host 0.0.0.0 --port 8080 \
-c 4096 -ngl 99

十、常见问题 FAQ#

10.1 Q1: GPTQ 和 AWQ 该选哪个?#

大多数场景选 AWQ。AWQ 量化速度快(无需 Hessian 计算),精度与 GPTQ 相当甚至略好,且推理时无需特殊 kernel。但如果你的部署框架(如 vLLM)对 GPTQ 有更好的优化支持,GPTQ 也是很好的选择。

10.2 Q2: INT4 量化会明显影响模型能力吗?#

取决于任务类型。对于一般文本生成和对话,INT4 的影响很小(perplexity 增加约 5-7%)。但对于数学推理和代码生成等精度敏感任务,建议使用 Q5_K_M 或更高位宽。

10.3 Q3: 量化后模型能在 CPU 上运行吗?#

可以。llama.cpp 专为 CPU 推理优化,Apple Silicon(M1/M2/M3/M4)的 Metal 加速效果尤其好。LLaMA-7B Q4_K_M 在 M2 MacBook 上可以达到 ~20 tok/s。

10.4 Q4: 校准数据集对量化效果有多大影响?#

影响不大但存在。GPTQ 和 AWQ 通常使用 128 条通用语料(如 C4、WikiText)作为校准数据。研究表明,校准数据的领域分布对量化精度有轻微影响,但总体差异 < 0.1 perplexity。

10.5 Q5: KV Cache 量化值得做吗?#

长上下文场景非常值得。当上下文超过 32K token 时,KV Cache 的内存可能超过模型权重本身。KV8 量化几乎无损,但能节省 50% 的 KV Cache 内存。

10.6 Q6: 量化能和 LoRA 微调一起用吗?#

可以,这就是 QLoRA。QLoRA 先将模型量化为 NF4(NormalFloat4),然后在量化模型上训练低秩适配器。这是一种非常高效的微调方案,在消费级 GPU 上即可微调大模型。

10.7 Q7: 不同量化方法可以互相转换吗?#

不能直接转换。GPTQ、AWQ、GGUF 各有独特的量化参数和存储格式,需要从原始 FP16 模型重新量化。HuggingFace 上的社区模型通常提供多种量化格式。

10.8 Q8: 2-bit 量化有实用价值吗?#

目前没有。INT2 量化会导致 perplexity 翻倍以上,模型能力严重退化。它主要用于研究和实验。不过,随着量化算法的进步(如 AQLM、QuIP#),2-bit 量化的可行性正在改善。

常见问题 FAQ#

10.1 4-bit 量化会显著降低模型质量吗?#

取决于方法。GPTQ 4-bit 在 MMLU 上仅下降 1-2%,AWQ 4-bit 下降更少。但 3-bit 及以下通常会有明显退化。对于大多数部署场景,4-bit 是质量和大小的最佳平衡点。

10.2 GPTQ 和 AWQ 应该选哪个?#

AWQ 更快(无需逐层 Hessian 计算),量化过程更简单,且支持激活感知保护。GPTQ 在某些模型上精度略高。实际部署中推荐优先使用 AWQ 或 GGUF(llama.cpp 生态更完善)。

10.3 GGUF 和 GPTQ/AWQ 的区别是什么?#

GPTQ/AWQ 是 GPU 加速的量化格式(需要 CUDA),GGUF 是 llama.cpp 的通用格式(支持 CPU/Metal/CUDA/ROCm)。GGUF 更适合本地部署和边缘设备,GPTQ/AWQ 更适合服务器 GPU 部署。

10.4 量化后的模型能用 LoRA 微调吗?#

可以,这就是 QLoRA 的思路:先 4-bit 量化基础模型,再训练 LoRA 适配器。QLoRA 在保持 4-bit 内存优势的同时,微调效果接近全参数 BF16 微调。

10.5 KV Cache 也需要量化吗?#

是的。长上下文场景下 KV Cache 占用大量显存(32K 上下文 × 70B 模型约需 8GB)。KV8(8-bit KV Cache)可节省 50%,KV4 可节省 75%,对推理延迟影响很小。

小结#

量化技术是大语言模型落地部署的关键环节。本文系统地介绍了从基础量化原理到前沿方法(GPTQ、AWQ)以及部署生态(GGUF/llama.cpp)的完整知识体系:

核心要点回顾

  1. 量化原理:通过 FP16 → INT8/INT4 的精度降低,将模型大小压缩 2-4 倍
  2. GPTQ:基于 Hessian 的后训练量化,逐层优化权重以最小化输出误差,精度高但量化速度较慢
  3. AWQ:激活感知量化,通过逐通道缩放保护显著权重,速度快且硬件友好
  4. GGUF/llama.cpp:消费级硬件部署的完整生态,Q4_K_M 是性价比最优的默认选择
  5. KV Cache 量化:长上下文场景的必备优化,KV8 几乎无损
  6. INT4 是当前主流:GPTQ/AWQ 的 INT4 量化在精度和效率间取得最佳平衡

实践决策速查

  • GPU 部署 → AWQ/GPTQ INT4 + vLLM
  • CPU/Mac 部署 → llama.cpp Q4_K_M
  • 精度优先 → Q5_K_M 或 INT8
  • 长上下文 → 权重 INT4 + KV Cache KV8

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

LLM 量化技术:从 GPTQ 到 AWQ
https://blog.souloss.com/posts/machine-learning/llm-paper-history/llm-quantization-techniques/
作者
Souloss
发布于
2025-02-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时