模型量化技术工程实践:GPTQ/AWQ/QLoRA深度解析
从Hessian矩阵近似到激活感知量化,系统剖析LLM量化原理、校准集设计与工程落地实践
📖 目录
一、量化基础:表示范围与精度损失
1.1 为什么需要量化?
大语言模型的参数量从7B到70B甚至更大,以FP16(16位浮点)存储时,70B模型仅权重就需要140GB显存(70B × 2字节)。这还不包括推理时的KV Cache和激活值。量化(Quantization)通过降低权重和激活值的数值精度,可以:
- 减少内存占用:INT8量化可以将内存需求减半,INT4量化可以减至原来的1/4
- 提升推理速度:低精度计算(INT8/INT4 MAC)比FP16更快,特别是在支持INT8/INT4的硬件上
- 降低部署成本:同样的GPU可以加载更大的模型,或支持更高的并发
1.2 量化的核心矛盾
量化不是免费的午餐。降低数值精度必然引入量化误差(Quantization Error),这个误差在神经网络中传播和累积,最终影响模型输出质量。量化的核心任务就是:在给定精度损失约束下,找到最优的低精度表示。
量化误差的来源:
1. 舍入误差(Rounding Error):
原始值 W = 3.14159
INT8表示(scale=0.01, zero_point=0):
q = round(3.14159 / 0.01) = round(314.159) = 314
dequant = 314 × 0.01 = 3.14
误差 = |3.14159 - 3.14| = 0.00159
2. 截断误差(Clipping Error):
如果 W = 1000,但INT8范围[-127, 127]
必须截断到127,误差 = |1000 - 127| = 873(巨大!)
3. 累积误差(Accumulation Error):
在深度神经网络中,每层的量化误差会传播到后续层
对于70层模型,误差可能放大数十倍
1.3 量化粒度的权衡
量化可以在不同粒度上应用,粒度越细,量化误差越小,但计算/存储开销越大:
| 量化粒度 | 描述 | 误差 | 开销 | 典型应用 |
|---|---|---|---|---|
| 张量级(Tensor-wise) | 整个权重张量共享一个scale | 高 | 极低 | 早期量化方案 |
| 通道级(Channel-wise) | 每个输出通道独立scale | 中 | 低 | GPTQ、AWQ |
| 组级(Group-wise) | 权重分小组合并scale | 低 | 中 | QLoRA(32/64一组) |
| 元素级(Element-wise) | 每个权重独立量化 | 极低 | 极高 | 理论最优,不实用 |
工程经验:对于LLM权重量化,通道级(Channel-wise)量化通常是精度和开销的最佳平衡点。组级量化(如QLoRA的32组)可以进一步提升精度,但会增加存储scale的内存开销。
二、INT8/INT4/FP8量化表示
2.1 线性量化(Uniform Quantization)原理
最常用的量化方法是线性量化,它将浮点值映射到整数域:
线性量化公式:
量化(Quantize):
Q = round(F / scale) + zero_point
其中:
F: 原始浮点值
Q: 量化后的整数值
scale: 缩放因子,将浮点范围映射到整数范围
zero_point: 零点,处理非对称分布(如ReLU激活)
反量化(Dequantize):
F' = (Q - zero_point) × scale
对称量化(Symmetric Quantization):
zero_point = 0
scale = max(|F|) / (2^(b-1) - 1) # b是量化位宽
例如 INT8 对称量化:
scale = max(|W|) / 127
Q = round(W / scale)
范围:[-127, 127],零点在0
非对称量化(Asymmetric Quantization):
zero_point ≠ 0
可以更好处理[0, 255]这样的非负范围(如ReLU输出)
2.2 INT8 vs INT4 vs FP8
不同的量化位宽有不同的适用场景和精度特性:
| 格式 | 表示范围 | 精度 | 内存压缩 | 硬件支持 |
|---|---|---|---|---|
| FP16(基线) | ~1e-8 ~ 6e4 | 非常高 | 1x | 所有GPU |
| INT8 | [-127, 127] 或 [0, 255] | 高 | 2x | 大多数GPU(INT8核心) |
| INT4 | [-7, 7] 或 [0, 15] | 中 | 4x | 部分GPU(A100/H100) |
| FP8(E4M3) | ~1e-8 ~ 448 | 高(动态范围好) | 2x | H100及更新GPU |
| NF4(NormalFloat4) | 基于正态分布量化 | 很高(针对LLM优化) | 4x | 软件实现(QLoRA) |
2.3 FP8:兼顾动态范围和精度
FP8(8-bit浮点)是NVIDIA H100等新GPU引入的量化格式,它分为两种变体:
FP8格式对比:
E4M3(4位指数 + 3位尾数):
表示范围:~1e-8 ~ 448
精度:尾数位少,但动态范围大
适用:权重、激活值(需要大范围)
E5M2(5位指数 + 2位尾数):
表示范围:~1e-16 ~ 57344
精度:更低,但范围更大
适用:梯度(需要极大范围,精度要求低)
与INT8对比:
INT8: 均匀量化,动态范围受限于[-127, 127]
FP8: 指数表示,可以表示1e-8到448的极大范围
对于LLM权重(通常分布在[-1, 1]但偶有离群值):
FP8可以更好处理离群值(outliers),量化误差更小
FP8的一个关键优势是:它不需要仔细的校准集(Calibration Set)来选择缩放因子,因为指数表示天然具有很大的动态范围。这使得FP8量化比INT8更容易部署。
三、GPTQ:Hessian近似与二阶优化量化
3.1 GPTQ的核心思想
GPTQ(Generative Pre-trained Transformer Quantization)是目前最流行的LLM权重量化方法之一。它的核心创新是:利用二阶优化(Hessian矩阵)来最小化量化误差。传统量化只考虑单个权重的舍入误差,而GPTQ考虑权重之间的相关性。
直观理解:假设两个权重w1和w2高度相关(例如总是同时增大或减小),那么单独量化每个权重可能不是最优的。GPTQ通过Hessian矩阵(损失函数对权重的二阶导数)来理解权重之间的相互作用,从而找到更好的量化方案。
3.2 Hessian矩阵与量化误差
在神经网络量化中,我们希望最小化量化后的模型输出误差。假设原始权重为W,量化权重为W_q,那么量化引入的误差可以通过二阶泰勒展开近似:
量化误差的二阶近似:
损失函数 L 对权重 W 的二阶泰勒展开:
L(W_q) ≈ L(W) + g^T (W_q - W) + 0.5 × (W_q - W)^T H (W_q - W)
其中:
g: 梯度(一阶导数),对于已收敛模型 g ≈ 0
H: Hessian矩阵(二阶导数),描述损失函数的曲率
(W_q - W): 量化误差向量
忽略梯度项(已收敛),最小化量化误差等价于:
min (W_q - W)^T H (W_q - W)
物理意义:Hessian矩阵描述了不同权重维度上的"敏感度"
- 如果 H_ii 很大:权重 W_i 对损失很敏感,量化误差代价大
- 如果 H_ii 很小:权重 W_i 对损失不敏感,可以大胆量化
3.3 GPTQ算法详解
GPTQ的核心算法是逐层量化 + 误差补偿。它一次量化一个权重,并将量化误差补偿到后续未量化的权重上:
GPTQ量化算法(简化版):
对于每一层(Layer)的权重矩阵 W [output_dim, input_dim]:
1. 计算该层的Hessian矩阵对角近似:
H = diag(1 / (W_i)^2) # 简化:用权重大小近似敏感度
# 实际GPTQ使用校准数据计算完整的Hessian
2. 按列(输出神经元)量化权重:
for j in range(output_dim):
# 量化第j列
w_quant, scale, zp = quantize_column(W[:, j], H)
# 计算量化误差
quant_error = W[:, j] - dequantize(w_quant, scale, zp)
# 关键:将误差补偿到后续列(误差传播)
if j < output_dim - 1:
W[:, j+1] -= quant_error * (H[j, j+1] / H[j, j])
# 更新Hessian(Schur补更新,避免重新计算)
H = update_hessian(H, j)
结果:量化后的权重 W_q 在Hessian度量下是最优的
3.4 实际实现中的优化
完整的GPTQ实现包含一些工程优化:
| 优化 | 目的 | 效果 |
|---|---|---|
| Lazy Batch更新 | 批量处理多个输出通道 | 加速10-100x |
| Cholesky分解 | 稳定Hessian求逆 | 数值稳定性 |
| 校准集选择 | 用真实数据估计Hessian | 精度提升 |
| 离群值处理 | 保持敏感权重为FP16 | 精度几乎无损 |
GPTQ精髓:它不是简单地将每个权重独立量化,而是通过Hessian矩阵理解权重间的相关性,并在量化过程中进行误差补偿。这使得GPTQ在INT4量化下仍能保持接近FP16的精度(困惑度Perplexity增加<10%)。
四、AWQ:激活感知权重量化
4.1 AWQ的核心观察
AWQ(Activation-Aware Weight Quantization)提出了一个关键观察:不是所有权重都同等重要。对于某些输入激活(Activation),只有一小部分权重会产生活跃的输出(大激活值)。保护这些"重要权重"的量化精度,比均匀量化所有权重更有效。
具体来说:在LLM的FFN(前馈网络)层中,权重矩阵通常有数十亿参数,但给定输入时,只有少量通道(Channels)会产生大输出。AWQ通过校准数据(Calibration Data)来找出这些"重要通道",并对它们进行特殊保护。
4.2 AWQ算法原理
AWQ的核心步骤是:1) 在校准数据上运行模型,收集每层的激活统计;2) 找出对输出影响最大的权重通道;3) 这些通道使用更大的scale(更精细的量化),其他通道使用更小scale。
AWQ算法流程:
1. 收集激活统计:
在校准数据集 D = {x_1, x_2, ..., x_n} 上运行模型
对于每一层 l,收集输入激活 X_l:
X_l = [x_l_1, x_l_2, ..., x_l_n] # shape: [n, input_dim]
2. 计算每个输出通道的重要性(Saliency):
# 对于权重矩阵 W [output_dim, input_dim] 和输入 X:
output = X @ W.T # shape: [n, output_dim]
# 每个输出通道的重要性 = 该通道输出的平均绝对值
importance[j] = mean(|output[:, j]|) for j in [0, output_dim)
3. 保护重要通道:
# 找到重要性最高的 top-k% 通道
threshold = percentile(importance, 100 - k)
protected_channels = {j | importance[j] > threshold}
# 对这些通道使用更大的scale(更精细量化)
for j in range(output_dim):
if j in protected_channels:
scale[j] = max(|W[j, :]|) / (2^(b-1) - 1) # 正常scale
else:
scale[j] = max(|W[j, :]|) / (2^(b-1) - 1) * protection_factor
# protection_factor > 1,使得量化粒度更粗(但保护重要通道不受干扰)
4.3 AWQ vs GPTQ:两种哲学
AWQ和GPTQ代表了两种不同的量化哲学:
| 维度 | GPTQ | AWQ |
|---|---|---|
| 核心思想 | 二阶优化(Hessian) | 激活感知保护 |
| 计算复杂度 | 高(需要Hessian矩阵) | 低(只需激活统计) |
| 校准数据需求 | 较多(准确估计Hessian) | 较少(基本统计即可) |
| 量化精度 | 极高(理论最优) | 很高(工程最优) |
| 适用场景 | 离线量化,追求极致精度 | 快速量化,部署友好 |
4.4 AWQ的工程实现细节
AWQ在实际实现中还有一些精妙的工程细节:
- 保护因子搜索:通过网格搜索(Grid Search)找到最优的protection_factor,平衡精度和压缩比
- 通道级量化:每个输出通道独立量化,可以更好地适应不同通道的尺度差异
- 与vLLM集成:AWQ量化的权重可以直接被vLLM加载,无需特殊内核支持(因为只是改变了scale)
实验表明,AWQ在INT4量化下可以达到接近FP16的精度(困惑度增加<5%),且量化速度比GPTQ快10-100倍。这让AWQ成为生产环境中快速部署量化模型的首选方案。
五、QLoRA:4-bit NormalFloat与双重量化
5.1 QLoRA的创新点
QLoRA(Quantized LLM with Low-Rank Adaptation)是LoRA(Low-Rank Adaptation)和量化的结合。它的核心创新有二:
- 4-bit NormalFloat(NF4)量化:一种专为神经网络权重分布设计的4-bit量化格式
- 双重量化(Double Quantization):对量化常数(scale和zero_point)本身再进行量化,进一步减少内存
QLoRA使得在单个48GB GPU(如A6000)上微调65B参数的LLM成为可能——这是传统FP16微调需要数百GB显存才能完成的任务。
5.2 NormalFloat:符合权重分布的量化
传统量化(INT4/INT8)假设数据在取值范围内均匀分布,但神经网络的权重通常服从正态分布(Normal Distribution)。NormalFloat正是利用这一先验:将正态分布的分位数映射到4-bit整数,使得量化后的表示更符合权重的实际分布。
NormalFloat4 (NF4) 量化原理:
1. 假设权重 W ~ N(0, σ²)(零均值正态分布)
2. 将正态分布分为 2^4 = 16 个区间(quantiles):
分位数 = [-∞, q1, q2, ..., q14, +∞]
其中 q_i = Φ^(-1)(i/16),Φ^(-1)是标准正态分布的逆CDF
例如:
q0 = -∞(理论上)
q1 = Φ^(-1)(1/16) ≈ -1.53
q8 = Φ^(-1)(8/16) = 0
q15 = +∞(理论上)
3. 量化:对每个权重 w,找到它属于哪个区间
q_idx = argmin_i |w - q_i|
Q = q_idx # 4-bit整数,0-15
4. 反量化:
W' = q_Q # 直接用量化时记录的区间中心值
优势:相比INT4(均匀量化),NF4对正常分布的权重更友好
在相同的4-bit下,NF4的量化误差比INT4小30-50%
5.3 双重量化(Double Quantization)
量化常数(scale和zero_point)本身也占用内存。对于通道级量化,每个输出通道都有一个scale值(通常是FP16)。如果通道数很多(例如LLM的FFN层有上万通道),这些scale值本身就会占用数十MB内存。
双重量化的思想是:对scale值本身再进行量化。例如,对FP16的scale值做INT8量化,可以进一步减少内存占用。
双重量化示例:
原始权重量化(FP16 → NF4):
W_q (NF4) + scale (FP16) + zero_point (FP16)
假设有 11008 个输出通道(LLaMA-2 70B的FFN):
scale内存 = 11008 × 2 bytes = 22 KB(每个通道1个scale)
双重量化(对scale再做INT8量化):
W_q (NF4) + scale_q (INT8) + scale_q_scale (FP16)
scale_q内存 = 11008 × 1 byte = 11 KB
scale_q_scale内存 = 1 × 2 bytes = 2 bytes(所有scale共享一个二级scale)
节省:22 KB → 11 KB + 2 bytes ≈ 50% 减少
5.4 QLoRA的训练流程
QLoRA的训练流程巧妙地将量化和微调结合:权重保持4-bit量化(冻结),只训练LoRA的适配器(Adapter)参数(通常是秩分解矩阵A和B)。
| 组件 | 数据类型 | 是否训练 | 参数量 |
|---|---|---|---|
| 基座模型权重 | NF4 (4-bit) | ❌ 冻结 | 70B × 0.5 bytes = 35GB |
| LoRA A矩阵 | FP16 | ✅ 训练 | d_model × rank × num_layers |
| LoRA B矩阵 | FP16 | ✅ 训练 | d_model × rank × num_layers |
| 总计(rank=8) | 混合 | 部分 | ~70B params,仅~80M可训练 |
工程价值:QLoRA使得单卡48GB GPU可以微调70B模型,而传统FP16微调70B需要>200GB显存。这彻底改变了LLM微调的硬件门槛,让更多研究者可以在消费级硬件上探索大模型微调。
六、校准集设计:数据选择对量化误差的影响
6.1 校准集的作用
GPTQ、AWQ等量化方法都需要一个校准集(Calibration Set)—— 一小部分有代表性的数据,用于估计权重的重要性(GPTQ的Hessian)或激活统计(AWQ的重要通道)。校准集的选择直接影响量化后的模型质量。
核心问题:用什么样的数据来校准量化,才能确保量化后的模型在目标任务上表现良好?
6.2 校准集设计原则
好的校准集应该满足以下原则:
校准集设计原则:
1. 领域匹配(Domain Matching):
如果目标任务是对话,校准集应该包含对话数据
如果是代码生成,校准集应该包含代码
反例:用Wikipedia文本校准一个Code LLM → 量化误差估计不准确
2. 多样性(Diversity):
校准数据应该覆盖模型可能遇到的各种输入模式
例如:短文本、长文本、特殊字符、多语言等
3. 数量适中(Quantity):
太少的校准数据(<10条)→ 统计不可靠
太多的校准数据(>1000条)→ 量化速度慢,收益递减
经验值:128-256条校准样本通常足够
4. 代表性(Representativeness):
选择那些能"激活"模型多个神经元的样本
避免过于简单或过于困难的样本
6.3 不同量化方法的校准需求
不同的量化方法对校准集的需求不同:
| 量化方法 | 校准集用途 | 数据量需求 | 质量敏感度 |
|---|---|---|---|
| GPTQ | 估计Hessian矩阵 | 中(128-256条) | 高(影响精度显著) |
| AWQ | 统计激活重要性 | 低(64-128条) | 中(鲁棒性强) |
| RTN(舍入最近) | 无需校准 | 不需要 | N/A |
| QLoRA | 验证量化精度 | 低(用于验证) | 低(LoRA可修复) |
6.4 实际工程建议
在实际生产环境中,校准集的选择建议:
- 通用模型(如LLaMA-2):使用多样化的文本集合(如C4、Wikipedia、GitHub的混合)
- 领域模型(如医疗LLM):至少50%的校准数据来自目标领域
- 多任务模型:校准数据应该覆盖所有任务类型,按比例采样
- 校准集缓存:一旦选定校准集,将其固定并版本化,确保量化结果可复现
实验表明,使用精心设计的校准集,GPTQ INT4量化的困惑度(Perplexity)可以接近FP16基线,而使用随机校准集可能导致困惑度增加30%以上。
七、深挖点:QAT与PTQ的边界与融合
7.1 QAT(量化感知训练)与PTQ(训练后量化)
量化技术分为两大类:PTQ(Post-Training Quantization,训练后量化)和QAT(Quantization-Aware Training,量化感知训练)。它们的核心区别在于:量化是在训练完成后进行,还是在训练过程中就考虑量化?
PTQ vs QAT 对比:
PTQ(训练后量化):
流程:训练(FP16)→ 量化(INT8/INT4)→ 部署
优点:
- 不需要重新训练模型,量化速度快(分钟级)
- 适用于已经训练好的开源模型(如LLaMA)
缺点:
- 量化误差无法在训练中修复
- 对于极低精度(如INT4),精度损失可能较大
QAT(量化感知训练):
流程:训练(模拟量化)→ 量化 → 部署
在训练时,在前向传播中插入"伪量化"节点:
output = quantize(dequantize(W)) @ x # 模拟量化误差
梯度仍然通过FP16权重传播(Straight-Through Estimator)
优点:
- 模型在训练中"学会适应"量化误差
- 极低精度下(INT4/INT3)精度显著优于PTQ
缺点:
- 需要重新训练(或微调),成本高
- 需要训练数据和计算资源
7.2 QAT的工程实现技巧
QAT的实现需要一些特殊的工程技巧,以确保训练稳定性和收敛性:
| 技巧 | 目的 | 实现方式 |
|---|---|---|
| 渐进式量化 | 避免训练初期的不稳定 | 从FP16逐渐过渡到INT8,再过渡到INT4 |
| Straight-Through Estimator | 让梯度通过离散量化操作 | 梯度 = 1(绕过量化节点的梯度) |
| 量化范围学习 | 让模型学习最优的scale/zero_point | 将scale作为可训练参数 |
| 知识蒸馏辅助 | 用FP16教师指导量化学生 | 增加蒸馏损失:L = L_task + α × L_KD |
7.3 PTQ与QAT的融合:最佳实践是?
在实际生产环境中,PTQ和QAT并非二选一,而是可以融合使用:
融合方案:先用PTQ(如GPTQ/AWQ)快速得到量化模型,然后用少量数据进行QAT微调(Quantization-Aware Fine-tuning)。这种方案结合了PTQ的快速性和QAT的高精度,在实践中效果最佳。
具体流程:
- 用GPTQ/AWQ对模型进行PTQ量化(几分钟到几小时)
- 在目标任务数据上,用QAT方法微调量化模型(几小时到几天)
- 微调时只更新少量参数(如LoRA适配器),保持大部分权重量化
这种融合方案使得:量化模型的精度可以接近FP16基线(困惑度差异<1%),同时量化过程快速且灵活。
八、工程落地:vLLM/W4A16部署实战
8.1 W4A16配置详解
在vLLM中,W4A16是一个常见的量化配置:权重(Weights)使用4-bit量化(如NF4/INT4),激活值(Activations)保持FP16。这种配置在精度和性能之间取得了很好的平衡。
为什么只量化权重,不量化激活?因为激活值的量化误差对模型输出影响更大,而且激活值的形状通常较小(batch × seq_len × dim),量化收益有限。相比之下,权重量化可以大幅减少模型加载所需的内存。
8.2 vLLM中加载量化模型
vLLM原生支持多种量化格式(GPTQ、AWQ、QLoRA)。加载量化模型的流程如下:
vLLM加载AWQ量化模型示例:
from vllm import LLM, SamplingParams
# 加载AWQ量化模型
llm = LLM(
model="lmsys/vicuna-7b-v1.5", # 原始模型
quantization="awq", # 指定量化方法
weight_bits=4, # 权重量化位宽
# vLLM会自动加载对应的AWQ量化权重
# 文件名通常为:vicuna-7b-v1.5-awq-4bit.pt
)
# 推理(与FP16模型完全相同)
sampling_params = SamplingParams(temperature=0.7, max_tokens=100)
prompts = ["Hello
8.3 性能调优参数
vLLM提供了多个参数来平衡性能和精度:
参数 描述 推荐值 影响
gpu_memory_utilization GPU显存使用率 0.9-0.95 越高可加载模型越大
max_num_batched_tokens 单次batch最大token数 2048-4096 影响延迟和吞吐
max_num_seqs 最大并发序列数 64-128 影响并发能力
block_size KV Cache块大小 16-32 影响内存碎片
8.4 W4A16的实测收益
在实际部署中,W4A16配置(4-bit权重量化+FP16激活)的典型收益:
LLaMA-2 70B 部署对比(1x A100 80GB):
配置 | 内存占用 | 吞吐量(tokens/s) | 延迟(ms/token) | 困惑度变化
--------------|----------|----------------|----------------|------------
FP16 (基线) | 140 GB | ~35 | ~28 | 0%
INT8 权重量化 | 70 GB | ~38 | ~26 | +2%
INT4 权重量化 | 35 GB | ~42 | ~24 | +5%
W4A16 (AWQ) | 35 GB | ~45 | ~22 | +3%
注意:内存占用减少75%,吞吐量反而提升(因为内存带宽压力减小)!
九、量化模型精度验证方法
9.1 验证维度
量化后的模型需要经过多维度的验证,确保精度损失在可接受范围内:
- 困惑度(Perplexity):在验证集上测量量化前后困惑度的变化,通常要求<+5%
- 下游任务准确率:在典型任务(如HellaSwag、TruthfulQA)上对比FP16和量化模型的准确率
- 生成质量人工评估:对生成样本进行人工评分,检查是否有明显的语义退化
9.2 快速验证流程
在生产环境中,建议采用以下快速验证流程:
量化模型验证流程:
1. 困惑度快速检查(5分钟):
在100条验证样本上计算Perplexity
如果 Perplexity_ratio > 1.1(即增加>10%),拒绝该量化模型
2. 代表性任务测试(30分钟):
运行3-5个典型下游任务(如摘要、翻译、QA)
准确率下降应 < 2%
3. 边界案例测试(15分钟):
测试模型在极端输入(超长文本、特殊字符、多语言)下的表现
确保量化没有引入新的failure mode
4. A/B测试(可选,数小时):
将少量流量导向量化模型,监控用户满意度指标
(如点击率、停留时间)
9.3 常见精度问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 困惑度暴增(>50%) | 校准集不匹配或量化配置错误 | 更换校准集,检查量化位宽 |
| 特定任务性能下降 | 校准集缺乏该任务数据 | 在校准集中加入任务数据 |
| 生成重复/乱码 | 嵌入层或LM Head量化误差 | 保持这些层为FP16 |
| 长文本性能下降 | 位置编码相关权重量化误差 | 对位置编码层使用更精细量化 |
十、主流量化方案对比
10.1 综合对比
以下是当前主流LLM量化方案的综合对比:
| 方案 | 量化位宽 | 精度损失 | 量化速度 | 硬件需求 | 典型应用 |
|---|---|---|---|---|---|
| GPTQ | INT3/4/8 | 极低 | 慢(分钟到小时) | 无需特殊硬件 | 离线量化,追求极致精度 |
| AWQ | INT3/4/8 | 很低 | 很快(分钟级) | 无需特殊硬件 | 快速部署,生产环境 |
| QLoRA | NF4 (4-bit) | 低 | N/A(训练时量化) | 48GB GPU可微调70B | 微调大模型,资源受限 |
| FP8 (H100) | FP8 (E4M3) | 极低 | 极快(无需校准) | 需要H100/A100 | 新硬件,最佳性价比 |
| GGUF (llama.cpp) | INT4/5/8混合 | 中 | 快 | CPU推理也能用 | 边缘部署,CPU推理 |
实战建议:如果是生产环境快速部署,首选AWQ(速度快、精度高、鲁棒性强)。如果是离线量化追求极致精度,用GPTQ。如果需要在消费级硬件上微调大模型,QLoRA是唯一选择。
10.2 未来演进方向
LLM量化技术仍在快速演进,值得关注的方向包括:
- 混合精度量化:不同层使用不同位宽(如注意力层用INT8,FFN用INT4)
- 动态量化:根据输入动态调整量化参数,进一步减少误差
- 训练时量化(QAT)复兴:随着微调成本降低,QAT逐渐成为生产流程的一部分
- 多模态量化:视觉-语言模型的量化需要特殊处理(视觉编码器通常更敏感)
量化技术的发展,使得LLM从"云端巨兽"逐渐走向"边缘智能",这是AI民主化的重要一步。