跳转到内容

第 24 章 模型、数据与算力如何共同扩展

假设下一次实验的算力预算已经固定。我们可以把 Mini GPT 加宽,也可以让它接触更多文本,或者把原有文本再训练几遍。这些选择改变的量并不一样。第 600 步的快照已经提醒过我们:多做更新,训练损失可能下降,验证损失却可能变差。我们需要资源估算,也需要评价规则,不能只说“全部做大”。

本章使用纸笔就能算清的给定预算,表中候选没有真的训练过。先数计算工作,再看实测的规模研究能为这些计数补充什么,最后检查:训练时最合算的选择,提供服务时也最省吗?

24.1 先数一次矩阵运算,再数整次训练

Section titled “24.1 先数一次矩阵运算,再数整次训练”

回想第 5 章的一行向量乘矩阵。假如矩阵有 100 个元素,每个元素都在这次运算中使用一次,就大约需要 100 次乘法和 100 次加法。这里把一次乘法与一次加法计为 两次浮点运算 ,即使硬件可以用一条指令把它们合起来做。因此,前向计算大约需要 200 FLOPs。FLOPs 数运算次数,FLOP/s 数每秒完成多少次;速率更大,不等于模型更大。

现在假设,稠密模型中占主要计算量的矩阵共有一亿个参数。处理一个 token,应用这些权重大约需要 2×100,000,0002\times100{,}000{,}000 次运算。再采用一个估算约定:反向计算大约是前向的两倍。那么,前向加反向就是每个训练 token 需要 3×2×100,000,000=600,000,0003\times2\times100{,}000{,}000=600{,}000{,}000 次运算。处理二十亿个训练 token,得到 600,000,000×2,000,000,000=1.2×1018600{,}000{,}000\times2{,}000{,}000{,}000=1.2\times10^{18} 次。

这就引出了常见的稠密模型近似式:

Ctrain≈6ND.C_{\text{train}}\approx 6ND.

NN 是计入的稠密权重参数数目,DD 是训练中实际处理的 token 暴露次数,CtrainC_{\text{train}} 是以 FLOPs 计的训练工作量。六来自两个约定:乘加算两次,前向加反向约为前向的三倍。参数和 token 都不是字节;这个乘积估计计算,不估计存储。

它没有计入优化器工作、通信、重复计算和部分词表相关开销;当稠密矩阵运算占主导时,还忽略了随上下文长度变化的成对注意力计算。查一行嵌入,并不是每个 token 都要乘遍嵌入表的全部元素。Kaplan 等人的参数定义明确排除嵌入,其他报告也可能采用不同口径。本章表中的 NN 指占主要计算量的稠密权重计数。因此,直接把 MG-2 的全部 13875 个数值乘六,只能得到粗略代用值,算不上对其前向程序的精确审计。

例 24.1:同一份训练计算预算,怎样分给模型和数据。 给定上限为 1.2×10181.2\times10^{18} FLOPs。M 表示一百万,B 表示十亿,都采用十进制单位。每行只是一个候选预算,数据质量、优化和架构的其他条件尚未指定。现在要判断的是哪些方案装得下,不是哪个模型最好。

表 24.1:训练乘积相等,分配方式不同。 暴露次数与参数的比值只是计数之比,不是推荐规则。

方案参数 NN训练暴露 DDD/ND/N估计训练 FLOPs
A100M2B201.2×10181.2\times10^{18}
B200M1B51.2×10181.2\times10^{18}
C50M4B801.2×10181.2\times10^{18}

B 把参数从 100M 翻到 200M,就要把 2B 暴露减半为 1B,才能保持乘积不变。C 把参数减半,就能处理两倍的暴露。三行乘出来都达到同一上限。如果 B 仍保留 A 的 2B 暴露,估算就变成 2.4×10182.4\times10^{18},超出预算一倍。

如果可用的独立数据池只有 1B 个 token,C 的 4B 暴露就需要重复使用,或者另外获取数据。固定池训练四遍,与训练四十亿个独立 token 消耗的矩阵计算量近似相同,信息却不同。第 23 章的配比和重叠记录仍然必需。光看此表,我们也不知道 B 训练得是否充分、C 的容量是否足够,或任一方案是否保留了制度更新。

再 给定 一个有效训练速率 101310^{13} FLOP/s,这不是实测值。A 的耗时估计为 1.2×1018/1013=120,0001.2\times10^{18}/10^{13}=120{,}000 秒。每小时 3600 秒,所以约为 33.33 小时。如果有效速率减半,时间就翻倍为 66.67 小时。硬件规格中的峰值速率不会自动成为有效速率:精度、内核、内存读写、通信和利用率都会影响它。这是在检查假设改变后的结果,不是在承诺某块 GPU 的表现。

24.3 拟合曲线能指路,但有适用条件

Section titled “24.3 拟合曲线能指路,但有适用条件”

运算次数算不出损失。要研究两者的关系,研究者需要改变参数和数据,训练多组模型,记录规定好的损失,再用简洁形式拟合观测。在这里,规模规律(scaling law) 是有测量范围和拟合假设的经验关系。名称里有“law”,也不会让它变成自然定律。

例 24.2:读懂幂关系,同时分清它不是测量。 作者给定三个点:参数为 100M、400M、1600M 时,损失分别为 4、3、2.5 奈特,并假设不存在其他瓶颈。给定的极限底值为 2 奈特,减去它,剩余损失依次为 2、1、0.5。参数每变为四倍,这部分就减半。

表 24.2:一条能逐项检查的给定曲线。 这些点是教学构造,不是表 24.1 中模型的训练结果。

参数相对大小 x=N/(100M)x=N/(100\text{M})给定损失超出 2 的部分
100M142
400M431
1600M162.50.5

1、4、16 的平方根分别为 1、2、4,用 2 除以它们,就得到最后一列。因此规则为:

L(x)=2+2x−1/2.L(x)=2+2x^{-1/2}.

LL 是每个目标的给定损失,单位为奈特;xx 用参数计数除以参数计数,因此没有单位。指数 −1/2-1/2 表示平方根的倒数。代入 x=4x=4,有 2+2/2=32+2/2=3,正好对应中间一行。代入 x=64x=64 会预测 2.25,但这个值超出了给定范围,属于 外推(extrapolation) ,不是又多了一个观测点。

普通坐标轴上,相同距离表示增加同样的数值;对数坐标轴上,相同距离表示乘以同样的倍数。如果画的是 减去底值后的损失 ,而非总损失,那么在双对数坐标中,本例反复出现的“四倍/一半”会排成直线,斜率为 ln⁡(1/2)/ln⁡(4)=−1/2\ln(1/2)/\ln(4)=-1/2。第 6 章已经介绍对数,这里用它把比例变为差值。不减去假定底值,总损失就不会沿这条精确直线变化。真实拟合中的底值和指数,也都是估计出来的,并非预先知道的真理。

把参数和数据限制放在一起拟合,同样需要这种谨慎。一种可能的经验形式为:

L^(N,D)=E+ANα+BDβ.\widehat L(N,D)=E+\frac{A}{N^{\alpha}}+\frac{B}{D^{\beta}}.

帽子表示这是预测。EE 是拟合底值,A,BA,B 根据所选计数单位确定两项的尺度;正指数 α,β\alpha,\beta 描述两项怎样下降。它们都不是准确率保证。例如,若第一项超额固定为 1,第二项为 0.5,预测就是 E+1.5E+1.5;只增加数据可以减小第二项,却留下第一项。换 tokenizer 或评测分布,会改变损失的含义,也可能使原拟合不再适用。

24.4 “训练最优”要先说清楚优化什么

Section titled “24.4 “训练最优”要先说清楚优化什么”

在预算约束下,训练计算最优(compute-optimal training) 问的是:对已有测试或拟合的方案,怎样分配资源,才能让指定损失最低。它没有直接问当前制度答不答得对、延迟最短是多少,或维护是否容易。

Kaplan 等人研究了其模型、数据和训练设置下的规模关系。Hoffmann 等人用多种拟合方式和训练时长重新研究参数与 token 分配,在其实验中发现,两者适合大致共同增长。这些是方法不同的经验研究。常被转述的某个“token/参数”比例,不应硬套到所有语料、稀疏模型和部署环境。表中 A 的比值为 20,只说明它的算术关系;没有可比的损失实验,不能据此认定 A 最优。

固定训练预算
  1. 模型之外A: N = 100M; D = 2B
  2. 模型之外B: N = 200M; D = 1B
  3. 模型之外C: N = 50M; D = 4B

三个候选的 6ND 都为 1.2 × 10¹⁸ FLOPs;乘积不会给出质量结论。

后续生成
  1. 处理步骤A:再加 2 × 10¹⁸ FLOPs
  2. 处理步骤B:再加 4 × 10¹⁸ FLOPs
  3. 处理步骤C:再加 1 × 10¹⁸ FLOPs

给定近似为 2NS,S 为一百亿输出 token;尚未计入注意力、提示处理及利用率。

图 24.1:乘积相等,不表示质量或服务成本相等。 本书原创图示 · CC BY-SA 4.0。

图 24.1 给预算加上第二阶段。假设三个候选此后都生成给定的 S=10BS=10\text{B} 个输出 token,即一百亿个。为做粗比较,先忽略提示处理、注意力和缓存影响。只做前向时,每个输出 token 的稠密计算大约为 2N2N,于是全过程的工作量变为:

Clife≈6ND+2NS.C_{\text{life}}\approx 6ND+2NS.

SS 数的是服务时的输出 token 暴露,与训练暴露 DD 分开。A 在训练之外新增 2×100M×10B=2×10182\times100\text{M}\times10\text{B}=2\times10^{18} FLOPs,合计 3.2×10183.2\times10^{18}。B 合计 5.2×10185.2\times10^{18},C 合计 2.2×10182.2\times10^{18}。训练乘积相同,不表示后续成本相同。

这并没有证明应该部署 C,因为它可能达不到质量要求。它说明的是:后续使用量很大时,把更小的模型训练更久,值得作为候选研究。实际全程成本还包含提示处理、内存容量、有效执行速率、闲置资源和运维。第 30—33 章会为这些项目补上明确测量和应用契约。

参数、独立内容、已处理 token、FLOPs、字节和秒是不同的量。稠密计算近似式把假设摊开,让我们能比较预算。经验拟合则补充特定训练条件下、关于特定损失的证据,外推仍然只是预测。固定算力下让训练损失最低的模型,不一定使合格服务的总成本最低。下一章进入稠密块内部,检查本章暂时视为固定条件的三项组件选择。

  1. 一个给定稠密模型有 150M 个计入参数,处理 2B 个 token。估计训练 FLOPs。在原预算上限下,它能处理多少 token?
  2. 团队把 1B-token 数据池训练四遍,报告 4B 训练 token。计算公式该用哪个数?数据卡还应单独保留什么?
  3. 在例 24.2 中,求 x=64x=64 的预测。为什么把这个点画出来,并不会扩大观测范围?
  4. 一个模型的拟合预训练损失更低,却把全部明确制度更新问题答错。“训练计算最优”能否推翻知识助手的失败判定?说清两个目标。
  5. 按给定有效速率 5×10125\times10^{12} FLOP/s 估算 C 的训练小时数。为什么直接代入厂商峰值速率不能算作充分证据?
  6. 若全过程输出预算从 10B 降至 1B token,计算 A、C 的近似总工作量,解释两者比较发生了什么变化。
  1. 6×150M×2B=1.8×10186\times150\text{M}\times2\text{B}=1.8\times10^{18} FLOPs。用 1.2×10181.2\times10^{18} 除以 6×150M6\times150\text{M},得到约 1.333333B 次 token 暴露。实际训练日程还要取整,并为遗漏开销留余量。
  2. 工作量用 4B 次实际暴露。另行保留 1B 独立池、遍数或抽样规则、tokenizer,以及重复与划分信息。重复消耗计算,不会产生新的来源信息。
  3. 2+2/64=2.252+2/\sqrt{64}=2.25。这是把给定公式延伸到三个已有大小以外;那里没有发生训练或评测。画出的预测仍是预测。
  4. 不能。训练目标是在算力约束下优化损失,应用目标则要求正确使用所提供的有效制度。候选可以满足前者而不满足后者。知识助手是否合格,要由第 32 章的硬性验收条件决定。
  5. 耗时为 240000 秒,约 66.67 小时。速率是给定的有效值。峰值吞吐没有计入此工作负载的精度、利用率、内存或通信,不能证明实际耗时。
  6. A 合计 1.4×10181.4\times10^{18} FLOPs,C 合计 1.3×10181.3\times10^{18}。生成工作缩小十倍,两者差距也从 1.0×10181.0\times10^{18} 缩小为 0.1×10180.1\times10^{18}。质量仍未指定,这些是粗略工作量,不是货币价格。