refact and fix bug

pull/214/head
mingkun 2025-02-25 23:25:06 +08:00
parent 9805b9cfc6
commit 14244bc23e
20 changed files with 58 additions and 57 deletions

View File

@ -132,7 +132,7 @@
" data = json.loads(line)\n",
" yield data['text']\n",
"\n",
"data_path = './demo/tokenizer_data.jsonl'"
"data_path = './toydata/tokenizer_data.jsonl'"
]
},
{
@ -220,7 +220,7 @@
{
"data": {
"text/plain": [
"['./demo/tokenizer_demo\\\\vocab.json', './demo/tokenizer_demo\\\\merges.txt']"
"['./model/toy_tokenizer\\\\vocab.json', './model/toy_tokenizer\\\\merges.txt']"
]
},
"execution_count": 8,
@ -231,7 +231,7 @@
"source": [
"import os\n",
"\n",
"tokenizer_dir = \"./demo/tokenizer_demo\"\n",
"tokenizer_dir = \"./model/toy_tokenizer\"\n",
"os.makedirs(tokenizer_dir, exist_ok=True)\n",
"tokenizer.save(os.path.join(tokenizer_dir, \"tokenizer.json\")) # At this point, you will see a file named tokenizer.json under tokenizer_dir\n",
"tokenizer.model.save(tokenizer_dir) # generate vocab.json & merges.txt"
@ -332,7 +332,7 @@
"source": [
"from transformers import AutoTokenizer\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(\"./demo/tokenizer_demo\")\n",
"tokenizer = AutoTokenizer.from_pretrained(\"./model/toy_tokenizer\")\n",
"msg = [{\"text\": \"失去的东西就要学着去接受,学着放下。\"}]\n",
"new_msg = tokenizer.apply_chat_template(\n",
" msg,\n",

View File

@ -27,7 +27,7 @@
"\n",
"作者提供了对其 MiniMind Dense Model 模型结构的可视化:\n",
"\n",
"![](../images/LLM-structure.png)"
"![image](../images/LLM-structure.png)"
]
},
{
@ -42,7 +42,7 @@
"import inspect\n",
"import time\n",
"\n",
"from demo.LMConfig import LMConfig\n",
"from model.LMConfig import LMConfig\n",
"from typing import Any, Optional, Tuple, List\n",
"import numpy as np\n",
"import torch\n",
@ -263,7 +263,7 @@
"\n",
"具体来说, GQA 中将 h 个查询头分为 G 组, 每组 包含 h / G 个查询头,并共享一个公共的键和值.\n",
"\n",
"![img](./demo/gqa.png)\n",
"![img](./images/gqa.png)\n",
"\n",
"GQA 相比传统的 MHA, 减少了键和值的数量,降低了计算量和内存开销,提高了推理速度.\n",
"\n",
@ -311,7 +311,6 @@
"metadata": {},
"outputs": [],
"source": [
"from demo.LMConfig import LMConfig\n",
"from typing import Any, Optional, Tuple, List\n",
"import torch.nn as nn\n",
"import math\n",
@ -800,9 +799,9 @@
"<------------ finished, size_cache_k = torch.Size([1, 1, 2, 64]), size_cache_v = torch.Size([1, 1, 2, 64])\n",
"<==== forward propagation completed, num_kv_cache = 2\n",
"\n",
"new tokens list :[tensor([[2747]]), tensor([[2065]]), tensor([[5211]])]\n",
"new tokens list :[tensor([[5081]]), tensor([[4500]]), tensor([[850]])]\n",
"\n",
"生成结果:tensor([[ 1, 3, 5, 7, 2747, 2065, 5211]])\n"
"生成结果:tensor([[ 1, 3, 5, 7, 5081, 4500, 850]])\n"
]
}
],
@ -988,9 +987,9 @@
"name": "stdout",
"output_type": "stream",
"text": [
"shape: topk_idx = torch.Size([64, 2]), topk_weight = torch.Size([64, 2]), aux_loss = 0.10118068754673004\n",
"token 0 选择的专家:idx = tensor([3, 2]), weight = tensor([3.7838e-21, 2.9849e-21], grad_fn=<SelectBackward0>)\n",
"辅助损失:aux_loss = 0.10118068754673004\n"
"shape: topk_idx = torch.Size([64, 2]), topk_weight = torch.Size([64, 2]), aux_loss = 0.10163114219903946\n",
"token 0 选择的专家:idx = tensor([2, 0]), weight = tensor([5.8955e-21, 1.9281e-21], grad_fn=<SelectBackward0>)\n",
"辅助损失:aux_loss = 0.10163114219903946\n"
]
}
],
@ -1364,9 +1363,9 @@
"<------------ finished, size_cache_k = torch.Size([1, 1, 2, 64]), size_cache_v = torch.Size([1, 1, 2, 64])\n",
"<==== forward propagation completed, num_kv_cache = 2\n",
"\n",
"new tokens list :[tensor([[1233]]), tensor([[2740]]), tensor([[2772]])]\n",
"new tokens list :[tensor([[4065]]), tensor([[431]]), tensor([[2541]])]\n",
"\n",
"生成结果:tensor([[ 1, 3, 5, 7, 1233, 2740, 2772]])\n"
"生成结果:tensor([[ 1, 3, 5, 7, 4065, 431, 2541]])\n"
]
}
],

View File

@ -99,7 +99,7 @@
],
"source": [
"# 我们可以查看一下 demo 中提供的数据\n",
"path_pretrain = './demo/pretrain_data.jsonl'\n",
"path_pretrain = './toydata/pretrain_data.jsonl'\n",
"\n",
"with open(path_pretrain, 'r', encoding='utf-8') as f:\n",
" for line_num, line in enumerate(f, 1):\n",
@ -228,7 +228,7 @@
],
"source": [
"# 我们可以查看一下 demo 中提供的数据\n",
"path_sft = './demo/sft_data.jsonl'\n",
"path_sft = './toydata/sft_data.jsonl'\n",
"\n",
"with open(path_sft, 'r', encoding='utf-8') as f:\n",
" for line_num, line in enumerate(f, 1):\n",
@ -391,7 +391,7 @@
],
"source": [
"# 我们可以查看一下 demo 中提供的数据\n",
"path_dpo = './demo/dpo_data.jsonl'\n",
"path_dpo = './toydata/dpo_data.jsonl'\n",
"\n",
"with open(path_sft, 'r', encoding='utf-8') as f:\n",
" for line_num, line in enumerate(f, 1):\n",

View File

@ -37,9 +37,9 @@
"\n",
"from transformers import AutoTokenizer\n",
"\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import PretrainDataset"
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import PretrainDataset"
]
},
{
@ -90,7 +90,7 @@
" n_layers: int = 2 # MiniMind Block 数量 模型超参数\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/pretrain_data.jsonl' # 数据集路径"
" data_path: str = './toydata/pretrain_data.jsonl' # 数据集路径"
]
},
{
@ -147,7 +147,7 @@
"output_type": "stream",
"text": [
"LLM总参数量:8.915 百万\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000001E4890FE1D0>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000001C6BF33F280>\n"
]
}
],
@ -171,7 +171,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 7,
"id": "60c8c970-f448-4ea0-b21b-8f929e03f6fa",
"metadata": {},
"outputs": [
@ -331,7 +331,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch:[1/1](0/1) loss:8.853 lr:0.000550000000 epoch_Time:0.0min:\n"
"Epoch:[1/1](0/1) loss:8.959 lr:0.000550000000 epoch_Time:0.0min:\n"
]
}
],
@ -343,7 +343,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 11,
"id": "6f257b9e-3a1e-4686-9516-3f9eeb7d0654",
"metadata": {},
"outputs": [],

View File

@ -39,9 +39,9 @@
"from torch.nn.parallel import DistributedDataParallel\n",
"from torch.utils.data import DataLoader, DistributedSampler\n",
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import SFTDataset"
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import SFTDataset"
]
},
{
@ -92,7 +92,7 @@
" n_layers: int = 2 # MiniMind Block 数量 模型超参数\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/sft_data.jsonl' # 数据集路径"
" data_path: str = './toydata/sft_data.jsonl' # 数据集路径"
]
},
{
@ -155,7 +155,7 @@
"output_type": "stream",
"text": [
"LLM总参数量:8.915 百万\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000002D0DD01D600>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x0000024234BBE950>\n"
]
}
],
@ -341,7 +341,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch:[1/1](0/1) loss:8.869 lr:0.000550000000 epoch_Time:0.0min:\n"
"Epoch:[1/1](0/1) loss:8.902 lr:0.000550000000 epoch_Time:0.0min:\n"
]
}
],

View File

@ -39,9 +39,9 @@
"from torch.nn.parallel import DistributedDataParallel\n",
"from torch.utils.data import DataLoader, DistributedSampler\n",
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import DPODataset"
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import DPODataset"
]
},
{
@ -93,7 +93,7 @@
" n_layers: int = 1 # MiniMind Block 数量 模型超参数 | 由于 dpo 要加载两个模型 我们出于演示目的设定 n_layers = 1\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/dpo_data.jsonl' # 数据集路径"
" data_path: str = './toydata/dpo_data.jsonl' # 数据集路径"
]
},
{
@ -165,7 +165,7 @@
"output_type": "stream",
"text": [
"LLM总参数量:6.096 百万\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x00000264370DC7F0>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000001AF0BBB71C0>\n"
]
}
],

View File

@ -13,7 +13,7 @@
"\n",
"具体来说,LoRA 它冻结了预训练模型 W 的权重,并注入可训练的秩分解矩阵 A 与 B,在微调时,只训练降维矩阵 A 和 升维矩阵 B,微调结束后,将 AB 与 W 进行叠加.\n",
"\n",
"![image](./demo/lora.png)\n",
"![images](./images/lora.png)\n",
"\n",
"其中,用随机高斯分布进行初始化 A,用 0 矩阵初始化 B,从而保证训练开始时旁路矩阵为 0 矩阵.\n",
"\n",
@ -142,7 +142,9 @@
"cell_type": "code",
"execution_count": 5,
"id": "eb24e24f-da09-4cd7-b4ce-7fe482194f75",
"metadata": {},
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
@ -237,9 +239,9 @@
"from contextlib import nullcontext\n",
"from torch.utils.data import DataLoader, DistributedSampler\n",
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import SFTDataset\n",
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import SFTDataset\n",
"\n",
"warnings.filterwarnings('ignore')"
]
@ -282,7 +284,7 @@
" n_layers: int = 2 # MiniMind Block 数量 模型超参数\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/lora_data.jsonl' # 数据集路径\n",
" data_path: str = './toydata/lora_data.jsonl' # 数据集路径\n",
" lora_name: str = 'lora_identity' # 根据任务保存成lora_(英文/医学/心理...)"
]
},
@ -344,7 +346,7 @@
"apply lora on module: layers.0.attention.wo\n",
"apply lora on module: layers.1.attention.wq\n",
"apply lora on module: layers.1.attention.wo\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x0000018FB27CA050>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x0000022F5786D4E0>\n"
]
}
],
@ -540,7 +542,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch:[1/1](0/1) loss:8.894 lr:0.000550000000 epoch_Time:0.0min:\n"
"Epoch:[1/1](0/1) loss:8.883 lr:0.000550000000 epoch_Time:0.0min:\n"
]
}
],

View File

@ -39,9 +39,9 @@
"from torch.nn.parallel import DistributedDataParallel\n",
"from torch.utils.data import DataLoader, DistributedSampler\n",
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import SFTDataset\n",
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import SFTDataset\n",
"\n",
"warnings.filterwarnings('ignore')"
]
@ -84,7 +84,7 @@
" n_layers: int = 2 # MiniMind Block 数量 模型超参数\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/sft_data.jsonl' # 数据集路径"
" data_path: str = './toydata/sft_data.jsonl' # 数据集路径"
]
},
{
@ -157,7 +157,7 @@
"text": [
"学生模型(LLM)总参数量:6.096 百万\n",
"教师模型(LLM)总参数量:17.305 百万\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000002AE220D7880>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x0000021E5B6E7010>\n"
]
}
],
@ -373,7 +373,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch:[0/0](0/1) loss:0.3301 lr:0.000550000000 epoch_Time:0.0min:\n"
"Epoch:[0/0](0/1) loss:0.3257 lr:0.000550000000 epoch_Time:0.0min:\n"
]
}
],

View File

@ -49,9 +49,9 @@
"from torch.nn.parallel import DistributedDataParallel\n",
"from torch.utils.data import DataLoader, DistributedSampler\n",
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
"from demo.model import MiniMindLM\n",
"from demo.LMConfig import LMConfig\n",
"from demo.dataset import SFTDataset\n",
"from model.model import MiniMindLM\n",
"from model.LMConfig import LMConfig\n",
"from model.dataset import SFTDataset\n",
"\n",
"warnings.filterwarnings('ignore')"
]
@ -94,7 +94,7 @@
" n_layers: int = 2 # MiniMind Block 数量 模型超参数\n",
" max_seq_len: int = 512 # 序列长度阈值\n",
" use_moe: bool = False # 是否启用混合专家\n",
" data_path: str = './demo/r1_data.jsonl' # 数据集路径"
" data_path: str = './toydata/r1_data.jsonl' # 数据集路径"
]
},
{
@ -154,7 +154,7 @@
"output_type": "stream",
"text": [
"LLM总参数量:8.915 百万\n",
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x0000021EAB98B940>\n"
"模型位于设备:cuda:0, 词表长度:6400, DataLoader:<torch.utils.data.dataloader.DataLoader object at 0x000001DAD0FFD630>\n"
]
}
],
@ -314,7 +314,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch:[1/1](0/1) loss:11.907 lr:0.000550000000 epoch_Time:0.0min:\n"
"Epoch:[1/1](0/1) loss:11.656 lr:0.000550000000 epoch_Time:0.0min:\n"
]
}
],

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB