Llama模型结构解析(源码阅读)

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

  • 参考资料:
    https://zhuanlan.zhihu.com/p/636784644
    https://spaces.ac.cn/archives/8265 ——《Transformer升级之路:2、博采众长的旋转式位置编码》

前言:本次阅读代码位置,在transformers库底下的modeling_llama.py,具体位置在:transformers/models/llama/modeling_llama.py,如下图所示:Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

1. LlamaModel整体结构流程图

Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

2. LlamaRMSNorm

  • 代码如下
class LlamaRMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        LlamaRMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps

    def forward(self, hidden_states):
        input_dtype = hidden_states.dtype
        variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True)
        hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)

        return (self.weight * hidden_states).to(input_dtype)
  • RMSNorm的公式如下所示:
    x i 1 n ∑ i = 1 n x i 2 + e p s ∗ w e i g h t i \frac{x_i}{\sqrt{\frac{1}{n}\sum\limits_{i=1}^{n}{x_i}^2 + eps}} * weight_i n1i=1nxi2+eps xiweighti

    • 其中,公式与代码的对应关系如下:
      Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

3. LlamaMLP

  • 代码如下:
class LlamaMLP(nn.Module):
    def __init__(
        self,
        hidden_size: int,
        intermediate_size: int,
        hidden_act: str,
    ):
        super().__init__()
        self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False)
        self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.act_fn = ACT2FN[hidden_act]

    def forward(self, x):
        return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
  • 流程图:
    Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

  • 其中输入为x,输出为y

  • 代码中intermediate_size一般比hidden_size大,我们通过在jupyter notebook中打印Llama-13B的模型,可以看到如下所示:
    Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

  • 总结:MLP模块就是几个nn.Linear的组合

4. LlamaRotaryEmbedding

  • 代码如下

class LlamaRotaryEmbedding(torch.nn.Module):
    def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):
        super().__init__()
        inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float().to(device) / dim))
        self.register_buffer("inv_freq", inv_freq)

        # Build here to make `torch.jit.trace` work.
        self.max_seq_len_cached = max_position_embeddings
        t = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=self.inv_freq.dtype)
        freqs = torch.einsum("i,j->ij", t, self.inv_freq)
        # Different from paper, but it uses a different permutation in order to obtain the same calculation
        emb = torch.cat((freqs, freqs), dim=-1)
        self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False)
        self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False)

    def forward(self, x, seq_len=None):
        # x: [bs, num_attention_heads, seq_len, head_size]
        # This `if` block is unlikely to be run after we build sin/cos in `__init__`. Keep the logic here just in case.
        if seq_len > self.max_seq_len_cached:
            self.max_seq_len_cached = seq_len
            t = torch.arange(self.max_seq_len_cached, device=x.device, dtype=self.inv_freq.dtype)
            freqs = torch.einsum("i,j->ij", t, self.inv_freq)
            # Different from paper, but it uses a different permutation in order to obtain the same calculation
            emb = torch.cat((freqs, freqs), dim=-1).to(x.device)
            self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False)
            self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False)
        return (
            self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype),
            self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype),
        )
  • 具体的使用,还调用了另外两个函数,如下所示:
def rotate_half(x):
    """Rotates half the hidden dims of the input."""
    x1 = x[..., : x.shape[-1] // 2]
    x2 = x[..., x.shape[-1] // 2 :]
    return torch.cat((-x2, x1), dim=-1)


def apply_rotary_pos_emb(q, k, cos, sin, position_ids):
    # The first two dimensions of cos and sin are always 1, so we can `squeeze` them.
    cos = cos.squeeze(1).squeeze(0)  # [seq_len, dim]
    sin = sin.squeeze(1).squeeze(0)  # [seq_len, dim]
    cos = cos[position_ids].unsqueeze(1)  # [bs, 1, seq_len, dim]
    sin = sin[position_ids].unsqueeze(1)  # [bs, 1, seq_len, dim]
    q_embed = (q * cos) + (rotate_half(q) * sin)
    k_embed = (k * cos) + (rotate_half(k) * sin)
    return q_embed, k_embed
    
  • 注意这里的实现跟原始推导有点区别,这里实现的方式如下图所示:
    Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp

  • 原始推导如下图所示:
    Llama模型结构解析(源码阅读),NLP,llama,大语言模型,源码阅读,llama模型结构,nlp
    具体可以查看作者的博客:👉戳我👈

  • 总结:RoPE就是在attention计算时,K跟Q做内积之前,先给各自注入位置信息。

结束。文章来源地址https://www.toymoban.com/news/detail-685218.html

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

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

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

相关文章

  • [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)
  • Facebook Meta 以其最先进的基础语言模型 LLaMA 升温 AI 竞赛(含项目源码)

    Meta AI 已经进入了由大型语言模型 (LLM) 主导的 AI 竞赛,例如 OpenAI 的 ChatGPT、微软的 GPT-powered Bing 和谷歌的 Bard。Meta 首席执行官马克·扎克伯格 (Mark Zuckerberg) 在Facebook帖子中发布了这一消息:“今天我们发布了一种名为 LLaMA 的新型最先进的 AI 大型语言模型,旨在帮助研究人员

    2024年02月15日
    浏览(58)
  • NLP(六十四)使用FastChat计算LLaMA-2模型的token长度

    LLaMA-2模型部署   在文章NLP(五十九)使用FastChat部署百川大模型中,笔者介绍了 FastChat 框架,以及如何使用 FastChat 来部署百川模型。   本文将会部署LLaMA-2 70B模型,使得其兼容OpenAI的调用风格。部署的 Dockerfile 文件如下: Docker-compose.yml 文件如下: 部署成功后,会占用

    2024年02月12日
    浏览(43)
  • [NLP]使用Alpaca-Lora基于llama模型进行微调教程

    Stanford Alpaca 是在 LLaMA 整个模型上微调,即对预训练模型中的所有参数都进行微调(full fine-tuning)。但该方法对于硬件成本要求仍然偏高且训练低效。 [NLP]理解大型语言模型高效微调(PEFT) 因此, Alpaca-Lora 则是利用 Lora 技术,在冻结原模型 LLaMA 参数的情况下,通过往模型中加

    2024年02月15日
    浏览(57)
  • LLaMA模型论文《LLaMA: Open and Efficient Foundation Language Models》阅读笔记

    LLaMA是meta在2023年2月开源的大模型,在这之后,很多开源模型都是基于LLaMA的,比如斯坦福大学的羊驼模型。 LLaMA的重点是比通常情况下使用更多的语料,来训练一系列可在各种推理预算下实现可能的最佳性能的语言模型。 摘要翻译:我们在此介绍LLaMA,这是一个参数范围从

    2024年02月15日
    浏览(43)
  • [NLP] 使用Llama.cpp和LangChain在CPU上使用大模型-RAG

    下面是构建这个应用程序时将使用的软件工具: 1.Llama-cpp-python  下载llama-cpp, llama-cpp-python [NLP] Llama2模型运行在Mac机器-CSDN博客 2、LangChain LangChain是一个提供了一组广泛的集成和数据连接器,允许我们链接和编排不同的模块。可以常见聊天机器人、数据分析和文档问答等应用。

    2024年02月04日
    浏览(46)
  • 羊驼2:开放的基础和微调聊天模型--Llama 2论文阅读

    论文地址:https://arxiv.org/pdf/2307.09288.pdfd 代码地址:GitHub - facebookresearch/llama-recipes: Examples and recipes for Llama 2 model 问答 这篇文档中使用了3.3M GPU小时的计算,使用的硬件类型是A100-80GB,可以扩展到2000个GPU,但这些计算的功耗估计并不包括互连或非GPU服务器功耗,也不包括数据

    2024年01月16日
    浏览(41)
  • LLaMA-Adapter源码解析

    2024年02月06日
    浏览(36)
  • LLaMA中ROPE位置编码实现源码解析

    1、Attention中q,经下式,生成新的q。m为句长length,d为embedding_dim/head θ i = 1 1000 0 2 i d theta_i=frac{1}{10000^frac{2i}{d}} θ i ​ = 1000 0 d 2 i ​ 1 ​ 2、LLaMA中RoPE源码 3、表示 看1中的公式表示,q0和q1相互作用,得到新的q0和q1,也即 q 0 n e w = q 0 ∗ c o s ( m θ 0 ) − q 1 ∗ s i n ( m θ 0 )

    2024年02月11日
    浏览(34)
  • NLP-分词器:SentencePiece【参考Chinese-LLaMA-Alpaca在通用中文语料上训练的20K中文词表并与原版LLaMA模型的32K词表进行合并的代码】

    随着ChatGPT迅速出圈,最近几个月开源的大模型也是遍地开花。目前,开源的大语言模型主要有三大类:ChatGLM衍生的大模型(wenda、ChatSQL等)、LLaMA衍生的大模型(Alpaca、Vicuna、BELLE、Phoenix、Chimera等)、Bloom衍生的大模型(Bloomz、BELLE、Phoenix等)。其中,ChatGLM-6B主要以中英双

    2024年02月11日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包