ByteNoteByteNote

字节笔记本

2026年8月29日

MiniMind:从零训练 64M 小模型,单卡两小时能跑通

API中转
¥120

想从零训练一个语言模型,又不想被几百亿参数和天价算力劝退,可以看 MiniMind。它把 Dense / MoE 结构、Tokenizer、预训练、SFT、LoRA、DPO,以及 PPO / GRPO / CISPO 这类后训练,都压进一套可读的原生 PyTorch 代码里。主线模型 minimind-3 大约 64M 参数;用官方给的 mini 数据,单卡 3090 跑完 Pretrain + SFT,大约两小时、租金也就几块钱量级。

下面按「能跑通对话模型」这条最短路径写。仓库地址:jingyaogong/minimind,项目页:jingyaogong.github.io/minimind

MiniMind 适合谁

它更像一套可复现的 LLM 入门实验,而不是生产级大模型平台。

  • 想看清楚 Decoder-Only Transformer、RoPE、SwiGLU、RMSNorm 这些零件怎么拼
  • 想亲手走完 Pretrain → SFT →(可选)LoRA / DPO / RLAIF,而不是只会调 API
  • 机器只有一张消费级显卡,甚至暂时只能 CPU / MPS 先把流程摸通
  • 需要把小模型接到 ollama、vLLM、llama.cpp、Open-WebUI 这类常见工具链

反过来:如果你只要一个强问答助手,直接用现成开源大模型会省事得多。MiniMind 的价值在「自己造一遍」,不在「分数碾压」。

模型规格(当前主线)

模型参数量结构要点显存粗估
minimind-364MDense,d_model=768,8 层约 0.5 GB
minimind-3-moe198M / 激活约 64M4 experts / top-1约 1.0 GB

结构对齐 Qwen3 / Qwen3-MoE 思路:Pre-Norm + RMSNorm、SwiGLU、RoPE(可配合 YaRN 做长度外推),词表约 6400。历史还有 MiniMind2 的 26M / 104M / 145M 等版本,新实验优先跟 minimind-3

环境准备

bash
git clone --depth 1 https://github.com/jingyaogong/minimind
cd minimind
pip install -r requirements.txt

国内可以加镜像,例如:

bash
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

先确认 PyTorch 能看到加速设备:

python
import torch
print(torch.cuda.is_available())

没有 CUDA 也能跑脚本,但训练会慢很多;官方计时和成本估算都是按单卡 3090 说的。

只想先推理:直接拉现成权重

不想训练的话,可以先把对话模型拉下来试手感。

bash
# ModelScope
modelscope download --model gongjy/minimind-3 --local_dir ./minimind-3

# 或 Hugging Face
git clone https://huggingface.co/jingyaogong/minimind-3

CLI 评测:

bash
python eval_llm.py --load_from ./minimind-3

也可以用 ollama:

bash
ollama run jingyaogong/minimind-3

需要网页对话时,把 Transformers 格式模型拷到 scripts/ 下,再跑 Streamlit demo:

bash
cp -r minimind-3 ./scripts/minimind-3
cd scripts && streamlit run web_demo.py

仓库还提供兼容 OpenAI API 的 serve_openai_api.py,方便接到 Open-WebUI、Dify 一类前端。

从零训练:最短可复现路径

目标:用 mini 数据集,从随机初始化走到一个能聊天的 Zero 模型。

1. 下载数据

数据集在 ModelScope / Hugging Face 的 minimind_dataset。快速复现至少准备这两份,放到 ./dataset/

  • pretrain_t2t_mini.jsonl(约 1.2GB)
  • sft_t2t_mini.jsonl(约 1.6GB)

完整主线还会用到更大的 pretrain_t2t.jsonlsft_t2t.jsonl,以及 dpo.jsonlrlaif.jsonlagent_rl.jsonl 等;算力和磁盘够再补。

预训练样本大致是一行一段文本:

json
{"text": "Transformer 通过自注意力机制建模上下文关系。"}

SFT 是多轮对话,并已混入一部分 Tool Call 样本:

json
{
  "conversations": [
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好!有什么可以帮你的?"}
  ]
}

2. 预训练

bash
cd trainer
python train_pretrain.py
# 多卡示例:
# torchrun --nproc_per_node 2 train_pretrain.py

权重会落到 out/pretrain_*.pth(默认维度 768)。中途挂了可以加 --from_resume 1,检查点在 ./checkpoints/

3. 全参数指令微调

bash
python train_full_sft.py

得到 out/full_sft_*.pth。用 mini 组合时,官方粗算是 Pretrain + SFT 合计约 2.3 小时、成本约 3 元人民币(按 3090 租卡单价估算,实际以机房报价为准)。

4. 抽查效果

bash
python eval_llm.py --weight full_sft

这一步你会明显感觉到:小模型能聊,但事实知识有限,幻觉也不少。它适合验证「整条训练链路是否通」,不适合当百科全书。

训练过程想看曲线,可以用 --use_wandb;国内更常把接口切到 SwanLab(API 与 wandb 接近)。

可选进阶:LoRA、偏好对齐、强化学习

最短路径跑通后,再按需往下加。

LoRA 垂直域适配

仓库自实现了 LoRA,不依赖 peft。准备同格式的 lora_xxx.jsonl,例如医疗问答或自我认知:

bash
cd trainer && python train_lora.py

推理时指定基础权重和 LoRA 权重:

bash
python eval_llm.py --weight full_sft --lora_weight lora_medical

需要合并回完整权重时,用 scripts/convert_model.py

DPO(RLHF 偏好)

bash
cd trainer && python train_dpo.py

数据是 chosen / rejected 成对样本。DPO 实现简单、显存压力相对 PPO 更小,适合先做「更像人偏好」的对齐。

RLAIF:PPO / GRPO / CISPO

bash
cd trainer
python train_ppo.py
python train_grpo.py
# CISPO 可作为 GRPO 的 loss 变体配置

默认演示会用奖励模型给连续分;小模型在很难的数学题上容易「全军覆没」导致奖励稀疏,所以官方更倾向稠密奖励,而不是一上来就用 0/1 判题。

Agentic RL(多轮 Tool Use)

train_agent.py 把多轮工具调用、延迟奖励和 rollout 引擎串起来,可用 GRPO / CISPO:

bash
cd trainer
python train_agent.py --use_moe 0 --loss_type grpo --data_path ../dataset/agent_rl.jsonl

训完后可用 eval_toolcall.py 看模型会不会先调工具再回答。注意:Agent 权重往往在工具任务上更强,开放问答的稳定性可能下降,这是后训练里很常见的「对齐税」。

接到常用推理栈

训练或下载得到 Transformers 权重后,常见去处:

  • vLLMvllm serve /path/to/model --served-model-name minimind
  • llama.cpp:先转 GGUF,再 llama-cli / 量化
  • ollama:写 Modelfile,或直接 ollama run jingyaogong/minimind-3
  • OpenAI 兼容服务scripts/serve_openai_api.py,可带 open_thinkingtool_calls

做长上下文推理时,原生脚本可加 --inference_rope_scaling;Transformers 配置里也可写 YaRN 相关 rope_scaling

实操时容易踩的点

  1. 数据没放对目录:训练脚本默认读 ./dataset/,文件名也要和 README 一致。
  2. 旧权重和新代码混用:2025-04 之后结构与命名对齐 Transformers,更早的 v1 权重不能「直接」拿来推理。
  3. 把 Zero 模型当强助手:64M 模型能验证流程,事实题和长推理都会抖;要垂直场景,优先 LoRA / 领域 SFT,而不是死磕通用榜。
  4. MoE 并不总是更快:原生 PyTorch 下 expert 分桶和调度有开销;默认 4 experts / top-1 大约比 Dense 慢一半左右,是可读性优先的折中。
  5. Tool Call 与显式思考同时开:若数据里缺少「reasoning + tool」联合样本,两者一起开时思考过程可能不稳定。

什么时候值得继续挖

  • 把私有语料做成 pretrain / sft jsonl,训一个领域小模型
  • 对照阅读 model/model_minimind.py 和各 train_*.py,把论文里的符号落到代码
  • 走完 DPO → GRPO → train_agent.py,体会离线偏好和在线 rollout 的差别
  • 导出到手机 / 边缘设备(仓库也提到 MNN 等端侧路径)

同作者还有视觉向的 MiniMind-V、以及讨论区里的 dLM / Linear Attention 实验分支,主线跑顺后再扩展即可。

小结

MiniMind 把「从零训练小语言模型」这件事拆成了可复制的工程步骤:克隆仓库、装依赖、下载 mini 数据、先 train_pretrain.pytrain_full_sft.py,两小时量级就能得到一个能对话的 64M 模型。后面的 LoRA、DPO、RLAIF 和 Agentic RL 都是同一套代码风格下的选修课。若目标是理解 LLM 训练全链路,而不是追最大模型,这条路径足够诚实,也足够便宜。

分享: