🔗 英文原文: https://jax-ml.github.io/scaling-book/
✍️ 翻译: 北极的树
微信二维码 微信公众号

如何扩展你的模型

TPU上LLM的系统视图 (第0部分:简介 | 第1部分:Roofline模型

训练LLM通常感觉像炼金术,但理解和优化你的模型性能并非如此。本书旨在揭开语言模型扩展科学的神秘面纱:TPU(和GPU)是如何工作的,它们之间如何通信,LLM如何在真实硬件上运行,以及如何在训练和推理过程中并行化你的模型,使其能在大规模下高效运行。如果你曾想过‘训练这个LLM应该有多昂贵’或‘我需要多少内存来自己部署这个模型’或‘什么是AllGather’,我们希望这本书对你有所帮助。

dai

深度学习的许多方面仍然可以归结为一种黑魔法,但优化你的模型性能并非如此——即使是在巨大规模下!相对简单的原则无处不在——从处理单个加速器到数万个加速器——理解这些原则可以让你做许多有用的事情:

预期背景:我们假设你对LLM和Transformer架构有基本的了解,但不一定了解它们如何大规模运行。你应该了解LLM训练的基础知识,最好对JAX有一些基本熟悉。一些有用的背景阅读可能包括关于Transformer架构的这篇博客文章原始的Transformer论文。还可以查看这个列表以获取更多有用的同步和未来阅读材料。

目标与反馈:读完本书后,你应该能够轻松地为给定硬件平台上的Transformer模型估算出最佳的并行性方案,以及大致的训练和推理时间。如果你做不到,请给我们发邮件或留言!我们很想知道如何能把内容讲得更清楚。

你可能也会喜欢阅读关于NVIDIA GPU的新的第12节

你为什么应该关心?

三四年前,我认为大多数机器学习研究人员不需要理解这本书中的任何内容。但如今,即使是“小”模型也运行得非常接近硬件极限,以至于进行创新性研究需要你考虑大规模下的效率。历史上,机器学习研究遵循着一种系统创新和软件改进之间的“嘀嗒”循环。Alex Krizhevsky不得不编写极其复杂的CUDA代码来使CNNs变快,但几年内,像Theano和TensorFlow这样的库意味着你不再需要这样做。也许这种情况也会在这里发生,这本书中的所有内容几年后都会被抽象掉。但是,扩展定律已经将我们的模型永久地推向了硬件的最前沿,而且似乎在不久的将来,进行前沿研究将与理解如何有效地将模型扩展到大型硬件拓扑结构密不可分。 在基准测试上取得20%的提升,如果以牺牲20%的Roofline效率为代价,那是无关紧要的。 有前景的模型架构之所以失败,通常要么是因为它们无法在规模上高效运行,要么是因为没有人投入精力去实现这一点。

“模型扩展”的目标是能够增加用于训练或推理的芯片数量,同时实现吞吐量的成比例线性增长。这被称为“强扩展”。尽管增加额外的芯片(“并行性”)通常会减少计算时间,但它也会带来芯片间通信增加的成本。当通信时间超过计算时间时,我们就会变得“受通信限制”,无法实现强扩展。随着计算时间的减少,你通常也会在单个芯片层面遇到瓶颈。你闪亮的新TPU或GPU可能额定每秒执行500万亿次操作,但如果你不小心,它很可能只做到十分之一,因为它被在内存中移动参数所拖累。单芯片计算、内存带宽和总内存之间的相互作用对扩展的故事至关重要。 如果我们对硬件有足够的了解,能够预见这些瓶颈将在何处出现,我们就可以设计或重新配置我们的模型来避免它们。硬件设计者面临着相反的问题:构建能够为我们的算法提供恰到好处的计算、带宽和内存,同时最小化成本的硬件。你可以想象这个“协同设计”问题有多么令人紧张:你必须赌上第一批芯片实际可用时算法会是什么样子,这通常是2到3年之后的事情。TPU的故事就是这场博弈中的一个巨大成功。矩阵乘法是一种独特的算法,因为它每字节内存使用的FLOPs远多于几乎任何其他算法(每字节N FLOPs),早期的TPU及其脉动阵列架构在当时实现了比GPU好得多的性价比。TPU是为ML工作负载设计的,而带有TensorCore的GPU也在迅速改变以填补这一细分市场。但你可以想象,如果神经网络没有兴起,或者以TPU(本质上比GPU灵活性差)无法处理的某种根本方式发生了变化,那将是多么昂贵的代价。

我们在这本书中的目标是解释TPU(和GPU)硬件是如何工作的,以及Transformer架构是如何演变以在当前硬件上表现良好的。我们希望这对于设计新架构的研究人员和致力于让当前一代LLM快速运行的工程师都有用。

高层大纲

本书的总体结构如下:

第1节解释了Roofline分析以及哪些因素会限制我们的扩展能力(通信、计算和内存)。第2节第3节详细讨论了TPU的工作原理,既包括作为单个芯片,也包括——至关重要的——作为一个具有有限带宽和延迟的互连芯片链接的系统。我们将回答以下问题:

图:来自第2节的图表,展示了TPU如何执行逐元素乘积。根据我们数组的大小和各种链接的带宽,我们可能会发现自己是计算受限(使用全部硬件计算能力)或通信受限(受内存加载瓶颈)。

五年前,机器学习的架构景观丰富多彩——ConvNets、LSTMs、MLPs、Transformers——但现在我们主要只有Transformer。我们坚信,理解Transformer架构的每一个部分都是值得的:每个矩阵的确切大小,归一化发生在哪里,每个部分有多少参数和FLOPs浮点运算(FLoating point OPs),基本上是所需加法和乘法运算的总数。虽然许多资料将FLOPs解释为“每秒操作数”,但我们使用FLOPs/s来明确表示这一点。第4节仔细讲解了这种“Transformer数学”,展示了如何计算训练和推理的参数和FLOPs。这告诉我们模型将使用多少内存,我们将在计算或通信上花费多少时间,以及注意力何时会相对于前馈块变得重要。

图:一个标准的Transformer层,每个矩阵乘法(matmul)都用圆圈内的点表示。所有参数(不包括归一化层)都以紫色显示。第4节更详细地讲解了这个图。

第5节:训练第7节:推理是本文的核心,我们在这里讨论一个根本问题:给定一个特定大小的模型和一定数量的芯片,我该如何并行化我的模型以保持在“强扩展”状态?这是一个简单的问题,但答案却出人意料地复杂。从高层次来看,有4种主要的并行性技术用于在多个芯片上拆分模型(数据张量流水线专家),以及一些其他技术来减少内存需求(重计算优化器/模型分片(又名ZeRO)主机卸载梯度累积)。我们在这里讨论其中的许多技术。

我们希望在这些章节结束时,你应该能够为新的架构或设置自己选择合适的并行方案。第6节第8节是将这些概念应用于流行的开源模型LLaMA-3的实践教程。

最后,第9节第10节探讨了如何在JAX中实现其中一些想法,以及在出现问题时如何分析和调试代码。第12节是一个新章节,也深入探讨了GPU。

在整个过程中,我们尝试给你提供一些问题让你自己解决。请不要有压力去阅读所有章节或按顺序阅读。也请留下反馈。目前,这是一个草稿,并将继续修订。谢谢!

我们想感谢James Bradbury和Blake Hechtman,他们推导出了本文档中的许多想法。

话不多说,这是关于TPURoofline模型的第一节

这个系列可能比它需要的要长,但我们希望这不会让你望而却步。前三章是预备知识,如果熟悉可以跳过,尽管它们介绍了后面使用的符号。最后三个部分可能是最实用的,因为它们解释了如何处理真实模型。

第1部分:预备知识

第2部分:Transformer

第3部分:实践教程

第4部分:结论和附加内容

脚注

  1. 历史上,机器学习研究遵循着一种系统创新和软件改进之间的“嘀嗒”循环。Alex Krizhevsky不得不编写极其复杂的CUDA代码来使CNNs变快,但几年内,像Theano和TensorFlow这样的库意味着你不再需要这样做。也许这种情况也会在这里发生,这本书中的所有内容几年后都会被抽象掉。但是,扩展定律已经将我们的模型永久地推向了硬件的最前沿,而且似乎在不久的将来,进行前沿研究将与理解如何有效地将模型扩展到大型硬件拓扑结构密不可分。[↩]
  2. 随着计算时间的减少,你通常也会在单个芯片层面遇到瓶颈。你闪亮的新TPU或GPU可能额定每秒执行500万亿次操作,但如果你不小心,它很可能只做到十分之一,因为它被在内存中移动参数所拖累。单芯片计算、内存带宽和总内存之间的相互作用对扩展的故事至关重要。[↩]
  3. 硬件设计者面临着相反的问题:构建能够为我们的算法提供恰到好处的计算、带宽和内存,同时最小化成本的硬件。你可以想象这个“协同设计”问题有多么令人紧张:你必须赌上第一批芯片实际可用时算法会是什么样子,这通常是2到3年之后的事情。TPU的故事就是这场博弈中的一个巨大成功。矩阵乘法是一种独特的算法,因为它每字节内存使用的FLOPs远多于几乎任何其他算法(每字节N FLOPs),早期的TPU及其脉动阵列架构在当时实现了比GPU好得多的性价比。TPU是为ML工作负载设计的,而带有TensorCore的GPU也在迅速改变以填补这一细分市场。但你可以想象,如果神经网络没有兴起,或者以TPU(本质上比GPU灵活性差)无法处理的某种根本方式发生了变化,那将是多么昂贵的代价。[↩]
  4. 浮点运算(FLoating point OPs),基本上是所需加法和乘法运算的总数。虽然许多资料将FLOPs解释为“每秒操作数”,但我们使用FLOPs/s来明确表示这一点。[↩]

参考文献

  1. Attention is all you need
    Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L. and Polosukhin, I., 2017. arXiv [cs.CL].

杂项

*在Google DeepMind完成的工作,现就职于MatX。

引用

在学术背景下进行署名时,请按如下方式引用本作品:

    Austin et al., "How to Scale Your Model", Google DeepMind, online, 2025.

或使用以下BibTeX条目:

    @article{scaling-book,
      title = {How to Scale Your Model},
      author = {Austin, Jacob and Douglas, Sholto and Frostig, Roy and Levskaya, Anselm and Chen, Charlie and Vikram, Sharad
      and Lebron, Federico and Choy, Peter and Ramasesh, Vinay and Webson, Albert and Pope, Reiner},
      publisher = {Google DeepMind},
      howpublished = {Online},
      note = {Retrieved from https://jax-ml.github.io/scaling-book/},
      year = {2025}
    }