开源模型架构剖析


文档摘要

开源模型架构剖析 本节摘要:你在第 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 基线。

学习目标

阅读完本节,你应当能够:

  1. 读 Llama 3、Mistral、Mixtral、Gemma 2、Qwen 2.5、DeepSeek-V3 的 config.json,解释每个字段。
  2. 说出每个模型相对 GPT-2 Small 的具体架构改动,并从第一性原理论证。
  3. 仅凭 config 算任意开源模型的参数量、KV 缓存大小、激活内存。
  4. 给定延迟、内存、能力约束,为部署目标选对开源模型。

一、问题与直觉

第 04 节你写了 350 行 numpy 拥有了一个 GPT-2 形状的模型。Llama 3 405B 有 200 页技术报告。你的直觉是它们是不同野兽。其实不是。200 页描述的是同一对象加了五六个有据可循的改动,外加上千个关于扩展的实现细节。骨架——嵌入、Transformer 块、注意力、MLP、归一化、头——没变。

本节是一份 diff。对每个主要开源模型家族,我们列出相对 GPT-2 到底改了什么、为什么、代价几何。读完你能读新模型卡并在脑里翻译回 GPT-2 基线。

旋钮一:RMSNorm 替 LayerNorm

GPT-2 用 LayerNorm:减均值、除标准差、再仿射。RMSNorm 去掉减均值(只用均方根归一化),保留可学缩放。去掉均值减法的小改让归一化快约 10~50%,代码更简单。每个 Llama、Mistral、Qwen、DeepSeek 都用 RMSNorm。

旋钮二:RoPE

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

旋钮三:SwiGLU

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 缓存灾难。

旋钮五:混合专家(MoE)

密集 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)、路由器负载均衡难、对齐时微调路由器是独立研究领域。

旋钮六:Pre-norm 不变

原始 Transformer 在每个子层后做层归一化。GPT-2 以来每个开源模型都放在之前。Pre-norm 深度训练严格更易,无争议。

模型逐一 diff

这张表让一切具体化。

模型 总参 激活参 归一化 激活 位置 注意力 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 是顶端的差异化因素。

读 config.json

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)。

二、从零实现:参数与 KV 缓存计算器

不重写整个模型,而是写个计算器:给 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 改了哪些旋钮、给出部署建议(目标硬件、量化策略、并发能力)。

五、练习

  1. (Easy) 读 Mixtral 8x7B 的 config,算总参数(8 专家 × 每 MLP 大小)与每 token 激活参数(top-2 路由),验证 47B/13B。

  2. (Medium) 对比 Llama 3 8B(密集)与 Mixtral 8x7B(MoE)在同等推理算力下的 KV 缓存与权重内存,量化 MoE 的「同算力多参数」代价是更多 VRAM。

  3. (Medium) 用计算器对比 GQA(8 KV 头)与假设的 MHA(32 KV 头)在 Llama 3 8B 128K 上下文上的 KV 缓存,GQA 应约 4 倍小。

  4. (Hard) 给 DeepSeek-V3 写参数计算器:MLA 的低秩潜在压缩、256 专家路由、共享嵌入与输出头。验证 671B 总参、37B 激活。

  5. (Hard) 构建部署选型器:给定约束(显存上限、目标延迟、最小上下文长、是否需 MoE),从 Llama 3 / Mistral / Mixtral / Qwen / DeepSeek 家族里选最合适的,输出量化与并行建议。

本节要点回顾

  1. 前沿开源模型 = GPT-2 + 五六个旋钮:骨架(嵌入、Transformer 块、注意力、MLP、归一化、头)完全没变。
  2. 旋钮一 RMSNorm 替 LayerNorm:去均值减法,快 10~50%,代码更简,普遍采用。
  3. 旋钮二 RoPE 替学习位置:旋转注入位置,无表不会尽,配 YaRN 可从 8K 拉伸到 128K。
  4. 旋钮三 SwiGLU 替 GELU:门控积,两个并行投影,每参数困惑度更强,ff_dim 调到 8/3×hidden 补参数。
  5. 旋钮四 GQA/MLA 替全 MHA:13B+ 实质必备,MQA 太损、GQA 折中、MLA 低秩压缩最小且近 MHA 精度。
  6. 旋钮五 MoE 控算力扩参数:每 token 只激活 top-k 专家,671B 总参 37B 激活,代价是更多 VRAM 与路由器难调。
  7. 旋钮六 Pre-norm 不变:GPT-2 以来所有开源模型都在子层前归一化,深度训练更易,无争议。
  8. 读 config 即读模型:hidden_sizeintermediate_size(3.5× 因 SwiGLU)、num_key_value_heads(GQA)、rope_theta(长上下文)每字段都对应你实现过的。
  9. MoE 是顶端差异化因素:Mixtral 47B/13B、DeepSeek-V3 671B/37B,同算力换更多参数与容量。
  10. 选模型看约束:内存紧选 GQA/MLA,长上下文选 MLA,要容量控算力选 MoE。

下一节,投机解码与 EAGLE-3:小模型起草、大模型校验,EAGLE-3 把接受率推到每次校验约 4.5 个 token,4~5 倍加速。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U