LLaMA2详解
LLaMA2的模型结构拆解:
RoPE
这个不多谈了,见:旋转位置编码
RMSNorm
标准Transformer的LayerNorm如下:
llama2采用了RMSNorm:
实现源码:1
2
3
4
5
6
7
8
9
10
11
12def _norm(self, x):
"""
Apply the RMSNorm normalization to the input tensor.
Args:
x (torch.Tensor): The input tensor.
Returns:
torch.Tensor: The normalized tensor.
"""
return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
RMSNorm能保证激活效果变化,且计算效率能提升7%∼64%
SwiGLU
这个不多谈了,见:SwiGLU激活函数
MLP
up、gate、down都是三个linear层:down(up * silu(gate))
1 | def forward(self, x): |
GQA
这个不多谈了,见:Multi Query Attention & Group Query Attention
padding_side
llama系列训练和推理都是right padding:
- 训练:其实只要设置padding mask,那么left/right pad是没有区别的。然而实际上huggingface中某些tokenizer在training的时候必须设成right padding,因为有些tokenizer使用的是absolute position id,导致非padding token的position id不是从0开始的。
- 推理:由于llama是decoder-only结构,每个token的生成依赖于上一个token。而上一个token如果是无实际意义的padding token,那么就打断了句子语义的连续性,导致生成文本质量较差。因此left padding比较make sense,但在llama推理的源码中,batch的时候采用right padding。生成token的时候,从batch中长度最短的序列开始生成,其它较长序列的相同位置保持不变,直到该序列开始生成。猜测llama这样做的原因是保持跟训练一致,但不如left padding优雅。
llama1,llama2,llama3区别
差异 | llama1 | llama2 | llama3 |
---|---|---|---|
上下文长度 | 2k | 4k | 8k |