一文学会LLM参数量计算

文摘   科技   2024-10-25 07:46   江苏  
点击蓝字
 
关注我们










01


引言



大型语言模型通常是在海量数据集上训练的神经网络,用于理解和生成人类语言。它们依赖于Transformer等架构,这些架构使用诸如自注意力机制来处理和生成文本。


模型参数是这些模型的核心组件,它们包括权重weight和偏差bias,模型在训练期间会调整它们以最大限度地减少预测中的误差。参数的数量通常与模型的容量和性能相关。






02


基础知识


自Meta发布基础模型LLama 系列后,我们目睹了各种基于Llama 的微调开源模型(如Alpacca Vicuna 等)。一些典型的模型如Falcon , MPT , 以及 Llama-2 Llama-3 等流行模型已成为主流模型选择。

值得一提的是,所有这些模型都有一个共同的基础模型结构,即Decoder-Only Transformer 模型。这些变种的区别在于位置嵌入以及注意力机制的选择的不同。

Model

Positional

Embeddings

Attention

Mechanism

MPTAliBi EmbeddingsMulti-head
Attention     (MHA)
FalconRotary EmbeddingsMulti-Query Attention
Llama2Rotary Embeddings

Grouped Query Attention for 70B

MHA for 13B and 7B

本文将指导大家计算 Llama-2-13B 模型的参数量,我们将逐步拆解每层进行计算,并和使用Pytorch给出的结果进行比对确认。



03


 Llama-2模型结构


首先,我们来加载Llama-2 模型,并尝试打印其模型结构,代码如下:

from transformers import AutoTokenizer, AutoModelForCausalLM
# You can create token for ur account here: https://huggingface.co/settings/tokens
model_name = "meta-llama/Llama-2-13b-chat-hf"tokenizer = AutoTokenizer.from_pretrained(model_name, token=token)model = AutoModelForCausalLM.from_pretrained(model_name, token=token)

下图展示了该模型的具体网络结构,如下所示:





04


  嵌入层参数计算

在本节,我们首先来观察上述结构中第一行嵌入层的参数计算。
大语言模型是以Tokens来看待文本的,Tokens是基础单元。Llama-2 使用 Bytepair encoding算法来定义这些基础单元,词汇量为 32,000 个。一旦模型对文本进行了Token化,它就会用大小为 dim 的固定嵌入来表示每个标记。特别是 Llama-2,它使用的嵌入维度为 dim=5120
因此,嵌入层的参数总数为: 32000X5120=163840000 个。







05


注意力块参数计算


接着我们来关注自注意力块的参数量计算,其代码实现如下:


如我们在第二节中的表格所示,70B 版本的Llama-2 采用了分组查询注意力机制GQA , 而13B 版本的模型则采用了多头注意力机制MHA 。值得注意的是,GQA 涉及在每个组内共享 Key-Value 对,从而减少了推理过程中KV-Cache的大小。。


Llama-2-13BMHA 块中,有 40 个注意力头,每个注意力头的维度为 128。因此,W_Q 矩阵的大小计算为 5120 x (128 x 40),即 26 214 400 个参数。重要的是,在 MHA 块中,W_OW_K W_V 矩阵的维数与 W_Q 相同。


因此,整个自注意力模块的参数量为 4X5120X(128X40) = 104857600 个。








06


MLP块参数计算


接着我们来看MLP块,其结构为:

Llama-2 采用了独特的多层感知器(MLP)架构,使其有别于Transformer模型中常见的up_proj 和down_proj 操作。在一般情况下,标准 MLP 模块的结构如下:
out = down_proj(actn_fn(up_proj(input)))

不过,在 Llama-2 中,MLP 模块由三个基本层组成:up_projdown_proj gate_proj,这三个层的组合创造了一个独特的架构:

out = down_proj( act_fn(gate_proj(input)) x up_proj(input) )
据此我们可以计算,up_proj 层的大小为 5120 x 13824,从而得到 70 778 880 个参数。同样,down_proj 层的大小为 13824 x 5120,而 gated_proj 层的大小为 5120 x 13824。

因此,整个MLP 块的参数总计为 3X5120X13824 = 212336640 。






07


RMS归一化层参数计算


Llama-2 使用的是 RMSNorm,而不是论文 《Attention is All You Need》中提到的 LayerNorm。RMSNorm 使用激活的均方根进行归一化,并使用可学习的参数对其进行缩放。


上述公式中 g_i 的维数与 a_i 相同,在Llama-2-13B 中均为 5120。RMSNorm 应用于每层的 Attention 模块和 MLP 模块之前。此外,在 LM-head之前也使用了 RMSNorm。

因此,在transformer decoder block中的 RMS归一化层的参数量为:2X5120。在LM-head之前的归一化层的参数量为 5120.





08


LM head层参数计算


最后,我们来看 LM-head 分类头的结构,代码实现为:

最终的 LM 分类头接收了 5,120 维特征,并将其分为 32,000 个类别。

因此,lm_head_param = 5120X32000=163840000







09


计算总参数量


在Transformer架构中,注意力模块和 MLP 模块合并为一个Transformer层,并重复多次。要计算参数总数,我们可以使用下面的公式:

Total parameters = embed_parameters + num_layers x (attn_module_parameters + mlp_block_parameters + per_layer_rms_norm_ parameters) + pre_lm_head_rms_norm_parameters + lm_head_parameters

带入相应的数值,结果如下:

Total parameters = 163,840,000 + 40 x ( 104,857,600       + 212,336,640 + 5,120 x 2) + 5, 120 + 163,840,000 = 13,015,864,320






10


Pytorch验证


要确定上面加载的 PyTorch 模型中的参数数量,可以使用下面的代码片段:

num_parameters = sum(p.numel() for p in model.parameters())print(num_parameters)
# Number of parameters in Llama-2-13B: 13015864320

所以,我们的计算结果完全正确!







11


总结


本文探讨了如何计算LLM大语言模型的参数总量,通过逐层拆解计算,可以弄清楚每一层的参数量,最后通过和Pytorch的计算结果进行核验,证实了我们的计算过程,希望可以帮助大家处理其他模型的参数计算。


如果您觉得这篇文章有价值,欢迎点赞收藏关注一键三连,以获取更多有价值的内容。







点击上方小卡片关注我




添加个人微信,进专属粉丝群!



AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章