Skip to content

量化

以下是关于 llama.cpp 里面 Q8_0、Q6_K_M、Q4_K_M 量化原理的总结:

传统量化(Legacy quants)

  • 包含的量化方法:包括 Q4_0、Q4_1、Q8_0 等。
  • 特点:简单快速的量化方式,每个层被分成 256 个权重的块,每块被转换成 256 个量化值和额外的常数(例如 Q4_1 会多 1 个常数,约等于 4.0625 bits),解压缩方便,可以用位移、AND 和乘法实现,在一些老旧显卡上可能会更快。

K-quants

  • 包含的量化方法:如 Q3_K_S、Q5_K_M 等。
  • 特点:具体的量化方式和传统量化有所不同,可能在精度和存储效率等方面有进一步的优化和改进。

具体量化方法的量化原理

  • Q8_0:使用 int8_t(8 位整数)来表示每个权重,块大小为 32,量化值范围是 -127 到 127,属于无损的量化方法,因为 FP32 转换到 int8_t 的时候,只是简单地除以了一个固定的数,所以没有信息丢失,速度非常快,但模型体积是原来的 1/4,同时精度几乎没怎么下降。
  • Q6_K_M:使用 6 位整数来表示权重,块大小为 64,量化值范围是 -32 到 31,属于 K-quants 中的一种,可能在精度和存储效率之间取得了较好的平衡。
  • Q4_K_M:使用 4 位整数来表示权重,块大小为 32,量化值范围是 -8 到 7,也是 K-quants 中的一种,相比 Q8_0,模型体积更小,但精度可能会有所下降,不过通过一些量化技巧和补偿方法,仍然能够在一定程度上保证模型的性能。

总的来说,这些量化方法在精度和计算效率之间取得了不同的平衡,适用于不同的应用场景和硬件条件。

Ref

https://www.zhihu.com/question/633365088