头图

深入挖掘llama3的从零实现

项目链接:GitHub - therealoliver/Deepdive-llama3-from-scratch: 逐步实现llama3模型的构建,掌握核心概念、精通过程推导,完成代码编写。 | 中英双语代码及文档 | 核心实现理念 | 原理过程推导 | 代码完整实现 | 低资源要求

510+star!

像Meta公司的Llama3这样的大型语言模型正在重塑人工智能领域,但它们的内部运作方式常常让人感觉像是一个“黑匣子”。该项目旨在从头开始促进对于Llama3模型是如何实现的深入了解。为掌握Llama3模型的构建和推理过程提供一个循序渐进的指南,确保学习者能够掌握成功实现大语言模型所必需的关键理念、原理推导和详细的代码实现

🔥 核心特色:8大显著优势

该项目由 naklecha/llama3-from-scratch[14k+star] 改进而来,显著增强了其过程清晰度和可用性:

1. 结构优化
该项目重新编排了内容顺序,优化了目录结构,使学习过程更加清晰合理,便于大家更加直观和循序渐进地理解代码。

2. 全面的代码注释
添加了大量详细的代码注释,手把手教你理解每一段代码的作用,即使是初学者也能轻松上手。

#### 示例:归一化的部分实现 ####

# 定义RMS归一化的计算函数
# 会将每个token进行独立的归一化
# norm_weights为预训练的缩放因子(即公式中的gi),以增强模型的表达能力。可以从模型文件中加载,4096维
# torch.rsqrt计算tensor的平方根的倒数,即1/RMS(a)
def rms_norm(tensor, norm_weights):
    return (tensor * torch.rsqrt(tensor.pow(2).mean(-1, keepdim=True) + norm_eps)) * norm_weights

3. 细粒度的维度追踪
详细标注了每一步计算中张量矩阵维度的变化,让你非常容易的直观理解整个计算过程在干什么。

4. 大量的原理详解
对大语言模型背后的原理进行了深入的阐释,包括众多组件的细节推导过程,不仅告诉你“要怎么做”,还深入解释了“为什么要这么做”,以阐明设计决策背后的逻辑依据,帮助学习者从根本上掌握模型的设计思想。

5. KV-Cache的详细分析
额外增加了KV-Cache的推导章节,涵盖详细的核心思想、原理推导以及在注意力机制中的应用流程等内容,让你从根源了解KV-Cache的每个细节及思考。

6. 双语代码和文档
提供了中英双语的代码文件,原生的中文翻译避免机翻的词不达意。

7. 支持谷歌Colab
得益于目前开源社区的帮助,该项目可以在Google Colab上免费顺利运行,无需担心本地计算资源不足的问题。

8. 可切换的模型
同样得益于开源社区的帮助,目前可以随意切换不同的Llama模型,例如Llama-3.1、3.2,以及1B、3B、8B等不同规模的模型。这使得能够比较不同模型的效果,并适应不同的资源场景。

📖 项目完整目录

  • 加载模型

    • 加载分词器tokenizer
    • 读取模型文件和配置文件

      • 使用配置文件推断模型的细节
  • 将输入文本转换为嵌入向量

    • 将文本转换为token id序列
    • 将token id序列转换为embedding嵌入向量
  • 构建第一层的transformer块

    • 归一化

      • 使用RMS归一化embedding嵌入
    • 从零实现单头的attention注意力机制

      • 得到输入token对应的qkv向量

        • 得到query向量

          • 展开query权重矩阵
          • 得到第一个头
          • 将token嵌入和query权重相乘,以获得token对应的query向量
        • 得到key向量(几乎和query向量一样)
        • 得到value向量(几乎和key向量一样)
      • 向query和key向量添加位置信息

        • 旋转位置编码RoPE
        • 给query向量添加位置信息
        • 给key向量也添加位置信息(和query向量过程一样)
      • 万事俱备,我们开始计算token间的注意力权重

        • 把query和key向量相乘得到注意力分数
        • 我们现在必须屏蔽掉未来的query-key分数
        • 计算最终的注意力权重,即softmax(注意力分数)
      • 终于!计算单头注意力机制的最终结果!
    • 计算多头的注意力机制(一个简单的循环,将上面的过程重复)

      • 计算每个头的结果
      • 合并每个头的结果为一个大矩阵
      • 头间信息交互(线性映射),自注意力层的最后一步!
    • 进行一下残差操作(add)
    • 进行第二次的归一化操作
    • 进行ffn前馈网络层的计算
    • 再次进行一下残差操作(终于得到transformer块的最终输出了!)
  • 一切都在这了,让我们完成全部的32层transformer块的计算,阅读愉快 :)
  • 让我们完成最后一步,预测下一个token

    • 首先对最后一层transformer的输出进行最后一次的归一化
    • 然后基于最后一个token对应的嵌入向量进行预测(线性映射到词典维度)
    • 预测结果来咯
  • 让我们扩展一下,看看使用不同的嵌入或未来token屏蔽策略会对预测结果产生什么影响 :)
  • 需要预测多个token?使用KV-Cache吧(梳理清楚这个真的花费了我好大的精力 Orz)
  • 感谢各位,辛苦你们的一路学习,爱你们 :)

    • From Me
    • From前身项目作者
  • LICENSE

🔍 为什么你可以选择这个项目?

一切都不是魔法,都是数学
在不借助高级框架的情况下实现矩阵乘法和注意力机制等的计算,避免抽象化API对于实现过程理解的影响。

清晰的双语注释
提供了英文和中文双语版本的代码注释和文档,以实现各类学习群体的可用性。

可复现的结果
利用Meta的原始模型文件预测出标志性的“42”答案,探究该模型得出这一答案的有趣过程。

更多的动手实验
测试未掩蔽的注意力机制、探究基于中间token预测情况等等更多内容。

🚀 快速开始!

  1. 克隆并下载项目
  2. 按照代码演示流程逐步操作,在Jupyter Notebook中的Deepdive-llama3-from-scratch-zh.ipynb文件开始你的学习。
  3. 加入社区,在GitHub讨论区分享您的见解或提出问题!

快来从一个一个的张量中逐步解开Llama3的秘密吧!


项目链接:https://github.com/therealoliver/Deepdive-llama3-from-scratch

你有什么看法呢? 欢迎讨论!