返回课堂

KV 不是比喻,是一张容量账本

V02/b0 · 先数一层一个 token

教学配置:32 层 · 每层 8 组 KV · 每组 128 个数 · BF16 每数 2 字节
K
32 × 8 × 128
+
V
32 × 8 × 128
每数 2 bytes
2 × 32 × 8 × 128 × 2 = 131,072 bytes/token
128 KiB / token
8,192 token
1 GiB / 请求
8 个不共享请求
8 GiB KV

GiB = 2³⁰ bytes;前面的模型权重 GB = 10⁹ bytes。共享模型权重,不能自动共享不同请求的 KV。

先数一层一个 token

这次我们用一张独立的教学配置卡,不把它假装成刚才 MoE 的同一个真实模型。每一层,每个 token 留下八组 key 和八组 value,每组一百二十八个数,每个数用 BF16 保存,占两个字节。先不急着背多头注意力名称,直接数图上可见对象:八组,乘一百二十八,乘 K 和 V 两份,再乘两个字节,得到四千零九十六字节。这是一层里一个 token 的缓存,不是整个请求。

教师备课:指图与模拟问答

指图与推进 · 不朗读依次指八组、每组维度、K/V 两份及精度;留五秒核算。

V02/b1 · 再乘层数和长度

教学配置:32 层 · 每层 8 组 KV · 每组 128 个数 · BF16 每数 2 字节
K
32 × 8 × 128
+
V
32 × 8 × 128
每数 2 bytes
2 × 32 × 8 × 128 × 2 = 131,072 bytes/token
128 KiB / token
8,192 token
1 GiB / 请求
8 个不共享请求
8 GiB KV

GiB = 2³⁰ bytes;前面的模型权重 GB = 10⁹ bytes。共享模型权重,不能自动共享不同请求的 KV。

再乘层数和长度

模型有三十二层,再乘三十二,得到十三万一千零七十二字节,也就是每 token 一百二十八 KiB。这里的 KiB 是一千零二十四字节。接着乘八千一百九十二个 token,恰好是一 GiB。两个看起来相同的二不能混在一起:一个来自 K 和 V 有两份,一个来自每个数占两字节。图旁保留完整乘法,课后不需要靠记忆猜。长度如果变成三万二千七百六十八,其他条件不变,缓存就是四 GiB。这是容量的线性增长关系:模型配置和精度固定时,长度翻四倍,KV 就翻四倍;注意力所需的计算怎样增长,则是另一项账。

教师备课:指图与模拟问答

指图与推进 · 不朗读教师指向当前高亮对象,随后推进。

V02/b2 · 并发和输出都继续增加

教学配置:32 层 · 每层 8 组 KV · 每组 128 个数 · BF16 每数 2 字节
K
32 × 8 × 128
+
V
32 × 8 × 128
每数 2 bytes
2 × 32 × 8 × 128 × 2 = 131,072 bytes/token
128 KiB / token
8,192 token
1 GiB / 请求
8 个不共享请求
8 GiB KV

GiB = 2³⁰ bytes;前面的模型权重 GB = 10⁹ bytes。共享模型权重,不能自动共享不同请求的 KV。

并发和输出都继续增加

现在有八个互不共享的请求,每个都已经缓存八千一百九十二 token,合起来就是八 GiB。模型权重可以由这些请求共用,但各自的历史状态不同,通常不能随便共用 KV。每多生成一个新 token,缓存还会继续增长。这里用的是二进制 GiB,前面的十六 GB 权重用十进制,两者不要直接当同一个单位相加。我们也还没算页内空位、运行缓冲和其他开销。容量账本告诉我们并发不能只看权重能否装下。接下来,一个请求已经结束,空出来的位置能不能立刻给另一个请求用?

教师备课:指图与模拟问答

指图与推进 · 不朗读教师指向当前高亮对象,随后推进。

补充推导、边界与来源

采用独立教学配置:32 层,每层每 token 保存 8 组 K 和 8 组 V,每组 128 个数,BF16 每数 2 字节。每 token 容量为 32×8×128×2×2=131072 bytes=128 KiB。两个 2 分别表示 K/V 两份,以及每个数的字节数,不能漏算或重复算。8192 token 为 1 GiB,32768 token 为 4 GiB。

八个互不共享、各已缓存 8192 token 的请求合计 8 GiB。这里 GiB=2³⁰ bytes,而前面权重用 GB=10⁹ bytes;两者不可直接当成相等单位。T 包含进入缓存的输入和生成 token,后续输出继续增长。若模型有 32 个 query heads、8 个 KV heads,属于分组查询注意力的一种配置;缓存按实际 K/V 组数算,不再额外乘 query 头数。

本页证据与条件

A13;A14

进入主题正文