gguf量化说明

在使用gguf量化模型前出现了一个疑问:大模型使用gguf量化,直接通过gguf指令量化即可还是需要额外推理、微调适配量化么?因为开源模型在发布量化模型时候都会有AWQ、GPTQ的量化这两种量化都是推理量化(Post-Training Quantization, PTQ),要在推理时候感知权重影响或者梯度适应误差做量化。
查阅后发现GGUF 的量化是直接对模型参数量化的,不需要推理、不需要训练。

直接使用 GGUF 的指令(例如 llama.cpp 中的 quantize 程序)对已经训练好或微调好的模型进行量化即可,你不需要为了适配这个量化过程而进行额外的推理、微調。 使用 llama.cpp 的 quantize 工具,将已有的 FP16等模型转换为 GGUF 格式的量化模型(例如 Q4_K_M)。GGUF 的量化工具被设计为一种通用工具,处理的是模型权重的数值。

gguf工具量化保证精度的主要方法将一个大的权重矩阵分成许多个小块(Blocks),通常每块包含 32 或 256 个权重值。然后,为每一个小块独立计算其缩放因子

  • 局部适应性: 每个小块内的数值范围远小于整个矩阵,因此可以找到一个更适合该小块的缩放因子,从而大大减少量化误差。
  • 隔离异常值: 一个包含极端值的块只会影响其自身的量化精度,而不会“污染”其他块的计算。

另外 K-Quants (K-量化) 的创新。 K-Quants 是对块量化思想的进一步优化。
在 K-Quants 方法中(名称中的 K 代表块大小,通常是256),除了为每个块计算一个缩放因子外,还引入了额外的、更高精度的参数来帮助更好地重构原始值。
以最流行的 Q4_K_M 为例:
它将 256 个 FP 16 权重值量化为 256 个 4-bit 整数。除了这 256 个 4-bit 整数,它还为这个块额外存储了:

  1. 一个 FP 16 的缩放因子 (d)。
  2. 一个 FP 16 的最小值 (m)。

在推理时, llama.cpp 会使用这些高精度的 d 和 m 值,将 4-bit 整数“解压缩”回浮点数进行计算。因为用于解压缩的“钥匙”(缩放因子和最小值)是高精度的,所以恢复出来的数值就更接近原始值

不同的gguf格式模型名称中的字符表示:
_S (Small): 最小的额外开销,精度提升有限。
_M (Medium): 中等开销,精度提升明显,是最常用和推荐的级别之一。
_L (Large): 最大的额外开销,精度最高。

GGUF 格式和 llama.cpp 的量化脚本对精度更敏感的层会做额外精度处理。敏感层: 比如模型的词嵌入层( tok_embeddings )和最后的输出层( output ),这些层的微小误差可能会被放大,对最终生成结果产生较大影响。
GGUF 的处理:在量化时,可以选择性地将这些关键层保持为更高的精度(例如 FP16 ),而只量化那些不太敏感的中间层。做到了混合精度存储权重。

量化过程不仅仅是简单的四舍五入。它会使用数值优化算法(如最小化均方误差)来为每个块找到最佳的缩放因子和零点,以确保量化后的值与原始值之间的整体差异最小。

llama.cpp 项目提供的 quantize 工具是一个基于 CPU 的命令行程序。它的设计初衷就是在普通的计算机上运行,而不需要依赖强大的 GPU。不占用显存,虽然是一个好消息,毕竟显存比内存贵很多,但坏消息是,量化过程需要把整个模型加载到内存。
一个简单的估算方法:
模型大小: 查看下载的原始模型文件夹有多大。例如,一个 7B(70亿参数)的 FP16 模型,其文件大小通常在 13-14 GB 左右。
内存需求: 至少需要比模型文件大小略多一些的可用 RAM。因为占用一部分内存做中间值缓冲。

没有采用更节省内存的“流式处理”(streaming)方式。主要是出于设计简单性、执行效率和 GGUF 文件格式本身结构的综合考虑。避免复杂的层加载顺序、计算状态、前后信息流的考虑。使用工具更加稳定、易用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值