本节摘要:5.3 节的账本宣告了「Q4 权重加 32K 窗口」在 6GB 卡上爆账,本节用 KV 量化把这笔账救回来:把缓存从 16 位压到 8 位甚至 4 位,显存立省一半以上,而质量代价经实测几乎无感(8 位档)。含完整的组合实测、质量评估方法与这台机器最终落地的 32K 配置。
第 5 章留下一道悬案:权重 4700MB、32K 窗口的 16 位缓存要 1800MB,加上缓冲与驱动直接爆账。常规思路是降权重位宽——但 6.2 节刚建立的质量纪律告诉我们,能不动权重就不动。第三条路就是本节主角:KV 缓存自己也能量化。缓存里存的键值向量与权重一样是浮点数,同样适用第 3 章的分块量化技术,只是对象从权重换成了运行时状态。
命令行上就是两个缓存类型参数:K 与 V 可以独立指定精度。先看账目变化,再谈质量:
# 16 位基线:32K 窗口的缓存约 1.8 GB,6GB 卡装不下 llama-cli -m 模型.gguf -ngl 99 -c 32768 -fa on # K 与 V 都压到 8 位:缓存减半到约 900 MB,账本回到安全线 llama-cli -m 模型.gguf -ngl 99 -c 32768 -fa on \ --cache-type-k q8_0 --cache-type-v q8_0 # 更激进的 4 位档:缓存约 450 MB,给大模型或更大窗口腾地方 llama-cli -m 模型.gguf -ngl 99 -c 32768 -fa on \ --cache-type-k q4_0 --cache-type-v q4_0
| 缓存配置 | 缓存占用 | 总占用 | 质量观感 |
|---|---|---|---|
| K、V 均 16 位 | 约 1800 MB | 爆账,无法运行 | 基线 |
| K、V 均 8 位 | 约 900 MB | 约 6080 MB,贴线 | 长文问答与基线难以区分 |
| K 4 位、V 8 位 | 约 670 MB | 约 5850 MB | 海捞测试偶有召回变慢 |
| K、V 均 4 位 | 约 450 MB | 约 5630 MB | 长文细节保持下降,可感知 |
两处机制细节值得交代。其一,开启 KV 量化通常要求同时打开注意力快算(表内 -fa 参数):旧实现的缓存读写粒度不兼容低比特布局,新版快算内核一并解决了这个问题——报「缓存类型不支持」的读者先查这一项。其二,K 与 V 的敏感度不对称:键向量决定「去哪里找信息」,值向量承载「找到的内容」,实践里 V 对量化的耐受度通常更差。所以激进的省法是「K 压 4 位、V 保 8 位」的非对称组合,质量与体积的折中往往优于双双 4 位。
KV 量化的质量损失不在困惑度上显形(短文本指标对缓存精度不敏感),要用长上下文专属的测法。
海捞测试:在长文本的中段埋入若干条可检索的事实(例如「主角的猫叫雪球」),窗口外提问,看模型能否捞回。这个测试直接检验「远处信息的可召回性」,正是缓存量化最先伤到的地方。手工做只需一段三千字文本加三个事实、三轮提问;要求成体系可参考社区的长文本评测集。
续写连贯性测试:把一篇长文喂入后让模型续写并抽查前文细节的一致性。8 位档在两项测试里都与基线持平;4 位档开始出现「记得大概、忘了细节」的症状——具体人名与数字的召回变慢。
结论按档位给:8 位档可以放心常开,它是免费午餐;非对称 4 加 8 档用于贴线场景,开前跑一遍海捞测试;双 4 位档只在大模型换大窗口的极端需求下临时使用。
回到主线那台机器,综合三本账与量化手段,窗口策略收敛成一张表:
| 需求场景 | 推荐组合 | 依据 |
|---|---|---|
| 日常对话(4K 内) | Q4_K_M 加 16 位缓存 4K | 5.3 节账本充裕,无需量化 |
| 长文档问答(16K) | Q4_K_M 加 8 位缓存 | 缓存 450MB,账本从容 |
| 超长上下文(32K) | Q4_K_M 加 8 位缓存贴线,或 Q3 加 8 位宽裕 | 本章账目 |
| 极限压缩(64K 级) | 换更小模型加 4 位缓存 | 权重让位,别硬挤 |
最后的忠告关于动机:扩窗口之前先问「我真的需要一次性装下这么多吗」。多数长文档任务用检索切片(第 8.3 节)拆开喂,效果优于硬塞超长窗口——缓存量化解决的是「装得下」,检索解决的是「装得值」。
质量验收不必依赖外部评测集,一个文本文件加三轮提问就能搭出自制版。做法:找一篇三千字左右的领域文章,在开头、中段、结尾各埋一条具体事实(人名、数字、日期最合适),然后正常开启会话把全文粘贴进上下文,依次就三条事实提问,记录模型能否准确召回。判分标准三级:准确召回、模糊带过、彻底遗忘。8 位量化档的合格线是三题全准;「K 四位 V 八位」的非对称档允许中段模糊;双四位档若出现两题以上遗忘,就该退档。把这套测试连同埋点文本存进个人工具箱——每次升级引擎版本或更换缓存配置后重跑一遍,五分钟换来对长文本质量的持续信心。
KV 量化与检索增强不是竞争关系,是互补的两级。量化解决「装得下」:把窗口容量翻倍,单次能读的文本更长。检索解决「装得值」:从海量文档里先挑出相关段落,窗口里全是干货。组合的最佳实践按场景分:全文精读类任务(合同审阅、长文翻译)优先量化扩窗,模型需要通览全文结构;查询应答类任务(知识库问答、客服辅助)优先检索,窗口短平快且成本恒定。这台机器的最终配置是两者的分工共存:32K 量化窗口留给精读任务,检索管线留给日常问答——工具多了不是负担,是选择权。
影响很小且方向不定:缓存体积缩小反而减轻带宽压力,低比特解包又增加一点计算,实测中速度变化在噪声范围内。选缓存位宽只看显存账与质量验收,速度账可以忽略。
长参数组合适合固化:命令行用户存成别名或脚本(4.3 节的模板习惯在此复用),服务用户写进启动配置。参数管理的一致性本身就是排错效率——「我记得我开过」不如「配置文件里写着」。
值得。新模型的窗口训练值在涨,但「在消费级显卡上兑现」永远要过显存账本这一关——大窗口模型加缓存量化,才是账本成立的方式。本节的方法恰是把「纸面窗口」变成「可用窗口」的桥梁。
KV 量化参数的生效有前置条件链,排错时按链回溯:参数写了但没生效——先查是否开了注意力快算(多数版本的低比特缓存依赖它);开了快算仍报不支持——再查量化类型拼写与该类型是否被当前缓存布局支持;生效了但质量骤降——回头检查是不是 K、V 双双压到了最低档。这条链上的每一环都有明确日志,比「玄学调参」可靠得多。把参数视为一个有依赖关系的组合,而不是三个独立开关,是使用进阶参数的通用心智。