深入挖掘llama3的从零实现
项目链接:GitHub - therealoliver/Deepdive-llama3-from-scratch: 逐步实现llama3模型的构建,掌握核心概念、精通过程推导,完成代码编写。 | 中英双语代码及文档 | 核心实现理念 | 原理过程推导 | 代码完整实现 | 低资源要求
像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预测情况等等更多内容。
🚀 快速开始!
- 克隆并下载项目
- 按照代码演示流程逐步操作,在Jupyter Notebook中的Deepdive-llama3-from-scratch-zh.ipynb文件开始你的学习。
- 加入社区,在GitHub讨论区分享您的见解或提出问题!
快来从一个一个的张量中逐步解开Llama3的秘密吧!
项目链接:https://github.com/therealoliver/Deepdive-llama3-from-scratch
你有什么看法呢? 欢迎讨论!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。