Llama3代码库一夜成名,Kapathy一键点赞,GitHub星标突破2千

news2025/1/16 3:54:00

让大神 Andrej Karpathy 一键三连❤️(点赞 + 转发 + 评论),一个教你从头开始实现 Llama3 的代码库爆火。

X 上转赞收藏量超 6.8k,GitHub 揽星 2k+。

火就火在,它教你从头用 Meta 开源的权重进行推理,详细解释和展开了注意力机制中多个头的矩阵乘法、位置编码以及所有中间层

换句话说,他解释了每行代码都在干啥。

Karpathy 看后直呼打造者 Nishant Aklecha(后文暂称 “纳哥”)是个有品的人:

完全展开后,比起模块相互嵌套和调用时,更容易理解每一步具体在做什么。

网友们对其也是赞不绝口,纷纷致敬:

话不多说,一起来看纳哥是如何手把手教的。

(量子位在不改变原意的基础上,进行了编译整理)

在运行纳哥提供的文件前,大伙儿需要预先下载 Meta 官方提供的 Llama3 模型权重。

纳哥表示自己没搞分词器,推荐用 Karpathy 的现成简洁版 BPE 代码。

PS:

“字节级(byte-level)”BPE 算法,在 UTF-8 编码的字符串上运行,广泛应用于大模型分词。Karpathy 提供的这个代码库包含两个分词器,都能在给定文本上训练分词器的词汇表和合并规则、将文本编码为 token、将 token 解码为文本。

读取模型文件的方式通常取决于 model classes 的编写方式以及 class 中变量的命名。但由于纳哥是从头开始实现 Llama3,所以将逐个张量地读取文件内容。

通过此配置可以推断出模型的结构和参数信息,例如模型包含的 Transformer 层数、多头注意力块中的头数,以及词汇表的大小等细节。

将文本转换为 token 时,纳哥使用 tiktoken 作为分词器。

接下来,纳哥展示了在代码中将 token 转换为高维的嵌入表示。这是代码库中唯一使用内置神经网络模块的部分。

[17×1]的 token 矩阵变成了 [17×4096] 的嵌入矩阵。也就是说,每个 token 被转换为一个长度为 4096 的嵌入向量,总共有 17 个这样的嵌入向量。

然后,纳哥对嵌入进行 RMS 归一化。经过这一步后,嵌入的形状不会改变,只有数值被归一化了。纳哥强调需要一个 norm_eps,避免意外将 RMS 值设为 0 导致除以 0 的错误。

以下是公式:

构建 Transformer 的第一层,进行归一化处理,从模型字典中访问 layer.0(即第一层)。归一化之后,张量的形状仍然是 [17×4096],与嵌入时相同,但数值已被归一化。

跟着纳哥从头实现注意力机制,加载 Transformer 第一层的注意力头。

从模型中加载 query、key、value 和 output 向量时,它们的形状分别是 [4096×4096]、[1024×4096]、[1024×4096] 和 [4096×4096]。

纳哥表示乍一看有点奇怪,因为理想情况是每个注意力头的 q、k、v 和 o 向量是独立的。而代码作者将它们捆绑在一起,是为了方便并行计算注意力头的矩阵乘法。

把所有这些向量解包开来:

下一步,纳哥将从多个注意力头中解包 query,解包后的形状是 [32x128x4096],32 是 Llama3 中的注意力头数量,128 是 query 向量的大小,4096 是 token 嵌入的大小。

在这里,纳哥访问了第一层第一个注意力头的 query 权重矩阵,query 权重矩阵的大小是 [128×4096]。

将 query 权重矩阵与 token 嵌入相乘,获得每个 token 的 query 向量。结果的形状为 [17×128],有 17 个 token,每个 token 对应一个长度为 128 的 query 向量。

接下来需要位置编码。

现在已经为 prompt 中的每个 token 生成了 query 向量,但每个单独的 query 向量并不知道它在 prompt 中的具体位置。

例如,query:“the answer to the ultimate question of life, the universe, and everything is”(生命、宇宙和一切的终极问题的答案是)。

在这个 prompt 中,使用了三次”the”,需要根据它们在 prompt 中的位置,使这三个”the”token 的 query 向量有所不同(每个向量的大小为 [1×128])。

通过使用 RoPE(旋转位置嵌入)来进行这些旋转操作。

上一步中,纳哥将 query 向量分成对,并对每一对应用一个旋转角度偏移。

由此,得到的向量大小为 [17x64x2],这是将长度为 128 的 query 向量对每个 prompt 中的 token 分成 64 对。这 64 对中的每一对都会根据 m*(theta) 进行旋转,其中 m 是要旋转 query 的 token 的位置。

使用复数的点积来旋转一个向量:

现在每个 token 的 query 元素都有一个复数(角度变化向量),可以将 query 向量(之前分成的对)转换为复数,然后通过点积根据位置旋转 query 向量。

获得旋转后的向量后,可以通过将复数重新视为实数来得到成对的 query 向量。

旋转后的对现在已经合并,有一个新的 query 向量(旋转后的 query 向量),其形状为 [17×128],其中 17 是 token 的数量,128 是 query 向量的维度。

key 与 query 几乎相同。

纳哥表示自己不会详细讲解 key 的数学原理,只需要记住以下几点:

key 生成的 key 向量维度也是 128;key 的权重只有 query 的四分之一,这是因为 key 的权重在同一时间内被 4 个头共享,来减少计算量;key 也会旋转添加位置信息,原因与 query 相同。

此时,纳哥已经为每个 token 获得了旋转后的 query 和 key。每个 query 和 key 现在的形状都是 [17×128]。

下一步,纳哥将对 query 矩阵和 key 矩阵进行相乘操作。这样做会生成一个评分矩阵,将每个 token 关联起来。这些评分描述了每个 token 的 query 与每个 token 的 key 之间的相关性,这就是自注意力机制。

注意力评分矩阵(qk_per_token)的形状为 [17×17],其中 17 是 prompt 中的 token 数量。

接下来需要对 query key 评分进行掩码处理。在 Llama3 的训练过程中,未来 token 的 qk 评分是被掩码的,只通过过去的 token 来预测 token。

因此,在推理时,要将未来的 token 评分设置为 0。

接下来是 value,接近注意力机制的最后一步。

这些评分(0-1)用于确定每个 token 使用多少 value 矩阵。

和 key 一样,value 的权重也在每 4 个注意力头之间共享,所以下面 value 权重矩阵的形状是 [8x128x4096]。

第一层,第一个注意力头的 value 权重矩阵如下所示:

然后是 value 向量。

使用 value 权重来获取每个 token 的注意力值,矩阵的大小是 [17×128],其中 17 是 prompt 中的 token 数量,128 是每个 token 的 value 向量的维度。

注意力:与每个 token 的 value 相乘后得到的注意力向量的形状为 [17×128]。

现在有了第一层第一个头的注意力 value。然后纳哥运行一个循环,对第一层的每个头执行与上面的计算完全相同的数学运算。

然后得到了第一层所有 32 个头的 qkv_attention 矩阵,接下来将所有注意力得分合并成一个大小为 [17×4096] 的大矩阵。

对于第 0 层注意力机制的最后步骤,其一是将注意力得分矩阵与权重矩阵相乘。

这是一个简单的线性层,所以只需进行矩阵乘法。

现在得到了注意力机制后的嵌入 value 变化,应该被添加到原始的 token 嵌入中。

对嵌入增量进行归一化处理,然后通过嵌入增量运行一个前馈神经网络。

在 Llama3 中,加载前馈权重并实现前馈网络。使用了一种名为 SwiGLU 的前馈网络,这种网络结构在模型需要的时候,能够有效地增加非线性。

现在完成了第一层之后每个 token 的新嵌入。现在只剩下 31 层了,只需通过一个循环来完成。

纳哥表示可以将这个编辑后的嵌入想象成包含了第一层中所有查询信息的嵌入。随着层数的增加,每一层都会对输入的信息进行越来越复杂的处理,直到最终得到一个能够全面了解下一个需要预测的 token 的嵌入。

之前做的所有事情,对每一层都重复一次。

然后得到了最终的嵌入,这是模型对下一个 token 的最优预测。这个嵌入的形状与常规的 token 嵌入相同,为 [17×4096],其中 17 是 token 的数量,4096 是嵌入的维度。

最后,将嵌入解码成 token 值。

使用输出解码器将最终的嵌入转换成一个 token。

接下来看纳哥使用最后一个 token 的嵌入来预测下一个 value,希望预测的结果是 42。

因为根据《银河系漫游指南》一书中的说法,42 是 “生命、宇宙及一切的终极问题的答案”。大多数 LLM 在这里都会回答 42,这将验证整个代码的正确性。

模型预测下一个 token 的编号为 2983。这个编号对应数字 42 吗?

OK,结束。

简单介绍一下 Nishant Aklecha。

Nishant Aklecha 是构建和改进定制语言模型平台 Glaive AI 的研究员,曾任职于摩根士丹利,负责训练和微调大语言模型。

此外,他还和朋友一同创立了一个研究实验室,名为 A10(AAAAAAAAAA)。

他们的目标可以总结成一句话:让研究变得更加触手可及。

除了放出这个代码库,Nishant Aklecha 可谓好人做到底。

网友想更好地理解这个代码库的内容,Nishant 直接一个 YouTube 视频甩了过来:

之前 Nishant Aklecha 还曾写过一篇 Blog,详解了潜在一致性模型(LCM),同样收获了不少好评。

啥也不说了,感兴趣的家人们赶紧码住吧。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InternLM-L0 Python作业

任务类型 任务内容 闯关任务 Python实现wordcount 闯关任务 Vscode连接InternStudio debug笔记 1. Python实现wordcount 基于作业 InternLM-L0 linux作业 ,创建Python文件输入如下代码,并用Python 脚本运行: text """ Go…

新手vue学习问题汇总(自用)(长期更新)

1.export default export default 是 ES6 模块语法,用于导出模块的默认成员。在 Vue.js 中,通常用来导出一个组件对象,使其可以在其他文件中被导入并使用。 2.props props 是组件接收外部数据的方式。父组件可以通过向子组件传递 props 来…

电阻上的数字意义及电阻值辨别方法

电阻是电子电路中的基本元件,其阻值的大小直接影响电路的工作状态。电阻上的数字信息对于电路设计和维修至关重要。本文将详细解读电阻上数字的意义,并介绍如何通过数字辨别电阻值。 一、电阻上数字的意义 电阻上的数字通常表示电阻的阻值、功率、误差等…

C++STL详解(五)——list类的接口详解

一.list的介绍 list容器的底层是双向循环带头链表,在CPP中,我们对双向循环带头链表进行了一定程度的封装。 如果你不了解双向链表,那么可以浏览此片博文:双向链表 二.list的定义方式以及赋值 2.1list的构造方式 在这里我们要…

Redis:事务

1. 简介 可以一次性执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序的串化执行,不允许被其他其他命令插入,不许加塞 即将要执行的命令放入队列中,此时该队列的所有命令就是一个事务&#x…

接口自动化中对于文件上传的处理方法

正常的接口自动化基本都是json的格式,对于文件上传是一种特殊的格式是表单格式针对这种表单格式在接口自动化中怎么处理,主要通过工作中使用的一个实际的例子进行分享 举例:web上需要导入一个文件实现相关的功能,主要通过两个接口…

vue实现滚动条下滑时隐藏导航栏,上滑时显示导航栏

效果展示 思路 监听滚动事件,记录上次的滚动距离,与最新滚动距离做对比,如果为正,说明滚动距离距顶值scrollTop变大,用户正在向下滚动页面,此时隐藏,反之则反,隐藏就是top值给他负导…

Linux网络-netstat命令

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器,主要的作用就是向客户端提供网络…

地球磁场的形成、变迁、特点

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

Python如何统治AI世界?一文读懂它的优势与挑战

一、Python语言介绍 1.1 Python语言概述 Python是一种由Guido van Rossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使…

应力对薄膜有什么影响?

知识星球里的学员问:在薄膜沉积中,应力是一个经常要监控的参数,它有什么作用?应力过大对薄膜有哪些影响? 应力是什么? 薄膜的应力是指在薄膜沉积过程中,薄膜内部或薄膜与基材之间产生的作用力。…

3Dtiles文件是否可以直接合并?

答:无法直接合并。网格大师有3dtiles转osgb的功能,先转osgb,然后把osgb放在一起之后再转3dtiles。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一,重叠区域处理问题的工具“百宝箱”,集格式转换…

大数据:数据标准化及质量管控方案

本方案是一套全面的解决方案,旨在为企业构建科学、规范的数据管理体系,确保数据的准确性、一致性、完整性、合理性、及时性和有效性,从而支撑业务数据的高效应用与正确决策。以下是对该方案的详细介绍: 一、方案概述 本数据标准…

Redis八股文(二)

目录 21.Redis如何实现服务高可用? 22.什么是集群中的脑裂? 23.脑裂导致数据丢失怎么办? 24.Redis使用的过期删除策略是什么? 25.什么是惰性删除? 26.什么是定期删除? 27.Redis持久化时&#xff0…

超级详细的SpringSecurity

文章目录 概述与shiro对比快速入门底层原理FilterDelegatingFilterProxyFilterChainProxySecurityFilterChainMultiple SecurityFilterChain 自定义登录流程解析基于内存的用户认证实现基于数据库的用户登录 实现用户新增功能controllerservice修改配置关闭csrf攻击防御修改默认…

python拼接字符串方法

文章目录 1. 使用加号()2. 使用str.join()方法3. 使用格式化字符串(f-strings, % 操作符, .format() 方法)4. 使用列表推导式和join()结合 性能对比 在Python中,字符串拼接是将两个或多个字符串合并成一个新字符串的过…

C++初学(3)

面向对象编程(OOP)的本质是设计并拓展自己的数据类型,设计自己的数据类型就是让类型与数据匹配。内置的C类型分为两组:基本类型和复合类型。这里我们将介绍基本类型的整数和浮点数 3.1、简单变量 3.1.1、变量名 C必须遵循几种简…

理解常见开源协议的区别

本文将介绍几种常见的开源许可证,包括GPL、LGPL、MIT、Apache、BSD 和 木兰协议(Mulan PSL),并详细解释它们的区别。 1. GPL (GNU General Public License) GPL 是最著名和最常用的开源许可证之一,由自由软件基金会 …

【前端 17】使用Axios发送异步请求

Axios 简介与使用:简化 HTTP 请求 在现代 web 开发中,发送 HTTP 请求是一项常见且核心的任务。Axios 是一个基于 Promise 的 HTTP 客户端,适用于 node.js 和浏览器,它提供了一种简单的方法来发送各种 HTTP 请求。本文将介绍 Axio…

如何在 Excel 中恢复临时文件

如果您在退出 Microsoft Excel 之前忘记保存重要的工作簿,这会令人烦恼和头疼。此外,在某些意外情况下,包括计算机突然崩溃、软件本身崩溃等,您精心制作的工作簿可能会消失。但是,您仍然可以使用Excel 临时服务恢复 Ex…