跳到主要内容

把这次训练真跑起来 — 显存怎么算、曲线怎么读、什么时候该收手

这一章讲四件事: 这次训练到底要多少显存(以及那个数为什么大得吓人); 训练跑起来之后,那条曲线的七种形状分别在说什么; 再收一批数据还划不划算,怎么在一张图上当场看出来; 以及一句能当场用的判据——什么时候该停在这一步,什么时候该毕业到下一章。

它在全书链条里的位置: 第 05 章讲了一条训练样本长什么样, 这一章讲把它们真的喂进去会发生什么。 这一章末尾那句判据, 是通向第 07 章的唯一入口。

★ 这一章兑现第 01 章的一笔账:为什么装载和微调是两笔完全不同的账。

1. 先看现象:一张 80GB 的卡,装不下一个 70 亿参数的训练

第 01 章算过一笔账:700 亿参数的模型光装进显存就要 140GB。 很多人由此得到一个错误的推论:那 70 亿参数的模型只要 14GB,一张卡绰绰有余。

推论错在:那 14GB 只够它答话,不够它被训练。

真跑一次会看到什么:
① 你有一张 80GB 的卡,模型是 70 亿参数,按半精度算 14GB
② 加载完毕,显存占用 14GB。看起来还剩 66GB,很宽裕
③ 开始训练,第一步就报错:显存不够

为什么?因为训练时**同时要装四样东西**,而模型本身只是第一样。

这一章从这四样东西开始。

2. 顶层全景:训练一次要经过的四道关

关 1 装得下吗? ──► 四笔显存账(§3)
装不下 → 换更小的模型 / 换更省的做法(第 11、12 章)/ 拆到多张卡上(§4)

关 2 跑得起来吗? ──► 单卡先跑通,再上多卡(§4)
多卡有单卡没有的死法:死锁、静默发散、一卡爆全崩

关 3 在往好里走吗? ──► 读曲线(§5)。七种形状,各对应一种病因
⚠️ 训练损失接近零 = 警报,不是成功

关 4 真的学到了吗? ──► 留出集 + 四种验证动作(§6)
「看着还行」不算验证

关 4.5 再加数据还有没有用? ──► 把表现对数据量画出来(§8)
★ 曲线趴平了不等于成了,也不等于砸了 —— 要看趴在什么高度

关 5 该收手了吗? ──► 一句话判据(§9)
「我能亲手为这个输入写出完美回答吗?」

图说:**这几关的顺序不能换。** 关 3 之前谈效果没有意义,
关 4 之前谈上线没有意义,**关 4.5 之前谈「要不要再收数据」全是拍脑袋。**

主走查: 还是那 300 封拒付信,底座取 70 亿参数,一路走完这五关。

3. 关 1:训练时的显存是四笔账

四笔账各是什么

作者把它拆得很清楚1:

这一笔装的是什么有多大
参数模型本身那些数每个参数 2 个字节(半精度)
梯度每个参数「该往哪挪」的那个方向和参数一样大,每个参数 2 个字节
优化器状态优化器为每个参数记的账(第 05 章讲过它会按历史梯度调节步长,这些历史就存在这儿)通常是参数的两倍,每个参数 8 个字节
中间结果前向计算过程中每一层留下的东西,反向时要用不固定,随一次喂几条、句子多长而变

加起来的经验数是:半精度全量微调大约每个参数 16 个字节1

走查:70 亿参数要多少

70 亿参数 × 16 字节 = 112GB
├ 参数 70 亿 × 2 = 14GB
├ 梯度 70 亿 × 2 = 14GB
├ 优化器状态 70 亿 × 8 = 56GB
└ 中间结果 还没算进去,另计

→ 作者的原话:这解释了**为什么 80GB 的卡也只是勉强,
以及为什么那些「只训一小部分」的做法这么流行**[^1]。

这个 112GB 要和第 01 章那个 140GB 摆在一起看,否则会串:

那个数它是什么
第 01 章的 140GB700 亿参数 × 2 字节只是把模型装进去、让它能答话
这一章的 112GB70 亿参数 × 16 字节是把一个小十倍的模型训起来

这就是「装载」和「微调」两笔账的区别: 训练一个 70 亿的模型,比装载一个 70 亿的模型贵八倍; 它甚至逼近了装载一个大它十倍的模型的开销。 (第 01 章第 5 节许诺过「那三笔账第 06 章算」,这里还上了—— 那三笔就是梯度、优化器状态、中间结果。)

顺带一个默认值:两种半精度不一样

作者用一段专门讲这件事,因为选错会直接让训练崩2:

一种另一种(默认选这个)
名字float16bfloat16(bf16)
16 个位怎么分精度多(10 位)、范围小(5 位)精度少(7 位)、范围大(8 位)
后果训练中梯度和中间结果偶尔会飙到它表示不了的大小,溢出、损失变成无效值、整轮训练报废飙上去也接得住,训练更稳;代价是精度略低,实践中几乎无所谓

一句话口径:硬件支持就用 bf16。 只支持前一种的老硬件,需要额外小心地做数值缩放和裁剪2

4. 关 2:装不下的时候,拆到多张卡上

书里讲了两大类做法,它们省的不是同一样东西3:

做法每张卡上放什么省了什么代价
每张卡各算一批数据整个模型的完整副本什么都不省,只是快显存需求一点没降
把状态切开分给各张卡参数、梯度、优化器状态各存一小片,要用时通过通信凑齐每张卡的显存需求大幅下降多了通信开销

第二类是解决「装不下」的那一类。 作者说它把两类并行的好处结合起来: 每张卡只存总状态的一小部分,同时保持数据并行那种简单的编程模型3

走查: 那 112GB 的活,切成四份分给四张 24GB 的卡,每张卡只扛 28GB。 这就是从「跑不了」变成「跑得了」的那一步。

但多卡有单卡没有的死法

作者专门用一个警告框列了三种4:

故障长什么样
死锁几张卡在等一个永远不会到达的通信,整个训练卡住不动
静默发散梯度同步有 bug,各张卡上的模型状态开始不一样,训练悄悄地跑歪
一卡爆全崩其中一张卡显存不足,整轮训练崩掉

注意第二种最毒:它不报错。 你会得到一个跑完了的训练和一个坏掉的模型。

由此得到一条作业顺序:先在单卡上跑通,再上多卡。 排查这些问题需要懂分布式系统,而那不是你在调模型时该分心去学的东西4

5. 关 3:七种曲线形状,以及那个最容易误读的信号

曲线是这一步的生命体征

作者的比方是:损失曲线之于做模型的人,就像生命体征图表之于医生—— 它是「事情是不是在按该有的样子进行」的首要指标; 学会读它,是这一行最值钱的技能之一5

而且他提醒:后训练里很多指标的行为,对习惯了传统做法的人来说相当反直觉—— 这里说的「传统做法」指的是后训练出现之前那一大类机器学习任务 (拿标注好的数据训一个模型去做分类、预测这些活)5

七种形状对照表

这是书里的诊断表,我们按自己的说法重写,并加上走查里的场景6:

曲线长什么样多半是什么毛病怎么办
一直不降学习率太低 / 数据加载有 bug / 格式对不上学习率提十倍;检查数据流水线;核对对话模板
剧烈上下抖学习率太高学习率降十倍;加一段热身
突然一根尖刺数值不稳 / 梯度爆掉打开梯度裁剪;降学习率;去找有没有异常样本
缓慢往上爬灾难性遗忘(第 04 章那件事)降学习率;加约束;检查数据分布
训练在降、验证在升学过头了早点停;加正则;补数据
训练损失接近 0背下来了减少轮数;加正则;提高数据多样性
两条都很早就走平学不动 / 容量到顶提学习率;训久一点;换更大的模型
验证曲线抖得厉害验证集太小 / 分布不匹配加大验证集;检查验证集的分布

健康的曲线长什么样: 一开始快速下降(模型在适应新数据的分布), 然后逐渐变平7

最容易误读的那一个:损失接近零

书里用一个警告框单独讲它:

训练损失掉到接近零不是成功信号,是警报。 在微调里,极低的损失通常意味着背下来了,而不是学会了—— 模型学会的是逐字复现训练样本8

走查里的样子:

那 300 封拒付信训到第五轮,训练损失 0.08。
├ 看起来:完美
└ 实际上:拿一份**没见过**的理赔记录进去,
它写出来的信里出现了训练集里某位被保人的名字。

→ 这不是学会了「怎么写拒付信」,是背下了那 300 封。

6. 关 4:「看着还行」不算验证

现象

作者对这件事的批评很直接:看几条生成结果、宣布模型「看起来不错」,有时很诱人。 问题在于我们训练的往往是难以定义、甚至可以合理地各执一词的东西; 靠模糊印象会招来偏见和过度自信9

他还点名:很多出于好意的教程正是掉进了这个坑9

他给的标准是:「那几条生成结果看着还行」这句话,过不了大多数干系人那一关。 印象必须变成定量的定义9

留出一部分数据的两条讲究

留出集(拿来验证、不参与训练的那部分数据)不是随便切一刀就行的10:

  1. 它必须代表部署时的条件。 从和训练数据同一个分布里切出来的验证集, 量的是「模型拟合这个分布的能力」,不是它在真实场景里管不管用;
  2. 很多场景下还要在时间上分开。 如果训练数据来自一个时间段、 而部署会遇到更晚时期的数据,验证集就该取更晚的那一段

走查: 那 300 封信如果全是 2023 年的,验证集应该取 2025 年的—— 因为保单条款和话术在这两年之间改过。

四个动作,比看损失有用

动作做什么抓得到什么
生成测试拿一批有代表性的提示词跑一遍,读输出格式细错、语气不对——损失捕捉不到的东西11
对比验证同一批提示词,让微调后的模型和底座各答一遍,并排看(也可以和训练途中存下来的某个中间版本比,那种中间存档叫检查点)这次微调到底是改进了还是改坏了12
记忆化测试把几条训练样本换个说法,看它怎么答学会了的模型会给出合适但不同的回答;背下来的会吐出原样13
自动校验有客观对错的部分交给程序验教它按机器好读的固定格式输出(比如 JSON,一种用大括号和引号把键值对括起来的通用数据格式),就写个程序去校验它合不合法;教它从文本里抽出指定的几项内容,就核对抽得对不对14

这四个动作的共同点:它们都不需要新的基础设施,当天就能做。 (真正成体系的评估是第 10 章整章的事,这一章只到「训练中看得见的信号」为止。)

7. 顺带把账算清楚:钱花在哪三处

作者把成本分成三类,并且给出了一个反直觉的排序15:

类别说明
算力大致随参数量、数据量、训练轮数线性增长。书给的粗估:70 亿参数、10 万条样本、三轮,大约 10 到 20 个显卡小时
存储检查点、数据集、日志
人力对质量要求认真的项目,这一项通常是大头

作者的点评值得记住:算力得到的关注远超它应得的份额—— 因为它有账单、看得见,而人力成本藏在工资里15

他还给了一个很朴素的习惯建议:那些估得极准的架构师靠的不是资历, 是一个习惯——每次都回头去看账单。 不要只因为任务跑完了就满意, 要问:比预期贵吗?能不能换一种服务、换一种规格?16

8. 关 4.5:再加数据还有没有用——那条会趴下去的曲线

结论先行:再花钱收下一批数据之前,先把手上已有的数据画一张图,看曲线还陡不陡。 关 4 判的是「学到了没有」,这一关判的是**「继续往里投值不值」**。

先说现象。 头 100 条样本带来的改善大得惊人;涨到 1000 条还有明显改善; 涨到 10000 条仍然在改善——但每一次翻倍拿回来的东西越来越少

最后会走到一个地步:数据量翻一倍,带来的那点提升, 已经和「同一批数据、同一套设置反复训几遍,分数本来也会有的上下浮动」分不清了—— 那点浮动就叫噪声(它来自抽哪几条当验证集、参数初值抽到什么,每次都不完全一样)。

提升一旦掉进噪声里,你就说不清它是提升还是运气17

书给这个形状起了名字。先说事情本身:每把数据量乘上同一个倍数(比如每次乘十), 表现才增加大致相同的一截。 100 → 1000 涨一截,1000 → 10000 再涨同样的一截; 而这两步的代价完全不同——第一步多收 900 条,第二步要多收 9000 条,拿回来的却一样多。这种「乘法换加法」的形状叫对数关系,书说表现与数据量的关系近似就是它。

怎么当场看出自己在曲线的哪一段

做法朴素:横轴放数据量,纵轴放留出集上的表现,而横轴按「每格乘十」来刻17。 这种刻法叫对数刻度——第一格 100、第二格 1000、第三格 10000, 而不是均匀的 100、200、300。

为什么非要这么刻: 在这种刻法下,那条近似对数的曲线会被拉成一条近似的直线, 「还在往上走」和「已经趴了」一眼可辨。按均匀刻度画,前面几个点全挤在最左边一小段里, 什么也看不出来。

图上看到什么意思该做什么
曲线还很陡你还在陡的那一段继续收数据——书说这是眼下能做的回报最高的一笔投入
曲线正在压平快到头了再收也涨不了多少,那些时间和钱是白花的

平台期有两种,含义正好相反

这是这一节真正值钱的一句。曲线趴平了,不能直接读成「成了」或者「砸了」—— 要看它趴在什么高度上17:

曲线趴平了 → 去看留出集上的表现(就是关 4 那个留出集)

├─ 表现满意 → **趴平 = 成功。** 该学的它已经学到了,收手

└─ 表现不满意 → **趴平 = 这条路到头了。**
★ 再加同一种数据没有用 —— 不是量不够,
是这批数据能教的,它已经全学会了
→ 要么换数据的性质(质量更高、来源不同),
要么换方法(下一关会把你送到第 07 章)

图说:趴平这个信号本身不含好坏,它只说「这批数据的力气用尽了」。
好坏由高度决定。**看错了这一点,就会在一条已经走死的路上继续加钱。**

走查:那 300 封信画出来是什么样

(下面这几个数是为演示编的,不是书里给的,也不是真实数值。)

横轴按每格乘十来刻,纵轴是留出集上「格式与条款引用全对」的比例:

30 封 ──► 41%
100 封 ──► 63% ← 比上一格 +22
300 封 ──► 74% ← 比上一格 +11 ★ 这是我们手上的位置
(1000 封 ──► ? )

读法:每往右一格,涨幅大约减半 —— 22 → 11 → 下一格大概只剩五六个点。
曲线还在往上走,还没有压平。

★ 结论:再收 700 封凑到 1000 封,预期能到 80% 上下。
值不值得,取决于 74% 够不够用 —— 而「够不够」不是技术问题,
是第 03 章那条判据:这封信是给被保人看的,不是给内部同事看的。

9. 关 5:什么时候该收手——一句能当场判的话

这是这一章的落点,也是通向第 07 章的唯一入口。

作者说这是一项必备技能:知道什么时候停在这一步、什么时候往下走18

这一步够用的那些情况有一个共同点

想要的行为,能不能用例子演示出来。19

他给的典型成功案例都属于这一类:

  • 格式适配——教它输出 JSON、Markdown 或别的结构化格式。 你能写出正确格式的例子,模型能从里面学会,活就干完了;
  • 文风迁移——给它看目标写作风格的例子,它就学会那个风格;
  • 领域词汇的采用、结构化输出、模板遵循、引用格式—— 任何「你能产出覆盖情况的完美例子」的任务19

那句判据

作者把分界线说得非常干净:

共同的线索是:你能不能演示正确行为,而不只是认得出它。 这一步要的是「正确行为的示范」,而下一步要的只是「对行为的评价」。 那些质量容易评判、却难以产出的任务,才是需要下一步的地方20

翻译成一句可以当场自问的话:

┌──────────────────────────────────────────────┐
│ 「我能亲手为这个输入写出完美回答吗?」 │
├──────────────────────────────────────────────┤
│ 能 → 停在这一步。SFT 就够了 │
│ 只答得出 → 毕业。去第 07 章 │
│ 「我看到好的 │ │
│ 能认出来」 │ │
└──────────────────────────────────────────────┘

拿走查判一判:

要求我能亲手写出完美答案吗结论
信的格式、段落顺序、必含字段,写一封样板就行SFT 够
条款引用的写法SFT 够
「语气要专业而不冷漠、坚定而不居高临下」写不出来。但两封摆在面前,合规专员一眼能挑出更好的那封✗ 到头了,去第 07 章

这就是这本书从第 05 章走到第 07 章的全部理由。

书对这句判据的分量说得比我们还重: 它说这一个问题预测该用哪种技法, 比任何技术上的考量都准;而「我看到好的能认出来」这个回答,书还给了它一个现成的名字—— 柠檬测试(Lemon test),并说凡是只答得出这句的任务,通常都需要下一章那种做法21

顺带把两头的典型例子摆一下,这样这条线才立得住21:

一类例子过不过得了「我写得出完美答案吗」
格式类输出 JSON、按模板填字段轻松通过 —— 停在这一步
创作类写得引人入胜、写得有说服力常常过不了 —— 去第 07 章

10. 作者的判断与证据

说法是哪一类说明
每个参数约 16 个字节、70 亿要 112GB可自行验算2+2+8 = 12 加上中间结果的浮动,书自己写的是「经验法则」1
bf16 是更好的默认有机制说明两种格式的位分配是硬事实;「实践中精度损失几乎无所谓」是作者的判断2
曲线七种形状的病因作者整理的诊断表每一行都是经验对照,书没有给实验支撑
训练损失接近零 = 背下来了作者的论断说理清楚,没有配实验8
70 亿 / 10 万条 / 三轮 ≈ 10–20 显卡小时粗估作者自己写明「估算训练时间不是精确的科学」15
人力成本通常是大头作者的经验没有数据,但和第 01 章那句「标注花掉的钱与算力相当」互相印证
「能演示 vs 只能评判」这条分界作者的框架这是全书最重要的判断工具之一,它是定义性的,不是被检验的

11. 边界与局限

  1. 这一章不讲怎么搭训练环境。 书里给了配置片段和几个框架的名字, 我们不抄配置——它们半年就会变。 实现细节请查我们前沿书架上对应的拆解22
  2. 诊断表只给了「多半是什么毛病」。 真实排查常常要同时试两三条, 书没有给排查顺序(第 08 章倒是给了偏好训练的排查顺序)。
  3. 成本那一节的数字过期得最快。 显卡小时的单价、卡的型号, 书自己标的口径是 2026 年初
  4. 多卡训练只讲了「有哪两类、各省什么」。 更深的并行方式书里只点名不展开, 它明说那是基础实验室那一档的事(第 01 章讲过分档)。
  5. 这一章的验证只到「训练中看得见的信号」。 「怎么证明它对业务真的更好」 整块在第 10 章,两章的边界写死在这里,不重复。

12. 可带走的

  1. 训练显存是四笔账:参数 + 梯度 + 优化器状态 + 中间结果; 半精度全量微调约每个参数 16 个字节;
  2. 70 亿参数训练要约 112GB —— 所以 80GB 的卡也只是勉强, 这就是所有省显存技法的动机;
  3. 装载和微调是两笔账:训一个 70 亿的模型,比装一个 70 亿的贵八倍;
  4. 硬件支持就用 bf16,它的表示范围大,接得住训练中偶尔的数值飙升;
  5. 多卡有两类做法:各算各的数据(只变快)和把状态切开分给各卡(省显存);
  6. 多卡有单卡没有的死法,其中「静默发散」最毒,因为它不报错。先单卡跑通;
  7. 曲线一直不降,先怀疑对话模板(第 05 章那件事),不是先怀疑学习率;
  8. 训练损失接近零是警报不是成功 —— 那通常意味着背下来了;
  9. 验证集必须代表部署条件,很多场景还要在时间上分开;
  10. 四个当天就能做的验证动作:读输出、和底座并排比、把训练样本换个说法再问、 能自动校验的就自动校验;
  11. 成本三类里人力通常是大头,而算力因为看得见拿走了过多注意力;
  12. 表现与数据量近似是对数关系:每乘上同一个倍数才涨同样一截, 所以要判断「还该不该收数据」,就把表现对数据量画在对数刻度上看曲线陡不陡;
  13. 曲线趴平了有两种相反的含义:留出集表现满意 = 成功,收手; 不满意 = 这条路到头了,再加同类数据没用,得换数据性质或者换方法;
  14. 收手判据:「我能亲手为这个输入写出完美回答吗?」 能就停在这里;只答得出「我看到好的能认出来」(书叫它柠檬测试),才去第 07 章。 书说这一个问题比任何技术上的考量都更能预测该用哪种技法。

13. 原文地图

主题原书章原文位置
训练循环四步From Theory to GPU Clusterstext/38-fm-from-theory-to-gpu-clusters.txt:9(搜「backward pass then computes gradients」)
显存四笔账与 16 字节From Theory to GPU Clusterstext/38-fm-from-theory-to-gpu-clusters.txt:88(搜「approximately 16 bytes per parameter」)
两种半精度的区别From Theory to GPU Clusterstext/38-fm-from-theory-to-gpu-clusters.txt:90(搜「dynamic range」)
两类并行、分片Notetext/40-fm-note.txt:78(搜「Data parallelism replicates」) · text/40-fm-note.txt:82(搜「Fully sharded approaches」)
分布式独有的故障WARNINGtext/41-fm-warning.txt:3(搜「Deadlocks occur」)
成本三类与粗估WARNINGtext/41-fm-warning.txt:7(搜「human effort typically dominates」) · text/41-fm-warning.txt:11(搜「10 to 20 GPU」)
回头看账单的习惯ALWAYS BE COSTINGtext/42-fm-always-be-costing.txt:5(搜「retrospectively examining the bill」)
曲线是生命体征Reading Training Signalstext/43-fm-reading-training-signals.txt:7(搜「vital signs chart」) · text/43-fm-reading-training-signals.txt:3(搜「counterintuitively」)
曲线诊断表Reading Training Signalstext/43-fm-reading-training-signals.txt:19(搜「Loss does not decrease」) · text/43-fm-reading-training-signals.txt:51(搜「Memorization」) · text/43-fm-reading-training-signals.txt:67(搜「rapid initial decline」)
损失接近零是警报WARNINGtext/44-fm-warning.txt:3(搜「not a success signal」)
留出集的两条讲究WARNINGtext/44-fm-warning.txt:7(搜「represents deployment conditions」) · text/44-fm-warning.txt:9(搜「temporal separation」)
四个验证动作WARNINGtext/44-fm-warning.txt:17(搜「generation testing」) · text/44-fm-warning.txt:19(搜「Comparative verification」) · text/44-fm-warning.txt:21(搜「Memorization testing」)
「看着还行」不算验证VIBES AREN'T VERIFICATIONtext/45-fm-vibes-aren-t-verification.txt:3(搜「looks good」) · text/45-fm-vibes-aren-t-verification.txt:7(搜「quantitative definitions」) · text/45-fm-vibes-aren-t-verification.txt:9(搜「validate the JSON」)
何时停在 SFT、那条分界When SFT Is Enoughtext/46-fm-when-sft-is-enough.txt:7(搜「demonstrated through examples」) · text/46-fm-when-sft-is-enough.txt:9(搜「format adaptation」) · text/46-fm-when-sft-is-enough.txt:11(搜「easy to assess but hard to generate」)
递减回报、对数刻度、两种平台期Notetext/47-fm-note.txt:7(搜「approximately logarithmic」) · text/47-fm-note.txt:9(搜「on a log scale」) · text/47-fm-note.txt:11(搜「plateau can mean two things」)
柠檬测试、格式类与创作类Notetext/47-fm-note.txt:3(搜「the Lemon test」)

Footnotes

  1. 出处:「From Theory to GPU Clusters」第 88 段(text/38-fm-from-theory-to-gpu-clusters.txt:88,搜「approximately 16 bytes per parameter」)。原文的拆分是:参数 2 字节、梯度 2 字节、优化器状态 8 字节(对那个默认优化器而言,状态通常是参数的两倍大),中间结果另计、随一次喂几条和句子多长而变。最后那句原文是:70 亿参数的模型因此在训练开销上大约需要 112GB(还没算中间结果),这解释了为什么 80GB 的卡也只是勉强,以及为什么那些只训一小部分参数的方法这么受欢迎 2 3

  2. 出处:「From Theory to GPU Clusters」第 90 段(text/38-fm-from-theory-to-gpu-clusters.txt:90,搜「dynamic range」)。原文写明两者都用 16 个位但分配不同(10 位精度 / 5 位范围,对 7 位精度 / 8 位范围),而 bfloat16 的表示范围与 32 位一致;训练中梯度与中间结果偶尔会飙出 float16 的范围,导致损失变成无效值、训练失败。作者说在支持的硬件上 bfloat16 是更好的默认,并点名了几代显卡。位宽这件事第 11 章会正面讲。 2 3

  3. 出处:「Note」第 78 段(text/40-fm-note.txt:78,搜「Data parallelism replicates」)与第 82 段(text/40-fm-note.txt:82,搜「Fully sharded approaches」)。第一类做法在每张卡上放整个模型的副本、各处理不同批数据,算完之后同步梯度;有效批大小随卡数增长(四张卡各处理 4 条,等于批大小 16)。第二类把参数、梯度、优化器状态切开分到各卡,要用时通过通信凑齐。书里点名了两套实现(第 84 段,text/40-fm-note.txt:84,搜「CPU and NVMe offloading」),并说其中一套提供更多配置选项,包括在显存极端紧张时把状态卸载到内存或硬盘。 2

  4. 出处:「WARNING」第 3 段(text/41-fm-warning.txt:3,搜「Deadlocks occur」)。原文那句「梯度同步的 bug 会让不同卡上的模型状态不一致,导致训练静默地发散」是这一条里最值得记的;作者的结论是排查这些需要懂分布式系统。 2

  5. 出处:「Reading Training Signals」第 7 段(text/43-fm-reading-training-signals.txt:7,搜「vital signs chart」)与第 3 段(text/43-fm-reading-training-signals.txt:3,搜「counterintuitively」)。第 3 段的提醒是:在传统机器学习里,梯度范数和训练曲线基本能讲完整个故事;后训练里不是这样,而且很多指标的行为对习惯了传统指标的人来说相当反直觉 2

  6. 出处:「Reading Training Signals」第 19 段起的表 3-1(text/43-fm-reading-training-signals.txt:19,搜「Loss does not decrease」;text/43-fm-reading-training-signals.txt:51,搜「Memorization」)。我们按自己的说法重写了这张表,没有照抄。 表里那条「一直不降 → 检查对话模板」和第 05 章第 6 节讲的是同一件事。

  7. 出处:「Reading Training Signals」第 67 段(text/43-fm-reading-training-signals.txt:67,搜「rapid initial decline」)。

  8. 出处:「WARNING」第 3 段(text/44-fm-warning.txt:3,搜「not a success signal」)。原文:极低的损失通常表明的是背诵而不是泛化——模型学会了逐字复现训练样本 2

  9. 出处:「VIBES AREN'T VERIFICATION」第 3 段(text/45-fm-vibes-aren-t-verification.txt:3,搜「looks good」)、第 5 段(text/45-fm-vibes-aren-t-verification.txt:5,搜「well-meaning tutorials」)、第 7 段(text/45-fm-vibes-aren-t-verification.txt:7,搜「quantitative definitions」)。原文承认我们训练的东西「难以定义、甚至可能是可以合理地各执一词的」,正因如此才不能靠印象。 2 3

  10. 出处:「WARNING」第 7 段(text/44-fm-warning.txt:7,搜「represents deployment conditions」)与第 9 段(text/44-fm-warning.txt:9,搜「temporal separation」)。第 11 段(text/44-fm-warning.txt:11,搜「Evaluation frequency」)还讲了评估频率的取舍:每一步都评能立刻发现问题但开销大、信号还噪;只在最后评则很省但发现问题时已经晚了

  11. 出处:「WARNING」第 15 段(text/44-fm-warning.txt:15,搜「but not what」)与第 17 段(text/44-fm-warning.txt:17,搜「generation testing」)。第 15 段那句是这一节的总纲:损失曲线确认模型在学某种东西,但不确认它在学什么;一个验证损失很漂亮的模型,输出仍可能在损失捕捉不到的地方出错——细微的格式错、语气不匹配。这一步就是第 05 章那个「凭感觉测」的系统化版本。

  12. 出处:「WARNING」第 19 段(text/44-fm-warning.txt:19,搜「Comparative verification」)。做法是让微调后的模型和底座(或上一个检查点)对同一批提示词各答一遍,并排看。

  13. 出处:「WARNING」第 21 段(text/44-fm-warning.txt:21,搜「Memorization testing」)。判据很清楚:泛化了的模型会给出合适但不同的回答,背下来的会吐出训练样本原样。

  14. 出处:「VIBES AREN'T VERIFICATION」第 9 段(text/45-fm-vibes-aren-t-verification.txt:9,搜「validate the JSON」)。原文:对有客观正确性判据的任务,自动校验是人工检查的补充——教会模型产出合法的 JSON,就去校验 JSON;教会它做结构化抽取,就去核对抽取的准确率。书还在这里给了一张验证指标速查表(第 11 段起),我们把成体系的评估整块留给第 10 章。

  15. 出处:「WARNING」第 7 段(text/41-fm-warning.txt:7,搜「human effort typically dominates」)与第 11 段(text/41-fm-warning.txt:11,搜「10 to 20 GPU」)。原文明说算力「得到了不成比例的关注」;而估算训练时间「不是一门精确的科学」,不结合训练逻辑、代码和加速器就不可能猜准。 2 3

  16. 出处:「ALWAYS BE COSTING」第 5 段(text/42-fm-always-be-costing.txt:5,搜「retrospectively examining the bill」)。作者说那些估算极准的人靠的不是资历,而是「总去查任务成本」这个习惯;我们容易只因为任务以 0 退出码结束就满意。

  17. 出处:「Note」第 7 段(text/47-fm-note.txt:7,搜「approximately logarithmic」)、第 9 段(text/47-fm-note.txt:9,搜「on a log scale」)、第 11 段(text/47-fm-note.txt:11,搜「plateau can mean two things」)。第 7 段的原话是:改善的模式是可预测的——头几个样例带来剧烈改善,数据集越大、增量越小,最终会走到「数据量翻倍带来的提升和噪声几乎分不开」的地步。第 9 段给了那个作业方法与它的两种读数:曲线在压平就说明再加数据帮不上多少忙;曲线还很陡,那么加数据就是当下可做的回报最高的投入。第 11 段是两种平台期:验证表现满意 = 该学的学到了、活干完了;不满意 = 这一步对这个任务到头了,当前表现与目标表现之间那道差距,靠更多同类样例是填不上的,要么换数据的性质(质量、分布),要么换方法。书还明说:在不满意那一侧看到平台期,信号是「重新考虑或改变策略」,不是「再去收数据」。 走查里那几个百分比是我们为演示编的,书没有给具体数值。 2 3

  18. 出处:「When SFT Is Enough」第 3 段(text/46-fm-when-sft-is-enough.txt:3,搜「essential skill」)。原文:更高级的做法要求可观的额外基础设施和专业能力;对相当广的一类任务,SFT 本身就是最优解。

  19. 出处:「When SFT Is Enough」第 7 段(text/46-fm-when-sft-is-enough.txt:7,搜「demonstrated through examples」)与第 9 段(text/46-fm-when-sft-is-enough.txt:9,搜「format adaptation」)。原文把格式适配称为「典范式的成功案例」——你能写出正确格式的例子,模型能学会,事情就结束了。 2

  20. 出处:「When SFT Is Enough」第 11 段(text/46-fm-when-sft-is-enough.txt:11,搜「easy to assess but hard to generate」)。原文的分界:SFT 要求的是正确行为的示范,而下一步的做法要求的只是对行为的评价;质量易评、难产出的任务,就是需要下一步的地方。这句话是第 07 章的入口。

  21. 出处:「Note」第 3 段(text/47-fm-note.txt:3,搜「the Lemon test」)。原文把这句自问写成:「我能为这个输入写出完美的回答吗?」——对领域里大多数输入都答得出「能」,这一步多半会成;只答得出「我看到好的能认出来」,就需要下一步那种做法。它还写明格式类任务(JSON、结构化输出)轻松通过这道示范测试,创作类任务(写得引人入胜、写得有说服力)常常通不过,并说这一个问题预测该用哪种技法,比任何技术上的考量都准。「柠檬测试」是书给「我看到好的能认出来」这句话起的名字。 2

  22. 补充(不在书里,依据我们的 frontier 书架):训练框架的具体用法我们不重讲。 依据: shelf=ai-frontier-reference/trl#01-trainer-family.md 事实=那一篇拆的正是这一族训练器各自负责哪一段流程,与本章讲的「训练循环四步」一一对得上。