从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 30 分钟 页内实验 ×2
C6 规模:训多大、喂多少 第 1 课

训一个大模型之前,能预测它训完的 loss 吗?

训之前先算
大模型只训得起一次,所以先把预算写成 C ≈ 6ND,再用一串小模型把 loss 和算力的关系拟出来往外推。真数据会告诉你:那条线在 log-log 图上不是直的,loss 有个压不掉的底。
❓

本课一问:训一个大模型,一次就要花掉全部预算。能不能在训之前,就预测它训完的 loss?

这一课先不碰:预算定了之后参数和数据怎么分(第 2 课)、模型训完还要被调用多少次(第 3 课)、学习率和 batch 怎么跟着规模变(第 4 课)、拟合方法本身靠不靠得住(岔路课)。

从已有出发

到 C4 为止,一台完整的模型已经搭好:文字 → token → 向量 → 64 层解码层 → 下一个 token 的概率;C5 让它训得动(AdamW、学习率调度、梯度裁剪)。点下面最右边的「softmax 概率」,能看到锚点模型 Qwen3.8-27B 全部参数的真实合计。

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

这一章不往流水线上加新环节,而是问一个更贵的问题:这台机器该做多大(参数 N),喂多少数据(token 数 D)?这两件事一起决定了一次训练要花多少算力,也决定了它最后能到什么 loss。

为什么这一章换了例子:前几章贯穿的「小明把苹果给了小王」是一句话,而规模问题讨论的是一整次训练——一句话里没有 N,也没有 D。所以本章换成一个贯穿任务:「如果要从头训一个 Qwen3.8-27B 这么大的模型,要多少算力、喂多少 token、学习率和 batch 取多少?」它的参数量来自真实 config,训练 token 数官方没有公开,每一课都让你自己给 D,再对照公开了数字的模型。项目侧是同一个问题的小尺度版:我们 3,688,704 参数的模型,只有 501,615 个训练 token。

这一课在缩放律演进史里的位置:

缩放律的演进:每一代都被上一代的某个真数字逼出来 · 高亮 = 本课所在的一代
  1. 起点 训完再看 没有缩放律的时候
    解决了不需要任何理论,直接训。
    卡在一次就是全部预算:DeepSeek-V3 全程 278.8 万 H800 GPU 小时,没有第二次试错机会。
  2. 第一代 幂律:用小模型外推大模型 Hestness 2017 → Kaplan 2020 你在这里
    解决了loss 随参数、数据、算力按幂律下降:参数翻倍,loss 乘以 0.9487(Kaplan 式 1.1)。幂律的多领域实证首见 Hestness 2017。
    卡在纯幂律没有底,直线外推偏乐观:Llama 3 的数据只用 ≤3×10²⁰ 的预算外推 10²²,预测 0.6574,真实 0.6931。
  3. 第一代 · 分配 Kaplan 的算力分配:主要加参数 Kaplan 2020
    解决了给出 N ∝ C0.73:预算 ×10,模型 ×5.37、数据只 ×1.86。
    卡在Gopher 280B 只训 300B token;同预算的 Chinchilla 70B 训 1.4T,MMLU 60.0% → 67.6%。
  4. 第二代 Chinchilla:参数与数据同比例长 Hoffmann 2022
    解决了每个预算扫一遍模型大小,loss 呈 U 形,谷底连成前沿:N ∝ C≈0.5,约 20 token/参数。页内用 Chinchilla 的真实点拟得 a = 0.511,外推到 5.76×10²³ 得 67.1B / 1.43T。
    卡在只算训练的账。模型要服务 10T 个 token 时,按训练最优做的模型总算力 2.02×10²⁴,换成同样 loss 的 34.1B 小模型只要 1.44×10²⁴。
  5. 解决了Kaplan 偏大的主因找到了:只数非 embedding 参数 + 规模小(Pearce & Song);末层计算、warmup、按规模调优化器(Porian)。
    卡在Chinchilla 自己的拟合系数也有错:正文取整后的系数在 5.76×10²³ 隐含 92.6 token/参数,Besiroglu 重拟合是 18.4;抛物线法本身也有偏差(Llama 3 数据上相当于 6.5% 的预算配错)。
  6. 第三代 过训练:为推理成本训小一点、久一点 LLaMA 2023 → Sardana 2023 → Gadre 2024
    解决了把推理的 2N FLOPs/token 算进总账,最优模型变小、数据变多:Llama 3 8B 1,875 token/参数,Qwen3-0.6B 60,000。
    卡在小模型上调好的超参搬不过去:按 DeepSeek LLM 的式子,10¹⁷ FLOPs 的最优学习率是 67B 那一档的 7.5 倍。
  7. 第四代 超参也拟缩放律(或换参数化) DeepSeek LLM 2024 → Qwen3 2025 → Qwen3.8 2026;μP 在 C8
    解决了最优学习率、batch 写成 C 的幂律:DeepSeek LLM 7B 预测 η = 4.25e-4,实际用 4.2e-4。
    卡在换结构、换优化器,最优点就挪:Qwen3.8 报告里旧配方末了 loss 高 7.8e-3、下游平均低 4.14 分(自报);多数团队不公开系数。
  8. 解决了缩放不止一条轴:数据从哪来(C7)、测试时多想一会儿(C12)都进了预算。
    卡在高质量数据会先用完:我们项目只有 50 万 token 语料,val 在第 300 步(约 4.9 个 epoch)最低 4.7713,之后一路升到 6.9065(实验课)。
数字口径:论文原文数字(Kaplan 2020、Hoffmann 2022、Besiroglu 2024、DeepSeek LLM 2024、Llama 3 2024、Qwen3 2025、Qwen3.8-Flash-Next 2026)与现算结果都存在 src/data/precomputed/c06-isoflop.json,由 gen_c06_isoflop.py 生成;Qwen3.8 的数字是官方自报(第③层可信度);项目一格来自 04-实践项目 的真实日志。

先自己设计:训出来再说?

最直接的想法:定一个规模,训完看 loss,不满意再换一个规模重训。

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案直接把大模型训出来,训完看 loss

两个公开的真实账本:

  • DeepSeek-V3:整个训练用了 278.8 万 H800 GPU 小时(其中预训练 266.4 万),报告按每 GPU 小时 2 美元算,约 557.6 万美元。
  • Llama 3 405B:预训练算力 3.8×10²⁵ FLOPs,是 Llama 2 最大模型的将近 50 倍(报告 §1)。

「训完再看」意味着每换一个配置就再付一次这笔钱。Chinchilla 论文开头就写:大模型通常只训得起一次,所以在开训之前估准超参数至关重要。

改进第一步:把「预算」变成一个数

要谈「用小模型预测大模型」,先得有一把统一的尺子量「花了多少」。最常用的是训练总浮点运算数:

训练算力的近似(Kaplan et al. 2020 表 1)
≈ ··
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
成立的前提:注意力里和上下文长度成正比的那部分可以忽略。Kaplan 原文写明,只有 dmodel 大于 nctx/12 时才近似成立——下面的组件里把上下文拉长就能看到它在哪失效。
模型

6ND 在哪失效:把上下文拉长(只对锚点)
🎯

试三件事:① 选「Llama 3.1 405B」,读 6ND 和报告值 3.8×10²⁵ 差多少(约 −0.2%);选「Chinchilla 70B」,6ND 比论文用的 5.76×10²³ 高约 2%。② 回到锚点 Qwen3.8-27B,把上下文从 4K 拉到 256K:锚点 16 个全注意力层的上下文项从 2N 的 1.5% 涨到 95.8%,6ND 严重低估。③ 选「我们的 minillm 基线」:7.25×10¹³ FLOPs,比 Chinchilla 最小的实验还小 5 个数量级。

⚠

常见误解:「6ND 永远准,各家报的 FLOPs 可以直接比。」

6ND 是在「上下文不长、只数矩阵乘」的前提下的近似。长上下文时注意力那一项会追上来;MoE 要换成激活参数;而且各家算法不同——Chinchilla 自己的逐项计数和 6ND 差 −1% 到 +10%(原文附录 F 表 A4);Llama 3 说 3.8×10²⁵ FLOPs 应训 402B 参数、16.55T token,但 3.8×10²⁵ ÷ (6 × 16.55T) 只有 383B,说明他们用的不是 6ND,报告没写明用的是什么。引用 FLOPs 时,要连口径一起引用。

改进第二步:loss 随规模怎么变?

有了尺子,下一个问题是:把 N、D 或 C 往大了推,loss 会以什么规律下降?这件事是被一步步问出来的:

Kaplan 的第一条定律,逐项看:

Kaplan 2020 式 (1.1):模型足够大的数据上训到收敛时,loss 只受参数量限制
= ( / )
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
极小真数字算一次:N = 10⁹ 时 L = (8.8×10¹³ / 10⁹)0.076 = 2.376;N = 2×10⁹ 时 2.254,比值 0.9487。这两个 loss 只在 WebText2 与 GPT-2 分词上有意义。

用真数据检验一次:外推准不准?

光看公式不够,拿公开的真实实验点来试。下面每个点是一个算力预算下「能达到的最低 loss」(怎么从一组模型里找出最低点,是第 2 课的内容)。先猜形状,再看数据,再只用小预算的点去外推大预算:

🎯

试三件事:① 先选一个猜测,再在「线性 / log-log」之间切换——线性图上点挤成一团,log-log 图上几乎是一条直线;② 点「只用小预算拟合」,用最小的 6 个预算外推:Llama 3 数据上,直线预测 10²² FLOPs 的最低 loss 是 0.6574,真实是 0.6931,直线偏乐观;③ 再加上压不掉的底 E,预测变成 0.6876。切到 Chinchilla 数据再做一遍(3×10²¹ 处:直线 2.0960,带 E 2.2088,真实 2.2034)。

⚠

常见误解一:「幂律就是 log-log 图上的直线,可以一直外推。」

纯幂律 L = k·C−γ 会一路降到 0,而语言本身有不可约的不确定性(「今天天气真」后面可以是「好」也可以是「热」)。越接近这个底,每多 10 倍算力换来的下降越少,点会慢慢向上弯离直线。用小预算拟直线去外推,系统性地偏乐观——上面两份真数据都是这样。所以 Chinchilla 的形式里有一项常数 E。

常见误解二:「loss 是一个数,不同模型可以直接比大小。」

Kaplan 原文说 Nc、Dc 这些尺度常数取决于词表和分词,「没有本质含义」。上面 Llama 3 数据的 loss 在 0.69–0.93 之间,Chinchilla 的在 2.2–3.0 之间,不是一个比另一个好,而是尺子不同(数据、分词、归一方式都不同)。能比的是同一套实验内部的相对变化,以及指数。

🔍 为什么偏偏是幂律?有没有理论?

没有一个公认的推导。Chinchilla 附录 D.2 给了一个动机:把 loss 拆成三部分——语言本身的熵(E)、「模型类太小」造成的近似误差(随 N 下降)、「只见过有限样本、优化没走完」造成的误差(随 D 下降),各自按经验写成幂律相加。这是有理论动机的函数形式,不是证明;Hestness 2017 自己也说这些指数「尚待理论解释」。Lilian Weng 的长文把几种理论解释(数据流形维度、统计学习的误差分解等)列在一起,可以对照着读。

证据三问

问本课的回答
① 它解决什么问题?大模型只训得起一次;用小实验预测大实验,把试错放到便宜的地方
② 数学上为什么可能有效?C ≈ 6ND 是矩阵乘的计数 ;E + A/Nα + B/Dβ 的三段分解有统计学习上的动机
③ 实验上为什么信它?多个领域、多个团队反复观测到幂律 ;DeepSeek LLM 用小实验预测 7B、67B 的 loss 基本准确(报告 §3.2 图 5,自报)。前沿报告还拿它当尺子:Kimi K3 自报「同等算力下 scaling 效率比 K2 高约 2.5 倍」,依据是内部 run 拟出的缩放律——第三方无法复现,只能算第③层可信度

一句话

📌

大模型只训得起一次,所以先把预算写成 C ≈ 6ND,再用一串小模型把 loss 随算力的规律拟出来外推——但那条线不是直的,loss 有个压不掉的底。

🚦

先停在这里:记住「6ND」和「外推要带底 E」,进下一课。
再深一层:展开上面「为什么偏偏是幂律」的 Dig,再读 Lilian Weng 的长文前三节。

下一个缺口

预算 C 定了,是做一个大模型少喂点数据,还是做一个小模型多喂点数据? → 第 2 课:算力固定,参数 N 和数据 D 怎么分?

你可能会问