一、前言

单个GPU卡内存有限,从而引发的各种问题,可分为两个维度来看:

  • • 数据维度:对于小模型而言,虽然单卡能放下一个模型,但没法放下一个batch所要的全部数据,所以数据得切分到不同卡上计算最终汇总,从而引入数据并行DP
  • • 模型维度:对于大模型而言,单卡无法放下一个模型,必须将模型切分到多张卡上,由此引入了除DP之外的各种并行(TP/PP/EP/SP),可统称为模型并行

换句话而言,如果模型又小,单个batch数据不多,一张卡跑就够了,也不需要各种并行。

如果模型一张卡能放下,但单个batch的数据放不下,那只需要DP,这样计算效率最高。在这种情况下再加入其他并行策略反而拖累训练效率。

只有在模型单卡也放不下的时候,这时才必须考虑DP之外的并行。不同的并行策略根据模型结构的不同,采取的策略也不一样。

DP/TP/PP/EP/SP都可以同时开启(EP依赖于DP,只有DP开启的情况下,才可能开启EP;SP依赖于TP,只有在TP开启的情况下才能用SP)。

二、各种并行方案

2.1 数据并行(Data Parallelism)

数据并行最简单,每张卡拷贝相同的模型结构,仅对数据做切分。每张卡计算完的梯度也是针对各自数据的,需要做一次allreduce,然后使用优化器更新模型,进入下一次迭代。其数学基础如下:

数据并行的优点是在所有并行中效率最高,除了一次allreduce之外,没有任何额外通信开销,其通信量为 2Mdtype ,M是模型大小,dtype是数据类型,2是因为allreduce的特性(allreuce=reducescatter+allgather,他们各自通信量参数都是M)。

数据并行的缺点是:只能放微小模型,以llama-7B的bf16混合训练为例,显存占用至少是7B*(2+2+(4+4+4))=224G,其中模型和梯度各占2byte,adam优化器占12byte。目前主流的H100显存为80G,显然一张卡放不下,因此需要引入TP/PP等模型并行,将一个模型分摊在多张卡上。

由于DP效率最高,DP为所有并行中首选且必带的。同时只要一张卡放不下一个batch中的数据(以及其产生的激活值),DP也是必选的。

2.2 张量并行(Tensor Parallelism)

张量并行是指对模型内部的参数矩阵切分,然后利用分块矩阵乘进行计算得到正确结果,由于参数矩阵是以tensor表示,故叫张量并行

张量并行的优点是能分摊模型到多张卡上,缺点是带来了不小的通信开销,影响训练效率

以transfomer为例,阐述如何做TP,并分析其通信开销(可参考李沐老师的视频[1])

embeding部分:假设embeding的大小为 vocabhidden ,GPU卡为N,每张卡分摊 vocab/Nhidden ;由于embeding的计算是查找,每张卡拿到所有的input_ids并查找input_id是否在embeding中,没有设置为0。查找完毕后做一次allreduce,通信开销为 2bs*h ,b是batch,s是seqlen,h是hidden_size

attetion部分

  • • mha:直接按heads进行tp_size切分,heads必须能被tp_size整除
  • • gqa:对于query group部分进行tp_size切分,query_groups必须能被tp_size整除
  • • output_layer:将output_layer按行划分,mha/gqa的结果经过tp切分后本质是按列划分,和对应的output_layer按行划分后,相乘的结果最后allreduce。
  • • 额外带来的通信开销是: 2bs*h

MLP部分

  • • 输入不变,第一个矩阵(h4h)按列切,每张卡运算的结果为 bs4h/tp ,其值进行激活运算,第二个矩阵(4hh)按照行切,乘法后得到的结果是 bsh ,对这个结果做allreduce,其通信开销是 2bs*h
  • • 为什么不将第一个矩阵按行切第二个矩阵按列切?因为这样第一个矩阵的结果就是 bs4h ,在激活之前还得allreduce,即没有节省空间,还有额外通信。

output_layer部分

  • • output_layer是 hvolcab_size ,输入是 bs*h 。
  • • 将output_layer按列划分,每张卡的结果为 (bs)(volcab_size/tp) ,由于最后结果算loss时需要交叉熵,要对每一行做softmax,因此还需要再做一次allreduce。由于vocab_size很大(>100k),这个通信量就很夸张了,一种优化方式是先将每张卡上的结果按行sum,得到的结果是 bs ,对这个求和结果做allreduce,其通信量仅为 bs*tp

张量并行带来的额外通信开销是 o(bsh*l) ,其中l是layers

张量并行一般仅在单机8卡内做,因为通信量太大了,只有单机内nvlink这种高带宽才能支持(H100 900GB/s卡间通信),一旦跨机即便是IB也不够。

在实现过程中,tp有一些要注意的点:

  • • 将输入送到列并行之前,需要将经过一个特殊的函数,前向是identiy,反向是allreduce。反向之所以是allreduce而不是其它操作(如reducescatter),是因为链式法则:
    ,中间的加好就是allreduce
  • • 在行并行的结果allreduce时,它的反向是一个identity,这是因为sum的偏导就是1:

TP过程示意图

图片图1. TP示意图

2.3 流水线并行(Pipeline Parallelism)

上面说的张量并行是对矩阵进行切分,缺点是通信量很大。

另一种思路是按layer进行切分,例如一个模型是80层,切分到8张卡上,每一张卡放10层。

通信量仅为 bsh*pp ,小于TP的通信量

带pp会带来一个严重的问题,那就是气泡率较高,另外没有使用梯度累加,导致显存消耗比较高,和micro-batchs成正比。

可以将GBS切分为多个micro_batch,尽量将pipeline填满,从而一定程度减缓气泡率问题。它的气泡率为 ,其中p为pipeline stage,m为micro-batchs, , 分别是前向反向的耗时。简单来说就是数device-4的灰色格子就好,前面有(p-1)个气泡,后面有(p-1)个气泡

图片

通过1F1B可以减少显存消耗,气泡率不变,1F1B的思想很简单,只要有一个mb完成了,立马进行反向,从而减少了显存占用,从之前的m下降至p。但是不会减少气泡率,因为流水线的结构其实没有变,只不过优先处理了已经完成forward的micro-batch

图片图2. 1F1B和vpp示意图

为了进一步降低气泡率,提出了interleaved 1F1B schedule,又可以叫virtual-pipeline。相当于把流水线虚拟化了,本来4个gpu只能做4层流水,把它变成了8层甚至更多层。具体操作如下,例如2个gpu,每个gpu分摊4层layer(gpu1是0~3 layers,gpu2是4~7 layers),那么流水线虚拟化后就变为:gpu1是01,gpu2是23,紧接着又是gpu1为45,gpu2为67,这样就硬生生的用2个gpu实现了4层流水,这样气泡率也就降低了2倍。假设v为virtual stage,那么virtual pipeline将的气泡率为 ,这是因为每个pipeline stage的fwd和bwd时间降低至原有的 。

24年的zero-bubble[2]进一步降低了气泡率,它的思路很简单,将计算粒度进一步拆细,是将bwd进一步拆细,拆分为参数的梯度 和输入的梯度 ,算完 后立即传输给下一个stage。为什么将计算粒度变细能降低气泡率?因为气泡的存在本质是因为要等待其他设备的数据,如果能将数据切分至无限小,并且传输延迟是无限大的话,那气泡就没有了。这篇文章中有提供了2种方法:

  • • 第一种方法,就是上述所说,将bwd拆细,显存和1F1B一样,气泡率降低为1F1B的1/3,只存在最初的warmup阶段的气泡,BWD的气泡被完全填满。但是每个step都会有warmup的气泡。第二个方法解决了这一点。
  • • 第二种方法,除了将bwd拆细外,在warmup阶段送入两倍的数据,同时我们知道在optimizer.step之前,一般为了数值稳定新需要allreduce全局梯度,做一些nan check和clip(例如发现有nan就直接跳过这次更新)。但这种方法不会做全局的allreduce,每个stage做自己的nan check和clip,然后直接进入下一个迭代(一旦某个stage发现有nan或者clip,就通知所有stage回滚)。这样显存翻倍,但气泡率几乎为0了

图片图3. Zero-Bubble Pipeline 示意图

DeepSeek V3结合zero-bubble pipeline和Chimera 双流调度提出了Dual Pipe,还没看明白。后面补充。

2.4 序列并行(Sequence Parallelism)

这里介绍的序列并行是Megatron-LM中实现的版本,与处理长序列的SP貌似不是一回事,后者的代表是DeepSpeed-Ulysses和Ring Attention。

TP主要处理的是attention和FFN维度的并行,主要是对参数矩阵进行切分,而输入还是有冗余(的每个TP在attention和MLP中都有相同的输入)。SP则是对输入矩阵按sequence维度进行切分,体现在layernom和dropout层(layernorm和droupout对序列长度是无感的,SP不会影响计算结果),收益是减少了激活值。

由于attention和mlp都需要完整的序列,所以在进入attention和mlp需要做allgather,反向时需要做reduce-scatter(从计算图中能看出是reduce-scatter);从attention和mlp出来时做reduce-scatter,返现做allgather。

SP一般是基于TP的,一旦开启了SP,TP的算法也要有所改变,主要是通信操作,如图4所示

图片图4. SP示意图

SP相比于TP不会带来更多的通信开销,这是因为TP的通信操作是allreduce,SP+TP的通信操作是reduscatter+allgather,两者开销相同。

2.5 专家并行(Expert Parallelism)

专家并行主要解决的是MoE模型的问题,moe模型结构如下图:

图片图5. MoE模型结构

由于每个token只会分发给topk个专家,导致每个专家(FFN)只处理一部分token,计算效率很低。为了提升计算效率,会将专家分摊在不同的DP上。在之前的各种并行中,每个DP拥有完整的模型,在FWD和BWD时也是各自处理各自的数据,不会有任何通信(只会在梯度allreduce时涉及DP间通信)。而在EP中,专家被分摊到不同的DP里面,在前向和反向时DP之间便会有数据的通信,如图:

图片图6. EP并行示意图

一般会通过all2all进行数据的分发,同时并行组也会复杂不少。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐