如何从零打造一个极简的DeepSeek-R1大模型
本文旨在记录和分享如何依据开源项目minimind,从零开始完整地训练一个极简的大语言模型。minimind这个开源项目的目标是以极低的成本(约3块钱)和极短的时间(2小时)训练出一个仅有25.8M的超小型语言模型MiniMind。
这篇文章将重点关注整个大模型训练的完整流程,而非追求模型的极致性能。

一、 准备工作:高性价比的算力平台
要训练模型,首先需要GPU算力。本次实践选用的是GpuGeek算力市场。
• 选择GPU:平台提供了多种GPU选项,其中 RTX-A5000-24G 显卡性价比极高。它的单精度浮点性能达到27.8 TFLOPS,显存带宽768 GB/s,性能约为RTX 3090的80%,但价格却便宜很多,非常适合个人开发者和算法工程师进行模型迭代。

• 创建实例:在GpuGeek官网注册并完成实名认证后,进入控制台创建一个GPU实例。选择RTX-A5000-24G显卡,系统会自动创建容器实例,并支持SSH、JupyterLab等多种登录方式。
• 扩展数据盘:为了确保后续数据集和模型权重的存储空间充足,可以根据需要扩展数据盘。例如,扩展100GB的成本非常低廉。
二、 数据集准备:MiniMind开源数据集
minimind项目非常贴心地开源了预训练、微调和强化学习所需的全部数据集,省去了繁琐的数据预处理工作。
• 数据集简介:
◦ pretrain_hq.jsonl: 用于模型预训练阶段。
◦ sft_mini_512.jsonl: 用于SFT(监督微调)阶段,整合了匠数科技SFT数据和Qwen2.5蒸馏数据。
◦ dpo.jsonl: 用于RLHF(强化学习)阶段。
◦ r1_mix_1024.jsonl: DeepSeek-R1-1.5B蒸馏数据,这是训练推理模型的关键。
你可以打开这些数据集的具体内容,以便领会每个训练阶段的数据集不同格式。

• 下载数据集:
-
安装modelscope库:pip install modelscope。
-
进入数据盘目录(如 /gz-data),使用以下命令下载完整数据集:
-
GpuGeek平台的网络速度很快,可以有效避免下载焦虑。
下面的流程图让我们对每个数据集在训练阶段的作用更加清晰:

三、 训练流程:三步构建大模型
首先,需要下载minimind项目代码,并准备好运行环境。
-
克隆项目代码:
-
这里使用了ghfast.top来加速GitHub的下载。
-
安装依赖:
-
注意:为了避免安装失败,建议去掉requirements.txt文件中各个库的版本号限制。
-
移动数据集:将下载好的数据集文件移动到项目代码的dataset目录下。

接下来,就可以按照大模型训练的经典三阶段流程开始训练了。所有训练脚本都位于trainer目录下。
第一阶段:预训练 (Pre-training) - 学知识
此阶段让模型学习语言的基本规律和世界知识。
执行后会得到预训练权重文件 pretrain_*.pth。


第二阶段:指令微调 (SFT) - 学对话
此阶段教模型理解并遵循人类的指令,进行对。
执行后会得到全参数微调后的权重文件 full_sft_*.pth。
第三阶段:强化学习 (RLHF) - 学偏好
通过DPO(Direct Preference Optimization)算法,让模型的回答更符合人类的偏好。
四、 核心技巧:训练符合特定格式的推理模型
为了让模型能像DeepSeek-R1那样生成带有和标签的回复,需要进行蒸馏训练。
• 回复模板:推理模型R1的回复遵循以下模板:
• 这个模板通过在强化学习阶段设置规则奖励函数来约束模型。
• 损失惩罚技巧:实验发现,仅通过SFT式的蒸馏,模型很难稳定地遵循上述模板。minimind项目采用了一个小技巧:在训练脚本 train_distill_reason.py 中,对标记位置的token(如)增加损失惩罚。通过提高这些关键token的损失权重,强制模型学会生成指定的格式。
下面是类似R1的训练数据格式:
在训练数据里有和两个部分,训练之后,我们可以在out目录得到四个模型权重:

五、 测试与总结
训练完成后,out目录下会生成四个模型权重。可以使用eval_model.py脚本来测试模型的效果。尽管由于参数量小,模型的回答可能比较简短,但它已经能够成功回答问题,完整地走完了整个训练流程。
通过这个项目,我们不仅可以动手实践大模型的完整训练过程,还能深入理解其背后的源码实现,例如其基于Transformer并包含MoE(混合专家系统)功能的MiniMind模型架构。
建议对源码进行深入阅读,以获得更深刻的理解。