3 元成本 2.31 小时:minimind 把从零训练 LLM 压缩到一张 3090

训练一个大语言模型要花多少钱?行业里公开的数字通常以百万美元计。GitHub 上的开源项目 minimind 给出了另一个量级的答案:单卡 RTX 3090,预训练加微调合计约 2.31 小时,成本约 3.0 元人民币,就能从零训练出一个可以对话的 64M 参数语言模型。这个仓库目前拿下 55,894 star、7,301 fork,采用 Apache-2.0 协议开源,作者 jingyaogong 从 2024 年 7 月开始维护,最近一次提交在 8 月 31 日。

minimind GitHub 仓库卡片

这个项目包含什么

minimind 交付的是一条完整的训练流水线,模型结构代码(Dense 和 MoE 两套)、分词器训练、预训练、指令微调、LoRA、DPO 偏好优化、PPO/GRPO/CISPO 三种强化学习算法、多轮工具调用的 Agentic RL、知识蒸馏、自适应思考开关,以及配套的全阶段开源数据集都在仓库里。关键训练算法和核心模块全部从零实现,不依赖 transformers/trl/peft 的高层封装,但同时兼容这些框架以及 llama.cpp、vllm、ollama 等推理引擎。

作者的动机写在项目介绍里:大多数人对大模型内部机制的探索止步于用 LoRA 微调现有模型,而 transformers/trl 这类框架高度抽象的接口进一步把开发者与底层实现隔离开。minimind 想做的是让人从理解每一行代码开始,亲手走完从 0 到 1 的全过程。

项目的学术引用记录可以佐证它的工程质量:ICML 2025 论文《On the Generalization Ability of Next-Token-Prediction Pretraining》、多篇医学与法律领域 benchmark 论文,以及清华大学出版社的《从零开始写大模型》一书,都把 minimind 作为基础参考。

模型本体:64M Dense 和 198M-A64M MoE

当前主线版本 minimind-3 发布于 2026 年 4 月 1 日,Dense 版本 64M 参数,MoE 版本 198M 总参数、激活 64M。模型列表里还保留了历代版本:26M 的 small、104M 的 minimind2、145M 的 minimind2-moe。

结构上,minimind-3 明确向 Qwen3 生态对齐:Pre-Norm + RMSNorm、SwiGLU 激活、RoPE 旋转位置编码(支持 YaRN 外推)、分组注意力 q_heads=8 / kv_heads=4、最大位置 32768、rope_theta 取 1e6。对齐 Qwen3 的直接好处是模型可以顺畅转换到 transformers、llama.cpp、ollama、vllm 等现成推理栈,训练完不用自己再写推理代码。

MiniMind Dense 模型结构图

参数配置上有一个值得展开的取舍:主线选了 d_model=768、n_layers=8 的「矮胖」结构,而 MobileLLM 论文的系统研究显示,同参数量下「深而窄」的结构在常识推理、问答、阅读理解等基准上通常更好。作者的解释是工程权衡:更浅的网络训练更快,d_model 又不至于小到引发模式崩溃。README 同时给出了两条经验边界——d_model 低于 512 时词嵌入维度过窄的劣势会放大,加层数补不回来;d_model 超过 1536 后,继续加层数比加宽度更划算。

MoE 版本用 4 experts / top-1 routing,兼容 Qwen3-MoE 风格配置但移除了 shared expert。README 里有一个反直觉的实测数据:专家数量增加后,训练耗时反而比同尺寸 dense 模型高很多——token 先按专家分桶再分别 forward,kernel 启停和调度开销会急剧变重,要靠 Triton 自定义 kernel、DeepSpeed-MoE、Megatron-LM 这类算子库才能优化。minimind 保留原生 PyTorch 实现的普适性,当前 4 experts 配置大约只比 dense 慢 50%。

分词器:6400 词表的极端取舍

minimind 自定义 tokenizer 的词表只有 6400,对照同表中的参考数据:Qwen2 词表 151,643,ChatGLM 151,329,Llama 3 128,000,Mistral 32,000。词表直接决定 embedding 层和输出层的参数占比,对 64M 的模型来说,精简词表能把参数留给真正参与推理的权重。作者承认这套词表编解码效率弱于 Qwen2、GLM 等中文友好的分词器,但实测没有明显生僻词解码失败问题。

这里还有一个对评测者有用的提示:跨 tokenizer 比较模型时,按 token 统计的 PPL 会失真,Bits Per Byte(BPB)才是更公平的口径。

数据:四个阶段全部开源

训练数据按阶段划分,全部公开:

  • 预训练:pretrain_t2t.jsonl(完整版)和 pretrain_t2t_mini.jsonl(快速复现版),统一为 text→next token prediction 格式,来源包括匠数大模型数据集、Magpie-Align 等公开语料,经清洗、去重、长度控制后入训。
  • SFT:sft_t2t 系列,统一模板混入对话、思考标签、工具调用三类数据。其中工具调用数据由 qwen3-4b 采样约 10 万条合成,覆盖约 10 个模拟工具(查时间、数学计算、查天气等)。
  • DPO:dpo.jsonl 抽样自 DPO-En-Zh-20k,重组为 chosen/rejected 偏好格式。
  • RL 数据:rlaif.jsonl、agent_rl.jsonl、agent_rl_math.jsonl,后者比普通对话数据多了 gt(ground truth)字段用于最终校验。

协议方面,README 说明公布版本遵守 Apache-2.0、CC-BY-NC-2.0 等协议的可传递性约束。

训练流程:从词语接龙到多轮 Agent

训练分两个必须阶段和一组可选阶段。预训练阶段的目标,用 README 自己的话说是「学会高质量地词语接龙」——一条 torchrun 命令启动,loss 曲线在仓库里有完整记录。只跑完预训练的模型已经能回答「为什么天空是蓝色的」这类问题,输出通顺且基本正确。

SFT 之后得到 full_sft 权重,具备基础对话和工具调用能力。工具调用样本沿用 OpenAI 风格的多轮消息格式,tools 挂在 system 消息上,训练时由 chat_template 展开为 <tool_call> / <tool_response> 片段。

强化学习部分是 README 里技术浓度最高的章节。作者先把 DPO、PPO、GRPO、CISPO 四种算法放进一个统一框架:每种都由策略项、优势项、正则项三个组件构成,DPO 没有显式优势项(偏好对比隐式体现)、需要 2 个模型参与;PPO 需要 Critic 估计优势,训练 2 个模型;GRPO 和 CISPO 都用组内奖励归一化做优势估计,只训练 1 个模型。四种算法的差异被压缩成一张对照表,这在公开的中文资料里并不多见。

2026 年 3 月新增的 Agentic RL 训练脚本 train_agent.py 是最新的演进:强化学习的优化对象在这里扩展到整条多轮轨迹,模型生成 tool_call 后执行工具、把观察拼回上下文、继续 rollout,最后对整条轨迹联合打分:

text
R(τ) = R_answer + R_tool + R_format + R_rm − R_unfinished

奖励同时考虑答案正确性、工具调用合法性、格式闭合、未完成惩罚和奖励模型分数。作者注明这仍是同步模式(采样完一批再更新),训练侧与 rollout 侧的解耦结构已经具备 OpenRLHF、verl、slime 等工业级 RL 框架的基本形态,只是规模和工程完成度完全不同。

实测:RL 带来的提升与「对齐税」

仓库给了一组同随机种子下的对照:20 道数学工具调用题,full_sft 权重答对 12 道,Agent RL 后的权重答对率明显更高(从逐题日志看,full_sft 答错的 32、102、17**2 这类题,agent 权重全部答对)。

代价同样被如实记录:agent 权重在事实性问题上的稳定性会下降,幻觉更明显,出现「工具任务做得更好,但开放问答反而更敢编」的现象。作者把这归入业界后训练的常见规律——对齐税:模型在特定奖励目标上变强的同时,牺牲一部分通用性和事实性。

客观评测的数据更要泼一盆冷水。用 lm-evaluation-harness 在 C-Eval、CMMLU、ARC-Easy、PIQA、OpenBookQA、HellaSwag、Social-IQa 七个数据集上横评,minimind-3 的 C-Eval 得分 24.89、CMMLU 25.38——README 特别说明,这类选择题评测的下界就是随机作答(C-Eval 四选一随机线是 25%),这个量级的模型确实长期徘徊在随机线附近。早期 Zero 版本的对话样例也印证了这一点:它能介绍自己、能聊杭州美食(虽然推荐了并不存在的「鳗鱼头」),被问英语问题时直接输出乱码。

长文本外推:YaRN 的实际效果

RoPE 长度外推用 YaRN 算法实现,eval_llm.py 加一个 --inference_rope_scaling 参数即可启用。仓库用不同长度的《西游记》白话文做了对照实验:不加外推时,文本长度超过训练长度后困惑度持续爬升,在 9500 字左右回升到 7000 以上;启用 YaRN 后困惑度单调下降,9500 字处稳定在 1000 左右。

YaRN 外推前后的 PPL 对比

上手路径与适用边界

快速复现的完整路径是三步:

text
git clone https://github.com/jingyaogong/minimind
# 下载 pretrain_t2t_mini.jsonl + sft_t2t_mini.jsonl
cd trainer && python train_pretrain.py && python train_full_sft.py

3090 单卡约 2.31 小时、3.0 元成本(README 按 1.3 元/小时租卡价估算)得到 minimind-3 Zero 对话模型;MoE 版本约 3.23 小时、4.2 元。训练完的模型可以转 transformers 格式,进 ollama、vllm 或 llama.cpp,也可以直接用仓库自带的 OpenAI 协议兼容 API 服务和 Streamlit WebUI。

它适合谁:想理解 LLM 每一个训练阶段内部机制的开发者——统一框架下的四种 PO 算法对照、多轮 rollout 的奖励设计、训推分离结构,这些内容即使在大型项目的文档里也很少被完整讲清。它不适合谁:想直接获得可用生产力的用户,64M 参数的模型无论怎么训练都到不了实用水平,README 对此毫不粉饰。

一个小模型的价值在于把整条链路摊开在桌面上:预训练在学什么、SFT 改变了什么、RL 的奖励信号如何塑造行为、对齐税从哪里来,每个环节都有代码、数据和曲线可以对照。这 3 块钱买的不是模型,是一条被完整压缩的训练流水线的入场券。


参考来源: