LLaMA v1/2模型结构总览

这篇具有很好参考价值的文章主要介绍了LLaMA v1/2模型结构总览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LLaMA v1/2模型结构总览

孟繁续

目录

收起

结构

Group Query Attention(V2 only)

RMSNorm

SwiGLU

RoPE

llama2 出来了,并且开源可商用,这下开源社区又要变天了。快速看一下官网以及paper,看看llamav2相比v1有什么更新吧:

  1. 预训练语料从1->2 Trillion tokens
  2. context window 长度从2048->4096
  3. 收集了100k人类标注数据进行SFT
  4. 收集了1M人类偏好数据进行RLHF
  5. 在reasoning, coding, proficiency, and knowledge tests上表现超越MPT和Falcon
  6. 和falcon一样,使用了Group query attention,节省cache

LLaMA现在已经是开源社区里炙手可热的模型了,但是原文中仅仅介绍了其和标准Transformer的差别,并没有一个全局的模型介绍。找了找其他博客也都是和原文一样,没有介绍模型的结构总览。因此打算写这篇文章,争取让读者不参考任何其他资料把LLaMA的模型搞懂。

结构

如图所示为LLaMA的示意图,由Attention和MLP层堆叠而成:

LLaMA v1/2模型结构总览,大语言模型LLM,llama

模型的主要特点为:

  1. 前置的RMSNorm,
  2. 在Q、K上使用RoPE旋转式位置编码,
  3. 使用causal mask保证每个位置只能看到前面的tokens,
  4. LLaMA可以将更早的K、V拼接到当前K、V前面,可以用Q查找更早的信息,为了清晰没在图中画出来。
  5. MLP表达式:LLaMA v1/2模型结构总览,大语言模型LLM,llama ,其中down, up, gate都是线性层
  6. V2 context window 4096,使用了Group Query Attention。

LLaMA各个不同大小的结构设置如下表所示。其中最大的65B的LLaMA用了2048张80GB的A100,batch size为4百万,训练一次需要21天。

params dimension n heads n layers learning rate n tokens A100-hours
6.7B 4096 32 32 3.0e−4 1.0T 82432
13.0B 5120 40 40 3.0e−4 1.0T 135168
32.5B 6656 52 60 1.5e−4 1.4T 530432
65.2B 8192 64 80 1.5e−4 1.4T 530432

Group Query Attention(V2 only)

自回归模型生成回答时,需要前面生成的KV缓存起来,来加速计算。多头注意力机制(MHA)需要的缓存量很大,Multi-Query Attention指出多个头之间可以共享KV对。Group Query Attention没有像MQA一样极端,将query分组,组内共享KV,效果接近MHA,速度上与MQA可比较。p.s. 这个技术falcon已经用上了,当时falcon说自己用的是multi query attention,因为当group=1时,GQA和MQA是等价的。falcon支持设置不同的G。

LLaMA v1/2模型结构总览,大语言模型LLM,llama

RMSNorm

这是在BERT、GPT等模型中广泛使用的LayerNorm:

LLaMA v1/2模型结构总览,大语言模型LLM,llama

RMSNorm(root mean square)发现LayerNorm的中心偏移没什么用(减去均值等操作)。将其去掉之后,效果几乎不变,但是速度提升了40%。最终公式为:

LLaMA v1/2模型结构总览,大语言模型LLM,llama

注意除了没有减均值,加偏置以外,分母上求的RMS而不是方差。

LLaMA在 Attention Layer和MLP的输入上使用了RMSNorm,相比在输出上使用,训练会更加稳定。

SwiGLU

LLaMA没有使用ReLU,而是使用了SwiGLU,有时也被称为SiLU。公式为: �������(�)∗� ,效果类似平滑版的ReLU:

LLaMA v1/2模型结构总览,大语言模型LLM,llama

RoPE

LLaMA使用了Rotary Position Embedding。对于Q的第m个位置向量q,通过以下方法注入位置编码:

�(�,�)=[�0�1...��/2−1��/2��/2+1...��−1]×[���(��0)���(��1)...���(���/2−1)���(��0)���(��1)...���(���/2−1)]+[−��/2−��/2+1...−��−1�0��1...��/2−1]×[���(��0)���(��1)...���(���/2−1)���(��0)���(��1)...���(���/2−1)]

其中 �是值介于[1,0)之间的固定向量。通过以下代码得到了上式中的第二项 ���(���) 和第四项 ���(���) 。

class LlamaRotaryEmbedding(torch.nn.Module):
    def __init__(self, dim, max_position_embeddings=2048, base=10000):
        super().__init__()
        theta = 1.0 / (base ** (torch.arange(0, dim, 2) / dim))
        t = torch.arange(max_position_mbeddings)
        freqs = torch.einsum("i,j->ij", t, theta)

        emb = torch.cat((freqs, freqs), dim=-1)
        self.register_buffer("cos_cached", emb.cos())
        self.register_buffer("sin_cached", emb.sin())

    def forward(self, seq_len=None):
        return self.cos_cached[:, :, :seq_len, ...], self.sin_cached[:, :, :seq_len, ...]

# 在LlamaAttention通过以下命令调用:
cos, sin = self.rotary_emb(seq_len=kv_seq_len)

以下代码将q沿着最后一个维度劈成两半,将后一半乘-1,然后连接在第一半之前,就得到了上式第三项。

# 在接下来的apply_rotary_pos_emb函数里调用

def rotate_half(x):
    x1 = x[..., : x.shape[-1] // 2]
    x2 = x[..., x.shape[-1] // 2 :]
    return torch.cat((-x2, x1), dim=-1)

最后通过以下代码得到结合了位置编码的Q,K(K和Q使用同样的方式进行位置编码)。

def apply_rotary_pos_emb(q, k, cos, sin, position_ids):
    q_embed = (q * cos[position_ids]) + (rotate_half(q) * sin[position_ids])
    k_embed = (k * cos[position_ids]) + (rotate_half(k) * sin[position_ids])
    return q_embed, k_embed

# 在LlamaAttention中通过以下命令调用:
query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)

使用了这么复杂的位置编码,有什么好处呢?从上面的公式可以看出,RoPE形式上是绝对位置编码,即依赖其绝对位置m。

绝对位置编码的优点是计算速度快等,缺点是拓展长度比较麻烦,且绝对位置并没有什么实际意义。而相对位置编码对学习token之间的关系很有意义,比如距离的很远的两个token之间的关联大概率很小,使用相对位置编码往往能够获得更好的效果。此外拓展长度也更容易,因为不论context size多长,只需关注最长距离以内的输入即可。相对位置编码的缺点是没有绝对位置编码计算速度快。

当我们计算Attention时,RoPE可以变成相对位置编码

����,�=��(�,�)×�(�,�)=(�0���(��0)−��/2���(��0))(�0���(��0)−��/2���(��0))+...+(��/2���(��0)+�0���(��0))(��/2���(��0)+�0���(��0))+...=�0�0(���(��0)���(��0)+���(��0)���(��0))+�0��/2(−���(��0)���(��0)+���(��0)���(��0))+��/2�0(−���(��0)���(��0)+���(��0)���(��0))+��/2��/2(���(��0)���(��0)+���(��0)���(��0))+...=�0�0���((�−�)�0)+�0��/2���((�−�)�0)+��/2�0���((�−�)�0)+��/2��/2���((�−�)�0)+...=[�0�0�1�1...��/2−1��/2−1��/2��/2��/2+1��/2+1...��−1��−1]�×[���((�−�)�0)���((�−�)�1)...���((�−�)��/2−1)���((�−�)�0)���((�−�)�1)...���((�−�)��/2−1)]+[−��/2�0−��/2+1�1...−��−1��/2−1�0��/2��1��/2+1...��/2−1��−1]�×[���((�−�)�0)���((�−�)�1)...���((�−�)��/2−1)���((�−�)�0)���((�−�)�1)...���((�−�)��/2−1)]

从上面这个公式可以看出,q和k的attention依赖相对距离m-n。因此RoPE为q、k注入的绝对位置编码,计算得到的attention,却变成了相对位置编码。妙的很,我这里为了不参考其他文章就很容易搞懂LLaMA的结构,简化了很多东西,推荐大家看一看RoPE原作者苏剑林的博客了解更多信息。

本文只关注LLaMA缺失的模型结构方面的介绍,对于文章的翻译可以参考其他的文章,例如靳伟:LLaMA大模型是如何炼成的,或者直接去看原文https://arxiv.org/pdf/2302.13971.pdf。文中参考的代码是huggingface的transformers库实现的版本,并不是Meta官方的代码。受笔者水平限制,如果哪里讲的不对,或者不够清晰易懂,欢迎在评论区与我交流。

编辑于 2023-08-30 09:16・IP 属地美国

LLM(大型语言模型)

llama

llama2文章来源地址https://www.toymoban.com/news/detail-826580.html

到了这里,关于LLaMA v1/2模型结构总览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • llama.cpp LLM模型 windows cpu安装部署;运行LLaMA-7B模型测试

    参考: https://www.listera.top/ji-xu-zhe-teng-xia-chinese-llama-alpaca/ https://blog.csdn.net/qq_38238956/article/details/130113599 cmake windows安装参考:https://blog.csdn.net/weixin_42357472/article/details/131314105 1、下载: 2、编译 3、测试运行 参考: https://zhuanlan.zhihu.com/p/638427280 模型下载: https://huggingface.co/nya

    2024年02月15日
    浏览(52)
  • llama.cpp LLM模型 windows cpu安装部署;运行LLaMA2模型测试

    参考: https://www.listera.top/ji-xu-zhe-teng-xia-chinese-llama-alpaca/ https://blog.csdn.net/qq_38238956/article/details/130113599 cmake windows安装参考:https://blog.csdn.net/weixin_42357472/article/details/131314105 1、下载: 2、编译 3、测试运行 参考: https://zhuanlan.zhihu.com/p/638427280 模型下载: https://huggingface.co/nya

    2024年02月16日
    浏览(41)
  • LLM:LLaMA模型和微调的Alpaca模型

    简单了解[LeCun狂赞:600刀GPT-3.5平替! 斯坦福70亿参数「羊驼」爆火,LLaMA杀疯了] 论文原文:https://arxiv.org/abs/2302.13971v1 模型就是用的transformer的decoder,模型设计的不同点在于: 1 Position Embedding :RoPE旋转位置编码rotary-embedding 删除了绝对位置嵌入,而是在网络的每一层添加了

    2024年02月10日
    浏览(47)
  • LLM__llama-7B模型试验

    llama模型已经开源很久了,所以拿做小的模型做了个简单尝试 因为做简单尝试并不打算长期持有,所以以便宜、够用、好退货为主要参考依据购买阿里云服务器、 我看7B的模型权重大小就13GB,所以先购入一个 32GB内存的虚拟机 CPU内存: 4核(vCPU) 32 GiB ~ 操作系统: Alibaba Cloud Lin

    2024年02月09日
    浏览(41)
  • 导出LLaMA等LLM模型为onnx

    通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。 这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行了llama导出onnx的开创性的工作,但是依赖于侵入式修改transform

    2024年02月14日
    浏览(70)
  • LLM - Transformer && LLaMA2 结构分析与 LoRA 详解

    目录 一.引言 二.图说 LLM 1.Transformer 结构 ◆ Input、Output Embedding ◆ PositionEmbedding ◆ Multi-Head-Attention ◆ ADD Norm ◆ Feed Forward ◆ Linear Softmax 2.不同 LLM 结构 ◆ Encoder-Only ◆ Encoder-Decoder ◆ Decoder-Only  3.LLaMA-2 结构 ◆ Input Embedding ◆ RMSNorm ◆ RoPE ◆ Attention ◆ SwiGLU ◆ MLP 三.数说 LoR

    2024年02月13日
    浏览(43)
  • llama.cpp LLM模型 windows cpu安装部署

    参考: https://www.listera.top/ji-xu-zhe-teng-xia-chinese-llama-alpaca/ https://blog.csdn.net/qq_38238956/article/details/130113599 cmake windows安装参考:https://blog.csdn.net/weixin_42357472/article/details/131314105 1、下载: 2、编译 3、测试运行 参考: https://zhuanlan.zhihu.com/p/638427280 模型下载: https://huggingface.co/nya

    2024年02月11日
    浏览(38)
  • [NLP]LLM---FineTune自己的Llama2模型

    Let’s talk a bit about the parameters we can tune here. First, we want to load a  llama-2-7b-hf  model and train it on the  mlabonne/guanaco-llama2-1k  (1,000 samples), which will produce our fine-tuned model  llama-2-7b-miniguanaco . If you’re interested in how this dataset was created, you can check this notebook. Feel free to change it: there ar

    2024年02月09日
    浏览(51)
  • 导出LLaMA ChatGlm2等LLM模型为onnx

    通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。 这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行了llama导出onnx的开创性的工作,但是依赖于侵入式修改transform

    2024年02月13日
    浏览(39)
  • LLM 系列 | 21 : Code Llama实战(上篇) : 模型简介与评测

    小伙伴们好,我是《小窗幽记机器学习》的小编:卖热干面的小女孩。 个人CSDN首页:JasonLiu1919_面向对象的程序设计,深度学习,C++-CSDN博客 今天开始以2篇小作文介绍代码大语言模型Code Llama。上篇主要介绍Code Llama的基本情况并基于HuggingFace上部署的Demo快速体验下Code Llama的实战

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包