前几篇一直在掰扯公式怎么来的(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-7B | d=4096, L=32, MHA 32/32, inter=11008, vocab=32000 | 6.74B | 6.74B |
| Mistral-7B | d=4096, L=32, GQA kv=8, inter=14336, vocab=32000 | 7.24B | 7.25B |
| Llama-3-8B | d=4096, L=32, GQA kv=8, inter=14336, vocab=128256 | 8.03B | 8.03B |
| Mixtral 8x7B | d=4096, L=32, kv=8, 8 专家 inter=14336, top-2, vocab=32000 | 46.70B(激活 12.88B) | 46.7B(12.9B) |
| Qwen3-30B-A3B | d=2048, L=48, kv=4, head_dim=128, 128 专家 inter=768, top-8, vocab=151936 | 30.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%)。
这玩意儿现在看着像洁癖,等哪天你要估一个还没发布的模型能不能塞进一张卡,手上有一张这样的表,比看十篇评测有用。

