新开一个系列连载,小周带你读论文,会不定期的更新各种新的,甚至老的有价值的论文,当然您有时间自己读最好了,如果自己读嫌麻烦,可以来看我这个的总结
老规矩,1,2,3 上链接...
IEIT-Yuan/Yuan-2.0: Yuan 2.0 Large Language Model (github.com)
Yuan2是浪潮的刚发布的LLM是基于Yuan1改的(这里吐槽一下浪潮,Yuan1的pretrain数据原来是公开下载的有1T多的语料很大一部分中文比例,现在给关闭了
)
Yuan2这论文写的还是有点意思的,受限于算力要求,很多事实性的实验我没法做证明或者证伪,那就先看看文中的一些理论创新
1- 魔改Transformer(LFA):
为了好理解我沾个Llama2的结构作为对比
几乎一眼就可以看出来变化,他把multiheader attention层给改了(其实要严格一点说也不算全改,只是前面加东西了)!Transformer玩的啥呢,其实就是玩attetion这层呢,他为什么要把核心内容给改了呢?
下面是论文里给的说法:
Attention, as a basic building block in LLMs, has showed great success across NLP tasks [9,10]. When a sequence is fed in to a language model, attention mechanism learns the weights of each pair of tokens to build the dependencies across the entire input sequence. The mechanism equally treats a token in neighbourhood and that in a distance. However, in natural language, the dependencies of words in neighbourhood are often stronger than the words faraway. The interconnection learned by Attention is global without any prior knowledge of local dependencies. In this work, we propose Localized Filteringbased Attention (LFA), a new attention architecture that injects inductive bias into Attention to capture local dependencies of input sequence
其实也是老生常谈了,简而言之就是针对Transformer这个BOW的特征一顿批判,你没有时序性啊,你没有远近亲疏啊之类的;但是估计yuan2的作者没仔细读过RoPE(我确实是苏剑林的粉丝
),不过换个角度RoPE也不是在这一层做的,那我们看看Yuan2是怎么做的
请看下图:
这个图结合第一幅图就能看明白了,它其实在进QKV之前先过两层1维卷积层,然后卷积层就把之前的信息带进来了,其实是带了前两个token的一部分相关性,文中概念叫inductive bias
这里吐槽一下,其实你要做时序的,拿BOW模型,你再怎么做也不可能做过RNN,因为你怎么玩,大都是单向的,一个双向LSTM就把它秒了,如果按照文中的思路,除非再加个decoder,然后再加两层卷积,然后正向和反向的decoder再做cross-layer的attention,最后两个decoder的output再做加权,再除2,才能得结果,先不说效果,至少模型参数多刷了一倍
,又也可以水论文了
他列举了用基本的atteion,EMA(你如果玩股票就知道是啥了,没错,就是那个EMA)还有不同层数和参数的LFA来做对比,至少以论文里的实验结果看,这个方式还是有一定帮助的
2-训练数据部分:
我就不讲了,也不想讲,这个越想越气,本来我还要下载用来着,结果给关了,他还气人的说到他提升了数据质量.....
3- 第三部分也是我看这个论文的原因:
老实说这个论文我刷它的原因,是因为客户的一个好哥们儿在昨天讨论项目的时候,跟我们提的,而最大的价值我觉得这个文章也主要集中在这,就是分布式训练的时间预测法
论文的排版有很大问题,公式在参数解释之前,我给调换一下位置
先看参数解释:
然后它还有好几个忘写了(水的太着急了...
)我给补上
- B:batch size
- h:hidensize
- F:单解释一下,这里是一个假设环境,假设一个GPU能装进所有的模型参数
然后我们看一下文中给出的第一个公式:
这个就是在3D训练的时候求的总时间单位,拆开分别对应5个时间,包括:
- 前向反向
- PP时候的bubble time
- PP的node之间通信时间(如果PP分的太细,还有机器内部的通信时间)
- TP的all-reduce/gather 时间
- DDP的all-reduce/gather时间
拿第一个举例:
分母部分,我就默认大家应该熟悉了,就是把megatron论文里的求Tflops per Transformer layer的公式,然后它给乘了一个L,L就是你hidden Layer numbers,比如你算7B的你就乘24,70B你就乘80,(推导过程我不写了,很简单,请看论文 Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM (arxiv.org),看不懂也没关系,我后面肯定会讲详细Transfomer的,还有PP,TP,DDP这块是必须讲的,像评书一样得留个扣儿,让大家惦记... 但是请放心,我不是不会太监的...)
就是参数量P和单位FLOPS/per GPU的F, 还得乘以一个Ts,也就是TP的size,因为你模型被分了么,所以就是几张卡的算力共同承载,你都得算上;最后就能得到一个参数单位,在一个恒定算力的GPU上面(可以往里代入A100,H100,各种TFLOPS,看你用什么训练了),它要做一个前向后向要花多少时间 ,其他的几个T值就不一一展开了,道理都一样
然后由于Yuan2加了额外的卷积层去做token信息继承,所以Yuan2的单位计算时间变成了这样,扫一眼就是系数变大了,毕竟加了额外的层
通过这个方式就求出来了一块GPU在整个通信中的一个step可能消耗的总时间,那要是算多个的话,就是个乘法就完事了
把这个公式改一下理论上也可以在不训练的情况下,预测出一个certain集群在特定参数的模型的场景下,它能达到的TFLOPs的能力(我们昨天讨论的就是这个话题),当然实际项目里,你还得乘以一个耗损系数,我一般建议是给30%以上,集群越大肯定耗损越大
论文给出了一个table,说明了如果按传统的方式(Yuan1.0)来训练LLM,整个LLM并行训练中浪费时间比率
4-Non-uniform PP
论文中提出的最后一个可能有点价值的概念就是Non-uniform PP
我用通俗的话来解释上图,就是说你在训练的时候因为模型太大,大概率是要分PP走流水线的,把模型都分割成不同的layer group,比如24层的Llama2-7B你要是分8个PP的话,那么每一层就是3个
这个看起来应该是没什么问题的,但是我们知道前向的时候我要存activation的就是我所有层的激活,当然你也可以开外挂gradient checkpoint,但是那只是存的少的问题,也不是不存,而且也浪费算力
本来正常算的时候好像是8个PP的layer group都消耗的是一样的显存,但是实际上就不是了,因为我反向是从后往前算,所以肯定PP的头部就要比尾部得承载更多的activation,因为我都得存啊,导致显存分配不均匀,后面还没咋地呢,前面先OOM了
于是Non-uniform PP的思想就诞生了,咱们不搞平均主义,你要是承载的activation多,那你就少分几层,后面的兄弟替你多承担,比如文中分出来的顺序[2, 2, 3, 3, 4, 4, 4, 2] ,就是这么个思想,也没啥特意可说的,至于文中说的因为TP废NVlink带宽,它就没用TP做3D,我个人是不支持这个说法的,所以就不讲了
最后值得一说的,他整个2B的模型,其实野心挺大的,大家想想2B如果你用int8来推理,不算你batch size,hidesize 什么乱遭的那些必然涵盖的东西占用的内存,底模才2个G啊,完全可以装手机了,我觉得这个其实后面会是单独的一个课题,肯定越来越有人拿小模型来做NLG
这是小周读论文系列连载的第一篇,也感谢我客户给我提供素材和灵感,要不平时可能我不会去特意看这个论文,希望大家有什么好的论文或者想了解的知识,可以给我留言。
BTW,二维码换公众号了,也正式改名了;我也是刚写公众号不到1个多月,不知道微信的二维码和公众号不是一个,结果之前的文章都是把微信的二维码放底下引流了,导致一堆哥哥姐姐来加我微信,公众号传播出去没多少,微信一堆人来加...