编程 LLM 平民化:3 块钱 + 2 小时,从 0 训出 64M 小模型

2026-09-10 21:25:21

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-364M2026.04.01
minimind-3-moe198M-A64M2026.04.01
minimind2-small26M
minimind2-moe145M
minimind2104M
minimind-v1-small26M
minimind-v1-moe4×26M
minimind-v1108M

2026-04-01 更新(minimind-3 / minimind-3-moe)

  • 结构、Tokenizer、训练链路、推理接口与默认配置全面更新;结构主线对齐 Qwen3/Qwen3-MoE 生态。
  • 默认训练数据切换为 pretrain_t2t(_mini).jsonlsft_t2t(_mini).jsonlrlaif.jsonlagent_rl.jsonlagent_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.pyweb_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.jsonlsft_t2t_mini.jsonl,就能较快复现 MiniMind Zero 对话模型。

数据文件与体积:

文件体积用途
pretrain_t2t_mini.jsonl1.2GB预训练(mini,快速复现)
pretrain_t2t.jsonl10GB预训练(主线,完整训练)
sft_t2t_mini.jsonl1.6GBSFT(mini)
sft_t2t.jsonl14GBSFT(主线)
dpo.jsonl53MBDPO,抽样自 DPO-En-Zh-20k
rlaif.jsonl24MBPPO/GRPO/CISPO
agent_rl.jsonl86MBtrain_agent.py 多轮 Tool-Use
agent_rl_math.jsonl18MBtrain_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.jsonlagent_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≈768pretrain_t2t 推荐 ≈380

模型结构

minimind-3(Dense)是 Transformer Decoder-Only,对齐 Qwen3 生态:Pre-Norm + RMSNorm、SwiGLU、RoPE 并支持 YaRN 外推,q_heads=8kv_heads=4max_position_embeddings=32768rope_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_vocabmax_posrope_thetan_layersd_modelheads
minimind-364M6400327681e68768kv 4 / q 8,Dense
minimind-3-moe198M-A64M6400327681e687684 experts / top-1
minimind2-small26M8512
minimind2-moe145M640
minimind2104M16768

配置取舍参考 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 64Mminimind-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 风格样例对话:

👶: 请介绍一下自己。
🤖️: 作为人工智能,我没有实际的生活,也没有自我意识……我被设计成能够帮助用户解答问题、提供信息、进行对话等。
👶: 推荐一些杭州的特色美食吧。
🤖️: 杭州有很多美味的特色美食,比如鸡肉串、鳗鱼头、水煮鱼、豆腐脑等……

小模型的回答有明显的事实错误与重复,属于正常现象。

复制全文 生成海报 LLM MiniMind PyTorch 模型训练 小语言模型

推荐文章

程序员茄子在线接单