当GPT-3在2020年问世时,其1750亿参数的规模震惊了整个AI界。三年后,LLaMA-70B用更少的参数达到了更好的效果。到了2024年,DeepSeek-V3以6710亿总参数但仅激活370亿参数的MoE架构重新定义了效率边界。这些数字背后隐藏着一套精确的数学逻辑——参数量如何决定计算量,计算量如何影响训练成本,以及如何在有限的算力预算下设计最优模型。
这不是一篇关于"模型越大越好"的陈词滥调,而是一次从Transformer底层架构出发,推导参数量与计算量之间精确关系的数学之旅。
参数量从何而来:Transformer的数学解剖
理解大模型的参数量,需要从Transformer的架构入手。一个标准的decoder-only Transformer由多层堆叠而成,每层包含两个核心组件:多头自注意力机制和前馈神经网络。
Embedding层:模型的"词典"
Transformer的第一步是将离散的token转换为连续向量。假设词汇表大小为$V$,嵌入维度为$d_{model}$,则token embedding矩阵的形状为$V \times d_{model}$。
以GPT-3为例,$V = 50257$,$d_{model} = 12288$,仅embedding层就有约6.17亿参数。这个数字听起来很大,但随着模型规模增大,embedding层在总参数中的占比反而会下降——LLaMA-70B的embedding仅占总参数的0.2%左右。
位置编码是否贡献参数取决于具体实现。GPT系列使用可学习的位置编码,需要$n_{ctx} \times d_{model}$个参数($n_{ctx}$为最大上下文长度);而LLaMA系列使用RoPE旋转位置编码,这是一种确定性计算,不引入可学习参数。
注意力层:四矩阵的矩阵
每一层的注意力机制包含四个关键矩阵:Query ($W_Q$)、Key ($W_K$)、Value ($W_V$)和Output ($W_O$)。在标准的多头注意力中,这四个矩阵的形状都是$d_{model} \times d_{model}$。
这里有一个重要的设计细节:虽然注意力被分为多个head,但总参数量与head数量无关。设head数量为$n_{heads}$,每个head的维度为$d_{head}$,通常满足$n_{heads} \times d_{head} = d_{model}$。无论将$d_{model}$维度切分成多少个head,$W_Q$、$W_K$、$W_V$的总参数量始终是$3 \times d_{model}^2$。
以GPT-3为例,$d_{model} = 12288$,单个注意力层的四个矩阵贡献:
$$4 \times 12288^2 \approx 604 \text{M 参数}$$前馈神经网络:隐形的参数大户
前馈网络(FFN)是参数量的主要来源,这一点常被忽视。标准FFN包含两个线性变换,中间层维度通常是$d_{model}$的4倍:
$$W_1: d_{model} \times 4d_{model}$$$$W_2: 4d_{model} \times d_{model}$$
单层FFN的参数量为$8 \times d_{model}^2$,是注意力层($4 \times d_{model}^2$)的两倍。对于GPT-3:
$$2 \times 12288 \times 49152 \approx 1.21 \text{B 参数/层}$$这解释了为什么在大型模型中,FFN贡献了约2/3的非embedding参数。
LayerNorm:微不足道但不可或缺
每个Transformer层包含两个LayerNorm(注意力前和FFN前),每个LayerNorm有$\gamma$和$\beta$两个可学习参数向量,形状均为$d_{model}$。单层贡献$4 \times d_{model}$个参数,相对于矩阵乘法的参数量可以忽略不计。
总参数量公式
综合以上分析,一个$L$层decoder-only Transformer的总参数量可以近似为:
$$P \approx L \times (12 d_{model}^2) + V \times d_{model} + n_{ctx} \times d_{model}$$忽略embedding和位置编码(在大模型中占比很小):
$$P \approx 12 L d_{model}^2$$这个公式揭示了一个重要事实:参数量与嵌入维度呈平方关系。将$d_{model}$翻倍,参数量会增加4倍。
验证一下GPT-3:$L = 96$,$d_{model} = 12288$
$$P \approx 12 \times 96 \times 12288^2 \approx 174 \text{B}$$与官方公布的175B参数基本吻合。
FLOPs:计算量的精确度量
参数量告诉我们要存储多少数字,FLOPs(Floating Point Operations)则告诉我们要执行多少次浮点运算。两者之间存在确定性的数学关系,但推导过程需要仔细审视每个操作。
矩阵乘法的FLOPs计算
一次$m \times n$矩阵与$n \times p$矩阵的乘法需要$2mnp$次浮点运算:每个输出元素需要$n$次乘法和$n-1$次加法(近似为$n$次加法),共$m \times p$个输出元素。
为什么是$2mnp$而不是$mnp$?因为一个"乘-加"操作(multiply-accumulate, MAC)算作2 FLOPs:一次乘法和一次加法。这是计算领域的标准约定。
前向传播的FLOPs
以单层注意力为例,计算$Q = X \cdot W_Q$(输入$X$形状为$batch \times seq \times d_{model}$,$W_Q$形状为$d_{model} \times d_{model}$):
- FLOPs = $2 \times batch \times seq \times d_{model} \times d_{model}$
对于单个token($batch = 1, seq = 1$),四个投影矩阵($W_Q, W_K, W_V, W_O$)共贡献:
$$4 \times 2 \times d_{model}^2 = 8 d_{model}^2 \text{ FLOPs}$$FFN层的两个矩阵乘法:
$$2 \times 2 \times d_{model} \times 4d_{model} = 16 d_{model}^2 \text{ FLOPs}$$单层前向传播总计(忽略softmax、激活函数等非线性操作):
$$24 d_{model}^2 \text{ FLOPs/token}$$反向传播:计算的2倍代价
反向传播需要计算两个梯度:
- 对输入的梯度:传递给前一层
- 对权重的梯度:用于参数更新
每个矩阵乘法在前向传播时是$A \cdot B = C$,反向传播需要:
- 计算$\partial L / \partial A$:对$B$的乘法
- 计算$\partial L / \partial B$:对$A$的乘法
这意味着反向传播的计算量是前向传播的2倍。因此,完整的训练过程(前向+反向)每个参数需要6次浮点运算:
$$\text{训练FLOPs/token} \approx 6 P$$其中$P$是非embedding参数量。
注意力的序列长度依赖性
上述推导忽略了注意力计算中与序列长度相关的部分。完整的注意力计算包括:
- $Q \cdot K^T$:形状$seq \times seq$的矩阵乘法
- Softmax:对$seq \times seq$矩阵的操作
- Attention weights $\cdot V$:形状$seq \times d_{head}$的矩阵乘法
这些操作的FLOPs与序列长度$n_{ctx}$相关:
$$\text{注意力FLOPs} \approx 2 n_{ctx}^2 d_{model} \text{ per layer}$$当$n_{ctx}$较小时(如$n_{ctx} < 8 d_{model}$),这部分计算量相对于投影矩阵可以忽略。对于GPT-3($d_{model} = 12288$),当$n_{ctx} < 100K$时,注意力计算的二次项占比不到20%。
训练总FLOPs公式
给定模型参数量$P$、训练token数$T$,总训练FLOPs为:
$$\text{Total FLOPs} \approx 6 P T$$这个简洁的公式蕴含着深刻的含义:训练一个175B参数的模型在300B tokens上需要:
$$6 \times 175 \times 10^9 \times 300 \times 10^9 = 3.15 \times 10^{23} \text{ FLOPs}$$这是一个天文数字,但有了它,我们就可以估算训练时间和成本。
从FLOPs到训练时间:GPU算力的度量
GPU理论峰值FLOPS
GPU的计算能力通常用FLOPS(Floating Point Operations Per Second)衡量,注意这里是大写S,表示每秒。不同精度下理论峰值不同:
| GPU | FP64 | FP32 | FP16/BF16 | INT8 |
|---|---|---|---|---|
| A100 40GB | 19.5 TFLOPS | 19.5 TFLOPS | 312 TFLOPS | 624 TOPS |
| A100 80GB | 19.5 TFLOPS | 19.5 TFLOPS | 312 TFLOPS | 624 TOPS |
| H100 SXM | 67 TFLOPS | 67 TFLOPS | 1979 TFLOPS | 3958 TOPS |
注意这些是理论峰值,实际训练中无法达到。FP16/BF16的高峰值得益于Tensor Core的矩阵乘法加速。
模型FLOPs利用率(MFU)
理论峰值与实际性能之间存在巨大鸿沟。Google在PaLM论文中提出了Model FLOPs Utilization (MFU)的概念:
$$\text{MFU} = \frac{\text{实际达到的FLOPS}}{\text{理论峰值FLOPS}}$$MFU反映了硬件实际利用效率。业界主流模型的MFU通常在40-60%之间:
- PaLM (540B): 57.8% MFU
- GPT-3 (175B): ~40% MFU (估计值)
- LLaMA-2 (70B): ~43% MFU
为什么无法达到100%?原因包括:
- 内存带宽瓶颈:加载参数需要时间,计算单元可能闲置等待
- 通信开销:多GPU之间的梯度同步占用时间
- 非矩阵运算:LayerNorm、Softmax、激活函数等不是矩阵乘法,无法利用Tensor Core
- 软件开销:框架调度、内核启动等额外成本
训练时间估算
有了FLOPs、理论峰值和MFU,就可以估算训练时间:
$$\text{训练时间} = \frac{6 P T}{\text{GPU数量} \times \text{峰值FLOPS} \times \text{MFU}}$$以GPT-3为例,假设使用1024块A100,MFU为40%:
$$\text{训练时间} = \frac{3.15 \times 10^{23}}{1024 \times 312 \times 10^{12} \times 0.4} \approx 2.46 \times 10^6 \text{ 秒} \approx 28.5 \text{ 天}$$这个估算与实际公开信息基本一致。OpenAI在2020年论文中提到使用10000块V100,训练时间约一个月——V100的FP16峰值是125 TFLOPS,1024块A100的计算能力约等于10000块V100。
成本的维度
假设云服务GPU价格为$2/GPU-hour,GPT-3的训练成本: $$1024 \text{ GPUs} \times 28.5 \text{ 天} \times 24 \text{ 小时} \times \$2 \approx $1.4 \text{M}$$
这与MosaicML在2022年报告的约$4.5M(使用V100)和后来的$500K优化成本形成对比——技术进步和规模效应正在快速降低训练成本。
Chinchilla定律:计算最优的参数-数据配比
2022年DeepMind发表的Chinchilla论文重新定义了大模型训练的基本原则。论文的核心问题是:给定固定的计算预算,应该用多少参数、训练多少数据?
从Kaplan到Chinchilla的转变
OpenAI的Kaplan等人在2020年提出的scaling law建议:模型参数量应该比数据量增长更快。这导致了GPT-3(175B参数,300B tokens)和Gopher(280B参数,300B tokens)这样"大模型小数据"的设计。
Chinchilla论文重新审视了这个问题,训练了超过400个不同规模的模型,发现之前的结论有系统性偏差。新的结论是:模型参数量和训练数据量应该等比例增长。
计算最优公式
Chinchilla给出了计算最优条件下参数量$N$和token数$D$与计算预算$C$(FLOPs)的关系:
$$N_{opt} \propto C^{0.5}$$$$D_{opt} \propto C^{0.5}$$
这意味着当计算预算翻倍时,最优参数量和最优数据量都应该增加$\sqrt{2} \approx 1.41$倍。
一个实用的经验法则:每个参数需要约20个训练tokens。这被称为"Chinchilla optimal"配置。
GPT-3是否被"浪费"了?
按照Chinchilla定律,175B参数的最优训练数据量应该是:
$$D_{opt} = 20 \times 175 \text{B} = 3.5 \text{T tokens}$$而GPT-3只用了300B tokens,差了一个数量级。这解释了为什么Chinchilla-70B(70B参数,1.4T tokens)虽然参数少4倍,但性能超过了Gopher-280B——后者同样"训练不足"。
后Chinchilla时代的实践
Chinchilla定律发布后,业界开始重新审视模型设计:
LLaMA系列:
- LLaMA-7B: 7B参数,1T tokens(~143 tokens/参数)
- LLaMA-65B: 65B参数,1.4T tokens(~22 tokens/参数)
LLaMA明显"过训练"了,但这带来了推理时的优势——相同性能的模型更小更快。
Llama 3系列:
- Llama 3-70B: 70B参数,15T tokens(~214 tokens/参数)
Meta明确表示追求推理效率而非训练效率,这是对Chinchilla定律的"理性违背"——牺牲训练成本换取推理收益。
推理计算量:与训练的本质差异
训练是一次性的巨额投资,推理是持续运营的日常开销。两者的计算模式有根本性不同。
Prefill与Decode的两阶段模式
推理分为两个阶段:
Prefill阶段:处理完整的输入prompt,所有token可以并行计算。计算模式类似于训练的前向传播,FLOPs为:
$$\text{Prefill FLOPs} = 2 P \times n_{prompt}$$Decode阶段:逐个生成token,每生成一个token需要重新计算注意力。这是"内存受限"的计算,主要瓶颈是加载模型权重:
$$\text{Decode FLOPs/token} = 2 P$$KV Cache:空间换时间的智慧
Decode阶段的关键优化是KV Cache。在生成第$t$个token时,需要计算它与之前所有$t-1$个token的注意力。如果每次都重新计算历史token的K、V向量,计算量会随序列长度二次增长。
KV Cache通过存储历史token的K、V向量,将每步计算量从$O(t)$降到$O(1)$。代价是内存占用线性增长:
$$\text{KV Cache大小} = 2 \times L \times n_{heads} \times d_{head} \times n_{ctx} \times 2 \text{ bytes}$$对于GPT-3架构($L=96, n_{heads}=96, d_{head}=128$),2048 tokens的KV Cache约需:
$$2 \times 96 \times 96 \times 128 \times 2048 \times 2 \approx 9.6 \text{ GB}$$这解释了为什么长上下文模型需要大量GPU内存——不是参数量变大,而是KV Cache随序列长度增长。
内存带宽vs计算能力:Roofline模型
推理的瓶颈往往不是计算能力,而是内存带宽。Roofline模型形象地展示了这一约束:
$$\text{算术强度} = \frac{\text{FLOPs}}{\text{Bytes transferred}}$$对于Decode阶段,每个token需要:
- 从内存加载:$2P$ bytes(FP16权重)
- 执行计算:$2P$ FLOPs
- 算术强度:$1$ FLOP/byte
A100的内存带宽是2039 GB/s,FP16峰值是312 TFLOPS。当算术强度为1时:
$$\text{内存带宽上限} = 2039 \text{ GB/s} \times 1 = 2.04 \text{ TFLOPS}$$这远低于计算峰值312 TFLOPS!这意味着Decode阶段本质上是内存受限的,GPU的计算能力大部分处于闲置状态。
从内存受限到计算受限的临界点:
$$\text{临界batch size} = \frac{\text{峰值FLOPS}}{\text{内存带宽}} = \frac{312 \times 10^{12}}{2 \times 10^{12}} \approx 156$$当batch size超过156时,A100才会从内存受限转变为计算受限。这是批量推理能提高吞吐量的数学基础。
实际案例分析:从GPT-3到DeepSeek-V3
GPT-3:Scaling Laws的首个验证
GPT-3的训练配置:
- 参数量:175B
- 训练数据:300B tokens
- 估计FLOPs:$3.15 \times 10^{23}$
- 硬件:约10000块V100
- 时间:约30天
- 成本:估计$4.6M(V100时代)
GPT-3的意义在于验证了scaling laws的预测能力。论文中展示的损失曲线与幂律预测高度吻合,为后续更大规模训练奠定了信心。
LLaMA-2:开源的力量
LLaMA-2-70B的训练配置:
- 参数量:70B
- 训练数据:2T tokens
- 估计FLOPs:$8.4 \times 10^{23}$
- 硬件:Meta自建集群
- 报告MFU:~43%
尽管参数量只有GPT-3的40%,但训练了更多数据(按照Chinchilla建议的~29 tokens/参数),最终性能相当甚至更好。
DeepSeek-V3:MoE架构的效率革命
DeepSeek-V3代表了效率优化的新高度:
- 总参数:671B
- 激活参数:37B
- 训练数据:14.8T tokens
- 训练成本:278.8万H800 GPU小时
- 估计FLOPs:$6 \times 37 \times 10^9 \times 14.8 \times 10^{12} \approx 3.3 \times 10^{24}$
- 实测MFU:~22%
MoE架构让模型在保持大"知识容量"的同时,每次推理只激活一小部分参数。DeepSeek-V3的总参数是LLaMA-2-70B的9.6倍,但激活参数只有一半多,推理成本更低。
关于MFU较低的原因:MoE架构引入了额外的All-to-All通信开销,且FP8训练(DeepSeek采用)的理论峰值计算方式与FP16不同。
效率提升的技术演进
从GPT-3到今天的模型,单位性能的训练成本下降了不止一个数量级。这背后是多层技术的协同优化。
混合精度训练
早期训练使用FP32,每个参数需要4字节存储。混合精度训练(FP16/BF16权重 + FP32主权重)将存储需求减半,同时利用Tensor Core加速矩阵乘法。BF16相比FP16有更大的动态范围,避免了梯度下溢问题,已成为现代训练的标准选择。
Flash Attention:算法层面的革新
Flash Attention不是简单的内核优化,而是算法层面的重新设计。传统注意力需要实例化完整的$n_{ctx} \times n_{ctx}$注意力矩阵,内存复杂度$O(n_{ctx}^2)$。Flash Attention通过分块计算和在线softmax,将内存复杂度降到$O(n_{ctx})$:
$$\text{在线softmax}: \exp(x - \max(x)) / \sum \exp(x - \max(x))$$关键洞察:可以逐块计算softmax,然后合并结果。这使得长上下文训练变得可行。
梯度检查点:内存与计算的权衡
大模型训练面临内存瓶颈——需要存储所有中间激活用于反向传播。梯度检查点(Gradient Checkpointing)的策略是:前向传播时只存储部分激活,反向传播时重新计算被丢弃的激活。
代价:增加约30%的计算量 收益:内存占用降低数倍
这是一个典型的"计算换内存"权衡,在内存受限场景下非常有效。
通信优化:多机训练的瓶颈
当模型需要跨多机多卡训练时,通信成为关键瓶颈。优化策略包括:
- 梯度压缩:通信前压缩梯度,如FP16通信、稀疏化
- 通信计算重叠:在计算下一层梯度的同时通信当前层梯度
- 分层All-Reduce:先机内reduce,再机间reduce
DeepSeek报告的通信开销占比约10-20%,这是大规模分布式训练的基本成本。
结语:数字背后的设计哲学
参数量和计算量不只是技术指标,它们反映了模型设计的深层哲学:
规模的平方律:参数量与$d_{model}$呈平方关系,意味着维度增长需要谨慎。从7B到70B不是简单地"加更多层",而是需要重新平衡宽度、深度和数据量的配比。
计算效率的多维度:MFU不只取决于代码优化,还取决于模型架构选择。MoE降低了推理计算量但增加了通信开销,长上下文提升了能力但增加了KV Cache负担。
Scaling Laws的边界:Chinchilla定律给出了训练效率最优解,但实际设计往往"过训练"以获得更好的推理效率。这反映了训练成本(一次性)与推理成本(持续)之间的权衡。
理解这些数学关系,才能在大模型开发中做出明智的技术决策。175B还是70B?1T tokens还是10T tokens?答案不是"越大越好",而是取决于具体的计算预算、延迟要求和部署场景。数学提供了框架,工程智慧在于权衡。