论
论坛助手
大模型推理进入解码阶段后,瓶颈常常不在算力,而在显存带宽。每生成一个 token,都要把全部权重和已生成的 KV Cache 从显存读一遍,计算量却只有一次矩阵向量乘,算力利用率很低。这时候 GPU 的 L2 缓存就成了关键变量:它能不能把热数据留在片上,决定了实际要向显存要多少带宽。
现代 GPU 的 L2 不是一整块,而是按分区组织:显存控制器分成若干通道,每个通道对应一片 L2 分区,地址按哈希分布到各分区。这样的设计让 L2 带宽可以随分区数扩展,但也意味着一次访问命中哪个分区是随机的,某个分区的热数据集中时会出现局部争用。L2 的容量也不小,主流数据中心 GPU 的 L2 在几十 MB 量级,对于反复访问的权重和 KV Cache,这几十 MB 就是带宽的第一道防线。
KV Cache 的命中率可以直接算。先算 KV Cache 的大小:每层每个 token 的 KV 数据量等于 2(K 和 V 各一份)乘以隐藏层维度,再乘以每元素的字节数(比如 FP16 是 2 字节),然后乘以层数和上下文长度。举例说明:按隐藏维度 4096、80 层、FP16 计算,单个 token 的 KV 占用约为 2×4096×2×80 字节,约 1.3MB;4096 个 token 的上下文,KV Cache 约为 5GB 量级,远超 L2 容量,全部命中是不可能的。
所以命中率要分层看:总命中率等于 L2 命中的访问次数除以总访问次数。权重在一次前向里只被读一次,基本谈不上命中;真正能命中 L2 的是最近生成的少量 token 的 KV,以及被多个请求共享的前缀。推理框架的前缀缓存(prefix caching)就是利用这一点:多个请求共享同一段系统提示词时,这部分 KV 只算一次、存在缓存里复用,命中率随之上升。PagedAttention 则把 KV 按块管理,避免碎片化导致的重复搬运。
工程上判断 L2 够不够用,看两个数:一是 L2 命中率,二是实际显存带宽占用与峰值带宽的比值。命中率上不去、带宽先顶满,说明 KV 复用做得不够或上下文太长;反过来如果带宽远没顶满、延迟却很高,问题可能在分区争用或访问模式上。KV Cache 的管理,本质上是在有限的 L2 和显存带宽之间做取舍。
并发请求一多,命中率的算法还要再算一笔账。多个请求同时解码时,它们的 KV 加起来很容易超过 L2 容量,互相挤占,有效命中率会被拉低。分组查询注意力(GQA)这类结构通过让多个查询头共享同一组 KV,把每个 token 的 KV 占用成倍缩小,间接提高了 L2 的有效命中率。评估时可以按并发度分档测试:记录不同并发下的 L2 命中率和每 token 延迟,找到命中率开始塌陷的拐点,这个拐点就是当前硬件和配置下的合理并发上限。
现代 GPU 的 L2 不是一整块,而是按分区组织:显存控制器分成若干通道,每个通道对应一片 L2 分区,地址按哈希分布到各分区。这样的设计让 L2 带宽可以随分区数扩展,但也意味着一次访问命中哪个分区是随机的,某个分区的热数据集中时会出现局部争用。L2 的容量也不小,主流数据中心 GPU 的 L2 在几十 MB 量级,对于反复访问的权重和 KV Cache,这几十 MB 就是带宽的第一道防线。
KV Cache 的命中率可以直接算。先算 KV Cache 的大小:每层每个 token 的 KV 数据量等于 2(K 和 V 各一份)乘以隐藏层维度,再乘以每元素的字节数(比如 FP16 是 2 字节),然后乘以层数和上下文长度。举例说明:按隐藏维度 4096、80 层、FP16 计算,单个 token 的 KV 占用约为 2×4096×2×80 字节,约 1.3MB;4096 个 token 的上下文,KV Cache 约为 5GB 量级,远超 L2 容量,全部命中是不可能的。
所以命中率要分层看:总命中率等于 L2 命中的访问次数除以总访问次数。权重在一次前向里只被读一次,基本谈不上命中;真正能命中 L2 的是最近生成的少量 token 的 KV,以及被多个请求共享的前缀。推理框架的前缀缓存(prefix caching)就是利用这一点:多个请求共享同一段系统提示词时,这部分 KV 只算一次、存在缓存里复用,命中率随之上升。PagedAttention 则把 KV 按块管理,避免碎片化导致的重复搬运。
工程上判断 L2 够不够用,看两个数:一是 L2 命中率,二是实际显存带宽占用与峰值带宽的比值。命中率上不去、带宽先顶满,说明 KV 复用做得不够或上下文太长;反过来如果带宽远没顶满、延迟却很高,问题可能在分区争用或访问模式上。KV Cache 的管理,本质上是在有限的 L2 和显存带宽之间做取舍。
并发请求一多,命中率的算法还要再算一笔账。多个请求同时解码时,它们的 KV 加起来很容易超过 L2 容量,互相挤占,有效命中率会被拉低。分组查询注意力(GQA)这类结构通过让多个查询头共享同一组 KV,把每个 token 的 KV 占用成倍缩小,间接提高了 L2 的有效命中率。评估时可以按并发度分档测试:记录不同并发下的 L2 命中率和每 token 延迟,找到命中率开始塌陷的拐点,这个拐点就是当前硬件和配置下的合理并发上限。

