随着大模型的迅速发展,在有限的资源、数据下,该选取多少量级的数据、需要多少GPU资源能满足当前的场景需求呢?这篇文章就是为大家提供一定的参考。信息量很大,可能有理解不对的地方,结合原文一起理解;
给定以下参数:
- N N N:代表模型参数量的大小(不包括tokenize的嵌入层大小);
- D D D:代表数据集的大小;
- C C C:代表用于训练的计算资源总量(如:GPU个数、每个GPU显存大小确定的总规模数);
定律总结
首先说下总结:
- 大模型效果最大程度的依赖于模型规模的大小,模型的规模指的就是 N N N、 D D D、 C C C共同确定的,在以上规模达到一定的标准后,模型的超参数如宽度和深度对模型效果的影响较为微弱;
- 大模型效果与 N N N、 D D D、 C C C三个参数都有着独立的power-law关系;
- 同时增加 N N N、 D D D必然会带来大模型效果的提升,但是如果只提升其中一个变量,就会导致过拟合,性能会发生损失,性能损失的比例为 N 0.74 / D N^{0.74}/D N0.74/D,如:模型参数量每提升8倍时,数据量级需要提升至少5倍,从而避免大模型效果弱化;
- 大模型训练的损失曲线也遵循可预测的power-laws,不管是较小的模型还是较大的模型,训练曲线的形状和特性在数学上会表现出类似的幂律关系,即使模型大小不同,通过观察和外推早期的训练曲线,我们也可以预测模型在更长时间训练后的表现;
- 当模型在不同任务的数据上进行评估时,模型的效果可能会有弱化的表现,但是不管怎样,模型的效果和训练时的验证效果息息相关,也就是尽管效果迁移可能会存在弱化的情况,但是 当训练时的评估效果有所提升时,也就意味着在迁移任务上效果也会有所提升;
- 大模型比小模型更高效,能在更少的优化步骤和更少的数据点下达到相同的性能水平;
- 在固定的计算预算下,为了获得最佳的性能,应该训练非常大的模型并在远未达到完全收敛时停止训练。这种方法比训练小模型到完全收敛要高效得多,并且所需的数据量随着计算规模的增加缓慢增长,即 D D D~ C 0.27 C^{0.27} C0.27;
- 在训练大型模型时,最佳的批处理大小主要取决于损失函数的表现,通过测量梯度噪声可以确定这个大小,并且对于当前最大的模型来说,最佳的批处理大小大约是100万到200万个token。
定律详情
定律公式
当大模型的训练规模受到限制时,模型的测试损失可以通过以下定律进行预估:
- 对于参数量有限的模型,在足够大量的数据集上进行训练时,随着模型参数数量的增加,模型的损失会以一定的速率减小,从而提升模型性能: L ( N ) = ( N c / N ) α N ; α N ~ 0.076 , N c ~ 8.8 ∗ 1 0 13 ( 不考虑嵌入层参数量 ) L(N)=(N_{c}/N)^{\alpha_N};\alpha_N~0.076,N_{c}~8.8*10^{13}(不考虑嵌入层参数量) L(N)=(Nc/N)αN;αN~0.076,Nc~8.8∗1013(不考虑嵌入层参数量)
- 对于数据集量级有限的情况,需要early stop时的损失随着数据集量级的变化,当数据集量级增加时,模型的损失会以一定的速率降低,从而提升模型效果: L ( D ) = ( D c / D ) α D ; α D ~ 0.095 , D c ~ 5.4 ∗ 1 0 13 ( t o k e n s ) L(D)=(D_{c}/D)^{\alpha_D};\alpha_D~0.095,D_{c}~5.4*10^{13}(tokens) L(D)=(Dc/D)αD;αD~0.095,Dc~5.4∗1013(tokens)
- 当采用有限的计算资源、充足的数据集、最优大小的模型、足够小的批次进行训练时,模型效果也会随着计算资源的提升而提升:
L
(
C
m
i
n
)
=
(
C
c
m
i
n
/
C
m
i
n
)
α
C
m
i
n
;
α
C
m
i
n
~
0.050
,
C
c
m
i
n
~
3.1
∗
1
0
8
(
P
F
−
D
a
y
s
)
L(C_{min})=(C^{min}_{c}/C_{min})^{\alpha^{min}_{C}};\alpha^{min}_{C}~0.050,C^{min}_{c}~3.1*10^{8}(PF-Days)
L(Cmin)=(Ccmin/Cmin)αCmin;αCmin~0.050,Ccmin~3.1∗108(PF−Days)
上述1. 和2. 的公式共同表明,随着模型大小的增长,应当亚线性地控制数据集的量级,即: D ∝ N α N α D ~ N 0.74 D∝N^{\frac{\alpha_{N}}{\alpha_{D}}}~N^{0.74} D∝NαDαN~N0.74,这两个公式结合的话,损失和数据集大小、模型大小就会有以下关系: L ( N , D ) = [ ( N c N ) α N α D + D c D ] α D L(N,D)=[(\frac{N_{c}}{N})^{\frac{\alpha_N}{\alpha_D}}+\frac{D_{c}}{D}]^{\alpha_{D}} L(N,D)=[(NNc)αDαN+DDc]αD
下图左边可表明上述表达式针对不同的模型可采用log似然估计对这些变量进行建模。
在无限数据的情况下,当给定一个模型训练一定数量的参数更新step S S S时, S m i n ( S ) S_{min}(S) Smin(S)表示达到最优效果的最小step,经过一个初始的瞬态期之后,学习曲线可以被一个特定的模型准确拟合,上图右侧就体现了这种关联性: L ( N , S ) = ( N c N ) α N + ( S c S m i n ( S ) ) α S L(N,S)=(\frac{N_{c}}{N})^{\alpha_N}+(\frac{S_{c}}{S_{min}(S)})^{\alpha_S} L(N,S)=(NNc)αN+(Smin(S)Sc)αS S c ~ 2.1 ∗ 1 0 3 , α S ~ 0.76 S_{c}~2.1*10^{3},\alpha_S~0.76 Sc~2.1∗103,αS~0.76
以上常量可能会随着其他变量的不同而有所差异,但是整体的规律性是类似的,如下图,不同参数量模型的情况下,损失随着batch size或者计算资源的收敛情况趋势相近。
如何确定临界最优batch size,决定了并行计算过程中的速度和计算效率,而batch size的选取也和损失计算之间存在一定的规律性: B c r i t ( L ) = B ∗ L 1 / α B , B ∗ ~ 2 ∗ 1 0 8 t o k e n s , α B ~ 0.21 B_{crit}(L)=\frac{B_{*}}{L^{1/\alpha_{B}}},B_{*}~2*10^{8}tokens,\alpha_{B}~0.21 Bcrit(L)=L1/αBB∗,B∗~2∗108tokens,αB~0.21
基于上述不同的规律性,当计算资源 C C C是固定时,模型参数量 N N N、batch size大小 B B B、step大小 S S S、数据集大小 D D D和 C C C的关系可以表示如下: N ∝ C α C m i n / α N , B ∝ C α C m i n / α B , S ∝ C α C m i n / α S , D = B ∗ S N∝C^{\alpha^{min}_{C}/\alpha_N},B∝C^{\alpha^{min}_{C}/\alpha_B},S∝C^{\alpha^{min}_{C}/\alpha_S},D=B*S N∝CαCmin/αN,B∝CαCmin/αB,S∝CαCmin/αS,D=B∗S
α C m i n = 1 / ( 1 / α S + 1 / α B + 1 / α N ) \alpha^{min}_{C}=1/(1/\alpha_S+1/\alpha_B+1/\alpha_N) αCmin=1/(1/αS+1/αB+1/αN)
与如下图所示的结果 N ∝ C m i n 0.73 , B ∝ C m i n 0.24 , S ∝ C m i n 0.03 N∝C^{0.73}_{min},B∝C^{0.24}_{min},S∝C^{0.03}_{min} N∝Cmin0.73,B∝Cmin0.24,S∝Cmin0.03是十分吻合的,也说明随着模型越来越大,增加样本提升的收益会更高。
定律参数定义&计算
对于模型大小参数
N
N
N而言,它是基于超参数网络层数
n
l
a
y
e
r
n_{layer}
nlayer、数据维度
d
m
o
d
e
l
d_{model}
dmodel、前馈神经网络的维度数
d
f
f
d_{ff}
dff、注意力机制的输出维度数
d
a
t
t
n
d_{attn}
dattn、注意力机制的头数
n
h
e
a
d
s
n_{heads}
nheads、以及输入上下文token数
n
c
t
x
n_{ctx}
nctx,默认为1024,则有:
N
≈
2
d
m
o
d
e
l
n
l
a
y
e
r
(
2
d
a
t
t
n
+
d
f
f
)
=
12
n
l
a
y
e
r
d
m
d
o
e
l
2
N≈2d_{model}n_{layer}(2d_{attn}+d_{ff})=12n_{layer}d^2_{mdoel}
N≈2dmodelnlayer(2dattn+dff)=12nlayerdmdoel2
其中,按照常规的
d
a
t
t
n
=
d
f
f
/
4
=
d
m
o
d
e
l
d_{attn}=d_{ff}/4=d_{model}
dattn=dff/4=dmodel进行换算就能得到上述结果。在大模型参数量计算时其实还有两个比较大的参数即tokenize过程中的参数量,嵌入层是
n
v
o
c
a
b
d
m
o
d
e
l
n_{vocab}d_{model}
nvocabdmodel,还有位置编码的部分参数
n
c
t
x
d
m
o
d
e
l
n_{ctx}d_{model}
nctxdmodel,这部分参数量是没有考虑进去的,即
N
N
N的计算不包含文本向量化的这部分参数。Transformer前向传播过程中所需要的计算资源可以估计如下:
C
f
o
r
w
a
r
d
=
2
N
+
2
n
l
a
y
e
r
n
c
t
x
d
m
o
d
e
l
C_{forward}=2N+2n_{layer}n_{ctx}d_{model}
Cforward=2N+2nlayernctxdmodel更详细的资源估计计算可参考下表:
对于
d
m
d
o
e
l
>
n
c
t
x
/
12
d_{mdoel}>n_{ctx}/12
dmdoel>nctx/12的模型而言,每个token转换计算对于总的计算而言占比相对较小,而对于
d
m
o
d
e
l
>
>
n
c
t
x
/
12
d_{model}>>n_{ctx}/12
dmodel>>nctx/12的大模型而言,就更不需要把文本向量化的参数考虑进去,再把梯度反向传播的过程考虑进来,计算资源和模型参数量之间的关系就可以估算为
C
≈
6
N
C≈6N
C≈6N。
实验详情
为了验证不同的配置对模型效果(损失)的影响,测试了不同的变量对模型效果的影响:
- 模型大小:从768到1.5B的参数范围;
- 数据集量级:从22到23B的数据量级;
- 模型结构:深度、宽度、多头注意力头数、前向反馈层维度数;
- 上下文token长度:最长1024;
- Batch Size:大多数 2 19 t o k e n / b a t c h 2^{19}token/batch 219token/batch,但是对于不同的实验也会调整,使之达到最优解;
- 当模型的参数量
N
N
N固定时,模型的效果和模型结构参数的关联性是很微弱的,也就是说改变模型结构其实对最终结果的影响没有很大,比如,一个层数为6、隐藏层维度为4288的模型,其损失值仅比一个层数为48、隐藏层维度为1600的模型高3%。
- 当其他参数固定时,模型效果会随着模型大小的增大而增大,如下图所示,即:
L
(
N
)
≈
(
N
c
N
)
α
N
L(N)≈(\frac{N_{c}}{N})^{\alpha_{N}}
L(N)≈(NNc)αN
如下图所示,在不同的数据集上进行训练,这种关系的常数几乎是一致的,更进一步地验证了上述规律性:
- 比较了LSTM和Transformer在不同的变量情况下模型效果的变化,LSTM在前期和Transformer持平,到后面就不如Transformer了,如下图所示:
- 数据集大小和计算资源大小的影响如总结中所示,
L
(
D
)
≈
(
N
c
N
)
α
D
L(D)≈(\frac{N_{c}}{N})^{\alpha_{D}}
L(D)≈(NNc)αD
L ( C ) ≈ ( N c N ) α C L(C)≈(\frac{N_{c}}{N})^{\alpha_{C}} L(C)≈(NNc)αC
实验最终计算出来的各个常量数据如下:
那么为了避免过拟合,样本的数据量级应该多大呢?在所有实验的模型中,采用全量的
22
B
t
o
k
e
n
22Btoken
22Btoken量的数据进行训练时,并未发生过拟合现象,说明当前数据是足够充分的,即可理解为
D
~
∞
D~∞
D~∞,因此可以得出:
δ
L
(
N
,
D
)
≡
L
(
N
,
D
)
L
(
N
,
∞
)
−
1
δL(N, D)≡\frac{L(N,D)}{L(N,∞)}-1
δL(N,D)≡L(N,∞)L(N,D)−1上述求偏导仅把损失看作是和
N
、
D
N、D
N、D相关的函数,如下图右边所示,再根据之前
N
、
D
N、D
N、D之间的scaling law,该偏导公式可以表示为:
δ
L
(
N
,
D
)
≈
(
1
+
(
N
N
c
)
α
N
α
D
D
c
N
c
)
α
D
−
1
δL(N, D) ≈(1+(\frac{N}{N_{c}})^{\frac{\alpha_{N}}{\alpha_{D}}}\frac{D_{c}}{N_{c}})^{\alpha_{D}}-1
δL(N,D)≈(1+(NcN)αDαNNcDc)αD−1因此为了避免过拟合,数据集的量级需要满足以下公式:
D
≳
(
5
∗
1
0
3
)
N
0.74
D\gtrsim(5*10^3)N^{0.74}
D≳(5∗103)N0.74
- 在训练过程中,Batch Size大小对模型的效果影响其实也很大,当
B
=
B
c
r
i
t
B=B_{crit}
B=Bcrit时的训练效率是最高的,当
B
>
>
B
c
r
i
t
B>>B_{crit}
B>>Bcrit能够使得Step降至最低,
B
<
<
B
c
r
i
t
B<<B_{crit}
B<<Bcrit的计算资源消耗是最大的,在训练过程成训练step大小
S
S
S和批次大小
B
B
B之间遵循着简单的关系
E
=
B
S
E = BS
E=BS:
(
S
S
m
i
n
−
1
)
(
E
E
m
i
n
−
1
)
=
1
(\frac{S}{S_{min}}-1)(\frac{E}{E_{min}}-1)=1
(SminS−1)(EminE−1)=1
其中, S m i n S_{min} Smin是训练至固定损失时的最小Step值, E m i n E_{min} Emin是最小的处理数据量级估计,因此最佳的Batch Size可表示为: B c r i t = E m i n S m i n B_{crit}=\frac{E_{min}}{S_{min}} Bcrit=SminEmin最优的Batch Size选取可以在模型训练效率上有很大的提升,因此可以基于此去确定训练Step和最小样本集合,如,若需要的样本量级为 2 E m i n 2E_{min} 2Emin,那么Step设置也应为 2 S m i n 2S_{min} 2Smin。Batch Size的选取和模型无关,独立和损失挂钩: B c r i t ( L ) = B ∗ L 1 / α B , B ∗ ~ 2 ∗ 1 0 8 t o k e n s , α B ~ 0.21 B_{crit}(L)=\frac{B_{*}}{L^{1/\alpha_{B}}},B_{*}~2*10^{8}tokens,\alpha_{B}~0.21 Bcrit(L)=L1/αBB∗,B∗~2∗108tokens,αB~0.21
可以使用 B c r i t ( L ) B_{crit}(L) Bcrit(L)来估计 B = 2 19 B=2^{19} B=219且 B > > B c r i t B>>B_{crit} B>>Bcrit时损失可达最小的最优Step: S m i n ( S ) = S 1 + B c r i t ( L ) / B , B > > B c r i t S_{min}(S)=\frac{S}{1+B_{crit}(L)/B},B>>B_{crit} Smin(S)=1+Bcrit(L)/BS,B>>Bcrit
也可以估计模型大小为 N N N且 B < < B c r i t B<<B_{crit} B<<Bcrit时的达最小损失的最优计算资源消耗量: C m i n ( C ) = C 1 + B c r i t ( L ) / B , B < < B c r i t C_{min}(C)=\frac{C}{1+B_{crit}(L)/B},B<<B_{crit} Cmin(C)=1+Bcrit(L)/BC,B<<Bcrit其中 C = 6 N B S C=6NBS C=6NBS预估了在 B B B下的计算资源; - 在已经得到了
S
m
i
n
S_{min}
Smin的情况下,模型大小
S
S
S对模型效果的影响就可以表示为:
L
(
N
,
S
m
i
n
)
=
(
N
c
N
)
α
N
+
(
S
c
S
m
i
n
)
α
S
L(N,S_{min})=(\frac{N_{c}}{N})^{\alpha_N}+(\frac{S_{c}}{S_{min}})^{\alpha_S}
L(N,Smin)=(NNc)αN+(SminSc)αS其中各个参数的实验结果如下:
那么在数据有限的情况下,如何控制模型的early stop机制来避免过拟合呢?采用下界估计的方法,这个方法基于一个假设:在达到 S m i n ≈ S s t o p S_{min} ≈ S_{stop} Smin≈Sstop之前,有限数据和无限数据的学习曲线几乎相同。可以通过以下公式来预估early stop的Step,超过预估值时会发生过拟合: S s t o p ( N , D ) ≳ S c [ L ( N , D ) − L ( N , ∞ ) ] 1 α S S_{stop}(N,D)\gtrsim\frac{S_{c}}{[L(N,D)-L(N,∞)]^{\frac{1}{\alpha_{S}}}} Sstop(N,D)≳[L(N,D)−L(N,∞)]αS1Sc
当我们知道 L ( C m i n ) L(C_{min}) L(Cmin)(即在某一最小损失下的训练计算量)时,问题转向寻找能在这种计算量下提供最小损失的模型大小,并指出 N ( C m i n ) N(C_{min}) N(Cmin) 可以很好地用幂律来拟合,这意味着模型大小与计算量之间存在一种特定的数学关系: N ( C m i n ) ∝ ( C m i n ) 0.73 N(C_{min})∝(C_{min})^{0.73} N(Cmin)∝(Cmin)0.73
在之前的计算中 C m i n = 6 N B c r i t S C_{min}=6NB_{crit}S Cmin=6NBcritS,可以推导出 B ∝ L − 4.8 B ∝ L^{−4.8} B∝L−4.8和 L ∝ C m i n − 0.05 L ∝ C^{−0.05}_{min} L∝Cmin−0.05,从而可以推导出 B c r i t ∝ C m i n 0.24 B_{crit} ∝ C^{0.24}_{min} Bcrit∝Cmin0.24,因此最优训练步数( B c r i t B_{crit} Bcrit)随着计算量( C m i n C_{min} Cmin)的增加会非常缓慢地增长,换句话说,当计算量增加时,需要增加的训练步数并不会显著增加,这对计算资源的优化利用有重要意义,即: S m i n ∝ ( C m i n ) 0.03 S_{min}∝(C_{min})^{0.03} Smin∝(Cmin)0.03也就是说当我们用优化的计算分配来扩大语言建模时,我们应该主要增加模型大小 N N N,同时通过 B ∝ B c r i t B∝ B_{crit} B∝Bcrit来扩大批量大小,而Step数量的增加可以忽略不计。
对于之前提到的等式 L ( N , S m i n ) L(N,S_{min}) L(N,Smin),可以用 S m i n = C m i n 6 N B S_{min}=\frac{C_{min}}{6NB} Smin=6NBCmin来进行替换,并把损失函数看成一个和变量 N N N相关的函数: L ( C m i n ) = ( C c m i n C m i n ) α C m i n L(C_{min})=(\frac{C^{min}_{c}}{C_{min}})^{\alpha^{min}_{C}} L(Cmin)=(CminCcmin)αCmin
α C m i n = 1 1 / α S + 1 / α B + 1 / α N ≈ 0.054 \alpha^{min}_{C}=\frac{1}{1/\alpha_{S}+1/\alpha_{B}+1/\alpha_{N}}≈0.054 αCmin=1/αS+1/αB+1/αN1≈0.054同时还能做出以下推断: N ( C m i n ) ∝ ( C m i n ) α C m i n α N ≈ ( C m i n ) 0.71 N (C_{min}) ∝ (C_{min})^{\frac{\alpha^{min}_{C}}{\alpha_{N}}}≈(C_{min})^{0.71} N(Cmin)∝(Cmin)αNαCmin≈(Cmin)0.71
为了避免过拟合,我们已知数据集大小应该设置为 D ∝ N 0.74 ∝ C m i n 0.54 D∝N^{0.74}∝C^{0.54}_{min} D∝N0.74∝Cmin0.54
当我们以最优批次 B c r i t B_{crit} Bcrit进行训练时,如 C = 2 C m i n C=2C_{min} C=2Cmin,当不包含重复数据时,数据量的要求随着计算资源的增加而增长: D ( C m i n ) = 2 C m i n 6 N ( C m i n ) ≈ ( 4 ∗ 1 0 10 t o k e n s ) ( C m i n / P F − D a y ) 0.26 D(C_{min})=\frac{2C_{min}}{6N(C_{min})}≈(4*10^{10}tokens)(C_{min}/PF-Day)^{0.26} D(Cmin)=6N(Cmin)2Cmin≈(4∗1010tokens)(Cmin/PF−Day)0.26
当我们受数据集大小(即过拟合)的限制时,损失应按 L ( D ) ∝ D 0.95 L(D)∝D^{0.95} L(D)∝D0.95来计算,也即 L ( D ( C m i n ) ) ∝ C m i n − 0.03 L(D(C_{min}))∝C^{-0.03}_{min} L(D(Cmin))∝Cmin−0.03。如图所示在 L ( D ( C m i n ) ) ∝ C m i n − 0.05 L(D(C_{min}))∝C^{-0.05}_{min} L(D(Cmin))∝Cmin−0.05的scaling law的情况下也有一个交点:
根据以上的多条scaling laws,当某个变量受到限制时会需要调整缩放定律的常量,这种调整可能会存在一定的矛盾点或者存在和其他slacing law的交叉点,因此在实际落地过程中,可能也不是100%没有问题的,存在交叉点或矛盾点的具体情况有: C ∗ ∼ 1 0 4 P F − D a y s , N ∗ ∼ 1 0 12 p a r a m e t e r s , D ∗ ∼ 1 0 12 t o k e n s , L ∗ ∼ 1.7 n a t s / t o k e n ( 6.8 ) C^∗∼ 10^4 PF-Days,N^∗∼10^{12} parameters, D^∗∼10^{12} tokens, L^∗ ∼ 1.7 nats/token (6.8) C∗∼104PF−Days,N∗∼1012parameters,D∗∼1012tokens,L∗∼1.7nats/token(6.8)