前不久,Meta开源了LLaMA 3.1 405B【1】,模型扩展了上下文长度至 128K,支持八种语言,效果非常惊艳,是首个在通用知识、可操控性、数学、工具使用和多语言翻译方面能够与最先进闭源 AI 模型媲美的公开可用模型,已经赶上截至目前最好的闭源模型,如GPT 4o和Claude 3.5。这可以算是一个里程碑,我们正在迎来一个以开源为主导的新时代。另一个问题不得不思考,如果作为基座大模型创业者,面对开源的冲击,公司存在的核心竞争力应该是什么?需要好好梳理。说明:本文主要会参考Meta的技术文章【2,3】以及来自新浪微博张俊林博士的分析解读【4】。此外,利用大模型对小模型进行蒸馏学习,毕竟405B大小的模型提供服务代价太大,而用来蒸馏应用的基座模型,来提升基座模型能力,则更加合适,使用闭源模型蒸馏成本太高了。
1. 模型架构
作为LLaMA系列迄今为止最大的模型,训练 Llama 3.1 405B 涉及超过 15 万亿个标记,面临巨大挑战。为了在合理的时间内完成如此大规模的训练并取得所达到的结果,meta对整个训练堆栈进行了大幅优化,并在超过 16,000 块 H100 GPU 上进行了模型训练,使 405B 成为首个在此规模上训练的 Llama 模型。
图1. 模型结构
LLaMA 3.1 的模型架构如图1所示【2】,基本上已经成为当前LLM 模型的标准结构,之前介绍的GPT3.5模型架构,基本类似。对于采用 MOE 结构的 LLM 模型,变化主要体现在将图中的 FFN 模块中的单个 SwiGLU 模块扩展为多个并联的 SwiGLU 模块,形成多个专家网络,再加上一个路由子网络来选择当前 token 通过的专家。模型的基本结构差别不大。另外业内推行的MOE架构, 只是 Transformer 的一种变体,并非独立的模型结构。许多新型结构实际上是"线性 Transformer"结构的变体。
Meta 坚决走开源路线的策略其实很正确,越早开源最早形成影响力,成为事实上的行业标准。不过这种策略一般只对拥有强大技术影响力的大型公司而言有效。曾经经历过小公司在某行业技术壁垒未形成的阶段就实行开源,最终沦为炮灰。回到正题,LLaMA 结构之所以逐渐成为行业标准,可能有两个主要原因:(1) Transformer 结构趋于稳定,目前看业内进行的大量新的尝试,可能总会在某一点上不如 Transformer 结构表现好。即使最近推出的mamba系列架构,也被逐步证明与Transformer有一定的关联。(2) LLM 已经形成生态系统,各种衍生工具(如快速推理框架等)都与该结构兼容。如果新结构变动太大,许多流行工具不支持,就很难扩散影响力,进而形成新的行业标准。
LLaMA3.1 选择了一种标准的仅解码器的变压器模型架构,并进行了微小调整,而非混合专家模型MOE,以最大限度地提高训练稳定性。采用一种迭代的后训练程序,其中每一轮都使用有监督的微调以及直接偏好优化。能够为每一轮创建最高质量的合成数据,并提高每种能力的性能。与之前LLaMA版本相比,提高了用于预训练和后训练的数据的数量和质量。这些改进包括为预训练数据开发更仔细的预处理和精选管道,为后训练数据开发更严格的质量保证和过滤方法。此外,Meta还使用了 4050 亿参数的模型来提高较小模型的后训练质量。为了支持 4050 亿参数规模的模型进行大规模生产推理,将模型从 16 位(BF16)量化为 8 位(FP8)数字,有效地降低了所需的计算要求,并使模型能够在单个服务器节点内运行。
刚才提到LLaMA没有使用MOE,而国内某些厂却推行MOE,那么为什么会有这种反差?
首先需要回答一个问题:MOE结构会让模型效果更好吗?答案是否定的。这个在很久以前就有研究结论,从对模型效果的影响来说,MOE结构相对Dense模型本身并不会带来额外优势,甚至是有劣势的。MOE的主要优势是减少训练和推理成本,付出的代价是训练不够稳定以及推理时额外付出大内存来存储膨胀的参数量。但当用户量大请求多的时候,推理成本占比会更高,此时使用MOE对于推理会更友好,因为MOE 架构通过将模型划分为多个专家(即子网络或模块),在推理时只激活其中的一小部分专家。这是为何当模型大到一定程度模型结构就会从Dense转向MOE的主要原因,是出于成本、效率而非效果角度考虑。
Llama3 405B 之所以没有采用MOE,技术报告指出主要是考虑到Dense模型训练更稳定,所以选择了Dense结构。相比GPT 4的1.8T的MOE模型结构,405B的Dense模型效果与之相当甚至要更好一些。
2. 预训练
语言模型预训练涉及:(1)大规模训练语料库的整理和过滤;(2)确定模型大小的模型架构和相应扩展定律的开发;(3)大规模高效预训练技术的开发;(4)预训练方案的开发。我们将分别介绍以下每个组成部分。
2.1 预训练数据
从包含截至 2023 年底知识的各种数据源中创建用于语言模型预训练的数据集。对每个数据源应用多种去重方法和数据清理机制以获得高质量的标记。去除包含大量个人可识别信息(PII)的领域以及已知包含成人内容的领域。
2.1.1 网络数据整理
使用的大部分数据来自网络,下面我们描述一下我们的清理过程。个人可识别信息和安全过滤。在其他缓解措施中,实施过滤器,旨在去除来自可能包含不安全内容或大量个人可识别信息的网站的数据、根据各种安全标准被评为有害的领域以及已知包含成人内容的领域的数据。处理未截断的网络文档的原始 HTML 内容,以提取高质量的多样化文本。构建了一个自定义解析器,它提取 HTML 内容并针对去除样板文本和内容召回的精度进行优化。在人工评估中评估解析器的质量,将其与针对类似文章内容进行优化的流行第三方 HTML 解析器进行比较。仔细处理包含数学和代码内容的 HTML 页面,以保留该内容的结构。保留图像的替代属性文本,因为数学内容通常以预渲染图像的形式呈现,其中数学内容也在替代属性中提供。与纯文本相比,对于主要在网络数据上训练的模型,Markdown 对其性能有害,所以去除所有 Markdown 标记。
去重,在 URL、文档和行级别应用几轮去重:
- URL 级别去重。在整个数据集上进行 URL 级别去重。对于每个 URL 对应的页面,保留最新版本。
- 文档级别去重。在整个数据集上进行全局 MinHash(Broder,1997)去重,以去除近似重复的文档。
- 行级别去重。进行类似于 ccNet(Wenzek 等人,2019)的行级别去重。在每 3000 万个文档的桶中删除出现超过 6 次的行。行级别去重不仅去除了各种网站(如导航菜单、Cookie 警告)残留的样板文本,还去除了频繁出现的高质量文本。
启发式过滤。开发启发式方法来去除额外的低质量文档、异常值和过度重复的文档。启发式方法的一些示例包括:
- 使用重复 n-gram 覆盖率(Rae 等人,2021)来去除由重复内容(如日志或错误消息)组成的行。这些行可能非常长且唯一,因此不能通过行去重进行过滤。
- 使用 "脏词" 计数(Raffel 等人,2020)来过滤未被域名阻止列表覆盖的成人网站。
- 使用token分布的 Kullback-Leibler 散度来过滤出与训练语料库分布相比包含过多异常值token的文档。
基于模型的质量过滤。尝试应用各种基于模型的质量分类器来选择高质量的标记。这包括使用快速分类器,如经过训练以识别给定文本是否会被维基百科引用的 fasttext(Joulin 等人,2017),以及更计算密集型的基于 Roberta 的分类器(Liu 等人,2019a),这些分类器在Llama 2的预测上进行训练。为了基于Llama 2 训练质量分类器,创建一个经过清理的网络文档训练集,描述质量要求,并指示Llama 2的聊天模型确定文档是否满足这些要求。出于效率原因,使用 DistilRoberta(Sanh 等人,2019)为每个文档生成质量分数。
代码和推理数据。与 DeepSeek-AI 等人(2024)类似,构建特定领域的管道来提取代码和与数学相关的网页。具体来说,代码和推理分类器都是在由llama 2 注释的网络数据上训练的 DistilRoberta 模型。与上述一般质量分类器不同,进行提示调优以针对包含数学推导、STEM 领域推理以及与自然语言交错的代码的网页。由于代码和数学的标记分布与自然语言有很大不同,这些管道实现了特定领域的 HTML 提取、定制的文本特征和用于过滤的启发式方法。
多语言数据。与上述针对英语的处理管道类似,实施过滤器以去除可能包含个人可识别信息(PII)或不安全内容的网站的数据。多语言文本处理管道有几个独特的功能:
- 使用基于 fasttext 的语言识别模型将文档分类为 176 种语言。
- 在每种语言的数据内进行文档级别和行级别去重。
- 应用特定语言的启发式方法和基于模型的过滤器来去除低质量文档。
- 此外,使用基于多语言llama 2 的分类器对多语言文档进行质量排名,以确保优先考虑高质量内容。
2.1.2 确定数据组合
为了获得高质量的语言模型,仔细确定预训练数据组合中不同数据源的比例至关重要。确定这种数据组合的主要工具是知识分类和扩展定律实验。
知识分类。开发了一个分类器,用于对网络数据中包含的信息类型进行分类,以便更有效地确定数据组合。使用这个分类器对网络上过度代表的数据类别进行下采样,例如艺术和娱乐。
数据组合的扩展定律。为了确定最佳数据组合,进行扩展定律实验,在实验中,在一种数据组合上训练几个小模型,并使用其来预测一个大模型在该组合上的性能。针对不同的数据组合多次重复这个过程,以选择一个新的数据组合候选。随后,在这个候选数据组合上训练一个更大的模型,并在几个关键基准上评估该模型的性能。
数据组合总结。最终的数据组合大约包含 50% 对应于一般知识的标记、25% 的数学和推理标记、17% 的代码标记以及 8% 的多语言标记。
2.1.3 退火数据
发现对少量高质量的代码和数学数据进行退火处理,可以提高预训练模型在关键基准上的性能。与 Li 等人(2024b)类似,使用一种对特定领域的高质量数据进行上采样的数据组合进行退火处理。退火数据中不包括来自常用基准的任何训练集。
遵循 OpenAI(2023a),在退火过程中评估 GSM8k(Cobbe 等人,2021)和 MATH(Hendrycks 等人,2021b)训练集上退火的效果。发现退火分别使预训练的llama 3 的 80 亿参数模型在 GSM8k 和 MATH 验证集上的性能提高了 24.0% 和 6.4%。然而,在 4050 亿参数模型上的改进可以忽略不计,这表明4050亿参数的大模型具有强大的上下文学习和推理能力,并且不需要特定的领域内训练样本来获得强大的性能。
使用退火评估数据质量。与 Blakeney 等人(2024)类似,发现退火使我们能够判断小的特定领域数据集的价值。通过在 400 亿标记上线性地将一个训练了 50% 的llama 3 的 80 亿参数模型的学习率退火至 0 来测量此类数据集的价值。将 30% 的权重分配给新数据集,将剩余的 70% 权重分配给默认数据组合。使用退火来评估新数据源比为每个小数据集进行扩展定律实验更有效。
可以看到高质量数据的处理、组合、评估占了很大的比重。好的数据能够提升模型效果的天花板。
2.2 训练方案
用于预训练 Llama 3.1 4050 亿参数模型的方案包括三个主要阶段:(1)初始预训练;(2)长上下文预训练;(3)退火。下面分别描述这三个阶段。使用类似的方案来预训练 80 亿参数和 700 亿参数模型。
2.2.1 初始预训练
使用 AdamW 对LLaMA 3 的 4050 亿参数模型进行预训练,峰值学习率为 8×10⁻⁵,线性预热 8000 步,并在 120 万步内采用余弦学习率调度衰减至 8×10⁻⁷。在训练早期使用较小的批次大小以提高训练稳定性,随后增加批次大小以提高效率。具体来说,使用初始批次大小为 400 万标记和长度为 4096 的序列,在预训练 2.52 亿tokens后,将这些值翻倍至批次大小为 800 万、序列长度为 8192 个标记。在预训练 2870 亿标记后,再次将批次大小翻倍至 1600 万。发现这个训练方案非常稳定:观察到很少的损失峰值,并且不需要干预来纠正模型训练的发散。
调整数据组合。在训练过程中对预训练数据组合进行了一些调整,以提高模型在特定下游任务上的性能。特别是,在预训练期间增加了非英语数据的百分比,以提高LLaMA 3 的多语言性能。还对数学数据进行上采样以提高模型的数学推理性能,在预训练的后期阶段添加了更多近期的网络数据以推进模型的知识截止时间,并且对后来被确定为质量较低的预训练数据子集进行下采样。
2.2.2 长上下文预训练
在预训练的最后阶段,在长序列上进行训练,以支持高达 128K 个标记的上下文窗口。不在早期对长序列进行训练,因为自注意力层中的计算量随序列长度呈二次方增长。逐步增加支持的上下文长度,进行预训练,直到模型成功适应增加的上下文长度。通过测量以下两点来评估成功的适应:(1)模型在短上下文评估中的性能是否完全恢复;(2)模型是否能完美解决长度达到该长度的 "needle in a haystack" 任务。在LLaMA 3 的 4050 亿参数模型预训练中,分六个阶段逐步增加上下文长度,从最初的 8K 上下文窗口开始,最终达到 128K 上下文窗口。这个长上下文预训练阶段使用了大约 8000 亿个训练标记。
2.2.3 退火
在对最后 4000 万tokens进行预训练期间,将学习率线性退火至 0,同时保持 128K 个标记的上下文长度。在这个退火阶段,还调整了数据组合,对非常高质量的数据源进行上采样。最后,在退火期间计算模型检查点的平均值(Polyak(1991)平均)以生成最终的预训练模型。
3. 后训练
通过在预训练的检查点之上应用几轮后训练,或者使模型与人类反馈对齐(Ouyang 等人,2022;Rafailov 等人,2024)来生成对齐的LLaMA 3模型。每一轮后训练包括有监督微调(SFT),然后在通过人工标注或合成生成的示例上进行直接偏好优化(DPO;Rafailov 等人,2024)。
图2. 后训练过程
首先,用人工标注数据训练一个RM模型,用来评估<Prompt, Answer>数据对的质量。然后,RM模型参与拒绝采样(Rejection Sampling)过程:对于一个人工生成的Prompt,用模型生成多个回答,RM会对这些回答进行评分,选择得分最高的作为SFT(监督微调)数据,其余的则丢弃。获得的SFT数据再与专门用于增强代码、数学、逻辑能力的数据结合,进一步调整模型,从而得到最终的SFT模型。接下来,通过人工标注数据,使用DPO模型对LLM参数进行调整。DPO本质上是一个二分类模型,它从标注的<Prompt,Good Answer,Bad Answer>三元数据中学习,调整模型参数,鼓励生成Good Answer,避免生成Bad Answer。这样就完成了一个迭代轮次的后训练(Post-Training)。
上述过程会反复迭代多次,每次的流程相同。不同之处在于,在拒绝采样阶段,LLM模型会从上一轮产生的多个DPO模型(使用不同超参数等)中选择表现最好的模型来生成Prompt的回答。显然,随着迭代的增加,DPO模型不断优化,拒绝采样阶段选出的最佳答案质量也越来越高,最终得到的SFT模型质量也会越来越好,从而形成一个正反馈循环。不过这里有个问题:会不会出现回答的同质化?亦或者高质量回答的同质化满足任务所需。
可以看出,虽然RLHF(通过人类反馈的强化学习)和DPO两种方法都使用了RM模型,但使用的阶段不同。RLHF在PPO强化学习阶段使用RM评分,而LLaMA 3则利用RM来筛选高质量的SFT数据。此外,由于拒绝采样阶段的回答是由LLM生成的,这意味着在训练SFT模型时,大量使用了合成数据。
3.1 建模
后训练策略的核心是一个奖励模型和一个语言模型。首先在预训练的检查点之上使用人工标注的偏好数据训练一个奖励模型。然后,用有监督微调(SFT)对预训练的检查点进行微调,并进一步用直接偏好优化(DPO)使检查点对齐。
3.1.1 聊天对话格式
为了调整大型语言模型以用于人类与人工智能的交互,需要为模型定义一个聊天对话协议,以便模型理解人类指令并执行对话任务。LLaMA 3 具有新的能力,如工具使用,这可能需要生成多条消息并发送。
3.1.2 奖励建模
在预训练的检查点之上训练一个涵盖不同能力的奖励模型(RM)。训练目标与LLaMA2相同,只是在损失中去除了边缘项,因为观察到在数据扩展后改进效果逐渐减弱。遵循LLaMA2,在过滤掉具有相似响应的样本后,将所有的偏好数据用于奖励建模。除了标准的(被选中的、被拒绝的)响应偏好对之外,注释还为某些提示创建了第三个 "编辑后的响应",其中从该对中被选中的响应被进一步编辑以进行改进。因此,每个偏好排序样本有两个或三个具有明确排序的响应(编辑后的 > 被选中的 > 被拒绝的)。在训练期间,将提示和多个响应连接成一行,同时随机打乱响应。这是将响应放在单独的行中并计算分数的标准场景的近似方法,但在消融实验中,这种方法在不损失准确性的情况下提高了训练效率。
3.1.3 有监督微调
然后,奖励模型用于对人工标注提示进行拒绝采样。与这个拒绝采样的数据和其他数据源(包括合成数据)一起,使用目标标记上的标准交叉熵损失(同时在提示标记上掩盖损失)对预训练的语言模型进行微调。将这个阶段称为有监督微调(SFT;Wei 等人,2022a;Sanh 等人,2022;Wang 等人,2022b),尽管许多训练目标是由模型生成的。最大的模型在 8500 到 9000 步的过程中以 10⁻⁵的学习率进行微调。发现这些超参数设置在不同的轮次和数据组合中效果良好。
3.1.4 直接偏好优化
使用直接偏好优化(DPO;Rafailov 等人,2024)进一步训练有监督微调(SFT)模型,以实现人类偏好对齐。在训练中,主要使用通过前几轮对齐中表现最佳的模型收集的最新批次的偏好数据。因此,训练数据更好地符合每一轮中正在优化的策略模型的分布。同时探索了同策略算法,如近端策略优化(PPO;Schulman 等人,2017),但发现对于大规模模型,DPO 需要的计算量更少,并且表现更好,特别是在像 IFEval(Zhou 等人,2023)这样的遵循指令基准上。
对于LLaMA 3,使用 10⁻⁵的学习率,并将 β 超参数设置为 0.1。此外,对 DPO 进行以下算法修改:
-
在 DPO 损失中屏蔽格式化token:在损失中从被选中的和被拒绝的响应中屏蔽特殊的格式化标记,包括头部和终止token,以稳定 DPO 训练。观察到让这些token对损失有贡献可能会导致不期望的模型行为,如尾部重复或突然生成终止token。假设这是由于 DPO 损失的对比性质 ------ 在被选中的和被拒绝的响应中存在共同的token会导致冲突的学习目标,因为模型需要同时增加和减少这些token的可能性。
-
用负对数似然损失进行正则化:在被选中的序列上添加一个额外的负对数似然(NLL)损失项,其缩放系数为 0.2,与 Pang 等人(2024)类似。这通过保持生成所需的格式并防止被选中响应的对数概率降低来进一步稳定 DPO 训练(Pang 等人,2024;Pal 等人,2024)。
3.1.5 模型平均
最后,对在每个奖励模型(RM)、有监督微调(SFT)或直接偏好优化(DPO)阶段使用各种版本的数据或超参数进行实验得到的模型进行平均(Izmailov 等人,2019;Wortsman 等人,2022;Li 等人,2022)。
3.1.6 迭代轮次
遵循LLaMA 2的做法,应用上述方法进行六轮迭代。在每个周期中,收集新的偏好标注和有监督微调(SFT)数据,从最新的模型中采样合成数据。
3.2 后训练数据
后训练数据的组成在语言模型的实用性和行为方面起着关键作用。在本节中,讨论人工标注过程和偏好数据收集、有监督微调(SFT)数据的组成以及数据质量控制和清理的方法。
3.2.1 偏好数据
偏好数据标注过程与LLaMA 2 类似。在每一轮之后,部署多个模型进行标注,并为每个用户提示从两个不同的模型中采样两个响应。这些模型可以使用不同的数据组合和对齐方案进行训练,从而具有不同的能力优势(例如,代码专业知识)并增加数据多样性。要求标注者通过将其偏好强度分类为四个级别之一来评估他们的偏好强度,根据他们对被选中的响应相对于被拒绝的响应的偏好程度:显著更好、更好、稍微更好或略微更好。还在偏好排序后加入了一个编辑步骤,以鼓励标注者进一步改进首选响应。标注者直接编辑被选中的响应,或者向模型提供反馈以改进其自身的响应。因此,一部分偏好数据有三个响应进行排序(编辑后的 > 被选中的 > 被拒绝的)。
在上表中,报告了用于LLaMA 3 训练的偏好标注的统计信息。通用英语涵盖多个子类别,如基于知识的问答或精确遵循指令,这些不属于特定能力的范围。与LLaMA 2 相比, 观察到提示和响应的平均长度有所增加,这表明在更复杂的任务上训练LLaMA 3。此外实施了质量分析和人工评估过程,以严格评估收集到的数据,能够改进提示并向标注者提供系统的、可操作的反馈。
在每一轮后训练中,在奖励建模时使用当时所有可用的偏好数据,而在直接偏好优化(DPO)训练中仅使用来自各种能力的最新批次数据。对于奖励建模和直接偏好优化,使用被标记为被选中的响应明显优于或优于被拒绝的响应的样本进行训练,并丢弃具有相似响应的样本。
3.2.2 有监督微调(SFT)数据
微调数据主要由以下来源组成:
- 来自人工标注收集的提示以及拒绝采样的响应。
- 针对特定能力的合成数据。
- 少量的人工精选数据。
随着后训练轮次的推进,开发出更强大的LLaMA3 变体,用这些变体来收集更大的数据集,这些数据集涵盖广泛的复杂能力。在本节中,将讨论拒绝采样过程的细节以及最终有监督微调(SFT)数据组合的总体组成。
拒绝采样。在拒绝采样(RS)过程中,对于在人工标注期间收集的每个提示,从最新的聊天模型策略中采样 K(通常在 10 到 30 之间)个输出(通常是上一次后训练迭代中性能最佳的检查点,或者特定能力的性能最佳检查点),并使用奖励模型选择最佳候选,与 Bai 等人(2022)的方法一致。在后续的后训练轮次中,引入系统提示来引导拒绝采样的响应符合期望的语气、风格或格式,这对于不同的能力可能会有所不同。
为了提高拒绝采样的效率,采用分页注意力机制(PagedAttention,Kwon 等人,2023)。分页注意力机制通过动态的键值缓存分配提高内存效率。它通过根据当前缓存容量动态调度请求来支持任意的输出长度。不过在内存不足时存在换出的风险。为了消除这种换出开销,定义一个最大输出长度,并且只有在有足够的内存来容纳该长度的输出时才执行请求。分页注意力机制能够在所有相应的输出中共享一个提示的键值缓存页。这在拒绝采样期间带来了超过 2 倍的吞吐量提升。
总体数据组成。上表显示了"有用性" 组合的每个大类的数据统计信息。虽然有监督微调(SFT)和偏好数据包含重叠的领域,但它们的整理方式不同,产生了不同的计数统计信息。在每一轮后训练中,沿着这些轴仔细调整总体数据组合,以在广泛的基准上调整性能。最终的数据组合在一些高质量的源上多次遍历,并对其他源进行下采样。
3.2.3 数据处理和质量控制
鉴于大部分训练数据是由模型生成的,因此需要仔细进行清理和质量控制。
数据清理。在早期轮次中,观察到数据中存在许多不良模式,例如过度使用表情符号或感叹号。因此实施了一系列基于规则的数据删除和修改策略,以过滤或清理有问题的数据。例如,为了缓解过度道歉的语气问题,识别过度使用的短语(如 "我很抱歉" 或 "我道歉"),并仔细平衡我们数据集中此类样本的比例。
难度评分:有兴趣优先选择对模型来说更复杂的示例,所以使用两种难度度量来对数据进行评分:Instag(Lu 等人,2023)和基于LLaMA的评分。对于 Instag,提示LLaMA 3 的 700 亿参数模型对有监督微调(SFT)提示进行意图标记,其中更多的意图意味着更高的复杂性。
语义去重:最后,进行语义去重(Abbas 等人,2023;Liu 等人,2024c)。首先使用 RoBERTa(Liu 等人,2019b)对完整的对话进行聚类,在每个聚类中,按照质量得分 × 难度得分对它们进行排序。然后,通过遍历所有排序后的示例进行贪婪选择,只保留那些与到目前为止在聚类中看到的示例的最大余弦相似度小于阈值的示例。
4. 推理
研究了两种主要技术来使 LLaMA 3 4050 亿参数模型的推理高效:(1)流水线并行和(2)FP8 量化。
4.1 流水线并行
当使用 BF16 数字表示法表示模型参数时,LLaMA 3 的 4050 亿参数模型无法在具有 8 个H100 GPU 的单台机器的 GPU 内存中容纳。为了解决这个问题,在两台机器上的 16 个 GPU 上使用 BF16 精度并行化模型推理。在每台机器内,高 NVLink 带宽使得可以使用张量并行(Shoeybi 等人,2019)。然而,在节点之间,连接的带宽较低且延迟较高,所以使用流水线并行(Huang 等人,2019)。
在使用流水线并行进行训练时,bubbles是一个主要的效率问题。然而,在推理期间它们不是问题,因为推理不涉及需要流水线刷新的反向传播。因此,使用微批次来提高具有流水线并行的推理吞吐量。
评估了在推理工作负载为 4096 个输入标记和 256 个输出标记的情况下,在推理的键值缓存预填充阶段和解码阶段使用两个微批次的效果。发现微批次提高了具有相同本地批次大小的推理吞吐量。这些改进是由于微批次使得在这两个阶段中微批次能够并发执行。由于微批次导致的额外同步点也增加了延迟,但总体而言,微批次仍然带来了更好的吞吐量 - 延迟权衡。
4.2 FP8 量化
利用 H100 GPU 的原生 FP8 支持进行低精度推理。为了实现低精度推理,将 FP8 量化应用于模型内部的大多数矩阵乘法。特别是,对模型中的前馈网络层中的大多数参数和激活进行量化,这大约占推理计算时间的 50%。不对模型的自注意力层中的参数进行量化。利用动态缩放因子以获得更好的准确性(Xiao 等人,2024b),优化 CUDA 内核以减少计算缩放因子的开销。发现LLaMA 3 的 4050 亿参数模型的质量对某些类型的量化很敏感,并进行了一些额外的更改以提高模型输出质量:
- 与 Zhang 等人(2021)类似,不在第一个和最后一个 Transformer 层中进行量化。
- 高困惑度的标记(如日期)可能导致较大的激活值。反过来,这些可能导致 FP8 中的高动态缩放因子和不可忽略数量的下溢,从而导致解码错误。
为了解决这个问题,将动态缩放因子上界限制为 1200。使用行方向量化,为参数和激活矩阵计算跨行的缩放因子。发现这比张量方向量化方法效果更好。
量化误差的影响。在标准基准上的评估通常表明,即使没有这些缓解措施,FP8 推理的性能也与 BF16 推理相当。然而,发现这样的基准不能充分反映 FP8 量化的影响。当缩放因子不限制上限时,模型偶尔会产生损坏的响应,即使基准性能很强。
效率的实验评估。在预填充和解码阶段使用LLaMA 3 的 4050 亿参数模型进行 FP8 推理的吞吐量 - 延迟权衡,使用 4096 个输入标记和 256 个输出标记。下图将 FP8 推理的效率与两台机器的 BF16 推理方法的效率进行了比较。结果表明,在预填充阶段使用 FP8 推理可使吞吐量提高高达 50%,并且在解码期间具有明显更好的吞吐量 - 延迟权衡。
5. 思考
前述内容对LLaMA3.1的数据、预训练、后训练、推理做了介绍。回过头来思考,LLaMA3.1的价值,个人看主要有三点:
5.1 开源的价值
LLaMA 3.1 405B的开源对其他无论是闭源还是开源的模型都产生了深远影响。对于闭源模型来说,如果其性能不如LLaMA 3,就需要向公众解释为何还要对用户收费,特别是在推理成本之外的费用。对于开源模型,如果无法达到LLaMA 3的能力水平,就需要考虑如何在市场中实现差异化和突出自身特色。随着LLaMA 4等更强模型的开源,许多原本定位为基础模型AGI的创业公司可能被迫转向特色产品赛道,比如医疗toB场景。
另外在开源领域,特别是这类资源密集型的领域,如果某一家非常强势,技术、资金、效果都断崖式领先的话,那么大模型可能会逐渐趋于集中化。也就是真正的成为事实性的行业标准。不过考虑到政策因素、业务侧重因素等,个人觉得一定程度上会减缓这种情况的发生,但总体趋势不可逆。
5.2 小模型的崛起
用LLaMA 405B这种强大的开源模型来蒸馏小模型,也许是更加适合创业赛道。这样做对小模型效果提升会非常明显,ROI极高,属于小投入高产出。所以在这点上,我觉得反而会百花齐放。所以后续可能自己的重点会放在小模型的蒸馏以及垂直场景的商业化上。
小模型效果逐步逼近最大模型的效果,两者差距越来越小,是最佳的希望所向。小模型效果的三个关键因素:
- 预训练阶段增加训练数据数量和质量。在保证质量前提下加大数据数量,这个肯定是有效的。
- 模型蒸馏。从开源角度来看,用强大的开源大模型蒸馏来提升小模型效果。所谓"蒸馏",就是说在预训练阶段小模型作为Student,大模型作为Teacher,Teacher告诉Student更多信息来提升小模型效果。原先小模型预训练目标是根据上文context信息正确预测Next Token,而蒸馏则改成Teacher把自己基于相同上下文做Next Token预测的时候,把Token词典里每个Token的生成概率都输出来,形成Next Token的概率分布,这就是Teacher交给Student的额外附加信息,小模型从原先的预测Next Token改为预测Next Token的概率分布,要求和Teacher输出的分布尽量一致,这样就学到了Teacher的内部信息。
- 退火数据。核心思想就是在预训练的最后阶段,对高质量数据比如数学、逻辑、代码数据进行上采样,增加其影响。这种方式对8B小模型在逻辑代码能力方面有明显提升。
5.3 合成数据的使用
在后训练(Post-Training)阶段,合成数据的使用已经逐步产品化,尤其是在SFT(监督微调)阶段。目前,SFT阶段正朝着完全由合成数据主导的方向发展。例如,LLaMA 3 的SFT数据中有相当比例是由模型生成的合成数据,而Gemma2 在SFT阶段的大部分数据也是由规模更大的模型生成的,并且已经证明,这些合成数据的质量与人工标注的数据相当。
目前,合成数据的一个重要方向是在后训练阶段生成数学、逻辑、代码等数据。这类数据的质量将直接且显著地影响模型的最终表现。严格来说,当前所谓的合成数据实际上应该被称为"半合成数据"。例如,后训练阶段的<Prompt,人写答案>被转换为<Prompt,模型生成答案>,这些都包含了部分人工数据和部分模型生成数据,因此称其为"半合成数据"可能更为准确。
合成数据其实可以看作是一种模型蒸馏的变体,也是一种特殊形式的模型蒸馏。在LLM预训练中,模型预测下一个Token的过程本质上是人类作为Teacher,而LLM作为Student的知识传递。因此,LLM本身就是对人类知识的一种蒸馏。合成数据则是由更大的模型输出作为Teacher,小模型作为Student从中学习知识,因此本质上也是一种模型蒸馏。
6. 参考材料
【1】https://huggingface.co/meta-llama/Meta-Llama-3.1-405B