From 7127aa48b38af331b72f9d71238eaf1b7fa83667 Mon Sep 17 00:00:00 2001 From: KMnO4-zx <1021385881@qq.com> Date: Tue, 13 May 2025 20:10:12 +0800 Subject: [PATCH] =?UTF-8?q?docs=EF=BC=9A=E7=AC=AC=E4=BA=94=E7=AB=A0=20?= =?UTF-8?q?=E5=8A=A8=E6=89=8B=E6=90=AD=E5=BB=BA=E5=A4=A7=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87=E3=80=81=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/chapter5/第五章 动手搭建大模型.md | 43 ++++++++++++++++---------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/docs/chapter5/第五章 动手搭建大模型.md b/docs/chapter5/第五章 动手搭建大模型.md index ca0a52d..6b74489 100644 --- a/docs/chapter5/第五章 动手搭建大模型.md +++ b/docs/chapter5/第五章 动手搭建大模型.md @@ -2,7 +2,7 @@ ## 5.1 动手实现一个 LLaMA2 大模型 -Meta(原Facebook)于2023年2月发布第一款基于Transformer结构的大型语言模型-LLaMA,并于同年7月发布同系列模型-LLaMA2。我们在第四章已经学习了解的了LLM,记忆如何训练LLM等等。那本小节我们就来学习,如何动手写一个LLaMA2模型。 +Meta(原Facebook)于2023年2月发布第一款基于Transformer结构的大型语言模型LLaMA,并于同年7月发布同系列模型LLaMA2。我们在第四章已经学习了解的了LLM,记忆如何训练LLM等等。那本小节我们就来学习,如何动手写一个LLaMA2模型。 ### 5.1.1 定义超参数 @@ -102,7 +102,7 @@ orch.Size([1, 50, 288]) ### 5.1.3 构建 LLaMA2 Attention -在 LLaMA2 模型中,虽然只有 LLaMA2-70B模型使用了GQA(Group Query Attention),但我们选择使用GQA来构建我们的 LLaMA Attention 模块,它可以提高模型的效率,并节省一些显存占用。 +在 LLaMA2 模型中,虽然只有 LLaMA2-70B模型使用了分组查询注意力机制(Grouped-Query Attention,GQA),但我们依然选择使用 GQA 来构建我们的 LLaMA Attention 模块,它可以提高模型的效率,并节省一些显存占用。 #### 5.1.3.1 repeat_kv @@ -138,7 +138,7 @@ def repeat_kv(x: torch.Tensor, n_rep: int) -> torch.Tensor: #### 5.1.3.2 旋转嵌入 -接着我们来实现旋转嵌入,旋转嵌入是 LLaMA2 模型中的一个重要组件,它可以为attention机制提供更强的上下文信息,从而提高模型的性能。 +接着我们来实现旋转嵌入,旋转嵌入是 LLaMA2 模型中的一个重要组件,它可以为注意力机制提供更强的上下文信息,从而提高模型的性能。 首先,我们要构造获得旋转嵌入的实部和虚部的函数: @@ -337,7 +337,7 @@ class Attention(nn.Module): return output ``` -同样大家可以使用下面的代码来对`Attention`模块进行测试,可以看到代码最终输出的形状为`torch.Size([1, 50, 768])`,与我们输入的形状一致,说明模块的实现是正确的。 +同样大家可以使用下面的代码来对注意力模块进行测试,可以看到代码最终输出的形状为`torch.Size([1, 50, 768])`,与我们输入的形状一致,说明模块的实现是正确的。 ```python # 创建Attention实例 @@ -1054,7 +1054,6 @@ with open('BelleGroup_sft.jsonl', 'a', encoding='utf-8') as sft: ```bash python code/train_tokenizer.py - ``` ```python @@ -1324,9 +1323,12 @@ class PretrainDataset(Dataset): return torch.from_numpy(X), torch.from_numpy(Y), torch.from_numpy(loss_mask) ``` -在以上代码可以看出,我们的 `Pretrain Dataset` 主要是将 `text` 通过 `tokenizer` 转换成 `input_id`,然后将 `input_id` 拆分成 `X` 和 `Y`,其中 `X` 为 `input_id` 的前 n-1 个元素,`Y` 为 `input_id` 的后 n-1 `个元素。loss_mask` 主要是用来标记哪些位置需要计算损失,哪些位置不需要计算损失。如果你不太能明白,可以看下面的示意图。 +在以上代码和图5.1可以看出,`Pretrain Dataset` 主要是将 `text` 通过 `tokenizer` 转换成 `input_id`,然后将 `input_id` 拆分成 `X` 和 `Y`,其中 `X` 为 `input_id` 的前 n-1 个元素,`Y` 为 `input_id` 的后 n-1 `个元素。loss_mask` 主要是用来标记哪些位置需要计算损失,哪些位置不需要计算损失。 - +
+ 图5.1 预训练损失函数计算
+
+ 图5.2 SFT 损失函数计算
+