minimind
minimind copied to clipboard
[FEATURE] 以交互笔记本方式分解项目代码,进一步降低学习门槛
尊敬的 MiniMind 项目作者, 您好!
首先感谢您开源了这样一个宝藏项目,MiniMind 项目大大降低了大语言模型的实践门槛,项目清晰的代码结构也为源码层面的学习提供了不少帮助!
我在学习 MiniMind 项目的过程中意识到,由于大模型训练的多阶段性,包括我在内的初学者往往会倾向于体验大模型在每个阶段的训练过程(比如简单地在命令行启动脚本,然后 wandb 观察损失),而对准备工作与训练细节疏于考虑。同时,对于想学习项目代码的初学者来说,直接阅读源码难度较高,调试项目代码则可能面对数据量大、文件多码量大、逻辑复杂等问题,而且在 GPU 服务器上调试代码意味着付出的时间成本会转化为实际支出,显得不太友好。
我认为,在项目中添加 Juypter Notebook 运行示例,对项目代码进行分解,更有利于初学者在源码层面展开学习,根据这一想法,我已经完成了部分项目代码的分解,以下是一些具体信息。
目的
通过 Jupyter Notebook 交互式笔记本与尽可能简单的数据集 demo,将训练一个大模型的全流程分解为多个 Notebook,涵盖 tokenizer、model、dataset 等模块的构建与 pretrain、sft、dpo 等训练阶段的过程展示。
通过提供的笔记本,学习者可以深入代码层面展开学习,获取接近上手调试的学习体验;同时,降低 demo 中模型和数据集的大小,且只保留发挥主要功能的代码片段,从而使得 Notebook 可以在个人 PC 运行,降低了运行门槛。
优势
- 相对隔离:笔记本集中存放在
/minimind/notebook
文件夹中,不破坏 MiniMind 项目整体结构的和谐优雅。 - 线性逻辑:笔记本的所有代码均为顺序构建,顺序运行 notebook 代码块即可完成对大模型各流程的简单实践。
- 轻量化:在 MiniMindLM 架构基础上,减小模型大小并提供简单的 demo 数据集,进一步降低了运行门槛,在个人 PC 上即可运行。
- 知识点介绍与适当注解:Notebook 中提供了代码片段对应知识点的简要介绍,同时在相对难以理解的部分进行注释,降低学习门槛。
- 可交互:读者可以很方便地对各个代码块进行修改和赋值,或者在模块内部添加打印语句进行观察理解。
当前进度
目前已经完成的内容有:
- Tokenizer: 在包含两条文本片段的 jsonl 格式数据集上训练一个简单的 tokenizer,提供编解码的示例。
- MiniMindLM (Dense): 完成了 MiniMind dense model 的模块化拆解,提供在各模块直接进行前向传播观察张量信息的示例。
- Dataset: 完成对 Pretrain、SFT、DPO 阶段数据集对象的解读,提供查看各阶段数据集内部结构的示例。
- Pretrain: 完成了预训练阶段的代码拆解,提供在长度为 2 的预训练数据集上训练 1 epoch、1 iter 的示例。
- SFT: 完成了 SFT 阶段的代码拆解,提供在长度为 2 的 SFT 数据集上训练 1 epoch、1 iter 的示例。
- DPO: 完成了 DPO 阶段的代码拆解,提供在长度为 2 的 DPO 数据集上训练 1 epoch、1 iter 的示例。
未来规划
接下来,计划继续基于 Jupyter Notebook 完成以下任务:
- MiniMindLM (MOE) 模型结构分解学习
- LORA 微调部分训练代码与 LoRA Adaper 模型结构分解学习
- 模型蒸馏部分代码的分解学习
- 跟随项目更新进度进行更多任务代码的分解学习
效果展示
-
/minimind/notebook/2_dataset.ipynb
文件部分内容展示
-
/minimind/notebook/4_sft.ipynb
文件部分内容展示