Arganzheng's Blog

stay hungry, stay foolish

Transformer 与 LLM(08):MoE 的路由、激活参数量与通信形态

Mixture of Experts: Routing, Active Parameters and Communication Patterns

到这里为止讨论的都是 dense 模型:每个 token 经过每一层时,会用到这一层的全部权重。参数量、每 token 算量、每步 decode 的权重读取量,三者之间只差一个常数——参数量 \(N\) 对应每 token \(2N\) FLOPs,对应每步读 \(N \times \text{bytes/elem}\) 字节。 混合专家(Mixture of Experts,MoE)把这三个数拆开了。DeepSeek-V3 的技术报告里写着”总参数 671B,每 token 激活 37B”,从算量看它比 Llama-3-70B 便宜一半,但实际部署时它需要几十张 GPU 组成的专家并行集群,而 70B 一台 8 卡机器就能跑得很好。本篇要回答的核心问题是: ...

Transformer 与 LLM(07):位置编码与长上下文

Positional Encoding and Long Context: RoPE Wavelengths, Extrapolation and Cost

第一篇的换序实验说明 attention 是集合运算——把输入 token 打乱,输出只是跟着换位置——所以位置必须显式喂给模型;GPT-2 的做法是查一张 1024 行的位置表,代价是第 1025 个位置没有对应的向量,上下文的硬上限就是这么来的。Llama 换成了 RoPE。前几篇的账里有一个变量一直被当作常数处理:上下文长度 \(s\)。第六篇算 KV cache 时取 \(s = 131072\),第十篇算 prefill 时取 \(s = 8192\),但都没有回答两个问题:模型凭什么知道一个 token 在第几个位置?以及,一个模型能处理的上下文长度到底由什么决定? 这两个问题在结构上由同一个部件回答——位置编码。它在参数量表里几乎不占位置(RoPE ...

Transformer 与 LLM(06):Attention 变体与 KV cache

Attention Variants and the KV Cache: Deriving MHA, GQA, MQA and MLA

第二篇讲了 KV cache 为什么有:causal 结构下旧 token 的 K、V 不随新 token 改变,算一次存下来,decode 每步只算一个 token。这一篇讲它为什么要省:Llama-3-8B 每个 token 的 KV 是 128 KiB,一个 8K 请求 1 GiB,一张 80 GB 的卡除掉权重只能同时服务几十个这样的请求——而如果它还用 GPT-2 那种每个 Q 头各有一组 K/V 的 MHA,会是 512 KiB。attention 是 Transformer 里唯一成本随上下文增长的部分(第十篇把它拆成”权重项”与”上下文项”算成时间),也是过去几年结构改动最集中的地方。 MHA、MQA、GQA、MLA 四种结构,做的是同一件事的不同...

Transformer 与 LLM(05):Transformer 解剖与参数量

Transformer Anatomy and Parameter Count: From config.json to 8.03B

第三篇末尾那张对照表说:Llama 相对 GPT-2 只改了五处——LayerNorm 换成 RMSNorm、位置表换成 RoPE、GELU 两矩阵 FFN 换成 SwiGLU 三矩阵、K/V 投影变窄(GQA)、去掉所有 bias。第二段从这里开始:先讲每一处为什么改(各解决什么问题、代价是什么),再把改完的结构拆到能数出每一个参数的粒度。这一篇之后你会被问到这样的问题:这个模型有多少参数?一张 80 GB 的卡放得下吗?某个 GEMM 的 \(m, k, n\) 是多少?为什么 Llama 的 FFN 中间维度是 14336 这样一个看起来不整的数?这些问题的答案全部藏在一个几十行的 config.json 里,不需要下载权重,也不需要运行代码。 本篇要建立的...

Transformer 与 LLM(04):手搓 GPT(下)——nanoGPT train.py 与训一个会续写的模型

Building GPT by Hand, Part 2: train.py Line by Line, Then Train One on Shakespeare

上一篇的 model.py 定义了一个 GPT,但它的权重是随机数,输出是乱码。让它变成一个”会写东西”的模型,还差三样:数据(一段文本怎么变成模型能吃的整数数组)、训练循环(第二篇那一步”取 batch → 前向 → loss → 反向 → 更新”怎么写成能跑几十万步、能断点续训、能多卡的代码)、一次实际的训练(看着 loss 从 4.17 掉到 1.66、输出从乱码变成像莎士比亚台词的东西)。nanoGPT 的 train.py(336 行)加 prepare.py(68 行)就是这三样。 这一篇把 train.py 按块过完,然后在一台 MacBook 上用莎士比亚全集训 2000 步(7 分钟),再把层数改成 2 和 8 各训一次——这是你第一次亲手改模型...

Transformer 与 LLM(03):手搓 GPT(上)——nanoGPT model.py 逐行解析

Building GPT by Hand, Part 1: Every Line of nanoGPT's model.py

前两篇画了 Transformer 的静态结构和 token 流过它的两条动态线。图看懂了,能不能写出来?这一篇的答案是 Andrej Karpathy 的 nanoGPT:model.py 一个文件、330 行、6 个类,完整定义了 GPT-2,能加载 OpenAI 的原版权重并给出和 HuggingFace 一样的输出。它是目前最好的”从图到代码”的范本——没有多余的抽象,每一行都对应前两篇的某个方框或某一步。 本篇把这 330 行逐行过一遍:每段代码解释三件事——它对应结构图的哪个部分(第一篇)、在训练 / 推理的哪一步执行(第二篇)、以及那些”为什么这么写”(为什么 Q、K、V 合成一个矩阵、为什么 mask 叫 bias、为什么 c_proj 的初始化要...

Transformer 与 LLM(02):一个 token 的旅程——训练侧与推理侧

The Dynamic View: What Happens to a Token During Training and During Inference

上一篇把 Transformer 的每个方框打开看了一遍,但那是一张静止的图。同一台机器在两种场合下的运转方式很不一样:训练时一句话的几千个 token 一起进去、几千个 loss 一起出来、梯度沿原路返回、几十亿参数各挪一小步;推理时先把用户的问题一次算完,然后一个字一个字往外吐,每吐一个字只算一个 token。不搞清这两条动态线,就解释不了几件天天碰到的事:为什么训练一次前向能同时算 \(T\) 个位置的预测、为什么推理”第一个字慢、后面快”、KV cache 到底缓存了什么、为什么训练长上下文时”激活值”比参数本身还占显存。 这一篇用一个 2 层、8 维、16 个词的玩具 GPT 把两条线走通,每一步打印形状和数字;再用 512 个 token 的模型实测 ...

Transformer 与 LLM(01):Transformer 长什么样——从一句话到下一个 token

The Static View: Every Box in a Decoder-only Transformer, Computed by Hand

2017 年之后,几乎所有你听说过的大模型——GPT、Llama、Qwen、DeepSeek、Claude、Gemini——用的都是同一种结构:Transformer。它取代了在它之前统治序列建模十年的循环网络(L3 第六篇讲了为什么),之后八年结构上只做了修补,没有被替换。所以”看懂一个大模型的内部”这件事,其实只需要看懂一种结构。 这一篇讲静态线:把一个 decoder-only Transformer 里的每一个方框打开,说清它是什么、为什么要有它、里面的数怎么算。全篇用一个 4 维、3 个 token 的玩具例子把每一步手算出来,再用 GPT-2 small(1.24 亿参数,2019 年)的真实数字对照——真实模型只是把 4 换成 768、把 3 换成 ...

Transformer 与 LLM:结构、实现与算量(总纲)

Transformers and LLMs: Architecture, Implementation and Arithmetic

内容简介 《Transformer 与 LLM:结构、实现与算量》是一组共十三篇的系列文章,讲今天所有大语言模型共用的那一种结构。它分三段:先讲清结构与实现——Transformer 里每个方框是什么、为什么必须在那里、一个 token 在训练和推理时怎么流过它们,然后用 nanoGPT 的 300 行代码把它写出来、训出来;再讲结构的演进——从 GPT-2 到 Llama、DeepSeek,归一化、位置编码、FFN、attention 的 K/V、专家层、训练目标各改成了什么样、为什么;最后算账——这样的结构每一步算多少、读多少、存多少,数值格式、量化、投机解码、LoRA、多模态各怎么改变这些数字。同一张成本表的训练侧——tokenizer 与词表、算力怎么分给...

深度学习基础(07):系列总结与通关自测

Deep Learning Foundations: Series Recap and Final Self-Test

六篇正文回答了一个问题:一个几十层甚至上百层的网络,为什么能训、什么时候不能训、训不动的时候该看哪个数字。前四篇是训练动力学——第一篇建立梯度,第二篇讲梯度为什么会坏、怎么修,第三篇讲怎么用梯度更新参数,第四篇讲什么时候该停;后两篇是结构史——卷积这条线留下了残差、归一化与”堆同样的块”,循环这条线留下了 attention。六篇合起来,是 Transformer 每一个部件的来历,也是读任何一份预训练技术报告时”初始化、归一化、优化器、稳定性”那几段的公式出处。 本文不讲新内容,做三件事:把六篇压成一张表与六段回顾,把贯穿六篇的几条线拎出来,然后给一套三段式的通关自测——判断与计算、跨篇综合、面试题。各篇末尾的自测检验的是”这一篇读懂了没有”,这里检验的是”六篇...

×