第二章:大模型基础与算子解析
各位同学,今天我们来聊聊Transformer。说实话,这个架构现在已经是AI芯片的“灵魂”了。我刚开始接触大模型时,也被它的复杂度吓了一跳。但拆开来看,核心就那么几个算子。
2.1 Transformer架构拆解
Transformer最早是Google在2017年提出的。它的设计思路很巧妙——完全抛弃了循环和卷积,全靠注意力机制。我当年第一次看到论文时,心里想的是:“这玩意儿真能跑起来?”
整个架构分两大部分:
- Encoder(编码器):把输入序列变成特征表示
- Decoder(解码器):根据特征生成输出序列
每个Encoder/Decoder层里,核心组件就三个:
- 多头注意力(Multi-Head Attention)
- 前馈网络(Feed-Forward Network)
- 层归一化(Layer Normalization)
嗯,这里要注意:每个组件外面都包了一层残差连接。为什么?因为网络太深了,不加残差根本训不动。我在项目中遇到过,有次为了省资源把残差去掉了,结果模型收敛速度直接掉了30%。
核心观点:Transformer的本质就是“注意力+前馈”的堆叠。你想想看,GPT、BERT、LLaMA,哪个不是这个套路?
2.2 Attention机制深度解析
Attention说白了就是“找重点”。给定一个查询Q,一组键K和值V,计算Q和每个K的相似度,然后用这个相似度去加权求和V。
公式长这样:
Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V
这里有个细节:为什么要除以√d_k?因为Q和K的点积结果会随着维度增大而变大,softmax的梯度会变得很小。我刚开始做FPGA实现时,忽略了这一步的数值范围,结果仿真时发现softmax输出全是0或1——嗯,这就是所谓的“梯度消失”。
实战技巧:在FPGA上实现Attention时,建议把Q×K^T的结果先做一次截位,再送softmax。我曾经因为数值溢出,排查了整整两天。
2.3 常见算子计算特征
大模型里最常用的算子就三个:MatMul、Softmax、LayerNorm。咱们一个一个说。
2.3.1 MatMul(矩阵乘法)
这是计算量最大的算子。一个Transformer层里,Q、K、V的投影需要MatMul,Attention输出需要MatMul,前馈网络的两个全连接层也是MatMul。说白了,整个模型80%的计算量都在这里。
计算特征:
- 计算密集型:计算/访存比高
- 可并行度高:每个输出元素独立
- 数据复用:权重矩阵被多次读取
在FPGA上,我习惯用脉动阵列(Systolic Array)来做MatMul。为什么?因为数据流规整,容易达到高吞吐。我记得第一次在Xilinx VU9P上实现时,用32×32的脉动阵列,跑到了800MHz——当然,那是理想情况。
2.3.2 Softmax
Softmax看起来简单,但实现起来坑不少。公式是:
softmax(x_i) = exp(x_i) / Σ exp(x_j)
计算特征:
- 指数运算:硬件实现成本高
- 需要全局归约:先求最大值,再求和
- 数值稳定性:容易溢出
避坑指南:我曾经在实现Softmax时,直接用了CORDIC算法算指数。结果精度不够,模型推理结果完全不对。后来改用查找表+线性插值,精度和资源都满意了。
2.3.3 LayerNorm(层归一化)
LayerNorm的作用是稳定训练。它对每个样本的所有特征做归一化:
y = (x - μ) / √(σ² + ε) × γ + β
计算特征:
- 需要计算均值和方差:两次全局归约
- 除法运算:硬件实现成本高
- 逐元素操作:适合SIMD架构
在FPGA上实现LayerNorm时,我建议把均值和方差的计算流水化。先算一次求和得均值,再算一次平方差求和得方差。嗯,这里要注意:ε是个很小的数,防止除零,一般取1e-5。
2.4 算子计算量对比
咱们用一张表来看看各算子的计算量占比(以GPT-3 175B为例):
| 算子 | 计算量占比 | 访存量占比 | 硬件瓶颈 |
|---|---|---|---|
| MatMul | ~85% | ~60% | 计算单元 |
| Softmax | ~5% | ~15% | 指数运算 |
| LayerNorm | ~3% | ~10% | 除法/开方 |
| 其他(GELU等) | ~7% | ~15% | 非线性函数 |
看到没?MatMul占了绝对大头。所以做硬件加速时,优先优化MatMul。但Softmax和LayerNorm也不能忽视——它们虽然计算量小,但访存模式不规则,容易成为瓶颈。
总结一下:Transformer的核心就是Attention + FFN,而Attention的核心就是MatMul + Softmax。你想想看,把这些算子吃透了,大模型加速就成功了一半。
好了,这一章就到这里。下一章我们会深入MatMul的FPGA实现,从脉动阵列到数据流优化,一步步带你跑起来。