开源模型架构剖析 本节摘要:你在第 04 节从零搭了 GPT-2 Small。2026 年前沿开源模型是同一家族,只是改了五六个具体的旋钮:RMSNorm 替 LayerNorm、SwiGLU 替 GELU、RoPE 替学习位置、GQA 或 MLA 替全 MHA、规模化时上 MoE。你已经会的数学覆盖了 95%。本节把 Llama 3、DeepSeek-V3、Mixtral、Qwen、Gemma 并排读,逐一指出每个架构相对 GPT-2 在哪一行发散、为什么、代价几何。读完你能拿一张新模型卡,在脑子里把它翻译回 GPT-2 基线。 学习目标 阅读完本节,你应当能够: 读 Llama 3、Mistral、Mixtral、Gemma 2、Qwen 2.
本节摘要:你在第 04 节从零搭了 GPT-2 Small。2026 年前沿开源模型是同一家族,只是改了五六个具体的旋钮:RMSNorm 替 LayerNorm、SwiGLU 替 GELU、RoPE 替学习位置、GQA 或 MLA 替全 MHA、规模化时上 MoE。你已经会的数学覆盖了 95%。本节把 Llama 3、DeepSeek-V3、Mixtral、Qwen、Gemma 并排读,逐一指出每个架构相对 GPT-2 在哪一行发散、为什么、代价几何。读完你能拿一张新模型卡,在脑子里把它翻译回 GPT-2 基线。
阅读完本节,你应当能够:
第 04 节你写了 350 行 numpy 拥有了一个 GPT-2 形状的模型。Llama 3 405B 有 200 页技术报告。你的直觉是它们是不同野兽。其实不是。200 页描述的是同一对象加了五六个有据可循的改动,外加上千个关于扩展的实现细节。骨架——嵌入、Transformer 块、注意力、MLP、归一化、头——没变。
本节是一份 diff。对每个主要开源模型家族,我们列出相对 GPT-2 到底改了什么、为什么、代价几何。读完你能读新模型卡并在脑里翻译回 GPT-2 基线。
GPT-2 用 LayerNorm:减均值、除标准差、再仿射。RMSNorm 去掉减均值(只用均方根归一化),保留可学缩放。去掉均值减法的小改让归一化快约 10~50%,代码更简单。每个 Llama、Mistral、Qwen、DeepSeek 都用 RMSNorm。
GPT-2 的学习位置嵌入是 1024 槽查表——上下文 1025 就出表尾,模型无法外推超训练长度。旋转位置编码(RoPE,Su 等 2021)在每个 Q 和 K 向量上按对旋转注入位置,旋转角度是位置的确定性函数,无可学参数、不会耗尽。配缩放技巧(NTK 感知插值、YaRN),8K 上下文训的模型推理时可拉伸到 128K,精度损失适中。每个 Llama、Mistral、Qwen、DeepSeek、Gemma 都用 RoPE(Gemma 2 用混合——多数层 RoPE,部分层局部滑动窗口注意力)。
q_rotated = rotate(q, angle(pos)) k_rotated = rotate(k, angle(pos)) score = q_rotated . k_rotated
GPT-2 的 MLP 是 x → gelu(xW1+b1) → (...)W2+b2。SwiGLU(Shazeer 2020)把激活换成门控积:SwiGLU(x) = (xW1) * sigmoid(xW1) * xV,两个并行投影而非一个,由 Swish 激活门控。经验上每参数困惑度更强。Llama 2 采用后众人跟进。MLP 隐藏大小通常调到总参数与原密集 MLP 匹配:GPT-2 用 ff_dim=4*hidden,SwiGLU 用 ff_dim=(2/3)*4*hidden=8/3*hidden。
GPT-2 用多头注意力(MHA):每个头有自己的 Q、K、V 投影。多查询注意力(MQA,Shazeer 2019) 所有头共享一组 K 和 V,KV 缓存按头数缩减,典型模型 12~32 倍,但难基准精度略降。分组查询注意力(GQA,Ainslie 等 2023) 是折中:G 组 Q 头共享一组 K、V。Llama 3 8B 用 GQA,32 Q 头 8 KV 头(G=8),KV 缓存比全 MHA 缩 4 倍。多头潜在注意力(MLA,DeepSeek 2024) 把 K、V 压进共享低秩潜在,每头再上投影回来,进一步减 KV 缓存同时保每头表达力,DeepSeek-V2、V3 靠它做长上下文。
| 方案 | KV 头数 | KV 缓存 | 精度 |
|---|---|---|---|
| MHA | num_heads | 全 | 最好 |
| GQA | num_groups(G<num_heads) | 缩 num_heads/G | 近 MHA |
| MQA | 1 | 缩 num_heads | 小损 |
| MLA | 潜在,逐头解压 | 比 MQA 更小 | 近 MHA |
约 13B 以上模型,GQA 或 MLA 实质必备——全 MHA 规模化是 KV 缓存灾难。
密集 MLP 每 token 激活所有参数。MoE MLP 每块有 K 个专家加路由器,每 token 选 top-k 专家(典型 top-2),只有那些专家的权重为该 token 做前向。吸引力:64 个各 7B 的专家(总参巨量)但每 token 只跑 2 个(每 token 计算匹配密集 7B)。Mixtral 8x7B 总 47B 每 token 激活 13B;DeepSeek-V3 总 671B 每 token 激活 37B。优点:同算力更多参数更好容量。缺点:专家内存仍要存在某处(服务需比密集等价更多 VRAM)、路由器负载均衡难、对齐时微调路由器是独立研究领域。
原始 Transformer 在每个子层后做层归一化。GPT-2 以来每个开源模型都放在之前。Pre-norm 深度训练严格更易,无争议。
这张表让一切具体化。
| 模型 | 年 | 总参 | 激活参 | 归一化 | 激活 | 位置 | 注意力 | MoE | 上下文 |
|---|---|---|---|---|---|---|---|---|---|
| GPT-2 Small | 2019 | 124M | 124M | LayerNorm | GELU | 学习 | MHA(12 头) | 否 | 1k |
| Llama 3 8B | 2024 | 8B | 8B | RMSNorm | SwiGLU | RoPE | GQA(32/8) | 否 | 128k |
| Llama 3 70B | 2024 | 70B | 70B | RMSNorm | SwiGLU | RoPE | GQA(64/8) | 否 | 128k |
| Mistral 7B | 2023 | 7.2B | 7.2B | RMSNorm | SwiGLU | RoPE | GQA | 否 | 32k |
| Mixtral 8x7B | 2023 | 47B | 13B | RMSNorm | SwiGLU | RoPE | GQA | 是(8 专家,top-2) | 32k |
| Gemma 2 9B | 2024 | 9B | 9B | RMSNorm(前+后) | GeGLU | RoPE+滑窗 | GQA | 否 | 8k |
| Qwen 2.5 72B | 2024 | 72B | 72B | RMSNorm | SwiGLU | RoPE(YaRN) | GQA(64/8) | 否 | 128k |
| DeepSeek V3 | 2024 | 671B | 37B | RMSNorm | SwiGLU | RoPE | MLA | 是(256 专家,top-8) | 128k |
扫各列:RMSNorm 普遍、SwiGLU 或 GeGLU 普遍、RoPE 普遍、7B 以上 GQA 普遍(除非被 MLA 替)、MoE 是顶端的差异化因素。
Llama 3 8B 配置:
{ "hidden_size": 4096, "intermediate_size": 14336, "num_hidden_layers": 32, "num_attention_heads": 32, "num_key_value_heads": 8, "max_position_embeddings": 131072, "rope_theta": 500000.0, "rms_norm_eps": 1e-5, "vocab_size": 128256 }
每字段对应你已实现过的:hidden_size(嵌入维)、intermediate_size(MLP 隐藏,3.5×hidden 因 SwiGLU 数学)、num_hidden_layers(堆深)、num_attention_heads(Q 头)、num_key_value_heads(KV 头,GQA)、max_position_embeddings(训练上下文长)、rope_theta(RoPE 基频,Meta 从默认 1 万调到 50 万做长上下文外推)、vocab_size(token)。
不重写整个模型,而是写个计算器:给 config 算参数量、KV 缓存、激活内存。这验证你理解了架构各组件。
def count_params(cfg): h = cfg["hidden_size"]; V = cfg["vocab_size"]; L = cfg["num_hidden_layers"] emb = V * h # 嵌入(权重绑定也共用输出头) per_block = 0 # 注意力:Q/K/V/O 投影 nq, nkv = cfg["num_attention_heads"], cfg["num_key_value_heads"] d = h // nq per_block += h * (nq * d) * 4 # 简化:Q/K/V/O 各 h×h # SwiGLU MLP:gate、up、down 三个矩阵 f = cfg["intermediate_size"] per_block += h * f * 3 # RMSNorm ×2 per_block += 2 * h return emb + L * per_block def kv_cache_gb(cfg, seq_len, bytes_per=2): return (2 * cfg["num_hidden_layers"] * cfg["num_key_value_heads"] * (cfg["hidden_size"]//cfg["num_attention_heads"]) * seq_len * bytes_per) / 1e9
跑 Llama 3 8B:count_params 应约 8B;kv_cache_gb 在 128K 约 8GB。跑 DeepSeek-V3:总 671B、激活 37B(需按 MoE 路由算激活),MLA 的 KV 缓存比 GQA 小约 4 倍。
所有这些模型都在 HuggingFace transformers 里一行加载:AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")。差异在 config.json 的字段,RMSNorm/SwiGLU/RoPE/GQA/MLA 都是模型类里的模块选择。vLLM、SGLang、TensorRT-LLM 都原生支持这些架构,你只需给模型名。真正的架构理解体现在「为部署选哪个模型」:内存紧选 GQA/MLA 的;长上下文选 MLA 的;要容量但控算力选 MoE 的。
本节产出 outputs/prompt-model-config-reader.md——一个提示,接收任意开源模型的 config.json,逐字段解释、算参数量与 KV 缓存、标注它相对 GPT-2 改了哪些旋钮、给出部署建议(目标硬件、量化策略、并发能力)。
(Easy) 读 Mixtral 8x7B 的 config,算总参数(8 专家 × 每 MLP 大小)与每 token 激活参数(top-2 路由),验证 47B/13B。
(Medium) 对比 Llama 3 8B(密集)与 Mixtral 8x7B(MoE)在同等推理算力下的 KV 缓存与权重内存,量化 MoE 的「同算力多参数」代价是更多 VRAM。
(Medium) 用计算器对比 GQA(8 KV 头)与假设的 MHA(32 KV 头)在 Llama 3 8B 128K 上下文上的 KV 缓存,GQA 应约 4 倍小。
(Hard) 给 DeepSeek-V3 写参数计算器:MLA 的低秩潜在压缩、256 专家路由、共享嵌入与输出头。验证 671B 总参、37B 激活。
(Hard) 构建部署选型器:给定约束(显存上限、目标延迟、最小上下文长、是否需 MoE),从 Llama 3 / Mistral / Mixtral / Qwen / DeepSeek 家族里选最合适的,输出量化与并行建议。
hidden_size、intermediate_size(3.5× 因 SwiGLU)、num_key_value_heads(GQA)、rope_theta(长上下文)每字段都对应你实现过的。下一节,投机解码与 EAGLE-3:小模型起草、大模型校验,EAGLE-3 把接受率推到每次校验约 4.5 个 token,4~5 倍加速。