🧠「大模型」2小时完全从0训练64M的小参数LLM!Train a 64M-parameter LLM from scratch in just 2h!
🧠「大模型」2小时完全从0训练64M的小参数LLM!Train a 64M-parameter LLM from scratch in just 2h!
注:本项目基于 Apache 2.0 协议开源,完全免费。“2 小时” 指 SFT 阶段在单张 NVIDIA 3090 上跑完
1 epoch的实测耗时,“3 块钱” 指对应时段的 GPU 租用成本。
大语言模型(Large Language Model, LLM)的出现,引发了全球范围内对 AI 的空前关注。无论是 ChatGPT、DeepSeek 还是 Qwen,都以惊艳的效果让人真切感受到这场技术浪潮的冲击力。然而,动辄数百亿参数的模型规模,使得它们对个人设备而言不仅难以训练,甚至连部署都显得遥不可及。打开大模型的“黑盒子”,真正去理解其内部运作机制,本应是一件令人心潮澎湃的事。遗憾的是,绝大多数探索最终都止步于使用 LoRA 等技术对现有大模型做少量微调,学习一些新指令或特定任务。这更像是在教牛顿如何使用 21 世纪的智能手机——虽然有趣,却偏离了理解物理本质的初衷。
与此同时,第三方的大模型框架与工具库,如 transformers / trl / peft 等,往往只暴露出高度抽象的接口。只需短短十几行代码,就可以完成“加载模型 + 加载数据集 + 推理 + 强化学习”的全流程训练。这种高效封装固然便利,却也在一定程度上把开发者与底层实现隔离开来,削弱了深入理解 LLM 核心代码的机会。我认为 “用乐高自己拼出一架飞机,远比坐在头等舱里飞行更让人兴奋”,然而更现实的问题是,互联网上充斥着大量付费课程和营销内容,用漏洞百出、一知半解的讲解包装所谓的 AI 教程。正因如此,本项目的初衷就是尽可能降低 LLM 的学习门槛,让每个人都能从理解每一行代码开始,从 0 开始亲手训练一个极小的语言模型。是的,从零开始训练,而不是仅仅停留在推理层面。最低只需不到 3 块钱的服务器成本,就能亲身体验从 0 到 1 构建一个语言模型的全过程。
一起感受创造的乐趣吧!
Qwen3 / Qwen3-MoE 生态。<tool_call>、<tool_response>、<think> 等模板标记。transformers、trl、peft 等主流框架,以及 llama.cpp、vllm、ollama 等常用推理引擎与 Llama-Factory 等训练框架。reasoning_content、tool_calls、open_thinking。| 模型 | 参数量 | 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 |
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.jsonltrain_reason.py;思考能力统一由 chat_template + <think> 与 open_thinking 自适应开关控制toolcall 能力已混入 sft_t2t / sft_t2t_mini 主线数据,默认 full_sft 即具备基础 Tool Call 能力;同时新增 scripts/chat_api.py 等推理示例Agentic RL 训练脚本 train_agent.py,支持多轮 Tool-Use 场景下的 GRPO / CISPOrollout engine 解耦,支持更灵活地切换生成后端serve_openai_api.py 与 web_demo.py 新增 reasoning_content / tool_calls / open_thinking 支持BPE + ByteLevel 更新,并新增工具调用与思考标记,预留 buffer token 便于后续扩展scripts/convert_model.py 将基础模型与 LoRA 权重合并为新的完整模型权重<tool_call>、<think>等)<s></s>-><|im_start|><|im_end|>为兼容第三方推理框架llama.cpp、vllm,本次更新需付出一些可观代价。
本次更新不再支持「直接」加载25-04-26以前的旧模型进行推理。
由于Llama位置编码方式与minimind存在区别,导致映射Llama模型后QK值存在差异
minimind2系列旧模型均经过权重映射+(微调训练)QKVO线性层校准恢复而来。
本次更新后将放弃对`minimind-v1`全系列的维护,并在仓库中下线。2025-02-09
jsonl格式杜绝数据集下载混乱的问题。2024-10-05
2024-09-27
2024-09-17
2024-09-01
2024-08-27
# 克隆仓库、安装依赖
git clone --depth 1 https://github.com/jingyaogong/minimind
cd minimind && pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple在项目根目录:
# 方式1
modelscope download --model gongjy/minimind-3 --local_dir ./minimind-3
# 方式2
git clone https://huggingface.co/jingyaogong/minimind-3# 方式1:使用 Transformers 格式模型
python eval_llm.py --load_from ./minimind-3
# 方式2:基于 PyTorch 模型(确保./out目录下有对应权重)
python eval_llm.py --load_from ./model --weight full_sft# 可能需要`python>=3.10`,安装 `pip install streamlit`
# ⚠️ 须先将 transformers 格式模型文件夹复制到 ./scripts/ 目录下(例如:cp -r minimind-3 ./scripts/minimind-3),web_demo 脚本会自动扫描该目录下包含权重文件的子文件夹,如不存在则报错
cd scripts && streamlit run web_demo.py# ollama
ollama run jingyaogong/minimind-3
# vllm
vllm serve /path/to/model --served-model-name "minimind"import torch
print(torch.cuda.is_available())若你计划使用 CUDA 训练,建议先确认当前环境是否已正确识别 GPU。
若 cuda 不可用,也仍可根据自身设备选择 CPU 或 MPS 运行,但训练速度与兼容性会有非常大的差异。
如需安装或更换 PyTorch 版本,可参考 torch_stable 与链接
从下文提供的数据集下载链接 下载所需数据文件,并放入 ./dataset 目录
当前默认仅需下载
pretrain_t2t_mini.jsonl与sft_t2t_mini.jsonl,即可较快复现MiniMind Zero对话模型。 如有更多需求,下文提供多种搭配方案,可根据自身任务目标与 GPU 资源灵活选择。
所有训练脚本均支持检查点保存。添加 --from_resume 1 参数后,即可自动检测并恢复训练进度:
python train_pretrain.py --from_resume 1
python train_full_sft.py --from_resume 1
# ...断点续训说明:
./checkpoints/ 目录保存完整检查点(模型、优化器、训练进度等)<权重名>_<维度>_resume.pth(如:full_sft_512_resume.pth)适合长时间训练或不稳定环境,无需担心训练中断导致进度丢失
cd trainer && python train_pretrain.py训练后,将得到
out/pretrain_*.pth作为输出权重(其中*为模型 dimension,默认为768)
cd trainer && python train_full_sft.py训练后,将得到
out/full_sft_*.pth作为输出权重(其中full表示全参数微调)
确保待测试的模型 *.pth 文件位于 ./out/ 目录下;也可直接前往此处下载我已训练好的 *.pth 权重。
python eval_llm.py --weight full_sft注:其它须知
--weight用于指定权重名称前缀,例如pretrain、full_sft等;更多参数可直接参考eval_llm.py
1、所有训练脚本均基于 PyTorch 原生实现,并支持多卡加速。
2、若你的设备有 N (N > 1) 张显卡,可通过以下方式启动单机 N 卡训练(DDP,也支持扩展到多机多卡):
torchrun --nproc_per_node N train_xxx.py3、可根据需要开启 wandb 记录训练过程。
... train_xxx.py --use_wandb2025 年 6 月后,国内网络环境通常无法直连 WandB。MiniMind 当前默认转为使用 SwanLab 作为训练可视化工具,其接口与 WandB 基本兼容;通常只需将 import wandb 替换为 import swanlab as wandb,其余调用方式基本无需改动。
分词器可以粗略理解成 LLM 使用的一本“词典”,负责把自然语言映射成 token id,再把 token id 解码回文本;项目中也提供了train_tokenizer.py作为词表训练示例。不建议重新训练 tokenizer,因为词表和切分规则一旦变化,模型权重、数据格式、推理接口与社区生态的兼容性都会下降,也会削弱模型的传播性。同时,tokenizer 还会影响 PPL 这类按 token 统计的指标,因此跨 tokenizer 比较时,BPB(Bits Per Byte)往往更有参考价值,可参考这篇。
对 MiniMind 这类小模型来说,词表大小还会直接影响 embedding 层和输出层的参数占比,因此保持词表精简通常是更合适的取舍。
第三方强大的开源模型例如 Yi、Qwen2、ChatGLM、Mistral、Llama 3 的 tokenizer 词表长度如下:
| Tokenizer模型 | 词表大小 | 来源 |
|---|---|---|
| Yi | 64,000 | 01万物(中国) |
| Qwen2 | 151,643 | 阿里云(中国) |
| ChatGLM | 151,329 | 智谱AI(中国) |
| Mistral | 32,000 | Mistral AI(法国) |
| Llama 3 | 128,000 | Meta(美国) |
| MiniMind | 6,400 | 自定义 |
当前主线为避免历史版本歧义并控制整体体积,统一使用
minimind_tokenizer,不再维护mistral_tokenizer版本。
尽管 minimind_tokenizer 的词表只有 6400,编解码效率弱于 qwen2、glm 等更偏中文友好的 tokenizer,但它能显著压缩 embedding 层和输出层的参数占比,更适合 MiniMind 这类小模型的体积约束。
从实际使用效果看,这套 tokenizer 并没有明显带来生僻词解码失败的问题,整体仍然足够稳定可用;因此当前主线训练也统一沿用这套词表,而不再额外分叉维护其他 tokenizer 版本。
MiniMind-3 当前主线预训练数据为 pretrain_t2t.jsonl / pretrain_t2t_mini.jsonl。
这两份数据已经整理成统一的 text -> next token prediction 训练格式,目标是在较小算力下兼顾:
数据来源包括但不限于通用文本语料、对话整理语料、蒸馏补充语料,以及各类宽松开源协议可用的数据集;主线数据会在清洗、去重、长度控制与格式统一后再进入训练。主要来源包括:匠数大模型数据集、Magpie-Align 等公开数据源。
其中:
pretrain_t2t_mini.jsonl 更适合快速复现;pretrain_t2t.jsonl 更适合完整训练 MiniMind-3 主线模型。文件数据格式为
{"text": "如何才能摆脱拖延症?治愈拖延症并不容易,但以下建议可能有所帮助。"}
{"text": "清晨的阳光透过窗帘洒进房间,桌上的书页被风轻轻翻动。"}
{"text": "Transformer 通过自注意力机制建模上下文关系,是现代大语言模型的重要基础结构。"}MiniMind-3 当前主线 SFT 数据为 sft_t2t.jsonl / sft_t2t_mini.jsonl。相比更早期的 sft_512 / sft_1024 / sft_2048 方案,当前版本更强调:
其数据来源包括但不限于高质量指令跟随数据、公开对话数据、模型蒸馏合成数据,以及协议友好的开源数据集;在进入 t2t 主线前,会统一为当前仓库使用的多轮对话格式。当前主线中也包含大量合成数据,例如本人基于 qwen3-4b 合成的约 10w 条 tool call 数据,以及 qwen3 系列的 reasoning 数据等。其中社区主要来源有:匠数大模型数据集、[Magpie-Align](h
[错误] train_agent.py 在运行agent rl 时崩溃
[错误] 流式工具调用同时出现在 delta.content 和 delta.tool_calls 中
选择 UV 管理环境
Python 3.10 即将到达 EOL(2026-10),建议移除未使用的 ujson 并支持到 3.12
[学习]零基础小白缓慢学习记录
[错误] num_experts_per_tok=1 时,MoE 路由器无法接收梯度(经过 topk 权重归一化后变成常数)
如果在 Mac 上直接运行 Python trainer/train_pretrain.py 而不做任何修改,它将完全在 CPU 上运行,无法调用 Mac 的 GPU。
【推荐内容】合集
MoE 前馈每层每向前处理约 3×num_experts 设备→主机同步
MiniMind可视化扩展,展示模型结构、注意力机制和训练流程