AI | 大模型量化中的位宽与量化格式选择(GGUF和AWQ)
目录
(本文结合AI整理,供参考)
精要与结论(TR; DR)
- 资源充足的情况下,模型位宽选择优先级:
BF16 > FP32 > FP16 > FP8 > INT - 资源有限的情况下,主流量化路线有AWQ和GGUF,
GGUF侧重低显存,AWQ侧重质量 - GGUF中,资源充足情况下优先选
BF16,否则选Q系列 - GGUF中,相同的量化比特下,选择优先级:
IQ_NL ≥ IQ ≈ Qn_K > Qn_1 > Qn_0
01 有关位宽的示例
位宽指的是用于表示一个数字的二进制位数,下面用一个示例数字来说明。
示例数字(十进制):
-150.125
首先,我们需要将它转换为二进制科学计数法(类似IEEE754标准格式)。
- 转换为二进制:
- 整数部分 150 =>
10010110- 小数部分 0.125 =>
.001(因为 0.125 = 2⁻³)- 所以 150.125 =>
10010110.001- 二进制科学计数法:
10010110.001=1.0010110001× 2⁷- 符号位: 负数为
1- 指数: 7
- 尾数/小数部分:
0010110001(省略了开头的1)现在,我们把这个数字“塞进”不同位宽和格式的容器里。
关于偏移量
偏移量 = 2^指数位数-1
例如,在FP32中:
32 = `1`位符号 + `8`位指数 + `23`位尾数 指数位数为8 所以偏移量为2^8-1=127
1. FP32 (32-bit Floating Point) - “黄金标准”
- 结构:
1位符号 +8位指数 +23位尾数 - 特点: 高精度,范围广,是训练时的默认格式。
- 示例 (-150.125):
- 符号位:
1 - 指数: 7 + 127(偏移量) = 134 =>
10000110 - 尾数:
00101100010000000000000(23位,后面补0) - FP32 表示:
1 10000110 00101100010000000000000
- 符号位:
2. FP16 (16-bit Floating Point) - “推理主力”
- 结构:
1位符号 +5位指数 +10位尾数 - 特点: 内存和带宽占用是FP32的一半,广泛应用于推理和混合精度训练。
- 示例 (-150.125):
- 符号位:
1 - 指数: 7 + 15(偏移量) = 22 =>
10110 - 尾数:
0010110001(10位,刚好) - FP16 表示:
1 10110 0010110001 - 注意: FP16能精确表示这个数。
- 符号位:
3. BF16 (Brain Floating Point) - “训练新宠”
- 结构:
1位符号 +8位指数 +7位尾数 - 特点: 指数位与FP32相同(范围大),尾数位少(精度低)。非常适合深度学习训练,不容易出现梯度下溢。
- 示例 (-150.125):
- 符号位:
1 - 指数: 7 + 127(偏移量) = 134 =>
10000110 - 尾数:
0010110(7位,截断了0010001) - BF16 表示:
1 10000110 0010110 - 注意: 由于尾数被截断,实际表示的数值是
-150.0,存在精度损失。
- 符号位:
4. FP8 (E4M3) - “高效推理先锋1”
- 结构:
1位符号 +4位指数 +3位尾数 - 特点: 极低位宽,指数范围小,尾数精度极低。需要配合量化感知训练等技术。
- 示例 (-150.125):
- 符号位:
1 - 指数: 7 + 7(偏移量) = 14 =>
1110 - 尾数:
001(3位,截断了0110001) - FP8 (E4M3) 表示:
1 1110 001 - 注意: 这个格式能表示的最大指数是 2¹⁵,但我们的数字指数是7,在范围内。但尾数损失巨大,实际值约为
-144.0。
- 符号位:
5. FP8 (E5M2) - “高效推理先锋2”
- 结构:
1位符号 +5位指数 +2位尾数 - 特点: 比E4M3指数范围更大,但尾数精度更低。适合处理数值范围变化大的张量。
- 示例 (-150.125):
- 符号位:
1 - 指数: 7 + 15(偏移量) = 22 =>
10110 - 尾数:
00(2位,截断了10110001) - FP8 (E5M2) 表示:
1 10110 00 - 注意: 尾数只剩2位,精度损失更严重,实际值约为
-128.0。
- 符号位:
6. INT8 (8-bit Integer) - “经典量化”
- 特点: 不再是浮点数!需要有一个缩放因子(scale) 将浮点范围映射到整数范围
[-128, 127]。 - 量化过程:
- 假设我们参数的范围是
[-152, 152]。 - 缩放因子
scale = (152 - (-152)) / (127 - (-128)) = 304 / 255 ≈ 1.192 - 量化值:
round(-150.125 / 1.192) = round(-125.9) = -126
- 假设我们参数的范围是
- INT8 表示:
-126(在计算机中以二进制补码10000010存储) - 反量化:
-126 * 1.192 ≈ -150.2(与原始值有微小误差)
7. INT4 / NF4 (4-bit Integer / Normalized Float 4) - “极限压缩”
- 特点: 位宽极低,直接映射范围会带来巨大误差。通常使用更聪明的量化策略,如NF4,它不是线性的,而是针对神经网络权重(近似正态分布)优化过的4-bit值表示。
- 直观理解(非NF4):
- 如果用简单INT4,范围是
[-8, 7]。 - 缩放因子会非常大,
scale = 304 / 15 ≈ 20.27。 - 量化值:
round(-150.125 / 20.27) = round(-7.41) = -7 - INT4 表示:
-7(二进制1001) - 反量化:
-7 * 20.27 ≈ -141.9,误差非常大。
- 如果用简单INT4,范围是
- NF4: 它会预定义一组最优的4-bit值(如
[-1.0, -0.7, ..., 0.7, 1.0]),然后将权重归一化后量化到这些最接近的预定义值上。这种方法在极低位宽下能更好地保持模型性能。
总结对比表
| 格式 | 总位宽 | 符号位 | 指数位 | 尾数位 | 示例值 (表示-150.125) | 特点与用途 |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | -150.125 (精确) | 训练标准,高精度,高成本 |
| FP16 | 16 | 1 | 5 | 10 | -150.125 (精确) | 推理主力,混合精度训练 |
| BF16 | 16 | 1 | 8 | 7 | ~ -150.0 (有损) | 训练新宠,动态范围大,防下溢 |
| FP8 (E4M3) | 8 | 1 | 4 | 3 | ~ -144.0 (损失大) | 下一代推理,精度优先 |
| FP8 (E5M2) | 8 | 1 | 5 | 2 | ~ -128.0 (损失更大) | 下一代推理,范围优先 |
| INT8 | 8 | (N/A) | (N/A) | (N/A) | ~ -150.2 (微小误差) | 经典后量化,需要校准 |
| INT4/NF4 | 4 | (N/A) | (N/A) | (N/A) | ~ -141.9 (误差大) | 极限压缩,用于超大模型 |
结论:
- 指数位越大,可表示的范围越大
- 尾数位越大,可表示的精度越高
- 范围小容易发生溢出(数值过大无法表示)和下溢(数值过小被舍入为0)
- 精度小会损失性能
- FP8(E4M3)和FP(E5M2)都是8位,前者精度优先,后者范围优先
- FP16和BF16都是16位,前者精度优先,后者范围优先
按范围排序(范围优先,同范围精度优先)
- FP32 = BF16 > FP16 = FP8(E5M2) > FP8(E4M3)
按精度排序
- FP32 > FP16 > BF16 > FP8(E4M3) > FP8(E5M2)
02 关于FP8与BF16的转换
一些模型,例如DeepSeek-V3训练时使用FP8,给出转换脚本可将FP8转换为BF16再推理。
例如:https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/fp8_cast_bf16.py
- 训练时使用FP8
DeepSeek-V3训练时使用的是UE8M0(参考1)(参考2)
像DeepSeek-V3这样的巨型模型(参数量千亿级别)使用FP8训练,主要驱动力是极致的内存和计算效率,以应对“规模定律”。
-
内存带宽瓶颈:训练大模型时,最大的瓶颈往往不是计算速度,而是内存带宽。将激活值、梯度、优化器状态从显存搬运到计算单元的时间占据了大部分开销。
- FP8 (1字节) 相比 BF16/FP16 (2字节),直接将这部分数据的传输量减半,显著缓解了带宽压力。
-
计算速度:现代专业AI硬件(如NVIDIA H100的Transformer引擎、Google的TPU)为FP8提供了专用的硬件支持,使得在FP8下进行矩阵乘法和卷积运算能达到最高的TFLOPS(每秒万亿次浮点运算)。
-
足够的动态范围:与INT8不同,FP8是一种浮点格式,它保留了浮点数的指数位,因此拥有比INT8大得多的动态范围。这对于处理训练过程中数值变化巨大的激活值和梯度至关重要,避免了溢出和下溢。
简单总结:在保证数值稳定的前提下,FP8是当前硬件上能实现的、在训练效率和模型规模之间找到的最佳平衡点。
2. 推理时使用BF16
- FP16: 范围较小,容易发生溢出(数值过大无法表示)和下溢(数值过小被舍入为0)。
- BF16: Google提出的格式,它牺牲了一些精度来扩大表示范围,使其更接近FP32,从而更好地保持模型稳定性。在推理速度上与FP16相似,但更稳定。
简单理解:BF16是FP16的升级版,其范围与FP32相同,精度比FP16略低,即牺牲精度保全范围。
虽然最新硬件支持FP8训练,但BF16/FP16是目前推理运行时(如ONNX Runtime, TensorRT, vLLM)支持最好、最成熟、最稳定的格式。
将模型转换为BF16可以确保它在更广泛的硬件(包括一些不支持FP8推理的旧卡)上无缝运行。
03 GGUF量化格式
参考:https://github.com/ggml-org/llama.cpp/blob/master/tools/quantize/quantize.cpp
{ "Q4_0", LLAMA_FTYPE_MOSTLY_Q4_0, " 4.34G, +0.4685 ppl @ Llama-3-8B", },
{ "Q4_1", LLAMA_FTYPE_MOSTLY_Q4_1, " 4.78G, +0.4511 ppl @ Llama-3-8B", },
{ "MXFP4_MOE",LLAMA_FTYPE_MOSTLY_MXFP4_MOE," MXFP4 MoE", },
{ "Q5_0", LLAMA_FTYPE_MOSTLY_Q5_0, " 5.21G, +0.1316 ppl @ Llama-3-8B", },
{ "Q5_1", LLAMA_FTYPE_MOSTLY_Q5_1, " 5.65G, +0.1062 ppl @ Llama-3-8B", },
{ "IQ2_XXS", LLAMA_FTYPE_MOSTLY_IQ2_XXS, " 2.06 bpw quantization", },
{ "IQ2_XS", LLAMA_FTYPE_MOSTLY_IQ2_XS, " 2.31 bpw quantization", },
{ "IQ2_S", LLAMA_FTYPE_MOSTLY_IQ2_S, " 2.5 bpw quantization", },
{ "IQ2_M", LLAMA_FTYPE_MOSTLY_IQ2_M, " 2.7 bpw quantization", },
{ "IQ1_S", LLAMA_FTYPE_MOSTLY_IQ1_S, " 1.56 bpw quantization", },
{ "IQ1_M", LLAMA_FTYPE_MOSTLY_IQ1_M, " 1.75 bpw quantization", },
{ "TQ1_0", LLAMA_FTYPE_MOSTLY_TQ1_0, " 1.69 bpw ternarization", },
{ "TQ2_0", LLAMA_FTYPE_MOSTLY_TQ2_0, " 2.06 bpw ternarization", },
{ "Q2_K", LLAMA_FTYPE_MOSTLY_Q2_K, " 2.96G, +3.5199 ppl @ Llama-3-8B", },
{ "Q2_K_S", LLAMA_FTYPE_MOSTLY_Q2_K_S, " 2.96G, +3.1836 ppl @ Llama-3-8B", },
{ "IQ3_XXS", LLAMA_FTYPE_MOSTLY_IQ3_XXS, " 3.06 bpw quantization", },
{ "IQ3_S", LLAMA_FTYPE_MOSTLY_IQ3_S, " 3.44 bpw quantization", },
{ "IQ3_M", LLAMA_FTYPE_MOSTLY_IQ3_M, " 3.66 bpw quantization mix", },
{ "Q3_K", LLAMA_FTYPE_MOSTLY_Q3_K_M, "alias for Q3_K_M" },
{ "IQ3_XS", LLAMA_FTYPE_MOSTLY_IQ3_XS, " 3.3 bpw quantization", },
{ "Q3_K_S", LLAMA_FTYPE_MOSTLY_Q3_K_S, " 3.41G, +1.6321 ppl @ Llama-3-8B", },
{ "Q3_K_M", LLAMA_FTYPE_MOSTLY_Q3_K_M, " 3.74G, +0.6569 ppl @ Llama-3-8B", },
{ "Q3_K_L", LLAMA_FTYPE_MOSTLY_Q3_K_L, " 4.03G, +0.5562 ppl @ Llama-3-8B", },
{ "IQ4_NL", LLAMA_FTYPE_MOSTLY_IQ4_NL, " 4.50 bpw non-linear quantization", },
{ "IQ4_XS", LLAMA_FTYPE_MOSTLY_IQ4_XS, " 4.25 bpw non-linear quantization", },
{ "Q4_K", LLAMA_FTYPE_MOSTLY_Q4_K_M, "alias for Q4_K_M", },
{ "Q4_K_S", LLAMA_FTYPE_MOSTLY_Q4_K_S, " 4.37G, +0.2689 ppl @ Llama-3-8B", },
{ "Q4_K_M", LLAMA_FTYPE_MOSTLY_Q4_K_M, " 4.58G, +0.1754 ppl @ Llama-3-8B", },
{ "Q5_K", LLAMA_FTYPE_MOSTLY_Q5_K_M, "alias for Q5_K_M", },
{ "Q5_K_S", LLAMA_FTYPE_MOSTLY_Q5_K_S, " 5.21G, +0.1049 ppl @ Llama-3-8B", },
{ "Q5_K_M", LLAMA_FTYPE_MOSTLY_Q5_K_M, " 5.33G, +0.0569 ppl @ Llama-3-8B", },
{ "Q6_K", LLAMA_FTYPE_MOSTLY_Q6_K, " 6.14G, +0.0217 ppl @ Llama-3-8B", },
{ "Q8_0", LLAMA_FTYPE_MOSTLY_Q8_0, " 7.96G, +0.0026 ppl @ Llama-3-8B", },
{ "F16", LLAMA_FTYPE_MOSTLY_F16, "14.00G, +0.0020 ppl @ Mistral-7B", },
{ "BF16", LLAMA_FTYPE_MOSTLY_BF16, "14.00G, -0.0050 ppl @ Mistral-7B", },
{ "F32", LLAMA_FTYPE_ALL_F32, "26.00G @ 7B", },
3.1 基础格式 Qx_y
{ "Q4_0", LLAMA_FTYPE_MOSTLY_Q4_0, " 4.34G, +0.4685 ppl @ Llama-3-8B", },
{ "Q4_1", LLAMA_FTYPE_MOSTLY_Q4_1, " 4.78G, +0.4511 ppl @ Llama-3-8B", },
{ "Q5_0", LLAMA_FTYPE_MOSTLY_Q5_0, " 5.21G, +0.1316 ppl @ Llama-3-8B", },
{ "Q5_1", LLAMA_FTYPE_MOSTLY_Q5_1, " 5.65G, +0.1062 ppl @ Llama-3-8B", },
{ "Q8_0", LLAMA_FTYPE_MOSTLY_Q8_0, " 7.96G, +0.0026 ppl @ Llama-3-8B", },
-
Q:代表 Quantization(量化)。 -
x:表示权重的位宽。Q4就是 4-bit,Q5就是 5-bit。 -
y:表示缩放因子和零点的位宽。_0:通常表示不对称量化,且缩放因子(scale)使用 FP16,但权重是低精度的。它只为每个数据块(block)存储一个缩放因子。_1:在_0的基础上,为每个数据块额外存储一个零点(zero point),通常能带来更高的精度。
例子:
Q4_0: 4-bit 权重,每块一个 FP16 缩放因子。Q5_1: 5-bit 权重,每块一个 FP16 缩放因子和一个 FP16 零点。
3.2 K-系列(混合精度)
{ "Q2_K", LLAMA_FTYPE_MOSTLY_Q2_K, " 2.96G, +3.5199 ppl @ Llama-3-8B", },
{ "Q2_K_S", LLAMA_FTYPE_MOSTLY_Q2_K_S, " 2.96G, +3.1836 ppl @ Llama-3-8B", },
{ "Q3_K", LLAMA_FTYPE_MOSTLY_Q3_K_M, "alias for Q3_K_M" },
{ "Q3_K_S", LLAMA_FTYPE_MOSTLY_Q3_K_S, " 3.41G, +1.6321 ppl @ Llama-3-8B", },
{ "Q3_K_M", LLAMA_FTYPE_MOSTLY_Q3_K_M, " 3.74G, +0.6569 ppl @ Llama-3-8B", },
{ "Q3_K_L", LLAMA_FTYPE_MOSTLY_Q3_K_L, " 4.03G, +0.5562 ppl @ Llama-3-8B", },
{ "Q4_K", LLAMA_FTYPE_MOSTLY_Q4_K_M, "alias for Q4_K_M", },
{ "Q4_K_S", LLAMA_FTYPE_MOSTLY_Q4_K_S, " 4.37G, +0.2689 ppl @ Llama-3-8B", },
{ "Q4_K_M", LLAMA_FTYPE_MOSTLY_Q4_K_M, " 4.58G, +0.1754 ppl @ Llama-3-8B", },
{ "Q5_K", LLAMA_FTYPE_MOSTLY_Q5_K_M, "alias for Q5_K_M", },
{ "Q5_K_S", LLAMA_FTYPE_MOSTLY_Q5_K_S, " 5.21G, +0.1049 ppl @ Llama-3-8B", },
{ "Q5_K_M", LLAMA_FTYPE_MOSTLY_Q5_K_M, " 5.33G, +0.0569 ppl @ Llama-3-8B", },
{ "Q6_K", LLAMA_FTYPE_MOSTLY_Q6_K, " 6.14G, +0.0217 ppl @ Llama-3-8B", },
这是 llama.cpp 的主力量化格式,在精度和速度上取得了很好的平衡。其核心思想是 “混合精度”。
-
K: 代表 K-quantization。这是一种更高级的量化方案,它会对一个权重张量中不同范围的数据块使用不同的量化位宽。 -
_S/_M/_L: 代表同一量化级别下的不同“质量”预设。_S(Small): 更激进,模型更小,但精度更低。_M(Medium): 平衡选项,是最常用的选择。(K后面没有跟尾缀的时候默认的选项)_L(Large): 更保守,模型稍大,但精度最高。
工作原理:系统会分析权重值的分布。对于数值范围大、比较“重要”的块,使用更高的位宽(如 6-bit);对于数值集中、比较“平凡”的块,使用更低的位宽(如 4-bit)。通过动态调配比特,在总大小不变的情况下,实现整体更高的精度。
例子:
Q4_K_M: 混合 4-bit 量化,使用中等质量预设。它是目前 4-bit 量化的黄金标准。Q2_K: 混合 2-bit 量化,是 2-bit 级别下效果最好的格式之一。
3.3 IQ系列(非均匀/智能量化)
{ "IQ2_XXS", LLAMA_FTYPE_MOSTLY_IQ2_XXS, " 2.06 bpw quantization", },
{ "IQ2_XS", LLAMA_FTYPE_MOSTLY_IQ2_XS, " 2.31 bpw quantization", },
{ "IQ2_S", LLAMA_FTYPE_MOSTLY_IQ2_S, " 2.5 bpw quantization", },
{ "IQ2_M", LLAMA_FTYPE_MOSTLY_IQ2_M, " 2.7 bpw quantization", },
{ "IQ1_S", LLAMA_FTYPE_MOSTLY_IQ1_S, " 1.56 bpw quantization", },
{ "IQ1_M", LLAMA_FTYPE_MOSTLY_IQ1_M, " 1.75 bpw quantization", },
{ "IQ3_XXS", LLAMA_FTYPE_MOSTLY_IQ3_XXS, " 3.06 bpw quantization", },
{ "IQ3_S", LLAMA_FTYPE_MOSTLY_IQ3_S, " 3.44 bpw quantization", },
{ "IQ3_M", LLAMA_FTYPE_MOSTLY_IQ3_M, " 3.66 bpw quantization mix", },
{ "IQ3_XS", LLAMA_FTYPE_MOSTLY_IQ3_XS, " 3.3 bpw quantization", },
{ "IQ4_NL", LLAMA_FTYPE_MOSTLY_IQ4_NL, " 4.50 bpw non-linear quantization", },
{ "IQ4_XS", LLAMA_FTYPE_MOSTLY_IQ4_XS, " 4.25 bpw non-linear quantization", },
这是最前沿的量化技术,比 K-系列更先进。
-
IQ: 代表 Imatrix Quantization 或 Intelligent Quantization。其核心是使用一个重要性矩阵来指导量化,或者使用非均匀量化。 -
x: 表示目标平均位宽。IQ2目标约 2 bpw,IQ3目标约 3 bpw。 -
XXS / XS / S / M: 表示在同一目标位宽下的不同“质量/大小”等级。XXS(Extra Extra Small): 最激进,最小。XS(Extra Small)S(Small)M(Medium): 更保守,更大。NL(Non-Linear):更精确地表示最重要的权重值,从而显著降低量化误差,在同等压缩率下实现了更高的精度。
核心优势:
- 非均匀量化:传统的
Qx_y是均匀量化,将数值范围等分。而 IQ 系列可以根据权重分布的重要性,进行不等分量化,在重要的区域分配更多的量化等级。 - 利用激活值信息:一些 IQ 方法在量化时会考虑激活值的分布,实现更优的全局误差最小化。
例子:
IQ2_XS: 智能 2-bit 量化,超小变体,平均位宽 2.31 bpw。IQ3_XS: 智能 3-bit 量化,超小变体,平均位宽 3.3 bpw。它在 ~3.3 bpw 下实现了接近Q4_K_M(~4.5 bpw) 的性能,非常强大。
3.4 其他格式
{ "MXFP4_MOE",LLAMA_FTYPE_MOSTLY_MXFP4_MOE," MXFP4 MoE", },
{ "TQ1_0", LLAMA_FTYPE_MOSTLY_TQ1_0, " 1.69 bpw ternarization", },
{ "TQ2_0", LLAMA_FTYPE_MOSTLY_TQ2_0, " 2.06 bpw ternarization", },
{ "IQ4_NL", LLAMA_FTYPE_MOSTLY_IQ4_NL, " 4.50 bpw non-linear quantization", },
{ "F16", LLAMA_FTYPE_MOSTLY_F16, "14.00G, +0.0020 ppl @ Mistral-7B", },
{ "BF16", LLAMA_FTYPE_MOSTLY_BF16, "14.00G, -0.0050 ppl @ Mistral-7B", },
{ "F32", LLAMA_FTYPE_ALL_F32, "26.00G @ 7B", },
- MXFP4_MOE
一种特殊的 4-bit 浮点格式,专门为量化 MoE 模型而设计,用于解决超大型 MoE 模型的部署难题。
- TQ1_0 / TQ2_0
TQ 代表 Ternarization(三值化, -1, 0, 1),极致压缩,精度损失严重,目前处于研究阶段。
探索项目示例:https://github.com/microsoft/BitNet
-
F16 / BF16 / F32(无损或接近无损的格式)
- F32:完全无损
- BF16:范围与F32相同,精度比F16低,业界做模型推理的标准
- F16:BF16的备选,范围比BF16低
无损程度:F32 > BF16 > F16
业界部署一般选BF16,完全无损选F32
3.5 同尺寸下技术路线比较
这四种在 llama.cpp 中具有代表性的量化技术路线。
| 技术阶段 | 代表格式 | 核心思想 | 类比 |
|---|---|---|---|
| 1. 基础量化 | Q4_0, Q5_1 | 均匀一刀切:对整个张量或数据块使用相同的线性缩放。 | 用一把均匀的尺子测量所有物体。 |
| 2. 混合精度 | Q4_K_M, Q5_K_S | 因地制宜:对张量中不同重要性的数据块,动态分配不同的位宽。 | 高级厨师:好食材精加工,普通食材粗加工,总体成本不变,菜品质量更高。 |
| 3. 智能均匀量化 | IQ3_XS, IQ2_S | 更优的均匀尺度:在均匀量化的框架内,通过更优的尺度选择和权重分配,找到全局最优的量化点。 | 换一把刻度更科学的均匀尺子。 |
| 4. 智能非均匀量化 | IQ4_NL | 按需分配刻度:承认数据分布不均,在重要区域(如零附近)使用更密集的刻度。 | 定制尺子:在需要精确测量的区域刻得更密,在不重要的区域刻得更疏。 |
从夯到拉:IQ_NL ≥ IQ ≈ Q_K > Qn_1 > Qn_0
结论:一般选IQ系列即可
04 AWQ量化技术路线
| 特性 | AWQ | GGUF (Q / Q_K_V) | GGUF (IQ) |
|---|---|---|---|
| 全称/代表 | Activation-aware Weight Quantization | Quantized (泛指), Key 和 Value 的量化策略 | Importance Quantization |
| 核心思想 | 激活感知:通过分析激活值来保护重要权重,对它们少量化或不量化。 | 层级量化:对模型不同部分(如注意力层的 K, V 矩阵,前馈网络层等)采用对称的、统一的比特精度。 | 知识蒸馏引导:使用原始大模型作为“老师”,来指导量化后小模型(“学生”)的训练,保留最重要的知识。 |
| 技术类型 | 后训练量化 | 后训练量化 | 量化感知训练 |
| 优点 | 1. 性能保持极好。 2. 无需训练,速度快。 3. 硬件友好,推理速度快。 | 1. 兼容性极强(CPU/GPU)。 2. 方案成熟稳定,社区支持最好。 3. 量化级别选择多,从“无损”到“极致压缩”。 | 1. 在相同比特数下,性能通常优于普通的GGUF量化。 2. 能实现极低比特(如2-bit)的量化。 |
| 缺点 | 1. 主要依赖GPU推理以获得加速。 2. 在纯CPU上性能优势不明显。 | 1. “一刀切”的量化方式可能不如AWQ智能,同比特下性能可能稍逊。 2. 需要依赖 Llama.cpp 等特定运行时。 | 1. 需要训练,过程复杂且耗时。 2. 模型种类和选择相对Q/K/V较少。 |
| 常见后缀举例 | -AWQ | -Q4_K_M, -Q5_K_S, -Q8_0 | -IQ2_XS, -IQ3_XS |
| 运行后端 | vLLM, AWQ, AutoAWQ, TensorRT-LLM | Llama.cpp (及其绑定,如Ollama, LM Studio) | Llama.cpp |
选择哪种量化格式,主要取决于你的 硬件 和 使用场景。
1. 如果你拥有强大的 NVIDIA 显卡(例如 8GB+ 显存),并追求极致的推理速度:
- 首选
-AWQ模型。 - 理由:AWQ 为 GPU 推理做了深度优化,配合 vLLM 等高性能后端,吞吐量(Tokens per second)通常是最高的。
- 使用方式:使用 vLLM、TensorRT-LLM 或 AutoAWQ 库来部署。
2. 如果你的显存有限,或者主要在 CPU 上运行(包括苹果 M系列芯片):
- 首选
-GGUF模型(即 Q/K/V 或 IQ 系列)。 - 理由:Llama.cpp 及其生态是 CPU 推理的绝对王者,能高效地利用内存和 AVX2 等指令集。苹果 M芯片的 Metal GPU 也能获得很好的加速。
- 如何选择具体级别:
- 保真度优先:选择
Q5_K_M或Q6_K。在大多数任务上,性能非常接近原始模型,是质量和大小的最佳平衡点。 - 内存紧张/追求速度:选择
Q4_K_M。这是目前最受欢迎的“甜点”级选择,在性能和大小间取得了绝佳平衡。 - 极致压缩:选择
IQ2_XS或Q3_K_S。适合在资源极度受限的设备(如手机)上运行,但性能损失会相对明显。 - 初次尝试/不确定:从
Q4_K_M开始,如果不满意再换更高级别。
- 保真度优先:选择
3. 如果你追求在极低比特下的最佳性能:
- 可以尝试
-IQ系列的 GGUF 模型。例如IQ2_XS可能在 2-bit 级别上比其他 2-bit 量化方法表现好得多。
05 其他量化方案
1. GPTQ
- 简介:在 AWQ 之前最流行的 GPU 权重量化方案。它通过对权重矩阵进行逐层重构来最小化量化误差。
- 特点:同样是 4-bit,文件小,GPU 推理快。但在一些基准测试中,其性能保持能力略逊于 AWQ。
- 后缀:
-GPTQ,-4bit。
2. bitsandbytes (bnb)
- 简介:由 Hugging Face 开发,极大地降低了模型运行的门槛。它支持 动态量化,即在模型加载时实时地将权重转换为 4-bit/8-bit。
- 特点:非常灵活,可以与 Transformers 库无缝集成,方便进行加载和微调。虽然推理速度不如 AWQ/GPTQ,但对于想要低成本微调大模型的用户来说是首选。
- 使用场景:使用
load_in_4bit=True或load_in_8bit=True参数加载模型。
总结一张“量化技术地图”供你参考:
| 技术方案 | 主要应用场景 | 核心后端 | 关键特点 |
|---|---|---|---|
| AWQ | 高性能GPU推理 | vLLM, AutoAWQ | 激活感知,性能保持好,GPU速度快 |
| GPTQ | 高性能GPU推理 | AutoGPTQ, ExLlama | AWQ前的主流方案,GPU速度快 |
| GGUF (Q/K/V) | CPU/边缘设备推理 | Llama.cpp | 兼容性最强,生态成熟,选择多样 |
| GGUF (IQ) | CPU/边缘设备上的极致压缩 | Llama.cpp | 使用知识蒸馏,低比特性能优 |
| bitsandbytes | 低成本加载与微调 | Transformers | 动态量化,无缝集成,方便微调 |
最终建议: 显存有限选GGUF,否则选AWQ
更多推荐
所有评论(0)