【收藏向】从零构建230万参数小型语言模型(LLaMA架构,小白可实操,无高端GPU也能练)
本文详细拆解如何从零搭建一个仅230万参数的小型语言模型,全程复用LLaMA架构核心技术——RMSNorm前归一化、SwiGLU激活函数、RoPE旋转位置编码,配套完整可复制代码,采用TinyShakespeare数据集完成全流程训练,同时补充模型扩展技巧与性能验证方案。无论你是刚入门的编程小白,还是想入门大模型的程序员,都能跟着步骤一步步实操,无需高端GPU,轻松体验亲手构建大模型的乐趣,建议收藏备用,反复学习实践。
1、引言
搭建属于自己的大型语言模型(LLM),听起来像是大厂专属的“高端操作”——谷歌、Meta等企业陆续推出70亿、130亿甚至700亿参数的模型,就连开源社区也在不断迭代各类LLM变体。你可能看过不少关于“自制LLM”的文章或视频,但大多停留在理论层面,要么跳过关键实操步骤,要么代码碎片化,小白跟着练很容易卡壳。
今天这篇教程,就彻底打破“LLM搭建门槛高”的误区:我们将搭建一个仅230万参数的轻量化LLM,以LLaMA 1论文为核心参考,简化复杂逻辑但保留核心原理,选用小型开源数据集,无需高端GPU,普通电脑就能跑通全流程。
重点:全程代码可复制、步骤无跳跃,小白也能从零到一完成搭建,程序员可收藏作为大模型入门实操案例,话不多说,直接上手!
2、了解LLama结构
在使用 LLaMA 方法创建我们自己的 LLM 之前,有必要了解一下 LLaMA 的架构。下面是原始Transformer结构和 LLaMA结构 的对比图。

以下我们来逐章节介绍一下 LLaMA 结构中的改进点。
3、使用RMSNorm进行前归一化
在 LLaMA 结构中,采用了一种名为 RMSNorm 的技术,对每个Transformer子层的输入进行归一化处理。这种方法受到 GPT-3 的启发,旨在优化与LayerNorm相关的计算成本。RMSNorm 的性能与 LayerNorm 相似,但运行时间大大缩短(7%∼64%)。

为此,RMSNorm强调重新缩放不变性,并根据均方根(RMS)统计量调节输入总和。其主要动机是通过去除均方根统计量来简化 LayerNorm。
4、采用SwiGLU激活函数
LLaMA 从 PaLM结构中汲取灵感,引入了 SwiGLU 激活函数。要理解 SwiGLU,首先必须掌握 Swish 激活函数。SwiGLU 对 Swish 进行了扩展,包括一个带有密集网络的自定义层,用于对输入激活进行拆分和乘法运算。

其目的是通过引入更复杂的激活函数来增强模型的表现力。有关 SwiGLU 的更多详情,请参阅相关论文。
论文链接:https://arxiv.org/pdf/2002.05202v1
5、采用RoPE位置编码
旋转位置编码RoPE 是 LLaMA 中使用的一种位置嵌入。它使用旋转矩阵对绝对位置信息进行编码,并在自注意公式中自然地包含明确的相对位置依赖性。RoPE 具有多种优势,例如可扩展到各种序列长度,并且随着相对距离的增加,Token间的依赖性会逐渐减弱。
这是通过与旋转矩阵相乘对相对位置进行编码来实现的,从而产生衰减的相对距离–这是自然语言编码的理想特性。对数学细节感兴趣的人可以参阅 RoPE 论文。
论文:https://arxiv.org/pdf/2104.09864v4
除这些概念外,LLaMA 论文还介绍了其他重要方法,包括使用带有特定参数的 AdamW 优化器、高效实现(如 xformers 库中的因果多头注意力算子),以及手动实现Transformer层的后向传播函数,以优化后向传播过程中的计算。
6、导入基本库
在简单介绍了基本理论后,我们接着来编写代码,首先导入我们的基本依赖库:
# PyTorch for implementing LLM (No GPU)
此外,我们创建一个存储模型参数配置的字典对象。
# Configuration object for model parameters
这种方法保持了灵活性,允许在未来根据需要添加更多参数配置。
7、下载数据集
在最初的 LLaMA 论文中,他们采用了多种开源数据集来训练和评估模型。

遗憾的是,对于小型项目来说,利用大量数据集可能并不现实。因此,在我们的实施过程中,我们将采取一种更为温和的方法,创建一个大幅缩减的 LLaMA 版本。
考虑到无法获取海量数据的限制,我们将重点使用 TinyShakespeare 数据集训练简化版的 LLaMA。
链接:https://github.com/karpathy/char-rnn/blob/master/data/tinyshakespeare/input.txt
该开源数据集可在上述链接获取,包含约 40,000 行来自莎士比亚各种作品的文本。
LLaMA 是在一个包含 1.4 万亿个字符的庞大数据集上进行训练的,而我们的数据集 TinyShakespeare 包含约 100 万个字符。首先,让我们下载数据集:
# The URL of the raw text file on GitHub
该 Python 脚本从指定的 URL 获取 tinyshakespeare 数据集,并以文件名 "tinyshakespeare.txt "保存到本地。
接下来,让我们确定词汇量的大小,它代表了数据集中唯一的字符数。下面是统计代码片段:
# Read the content of the dataset

接着,我们要在整数到字符 (itos) 和字符到整数 (stoi) 之间创建映射。代码如下:
# Mapping integers to characters (itos)

8、定义编解码函数
在最初的 LLaMA 论文中,使用了谷歌的 SentencePiece 字节对编码Tokenizer。不过,为了简单起见,我们将选择基本的字符级Tokenizer。让我们创建编码和解码函数,随后将其应用于我们的数据集:
# Encode function: Converts a string to a list of integers using the mapping stoi
最后一行将输出单词moning,以确认编码函数和解码函数的正常运行。
现在,我们将数据集转换为 torch 张量,指定其数据类型,以便使用 PyTorch 进行进一步操作:
# Convert the dataset into a torch tensor with specified data type (dtype)
输出结果 torch.Size([1115394])显示,我们的数据集包含约一百万个Tokens。值得注意的是,这比包含 1.4 万亿个Tokens的 LLaMA 数据集要小得多。
9、拆分数据集
接着,我们将创建一个函数,负责将数据集拆分为训练集、验证集或测试集。在机器学习或深度学习项目中,这种拆分对于开发和评估模型至关重要,同样的原则也适用于大型语言模型(LLM)的训练过程:
# Function to get batches for training, validation, or testing
既然我们已经定义了切分函数,那么让我们来确定两个对这一过程至关重要的参数:
# Update the MASTER_CONFIG with batch_size and context_window parameters
batch_size 决定每次随机切分处理多少个批次,而 context_window 则指定每个批次的每个输入 (x) 和目标 (y) 序列中的字符数。
让我们以数据集的第 8 个批次和上下文窗口为16的训练集中打印一个随机样本:
# Obtain batches for training using the specified batch size and context window
结果如下:

10、评估策略
现在,我们将创建一个函数,专门用于评估我们自创的 LLaMA 架构。之所以要在定义实际模型方法之前这样做,是为了在训练过程中进行持续评估。
@torch.no_grad() # Don't compute gradients for this function
在训练迭代过程中,我们使用损失作为评估模型性能的指标。我们的函数迭代训练和验证集,计算每次拆分 10 次的平均损失,最后返回结果。然后使用 model.train() 将模型设置回训练模式。
11、建立基础神经网络
首先我们来构建一个基本的神经网络,稍后将利用 LLaMA 技术对其进行改进。
# Definition of a basic neural network class
在当前的架构中,嵌入层的词汇量为 65 个,代表了我们数据集中的字符数目。由于这是我们的基础模型,我们在线性层中使用 ReLU 作为激活函数;不过,稍后将用 LLaMA 中使用的 SwiGLU 代替。
要为基础模型创建前向传递,我们必须在 NN 模型中定义一个forward函数。
# Definition of a basic neural network class
这个前向传递函数将字符索引(idx)作为输入,应用嵌入层,将结果传递给线性层,应用 softmax 激活以获得概率分布(logits)。如果提供了目标,它会计算交叉熵损失,并同时返回 logits 和损失。如果没有提供目标,则只返回预测logits。
要实例化该模型,我们可以直接调用该类,并打印 "简单神经网络模型 "中的参数总数。我们将线性层的维数设置为 128,并在配置对象中指定了这一数值:
# Update MASTER_CONFIG with the dimension of linear layers (128)

可以看到,我们的简单神经网络模型包含约 33,000 个参数。
12、训练基础神经网络
在定义了基本的神经网络结构后,为了计算损失,我们只需将拆分后的数据集输入模型即可:
# Obtain batches for training using the specified batch size and context window
为了训练该基础模型并记录其性能,我们需要指定一些参数。我们总共要训练 1000 个epoch。将batchsize从 8 增加到 32,并将 log_interval 设置为 10,表示代码将每 10 个批次打印或记录一次训练进度信息。在优化方面,我们将使用 Adam 优化器。
# Update MASTER_CONFIG with training parameters
让我们执行训练过程,记录该基础模型的损失,包括参数总数。此外,为清晰起见,每一行都有注释:
# Function to perform training

训练前的初始交叉熵损失为 4.17,100 个epoch后基本收敛降至 3.93。
我们的基础模型在logits 后面加入了一个 softmax 层,将数字向量转换为概率分布。此外,我们在使用内置的 F.cross_entropy 函数时可以直接输入非规范化的 logits。因此,我们将对模型进行相应修改。
# Modified SimpleModel class without softmax layer
让我们重新创建更新后的 SimpleModel,并对其进行 1000个 epoch训练,以观察其变化:
# Create the updated SimpleModel

100个epoch后将损失减小到 2.51 后,让我们来探索一下拥有约 33,000 个参数的语言模型如何在推理过程中生成文本。我们将创建一个 "generate "函数,代码如下:
# Generate function for text generation using the trained model

我们的基本模型大约有 33K 个参数,生成的文本看起来并不出色。不过,既然我们已经为这个简单的模型奠定了基础,下一节我们将继续构建 LLaMA 架构。
13、复现LLama结构
在本文的前半部分,我们介绍了基本概念,现在,我们将把这些概念整合到我们的基础模型中。LLaMA 在原有 Transformer 的基础上引入了三项架构修改:
- 用于前归一化的 RMSNorm
- 旋转位置编码
- SwiGLU 激活函数
我们将把这些修改逐一纳入基础模型,并在此基础上不断迭代和完善。
- RMSNorm 用于前归一化:
我们正在定义一个具有以下功能的 RMSNorm 函数:
classRMSNorm(nn.Module):
我们定义了 RMSNorm 类。在初始化过程中,它会注册一个scale参数。在前向传递过程中,它会对张量进行归一化处理。最后,根据注册的scale参数对张量进行缩放。该函数设计用于 LLaMA,以取代 LayerNorm 操作。
现在是时候将 LLaMA 的第一个实现概念 RMSNorm 融入我们的简单 NN 模型了。下面是更新后的代码:
# Define the SimpleModel_RMS with RMSNorm
让我们使用 RMSNorm 执行修改后的 NN 模型,并观察模型中更新的参数数量和损失:
# Create an instance of SimpleModel_RMS

100个epoch后验证损失略有减少,更新后的 LLM 参数总数约为 55 000 个。
14、RoPE效果验证
接下来,我们将实现旋转位置嵌入。在 RoPE 中,作者建议通过旋转嵌入来嵌入序列中Token的位置信息,并在每个位置应用不同的旋转。让我们创建一个函数,模仿论文中 RoPE 的实际实现:
def get_rotary_matrix(context_window, embedding_dim):
我们根据指定的上下文窗口和嵌入维度,按照建议的 RoPE 实现方法生成旋转矩阵。
大家可能对Transformer的架构并不陌生,其中涉及注意力头,因此在实现 LLaMA 时,我们同样需要创建注意力头。此外,为了清晰起见,每一行都有注释:
classRoPEAttentionHead(nn.Module):
现在,我们有了一个返回注意力权重的单头屏蔽注意力头,下一步就是创建一个多头注意力机制。
classRoPEMaskedMultiheadAttention(nn.Module):
原论文在较小的 7b LLM 变体中使用了 32 个head,但由于条件限制,我们的方法将使用 8 个head。
# Update the master configuration with the number of attention heads
现在我们已经实现了旋转位置嵌入和多头注意力,让我们用更新后的代码重新编写 RMSNorm 神经网络模型。我们将测试其性能、计算损失并检查参数数量。我们将把更新后的模型称为 “RopeModel”。
classRopeModel(nn.Module):
让我们使用 RMSNorm、旋转位置嵌入和多头注意力来执行修改后的 NN 模型,以观察模型中参数数量的更新情况以及损失情况:
# Create an instance of RopeModel (RMSNorm, RoPE, Multi-Head)

100个epoch后验证损失再次出现小幅下降,更新后的 LLM 参数总数约为 55 000。让我们对模型进行更多的epoch训练,看看重新创建的 LLaMA LLM 的损失是否会继续减少。
# Updating training configuration with more epochs and a logging interval

500个epoch后验证损失继续减少,这表明进行更多的epoch训练可以进一步减少损失,尽管减少的幅度不大。
15、采用SwiGLU激活函数
如前所述,LLaMA 的创建者使用 SwiGLU 而不是 ReLU,因此我们将在代码中实现 SwiGLU 方程。

代码实现如下:
classSwiGLU(nn.Module):
接着我们需要将其集成到修改后的 LLaMA 语言模型(RopeModel)中。
classRopeModel(nn.Module):
让我们使用 RMSNorm、旋转嵌入、多头注意力和 SwiGLU 来执行修改后的 NN 模型,以观察模型中参数数量的更新情况以及损失情况:
# Create an instance of RopeModel (RMSNorm, RoPE, Multi-Head, SwiGLU)

在训练500个epoch后,验证损失再次出现小幅下降,更新后的 LLM 参数总数约为 60,000 个。
到目前为止,我们已经成功实现了本文的关键部分,即 RMSNorm、RoPE 和 SwiGLU。我们注意到,这些实施方法使损失减少到最低程度。
16、扩大模型规模
现在,我们将为 LLaMA 增加层数,以检验其对损失的影响。原论文的 7b 版本使用了 32 个Transformer Block Layer,但我们将只使用 4 个。让我们相应地调整模型设置。
# Update model configurations for the number of layers
让我们先创建一个Transformer Block,了解它的影响。
# add RMSNorm and residual connection
创建 LlamaBlock 类的实例,并将其应用于随机张量。
# Create an instance of the LlamaBlock class with the provided configuration
在成功创建了单层之后,我们现在可以用它来构建多层。此外,我们将把模型类从 "ropemodel "更名为 “Llama”,因为我们已经实现了 LLaMA 语言模型的每个组件。
classLlama(nn.Module):
让我们使用 RMSNorm、旋转嵌入、多头注意力、SwiGLU 和 N_layers 执行修改后的 LLaMA 模型,以观察模型中更新的参数数量和损失:
# Create an instance of RopeModel (RMSNorm, RoPE, Multi-Head, SwiGLU, N_layers)

虽然存在过拟合的可能性,但关键是要探索延长epoch数目是否会进一步减少损失。此外,请注意我们目前的 LLM 有 200 多万个参数。
让我们用更多的epoch来训练它。
# Update the number of epochs in the configuration

这里的损失为 1.08,我们可以获得更低的损失,而不会遇到明显的过拟合。这表明该模型表现良好。
17、推理验证
到目前为止,我们已经在自定义数据集上成功实现了 LLaMA 架构的缩小版。现在,让我们检查一下 200 万参数语言模型的生成输出。
# Generate text using the trained LLM (llama) with a maximum of 500 tokens

尽管生成的一些单词可能不是完美的英语,但我们的 LLM 仅用 200 万个参数就显示出了对英语的基本理解。
现在,让我们看看我们的模型在测试集上的表现如何。
# Get batches from the test set
测试集的计算损失约为 1.236。
18、超参数实验
超参数调整是训练神经网络的关键步骤。在最初的 Llama 论文中,作者使用了余弦退火学习策略。然而,在我们的实验中,它的表现并不理想。下面是一个使用不同学习策略进行超参数实验的例子:
# Update configuration
19、保存模型
大家可以使用以下方法保存整个 LLM :
# Save the entire model
要为 Hugging Face 的 Transformers 库保存 PyTorch 模型,可以使用 save_pretrained 方法。下面是一个例子:
from transformers import GPT2LMHeadModel, GPT2Config
GPT2Config 用于创建与 GPT-2 兼容的配置对象。然后,创建 GPT2LMHeadModel 并加载 Llama 模型的权重。最后,调用 save_pretrained 将模型和配置保存在指定目录中。
然后就可以使用Transformer库加载模型了:
from transformers import GPT2LMHeadModel, GPT2Config
20、结论
在本文中,我们逐步介绍如何采用 LLaMA 方法来构建自己的小型语言模型 (LLM)。作为建议,您可以考虑将模型扩展到 1,500 万个参数左右,因为 1,000 万到 2,000 万个参数范围内的小型模型往往能更好地理解英语。
希望本文能为大家提供复现论文以创建个性化LLM的参考。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包:
- ✅ 从零到一的 AI 学习路径图
- ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
- ✅ 百度/阿里专家闭门录播课
- ✅ 大模型当下最新行业报告
- ✅ 真实大厂面试真题
- ✅ 2026 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》,下方扫码获取~

① 全套AI大模型应用开发视频教程
(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

以上资料如何领取?

为什么大家都在学大模型?
最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!


这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


以上全套大模型资料如何领取?

更多推荐


所有评论(0)