
10 倍并发不翻车llama.cpp 共享 KV 缓存的完整落地指南【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp同一模型、同一提示词并发从 1 加到 10 后首 token 延迟从 200ms 涨到 2s 以上这往往不是算力不够而是每个会话都在各自重算一遍前缀。llama.cpp 的 KV 缓存KV cache配合其槽位slot机制让多会话共享同一份已算好的键值状态把重复 prefill 的开销直接省掉。先搞懂共享 KV 缓存到底在共享什么 把 prefill 想象成做底料一大段系统提示词算出来的中间键值对如果每个会话都重新做一遍就像十张桌子各请一位厨师炒同一锅汤底。llama.cpp 的做法是这锅汤底只做一次存进一块环形缓存ring buffer十张桌子共用。具体机制拆开看是三层环形缓存 槽位分配每个 token 的 K/V 只写入一次后续生成时按位置查找可用槽位缓存写满后从头覆写因此上下文上限由-c显式决定而不是无限增长。序列隔离每个会话有自己的序列 ID映射到独立的流上。共享的是底层存储与可复用的前缀数据不同会话之间不会互相读到脏状态。V 缓存转置存储缓存里 V 张量默认以转置布局存放注意力计算时可以连续读内存减少访存——这也是 KV 缓存能把生成阶段提速数倍的主要来源。图矩阵行主序/列主序与转置乘积布局示意对应 KV 缓存中 V 张量的转置存储设计怎么选三种共享路径的适用边界路径共享粒度适用场景优点代价多槽位统一缓存默认单进程内所有 slot 共享一块 KV buffer普通在线服务、长系统提示词前缀命中率高配置最简上下文总容量按 slot 数摊薄序列状态复制seq_cp进程内一条会话复制到另一条分支对话、A/B 试验、投机草稿不重新 prefill毫秒级克隆目标序列必须有足够空闲空间状态序列化 save/restore进程间文件会话迁移、冷启动加速、多实例恢复可跨重启/跨机器搬运需落盘有 IO 开销经验法则是先默认路径不够再叠加。前两种同时用并不冲突第三种通常在重启后不想让用户等 prefill时才上。分步落地从构建到验证第 1 步环境准备——克隆并构建CPU 即可跑通有 NVIDIA GPU 加 CUDA 支持即可git clone https://gitcode.com/GitHub_Trending/ll/llama.cpp cmake -B build cmake --build build --config Release -j第 2 步核心配置——启动共享缓存服务端./build/bin/llama-server -m model.gguf -c 8192 -np 8 \ -fa on -ctk q8_0 -ctv q8_0 --slot-save-path ./slots其中-np 8开 8 个槽位-fa on开启 Flash Attention注意力带宽压力更小-ctk/-ctv q8_0将 K/V 缓存降为 8bit 量化显存占用约降到 f16 的四分之一代价是轻微精度损失统一 KV buffer--kv-unified在 slot 数取 auto 时默认开启保证跨序列共享同一块缓存。第 3 步验证效果——两条路一是查/slots与/metrics端点重点看llamacpp:n_busy_slots_per_decode每次解码实际合并了几个会话和 prompt cache 命中字段二是用项目自带的压测脚本python3 tools/server/bench/bench.py --host 127.0.0.1 --port 8080 --parallel 8可复现的对比口径固定一段长前缀分别以--parallel 1与--parallel 8压测命中率上来后前缀部分耗时近似被摊薄单请求 prefill 延迟应明显下降——以你机器的实测值为准。避坑诊断症状 / 根因 / 处方症状根因处方多会话同前缀prefill 延迟却没降缓存未真正统一或命中前缀过短确认 slot 数为 auto统一 buffer 默认开启并把共享提示词前置到消息最前面长上下文 多 slot 显存吃紧KV 缓存按层数 × 头 × 上下文 × slot 数增长用-ctk q8_0量化缓存或调小-c量化后需回归对比输出质量换模型重启后会话失忆用户重新等 prefill状态只存在内存里配置--slot-save-path请求结束后用POST /slots/{id}?actionsave落盘新实例actionrestore恢复补充两个隐性坑-np开太多时每个 slot 分到的有效上下文会被压缩slot 数应与真实并发匹配而非拉满量化缓存对对精度敏感的任务如长数学推理建议先跑一组回归再全量开启。去哪扩展接口化的内存体系现在这套机制已经抽象为可插拔的内存接口llama_memory_i——标准 KV、iSWA 滑窗、DSA 稀疏注意力等都是它的不同实现社区也在推进两块缓存间共享单元cell sharing等方向新的内存类型可以作为独立模块贡献进来入口在 tools/server/服务端行为与 docs/ops.md后端算子与运维对照。把同一份前缀只算一次从单机单会话扩展到单服务多会话不需要加卡只需把上面三步走完——用--parallel 8压测一次你就能亲眼看到首 token 延迟曲线在并发下被压平。【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考