避免重复算 · 减少显存读写
很多人以为推理慢是 GPU 算力不够。其实算力往往没用满——瓶颈是重复计算和显存读写。
自回归生成时,每生成第 t 个 token,注意力要算它和前 t-1 个 token 的关系,需要前 t-1 个 token 的 K、V。如果不缓存,每步都从头重算所有历史 token 的 K、V——O(N²) 的重复。KV 缓存把算过的 K、V 存下来,下一步直接用,省掉重算。
Flash-Attention 解决另一个瓶颈:标准注意力要把 N×N 的注意力矩阵写进 HBM(显存)再读回,HBM 带宽是瓶颈。Flash-Attention 把矩阵分块,在 SRAM(片上高速缓存)里算完再写回,避免 N² 矩阵的显存读写。算的次数没少,但读写少了,墙钟时间大降。
选序列长度,看 基础 / KV缓存 / KV缓存+Flash-Attention 三种方案的时间、显存、加速比。
一个常见坑:开了 KV 缓存但 batch 大时显存爆——因为每个请求一份缓存。生产上要做 KV 缓存管理(淘汰、压缩、量化到 8bit)。Flash-Attention 则几乎无副作用,能用就用。