跳到主要内容

4 篇博文 含有标签「kv-cache」

查看所有标签

KV Cache 驱逐:供应商称其为“缓存压力”,而你的账单则称其为“双倍前缀费用”

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的应用程序开启了一个包含 4 万 token 系统提示词和完整工具库的长对话。第一轮对话按写入费率为前缀付费,且提供商的 KV 缓存(KV cache)开始预热。第二轮对话在 90 秒后到来。你假设这会命中缓存。有时确实如此。但有时,同样的 4 万 token 会再次以未缓存的价格出现在你的账单上,而你的代码在第一轮和第二轮之间没有任何改动。

改变的是别人的流量。KV 缓存是共享基础设施。你的租户被分配到一个推理节点上,而在你的两轮对话之间的 90 秒内,该节点接纳了足够多的其他租户,从而将你的前缀从内存中驱逐。提供商的控制台会将其描述为“缓存压力(cache pressure)”。你的财务团队会将其描述为一项翻倍的支出项。这两种描述都是准确的,但原因都不在你的代码里。

不属于你的那次变慢:对话中途的 KV 缓存逐出

· 阅读需 11 分钟
Tian Pan
Software Engineer

一段对话在同一个 Claude 会话里跑了四十分钟。十一轮回合,每轮平均首字延迟(TTFT)800ms,每轮都很便宜——因为那段 28,000 token 的前缀命中了提示词缓存。第十二轮到来,TTFT 飙到 3.4 秒。对话的形态没变,模型没切换,网络也正常。缓存输入 token 从 27,800 掉到 0。下一轮的 prefill 账单从第一个 token 起就全额计费。

你去追踪里找原因,没有任何一条日志写着"另一个租户的突发流量把你逐出了缓存"。对这次毛刺最诚实的解读是:在同一片 GPU 池的某处,另一个客户的 prompt 让调度器认为,丢掉你这段温热的前缀是代价最小的选择。你无法重放这一轮,无法证明那次逐出。那一刻的缓存状态是陌生人流量的函数,而那些流量不在你的追踪里,因为它们本来就不属于你。

推理服务商向你隐瞒了什么:KV 缓存、批处理与延迟底线

· 阅读需 14 分钟
Tian Pan
Software Engineer

你正在运行一个由 LLM 驱动的应用,你的 p99 延迟为 4 秒。你已经优化了提示词,减少了输出长度,并切换到了流式传输。但这个数字几乎没变。问题不在于你的代码——而是在你无法控制的黑盒内部运作的物理学和排队论。

每个推理服务商在你的第一次 API 调用之前,就已经通过数十项架构决策决定了你应用的性能上限。KV 缓存淘汰策略、连续批处理(continuous batching)调度、分块预填充(chunked prefill)块大小——文档中没有提到这些,你也无法配置,但它们决定了你不得不面对的延迟和成本曲线。

这篇文章将解释推理基础设施内部究竟发生了什么,为什么它会产生不可避免的延迟底线,以及你真正能做的少数几件事。

多模型推理服务的 GPU 显存计算:为什么大多数团队会过度配置 3 倍资源

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数运行 LLM 推理的团队将 GPU 配置视作一场猜谜游戏。他们看到模型在 FP16 精度下需要 “140 GB”,便感到恐慌,于是申请四张 A100-80GB 显卡,然后就觉得万事大吉了。他们没有计算的是 KV 缓存、并发和量化是如何相互作用并决定实际显存占用的——而这种误算通常意味着他们多支付了 3 倍的冤枉钱。

这套计算并不复杂。但在签署云服务合同之前,几乎没有人去计算。本文将详细介绍这些精确的公式,揭示隐藏的显存黑洞,并解释装箱(bin-packing)策略,让你能在原本只够运行一个模型的硬件预算下服务四个模型。