(本文结合AI整理,供参考)

精要与结论(TR; DR)

  1. 资源充足的情况下,模型位宽选择优先级:BF16 > FP32 > FP16 > FP8 > INT
  2. 资源有限的情况下,主流量化路线有AWQ和GGUF,GGUF侧重低显存,AWQ侧重质量
  3. GGUF中,资源充足情况下优先选BF16,否则选Q系列
  4. GGUF中,相同的量化比特下,选择优先级:IQ_NL ≥ IQ ≈ Qn_K > Qn_1 > Qn_0

01 有关位宽的示例

位宽指的是用于表示一个数字的二进制位数,下面用一个示例数字来说明。

示例数字(十进制):

-150.125

首先,我们需要将它转换为二进制科学计数法(类似IEEE754标准格式)。

  1. 转换为二进制
    • 整数部分 150 => 10010110
    • 小数部分 0.125 => .001 (因为 0.125 = 2⁻³)
    • 所以 150.125 => 10010110.001
  2. 二进制科学计数法
    • 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]
  • 量化过程
    1. 假设我们参数的范围是 [-152, 152]
    2. 缩放因子 scale = (152 - (-152)) / (127 - (-128)) = 304 / 255 ≈ 1.192
    3. 量化值: 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,误差非常大。
  • NF4: 它会预定义一组最优的4-bit值(如 [-1.0, -0.7, ..., 0.7, 1.0]),然后将权重归一化后量化到这些最接近的预定义值上。这种方法在极低位宽下能更好地保持模型性能。

总结对比表

格式总位宽符号位指数位尾数位示例值 (表示-150.125)特点与用途
FP32321823-150.125 (精确)训练标准,高精度,高成本
FP16161510-150.125 (精确)推理主力,混合精度训练
BF1616187~ -150.0 (有损)训练新宠,动态范围大,防下溢
FP8 (E4M3)8143~ -144.0 (损失大)下一代推理,精度优先
FP8 (E5M2)8152~ -128.0 (损失更大)下一代推理,范围优先
INT88(N/A)(N/A)(N/A)~ -150.2 (微小误差)经典后量化,需要校准
INT4/NF44(N/A)(N/A)(N/A)~ -141.9 (误差大)极限压缩,用于超大模型

结论:

  1. 指数位越大,可表示的范围越大
  2. 尾数位越大,可表示的精度越高
  3. 范围小容易发生溢出(数值过大无法表示)和下溢(数值过小被舍入为0)
  4. 精度小会损失性能
  5. FP8(E4M3)和FP(E5M2)都是8位,前者精度优先,后者范围优先
  6. 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

  1. 训练时使用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 QuantizationIntelligent 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量化技术路线

特性AWQGGUF (Q / Q_K_V)GGUF (IQ)
全称/代表Activation-aware Weight QuantizationQuantized (泛指), 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-LLMLlama.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_MQ6_K。在大多数任务上,性能非常接近原始模型,是质量和大小的最佳平衡点。
    • 内存紧张/追求速度:选择 Q4_K_M。这是目前最受欢迎的“甜点”级选择,在性能和大小间取得了绝佳平衡。
    • 极致压缩:选择 IQ2_XSQ3_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=Trueload_in_8bit=True 参数加载模型。

总结一张“量化技术地图”供你参考:

技术方案主要应用场景核心后端关键特点
AWQ高性能GPU推理vLLM, AutoAWQ激活感知,性能保持好,GPU速度快
GPTQ高性能GPU推理AutoGPTQ, ExLlamaAWQ前的主流方案,GPU速度快
GGUF (Q/K/V)CPU/边缘设备推理Llama.cpp兼容性最强,生态成熟,选择多样
GGUF (IQ)CPU/边缘设备上的极致压缩Llama.cpp使用知识蒸馏,低比特性能优
bitsandbytes低成本加载与微调Transformers动态量化,无缝集成,方便微调

最终建议: 显存有限选GGUF,否则选AWQ

更多推荐