【CS336】lecture 8收尾 上下文并行CP|多维并行|重计算

上下文并行CP

对于注意力层,有特殊的并行策略,上下文并行。核心是超长上下文时,qkv矩阵都很大,从内存角度单卡装不下,从计算吞吐角度也想要提高吞吐,于是想把注意力计算分散给多卡。

不过注意到每个q都要和所有的kv计算注意力,因此不能简单的对qkv分别切分,分给多卡,这样每个卡内的q只算了和卡内kv的注意力,没算和其他kv的注意力。

上下文并行的思路是,每个卡负责一些q,然后让kv块在多卡间做一个ring通信,每个kv块都会在环上走过所有卡,能与所有q块计算注意力。以某一张卡的q的角度来看,它也会见过所有kv块,最后计算完了,每个rank会保有一部分token的和全部token的注意力结果

多维度并行策略

注意力和线性层使用的并行可能不一样,注意力层使用CP,线性层使用EP,这都是两层各自独有的,TP DP PP都可以用

考察计算量/通信量。只使用模型并行(MP),在bacth变大时没有变化,虽然比较接近1了

只用FSDP也就是数据并行,随着batch变大,计算能逐渐掩盖通信开销,一个阈值后会变成计算bound,也就是计算核心打满了,这是好的。这个分析类似于计算/访存的roofline model,只不过考虑的是计算和通信的overlap,而不是计算和访存的overlap。

这里的结果是和roofline model类似的,随着数据量(横轴batch size)变大,计算时间会快速增长,通信时间则增长较慢,因此计算将会能掩盖通信延迟。

而如果用FSDP+MP的话,是最好的,趋势和单纯FSDP类似,随着数据量增加,计算/通信会逐渐增加,但上升的更快,越过计算bound/通信bound的临界点的时间也更早

4维度并行,也就是把钱免收到的一块用。

从内存角度来说,如果模型太大装不下,EP TP PP DP都是降低显存使用的手段

从吞吐的角度讲,如果想提高吞吐,就在上面已经完成显存要求的架构的基础上,多复制几个集群,做DP,从而可以扩大训练时的吞吐

图中黄色框表示流水线的一个阶段,对应PP。每个黄色框内的四种颜色,表示TP,切分参数,注意每个黄色框内有8列,表示一般TP只在一个8卡节点内使用。多个黄色框组成一个DP rank,表示DP,两个大DP rank之间用ZeRO通信

一些并行建议

  • 尽量降低MP(模型并行的维度),因为模型并行往往通信量不小(TP EP单纯通信量大,PP虽然传的是激活值小一点,但是有流水线空泡问题,也是延迟)。尽量扩大DP的维度,因为开启分布式优化器后,也就是使用了ZeRO后,可以再降低显存消耗的同时,通信量增长仍然不是很多,几乎是无额外开销,获得了显存收益和吞吐收益
  • 只在nvlink内做EP和TP,因为这俩是通信量最多的,只有节点内nvlink的高带宽,才能接受他俩的通信量,跨节点TP EP会变成通信bound
  • PP在跨节点时使用,也就是把流水线的不同层放在不同节点,因为PP的通信量比较少,跨节点低带宽也可以接受。进阶技巧是打开VPP(虚拟流水线),框架会自动对你的模型做更细的流水划分,更细的划分能提高流水线利用率
  • 再专家层优先使用EP而不是TP,理论上EP TP都能用,但是EP的每个专家已经很小了,继续TP,会切出来一堆小矩阵,这对GPU来说不如少量大矩阵,会增加同步点,降低吞吐。
  • 对于长序列开启上下文并行,建议在上下文长度超过8k时开启,因为注意力矩阵是内存开销O(n2)O(n^2)O(n2)的,当上下文太长时直接就装不下了

megatron在不同模型大小下测出来的最优并行策略。注意到TP增长到8就不再增长了,这是我们前面说的TP只在单node内,跨node通信开销太大。PP一直在扩大,这是为了能在内存里装下模型。DP rank数则在降低,这单纯是因为卡数不够,我们前面为了装下模型,增加了PP,而PP和DP是相乘的关系,如果还保持DP=32的话,卡数就不够了。

这是我们前面见过的图,现在我们明白了,使用多维度(PP DP TP)并行,可以取得比单纯数据并行更好的效果。随着GPU数的增加,每张卡的吞吐是一条接近水平的曲线,几乎不下降。

这就是所谓的弱拓展,当我们增加设备数时,每个设备的利用率不下降,这样设备规模拓展x倍,我们的性能就能提升x倍。如果我们没做好设备间的通信,增加设备的优化效果会被通信所浪费,导致设备在增加,每个设备的利用率却在降低,增加x倍设备,总性能增加不到x倍。

在分布式训练中,弱拓展是更好的,这表示我们增加的设备没有带来浪费。强,弱的命名不是说哪个更好,而是说强拓展的约束更强:拓展设备规模,任务量不变。因此在强拓展中,增加设备数确实能带来运行时间的缩短,但由于任务量有限,没有足够的计算任务掩盖通信延迟,导致通信开销占比越来越高,每个设备的利用率越来越低,强拓展只要求了,你增加设备数,耗时一定会下降。

而弱拓展,当设备规模增长时,任务量也可以跟着增长,甚至可以任务任务量是无限大的,因此有足够的计算任务来掩盖通信延迟,从而可以实现设备规模增长,通信开销的占比几乎不增长,从而实现每个设备的利用率不掉

一共有64张卡的时候,TP=8,PP=8是最优的,因为TP=8时恰好是一个nvlink节点的大小

重计算

考虑反向传播中,每一层的激活值是重计算,还是在前向传播时算出来后保存下来,橙色是不用重计算,蓝色是重计算。可以看到橙色由于没有重计算,吞吐稍微高一些,但是需要把每一层的激活值都保存下来,当batch增大就OOM了,因此只到batch=8。而重计算,虽然增加了一点计算延迟,但是解放了内存占用,可以跑更大的batch,最终实现更高的吞吐

这就是上面标题所说的,激活值重计算能支付他自己的代价。虽然增加了一点计算量,但是减少内存消耗,允许大batch反而能取得更高的吞吐。

相关推荐
一条大祥脚19 天前
【CS336】lecture4 FlashAttention
flashattention·online softmax·cs336
一条大祥脚20 天前
【CS336】lecture4 MoE|专家路由|专家数量
moe·deepseek·cs336·专家路由
gravity_w1 个月前
【CS336】Lecture 2 PyTorch 与资源核算(Resource Accounting)
人工智能·深度学习·语言模型·llm·nlp·flops·cs336
nuowenyadelunwen5 个月前
CS336 Assignment 1 BPE分词器训练初版(朴素版基础上优化)及后续优化方向分析
llm·cs336
Allenlzcoder5 个月前
Stanford CS336(2026)课程介绍
cs336
墨心@6 个月前
Byte-Pair Encoding (BPE) Tokenizer
人工智能·自然语言处理·nlp·datawhale·cs336·组队学习
爱听歌的周童鞋7 个月前
斯坦福大学 | CS336 | 从零开始构建语言模型 | Spring 2025 | 笔记 | Course Summary
llm·cs336·course summary
爱听歌的周童鞋7 个月前
斯坦福大学 | CS336 | 从零开始构建语言模型 | Spring 2025 | 笔记 | Assignment 5: GRPO
llm·policy gradient·assignment·grpo·cs336·experiments
爱听歌的周童鞋7 个月前
斯坦福大学 | CS336 | 从零开始构建语言模型 | Spring 2025 | 笔记 | Assignment 5: SFT Implement
llm·sft·math·assignment·cs336·expertiteration