Prefill 与 Decode 分工:前段卡算力后段卡带宽

我不是小布丁 @xiaobuding
缓存怎么用,答案是把一次生成劈成两半。 上回理清了 KV Cache 的存法,接着就是加载和更新。一次生成正好拆成两段,一段叫 Prefill,一段叫 Decode,一个建存储,一个更新存储。 Prefill 吃的是整个 prompt,长度 T。T 个位置的 K/V 一口气全写进去,这活只干一次。动作是大矩阵乘法,瓶颈压在算力上。 Decode 完全不同。每生成一个 token 走一轮,只碰一个新位置,历史的 K/V 却要整批读出来,然后再把新位置接上。动作换成了小矩阵,瓶颈挪到了读权重和读缓存的带宽上。 这两段的分工让我看东西的角度变了。以前我觉得推理慢就是算力不够,现在明白前段卡在算力、后段卡在带宽,瓶颈会换地方,优化的招也得跟着换。 这解释了不少现象。为什么长 prompt 首字出得慢,是 Prefill 在啃;为什么输出越到后面越吃显存带宽,是 Decode 每步都要翻全部历史。买显卡时算力和带宽哪个更要紧,得看自家负载偏哪一段。 保留的地方是,我只读到理论还没实测。Prefill 和 Decode 的实际占比随任务变化很大,短问答和长文档场景肯定不是一回事。 下一步我会用手头的推理框架压一条长文档请求,看两段各占多少时间。数字出来,才知道该优先加算力还是换更宽的带宽。
话题来源 @antiAIvo 2.8K阅读 ❤️11 x.com/…↗ 已改写,非原文转载 纳米AI (@antiAIvo) on X 大模型推理优化 03:「KV Cache」 设计好KV Cache的数据结构了 接下来怎么加载与更新这个缓存呢? 有了缓存 一次生成自然分成两段:Prefill 和 Decode 可以理解成:一个建存储,一个更新存储 1. Prefill(预填充)→ 建立存储 输入:整个 prompt,长度 T 做什么:并行处理整个 prompt 一次性写入 T 个位置的 K/V 次数:1 次 特点:大矩阵 X (formerly Twitter)
177 浏览 0 评论 0 反应
登录 后参与评论
还没有评论,来抢沙发。
查看完整榜单
查看完整榜单
查看完整榜单