llama.cpp b10750:KV缓存n-gram查找改用序列位置索引,生成速度提升约 5%
新版本通过复用序列位置索引避免在每个ubatch重建哈希表,使解码速度从 ~69.3 t/s升至 72.7 t/s(+4.9%),预填充保持不变,贪心输出结果一致。
AI解读:这个版本的改动集中在KV缓存的内部实现。开发者让get_prev_tokens() 直接复用llama_kv_cells已有的seq_pos有序索引,而不是在每次处理batch时重新遍历所有缓存单元构建哈希表,并用 (pos, cell) 集合解决了重复位置和缓存复用场景下的正确性问题。净效果是在特定测试中解码速度提升约 5%(72.7 t/s),且输出结果不变。对使用llama.cpp自建本地推理服务的用户来说,这意味着在相同硬件上能获得更快的token生成速度,而不影响准确性;对嵌入llama.cpp的开发者,新的seq_pos_tok_le() 接口提供了按位置查询历史token的更高效方法。需要留意的是,+4.9% 只代表该开发者在某个测试条件下的成绩,实际提升取决于任务负载和硬件,建议在自身环境基准测试后再判断是否升级。
llama.cpp发布b10750版本,核心改动是重构KV缓存中的n-gram历史查找逻辑:get_prev_tokens() 不再每次ubatch重建 (seq, pos) -> token哈希表,改为直接使用llama_kv_cells维护的seq_pos有序索引。
实现细节与修复
根据发布说明,修改前get_prev_tokens() 为每个ubatch遍历所有已使用的缓存单元并重建哈希映射;而llama_kv_cells已为每个序列保存位置有序索引seq_pos,并在每次单元变更时更新,用于服务seq_pos_min() 和seq_pos_max()。本次改动将索引存储从position -> count映射改为std::set中的 (pos, cell) 对,使重复位置(如通过rm + add进行缓存复用,或多模态视觉输入共享位置)能产生不同条目,删除一个缓存单元时也只会擦除自己的条目。新增的seq_pos_tok_le() 函数返回最大位置处特定单元对应的token。
性能与行为验证
发布说明报告了基准结果:解码(generation)速度达 72.7 t/s,提升 4.9%;预填充(prefill)速度不变,约为 2720 t/s;贪心解码输出与改动前一致;在needle检索测试中能正确找到目标内容(“needle retrieved”)。
可用构建
b10750提供Linux、Windows、macOS、iOS、Android等多个平台的预编译二进制。平台与后端包括:Ubuntu x64/arm64/s390x(CPU)、Vulkan、ROCm 7.14、OpenVINO 2026.3.1、SYCL FP32/FP16;Windows x64/arm64(CPU)、CUDA 12.4、CUDA 13.3、CUDA 13.4(arm64,预览)、Vulkan、OpenVINO、SYCL、ROCm 7.14以及OpenCL Adreno(arm64);macOS Apple Silicon(arm64)、macOS Intel(x64)、iOS XCFramework;Android arm64(CPU)。另有Web UI压缩包。
- 注意:部分构建被标记为DISABLED,包括macOS Apple Silicon的KleidiAI版本以及openEuler相关构建,发布时间未说明具体原因。