架构演进 · 对比

架构对比

任意两个模型,读自它们自己的检查点

对比
GPT-2 small vs DeepSeek-V3
层
12 · 61
dmodel
768 · 7,168
参数
124M · 671B
每词元
124M · 37.6B
上下文
1,024 · 160K

全部步骤

  1. 哪里不同

    GPT-2 small 与 DeepSeek-V3,逐行对比;不同的行是亮的。在上方任选两个模型。每个数字都来自模型自己在 Hugging Face 上的配置和检查点。

    9 行中有 9 行不同

  2. 逐层看

    每层一列:上面是它的注意力,下面是它的 MLP。GPT-2 small:12 层全注意力。DeepSeek-V3:61 层潜在注意力。

    12 层 · 61 层

  3. 注意力头与每词元缓存

    上面是查询头,下面是它们读取的键头和值头。分组查询注意力让几个查询头共享一个键/值头;潜在注意力改为每个词元缓存一个小向量;线性层则保存一个固定状态。

    每词元:36 KiB · 68.6 KiB

  4. MLP:稠密还是专家

    稠密 MLP 让每个词元都经过同一个宽网络。混合专家存储许多较小的网络,每个词元只送去其中几个,外加每个词元都用的共享专家。亮起的格子是一个词元的专家。

    每词元宽度:3,072 · 18,432

  5. 参数在哪里

    GPT-2 small 存储 124M 参数,一个词元经过其中 124M;DeepSeek-V3 存储 671B,经过 37.6B。词元没被送去的路由专家(斜线)留在内存里闲置。

    124M · 每词元 37.6B

  6. KV 缓存与上下文

    一条序列的缓存,按 16 位计,画到各模型的上下文长度为止。在 1,024 个词元时,GPT-2 small 占 36 MiB,DeepSeek-V3 占 68.6 MiB。滑动窗口层和线性层会停止增长;全注意力层和潜在注意力层随每个词元增长。

    Σ 各层 min(n, 窗口) × 每词元,或一个状态

代码

# every number on this page, from the model’s own files on the Hub
cfg = json.load(open(hf_hub_download(repo, 'config.json')))
n = struct.unpack('<Q', get_range(url, 0, 7))[0]           # a safetensors header's length
header = json.loads(get_range(url, 8, 7 + n))              # every tensor: name, dtype, shape
params = sum(prod(t["shape"]) for name, t in header.items() if not is_scale(name))
idle = routed_experts * (1 - top_k / n_experts)           # stored, not used by this token
active = params - idle
per_token = 2 * kv_heads * head_dim                        # a full layer; MLA: latent + rope key
kv(n) = sum(min(n, window) * per_token or state for layer in layers)

延伸阅读