llama.cpp 修复量化 KV 状态拷贝:能生成,不代表恢复会话就正确
11月5日合并的修复进入 b12121:设备侧状态保存、恢复及跨分块复制曾把量化块数当元素数。影响特定状态拷贝路径,不能扩大成所有量化 KV 或所有推理请求均有问题。
llama.cpp 于 11 月 5 日 02:31 UTC 合并 #30541,并在当日 03:00 UTC 发布的 b12121 中纳入修复。事件是旧 PR 在本次窗口正式合并与发版,不是今天首次发现问题。对需要保存、恢复或复制会话状态的本地服务,这比单看生成速度更值得检查。
-
错误发生在特定拷贝路径。PR 说明,启用 LLAMA_STATE_SEQ_FLAGS_ON_DEVICE 时,序列状态通过设备侧 KV 范围副本保存。旧实现用字节数除以元素大小计算拷贝数量;面对 q8_0、q4_0 这样的分块量化类型,得到的却是块数。作者指出,这会只复制部分范围,导致恢复状态错误或拷贝崩溃。不能据此推断所有使用量化 KV 的普通生成请求都会出错。
-
修的是数量计算,不是宣布量化无损。新实现按类型块大小换算回元素数,同时要求范围覆盖完整量化块;保存、恢复及不同分块范围之间的复制都作了调整。PR 明确 f16、f32 缓存不受这项问题影响。模型权重量化与 KV 量化也是两层配置,不能因为都写着 q4 就混成一件事。
-
测试证据有范围。提交者报告,CPU 后端的 test-save-load-state 在 q8_0、q4_0 下,旧版设备序列复制测试失败或崩溃,修复后通过;另检查了配合相关修复的 OpenCL 后端。这是上游测试说明,不是 AraoAI 在全部显卡上的独立复现,也不是速度收益。
部署验收应把连续生成与状态恢复分开:固定模型、构建号、后端和 KV 类型,分别检查保存前后的输出一致性、恢复错误及服务存活。只测一次聊天能回答,证明不了会话状态路径正确。现有环境先留旧构建与日志,再针对实际用到的状态功能回归。
来源:修复 PR;b12121 发布页。