专栏名称: 旺知识
AI技术最新进展、发展趋势、研发经验、从业经验
51好读  ›  专栏  ›  旺知识

揭秘Llama 3.1:我如何消化这份92页的AI大模型技术盛宴

旺知识  · 公众号  ·  · 2024-10-20 22:04

正文


背景

几个月前meta开源了llama3.1,405B,又一个号称追平gpt4的选手。还附赠了一份92页的技术报告。

然后 第二天 就被mixtral打脸,官网针锋相对。最绝的还是那个标题, Large  Enough

 意思是meta的405B大而无用呗,看看这个黄三角形

 

意思是llama3.1的报告也作弊了呗

一般这种大模型的技术报告我是都懒得看的。一方面除了各种技术细节,很少有什么新东西或者思路流程。另一方面也是国内各种二道贩子的解读虽然质量低,但作为中文摘要看还是可以的,可以从中找到技术关键词直接看对应的原文。

当然,根源在于我英语一般,读起来太慢了。相信很多小伙伴和我也差不多。

 

但是,llama3.1 405B不太一样。这个模型的开源,意义重大。就类似Attention is all you need,作为NLP算法怎么都得啃下来。所以我花了半个月时间,认真读完了,并总结为以下内容,希望能帮到对这个感兴趣的小伙伴们。

话不多说,直接进入正题。

报告给我们的启示


数据

数据很缺 。无论是数量上还是质量上。某些细分类特别特别缺。 合成数据 是大趋势。但目前技术原因,用A大模型合成的数据对A大模型本身没有提高效果。 合成数据进行后训练可以一定程度上替代 模型蒸馏 。不过这个早就是主流操作了。 数学推理/代码数据 非常有用,得加大力度。


规模化

从现在看, scaling laws 应该可以再指导几年。 扩大大模型参数量规模理论上可以继续提高效果,并更好的辅助对小模型的蒸馏。 卡点在 合成数据


复杂度管理

这里是个方法论的选择问题,无关对错,仅供参考。 是选择上限更高、波动更大的方案去追求极限,还是选择稳定的路线最大化利用规模效应。


时效性

报告中引用的参考文献,24年的比例特别高,甚至有不少是一个月内的成果。从中也可以看出大模型发展很快,大厂追的更快。全是最新最强的技术。 

为什么llama3.1 405B很重要

为什么这篇报告,92页,我一定要读完。为什么llama3.1 405B很重要。主要有以下几个原因:

1. 训练数据不仅拉满了 互联网数据 ,还大量使用了 合成数据

a. 虽然没公布互联网数据来源,但从公布的文本、图片、视频数据格式、规模、后处理等情况,我猜是存在大量无版权数据的。 既然无版权数据都上了,可以默认meta把互联网能够获取的开放域文本数据都拿到手了。 但就是这样还不够,还得上合成数据。

b. 众所周知,互联网文本总数据量是有个上限的。 我个人估计全世界估计不超过200T tokens,还存在大量低质量无意义内容。 但算力、硬件是可以一直往上堆,按照scaling laws,这里就会有gap,一定需要大量假数据去填补空缺。 而这篇技术报告就比较详细的讲解了合成数据的流程思路。
2. 405B参数量特别大

a. 除去之前马斯克开源的那个棒槌grok,304B。 近几年这已经是参数量最大的开源模型。 GPU目前主流最大就是1机8卡,就算是8张H100,显存加起来也就640GB。 在开着针对性FP8量化的情况下,单机上限也就是450B左右。 也就意味着在硬件没什么产品突破的情况下,短期内超过这个参数量太多的模型,部署效率会低不少。

b. 另一个角度,meta用了24000张H100集群,训了54天。 这个成本确实也很夸张。
3. 效果足够好 ,(英文效果)很接近闭源top1。

a. Openness drives innovation 开源驱动创新 。这是meta解释为什么要开源的一句话,我很喜欢。

b. 以前因为闭源模型的效果碾压性的好,造成了对很多算法同学来说,SFT一个开源模型甚至不一定比得上直接调用gpt4效果好。 这确实挺打击人的,甚至经常让我有点怀疑自己的价值在哪里。 但随着开源模型逐渐追上闭源模型的步伐,整个生态才会越发繁荣。
4. 国内外的开源模型,或多或少和llama的全部或部分 架构很像。
a. 理论上看一篇等于看很多篇技术报告了。
 

猜猜这是谁家的代码

大模型技术报告看什么

我个人将技术报告内容总结为 世界观、方法论、技术选型、实现细节四层。

举个例子:

世界观 :甜的就是好的
方法论 :多吃甜的
技术选型 :无糖可乐很甜不胖人,就选它
实现细节 :我每周都会去公司7楼的无人售货机买一瓶罐装无糖可乐。

如果是可复现的东西,比如早期的bert类模型,提供了数据,提供了代码。那可以四层都看,经常能发现很多论文的代码技术细节一塌糊涂,反正又不是不能用。

但如果是现在这样,虽然名义上开源,但数据不提供,训练过程不可复现的“黑盒”论文,那 实现细节就没必要看了 ,一扫而过就行。比如meta说“17%的代码语料”效果最好。这个很细节,但没有可参考性。说不定对我的中文语料,是30%的代码语料占比更好呢?终归是结果说话的。学习下他们的方法论,即实验怎么设计的即可。

另一方面,个人建议大家, 模型效果、模型安全性 这种大篇幅的内容,就不用看了。真没啥意义。要么自己用vllm跑几个case试试,要么就参考主流的几个大模型竞技场。

llama3.1技术报告主线


世界观

meta的 目标 是训练出最强的大模型。那么如何达成这个目标呢?这就引入了他们的 世界观 ,或者说信念:

scaling laws,更大的规模会带来更高的大模型效果上限

这其实包含三个点:

1. 更好效果的大模型,是存在稳定的链路创造出来的。
2. 在目前还看不到的上限范围内,不断扩大规模就能够一直得到效果更好的大模型的上限。

3. 上限,不一定能达到。


方法论

这个世界观进一步转化为 方法论

在预算范围内,有效地提高规模以得到更好的大模型效果。

预算范围就不细谈了,大老板扎克伯格就给了24k H100,要多也没有。毕竟公司钱就这么多,和nvidia的关系也只能拿到这么多的卡。 时间也不能太长,最多2个月时间,不然员工个人就得准备写3d接雨水,而公司可能因为太久没消息,逐渐失去关注, 股价下跌 但是,拦着工程师们直接用最大规模的数据,最大的算力 梭哈 一个大模型的理由是: 超大规模的大模型效果不一定好 。这里可以点名批评一下马斯克的grok,314B,至今在各大leaderboard上查无此人。

这里的原因其实有很多,咱们抽象为两种:

1. 特定超参组合下,炼丹的上限就是这么低。就是 超参选错了

2. 超参组合的上限很高,但缘分没到,炼废了。属于是 “运气”问题

注: 大模型训练的广义超参,和之前bert模型时代的超参定义不太一样。 举个例子,用RLHF还是DPO,数据集多大,有哪些类型,比例如何,比例怎么变的,怎么清洗的,学习率的变化曲线如何等等,都是超参的范畴。

 有问题不怕,能解决就ok。 mata将这个问题拆解为两个子问题:

1. 保证每一次训练都能达到当前超参组合下的上限(稳定训练)

2. 选择能带来最高上限的超参组合(调参)

注:理论上这个拆解是不充要的。放十年前写学术论文一定会被argue。但现在嘛,谁效果好我信谁。


技术选型

到这里可能就是咱们技术同学比较熟悉的领域了,背景是啥,难点是啥,我选了什么方案去解决。

难点或问题

扩大规模

数据量
1. 互联网有 版权 的数据太少了。绝大部分数据都存在版权隐患
2. 互联网真人互动产生的 数据有上限 ,且目前文本域快走到头了
3. 互联网数据平均 质量太差 。之前有研究表明,低质量数据多了会降低大模型效果
4. 互联网上,可以用来训练的 长上下文数据非常少

5. 人工标注可以用来训练的长上下文数据非常困难。 毕竟不可能真让人读几万字的文章

模型参数量
1. 最大参数量的模型,完整训练一轮成本过高,不能反复试错, 只能一步到位
2. 大参数量的模型在单个gpu上放不下, 显存不够 ,一定会涉及到多个维度拆解的 并行 机制。
3. 大参数量的模型训练需要更多的算力。在总时间不变的情况下就需要更 大规模的gpu集群
a. 大规模的gpu集群会带来各种层面的问题,比如网络通信、监控、自动恢复、冗余容错、并行、硬件等等。

扩大规模后如何稳定训练

算法稳定性
1. 目前业界的最佳实践,pre-train+SFT+RLHF,就是结合了 语言模型 强化学习 不稳定 性。

2. 目前很流行的 moe ,也充满了 不稳定 性。

硬件稳定性

1. 万卡集群要 长时间稳定运行 难度非常高。因为问题太多了。散热不行,温度高接口掉了;通信出问题了;驱动更新了等等。

2. 万卡集群要 长时间保持比较高的算力利用率 难度也很高。需要巧妙地结合模型结构,设计多维并行,减少通信等待。

扩大规模后如何调参

1. 调参的前提是能够对 参数可控 。比如对batch size,learning rate这种参数就比较容易控制,改数字就行。但对 数据集大小 、数据集 各种类数据比例 ,数据集 合成数据比例 等等控制起来,就比较复杂,底层会依赖很多其他内容,比如 数据分类 数据质检 数据清洗 数据合成 等等。

安全性

1. 不能在输出中透出用户的 个人信息 ,包括电话、邮箱、住址等。很容易验证,会赔钱。
2. 不能直接输出涉及到 儿童色情 恐怖主义 等信息,会赔大钱。

3. 在之前谷歌的前车之鉴后,可能还得加上怎么去除其他模型的固定pattern, 不能被抓包 爬了别人的数据。

方案

提高训练过程稳定性

算法篇

算法问题我理解是 训练过程稳定性 。meta将其表述为 复杂度控制Managing complexity 。本质上做的就是标题中所展示的,让训练能稳定达到上限。

注:这段b站的 李沐 老师讲解为是meta能力有限,但强行将 bug装饰为feature 。但我个人理解确实也体现出一种更“工程落地”而不是“学术研究”的方法论,trade off。

提到目标是需要让训练稳定达到上限,那么反向拆解,什么会导致模型达不到上限。目前比较公认的, Moe 不稳定, 强化学习 不稳定, 人的偏好标注 会带来不稳定, 低精度 带来不稳定。

注:来自李沐老师的小道消息。meta同步用moe训过,训飞了。假装无事发生。

所以meta选择避开上述所有的不稳定因素,选择最传统最原始的transformer decoder结构;对齐过程选择DPO,大量使用合成数据替代人工数据,增强稳定性;在关键参数通信时使用双精度FP32进行。

注:这里可以理解为是meta主动选择,也可以理解为幸存者偏差,其他尝试都失败了但不说。

 最终,meta选择的是传统的dense transformer结构,和llama2一样。 然后选择久经考验的:

部分场景高精度传参 :在很多数值计算和通信的过程中使用双精度FP32进行。比如反向传播过程用FP32进行梯度累积,比如在DP并行通信reduce-scatter时用FP32,比如在多模态部分,不同模态的编码器结果传递时,也用FP32进行。

训练过程 = 预训练pre-train + 后训练post-training + 平均化

=(短上下文pre-train + 长上下文pre-train + 退火annealing) +  ((监督微调SFT + 拒绝采样rejection sampling(合成数据用)) + 直接偏好优化DPO)+ 平均化

 这样就保证了一次训练基本能达到条件下的模型上限。

短上下文pre-train

没啥好说的。堆数据训呗。动态cos余弦学习率;线性预热; 多个阶段seq length和batch size逐步提高。

注1:meta这个batch size和传统的理解不完全一样。可以理解是传统的batch size * seq length,一个batch所处理的toekns总数。

注2:这个阶段对数据混合比例也做了人工调整,比如提高了非英语语料的比例,对数学数据做上采样,在上述三个阶段的后期添加了更多的近期互联网语料以推进大模型的知识截止点,并在下采样了之前实验确认质量低的语料集。估计也是大量人工实验和干预,需要在大模型上重复进行训练实验以确定在下游任务的效果。也体现出规模公式和训练稳定性的重要性。

这个阶段共计使用了 15T tokens

长上下文pre-train

这段meta没写太细。

目标是让大模型支持 128k 的上下文。从指标看,一个是在 短上下文任务效果不退化 ,二个是在 长上下文探针任务 完美解决。

之所以不早早的进行长序列训练,meta那边解释是因为seq length平方倍的算力需求。

注:我个人觉得实际上是因为他们优质的长上下文语料也不多,不如晚点训还能提高效果。

分了6个阶段逐步增加上下文长度,最终达成128k上下文窗口。

这个阶段共计使用了 0.5T tokens

退火annealing

这段没什么好说的。常规操作了。

在对最后的40M tokens进行预训练时,学习率先拉起来再线性降低到0。保持128k上下文长度,调整数据混合比例,对高质量数据(代码、数学)进行上采样。

注1:这段其实会有点不够solid,训练集和下游的评测任务很可能是重合的,导致基座模型最后突击, 提升下游任务的指标

注2:其实这里能引申出来一个点,怎么反“退火”别人发布的base模型,然后接着在自己的数据上预训练。之后退火,之后正常后训练。理论上就能在得不到别人数据的情况下拿到综合两边数据优势的大模型。

这个环节还得出一个实验结论: 退火对大参数量模型没用,对小规模模型有大幅提升

这个阶段共计使用了 40M  tokens

监督微调SFT + 拒绝采样rejection sampling

没什么太夸张的变化,基本都是最流行的实践。6轮后训练,先SFT再DPO算一轮。

流程就是先基于高质量数据,基于base模型调一个 奖励模型reward model 出来。

注:这里的奖励模型和RLHF的奖励模型完全不一样!!

收集优质prompt,让上一轮的大模型生成一批回答,然后奖励模型打分排序,只保留TOP 1的结果。这就叫拒绝采样。

注1:这里有个meta没太写清楚的细节。训练7B、70B时,SFT数据中合成部分,是405B生成的。某种意义上这也是一种 蒸馏学习

注2:meta还得到一个结论, 合成数据对405B大模型没用 。本质上和上一个点应该是联动的。即大模型只能由强的教导弱的, 目前还不能真正实现自我迭代

然后这部分数据再用来做SFT。

 

直接偏好优化DPO

更没什么好说的了。人工标数据,训。

这里有个小细节需要提一下。传统的偏好数据是 喜欢 > 不喜欢。

meta还让标注员对答案做修改,变成 修改后答案 > 喜欢的答案 > 不喜欢的答案。

注1:meta那边也试过PPO,据说是计算量大单效果又不行。

注2:笔者在业务域上试过很多次各种对齐手段,dpo,ppo等。有的成本高有的成本低。但唯一共同的结论就是,真的特别特别容易训飞。

meta对dpo做了一些细节改造,比如剃除了部分同时出现在选中和拒绝文本的token。说是在偏好数据中共同的token可能导致大模型训练目标冲突。

模型平均化

meta在最后阶段,将使用不同数据和超参实验得到的奖励模型、SFT和DPO得到的大模型进行了平均。

注:本质上提升训练稳定性的措施。也能说是财大气粗了。

硬件篇
集群长时间稳定运行

这段涉及到硬件、集群的其实我作为算法没太看懂,就抛砖引玉放一下我的总结吧。

算力集群, 16K张H100用来跑 8k张H100用来冗余 ssd加起来240PB

注1:这里这么大的ssd主要用来存checkpoint。因为训练崩溃比例很高,所以需要频繁存。很贵。

注2:1张H100 = 3张A100。超级贵。

通信方面,搭了一套对应的网络通信拓扑结构,对nvidia的NCCL库做了针对性改造。  meta还列举了在一个完整54天,llama3.1 405B大模型训练周期中触发意外中断的原因,

 

一个有意思的结论是,78%的中断都是硬件原因。这也和之前在笔者千卡集群文章开头分享的工程团队角度看千卡集群建设问题基本一致,会遇到了一堆又一堆软件无关的问题导致需要不停地排查问题解决问题。  解决思路就是特别强力的 监控 自动化维护 冗余 底层改造 此外还提供了一些trick,比如减少checkpoint存储事件,减少训练启动时间。

集群长时间维持高算力利用率

meta分享了在不同超参配置下,16k张H100的 算力利用率MFU ,基本处于 40% 左右,相对还是较低的。

 

注1:这块我猜是因为meta用的flashattention2(或者完全没用)。2主要优化的是A100,MFU理论上能到75%左右,对H100没优化。前段时间刚出的第三版专门对H100做了优化,利用率能提升到75%左右。

注2:敲重点啊。TP,不能超过8。为什么,一台机器就8张卡。

注3:第二个重点,为什么seq长度拉到128k以后,才能有cp并行。因为短序列显存占用没那么夸张。

 并行方面,meta采用了 4D并行 ,就是4个维度上做并行,包括 tensor维度、context维度、pipeline维度、data维度

具体可以参考这张图:



这里其他三个都是之前文章写过的。唯一一个特别的是context并行。报告写的是“上下文并行性将输入上下文划分为片段,减少了对于极长序列长度输入的内存瓶颈。”

由于pipeline并行默认实现比较死板,meta还做了一些针对性改造,对微批次做了不少优化。

 

然后是cp并行实现,这里提到了一些实现细节,比如准备2倍于并行数的chunk,然后每个cp对象负责对称的两个块。

注1:这里对称的设计可能有一定的工程思考在里面,比如重叠计算和通信等。但文中没细说。

然后具体实现就是,首先all-gather所有的KV tensor,然后在每个CP对象去计算本地的Q的attention结果。然后文章还说虽然all-gather会占用很大的通信量,但有两个优势,一个是对不同的mask矩阵支持很灵活。二个是毕竟用了GQA技术,KV矩阵大小其实很小,所以影响不大。

注2:感觉和zero实现思路差不多,本质上还是工程设计,更好的设计通信内容,以平衡算力和通信成本。所以实际上不一定会加通信量,可能和原来一致。

 基于网络感知的并行配置。其实就是基于不同并行级别通信成本和延时的不同,设计并行顺序。按照 TP->CP->PP->DP 的顺序选gpu。这个顺序其实没什么争议。

注: 这里又可以出一个八股文。 为什么是这个顺序。

找到能带来最高上限的超参组合

这块虽然看着和之前bert时代的调参类似。但实际上完全不一样。现在主要调的是数据集大小组成、学习率learning rate的变化曲线函数,通用域和垂域数据比例等等。

传统的方法就是自动化实验,不断地实验各种组合。但这又带来两个问题:

1. 怎么做实验。 毕竟算力有限。

2. 怎么区分不同参数组合。 即参数的可控性。

可实验性

为什么现在不可实验,因为大规模数据+大参数量模型,意味着需要大算力,大量时间。太重了,不可重复。 这里就要先搬出 scaling laws 了。只不过得用它的另一种翻译: 放缩公式

一般理解为: 同样的参数配置,小规模实验能达到上限,则大规模实验也能达到上限 这也就意味着理论上可以在小规模模型上大批量实验出最优参数组合,再放到最大规模的模型上投入所有算力 梭哈

注:这个目前没看到特别solid的理论证明。但反正大家都这么用了。

 那么就是第一步,也是最重要的参数: 数据集大小。 毕竟这个如果太大的话,也谈不上小规模实验了。 这里又要搬出 scaling laws 了,原始翻译叫 规模公式 总训练算力、模型参数量、训练集大小 ,如果能满足公式,就能取得当前模型参数量下最好效果。 问题是这个公式怎么搞。首先不同厂家、不同数据集分布,下游任务(打榜),这个 公式是不一样 的。 那就经验公式,实验+ 拟合 呗。 能拟合就是好方法好公式,拟合错了就不行。

 

结论:

 







请到「今天看啥」查看全文