LLM 平民化:3 块钱 + 2 小时,从 0 训出 64M 小模型
项目定位与在线体验
MiniMind 是一套从 0 开始的小语言模型训练工程:约 3 元成本、2 小时训练时间,训出约 64M 参数的 MiniMind。主线最小版本体积约为 GPT-3 的 1/2700。
- 项目地址:https://github.com/jingyaogong/minimind
- 文档:https://jingyaogong.github.io/minimind
- 在线体验:https://www.modelscope.cn/studios/gongjy/MiniMind
- 视频介绍:https://www.bilibili.com/video/BV12dHPeqE72
- License:Apache-2.0(仓库 60.4k star,7.8k fork)
项目完整开源了极简结构与训练链路,覆盖 MoE、数据清洗、预训练(Pretrain)、监督微调(SFT)、LoRA、RLHF(DPO)、RLAIF(PPO/GRPO/CISPO)、Tool Use、Agentic RL、自适应思考与模型蒸馏。核心算法用 PyTorch 原生实现,不依赖 transformers / trl / peft 的高层抽象。
孪生项目:MiniMind-V(视觉)、MiniMind-O(Omni)、MiniMind-dLM(扩散语言模型)、MiniMind-Linear(线性注意)。
两个数字的边界要说清楚:「2 小时」指 SFT 阶段单张 NVIDIA 3090 跑完 1 epoch 的实测耗时,「3 块钱」指对应时段的 GPU 租用成本。
已发布模型
| 模型 | 参数量 | 发布时间 |
|---|---|---|
| minimind-3 | 64M | 2026.04.01 |
| minimind-3-moe | 198M-A64M | 2026.04.01 |
| minimind2-small | 26M | — |
| minimind2-moe | 145M | — |
| minimind2 | 104M | — |
| minimind-v1-small | 26M | — |
| minimind-v1-moe | 4×26M | — |
| minimind-v1 | 108M | — |
2026-04-01 更新(minimind-3 / minimind-3-moe)
- 结构、Tokenizer、训练链路、推理接口与默认配置全面更新;结构主线对齐 Qwen3/Qwen3-MoE 生态。
- 默认训练数据切换为
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 数据,默认
full_sft即具备基础 Tool Call。 - 新增原生 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,新增工具调用与思考标记。
- 新增 LoRA 权重合并导出
scripts/convert_model.py。
2025-10-24 的更新包括:新增 RLAIF 算法 PPO/GRPO/SPO(从 0 原生实现);断点续训(自动恢复、跨 GPU 数量恢复);rlaif-mini.jsonl;YaRN 长文本外推;Adaptive Thinking;用 SwanLab 替代 WandB。
快速开始
作者配置:i9-10980XE / 128GB RAM / RTX 3090 24GB×8 / Ubuntu 20.04 / CUDA 12.2 / Python 3.10.16。
git clone --depth 1 https://github.com/jingyaogong/minimind
cd minimind && pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
安装 torch 参考:https://download.pytorch.org/whl/torch_stable.html
日志可视化(SwanLab):https://swanlab.cn/
下载数据
数据放到 ./dataset/:
- ModelScope:https://www.modelscope.cn/datasets/gongjy/minimind_dataset/files
- HuggingFace:https://huggingface.co/datasets/jingyaogong/minimind_dataset/tree/main
默认只需要 pretrain_t2t_mini.jsonl 与 sft_t2t_mini.jsonl,就能较快复现 MiniMind Zero 对话模型。
数据文件与体积:
| 文件 | 体积 | 用途 |
|---|---|---|
| pretrain_t2t_mini.jsonl | 1.2GB | 预训练(mini,快速复现) |
| pretrain_t2t.jsonl | 10GB | 预训练(主线,完整训练) |
| sft_t2t_mini.jsonl | 1.6GB | SFT(mini) |
| sft_t2t.jsonl | 14GB | SFT(主线) |
| dpo.jsonl | 53MB | DPO,抽样自 DPO-En-Zh-20k |
| rlaif.jsonl | 24MB | PPO/GRPO/CISPO |
| agent_rl.jsonl | 86MB | train_agent.py 多轮 Tool-Use |
| agent_rl_math.jsonl | 18MB | train_agent.py RLVR |
预训练与 SFT
先确认环境:
import torch; print(torch.cuda.is_available())
预训练:
cd trainer && python train_pretrain.py
# 产出 out/pretrain_*.pth,* 为 dimension,默认 768
SFT:
cd trainer && python train_full_sft.py
# 产出 out/full_sft_*.pth
断点续训加 --from_resume 1,检查点存在 ./checkpoints/,命名 __resume.pth,支持跨 GPU 数量恢复。多卡用:
torchrun --nproc_per_node N train_xxx.py
可视化加 --use_wandb,国内推荐 SwanLab(import swanlab as wandb)。
测试:
python eval_llm.py --weight full_sft
推理与第三方框架
# 下载权重
modelscope download --model gongjy/minimind-3 --local_dir ./minimind-3
# 或
git clone https://huggingface.co/jingyaogong/minimind-3
python eval_llm.py --load_from ./minimind-3
python eval_llm.py --load_from ./model --weight full_sft
WebUI:
cd scripts && streamlit run web_demo.py
# 须先把 transformers 格式模型文件夹复制到 ./scripts/ 目录
预训练权重下载:https://www.modelscope.cn/models/gongjy/minimind-3-pytorch/files
第三方框架:
ollama run jingyaogong/minimind-3
vllm serve /path/to/model --served-model-name "minimind"
数据格式与 Tokenizer
Tokenizer 是 MiniMind 自定义词表 6400,对比 Yi 64000、Qwen2 151643、ChatGLM 151329、Mistral 32000、Llama3 128000。小词表压缩 embedding 与输出层参数占比,适合小模型;跨 tokenizer 比较 PPL 用 BPB 更合理。train_tokenizer.py 只是示例,不建议重训。
- 预训练数据:
{"text": "..."},来源含匠数大模型数据集、Magpie-Align 等,清洗去重后训练。mini 适合快速复现,主线适合完整训练。 - SFT 数据:多轮对话格式
conversations,含tool_calls/tool角色样例;含作者用 qwen3-4b 合成的约 10w 条 tool call 数据;来源含匠数、Magpie-Align、R1-Distill-SFT、COIG、Step-3.5-Flash-SFT。toolcall 已并入主线 SFT。 - RL 数据:
dpo.jsonl为 chosen/rejected 格式;rlaif.jsonl用于 PPO/GRPO/CISPO;agent_rl.jsonl、agent_rl_math.jsonl用于train_agent.py的多轮 Tool-Use / RLVR。
max_seq_len 的单位是 tokens 而不是字符:中文约 1.51.7 字符/token,英文 45 字符/token。pretrain_t2t_mini 推荐 max_seq_len≈768,pretrain_t2t 推荐 ≈380。
模型结构
minimind-3(Dense)是 Transformer Decoder-Only,对齐 Qwen3 生态:Pre-Norm + RMSNorm、SwiGLU、RoPE 并支持 YaRN 外推,q_heads=8、kv_heads=4、max_position_embeddings=32768、rope_theta=1e6。
minimind-3-moe 在同结构上扩展 MoE 前馈,4 experts / top-1 routing,去掉 shared expert。作者实测 4 experts/top-1 这个甜点配置大约只比 dense 慢 50%:MoE 原生训练时 token 分桶与 forward 的 kernel 启停/调度开销变重,需要 Triton 自定义 kernel、DeepSpeed-MoE、Megatron-LM 之类的融合算子优化。
| 模型 | 参数 | len_vocab | max_pos | rope_theta | n_layers | d_model | heads |
|---|---|---|---|---|---|---|---|
| minimind-3 | 64M | 6400 | 32768 | 1e6 | 8 | 768 | kv 4 / q 8,Dense |
| minimind-3-moe | 198M-A64M | 6400 | 32768 | 1e6 | 8 | 768 | 4 experts / top-1 |
| minimind2-small | 26M | — | — | — | 8 | 512 | — |
| minimind2-moe | 145M | — | — | — | — | 640 | — |
| minimind2 | 104M | — | — | — | 16 | 768 | — |
配置取舍参考 MobileLLM(https://arxiv.org/pdf/2402.14905):小模型区间深度往往比宽度重要,125M/350M 时 30~42 层优于 12 层。minimind-3 选 dim=768, n_layers=8 是工程折中——更浅训练更快,dim 又不至于过小导致模式崩溃。窄有下限:d_model1536 时,继续加层比加宽更划算。
训练开销
单卡 3090,租金约 1.3¥/h,7¥≈1 美元:
| 阶段 | minimind-3 64M | minimind-3-moe 198M-A64M |
|---|---|---|
| pretrain_t2t_mini | ≈1.21h / ≈1.57¥ | ≈1.69h / ≈2.20¥ |
| sft_t2t_mini | ≈1.10h / ≈1.43¥ | ≈1.54h / ≈2.00¥ |
| toolcall | ≈0.9h / ≈1.17¥ | ≈1.26h / ≈1.64¥ |
| RLAIF | ≈1.1h / ≈1.43¥ | ≈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 同组合 ≈3.23 小时、≈4.2 元。换到 8×H100 可压缩到分钟级。
早期 Zero 风格样例对话:
👶: 请介绍一下自己。
🤖️: 作为人工智能,我没有实际的生活,也没有自我意识……我被设计成能够帮助用户解答问题、提供信息、进行对话等。
👶: 推荐一些杭州的特色美食吧。
🤖️: 杭州有很多美味的特色美食,比如鸡肉串、鳗鱼头、水煮鱼、豆腐脑等……
小模型的回答有明显的事实错误与重复,属于正常现象。