Transformer 解剖:从 Attention 到推理系统

一个写给工程师的 Transformer 专栏:既讲数学,也讲它在 GPU 上每一秒钟在做什么。

打开任何一篇关于大语言模型的论文,最底下的 backbone 大概率都是这张图:

flowchart LR
  X[输入 token 序列] --> EMB[Embedding + 位置编码]
  EMB --> B1[Transformer Block × N]
  B1 --> NORM[Final LayerNorm]
  NORM --> HEAD[LM Head / 分类头]
  HEAD --> Y[输出 logits]

GPT、Llama、DeepSeek-V3、Claude、Gemini——它们(至少是公开了结构的那些;Claude、Gemini 只公开了「基于 Transformer」,未公开具体结构)的差异藏在每个 Block 内部的细节里:注意力是不是分组共享(GQA / MQA)、FFN 是不是稀疏激活(MoE)、位置编码是 RoPE 还是 ALiBi、归一化放前面还是后面(Pre-LN / Post-LN)、激活函数是 GELU 还是 SwiGLU。但「Transformer Block × N」这个骨架本身,已经九年没变过了。

九年没变过的东西,值得彻底解剖一次。

这个专栏在解剖什么

这个专栏有三条主轴,对应你看到一段大模型代码时心里会冒出来的三类问题。

第一条:Attention 到底是怎么算的。 Q、K、V 三个矩阵从哪来,缩放点积里的 √d 为什么不能省,softmax 把分布拉宽还是压窄,Multi-Head 是把同一件事做 N 遍还是把 N 件事做一遍。位置编码为什么从 sinusoidal 一路演化到 RoPE,每一次演化解决了什么具体问题。这是数学层。

第二条:Transformer 在工程上长什么样。 Encoder / Decoder / Decoder-only 各自的归宿,BERT 与 GPT 的范式之战,Tokenizer 选 BPE 还是 SentencePiece,词表多大算够用,从零写一个 mini-GPT 训练它写古诗——读者会在这部分动手把整个 Transformer 跑起来。这是工程层。

第三条:推理系统是怎么榨干这台机器的。 这是本专栏最厚的部分,也是大多数 Transformer 教程不讲的部分。你的显卡在跑一次推理时,时间到底花在了哪里?为什么 Prefill 阶段是计算密集、Decode 阶段是访存密集?KV Cache 凭什么能让长序列生成省下几百倍的注意力计算、又凭什么会把显存打满?PagedAttention 解决了 KV Cache 的什么病?INT4 权重量化为什么能比 FP16 省下 75% 的权重显存,精度却通常只掉一点?投机解码是怎么用一个小模型替大模型「赌」出加速的?Flash Attention 为什么不是「更聪明的算法」而是「更懂内存层级的实现」?TP / PP / EP 三种并行各自适合多大的模型?

读完这三条主轴,你会建立一种很具体的能力:看到一段大模型代码、一段推理日志、一张 GPU 利用率曲线,能立刻在心里把它对应到 Transformer 的某个组件、某段计算、某个显存区域——而不是停留在「这是个黑盒」。

读完你能做到什么

  1. 手推注意力,再手写实现。 Self-Attention 的数学、多头为什么有效、位置编码的几种做法,然后从零写一遍(第2章 Self-Attention、第3章 多头、第4章 位置编码、第8章 从零手写 Attention)。
  2. 搭一个能跑的 mini-GPT。 Transformer Block 的组装、tokenizer 的作用与坑,以及一个可训练的小模型(第5章 Transformer Block、第9章 mini-GPT、第10章 Tokenizer)。
  3. 解释为什么是 Decoder-only。 三种架构(Encoder-only / Decoder-only / Encoder-Decoder)的分工与胜负手、预训练目标的选择(第6章 架构谱系、第7章 预训练)。
  4. 看懂显存账与推理优化。 KV Cache 为什么是推理的中心、量化省在哪、投机解码怎么换回时间、FlashAttention 与并行策略(第15章 KV Cache、第16章 量化、第17章 投机解码、第18章 FlashAttention 与并行)。
  5. 理解规模与稀疏。 Scaling Laws 说了什么又没说什么、MoE 的路由与代价、长上下文的几条技术路线(第11章 Scaling Laws、第12章 MoE、第13章 长上下文)。
  6. 看清推理的两个阶段与 Transformer 之后。 Prefill 与 Decode 为什么是两种性格完全不同的负载,以及 Transformer 之后有哪些替代路线(第14章 两阶段推理、第19章 Transformer 之后)。

这个专栏面向谁

前置知识:本专栏假设读者熟悉 Python、PyTorch(能看懂 nn.Linear / nn.Module / 反向传播),具备线性代数基础(矩阵乘法、向量内积、softmax),了解神经网络训练的基本概念(损失函数、优化器、梯度下降)。不要求读者读过 Attention 论文,也不要求懂 CUDA 或者并行计算——这些会在用到的章节随讲随用。

目录

第一部分 · 为什么是 Transformer

第二部分 · 注意力机制

第三部分 · 架构家族

第四部分 · 从零实现

第五部分 · 规模化

第六部分 · 推理系统

终章

与其他专栏的关联

引用与版本

本专栏涉及的论文与代码版本如下(代码一律以表中 tag / 提交为准,各提交日期见表,最晚一条为 2026 年 9 月 9 日):

来源 版本 / 提交
Attention Is All You Need arXiv:1706.03762v7(2023-08-02 修订版;NeurIPS 2017)
GPT-2 / GPT-3 / GPT-4 OpenAI 公开技术报告
Llama 1 / 2 / 3 Meta 官方论文(arXiv:2302.13971、2307.09288、2407.21783);参考代码为 meta-llama/llama 主分支(Llama 2 推理代码,现已标注弃用)
DeepSeek V2 / V3 DeepSeek 官方技术报告
Flash Attention 1/2/3 三代论文:FA1 为 Dao 等(arXiv:2205.14135),FA2 为 Dao 独著(arXiv:2307.08691),FA3 第一作者是 Jay Shah、Tri Dao 为末位作者(arXiv:2407.08608)
vLLM v0.8.5(2025-04-28,ba41cc9;与《vLLM 推理内核深度解析》专栏同一 tag)
Karpathy nanoGPT 3adf61e(2025-11-12;用于第 8、9 章实操)
HuggingFace transformers 4815a0a6a0(2026-09-09,__version__ 为 5.18.0.dev0)

每一条引用都会在出现处给出文献编号或仓库路径,读者可逐项核对。

关于模型超参那几张表:本专栏不逐行解析某个仓库,但正文里凡给出层数、头数、KV 头数、FFN 宽度、词表大小、是否共享 embedding 这类具体配置,都是对着 transformers 仓库里对应架构的 configuration_<arch>.py 默认值与 docstring 核过的,版本即上表的 4815a0a6a0。换一个版本这些默认值可能变——真要照抄配置,请以你手上那版的 configuration_*.py 为准。

版权声明

本专栏内容为 杨艺韬 版权所有,保留一切权利。未经书面许可,不得全文或大段转载、改编、翻译,或用于任何商业用途(含以本专栏内容训练模型、生成衍生课程或商品)。

欢迎分享本专栏的链接。引用少量内容用于评论、教学或研究时,请署名 杨艺韬 并附上原文链接。