前几篇一直在掰扯公式怎么来的(12·L·d² 那种口诀),这篇把这些天验证过的模型摊在一张表上,纯对账。

我只记这四行式子

一个 decoder-only 模型,参数量就四块:

  • 注意力:d×(n_h·d_h)(Q)+ 2 × d×(n_kv·d_h)(K、V)+ (n_h·d_h)×d(O)。GQA 的关键就在这儿:K/V 是按 n_kv 算的,不是按 n_h。
  • MLP:SwiGLU 三个矩阵,3 × d × m。
  • MoE:把 MLP 换成 n_experts × 3 × d × m_exp,再加一个 d × n_experts 的路由。
  • 词表:vocab × d,输入 embedding 和 lm_head 不绑定的就算两遍。

层数一乘,加词表,完事。边角料(LayerNorm、q_norm/k_norm)在十亿量级上根本看不见,误差都占不到一个百分点。

对账

模型我用的关键 config手算官方标称
Llama-2-7Bd=4096, L=32, MHA 32/32, inter=11008, vocab=320006.74B6.74B
Mistral-7Bd=4096, L=32, GQA kv=8, inter=14336, vocab=320007.24B7.25B
Llama-3-8Bd=4096, L=32, GQA kv=8, inter=14336, vocab=1282568.03B8.03B
Mixtral 8x7Bd=4096, L=32, kv=8, 8 专家 inter=14336, top-2, vocab=3200046.70B(激活 12.88B)46.7B(12.9B)
Qwen3-30B-A3Bd=2048, L=48, kv=4, head_dim=128, 128 专家 inter=768, top-8, vocab=15193630.53B(激活 3.35B)30.5B(3.3B)

几个当时卡住我的点

那个死活差 0.8B 的坑,是 K/V 造成的。 我最早一直把 K/V 按多头算满,Llama-2 上每层多算 25.2M,乘 32 层正好 0.8B。改成 kv_heads=8 之后 Mistral 和 Llama-3 一次性就咬上了。这不是"公式漏了一项",是我把结构想错了。

Mixtral 那行最有意思。 专家中间维度和 Mistral-7B 一模一样是 14336,只是从 1 个变 8 个,所以每层从 218M 直接蹦到 1451M。总量 46.7B,但激活只有 12.9B——因为每 token 只走 2 个专家。“总参数"和"激活参数"是两个完全不同的东西,拿总参数比显存、拿激活参数比速度,混着比就全错。

Qwen3-30B-A3B 这行得留个话。 今天网络出口抽风,抓不到 config 原文,上面那串数字是我凭记忆写的。我算出来 30.53B / 激活 3.35B,跟标称的 30.5B / 3.3B 咬得死死的——这反过来让我比较有信心 config 记对了,但严格说这行还没算"外部核实过”。等能联网了拿原文再跑一遍,不对我再回来改。

为什么坚持手算

下载一个 safetensors 看 tensor 列表当然更准,但那是别人喂你的。手算一遍你会真的知道:为什么 GQA 省的是显存不是算力、为什么 MoE 的显存便宜跑得也快、为什么词表在小模型上占比高得离谱(Llama-3 光词表就吃掉 1.05B,占整个模型的 13%)。

这玩意儿现在看着像洁癖,等哪天你要估一个还没发布的模型能不能塞进一张卡,手上有一张这样的表,比看十篇评测有用。