面向在本地运行语言模型的开发者,一项提案提出了五种用于 CPU 的权重压缩格式,旨在增加模型存储容量与输出准确度之间的平衡选项。
1. 新增内容
提案新增从 IQ2_K 到 IQ6_K 的五种格式。量化是用少量代表值表示权重的压缩方法,新格式采用代表值间距不均匀的表,即非线性码本。
将 256 个权重按每组 16 个划分,保存各组的缩放因子和以固定间隔平移码本的信息。码本的级数为 2 的 n 次方,n 为目标位数,因此 4 位对应 16 级。
原设计者率先在 ik_llama.cpp 中创建了这些格式。本次提案沿用了块布局和名称,但码本与量化器实现是另行开发的。
2. 使用方法与兼容性
测试仓库提供了转换命令。以下命令指定用于调整权重压缩的校准数据,<TYPE> 处填写所选量化格式的名称。
llama-quantize --pure --token-embedding-type q8_0 --output-tensor-type q8_0 --imatrix imatrix/imatrix-K2-Horizon-7B-medium.gguf K2-Horizon-7B-F16.gguf K2-Horizon-7B-<TYPE>.gguf <TYPE>需要注意,名称与现有实现相同,并不意味着文件兼容。测试模型说明明确指出,这些文件无法在常规 llama.cpp 中使用。提案者解释,沿用相同名称并使用原有码本可以实现兼容,但若保留新码本,则应更名。他还补充,格式编号的顺序也需要对齐,目前尚未给出最终选择。
3. 质量结果与代价
质量比较仅针对 K2-Horizon-7B 这一个 90 亿参数的稠密模型。测试固定了配方、校准数据和量化设置,评估使用 275 个 1024 词元的数据块。下表的平均 KLD 表示原始模型与压缩模型输出概率分布的差异,越低越好。
表:相同文件大小下的输出误差比较
条件:K2-Horizon-7B 9B 稠密模型,固定配方、校准数据和量化设置,KLD 评估使用 275 个 1024 词元的数据块,在一台机器上测量(未提供硬件规格)
单位:文件大小 GiB,平均 KLD 无量纲
| 格式 | 文件大小 | 平均 KLD |
|---|---|---|
| Q3_K | 4.81 | 0.179783 |
| IQ3_K | 4.81 | 0.087475 |
| Q4_K | 5.67 | 0.023664 |
| IQ4_K | 5.67 | 0.018850 |
| Q5_K | 6.48 | 0.007991 |
| IQ5_K | 6.48 | 0.006624 |
在本次测试中,三组对比的文件大小均相同,但新格式的平均误差更低。其中,3 位组的平均 KLD 从 0.179783 降至 0.087475。不过,这只是单个模型在一种评估条件下的结果,其他架构能否保持改进仍需进一步测试。
大小和质量并非总能同时改善。在同一模型测试中,IQ6_K 的文件比 Q6_K 大 51.75MiB,即 0.69%,平均 KLD 则低 55.7%。
相比之下,IQ2_K 的文件比 Q2_K 小 4.9%,但平均 KLD 高 18.5%。在最低位数格式中,缩小文件的代价体现为误差增加。
转换时间也是成本。使用 16 个线程测得的实际耗时,IQ3_K 为 155.3 秒,Q3_K 为 15.6 秒。虽然每个模型只需付出一次成本,但在相同大小下减少误差,可能会大幅增加准备时间。
4. 提案的当前范围
这项变更仍是尚未合并的公开拉取请求。除面向 CPU 的变更外,另有独立提案用于添加加速器支持。
已公开的吞吐量测试是在 Metal 后端、12 个线程下运行同一模型得到的结果。只有 3 位格式明显更快,其余大多更慢或表现不一。这不能作为 CPU 速度提升的依据,目前尚未提供 CPU 推理性能数据。
这是一项实验性提案,需要同时权衡相同容量下减少误差的效果与转换所需的额外成本。
