
文章目录
-
- [1. 先把问题讲清楚:为什么从 LLaMA 学架构](#1. 先把问题讲清楚:为什么从 LLaMA 学架构)
- [2. LLaMA-like 模型的最小结构](#2. LLaMA-like 模型的最小结构)
- [3. RMSNorm:为什么不用普通 LayerNorm 也能稳定](#3. RMSNorm:为什么不用普通 LayerNorm 也能稳定)
- [4. RoPE:把位置信息放进注意力](#4. RoPE:把位置信息放进注意力)
- [5. SwiGLU:FFN 的门控结构](#5. SwiGLU:FFN 的门控结构)
- [6. GQA:为什么长上下文推理要省 KV Cache](#6. GQA:为什么长上下文推理要省 KV Cache)
- [7. 版本演进速览:从 Llama 1 到 Llama 3.1](#7. 版本演进速览:从 Llama 1 到 Llama 3.1)
- [8. 读 config.json:比背模型名更重要](#8. 读 config.json:比背模型名更重要)
- [9. Base、Instruct、Chat 不要混用](#9. Base、Instruct、Chat 不要混用)
- [10. LLaMA 生态为什么重要](#10. LLaMA 生态为什么重要)
- [11. 常见误区](#11. 常见误区)
- [12. 总结](#12. 总结)
- 大模型视角
- 下一篇
摘要:LLaMA/Llama 系列值得学习,不是因为它只是 Meta 的一个模型家族,而是因为它把现代开源大模型的典型骨架集中呈现出来:Decoder-Only Transformer、RMSNorm、RoPE、SwiGLU、GQA、长上下文、指令微调和社区微调生态。本文不追逐榜单,也不猜测未公开细节,而是从开发者视角讲清楚:LLaMA 风格模型的 block 怎么组成,为什么这些组件会成为主流,如何读
config.json,以及在项目里如何选择 base/chat、上下文长度、量化和 LoRA 微调方案。
- 前置知识:专栏一 Transformer、多头注意力、 RoPE、 KV Cache
- 阅读时间:50-65 分钟
- 代码环境:Python 3.10+,示例只依赖标准库
- 读完目标:能解释 LLaMA-like 模型的关键组件,能读懂常见模型配置字段,能判断项目选型时应该测哪些指标
1. 先把问题讲清楚:为什么从 LLaMA 学架构
你以后会看到很多开源模型:LLaMA、Qwen、DeepSeek、Mistral、Gemma。名字不同,但很多模型的主干结构很像:都是 Decoder-Only Transformer,根据前文预测下一个 token。
学习 LLaMA 的价值在于,它是现代开源大模型骨架的典型样本。你看懂它之后,再看其他模型,就不是从零理解,而是在问:
text
这个模型的 tokenizer 有什么差异?
注意力是 MHA、GQA、MLA,还是滑动窗口?
FFN 是 SwiGLU 还是 MoE?
RoPE 和上下文长度怎么配置?
后训练模板和工具调用格式是什么?
许可证和部署生态是否适合项目?
这比记住"哪个模型排名更高"更有价值。
2. LLaMA-like 模型的最小结构
一个 Decoder-Only 大模型可以简化为:
text
token ids -> token embedding -> N 个 Transformer block -> lm_head -> next token logits
每个 Transformer block 通常包含两大部分:
text
Attention:从上下文里读信息。
FFN:对每个 token 的表示做非线性加工。
LLaMA 风格 block 常见写法是 Pre-Norm 残差结构:
x = x + Attention ( Norm ( x ) ) x = x + \text{Attention}(\text{Norm}(x)) x=x+Attention(Norm(x))
x = x + FFN ( Norm ( x ) ) x = x + \text{FFN}(\text{Norm}(x)) x=x+FFN(Norm(x))
先归一化,再进入子层,最后残差加回原输入。这样做的直觉是:残差通道让信息和梯度更容易穿过很多层,Norm 让每层输入的数值范围更稳定。
3. RMSNorm:为什么不用普通 LayerNorm 也能稳定
LLaMA 风格模型常用 RMSNorm。LayerNorm 会减均值再除标准差;RMSNorm 更简单,只用均方根缩放:
RMSNorm ( x ) = x 1 d ∑ i = 1 d x i 2 + ϵ ⊙ g \text{RMSNorm}(x)=\frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2+\epsilon}} \odot g RMSNorm(x)=d1∑i=1dxi2+ϵ x⊙g
逐项解释:
- x x x 是某个 token 的隐藏向量;
- d d d 是隐藏维度;
- 分母是向量的均方根;
- g g g 是可学习缩放参数;
- ϵ \epsilon ϵ 防止除零。
大白话:RMSNorm 不改变方向太多,主要把向量整体尺度拉到稳定范围。它计算更简洁,也适合大规模 Transformer 训练。
4. RoPE:把位置信息放进注意力
语言模型必须知道 token 顺序。没有位置信息,"我喜欢你"和"你喜欢我"就难区分。
RoPE(Rotary Position Embedding)不是把位置向量简单加到 embedding 上,而是在计算注意力前,对 Query 和 Key 做位置相关旋转。注意力分数原本是:
score i j = q i k j T d \text{score}_{ij}=\frac{q_i k_j^T}{\sqrt{d}} scoreij=d qikjT
加入 RoPE 后, q i q_i qi 和 k j k_j kj 会根据位置旋转,再做点积。这样模型在判断 token 之间关系时,会自然带上相对位置信息。
工程上,RoPE 关系到长上下文扩展。很多长上下文技巧都在处理:模型训练时见过的长度有限,推理时想用更长上下文,位置编码和注意力质量如何保持稳定。
5. SwiGLU:FFN 的门控结构
Transformer block 里,Attention 负责读上下文,FFN 负责加工当前 token 表示。LLaMA 风格模型常用 SwiGLU,而不是最早 Transformer 的 ReLU FFN。
普通 FFN 可以写成:
FFN ( x ) = W 2 σ ( W 1 x ) \text{FFN}(x)=W_2\sigma(W_1x) FFN(x)=W2σ(W1x)
SwiGLU 可以简化理解为:
SwiGLU ( x ) = W 2 ( SiLU ( W 1 x ) ⊙ W 3 x ) \text{SwiGLU}(x)=W_2(\text{SiLU}(W_1x) \odot W_3x) SwiGLU(x)=W2(SiLU(W1x)⊙W3x)
这里 ⊙ \odot ⊙ 是逐元素相乘。 W 3 x W_3x W3x 像一扇门,决定哪些维度的信息被放大或抑制。它提升表达能力,但也会影响 FFN 参数量和计算量。
6. GQA:为什么长上下文推理要省 KV Cache
生成文本时,模型每生成一个新 token,都要继续关注前面已经生成的 token。为了避免重复计算,会缓存历史 token 的 Key 和 Value,这就是 KV Cache。
标准多头注意力中,每个 Query head 都有对应的 Key/Value head。GQA(Grouped Query Attention)让多个 Query head 共享更少的 Key/Value head,从而降低 KV Cache 显存。
粗略估算:
python
# Python 3.10+,无额外依赖
def kv_cache_gb(layers, seq_len, kv_heads, head_dim, bytes_per_value=2):
# K 和 V 各一份,所以乘 2
total = layers * seq_len * kv_heads * head_dim * 2 * bytes_per_value
return total / 1024 ** 3
layers = 32
seq_len = 32768
head_dim = 128
for kv_heads in [32, 8, 4]:
print(kv_heads, f"{kv_cache_gb(layers, seq_len, kv_heads, head_dim):.2f} GB")
这个实验能看出:KV head 数越少,长上下文推理显存越低。GQA 不是让模型本身"更聪明",而是让推理更经济。
7. 版本演进速览:从 Llama 1 到 Llama 3.1
前几节讲的是这套架构里比较稳定的部分,但 LLaMA 系列本身的演进也值得看一眼,因为它正好演示了一个模型家族如何在不推翻主干的前提下持续迭代:主干始终是 Decoder-Only Transformer 加 RMSNorm、RoPE、SwiGLU,变的主要是参数规模、注意力配置、词表、上下文长度和许可证。
| 版本 | 参数规模 | 注意力 | 词表 | 标称上下文 | 许可证 |
|---|---|---|---|---|---|
| Llama 1 | 7B / 13B / 33B / 65B | MHA | 32k | 2048 | 研究用途受限,不允许商用 |
| Llama 2 | 7B / 13B / 70B | 70B 引入 GQA | 32k | 4096 | 定制社区许可,多数商用场景可用 |
| Llama 3 | 8B / 70B | 各尺寸采用 GQA | 128k | 8k | 社区许可,开放商用 |
| Llama 3.1 | 8B / 70B / 405B | GQA | 128k | 128k | 社区许可,开放商用 |
从这张表能读出几条演进主线。Llama 2 相对 Llama 1 的关键变化之一是注意力:在 70B 尺寸上引入 GQA,用来压低推理时的 KV Cache,这正是第 6 节讲的问题。Llama 3 相对 Llama 2 把词表从 32k 扩到 128k,多语言覆盖和编码压缩效率更好,代价是 embedding 和输出层参数变大。Llama 3.1 再把上下文从 8k 扩到 128k,配套地,它的 config.json 里可以看到 rope_theta: 500000.0 这样的字段,用更大的基数让长距离位置编码保持稳定。许可证则从 Llama 1 的研究受限,逐步走向可商用的社区许可,这也是 LLaMA 生态能繁荣的重要前提。
需要强调:上表字段为公开资料的整理,细节(尤其是每个尺寸的确切配置和许可证条款)以 Meta 官方发布为准。对开发者来说,看懂演进方向比背每个数字更重要:规模、注意力、词表、上下文和许可证,正是选型时最该对比的五个维度。
8. 读 config.json:比背模型名更重要
实际项目里,你经常面对的是一个模型目录。先看 config.json:
python
# Python 3.10+,无额外依赖
# 注意:下面字段为教学混合示例,非某一版本真实配置
config = {
"hidden_size": 4096,
"num_hidden_layers": 32,
"num_attention_heads": 32,
"num_key_value_heads": 8,
"intermediate_size": 11008,
"max_position_embeddings": 8192,
"rope_theta": 500000.0,
"vocab_size": 128000,
}
for key, value in config.items():
print(f"{key}: {value}")
重点字段:
| 字段 | 你应该怎么看 |
|---|---|
hidden_size |
向量维度,影响参数量和计算 |
num_hidden_layers |
层数,影响深度、延迟和显存 |
num_attention_heads |
Query head 数 |
num_key_value_heads |
KV head 数,小于 attention heads 通常说明使用 GQA |
intermediate_size |
FFN 中间维度,影响 FFN 参数和计算 |
max_position_embeddings |
标称上下文长度,不等于所有场景都稳定可用 |
rope_theta |
RoPE 配置,长上下文兼容时要关注 |
vocab_size |
词表大小,影响 embedding 和输出层 |
读配置能帮你判断:模型是否适合长上下文、推理显存压力多大、推理框架是否支持。
9. Base、Instruct、Chat 不要混用
LLaMA 类模型通常有 base 和 instruct/chat 版本。
| 版本 | 适合场景 | 风险 |
|---|---|---|
| Base | 继续预训练、研究、SFT 起点 | 直接对话不稳定 |
| Instruct/Chat | 直接问答、助手、工具调用 | 继续训练时要注意模板和对齐 |
| 量化版 | 低成本推理 | 质量要重新评估 |
| LoRA adapter | 任务适配 | 必须匹配同一 base |
不要用 chat 模型做所有训练,也不要拿 base 模型直接当助手上线。版本选择要和任务匹配。
10. LLaMA 生态为什么重要
LLaMA 系列的另一个价值是生态:推理框架、量化工具、LoRA/QLoRA 微调、评估脚本、部署方案都相对成熟。对开发者来说,这往往比论文指标更实际。
项目选型要看:
text
1. 许可证是否允许当前用途;
2. 推理框架是否支持该模型结构;
3. tokenizer 和 chat template 是否稳定;
4. 目标上下文长度下延迟和显存是否可接受;
5. 中文、代码、工具调用是否符合业务;
6. 是否有自己的评估集,而不是只看榜单。
11. 常见误区
误区一:开源权重等于所有训练细节公开。
权重开放不代表数据、过滤规则、后训练流程都公开。写文章和做项目都要区分公开事实和推测。
误区二:上下文越长越好。
长上下文会增加 prefill 延迟和 KV Cache,且模型不一定稳定利用远距离信息。
误区三:LLaMA-like 模型都能用同一套模板。
chat template、special tokens、RoPE 配置、tokenizer 都可能不同。部署时必须使用对应配置。
误区四:base 和 chat 可以随便切换。
base 更适合训练和研究,chat 更适合直接使用。混用会导致评估混乱。
12. 总结
LLaMA 系列是理解现代开源大模型的典型入口。它的核心不是某个版本名称,而是一组架构和工程取舍:Decoder-Only 主干、RMSNorm、RoPE、SwiGLU、GQA、长上下文和成熟微调部署生态。
学会 LLaMA-like 模型,最重要的是能读懂 block 结构和配置文件,知道哪些字段影响参数量、推理显存、上下文长度和微调方式。项目选型时不要只看榜单,要结合许可证、部署框架、任务评估、上下文成本和业务边界。
大模型视角
从大模型技术路线看,LLaMA 让开源生态形成了一个共同语言。后续很多模型不是完全推翻它,而是在 tokenizer、注意力、FFN、MoE、数据、后训练、多模态和工具调用上做差异化。理解这条主干,你就能更快理解 Qwen、DeepSeek、Mistral 等模型路线。
下一篇
下一篇会讲 Qwen 系列。和 LLaMA 相比,Qwen 更适合作为中文、多语言、代码、工具调用、多模态和工程生态路线的案例来学习。