Llama 3.1:系列模型原理讲解论文(章节1-3)

摘要:

本文介绍了一系列新的基础模型,称为 Llama 3。Llama 3 是一个语言模型群体,天生支持多语言、代码编写、推理和工具使用。我们最大的模型是一个具有 4050 亿个参数和高达 128,000 个标记的上下文窗口的密集型 Transformer。本文对 Llama 3 进行了一系列广泛的经验评估。结果表明,Llama 3 在许多任务上都能够达到与 GPT-4 等领先语言模型相当的质量。我们将 Llama 3 公开发布,包括预训练和后训练的 4050 亿参数语言模型,以及用于输入输出安全性的 Llama Guard 3 模型。本文还介绍了将图像、视频和语音功能通过组合式方法集成到 Llama 3 中的实验结果。我们观察到这种方法在图像、视频和语音识别任务上与最先进的方法具有竞争力。由于这些模型仍处于开发阶段,因此尚未广泛发布。


阅读全文(7.4万字):https://www.aisharenet.com/llama-3yigeduoa/



1 引言

 

基础模型是语言、视觉、语音和其他模态的一般性模型,旨在支持广泛的 AI 任务。它们构成了许多现代 AI 系统的基础。

现代基础模型的开发主要分为两个阶段:

(1) 预训练阶段: 模型在海量数据上进行训练,使用简单任务如单词预测或图注生成;

(2) 后训练阶段: 模型被微调以遵循指令、与人类偏好保持一致,并提高特定能力(例如,编码和推理)。

本文介绍了一套新的语言基础模型,称为 Llama 3。Llama 3 Herd 模型系列天生支持多语言、编码、推理和工具使用。我们最大的模型是具有 405B 参数的稠密 Transformer,能够在高达 128K 个标记的上下文窗口中处理信息。

表 1 列出了羊群中的每个成员。本文中呈现的所有结果均基于 Llama 3.1 模型(简称 Llama 3)。

我们认为开发高质量基础模型的三把关键利器是数据、规模和复杂性管理。在我们的开发过程中,我们将努力优化这三个方面:

  • 数据: 与之前的 Llama 版本(Touvron 等人,2023a, b)相比,我们在预训练和后训练中使用的 Both the quantity and quality of data were improved. These improvements include the development of more careful pre-processing and curation pipelines for pre-training data and the development of more rigorous quality assurance and filtering approaches for post-training data. Llama 3 在约 15T 多语言标记的语料库上进行预训练,而 Llama 2 则是在 1.8T 标记上进行预训练。
  • 规模。 我们训练了一个比之前 Llama 模型更大的模型:我们的旗舰语言模型使用了 3.8 × 1025 FLOPs 进行预训练,比 Llama 2 最大的版本多近 50 倍。具体来说,我们在 15.6T 文本标记上预训练了一个拥有 405B 可训练参数的旗舰模型。正如预期的那样,

85b72bca5cc5b4399e1c482e9fa428f3.jpeg

  • 管理复杂性。 我们做出的设计选择旨在最大限度地提高模型开发过程的可扩展性。例如,我们选择了标准密集 Transformer 模型架构(Vaswani 等人,2017 年)并进行了一些微小的调整,而不是采用专家混合模型(Shazeer 等人,2017 年)以最大程度地提高训练稳定性。同样,我们采用了一种相对简单的基于监督微调 (SFT)、拒绝采样 (RS) 和直接偏好优化 (DPO;Rafailov 等人 (2023)) 的后处理程序,而不是更复杂的强化学习算法(Ouyang 等人,2022 年;Schulman 等人,2017 年),这些算法往往不太稳定并且难以扩展。

我们这项工作的成果是 Llama 3:一个包含 8B、70B 和 405B 参数的三种多语言1语言模型的群体。我们在大量基准数据集上评估了 Llama 3 的性能,这些数据集涵盖了广泛的语言理解任务。此外,我们还进行了广泛的人工评估,将 Llama 3 与竞争模型进行了比较。表 2 展示了旗舰 Llama 3 模型在关键基准测试中的性能概述。我们的实验评估表明,我们的旗舰模型在各种任务上都与 GPT-4(OpenAI,2023a)等领先语言模型持平,并且接近于最先进水平。我们较小的模型是同类中最好的,其性能优于具有相似参数数量的其他模型(Bai 等人,2023 年;Jiang 等人,2023 年)。Llama 3 在帮助性和无害性之间也取得了比其前身(Touvron 等人,2023b)更好的平衡。我们在第 5.4 节中详细分析了 Llama 3 的安全性。

我们将所有三个 Llama 3 模型公开发布,使用 Llama 3 社区许可证的更新版本;请参阅 https://llama.meta.com。这包括我们 405B 参数语言模型的预训练和后处理版本,以及一个新的 Llama Guard 模型版本(Inan 等人,2023 年),用于输入和输出安全性。我们希望公开发布一个旗舰模型能够激发研究界的创新浪潮,并加速朝着人工智能 (AGI) 的负责任发展方向前进。

多语言:指的是模型能够理解和生成多种语言的文本。

 

在 Llama 3 的开发过程中,我们还开发了模型的多模态扩展,使其能够具备图像识别、视频识别和语音理解能力。这些模型仍处于积极开发阶段,尚未准备好发布。除了我们的语言建模结果之外,本文还介绍了我们对这些多模态模型的初步实验结果。

Llama 3 8B 和 70B 是在多语言数据上预训练的,但当时主要用于英语。

4f6e3d4689532bf609259dfb43c4a62b.jpeg

 

 

2 总述

Llama 3 模型架构如图 1 所示。我们 Llama 3 语言模型的开发主要分为两个阶段:

  • 语言模型预训练。我们首先将大型多语言文本语料转换为离散标记,并在由此产生的数据上预训练一个大型语言模型(LLM) 进行下一个标记预测。在语言模型预训练阶段,模型学习语言结构并从它“阅读”的文本中获取大量关于世界的知识。为了有效地做到这一点,预训练是在大规模下进行的:我们使用 8K 个标记的上下文窗口,在一个包含 15.6T 个标记的模型上预训练了一个具有 405B 个参数的模型。此标准预训练阶段之后是继续预训练阶段,该阶段将支持的上下文窗口增加到 128K 个标记。有关详细信息,请参见第 3 节。
  • 模型后训练。预训练语言模型对语言有丰富的理解,但它尚未遵循指令或像我们期望的助手那样行为。我们在几轮中通过人类反馈对模型进行校准,每轮都包括在指令调整数据上进行监督微调(SFT)和直接偏好优化(DPO;Rafailov et al., 2024)。在这个后训练阶段,我们还集成了新的功能,例如工具使用,并在编码和推理等方面观察到显著改进。有关详细信息,请参阅第 4 节。最后,安全缓解措施也在后训练阶段集成到模型中,其细节在第 5.4节中描述。生成的模型具备丰富的功能。它们能够用至少八种语言回答问题,编写高质量代码,解决复杂的推理问题,并开箱即用或零样本方式使用工具。

我们还进行实验,通过组合式方法将图像、视频和语音能力添加到 Llama 3 中。我们研究的方法包括图 28 所示的三个额外阶段:

 

df8ff148b779bf01fde6bb2d55deef6e.jpeg

  • 多模态编码器预训练。我们为图像和语音分别训练编码器。我们将图像编码器训练于大量图像文本对上。这使得模型学习到视觉内容与其自然语言描述之间的关系。我们的语音编码器使用一种自监督方法,它遮盖语音输入的一部分,并尝试通过离散标记表示重建遮盖的部分。因此,模型学习了语音信号的结构。有关图像编码器的详细信息,请参阅第 7 节;有关语音编码器的详细信息,请参阅第 8 节。
  • 视觉适配器训练。我们训练一个适配器,将预训练的图像编码器与预训练的语言模型集成。该适配器由一系列交叉注意力层组成,将图像编码器表示输入到语言模型中。适配器在文本-图像对上进行训练,这使图像表示与语言表示相一致。在适配器训练期间,我们也更新了图像编码器的参数,但有意不更新语言模型的参数。我们还在图像适配器之上训练一个视频适配器,使用配对的视频-文本数据。这使得模型能够跨帧聚合信息。有关详细信息,请参见第 7 节。
  • 最后,我们将语音编码器通过一个适配器集成到模型中,该适配器将语音编码转换为可以直接输入微调语言模型的标记表示。在监督式微调阶段,联合更新适配器和编码器的参数,以实现高质量的语音理解。我们在语音适配器训练过程中不改变语言模型。我们还集成了一个文本到语音系统。详情请参见第 8 节。

我们的多模态实验导致模型能够识别图像和视频的内容,并通过语音接口支持交互。这些模型仍在开发中,尚未准备好发布。

 

 

3 预训练

 

语言模型的预训练涉及以下几个方面:

(1) 收集和过滤大规模训练语料库;

(2) 开发模型架构和相应的缩放定律以确定模型大小;

(3) 开发高效大规模预训练的技术;

(4) 开发预训练方案。我们将在下面分别介绍这些组成部分。

 

3.1 预训练数据

我们从各种数据源创建语言模型预训练数据集,这些数据源包含截至 2023 年底的知识。我们对每个数据源应用了几种去重方法和数据清洗机制,以获得高质量的标记。我们删除包含大量个人身份信息 (PII) 的领域,以及已知含有成人内容的领域。

 

3.11 Web 数据清洗

我们利用的大部分数据来自网络,下面我们将描述我们的清洗流程。

PII 和安全过滤: 除了其他措施外,我们还实施了旨在去除可能包含不安全内容或大量 PII 的网站数据的过滤器,这些网站的域名根据各种 Meta 安全标准被列为有害网站,以及已知包含成人内容的域名。

文本提取和清洗: 我们处理原始 HTML 内容以提取高质量、多样化的文本,并将非截断的网页文档用于此目的。为此,我们构建了一个自定义解析器,该解析器提取 HTML 内容并优化了模板移除和内容召回的精度。我们通过人工评估来评估解析器的质量,并将其与针对类似文章的内容进行优化的流行第三方 HTML 解析器进行了比较,发现其表现良好。我们会谨慎处理包含数学和代码内容的 HTML 页面,以保留这些内容的结构。我们保留图像 alt 属性文本,因为数学内容通常以预渲染图像的形式表示,其中数学也提供在 alt 属性中。

我们发现与纯文本相比,Markdown 对主要训练于 Web 数据的模型性能有害,因此我们删除所有 Markdown 标记。

去重: 我们在 URL、文档和行级别应用多轮去重:

  • URL 级去重: 我们对整个数据集执行 URL 级去重。对于每个 URL 对应的页面,我们保留最新版本。
  • 文档级去重: 我们对整个数据集执行全局 MinHash (Broder, 1997) 去重以删除近似重复文档。
  • 行级去重: 我们执行类似于 ccNet (Wenzek 等人,2019) 的激进行级去重。我们删除在每个包含 3000 万个文档的组中出现超过 6 次的行。

尽管我们的手动定性分析表明行级去重不仅可以去除来自各种网站的剩余模板内容(例如导航菜单、Cookie 预警),还可以去除频繁的高质量文本,但我们的经验评估显示出明显的改进。

启发式过滤: 我们开发了启发式方法来删除额外的低质量文档、异常值和重复次数过多的文档。一些启发式方法的示例包括:

  • 我们使用重复 n 元组覆盖率 (Rae et al., 2021) 来删除由重复内容(例如日志或错误消息)组成的行。这些行可能非常长且唯一,因此不能通过行去重进行过滤。
  • 我们使用“脏话”计数 (Raffel et al., 2020) 来过滤掉未被域名黑名单覆盖的成人网站。
  • 我们使用标记分布的 Kullback-Leibler 散度来过滤掉包含与训练语料库分布相比过多异常标记的文档。

 

基于模型的质量过滤:

此外,我们还尝试将各种基于模型的质量分类器用于选择高质量标记。这些方法包括:

  • 使用 fasttext (Joulin et al., 2017) 等快速分类器,这些分类器经过训练可以识别给定的文本是否会被维基百科引用 (Touvron et al., 2023a)。
  • 使用更耗费计算资源的 Roberta 模型分类器 (Liu et al., 2019a),该分类器在 Llama 2 的预测上进行训练。

为了训练基于 Llama 2 的质量分类器,我们创建了一组经过清洗的 Web 文档,描述了质量要求,并指示 Llama 2 的聊天模型确定文档是否满足这些要求。 为提高效率,我们使用 DistilRoberta (Sanh et al., 2019) 为每个文档生成质量分数。 我们将实验评估各种质量过滤配置的效果。

代码和推理数据:

类似于 DeepSeek-AI 等人 (2024),我们构建了领域特定的管道来提取包含代码和数学相关网页。具体来说,这两个代码和推理分类器都是使用 Llama 2 注解的 Web 数据训练的 DistilledRoberta 模型。 与上面提到的通用质量分类器不同,我们进行了提示调整以针对包含数学推论、STEM 领域的推理以及嵌入自然语言的代码的网页。由于代码和数学的标记分布与自然语言的标记分布截然不同,因此这些管道实现了领域特定的 HTML 提取、自定义文本特征和用于过滤的启发式方法。

多语言数据:

与上面描述的英文处理管道类似,我们实施过滤器以删除可能包含个人身份信息 (PII) 或不安全内容的网站数据。我们的多语言文本处理管道具有以下独特功能:

  • 我们使用基于 fasttext 的语言识别模型将文档分类为 176 种语言。
  • 我们对每个语言的数据进行文档级和行级去重。
  • 我们应用语言特定的启发式方法和基于模型的过滤器来去除低质量文档。

此外,我们使用基于多语言 Llama 2 的分类器对多语言文档进行质量排名,以确保优先处理高质量内容。我们在预训练中使用的多语言标记数量通过实验确定,在英语和多语言基准测试上的模型性能取得平衡。

 

3.12 确定数据混合

为了获得高质量语言模型,必须谨慎确定预训练数据混合中不同数据源的比例。我们主要利用知识分类和尺度定律实验来确定这一数据混合。

知识分类。我们开发了一个分类器,用于对网页数据中包含的信息类型进行分类,以便更有效地确定数据组合。我们使用这个分类器对网页上过度代表的数据类别(例如艺术和娱乐)进行下采样。

为了确定最佳数据混合方案。我们进行规模定律实验,其中我们将多个小型模型训练于特定数据混合集上,并利用其预测大型模型在该混合集上的性能(参见第 3.2.1 节)。我们多次重复此过程,针对不同的数据混合集选择新的候选数据混合集。随后,我们在该候选数据混合集上训练一个更大的模型,并在多个关键基准测试上评估该模型的性能。

数据混合摘要。我们的最终数据混合包含大约 50% 的通用知识标记、25% 的数学和推理标记、17% 的代码标记以及 8% 的多语言标记。

3.13 退火数据

实证结果表明,在少量高质量代码和数学数据上进行退火(见第 3.4.3 节)可以提升预训练模型在关键基准测试上的性能。类似于李等人的研究(2024b),我们使用包含选定领域高品质数据的混合数据集进行退火。我们的退火数据不包含任何来自常用基准测试的训练集。这使我们能够评估 Llama 3 的真实少样本学习能力和域外泛化能力。

遵循 OpenAI (2023a),我们在 GSM8k (Cobbe 等人,2021) 和 MATH (Hendrycks 等人,2021b) 训练集上评估了退火的效果。我们发现退火分别提高了预训练 Llama 3 8B 模型在 GSM8k 和 MATH 验证集上的性能 24.0% 和 6.4%。然而,对于 405B 模型的改进可以忽略不计,这表明我们的旗舰模型具有强大的上下文学习和推理能力,不需要特定领域的训练样本就能获得强劲的性能。

使用退火评估数据质量。与 Blakeney 等人 (2024) 一样,我们发现退火使我们能够判断小领域特定数据集的价值。我们通过将已训练 50% 的 Llama 3 8B 模型的学习率在 400 亿个标记上线性退火到 0 来衡量这些数据集的价值。在这些实验中,我们为新数据集分配 30% 的权重,其余 70% 的权重分配给默认数据混合。与对每个小数据集执行标度律实验相比,使用退火来评估新的数据源更加高效。

 

 

3.2 模型架构

 

Llama 3 使用标准的稠密 Transformer 架构 (Vaswani 等人,2017)。它的模型架构与 Llama 和 Llama 2(Touvron 等人,2023a, b)没有显著区别;我们的性能提升主要来自于数据质量和多样性的改进以及训练规模的扩大。

我们做了几个小的修改:

  • 我们使用分组查询注意力 (GQA; Ainslie 等人 (2023)),其中 8 个关键值头用来提高推理速度,并减少解码过程中关键值缓存的大小。
  • 我们使用一个注意力掩码来防止序列中不同文档之间的自注意力机制。我们发现,这种改变在标准预训练期间影响有限,但在非常长序列的持续预训练中很重要。
  • 我们使用 128K 个标记的词汇表。我们的标记词汇表将 tiktoken3 词汇表的 100K 个标记与 28K 个额外的标记相结合,以更好地支持非英语语言。与 Llama 2 词汇表相比,我们的新词汇表将英语数据样本的压缩率从 3.17 提高到 3.94 个字符/标记。这使得模型能够在相同的训练计算量下“阅读”更多文本。我们还发现,添加来自特定非英语语言的 28K 个标记改善了压缩率和下游性能,而对英语标记化没有影响。
  • 我们将 RoPE 基础频率超参数提高到 500,000。这使我们能够更好地支持更长的上下文;Xiong 等人(2023)表明该值对于上下文长度高达 32,768 的情况有效。

 

db770ae57178cce622a2a409deba5dec.jpeg

 

Llama 3 405B 使用了一个具有 126 层、16,384 个标记表示维度和 128 个注意力头的架构;有关详细信息,请参阅表 3。这导致模型尺寸约为根据我们的数据和 3.8 × 10^25 FLOPs 的训练预算计算出的计算最优值。

 

3.2.1 尺度定律

我们利用Scaling Laws(Hoffmann 等人,2022 年;Kaplan 等人,2020 年)来确定在我们的预训练计算预算下,旗舰模型的最佳规模。除了确定最佳模型规模之外,预测旗舰模型在下游基准任务上的性能也面临着重大挑战,原因如下:

  1. 现有的 Scaling Laws 通常只预测下一个标记预测损失,而不是特定的基准测试性能。
  2. Scaling Laws 可能存在噪声且不可靠,因为它们是基于使用较小计算预算进行的预训练运行开发而来的(Wei 等人,2022b)。

为了应对这些挑战,我们实施了一种两阶段方法来开发能够准确预测下游基准测试性能的 Scaling Laws:

  1. 我们首先建立预训练 FLOPs 与计算最佳模型在下游任务上的负对数似然之间的相关性。
  2. 接下来,我们利用 Scaling Laws 模型和之前使用更高计算 FLOPs 训练的旧模型,将下游任务上的负对数似然与任务准确率相关联。在此步骤中,我们专门利用 Llama 2 系列模型。

这种方法使我们能够根据特定数量的预训练 FLOPs 来预测下游任务性能(对于计算最佳模型)。我们使用类似的方法来选择我们的预训练数据组合(请参见第 3.4 节)。

Scaling Law 实验。具体来说,我们通过使用在 6 × 10^18 FLOPs 和 10^22 FLOPs 之间的计算预算预训练模型来构建 Scaling Laws。在每个计算预算下,我们预训练规模在 40M 到 16B 参数之间的模型,并在每个计算预算下使用一部分模型规模。在这些训练运行中,我们在 2,000 次训练步骤内使用余弦学习率调度和线性预热。峰值学习率根据模型的大小设置为 2 × 10^-4 到 4 × 10^-4 之间。我们将余弦衰减设置为峰值的 0.1 倍。每一步的权重衰减都设置为该步学习率的 0.1 倍。我们对每个计算规模使用固定的批量大小,范围在 250K 到 4M 之间。

 

547f352be38580c76ba3ecc3b3e7e166.jpeg

 

这些实验产生了图 2 中的 IsoFLOPs 曲线。这些曲线中的损失是在单独的验证集上测量的。我们使用二阶多项式拟合测得的损失值,并确定每个抛物线的最小值。我们将抛物线的最小值称为相应预训练计算预算下的计算最优模型。

我们使用以这种方式识别的计算最优模型来预测特定计算预算下的最佳训练标记数量。为此,我们假设计算预算 C 与最佳训练标记数量 N (C) 之间存在幂律关系:

N (C) = AC α 。

我们使用图 2 中的数据拟合 A 和 α。我们发现 (α, A) = (0.53, 0.29);相应的拟合如图 3 所示。将所得缩放定律外推到 3.8 × 10 25 FLOPs 建议训练一个包含 402B 参数的模型,并使用 16.55T 个标记。

一个重要的观察结果是,随着计算预算的增加,IsoFLOPs 曲线在最小值周围变得更平坦。这意味着旗舰模型的性能对模型大小和训练标记之间权衡的小变化相对稳定。基于这个观察结果,我们最终决定训练一个包含 405B 参数的旗舰模型。

预测下游任务的性能。我们使用生成的计算最优模型来预测旗舰 Llama 3 模型在基准数据集上的性能。首先,我们将基准中正确答案的(归一化)负对数似然与训练 FLOPs 线性相关联。在此分析中,我们仅使用了在上述数据混合上训练至 10^22 FLOPs 的缩放定律模型。接下来,我们使用缩放定律模型和 Llama 2 模型建立对数似然和准确率之间的 S 型关系,Llama 2 模型使用 Llama 2 数据混合和标记器进行训练。我们在图 4 中展示了这个实验在 ARC Challenge 基准上的结果)。我们发现这种两步缩放定律预测(外推超过四个数量级)相当准确:它仅略微低估了旗舰 Llama 3 模型的最终性能。

 

 

3.3 基础设施、扩展和效率

 

我们描述了支持 Llama 3 405B 预训练的硬件和基础架构,并讨论了几项优化措施,这些优化措施提高了训练效率。

 

3.3.1 训练基础设施

Llama 1 和 Llama 2 模型在 Meta 的 AI 研究超级集群(Lee 和 Sengupta,2022)上进行训练。随着我们进一步扩大规模,Llama 3 的训练被迁移到 Meta 的生产集群(Lee 等人,2024)。这种设置优化了生产级可靠性,这是我们在扩大训练规模时至关重要的。

 

b338e8978b672b439f3500034fc84cb1.jpeg

 

计算资源: Llama 3 405B 在高达 16,000 块 H100 GPU 上进行训练,每块 GPU 以 700W TDP 运行,拥有 80GB HBM3,使用 Meta 的 Grand Teton AI 服务器平台(Matt Bowman,2022)。每个服务器配备八块 GPU 和两块 CPU。在服务器内部,八块 GPU 通过 NVLink 连接。训练作业使用 MAST(Choudhury 等人,2024)进行调度,这是 Meta 的全球规模训练调度程序。

存储: Tectonic(Pan 等人,2021),Meta 的通用分布式文件系统,用于构建 Llama 3 预训练的存储结构(Battey 和 Gupta,2024)。它提供 240PB 的存储空间,由 7,500 台配备 SSD 的服务器组成,支持可持续的吞吐量为 2TB/s,峰值吞吐量为 7TB/s。一个主要挑战是支持高突发性检查点写入,这些写入会在短时间内饱和存储结构。检查点保存每个 GPU 的模型状态,范围从 1MB 到每 GPU 4GB,用于恢复和调试。我们的目标是最小化 GPU 在检查点期间的暂停时间,并增加检查点频率以减少在恢复后丢失的工作量。

网络: Llama 3 405B 使用基于 Arista 7800 和 Minipack2 开放计算项目(OCP)机架交换机的 RDMA over Converged Ethernet(RoCE)架构。Llama 3 系列中较小模型使用 Nvidia Quantum2 Infiniband 网络进行训练。RoCE 和 Infiniband 集群都利用 GPU 之间的 400 Gbps 链路连接。尽管这些集群的底层网络技术存在差异,但我们对两者都进行了调整,以提供等效的性能来处理这些大型训练工作量。我们将进一步详细阐述我们的 RoCE 网络,因为我们完全掌握了它的设计。

  • 网络拓扑: 我们的基于 RoCE 的 AI 集群包含 24,000 块 GPU(注脚 5),通过三层 Clos 网络连接(Lee 等人,2024)。在底层,每个机架托管 16 块 GPU,分配到两台服务器上,并通过单个 Minipack2 机架顶端(ToR)交换机连接。在中间层,192 个这样的机架通过集群交换机连接形成一个包含 3,072 块 GPU 的 Pod,具有全双向带宽,确保没有过度订阅。在顶层,同一个数据中心建筑物内的八个这样的 Pod 通过聚合交换机连接以形成一个 24,000 块 GPU 的集群。然而,聚合层的网络连接没有保持全双向带宽,而是采用了 1:7 的过度订阅率。我们的模型并行方法(请参见第 3.3.2 节)和训练作业调度程序(Choudhury 等人,2024)都被优化为知道网络拓扑结构,旨在最大限度地减少 Pod 之间的网络通信。
  • 负载均衡: 大型语言模型的训练会产生难以通过传统方法(如等成本多路径(ECMP)路由)在所有可用网络路径上平衡的繁重网络流量。为了应对这一挑战,我们采用了两种技术。首先,我们的集合库在两个 GPU 之间创建 16 个网络流,而不是一个,从而减少了每个流的流量,并为负载均衡提供了更多流。其次,我们的增强型 ECMP(E-ECMP)协议通过对 RoCE 报头数据包中的其他字段进行哈希,有效地在不同的网络路径上平衡这些 16 个流。

5bd7588b45a03dd10492d3e79451a690.jpeg

  • 拥塞控制: 我们在骨干网中使用深缓冲交换机(Gangidi 等人,2024)来容纳由集合通信模式引起的瞬态拥塞和缓冲。这有助于限制持续拥塞和由慢速服务器引起网络反压的影响,这在训练中很常见。最后,通过 E-ECMP 实现更好的负载均衡大大降低了发生拥塞的可能性。通过这些优化,我们成功地运行了一个 24,000 块 GPU 的集群,无需使用传统的拥塞控制方法,例如数据中心量化拥塞通知(DCQCN)。

 

3.3.2 模型规模扩展中的并行性

为了扩大我们最大模型的训练规模,我们使用 4D 并行技术 - 一种结合四种不同并行方法的方案 - 对模型进行分片。这种方法有效地将计算分布到许多 GPU 上,并确保每个 GPU 的模型参数、优化器状态、梯度和激活值都能够容纳在它的 HBM 中。我们的 4D 并行实现(如 et al. (2020);Ren et al. (2021);Zhao et al. (2023b)) 所示,它对模型、优化器和梯度进行分片,同时实现了数据并行,该并行方法在多个 GPU 上并行处理数据并在每个训练步骤后进行同步。我们使用 FSDP 对 Llama 3 的优化器状态和梯度进行分片,但对于模型分片,我们不会在正向计算后重新分片,以避免在反向传递过程中发生额外的全收集通信。

GPU 利用率。通过仔细调整并行配置、硬件和软件,我们实现了 BF16 模型 FLOPs 利用率(MFU;Chowdhery et al. (2023)) 的 38-43%。表 4 中显示的配置表明,与 8K GPU 和 DP=64 上的 43% 相比,16K GPU 和 DP=128 上 MFU 降至 41% 是由于需要降低每个 DP 组的批量大小以保持训练期间全局标记数不变。

流水线并行改进。我们在现有的实现中遇到了几个挑战:

  • 批量尺寸限制。当前的实现对每个 GPU 支持的批量尺寸有限制,要求它可被流水线阶段数整除。对于图 6 中的示例,深度优先调度 (DFS) 的流水线并行(Narayanan et al. (2021))需要 N = PP = 4,而广度优先调度 (BFS;Lamy-Poirier (2023)) 需要 N = M,其中 M 是总微批量数,N 是同一阶段正向或反向的连续微批量数。然而,预训练通常需要灵活地调整批量大小。
  • 内存不平衡。现有的流水线并行实现会导致资源消耗不平衡。第一阶段由于嵌入和预热微批次而消耗更多内存。
  • 计算不平衡。 在模型的最后一层之后,我们需要计算输出和损失,使得这个阶段成为执行延迟的瓶颈。其中 Di 是第 i 个并行维度的索引。在这个例子中,GPU0[TP0, CP0, PP0, DP0] 和 GPU1[TP1, CP0, PP0, DP0] 在同一个 TP 组,GPU0 和 GPU2 在同一个 CP 组,GPU0 和 GPU4 在同一个 PP 组,GPU0 和 GPU8 在同一个 DP 组。

 

4d99d29ea10c7b01e2194f21e61f097b.jpeg

 

为了解决这些问题,我们修改了管道调度方式,如图 6 所示,这允许灵活地设置 N——在本例中 N = 5,它可以在每个批次中运行任意数量的微批量。 这使得我们可以:

(1) 当有批量大小限制时,运行比阶段数更少的微批量;或

(2) 运行更多微批量来隐藏点对点通信,在深度优先调度 (DFS) 和广度优先调度 (BFS) 之间找到最佳的通信和内存效率。为了平衡管道,我们分别从第一阶段和最后一阶段中减少一个 Transformer 层。这意味着第一阶段上的第一个模型块只有嵌入层,而最后一阶段上的最后一个模型块只有输出投影和损失计算。

为了减少管道气泡,我们在一个管道等级上使用了交错调度方式 (Narayanan 等人,2021),拥有 V 个管道阶段。 整体管道气泡比率为 PP-1 V * M 。此外,我们采用了异步点对点通信,这显著加快了训练速度,尤其是在文档掩码引入额外计算不平衡的情况下。我们启用 TORCH_NCCL_AVOID_RECORD_STREAMS 来减少来自异步点对点通信的内存使用量。最后,为了降低内存成本,基于详细的内存分配分析,我们主动释放不会用于未来计算的张量,包括每个管道阶段的输入和输出张量。** 通过这些优化,我们可以在不使用激活检查点的情况下,对 8K 个 token 的序列进行 Llama 3 的预训练。

上下文并行化用于长序列。 我们利用上下文并行化 (CP) 来提高在扩展 Llama 3 上下文长度时的内存效率,并允许在长达 128K 的极长序列上进行训练。在 CP 中,我们跨序列维度进行分区,具体来说我们将输入序列划分为 2 × CP 个块,以便每个 CP 等级接收两个块以获得更好的负载平衡。第 i 个 CP 等级接收到第 i 个和 (2 × CP -1 -i) 个块。

 

不同于现有的在环形结构中重叠通信和计算的 CP 实现(Liu et al., 2023a),我们的 CP 实现采用了一种基于 all-gather 的方法,首先将键值 (K, V) 张量进行全局聚合,然后计算局部查询 (Q) 张量块的注意力输出。尽管 all-gather 通信延迟处于关键路径上,但我们仍然采用这种方法有两个主要原因:

(1) 它更容易更灵活地支持基于 all-gather 的 CP 注意力中的不同类型注意掩码,例如文档掩码;

(2) 暴露的 all-gather 延迟很小,因为通信的 K 和 V 张量远小于 Q 张量,这是由于使用了 GQA (Ainslie et al., 2023)。因此,注意力计算的时间复杂度比 all-gather 大一个数量级(O(S²) 对 O(S),其中 S 表示完全因果掩码中的序列长度),使得 all-gather 开销可以忽略不计。

 

342db3550c6ea710a0bc2b94bc592bba.jpeg

 

网络感知并行化配置。并行化维度的顺序 [TP, CP, PP, DP] 是针对网络通信进行优化的。最内层的并行化需要最高的网络带宽和最低的延迟,因此通常被限制在同一服务器内部。最外层的并行化可能跨越多跳网络,应能够容忍更高的网络延迟。因此,基于对网络带宽和延迟的要求,我们将并行化维度按照 [TP, CP, PP, DP] 的顺序排列。DP (即 FSDP) 是最外层并行化,因为它可以通过异步预取分片模型权重和减少梯度来忍受更长的网络延迟。确定具有最小通信开销的最佳并行化配置,同时避免 GPU 内存溢出是一个挑战。我们开发了一个内存消耗估计器和一个性能投影工具,这有助于我们探索各种并行化配置,并预测整体训练性能和有效地识别内存差距。

数值稳定性。通过比较不同并行设置之间的训练损失,我们修复了一些影响训练稳定性的数值问题。为了确保训练收敛,我们在多个微批次的反向计算过程中使用 FP32 梯度累积,并在 FSDP 中的数据并行工作器之间使用 FP32 进行 reduce-scatter 梯度。对于在正向计算中多次使用的中间张量,例如视觉编码器输出,反向梯度也会以 FP32 累积。

 

3.3.3 集体通信

Llama 3 的集体通信库基于 Nvidia NCCL 库的分支,称为 NCCLX。NCCLX 极大地提高了 NCCL 的性能,尤其是对于高延迟网络而言。回想一下,并行维度的顺序是 [TP, CP, PP, DP],其中 DP 对应于 FSDP。最外层的并行维度 PP 和 DP 可能通过多跳网络进行通信,延迟高达数十微秒。原始 NCCL 的集体通信操作 all-gather 和 reduce-scatter 在 FSDP 中使用,而 point-to-point 通信则用于 PP,这些都需要数据分块和分阶段的数据复制。这种方法会导致以下一些低效率问题:

  1. 需要通过网络交换大量小控制消息以促进数据传输;
  2. 额外的内存复制操作;
  3. 使用额外的 GPU 周期进行通信。

对于 Llama 3 训练,我们通过调整分块和数据传输以适应我们的网络延迟来解决其中一部分低效率问题,这种延迟在大型集群中可能高达数十微秒。我们还允许小控制消息以更高的优先级穿过我们的网络,特别避免在深度缓冲核心交换机中出现队首阻塞。

我们正在进行的工作,用于未来的 Llama 版本,包括对 NCCLX 进行更深层次的修改,以全面解决上述所有问题。

 

ad39fd975442cf6ab4965827c0c8dacb.jpeg

 

3.3.4 可靠性和运行挑战

16K GPU 训练的复杂性和潜在故障场景超过了我们操作过的更大的 CPU 集群。此外,训练的同步性质使其容错性较低——单个 GPU 故障可能需要重新启动整个作业。尽管面临这些挑战,但对于 Llama 3,我们在支持自动集群维护(例如固件和 Linux 内核升级 (Vigraham 和 Leonhardi,2024))的同时,实现了高于 90% 的有效训练时间,这导致了每天至少一次训练中断。

有效训练时间是指在经过的时间内用于有效训练的时间。 在为期 54 天的预训练快照期间,我们经历了总共 466 次作业中断。其中 47 次是由于自动维护操作(例如固件升级或操作员启动的操作,如配置或数据集更新)而计划的中断。其余 419 次是未预期中断,这些中断按表 5 分类。大约 78% 的意外中断归因于已确认的硬件问题,例如 GPU 或主机组件故障,或者怀疑与硬件相关的问题,例如无声数据损坏和计划外个别主机维护事件。GPU 问题是最大类别,占所有意外问题的 58.7%。尽管存在大量故障,但在这段时间内,仅需要进行三次重大手动干预,其余问题都通过自动化处理。

为了提高有效训练时间,我们减少了作业启动和检查点时间,并开发了用于快速诊断和解决问题的工具。 我们广泛使用了 PyTorch 内置的 NCCL Flight Recorder (Ansel 等人,2024)——此功能将集体元数据和堆栈跟踪捕获到环形缓冲区中,从而使我们能够快速在大规模下诊断挂起和性能问题,特别是在 NCCLX 方面。使用它,我们可以有效地记录每个集体操作的通信事件和持续时间,并在 NCCLX 看门狗或心跳超时时自动转储跟踪数据。通过在线配置更改 (Tang 等人,2015),我们可以选择性地启用更计算密集的跟踪操作和元数据收集,而无需代码发布或作业重启。 由于我们的网络中混合使用了 NVLink 和 RoCE,因此在大型训练中调试问题变得复杂。数据传输通常通过 CUDA 内核发出的加载/存储操作进行在 NVLink 上进行,远程 GPU 或 NVLink 连接失败经常会表现为 CUDA 内核中的加载/存储操作停滞而不会返回明确的错误代码。NCCLX 通过与 PyTorch 紧密的设计,提高了故障检测和定位的速度和准确性,允许 PyTorch 访问 NCCLX 的内部状态并跟踪相关信息。虽然无法完全防止由于 NVLink 故障导致的停滞,但我们的系统会监视通信库的状态,并在检测到此类停滞时自动超时。此外,NCCLX 还会跟踪每个 NCCLX 通信的内核和网络活动,并提供正在失败的 NCCLX 集体的内部状态快照,包括所有秩之间已完成和未完成的数据传输。我们分析这些数据来调试 NCCLX 扩展问题。

有时,硬件问题会导致仍然可以运行但速度慢的 stragglers,这些 stragglers 很难以检测到。即使只有一个 straggler,它也会减慢数千个其他 GPU 的速度,通常表现为正常运行但通信缓慢。 我们开发了工具来优先处理来自选定进程组的潜在问题通信。通过仅调查少数主要嫌疑犯,我们通常能够有效地识别出 stragglers。

一个有趣的观察是环境因素对大规模训练性能的影响。对于 Llama 3 405B,我们注意到基于时间变化的 1-2% 的吞吐量波动。这种波动是由于更高的中午温度影响 GPU 动态电压和频率缩放造成的。 在训练过程中,数万个 GPU 可能会同时增加或减少功耗,例如由于所有 GPU 正在等待检查点或集体通信结束,或者整个训练作业的启动或关闭。当发生这种情况时,它会导致数据中心内的功耗瞬时波动达到数十兆瓦的幅度,这将拉伸电网的极限。随着我们为未来甚至更大的 Llama 模型扩展训练规模,这是一个持续面临的挑战。

 

 

3.4 训练方案

 

Llama 3 405B 的预训练食谱包含三个主要阶段:

(1) 初始预训练,(2) 长上下文预训练和 (3) 退火。以下分别描述这三个阶段。我们使用类似的食谱来预训练 8B 和 70B 模型。

 

3.4.1 初始预训练

我们使用余弦学习率计划预训练Llama 3 405B模型,最高学习率为8 × 10⁻⁵,线性预热8,000步,经过1,200,000步训练后衰减至8 × 10⁻⁷。为了提高训练的稳定性,我们在训练初期使用较小的批量大小,随后增加批量大小以提高效率。具体来说,我们最初的批量大小为4M个tokens,序列长度为4,096。在预训练了252M个tokens后,我们将批量大小和序列长度分别加倍至8M个序列、8,192个tokens。在预训练了2.87T个tokens后,我们再次将批量大小加倍至16M。我们发现这种训练方法非常稳定:很少出现损失峰值,并且不需要进行干预来纠正模型训练的偏离。

调整数据组合。在训练过程中,我们对预训练数据组合进行了几次调整,以改善模型在特定下游任务中的表现。特别是,我们在预训练期间增加了非英语数据的比例,以提高Llama 3的多语言表现。我们还上调了数学数据的比例,以增强模型的数学推理能力,在预训练的后期阶段加入了更多的最新网络数据,以更新模型的知识截止点,同时下调了后来被识别为质量较低的数据子集的比例。

 

3.4.2 长上下文预训练

在预训练的最后阶段,我们训练长序列以支持高达 128,000 个标记的上下文窗口。我们不会更早地训练长序列,因为自注意力层中的计算随着序列长度的增加而二次增长。我们逐步增加支持的上下文长度,并在模型成功适应增加的上下文长度后进行预训练。我们通过测量以下两个方面来评估成功的适应:

(1) 模型在短上下文评估中的性能是否已完全恢复;

(2) 模型是否能够完美地解决长达该长度的“大海捞针”任务。在 Llama 3 405B 预训练中,我们逐步增加了六个阶段的上下文长度,从最初的 8,000 个标记的上下文窗口开始,最终达到 128,000 个标记的上下文窗口。这个长上下文预训练阶段使用了大约 8000 亿个训练标记。

 

8d3dc5747c94024b4453e927eb66c9d9.jpeg

 

3.4.3 退火

在最后 40M 个标记的预训练过程中,我们将学习率线性退火至 0,同时保持上下文长度为 128K 个标记。在此退火阶段,我们还调整了数据混合,以增加非常高质量的数据源的样本量;请参见第 3.1.3 节。最后,我们在退火期间计算模型检查点的平均值(Polyak (1991) 平均)以生成最终预训练模型。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值