BentoLM
从零训练一个中英双语小模型,过程全部公开。
- 实验
- 14
- 累计花费
- ¥224
更新于 2026-10-26
进度
- 0基础设施
- 1预训练进行中
- 2中训练
- 3SFT
- 4偏好对齐与 RL
- 5多模态
- 6Agentic 训练
- 7推理与部署
预训练的 5 个子阶段,已完成 4 个
- 1.1数据
tokenizer 的中英比例(E001、E003:zh50);训练数据的中英比例(E002:5:5);按质量排序(E010:预训练不采纳,移到中训练退火);英文用 Ultra-FineWeb 还是 Nemotron-CC(可选)
- 1.2架构
E004 到 E009:采纳 SwiGLU 与注意力输出门控;保持 4 个 128 维的头、每头一组 KV、全局注意力、全部维度旋转
- 1.3优化
E011、E012:采纳 Muon(学习率 0.02)与 WSD,预热 2%;batch size 与学习率随尺寸迁移并入 1.4
- 1.4规模化
E013、E014:5 个尺寸(15M 到 148M)× 5 个训练量(5 到 80 tok/参数)拟合 L(N, D),20 个点误差 0.004;预测 1B 训 300 亿 token 中文 bpb 约 1.07;同样算力下把模型做大更划算,最优比例仍是外推,训练量按预算定;Muon 学习率在 96M 上 0.01 与 0.02 持平、0.04 变差,主模型用 0.01
- 1.5最终训练推迟
1B 或更大的模型,等资源充足后再考虑大规模训练
配方
S 模型,10 亿 token,4090 上的中文和英文验证集 bpb,越低越好。
- 起点Llama 式基线
- 配方 v1加 SwiGLU、注意力门控、预热 2%中文 −0.067 · 英文 −0.051
- 配方 v2换成 Muon(学习率 0.02)中文 −0.025 · 英文 −0.022
| 中文 | 英文 | |
|---|---|---|
| 起点 | 1.452 | 1.171 |
| 配方 v1 | 1.386 | 1.120 |
| 配方 v2 | 1.361 | 1.097 |
每个实验单独的效果
实验记录
E014学习率迁移
记录- 问题
- Muon 的学习率 0.02 是在 S(5730 万参数)上调出来的(E011),放到更大的 ml(9610 万参数)上还是最优吗?E013 里退火收益随尺寸变大,是不是因为这个学习率对大模型偏大?
- 结论
可以沿用。
0.01 和 0.02 持平(中文差 0.004,英文差 0.002),0.04 明显变差(中文 +0.021,英文 +0.016)。最优点在 0.01 到 0.02 之间,0.01 在知识题答案 bpb 上还略好 0.023。课程主模型(约 3 亿参数)用 0.01,因为学习率偏大的代价比偏小大得多。E013 里退火收益随尺寸变大,主要不是学习率造成的。
花费¥17W&B 曲线E013规模化(scaling law)
记录- 问题
- 在配方 v2 下,验证集 loss 怎样随模型大小 N 和训练量 D 变化?能不能据此预测 1B 模型的 loss,并决定模型该多大、训练多少 token?
- 结论
L(N, D) = E + A/N^α + B/D^β 拟合得很好(20 个点,误差 0.004,小于单次运行的噪声 0.008)。
预测 1B 模型(2048 × 18)训练 300 亿 token:中文 bpb 约 1.07,英文约 0.86。补上 5 和 80 tok/参数的点、把数据量的跨度从 4 倍拉到 16 倍之后,指数的区间缩小了将近一半,花同样的算力,把模型做大比多喂数据更划算这一点更可信了;但拟合出的最优比例(3 到 5 tok/参数)仍是外推,不直接用来定 1B 的训练量。
花费¥149W&B 曲线E012学习率调度
保持- 问题
- 在 Muon(E011)下,WSD、cosine、恒定学习率加 checkpoint 平均(CMA)三种调度哪个好?
- 结论
保持 WSD。
cosine 与 WSD 持平(中文差 0.005),WSD 略好且训练长度可以事后延长。CMA 追不上学习率衰减:平均最后 10 个 checkpoint 后仍比 WSD 差 0.032。
E011AdamW 学习率与 Muon
采纳- 问题
- 配方 v1 下 AdamW 的学习率 3e-3 是否合适?换成 Muon(Transformer 块内的二维矩阵用 Muon,其余参数用 AdamW)能好多少?Muon 的学习率选多少?
- 结论
采纳 Muon,学习率 0.02。
Muon 比最好的 AdamW 中文 bpb 低 0.025、英文低 0.022,速度相同。Muon 学习率在 0.01 到 0.02 之间几乎没有差别,0.04 明显变差。AdamW 的 3e-3 本身也接近最优。
E010按质量排序的数据顺序
不采纳- 问题
- 同一批文档,按 Ultra-FineWeb 的质量分从低到高排列,让高质量文档落在学习率衰减阶段(参考 Puro-2B),比随机顺序更好吗?
- 结论
预训练阶段不采纳。
排序后验证集 bpb 变差(中文 +0.017,英文 +0.013),只有知识类题目的答案 bpb 变好。在学习率衰减段上做 checkpoint 平均也没有帮助。恒定学习率加 checkpoint 平均(CMA)的一对推迟到第 2 周,和学习率调度一起做。
E009注意力输出门控
采纳- 问题
- 在注意力输出上乘一个由输入决定的 sigmoid 门(每层多一个 dim × dim 的投影),效果如何?
- 结论
采纳,第 1 周最大的改进。
中文 bpb 降低 0.047,英文降低 0.033,所有任务组的答案 bpb 都更好,远超运行间波动。代价是参数多 3.1M(+5.8%),训练慢 5.5%。
E008部分 RoPE
保持- 问题
- 每个头只对一部分维度做旋转位置编码,其余维度只按内容匹配,效果如何?
- 结论
暂时保持全部维度旋转。
只转四分之一(rope25)明显变差;转一半(rope50)与基线持平。部分 RoPE 对长上下文外推可能有帮助,到中训练阶段(上下文扩展)再测。
E007局部注意力
不采纳- 问题
- 每 4 层中 3 层只看最近 256 个 token(滑动窗口),最后一层看全局,能否省算力而不掉效果?
- 结论
不采纳。
效果持平,但训练反而慢 14%。窗口 128 的一组没有运行:窗口 256 已经没有好处,更小的窗口只会更差。
E006SwiGLU 与 ReLU²
采纳- 问题
- MLP 从 V1 的 ReLU²(隐藏层 2048)换成 SwiGLU(隐藏层 1344,参数量基本相同),效果如何?
- 结论
采纳 SwiGLU。
两种显卡上各跑一次,中英文 bpb 都降低约 0.01,答案 bpb 也都更好;单次差距略小于 0.015 的门槛,但两次独立运行方向一致,且都低于全部四次典型基线。速度只慢 2%。
E005注意力头的大小与 KV 共享
保持- 问题
- S 模型(dim 512)用 4 个 128 维的头,换成 8 个 64 维的头,或者让多个查询头共用 KV(GQA、MQA),效果和速度如何?
- 结论
保持 4 个 128 维的头,每个查询头一组 KV。
GQA(2 组 KV)明显变差;64 维的头略差且不更快。MQA 没有运行:GQA 已经变差,只共用 1 组 KV 只会更差。
E004同一配置的运行间波动
记录- 问题
- 同一个配置重复训练,验证集 bpb 会差多少?差多少以内的消融结果不能当真?
- 结论
同一配置的中文 bpb 在 1.433 到 1.455 之间,五次中有四次落在 1.449 到 1.455,一次明显更好。
差距在 0.015 以内的单次对比不能下结论。种子相同的运行在训练早期就会分叉,与显卡型号无关。
花费¥6W&B 曲线E003双语 tokenizer 的选择
采纳- 问题
- E001 训练的三个 tokenizer(训练文本中文占 25% / 50% / 75%)压缩率差别不到 3%,实际训练模型时哪个更好?
- 结论
zh50 最均衡,作为 V2 的 tokenizer。
中文词表少了(zh25)中文明显变差,英文没有变好;中文词表多了(zh75)中文只好一点(0.008),英文却差得更多(0.016)。
花费¥0.5W&B 曲线E002预训练数据的中英比例
采纳- 问题
- S 模型(55M)双语预训练时,中文和英文 token 各占多少合适?
- 结论
5:5 最均衡,作为 V2 默认比例。
从 5:5 往任一方向偏,换来的收益都小于付出的代价:中文从 50% 加到 70%,中文 bpb 只降 0.013,英文 bpb 却升 0.047;中文从 50% 减到 30%,英文 bpb 只降 0.021,中文 bpb 却升 0.067。
花费¥12W&B 曲线E001双语 tokenizer 的中英比例
记录- 问题
- 32768 词表的双语 BPE tokenizer,训练文本里中文占多少比例合适?
- 结论
中文压缩率很快饱和(中文占比从 25% 到 75%,中文只提升 5%),英文则持续受益(同一区间下降 12%)。
三种比例的总体压缩差异在 3% 以内,暂定 zh50 为默认 tokenizer(中英都不差),最终选择用 S 模型的 bpb 验证。
花费¥0.4W&B 曲线