LLaMA2详解
Swift Lv6

LLaMA2的模型结构拆解:

llama

RoPE

这个不多谈了,见:旋转位置编码

RMSNorm

标准Transformer的LayerNorm如下:

llama2采用了RMSNorm:

实现源码

1
2
3
4
5
6
7
8
9
10
11
12
def _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

MLP

up、gate、down都是三个linear层down(up * silu(gate))

1
2
def forward(self, x):
return self.w2(F.silu(self.w1(x)) * self.w3(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

参考

Powered by Hexo & Theme Keep
Unique Visitor Page View