乐趣区

关于人工智能:我的语言模型应该有多大

本文发表于 2020 年 6 月 8 日,尽管工夫较长远,但当初看起来依然是十分有价值的一篇文章。

在这个全民 LLM 的狂欢里,想测测你拿到的估算够训一个多大的模型吗?本文会给你一个答案,至多给你一个计算公式。

在自然语言解决畛域,有时候咱们恍惚感觉大家是为了搏头条而在模型尺寸上一直进行军备竞赛。1750 亿参数 无疑是一个很抓眼球数字!为什么不思考高效地去训一个小一点的模型?其实,这是因为深度学习畛域有一个挺惊人的缩放效应,那就是: 大神经网络计算效率更高 。这是以 OpenAI 为代表的团队在像 神经语言模型的缩放定律 这样的论文中摸索出的论断。本文的钻研也基于这一景象,咱们将其与 GPU 速度预计相结合,用于确保在进行语言模型试验时,咱们能依据咱们算力估算来设计最合适的模型尺寸 (剧透一下,这个大小比你设想的要大!)。咱们将展现咱们的办法是如何影响一个规范的语言建模基准的架构决策的: 咱们在没有任何超参优化的前提下,仅应用了原论文 75% 的训练工夫,复现了 Zhang 等人的 Transformer-XL 论文 中的 14 层模型的最佳后果 。咱们还预计 来自同一篇论文的 18 层模型其实仅须要比原论文少一个数量级的步数就能达到雷同的后果。持续浏览之前想先玩玩咱们的演示吗?只需单击 此处!

1. 进行训练的最佳工夫 (比你设想的要早)

咱们先察看一些损失曲线 (loss curve)。咱们应用的工作是在 Wikitext-103 上训练 Transformer-XL 语言模型,Wikitext-103 是一个规范的中等体量的测试基准。GPT-2 在此等体量的数据集上体现不佳。随着训练的进行,咱们来察看计算成本 (通过浮点运算数来掂量) 与模型性能 (通过验证集上的损失来掂量) 的联动关系。咱们做点试验吧!在下图中,不同色彩的线段示意不同层数和大小的 Transformer-XL 模型运行 200000 步的数据,这些模型除了层数与大小外的所有其余超参数都雷同。模型参数量范畴从几千到一亿 (不含嵌入)。越大的模型在图中越靠右,因为它们每一步须要的计算量更大。本图是交互式的,你能够玩一玩!

缩放定律 一文中的做法一样,咱们的横轴为非嵌入浮点运算数 (non-embedding FLoating Point Operations, neFLOs),纵轴为验证集损失。对于给定的 neFLOs 估算,仿佛存在一个任何模型都没法越过的性能边界,咱们在图中用红色线段示意。在 缩放定律 一文中,它被称为计算边界 (compute frontier)。咱们能够看到,在所有的试验中,简直每个试验都能在通过初始若干步的损失迅速升高后达到或靠近该计算边界,随后又在训练靠近序幕时,因训练效率升高而偏离该计算边界。这个景象有其实际意义: 给定固定的浮点运算估算,为了达到最佳性能,你应该抉择一个模型尺寸,使得在浮点运算估算见顶时正好达到计算边界,而后咱们就能够在此时进行训练。此时离模型收敛所需的工夫还很远,模型收敛还须要 10 倍左右的工夫。事实上,如果此时你还有额定的钱可用于计算,你应该把大部分用到增大模型上,而只将一小部分用于减少训练步数。[ 译者注: 这是因为性能边界实质上度量了每 neFLOs 带来的 loss 的升高是多少,达到计算边界后,前面的每 neFLOs 能带来的 loss 的升高变小,不划算了。咱们应该转而去寻求增大模型所带来的靠近计算边界的高回报,而不应该卷在减少训练步数带来的低回报上。 ]

缩放定律 一文中,OpenAI 团队用幂律函数拟合了一个 GPT-2 训练的计算边界。这仿佛也实用于咱们的工作,咱们也拟合了一个以估算为自变量,最适宜该估算的模型参数量为因变量的幂律函数。如下图所示。

因为好的模型的 neFLOs- 损失 曲线往往会与计算边界相切比拟长时间,因而最终的拟合函数会存在一些噪声。然而,这恰好也意味着基于该拟合函数的预计的容忍度会比拟好,即便咱们预测尺寸有点偏差,其后果依然会十分靠近最优值。咱们发现,如果将算力估算乘以 10,最佳模型尺寸会随之乘以 7.41,而最佳训练步数仅乘以 1.35。将此规定外推到 Tranformer-XL 论文中的那个更大的 18 层最先进模型,咱们发现 其最佳训练步数约为 25 万步 。即便这个数字因为模型尺寸的变动而变得不那么准确,它也比论文中所述的 收敛所需的 400 万步 小得多。以更大的模型、更少的训练步数为终点,在给定的 (宏大的) 估算下咱们能训到更小的损失。

2. GPU 针对大而宽的模型进行了优化

咱们当初有了一个将性能和最佳模型尺寸与 neFLOs 分割起来的规定。然而,neFLOs 有点难以具象化。咱们是否将其转化为更直观的指标,如训练工夫?其实,无论你是有工夫上的限度还是财务上的限度,次要关注的都是 GPU 工夫。为了在 neFLOs 和 GPU 工夫之间建立联系,咱们在谷歌云平台上用 4 种不同 GPU 实例以及各种不同大小的 Transformer-XL 模型进行了数万次的基准测试 (包含混合精度训练测试)。以下是咱们的发现:

速度预计

每秒 neFLOs (即公式中的 speed) 能够建模为由模型宽度 (每层神经元数)、深度 (层数) 和 batch size 三个因子组成的多变量函数,这三个因子的重要性递加。在咱们的试验中,察看到的最大预测误差为测量值的 15%。

宽度

GPU 针对宽 transfomer 模型的大型前馈层进行了优化。在咱们所有的试验中,每秒 neFLOs 与模型宽度 呈 1.6 次方的幂律关系 ,这意味着两倍宽的模型须要 4 倍的操作。然而执行这些操作的速度也进步了大概 3.16 倍, 简直对消了额定的计算成本

深度

每秒 neFLOs 也与深度正相干。咱们目前发现的最佳关系是每秒 neFLOs 与 成正比。这与 transformer 模型必须串行地解决每一层的事实是统一的。从实质上讲,层数更多的模型其实并不会更快,但它们仿佛体现出更快,其起因次要是它们的均摊开销更小 。公式中的 常数 就代表这一开销,在咱们的试验中该常数始终在 5 左右,这其实意味着 GPU 加载数据、嵌入和 softmax 这些操作的耗时大概相当于 5 个 transfomer 层的工夫。

Batch size

Batch size 施展的作用最小。Batch size 较小时,其与速度呈正相干关系,但这个关系很快就饱和了 (甚至在 V100 和 P100 上 batch size 大于 64 后、在 K80 和 P4 batch size 大于 16 后,速度比小 batch size 时还有所升高)。因而,咱们将其对速度的奉献建模为对数函数以简化计算,它是 3 个因子中最弱的。因而,最终咱们所有试验都是在单 GPU 上用 batch size 64 运行进去的。这是大模型的另一个益处: 因为更大的 batch size 仿佛没有多大帮忙,如果你的模型太大而无奈塞进 GPU,你能够只应用较小的 batch size 以及梯度累积技术。

2 的幂在 2020 年依然很重要!

最初,一个令人诧异的播种是 宽度或 batch size 设置为 2 的幂的话其最终性能会比设为其余值高。有或没有 Tensor Core 的 GPU 都是如此。在像 V100 这样的 Tensor Core GPU 上,NVIDIA 倡议张量形态设置为 8 的倍数; 然而,咱们试验过将其一直加倍至 512 的倍数,性能还会持续进步。然而,在最终拟合时咱们还是只抉择拟合 2 的幂的数据,因为拟合所有数据点意味着拟合品质会变差,而且最终的拟合后果会对采纳 2 的幂状况下的速度预计得过于乐观。但这不障碍你去抉择最快的形态参数。

最终,咱们失去运行速度的估算公式如下:

例如,在未应用混合精度的 V100 GPU 上,k=2.21 × 10^7、a=1.66、b=5.92、c=1.33。不同的 GPU 具备不同的乘性系数,但后果很靠近。

3. 语言建模工作演示: Wikitext-103

当初咱们曾经晓得了模型尺寸和训练速度之间的关系,咱们能够依此预测: 对于给定的 GPU 工夫或估算,适宜指标工作的最佳模型尺寸及其能达到的性能。

这里应用的价格是 Google 云平台 (Google Cloud Platform,GCP) 的价格。咱们应用了 Peter Henderson 的 Experiment impact tracker 来估算能源消耗,并应用了 Electricity map 的荷兰数据 (Google 的欧洲服务器所在地) 来估算 CO2 排放量。只管微小的训练老本经常赢得头条,但事实上,咱们依然有可能以 30 美元的价格在中等规模的数据集上复现最先进的后果!对于一个失当优化过的训练计划而言,V100 曾经算一个弱小的武器了。

图中所示的数据的测例为在 Wikitext-103 上应用 batch size 60 以及单 GPU 训练一个 Transformer-XL 模型,模型的指标长度 (target length) 和记忆长度 (memory length) 为 150,测试基于 CMU 的 Transformer-XL 代码库。为了充分利用 V100 的 Tensor Core 性能,咱们在该 GPU 上把 batch size 设为 64,序列长度设为 152。在咱们的 模型尺寸 - 速度 预测公式中,咱们假如外部前馈层维度与嵌入和注意力维度雷同,并且宽深比是恒定的。Reformer 表明,这种设置有利于节俭内存。尽管 缩放定律 一文表明: 形态不会显著影响 GPT-2 的性能。然而,对于大模型而言,咱们还是发现具备更大前馈层的更浅的模型的性能会更好,因而咱们在图中给出了两种候选的模型形态: 一个宽而浅,一个窄而深。

为了复现中型 Transformer-XL 预训练模型 (损失为 3.15) 的后果,咱们调整了原模型的大小以减少的前馈维度并使之为 2 的高次幂,同时放弃雷同参数量。咱们最终失去了一个 14 层的模型,暗藏层维度为 768 且前馈层维度为 1024。相比之下,原文中的模型是通过激进的超参数搜寻搜得的 16 层模型,形态也很奇怪,暗藏层维度为 410 且前馈层维度为 2100。咱们的试验表明,因为咱们的形态是 2 的高次方,并且是一个更浅、更宽的模型,因而它在 NVIDIA RTX Titan 上每 batch 的速度比原模型进步了 20%。对于该模型,CMU 团队提供的脚本曾经十分靠近最佳进行工夫。最终,咱们取得了雷同的性能,同时缩小了 25% 的训练工夫。最重要的是,原模型应用超参数搜寻失去了对它而言更优形态,而咱们什么也没调,甚至连随机种子也是间接复用的他们手调的随机种子。因为咱们应用了较小规模的训练来拟合缩放定律,并依此缩放定律计算所需的模型超参,因而节俭参数搜寻实际上可能是咱们取得的另一个也是更大的一个收益。

4. 要点

  • 大模型效率惊人!
  • 训练至收敛一点也不高效。
  • 运行小规模基准测试可能帮忙咱们预测生产级模型的模型性能和最佳进行工夫。
  • 优化模型形态以进步速度以及应用尺寸大、进行早的模型可帮忙升高训练老本。

英文原文: https://hf.co/calculator/

原文作者: Teven Le Scao

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。

审校、排版: zhongdongy (阿东)

退出移动版