模型介绍
中文整理[](https://github.com/jingyaogong/minimind/stargazers)
[](LICENSE)
[](https://github.com/jingyaogong/minimind/commits/master)
[](https://github.com/jingyaogong/minimind/pulls)
[](https://huggingface.co/collections/jingyaogong/minimind-66caf8d999f5c7fa64f399e5)
"大道至简"
中文 English
此开源项目旨在完全从 0 开始,仅用 3 块钱成本与 2 小时训练时间,即可训练出规模约为 64M 的超小语言模型 MiniMind。
MiniMind 系列极其轻量,主线最小版本体积约为 GPT-3 的 $\frac{1}{2700}$,力求让普通个人 GPU 也能快速完成训练与复现。
项目同时开源了大模型的极简结构与完整训练链路,覆盖 MoE、数据清洗、预训练(Pretrain)、监督微调(SFT)、LoRA、RLHF(DPO)、RLAIF(PPO / GRPO / CISPO)、Tool Use、Agentic RL、自适应思考与模型蒸馏等全过程代码。
MiniMind 同时拓展了视觉多模态版本 MiniMind-V。
项目所有核心算法代码均从 0 使用 PyTorch 原生实现,不依赖第三方库提供的高层抽象接口。
这不仅是一个大语言模型全阶段开源复现项目,也是一套面向 LLM 入门与实践的教程。
希望此项目能为更多人提供一个可复现、可理解、可扩展的起点,一起感受创造的乐趣,并推动更广泛 AI 社区的进步。
注:本项目基于 Apache 2.0 协议开源,完全免费;“2小时” 基于 NVIDIA 3090 硬件设备(单卡)预估,“3块钱” 指 GPU 服务器租用成本,具体规格详情见下文。
🔗 在线体验 🔗 视频介绍
📌 项目介绍
大语言模型(Large Language Model, LLM)的出现,引发了全球范围内对 AI 的空前关注。无论是 ChatGPT、DeepSeek 还是 Qwen,都以惊艳的效果让人真切感受到这场技术浪潮的冲击力。然而,动辄数百亿参数的模型规模,使得它们对个人设备而言不仅难以训练,甚至连部署都显得遥不可及。打开大模型的“黑盒子”,真正去理解其内部运作机制,本应是一件令人心潮澎湃的事。遗憾的是,绝大多数探索最终都止步于使用 LoRA 等技术对现有大模型做少量微调,学习一些新指令或特定任务。这更像是在教牛顿如何使用 21 世纪的智能手机——虽然有趣,却偏离了理解物理本质的初衷。
与此同时,第三方的大模型框架与工具库,如 transformers / trl / peft 等,往往只暴露出高度抽象的接口。只需短短十几行代码,就可以完成“加载模型 + 加载数据集 + 推理 + 强化学习”的全流程训练。这种高效封装固然便利,却也在一定程度上把开发者与底层实现隔离开来,削弱了深入理解 LLM 核心代码的机会。我认为 “用乐高自己拼出一架飞机,远比坐在头等舱里飞行更让人兴奋”,然而更现实的问题是,互联网上充斥着大量付费课程和营销内容,用漏洞百出、一知半解的讲解包装所谓的 AI 教程。正因如此,本项目的初衷就是尽可能降低 LLM 的学习门槛,让每个人都能从理解每一行代码开始,从 0 开始亲手训练一个极小的语言模型。是的,从**零开始训练**,而不是仅仅停留在**推理**层面。最低只需不到 3 块钱的服务器成本,就能亲身体验从 0 到 1 构建一个语言模型的全过程。
😊 一起感受创造的乐趣吧!
🎉 本项目包含以下内容
提供完整的 MiniMind-LLM 结构代码(Dense + MoE),当前主线结构对齐 Qwen3 / Qwen3-MoE 生态。
提供 Tokenizer 与分词器训练代码,支持 、 、 等模板标记。
覆盖 Pretrain、SFT、LoRA、RLHF-DPO、RLAIF(PPO / GRPO / CISPO)、Tool Use、Agentic RL、自适应思考与模型蒸馏等完整训练流程。
提供全阶段开源数据,覆盖收集、蒸馏、清洗与去重后的高质量数据集。
关键训练算法与核心模块均从 0 实现,不依赖第三方框架封装。
兼容 transformers 、 trl 、 peft 等主流框架,以及 llama.cpp 、 vllm 、 ollama 等常用推理引擎与 Llama-Factory 等训练框架。
支持单机单卡与单机多卡(DDP、DeepSpeed)训练,支持 wandb / swanlab 可视化与动态启停训练。
支持在 C-Eval、C-MMLU、OpenBookQA 等第三方测评集上进行评测,并支持通过 YaRN 实现 RoPE 长文本外推。
提供兼容 OpenAI API 协议的极简服务端,便于接入 FastGPT、Open-WebUI 等第三方 Chat UI,并支持 reasoning content 、 tool calls 、 open thinking 。
提供基于 Streamlit 的极简聊天 WebUI,支持思考展示、工具选择与多轮 Tool Call。
🎉 已发布模型列表
模型 参数量 Release
- ----- -------- ---------
minimind-3 64M 2026.04.01
minimind-3-moe 198M / A64M 2026.04.01
minimind2-small 26M 2025.04.26
minimind2-moe 145M 2025.04.26
minimind2 104M 2025.04.26
minimind-v1-small 26M 2024.08.28
minimind-v1-moe 4×26M 2024.09.17
minimind-v1 108M 2024.09.01
📝 更新日志
🔥 2026-04-01
- 发布 minimind-3 / minimind-3-moe :结构、Tokenizer、训练链路、推理接口与默认配置全面更新
结构主线对齐 Qwen3 / Qwen3-MoE 生态:Dense 约 64M ,MoE 约 198M / A64M ,并移除了 shared expert 设计
默认训练数据切换为 pretrain t2t( mini).jsonl 、 sft t2t( mini).jsonl 、 rlaif.jsonl 、 agent rl.jsonl 与 agent rl math.jsonl
移除独立 train reason.py ;思考能力统一由 chat template + 与 open thinking 自适应开关控制
toolcall 能力已混入 sft t2t / sft t2t mini 主线数据,默认 full sft 即具备基础 Tool Call 能力;同时新增 scripts/chat api.py 等推理示例
新增原生 Agentic RL 训练脚本 train agent.py ,支持多轮 Tool-Use 场景下的 GRPO / CISPO
RLAIF / Agentic RL 训练流程完成 rollout engine 解耦,支持更灵活地切换生成后端
serve openai api.py 与 web demo.py 新增 reasoning content / tool calls / open thinking 支持
Tokenizer 基于 BPE + ByteLevel 更新,并新增工具调用与思考标记,预留 buffer token 便于后续扩展
新增 LoRA 权重合并导出流程,可通过 scripts/convert model.py 将基础模型与 LoRA 权重合并为新的完整模型权重
结构图资源更新,README 大面积更新
2025-10-24
🔥 新增RLAIF训练算法:PPO、GRPO、SPO(从0原生实现)
新增断点续训功能:支持训练自动恢复、跨GPU数量恢复、wandb记录连续性
新增RLAIF数据集:rlaif-mini.jsonl(从SFT数据随机采样1万条);简化DPO数据集,加入中文数据
新增YaRN算法:支持RoPE长文本外推,提升长序列处理能力
Adaptive Thinking:Reason模型可选是否启用思考链
chat template全面支持Tool Calling和Reasoning标签( 、 等)
新增RLAIF完整章节、训练曲线对比、算法原理折叠说明
SwanLab替代WandB(国内访问友好,API完全兼容)
规范化所有代码 & 修复一些已知bugs
2025-04-26
重要更新
如有兼容性需要,可访问🔗旧仓库内容🔗。
MiniMind模型参数完全改名,对齐Transformers库模型(统一命名)。
generate方式重构,继承自GenerationMixin类。
🔥支持llama.cpp、vllm、ollama等热门三方生态。
规范代码和目录结构。
改动词表 ->
2025-02-09
迎来发布以来重大更新,Release minimind2 Series。
代码几乎全部重构,使用更简洁明了的统一结构。
如有旧代码的兼容性需要,可访问🔗旧仓库内容🔗。
免去数据预处理步骤。统一数据集格式,更换为 jsonl 格式杜绝数据集下载混乱的问题。
minimind2系列效果相比MiniMind-V1显著提升。
小问题:{kv-cache写法更标准、MoE的负载均衡loss被考虑等等}
提供模型迁移到私有数据集的训练方案(医疗模型、自我认知样例)。
精简预训练数据集,并大幅提升预训练数据质量,大幅缩短个人快速训练所需时间,单卡3090即可2小时复现!
更新:LoRA微调脱离peft包装,从0实现LoRA过程;DPO算法从0使用PyTorch原生实现;模型白盒蒸馏原生实现。
minimind2-DeepSeek-R1系列蒸馏模型诞生!
minimind2具备一定的英文能力!
更新minimind2与第三方模型的基于更多大模型榜单测试性能的结果。
More...
2024-10-05**
为MiniMind拓展了多模态能力之---视觉
移步孪生项目minimind-v查看详情!
2024-09-27**
09-27更新pretrain数据集的预处理方式,为了保证文本完整性,放弃预处理成.bin训练的形式(轻微牺牲训练速度)。
目前pretrain预处理后的文件命名为:pretrain data.csv。
删除了一些冗余的代码。
2024-09-17**
更新minimind-v1-moe模型
为了防止歧义,不再使用mistral tokenizer分词,全部采用自定义的minimind tokenizer作为分词器。
2024-09-01**
更新minimind-v1 (108M)模型,采用minimind tokenizer,预训练轮次3 + SFT轮次10,更充分训练,性能更强。
项目已部署至ModelScope创空间,可以在此网站上体验:
🔗ModelScope在线体验🔗
2024-08-27**
项目首次开源
📌 快速开始
本人的软硬件配置(供参考)
CPU: Intel(R) Core(TM) i9-10980XE CPU @ 3.00GHz
RAM: 128 GB
GPU: NVIDIA GeForce RTX 3090 (24GB) * 8
Ubuntu==20.04
CUDA==12.2
Python==3.10.16
requirements.txt
第0步
Ⅰ 🚀 模型推理
1' 下载模型
在项目根目录:
2' CLI 推理
3'(可选)WebUI
4'(可选)第三方推理框架
Ⅱ 🛠️ 模型训练
注:提前确认 Torch 的可用后端
若你计划使用 CUDA 训练,建议先确认当前环境是否已正确识别 GPU。
若 cuda 不可用,也仍可根据自身设备选择 CPU 或 MPS 运行,但训练速度与兼容性会有非常大的差异。
如需安装或更换 PyTorch 版本,可参考 torch stable 与链接
1' 下载数据
从下文提供的数据集下载链接 下载所需数据文件,并放入 ./dataset 目录
当前默认仅需下载 pretrain t2t mini.jsonl 与 sft t2t mini.jsonl ,即可较快复现 MiniMind Zero 对话模型。
如有更多需求,下文提供多种搭配方案,可根据自身任务目标与 GPU 资源灵活选择。
2' 开始训练
💡 检查点暂停续训
所有训练脚本均支持检查点保存。添加 --from resume 1 参数后,即可自动检测并恢复训练进度:
断点续训说明:**
训练过程会自动在 ./checkpoints/ 目录保存完整检查点(模型、优化器、训练进度等)
检查点文件命名: resume.pth (如: full sft 512 resume.pth )
支持跨不同 GPU 数量恢复(自动调整 step)
支持 wandb 训练记录连续性(自动恢复同一个 run)
适合长时间训练或不稳定环境,无需担心训练中断导致进度丢失
- 1 预训练(必须)
训练后,将得到 out/pretrain *.pth 作为输出权重(其中 * 为模型 dimension,默认为 768 )
- 2 指令微调(必须)
训练后,将得到 out/full sft *.pth 作为输出权重(其中 full 表示全参数微调)
- 3 测试已训练模型(可选)
确保待测试的模型 *.pth 文件位于 ./out/ 目录下;也可直接前往此处下载我已训练好的 *.pth 权重。
- -weight 用于指定权重名称前缀,例如 pretrain 、 full sft 等;更多参数可直接参考 eval llm.py
注:其它须知
- 所有训练脚本均基于 PyTorch 原生实现,并支持多卡加速。
- 若你的设备有 N (N > 1) 张显卡,可通过以下方式启动单机 N 卡训练(DDP,也支持扩展到多机多卡):
- 可根据需要开启 wandb 记录训练过程。
2025 年 6 月后,国内网络环境通常无法直连 WandB。MiniMind 当前默认转为使用 SwanLab 作为训练可视化工具,其接口与 WandB 基本兼容;通常只需将 import wandb 替换为 import swanlab as wandb ,其余调用方式基本无需改动。
📌 数据介绍
Ⅰ Tokenizer
分词器可以粗略理解成 LLM 使用的一本“词典”,负责把自然语言映射成 token id,再把 token id 解码回文本;项目中也提供了 train tokenizer.py 作为词表训练示例。不建议重新训练 tokenizer,因为词表和切分规则一旦变化,模型权重、数据格式、推理接口与社区生态的兼容性都会下降,也会削弱模型的传播性。同时,tokenizer 还会影响 PPL 这类按 token 统计的指标,因此跨 tokenizer 比较时,BPB(Bits Per Byte)往往更有参考价值,可参考这篇。
对 MiniMind 这类小模型来说,词表大小还会直接影响 embedding 层和输出层的参数占比,因此保持词表精简通常是更合适的取舍。
Tokenizer介绍
第三方强大的开源模型例如 Yi、Qwen2、ChatGLM、Mistral、Llama 3 的 tokenizer 词表长度如下:
Tokenizer模型词表大小来源
Yi64,00001万物(中国)
Qwen2151,643阿里云(中国)
ChatGLM151,329智谱AI(中国)
Mistral32,000Mistral AI(法国)
Llama 3128,000Meta(美国)
MiniMind6,400自定义
当前主线为避免历史版本歧义并控制整体体积,统一使用 minimind tokenizer ,不再维护 mistral tokenizer 版本。
尽管 minimind tokenizer 的词表只有 6400 ,编解码效率弱于 qwen2 、 glm 等更偏中文友好的 tokenizer,但它能显著压缩 embedding 层和输出层的参数占比,更适合 MiniMind 这类小模型的体积约束。
从实际使用效果看,这套 tokenizer 并没有明显带来生僻词解码失败的问题,整体仍然足够稳定可用;因此当前主线训练也统一沿用这套词表,而不再额外分叉维护其他 tokenizer 版本。
Ⅱ Pretrain数据
MiniMind-3 当前主线预训练数据为 pretrain t2t.jsonl / pretrain t2t mini.jsonl 。
这两份数据已经整理成统一的 text -> next token prediction 训练格式,目标是在较小算力下兼顾:
文本质量;
长度分布;
中英混合能力;
与后续 SFT / Tool Calling / RLAIF 阶段的模板衔接。
数据来源包括但不限于通用文本语料、对话整理语料、蒸馏补充语料,以及各类**宽松开源协议**可用的数据集;主线数据会在清洗、去重、长度控制与格式统一后再进入训练。数据来源于:匠数大模型数据集、Magpie-Align 等公开数据源。
其中:
pretrain t2t mini.jsonl 更适合快速复现;
pretrain t2t.jsonl 更适合完整训练 MiniMind-3 主线模型。
文件数据格式为
Ⅲ SFT数据
MiniMind-3 当前主线 SFT 数据为 sft t2t.jsonl / sft t2t mini.jsonl 。相比更早期的 sft 512 / sft 1024 / sft 2048 方案,当前版本更强调:
统一模板;
更适合对话 + 思考标签 + Tool Calling 的混合训练;
尽量减少数据预处理分叉,降低复现成本。
其数据来源包括但不限于高质量指令跟随数据、公开对话数据、模型蒸馏合成数据,以及协议友好的开源数据集;在进入 t2t 主线前,会统一为当前仓库使用的多轮对话格式。当前主线中也包含大量合成数据,例如本人基于 qwen3-4b 合成的约 10w 条 tool call 数据,以及 qwen3 系列的 reasoning 数据等。其中社区主要来源有:匠数大模型数据集、Magpie-Align、R1-Distill-SFT、COIG、Step-3.5-Flash-SFT 等。公布版本会确保数据来源与处理链路符合对应开源协议的可传递性约束,并遵守 Apache-2.0、CC-BY-NC-2.0 等相关协议要求。
其中:
sft t2t mini.jsonl :适合快速训练对话模型;
sft t2t.jsonl :适合完整复现主线版本;
toolcall 能力已经并入主线 SFT 数据。
所有 SFT 文件数据格式均为(包含对话数据、Tool Use数据)
Ⅳ RL 数据
MiniMind 当前主线 RL 数据为 dpo.jsonl 。数据抽样自 DPO-En-Zh-20k。
主线中会将这部分样本统一重组为当前仓库使用的偏好学习格式,用于奖励模型或偏好优化阶段训练;其中 chosen 表示更符合偏好的回复, rejected 表示相对较差的回复。
其中 dpo.jsonl 数据格式为
除此之外,其他 RL 数据与 SFT 数据格式保持一致,通常是从 SFT 数据中按总长度和对话轮次筛选得到,并将最后一个 assistant 位置留空,供 rollout 阶段续写使用。
Ⅴ MiniMind 训练数据集
[!NOTE]
当前主线训练所需的核心数据集已开源,因此无需再自行预处理大规模数据集,避免重复性的数据处理工作。
MiniMind训练数据集下载地址: ModelScope HuggingFace
无需全部clone,可单独下载所需的文件
将下载的数据集文件放到 ./dataset/ 目录下(✨为推荐的必须项)
注:各数据集简介
agent rl.jsonl --Agentic RL 主线训练数据,用于 train agent.py 的多轮 Tool-Use / CISPO / GRPO 训练
agent rl math.jsonl --Agentic RL 纯数学补充数据,适合带最终校验目标的多轮推理/工具使用场景(用于RLVR)
dpo.jsonl --RLHF阶段偏好训练数据(DPO)
pretrain t2t mini ✨ -- minimind-3 轻量预训练数据,适合快速复现(推荐设置 max seq len≈768 )
pretrain t2t -- minimind-3 主线预训练数据(推荐设置 max seq len≈380 )
rlaif.jsonl ✨ --RLAIF训练数据集,用于PPO/GRPO/CISPO等强化学习算法训练
sft t2t mini.jsonl ✨ -- minimind-3 轻量SFT数据(用于快速训练Zero模型),推荐设置 max seq len≈768 ,其中已混入一部分 Tool Call 样本
sft t2t.jsonl -- minimind-3 主线SFT数据,适合完整复现,其中同样已混入 Tool Call 样本
训练参数 max seq len 目前指的是 tokens 长度,而非绝对字符数。
本项目tokenizer在中文文本上大约 1.5~1.7 字符/token ,纯英文的压缩比在 4~5 字符/token ,不同数据分布会有波动。
数据集命名标注的“最大长度”均为字符数,100长度的字符串可粗略换算成 100/1.5≈67 的tokens长度。
例如:
中文: 白日依山尽 5个字符可能被拆分为[ 白日 , 依 , 山 , 尽 ] 4个tokens;
英文: The sun sets in the west 24个字符可能被拆分为[ The , sun , sets , in , the , west ] 6个tokens
“推荐设置”给出了各个数据集上最大tokens长度的粗略估计。
须知 max seq len 可以激进 / 保守 / 均衡地调整,因为更大或更小均无法避免副作用:一些样本短于 max seq len 后被 padding 浪费算力,一些样本长于 max seq len 后被截断语义。
在算力效率与语义完整性之间找到平衡点即可
MiniMind 主线训练数据组成与推荐组合示意图
说明 & 推荐训练方案
minimind-3 主线推荐采用 pretrain t2t + sft t2t + rlaif/agent rl 的阶段式训练组合。
想要最快速度从0实现Zero模型,推荐使用 pretrain t2t mini.jsonl + sft t2t mini.jsonl 的数据组合
推荐具备一定算力资源或更在意效果的朋友完整复现 minimind-3 ;仅有单卡GPU或更在意快速复现的朋友强烈推荐 mini 组合。
当前 sft t2t / sft t2t mini 已经混入 Tool Call 数据,因此通常不需要再额外做一轮独立的 Tool Calling 监督微调。
📌 模型
结构
minimind-3 Dense 使用 Transformer Decoder-Only 结构,整体配置已经向 Qwen3 生态对齐,方便后续转换到 transformers / llama.cpp / ollama / vllm :
采用预标准化(Pre-Norm)+ RMSNorm。
使用 SwiGLU 激活函数。
使用 RoPE 旋转位置编码,并支持 YaRN 外推。
q heads=8 、 kv heads=4 , max position embeddings=32768 , rope theta=1e6 。
minimind-3-moe 在相同结构上扩展 MoE 前馈层,实现上兼容 Qwen3-MoE 风格配置(去除 shared expert)。
当前默认配置为 4 experts / top-1 routing ,用于以更低激活参数获得更高容量。
Experts 继续增加后,实际耗时往往比同尺寸规模的 dense 模型高非常多,这和 “MoE 推理更快” 放在一起看会有点反直觉,但训练时 token 先按专家分桶、再分别做 forward,原生训练时带来的 kernel 启停和调度开销会急剧变重,这本身是很自然的事情。得靠支持 MoE kernel-fused 的算子库来优化,比如基于 Triton 的自定义 kernel、 DeepSpeed-MoE 、 Megatron-LM 等等。当然,这个项目还是希望保留原生 PyTorch 的普适性,所以这里做的是现实的折中,在当前实现下, 4 experts / top-1 这个甜点配置大约只比 dense 模型慢 50% 左右。
minimind-3 系列结构如下图:
修改模型配置见./model/model minimind.py,参考模型参数版本见下表:
Model Name params len vocab max pos rope theta n layers d model kv heads q heads note
- ----------- -------- ----------- --------- ------------ ---------- --------- ---------- --------- ------
minimind-3 64M 6400 32768 1e6 8 768 4 8 Dense
minimind-3-moe 198M / A64M 6400 32768 1e6 8 768 4 8 4 experts / top-1
minimind2-small 26M 6400 32768 1e6 8 512 2 8 历史版本
minimind2-moe 145M 6400 32768 1e6 8 640 2 8 历史版本
minimind2 104M 6400 32768 1e6 16 768 2 8 历史版本
模型配置
关于 LLM 的参数配置,MobileLLM 对小模型做过一组很有代表性的系统研究。对 MiniMind 这类百M级模型而言, d model 与 n layers 的取舍不只是参数分配问题,也会直接影响训练稳定性与最终效果。
当前 minimind-3 主线选择 dim=768,n layers=8 ,本质上是一种工程取舍:更浅的网络训练更快,同时 dim 也不至于过小而导致模式崩溃,因此能在训练效率、稳定性与最终效果之间取得相对均衡。
查看详细说明
Scaling Law 在小模型上往往会呈现出一些不同于大模型的现象。决定 Transformer 参数规模变化的核心参数,通常主要就是 d model 和 n layers :
d model ↑ + n layers ↓ -> 矮胖子
d model ↓ + n layers ↑ -> 瘦高个
经典 Scaling Law 更强调训练数据量、参数量和训练步数的决定性作用,通常会弱化架构差异本身的影响;但在小模型区间,这个结论并不总是完全成立。
MobileLLM 的一个核心观察是:在参数量固定时,深度往往比宽度更重要。也就是说,相比“宽而浅”的结构,“深而窄”的模型更容易学到抽象概念。
例如当模型参数量固定在 125M 或 350M 时, 30~42 层的狭长结构通常会优于 12 层左右的矮胖结构,在常识推理、问答、阅读理解等多个基准上都呈现出相近趋势。
这和 MiniMind 在训练过程中围绕 d model 与 n layers 做参数分配实验时观察到的现象是一致的。不过“深而窄”里的“窄”也有下限:当 d model 1536 时,继续增加层数往往比单纯继续加宽更划算,更容易带来更高的参数-效果收益。
作为参考,GPT-3 的参数设定如下:
📌 实验
Ⅰ 训练开销
- *时间单位**:小时(h)
- *成本单位**:人民币(¥); 7¥ ≈ 1 美元
- *3090 租卡单价**:约 1.3¥/h (实际价格可自行参考)
- *说明**:以下结果为 minimind 模型在单卡 3090 上的经验估算值,用于快速感知训练门槛
Model Name params pretrain t2t mini sft t2t mini toolcall RLAIF
- ----------- -------- ------------------- -------------- ---------- -------
minimind-3 64M ≈1.21h≈1.57¥ ≈1.10h≈1.43¥ ≈0.9h≈1.17¥ ≈1.1h≈1.43¥
minimind-3-moe 198M / A64M ≈1.69h≈2.20¥ ≈1.54h≈2.00¥ ≈1.26h≈1.64¥ ≈1.54h≈2.00¥
训练开销总结&预测
minimind-3
pretrain t2t mini + sft t2t mini
单卡 3090 , 1 epoch 预计约 2.31 小时,成本约 3.0 元人民币
可从 0 训练出 minimind-3 Zero 对话模型。
minimind-3-moe
pretrain t2t mini + sft t2t mini
单卡 3090 , 1 epoch 预计约 3.23 小时,成本约 4.2 元人民币
可快速得到 minimind-3-moe 的基础对话版本。
以上均为估算值,仅用于快速感知训练门槛。
基于单卡 NVIDIA 3090 , minimind zero 从 0 训练依然可以控制在约 2 小时量级,个人开发者也能较低门槛地快速上手。
若采用更高规格的多卡环境,例如 8x H100 ,总训练时长还可进一步压缩至分钟级。以尽可能低的门槛实现可复现、可上手、可持续迭代的 LLM 训练体验,这也是 MiniMind 系列一直希望坚持的方向。低成本快速复现并不是噱头,下面保留一个早期的 Zero 风格样例对话供参考:
尽管该版本已经具备基础对话能力,但事实知识与泛化效果仍较有限;它更适合作为 Zero 训练路线可行性的早期参考。
Zero 模型权重保存为 full sft zero 768.pth (见下文 MiniMind 模型文件链接),如有兴趣可下载体验其对话效果。
Ⅱ 主要训练(必须)
所有训练脚本均 cd ./trainer 目录执行
1' 预训练 (Pretrain):
LLM 首先要学会的是先把尽可能多的基础知识和语言规律吸收到参数里。只有这一步打稳了,模型后面才有能力去理解问题、组织表达,并逐步形成像样的生成能力。预训练做的事情,本质上就是让模型先埋头读大量文本,例如 Wiki 百科、新闻、书籍、对话语料等,从中学习事实知识、语言模式以及上下文之间的统计关系。这个阶段通常是“无监督”的:人类不需要逐条告诉模型哪里对、哪里错,而是让它自己从海量文本里总结规律,逐步建立起对世界知识和语言结构的内部表征。
更直白地说,模型在这一阶段的核心目标就是**学会高质量地词语接龙**。例如输入“秦始皇”,它要能够继续生成“是中国历史上的第一位皇帝”这类符合语义与常识的后续内容。
训练后的模型权重文件默认每隔 save interval步 保存为: pretrain *.pth (*为模型具体dimension,每次保存时新文件会覆盖旧文件)
768dim 配置在预训练阶段的 loss 曲线
2' 有监督微调 (Supervised Fine-Tuning):
SFT 并不只是把模型调成“更会聊天”,它同样可以继续向模型中灌入新的知识、行为模式和回答风格。尤其是像 MiniMind 当前主线这样体量达到 14GB 的 SFT 数据,本身就已经不只是简单的格式对齐,而更接近一种带有 mid training 性质的持续强化过程。
如果把预训练理解为先让模型广泛地读书、积累基础语言能力,那么 SFT 更像是在高质量、更有目标的数据上继续深加工。一方面,它会让模型适应多轮对话、问答、工具调用和思考标签等交互形式;另一方面,它也会继续把特定知识分布、任务模式和助手风格压进参数里。
具体到 MiniMind 里,SFT 阶段会让模型适应当前仓库使用的多轮对话模板。模型会逐渐理解 user / assistant / system / tool 等角色结构,同时进一步强化指令跟随、稳定回复和任务完成能力。
当前训练时会对指令和回答长度做截断控制,主要是为了兼顾显存占用与训练效率;如果后续需要更长上下文,只需要继续准备少量长样本做增量微调即可。在推理时通过启用 YaRN 外推,可以免训练地将上下文长度扩展到 2048 及以上。
训练后的模型权重文件默认每隔 save interval步 保存为: full sft *.pth (*
为模型具体dimension,每次保存时新文件会覆盖旧文件)
768dim 配置在 SFT 阶段的 loss 曲线
Ⅲ 其它训练(可选)
所有训练脚本均 cd ./trainer 目录执行
3' 知识蒸馏 (Knowledge Distillation, KD)
知识蒸馏大体可以分成黑盒和白盒两类,MiniMind 当前主线两种思路都有涉及,只是侧重点不同。
黑盒蒸馏:更常见,也更贴近当前主线的实际做法。严格来说,它本质上仍然是面向教师输出结果的监督微调,也就是基于硬标签继续训练;只是随着 LLM 的流行,这类“对着强模型输出做 FT”的做法也逐渐被广义地归入了蒸馏范畴,因此通常被称为黑盒蒸馏。它重点学习的是答案、风格和行为模式,学生模型只能看到“老师说了什么”,却看不到老师内部是如何做出这个判断的。像 DeepSeek R1 、 Qwen3 的高质量回答,以及 tool call 、 reasoning 、思维链等数据,都可以看作黑盒蒸馏信号;MiniMind 当前主线 full sft 数据里,其实已经混入了相当一部分这样的思路。
白盒蒸馏:更进一步,不只学习教师给出的最终输出,还去学习教师在 token 分布层面的偏好。相比黑盒蒸馏,它额外利用了教师模型输出层更细粒度的分布信息,因此学生模型学到的不只是“标准答案”,还包括教师在候选 token 之间的相对倾向。对应到 train distillation.py ,当前实现是在已经完成 SFT 的权重基础上,继续用教师模型提供的分布信号来训练学生模型,因此更适合作为理解 MiniMind 蒸馏流程的参考实现。
黑盒蒸馏本质上等价于对 teacher 生成答案做监督微调:
白盒蒸馏则通常在监督损失之外,再额外拟合教师分布:
仓库中提供的 train distillation.py 更适合作为理解白盒蒸馏流程的参考实现:它完整展示了教师/学生双模型加载、 CE + KL 混合损失、温度缩放、MoE 与 dense 组合蒸馏,以及断点续训和分布式训练等关键细节。
4' LoRA (Low-Rank Adaptation)
LoRA 是一种常见的参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)方法。相比全参数微调,它只更新少量新增参数,而保留原始模型主体权重不变,因此训练成本更低,也更适合做垂直场景适配。
它的核心思想是在原有权重矩阵旁引入低秩增量分支,仅训练这部分低秩参数,从而用较小代价完成能力迁移。相关实现可见 model lora.py 和 train lora.py ,整个流程均为纯手写实现,不依赖第三方封装。
训练后的模型权重文件默认每隔 save interval步 保存为: lora xxx *.pth (*为模型具体dimension,每次保存时新文件会覆盖旧文件)
LoRA 很适合处理“如何在尽量保留通用能力的前提下,让模型快速适应私有领域或垂直场景”这类问题。例如基础模型医学知识不足时,就可以在原有模型之上叠加一层面向医疗场景的 LoRA 权重,以较小代价获得更好的领域表现。
通常只需要准备同样的多轮对话格式数据,放置到 lora xxx.jsonl ,再执行 python train lora.py ,即可得到新的 LoRA 模型权重。
例1:垂域数据
例2:自我认知数据
此时可将【基模 + LoRA 权重】组合使用,从而在保留基础模型通用能力的同时,增强特定领域表现。训练完成后也可以通过 eval llm.py 做简单测试。
PS:如果有更充足的数据,也可以直接做 full sft 全参微调;不过这通常需要更谨慎地混合通用数据与领域数据,否则很容易因为过拟合垂域样本而损失模型原有的通用性。
LoRA 权重可合并回基础模型并导出为新的完整模型权重,可使用 scripts/convert model.py 中的 convert merge base lora :
- *5' 工具调用 & 自适应思考**
2026-03 起,仓库移除了独立的 train reason.py 。
当前版本不再单独维护 reason *.pth 权重,而是统一通过 chat template 、 标签、 open thinking 开关以及后续 SFT / RLAIF 流程来建模“是否显式输出思考过程”。
- 1 Tool Calling
当前 toolcall 能力已经并入 sft t2t / sft t2t mini 主线数据,因此通常不再需要额外单独训练一轮 Tool Calling;默认的 full sft 权重已经具备基础 Tool Call 能力。当前这部分训练数据主要由 qwen3-4b 采样约 10w 条构成,工具列表也主要覆盖约 10 个模拟的自定义工具(例如查询时间、数学计算、获取天气等),因此目前还谈不上明确的泛化能力。其中 Tool Calling 样本统一沿用了 OpenAI 风格的多轮消息格式:
其中 tools 挂在 system 消息上, tool calls 挂在 assistant 消息上;训练时再由 chat template 自动展开为 ... 与 ... 片段,因此现在可以直接学习原生 tool call 格式。
Tool Calling 的 chat template 已统一支持解析为:
也可以直接通过 eval toolcall.py 做简单测试:
- 2 Adaptive Thinking
minimind 将显式思考能力统一到了模板层,这也和当前很多主流大模型的模板设计保持一致:
open thinking=0 :默认注入空的 \n\n ,模型更倾向于直接回答;
open thinking=1 :模板会预先注入 起始标签,模型再继续输出显式思考过程与最终回答;
CLI、OpenAI-API、WebUI 三个入口均支持该开关。
更准确地说,目前不再“单独训一个思考模型”,而是把“是否显式思考”下沉到 chat template 。模板层会先预留 这一结构,同一个模型在推理时再通过 open thinking 动态切换;在训练时,则通过混合空 think 、显式 reasoning content 与 thinking ratio 采样,让模型逐步见过“该想时想、该直答时直答”的混合模式。
OpenAI-API-SDK 用法:
注:当前同时开启 Tool Call 与显式思考时,模型通常并不太会稳定地输出思考过程。原因在于现阶段训练数据里还缺少“reasoning 与 tool call 同时存在”的联合蒸馏样本,因此模型尚未充分学会这两种能力的协同表达。
Ⅳ 强化学习(可选)
在 LLM 的后训练实践中,常见的强化学习路径主要有两条:
- **基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback, RLHF)**
通过**人类**对模型输出的偏好进行评价来训练模型,使其生成更符合人类价值观和偏好的内容。
- **基于AI反馈的强化学习 (Reinforcement Learning from AI Feedback, RLAIF)**
使用**AI模型**或其他可自动验证的机制来提供反馈,而不直接依赖人类标注。
这里的“AI feedback”在广义上也可以扩展到规则奖励、Ground Truth 校验、代码解释器、环境反馈等自动化信号。
类型 裁判 优点 缺点
- ------ ---- ----------- ------------
RLHF 人类 更贴近真实人类偏好 成本高、效率低
RLAIF 模型 自动化、可扩展性强 可能偏离人类真实偏好
二者本质上都属于利用某种形式的"**反馈**"来优化模型行为的强化学习范式。
不过在具体实践里,它们并不只是反馈来源不同:奖励是否可验证、是否连续、是否依赖环境交互、是否延迟到整轮结算,都会直接影响训练形态与工程实现。
👀 PO算法的统一视角
在介绍实现具体算法之前,我先以个人理解的极简视角,阐述所有Policy Optimization (PO)算法的统一共性。
所有RL算法的本质都只是在优化一个期望:
$$\mathcal{J} {PO} = \mathbb{E} {q \sim P(Q), o \sim \pi(O q)} \left[ \underbrace{f(r t)} {\text{策略项}} \cdot \underbrace{g(A t)} {\text{优势项}} - \underbrace{h(\text{KL} t)} {\text{正则项}} \right]$$
训练时,只需**最小化负目标函数**,即: $\mathcal{L} {PO} = -\mathcal{J} {PO}$
这个框架只包含三个核心组件:
- *策略项** $f(r t)$: 如何使用概率比 $r t$? 即告诉模型新旧策略偏差有多大,是否探索到了更好的token
- *优势项**
优先采用原作者提供的中文模型卡片;仅有英文说明时由闲社AI翻译整理。重要参数、许可证和商用范围请以原文为准。
你将获得什么
完整仓库方式包含该固定版本中的权重、配置、分词器及说明文件;指定版本方式只下载所选文件或整组分片。多模态模型的投影文件、配置等依赖,请按作者说明配齐。
完整仓库可能包含多个权重格式,因此需要的磁盘空间可能大于单一格式的模型大小。下载文件不等于完成模型部署。
使用前须知
运行模型需要的设备、工具与依赖,以原作者说明为准。
是否允许商用、修改和分发,请查看模型许可证。
闲社提供资料与镜像下载方法,不代表已运行模型或完成安全审计。下载的代码应先检查,再执行。
资料或下载有问题?
登录后可提交反馈。
