微信扫码
添加专属顾问
最近,Andrew大神发布了一个全新的视频教程,讲解了从零开始预训练GPT-2的全过程。这个四小时的视频详细介绍了模型的构建、训练数据的加载、评估方法以及在分布式框架下的DDP训练。受到此视频的启发,我决定使用LLaMA3架构,从零开始预训练一个大型语言模型,并对比不同模型参数下模型能力的提升。本文将开源所有相关代码在:
https://github.com/hengjiUSTC/learn-llm/tree/main/pretrain
接下来让我们进入正题。
为了能够有一个对照效果,同时保证我们之后自己从零实现的LLaMA模型的正确性,我们首先通过加载Huggingface的官方LLaMA3模型,对模型进行HellaSwag评估。
代码开源在:
https://github.com/hengjiUSTC/learn-llm/blob/main/pretrain/play_with_llama.ipynb
我们可以看到,原始LLaMA3-8B模型的得分是70分。这一结果与官方公开的模型结果基本一致:
https://paperswithcode.com/sota/sentence-completion-on-hellaswag
有了这一基准,我们就可以开始从零实现自己的LLaMA模型了。
RMSNorm(Root Mean Square Normalization)是一种归一化方法,用于稳定和加速训练过程。
• 输入:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示输入的隐藏状态。
• 输出:
一个形状与输入相同的张量,但每个隐藏状态经过归一化处理。
• 作用:
RMSNorm通过计算输入张量每个元素的均方根值,并使用它来归一化输入。这可以有效地控制每层的输出范围,防止梯度爆炸或消失。
RotaryEmbedding是一种位置编码技术,用于引入位置信息。
• 输入:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示输入的查询(q)或键(k)向量。
• 输出:
一个形状与输入相同的张量,但每个向量经过旋转编码处理。
• 作用:
通过生成与位置ID对应的旋转向量,RotaryEmbedding可以在不显式使用位置编码的情况下,引入位置信息,使模型能够更好地理解序列中的位置信息。
RotaryEmbedding本质上是生成一组与position ID对应的旋转向量,代表了不同位置的数据应该怎么旋转。
Attention Layer用于计算输入序列中各个元素之间的相关性,并根据相关性对输入进行加权。
• 输入:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示输入的隐藏状态。
• 输出:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示经过注意力机制处理后的输出。
• 投影:将输入数据分别使用q_proj、k_proj、v_proj进行线性投影,生成查询、键、值向量。
• 旋转投影:对查询和键进行旋转投影,引入位置信息。
• 计算Attention值:通过查询向量和键向量的点积(q @ k.transpose())计算Attention值。
• 加权求和:使用Attention值对值向量进行加权求和。
• 线性投影:最后通过o_proj进行线性投影输出结果。
MLP层(多层感知机)用于对输入进行非线性变换。
• 输入:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示经过Attention处理后的隐藏状态。
• 输出:
一个形状为(batch_size, sequence_length, hidden_dim)的张量,表示经过非线性变换后的输出。
• 作用:
MLP层通常包含两个线性投影和一个非线性激活函数(如SiLU),用于增加模型的表达能力。具体步骤是:
• 输入通过第一个线性投影,生成一个中间表示。
• 中间表示经过SiLU激活函数。
• 激活后的表示通过第二个线性投影,生成最终输出。
完成一次组装,这里的计算过程包含了一次residual connection目的是为了提高梯度传播的质量和效率。
最终的LLaMA3模型结构包含:
• 输入embedding层,将输入词汇转换为隐藏状态。
• 多个重复的Block,每个Block包含RMSNorm层、RotaryEmbedding层、Attention Layer和MLP层。
• 输出线性层,将隐藏状态转换为输出。
通过这种结构,模型能够逐层处理输入数据,并逐步生成最终的预测结果。
整个过程之后,我们需要验证模型构建的正确性。我们将Huggingface的LLaMA3模型的所有参数复制到我们的模型中,然后通过HellaSwag评估我们自己的LLaMA3模型是否能够达到相同的效果。
在我们的llama3模型初始化时,copy huggingface原始llama3模型的权重。
通过评估,我们发现得分与Huggingface模型完全一致!这证明我们自己的实现是正确的。
为了能够预训练模型,我们使用了FineWeb 10TB的数据进行训练,训练时长为一个epoch。为了适应预训练场景,我们创建了自定义的数据Dataloader,并通过DDP(Distributed Data Parallel)加速训练。否则,训练过程将会耗费大量时间。
训练代码开源在:
https://github.com/hengjiUSTC/learn-llm/blob/main/pretrain/train_llama.py
为了同时使用多张GPU进行并行训练,我们使用了PyTorch提供的DDP模块,将模型加载到多个GPU上并行训练。
DDP(Distributed Data Parallel):DDP是PyTorch中常用的分布式训练模块,用于在多个GPU之间并行训练模型。DDP通过在每个GPU上运行一个训练进程,并在每次梯度计算后进行参数同步,从而实现并行加速训练。DDP解决的问题包括:
• 数据并行:将数据切分成多个batch,分发到不同的GPU上并行处理,提升训练速度。
• 梯度同步:在每次梯度更新后同步各个GPU的参数,保证模型的一致性。
首先,需要初始化DDP环境。针对我们运行代码时
torchrun --standalone --nproc_per_node=4 train_llama.py
指定的机器数量,PyTorch会自动分配对应的环境变量给每一个训练子进程。
在加载模型后,使用DDP封装模型
在训练阶段,我们可以按照单一模型的训练方式构建代码。在获得loss之后,使用loss.backward()积累梯度。这里的require_backward_grad_sync本质上是在梯度积累步长不为1时,通过在前几步中减少跨GPU的梯度同步,来优化训练速度。
之后,依旧正常利用optimizer迭代模型权重。使用torch.cuda.synchronize()的目的是为了同步并行的GPU,使每次iteration时所有GPU都完成这一轮的训练。
由于使用了多GPU训练,需要调整DataLoader让每个GPU获得不一样的训练数据。我们的DataLoader会根据GPU的编号,使用B * T * self.process_rank的方式加载数据。例如,如果我们有4个GPU,第0个DataLoader加载的数据就是第0,4,8,12个chunk,第1个GPU加载的是1,5,9,13个chunk,以此类推。
在这样的结构下,我们就可以开始训练了。当然,不要忘记提前通过fineweb.py脚本生成我们需要的10TB训练数据。
在对比中,我们首先与Andrew的GPT-2 demo进行对比。在相同的模型配置下(12层,12个head),经过一个epoch的FineWeb数据训练,andrew的GPT-2模型达到了2.9的training loss,超过了OpenAI原始版本的GPT-2。同时,在HellaSwag评测任务中,模型得分为0.305,也超过了GPT-2的0.294,但尚未达到GPT-3的0.337。我们认为FineWeb数据集起到了重要作用,它的质量已经超过了GPT-2的训练数据,但与GPT-3仍有差距。
对于我们自己的LLaMA架构模型,训练结果如下:在相同的12个layer、12个head配置下,经过一个epoch的训练,LLaMA3架构在得分上超越了andrew的GPT-2,训练loss为0.269(Andrew的gpt2为0.29),hellaswag得分为0.33(Andrew的gpt2为0.305),效果更加接近GPT-3。我们认为这主要是因为FineWeb数据集的质量虽不如GPT-3,但LLaMA架构的优势在于其使用了Rotary Position Embedding,而GPT-2使用的是Learnable Position Embedding。
进一步测试不同大小模型的效果可以让我们浅窥Scaling Law。下图显示了不同模型参数量在相同训练配置下的HellaSwag效果。可以看到,当模型参数量较小时,架构细节并不太重要;参数量大的模型训练效果更好。在参数量接近的情况下,更合理的架构可能会带来细微的差别。然而,当前行业趋势还是倾向于通过更大规模的模型提升LLM的能力。我也认为,在小规模模型上过度优化架构不如寻找更基础的研究方向。
在这次探索中,我们从零开始预训练了一个语言模型。尽管本文中涉及的知识点还有很多没有详细讲解的地方,但我会在之后推出更多相关的实战文章,以补充这些内容。
• DDP训练与FSDP和TP:我们讨论了如何使用DDP进行训练。我简单的调整了DDP的llama训练代码,有一个FSDP实现[1]。FSDP会通过模型分片极大程度地减少每个GPU内存占用。此外,还有TP(Tensor Parallelism)等大规模并发训练结构,这些方法都可以显著提升训练效率和模型规模。
• MoE模型和多模态模型:目前在MoE(Mixture of Experts)模型和多模态模型方面有许多新进展,这也是一个非常有趣的讨论方向。我们可以通过实践进一步探索这些模型的应用和优化。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-02
不改一行代码,看透 AI Agent 的每一次调用
2026-07-02
AI 不缺智商缺纪律:一场 Harness 工程化实践
2026-07-02
天工 3.2 重磅升级:Skywork Tags 上线,给 Agent 一张工牌,邀其加入你的工作群聊
2026-07-02
Context Infra 会是 AI 领域的下一个热点
2026-07-01
一文了解|SkillScan 智能体技能安全扫描最佳实践
2026-07-01
协作的逆向演进:从 Agent 逻辑重构团队管理
2026-07-01
港科大郭毅可谈Agentic AI时代的核心命题:人机共生,人不可能退场
2026-07-01
Sonnet 5终于来了,然而Opus 4.8现在有点尴尬
2026-04-15
2026-04-07
2026-04-07
2026-04-24
2026-04-17
2026-04-05
2026-04-05
2026-04-14
2026-04-24
2026-04-22
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。