跳过主要内容
公开构建

BentoLM

从零训练一个中英双语小模型,过程全部公开。

实验
14
累计花费
¥224

更新于 2026-10-26

进度

  1. 0基础设施
  2. 1预训练
    进行中
  3. 2中训练
  4. 3SFT
  5. 4偏好对齐与 RL
  6. 5多模态
  7. 6Agentic 训练
  8. 7推理与部署
预训练的 5 个子阶段,已完成 4 个
  1. 1.1数据

    tokenizer 的中英比例(E001、E003:zh50);训练数据的中英比例(E002:5:5);按质量排序(E010:预训练不采纳,移到中训练退火);英文用 Ultra-FineWeb 还是 Nemotron-CC(可选)

  2. 1.2架构

    E004 到 E009:采纳 SwiGLU 与注意力输出门控;保持 4 个 128 维的头、每头一组 KV、全局注意力、全部维度旋转

  3. 1.3优化

    E011、E012:采纳 Muon(学习率 0.02)与 WSD,预热 2%;batch size 与学习率随尺寸迁移并入 1.4

  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

  5. 1.5最终训练推迟

    1B 或更大的模型,等资源充足后再考虑大规模训练

配方

S 模型,10 亿 token,4090 上的中文和英文验证集 bpb,越低越好。

中文英文
  1. 起点
    Llama 式基线
  2. 配方 v1
    加 SwiGLU、注意力门控、预热 2%
    中文 −0.067 · 英文 −0.051
  3. 配方 v2
    换成 Muon(学习率 0.02)
    中文 −0.025 · 英文 −0.022
中文英文
起点1.4521.171
配方 v11.3861.120
配方 v21.3611.097
每个实验单独的效果
E005注意力头的大小与 KV 共享
+0.022
E006SwiGLU 与 ReLU²
−0.010
E007局部注意力
+0.000
E008部分 RoPE
+0.015
E009注意力输出门控
−0.045
E010按质量排序的数据顺序
+0.017
E011AdamW 学习率与 Muon
−0.025
E012学习率调度
+0.005
← 更好更差 →
采纳不采纳保持相对对照组的中文 bpb 变化,越低越好。灰带是同一配置重跑的波动(±0.008)。

实验记录

  1. 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 曲线
  2. 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 曲线
  3. E012学习率调度

    保持
    问题
    在 Muon(E011)下,WSD、cosine、恒定学习率加 checkpoint 平均(CMA)三种调度哪个好?
    结论

    保持 WSD。

    cosine 与 WSD 持平(中文差 0.005),WSD 略好且训练长度可以事后延长。CMA 追不上学习率衰减:平均最后 10 个 checkpoint 后仍比 WSD 差 0.032。

    bpb中文 +0.005英文 +0.004花费¥5.5W&B 曲线
  4. 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 本身也接近最优。

    bpb中文 −0.025英文 −0.022花费¥16W&B 曲线
  5. E010按质量排序的数据顺序

    不采纳
    问题
    同一批文档,按 Ultra-FineWeb 的质量分从低到高排列,让高质量文档落在学习率衰减阶段(参考 Puro-2B),比随机顺序更好吗?
    结论

    预训练阶段不采纳。

    排序后验证集 bpb 变差(中文 +0.017,英文 +0.013),只有知识类题目的答案 bpb 变好。在学习率衰减段上做 checkpoint 平均也没有帮助。恒定学习率加 checkpoint 平均(CMA)的一对推迟到第 2 周,和学习率调度一起做。

    bpb中文 +0.017英文 +0.013花费¥5.4W&B 曲线
  6. E009注意力输出门控

    采纳
    问题
    在注意力输出上乘一个由输入决定的 sigmoid 门(每层多一个 dim × dim 的投影),效果如何?
    结论

    采纳,第 1 周最大的改进。

    中文 bpb 降低 0.047,英文降低 0.033,所有任务组的答案 bpb 都更好,远超运行间波动。代价是参数多 3.1M(+5.8%),训练慢 5.5%。

    bpb中文 −0.045英文 −0.031花费¥2.7W&B 曲线
  7. E008部分 RoPE

    保持
    问题
    每个头只对一部分维度做旋转位置编码,其余维度只按内容匹配,效果如何?
    结论

    暂时保持全部维度旋转。

    只转四分之一(rope25)明显变差;转一半(rope50)与基线持平。部分 RoPE 对长上下文外推可能有帮助,到中训练阶段(上下文扩展)再测。

    bpb中文 +0.015英文 +0.012花费¥3W&B 曲线
  8. E007局部注意力

    不采纳
    问题
    每 4 层中 3 层只看最近 256 个 token(滑动窗口),最后一层看全局,能否省算力而不掉效果?
    结论

    不采纳。

    效果持平,但训练反而慢 14%。窗口 128 的一组没有运行:窗口 256 已经没有好处,更小的窗口只会更差。

    bpb中文 +0.000英文 −0.003花费¥0.6W&B 曲线
  9. E006SwiGLU 与 ReLU²

    采纳
    问题
    MLP 从 V1 的 ReLU²(隐藏层 2048)换成 SwiGLU(隐藏层 1344,参数量基本相同),效果如何?
    结论

    采纳 SwiGLU。

    两种显卡上各跑一次,中英文 bpb 都降低约 0.01,答案 bpb 也都更好;单次差距略小于 0.015 的门槛,但两次独立运行方向一致,且都低于全部四次典型基线。速度只慢 2%。

    bpb中文 −0.010英文 −0.006花费¥3W&B 曲线
  10. E005注意力头的大小与 KV 共享

    保持
    问题
    S 模型(dim 512)用 4 个 128 维的头,换成 8 个 64 维的头,或者让多个查询头共用 KV(GQA、MQA),效果和速度如何?
    结论

    保持 4 个 128 维的头,每个查询头一组 KV。

    GQA(2 组 KV)明显变差;64 维的头略差且不更快。MQA 没有运行:GQA 已经变差,只共用 1 组 KV 只会更差。

    bpb中文 +0.022英文 +0.019花费¥3W&B 曲线
  11. E004同一配置的运行间波动

    记录
    问题
    同一个配置重复训练,验证集 bpb 会差多少?差多少以内的消融结果不能当真?
    结论

    同一配置的中文 bpb 在 1.433 到 1.455 之间,五次中有四次落在 1.449 到 1.455,一次明显更好。

    差距在 0.015 以内的单次对比不能下结论。种子相同的运行在训练早期就会分叉,与显卡型号无关。

    花费¥6W&B 曲线
  12. E003双语 tokenizer 的选择

    采纳
    问题
    E001 训练的三个 tokenizer(训练文本中文占 25% / 50% / 75%)压缩率差别不到 3%,实际训练模型时哪个更好?
    结论

    zh50 最均衡,作为 V2 的 tokenizer。

    中文词表少了(zh25)中文明显变差,英文没有变好;中文词表多了(zh75)中文只好一点(0.008),英文却差得更多(0.016)。

    花费¥0.5W&B 曲线
  13. 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 曲线
  14. E001双语 tokenizer 的中英比例

    记录
    问题
    32768 词表的双语 BPE tokenizer,训练文本里中文占多少比例合适?
    结论

    中文压缩率很快饱和(中文占比从 25% 到 75%,中文只提升 5%),英文则持续受益(同一区间下降 12%)。

    三种比例的总体压缩差异在 3% 以内,暂定 zh50 为默认 tokenizer(中英都不差),最终选择用 S 模型的 bpb 验证。

    花费¥0.4W&B 曲线