llama.cpp b10724:碎片化KV缓存恢复提速数十倍,CUDA后端从25-63秒降至221-424毫秒
新版本批量处理非连续单元格的状态恢复,CPU与设备端路径均覆盖,并增加了回归测试。
AI解读:llama.cpp b10724针对KV缓存恢复做了针对性优化。此前,当提示缓存快照恢复到碎片化环形缓冲区时,代码会为每个KV单元单独发起一次拷贝,恢复 40k+ token需要约 140 万次小拷贝,在CUDA后端耗时 25 到 63 秒。新版本预计算连续目标索引的跨度,将同一连续块合并为单次拷贝,实测同样恢复操作只做 224 次拷贝,耗时降至 221 到 424 毫秒,提速两个数量级,且保证与旧逻辑字节级一致。对于本地跑大模型、经常做prompt cache或状态保存恢复的用户,这能明显减少长上下文的等待时间,尤其在碎片化缓存场景下效果突出。这次优化需要配合后续提交对读端回退路径的处理,因此建议用户直接升级到此版本或更高版本,并留意是否有相关回归测试覆盖到自己的后端。
llama.cpp发布b10724版本,优化了将状态恢复到非连续KV缓存单元时的性能。当把提示缓存快照恢复到碎片化环形缓冲区时,旧代码为每个KV单元发起一次小拷贝,恢复超过 40k token在CUDA后端需要约 140 万次拷贝,耗时 25 至 63 秒。新版本通过预计算连续目标索引跨度,每次恢复按跨度合并拷贝,实测同一恢复(42,603 个单元,4 个跨度)仅需 224 次拷贝,耗时降至 221 至 424 毫秒。
优化实现与保证
快照按单元顺序存储行,因此连续的目标索引跨度对应一个连续的数据块,可用单次拷贝恢复。这个跨度列表只需计算一次,并在三个散点循环(K、V、转置V)中复用。开发者声称该优化保证字节级一致性,不改变输出。
当读写双方的分块方式不同(例如保存时按区间而恢复时按跨度),设备端读取器使用字节游标进行拷贝,确保批量读取安全性。另一项改动是当读写双方记录的张量数量相同但分块方式不同时,回退到字节游标路径,避免断言失败。
- 生产环境验证:拷贝数从 1,363,616 降至 224,耗时从 25-63 秒降至 221-424 毫秒(42,603 个单元,4 个跨度)。
- 新增测试覆盖主机和设备的散点读取路径,验证字节级一致性。
其他构建信息
此版本暂不提供macOS KleidiAI和openEuler构建,官方未说明原因。提供了macOS(Apple Silicon、Intel)、Ubuntu(x64、arm64、s390x CPU;Vulkan;ROCm、OpenVINO、SYCL等)、Windows(CPU、CUDA 12/13、Vulkan、OpenVINO、SYCL、ROCm)、Android arm64、iOS及UI压缩包。代码由Claude Code(unsloth/qwen3.8-27b模型)辅助开发。