数据并行、模型并行、流水线并行

一、数据并行(DP )

1、概念:相同的模型分布在不同的GPU上,在不同的GPU上使用不同的数据。每一张GPU上有相同的参数,在训练的时候每一个GPU训练不同的数据,相当于增大了训练时候的batch_size。

  数据并行基于一个假设:所有节点都可以放下整个模型。这个假设在某些模型上(如GPT3)是不合理的,因此我们还需要模型并行。

2、并行方式:

同步训练:每个前向、反向结束后显示同步(把每一个GPU上的梯度进行汇总,再在GPU上进行相同的参数更新。)。

  • 实现简单,适合同构场景;
  • 一个节点出现故障会影响整体计算性能;
  • 传统中心化PS(Parameter Server):存在性能瓶颈(PS需要和很多的不同的节点进行通信,当集群的节点数增加的时候,会存在性能瓶颈);
  • All-Reduce:目前最广泛采用,几乎所有框架都支持(各个GPU反向传播计算完梯度之后,通过一种像round all reduce环形结构,直接将参数更新);
  • 显示训练,在All-Reduce时时没法进行下一步训练的。

异步训练:只进行部分同步或不显示同步。

  • 适合异步训练,可能导致潜在的收敛性问题;
  • 节点和PS通信,将梯度传给Sever的时候,Sever直接用参数进行更新,从Sever拿到更新后的参数进行下一步训练。当有的节点训练快,而有的节点训练慢,训练快的节点训练好后等一会就不等了,快的节点之间做一次通信后接着下一轮计算,慢的节点什么时候算好了再和其他节点一起all reduce梯度。这样可能将梯度发送给PS的时候,从PS拿到的参数是更新了好几个版本之后的,每个节点梯度不一样,根据不同的参数算得的梯度再去做all reduce就有一些不合理,就会导致神经网络精度受损。
  • 传统异步方法:ASGD等;
  • 其他:把其中部分的计算节点组成一个组,每次在这个组之内进行梯度的汇总和更新。

3、实例:

3.1、谷歌提出的Zero Redundancy Optimizer(Zero)

问题:

  • 存储构成:参数、梯度、优化器状态(巨大);
  • 每个worker都进行了相同的optimizer运算,进行相同的参数更新,存在冗余。

方法:

  • 将optimizer state 进行切分,分不到不同的worker上;
  • 在每个worker分别运行不同的optimizer计算,并all-gather参数更新。

 3.2、Zero offload

  • 将部分数据和计算资源转移到CPU上;
  • 将优化器参数同样分散到多个CPU上;
  • 将CPU上状态更行与Step N+ 1 的GPU上的计算重叠起来;
  • 40TFOPs/GPU on V100 for 10B model (在CPU上计算优化器状态比较耗时,所以将通信时间进行重叠。)

 

二、模型并行(MP )

1、概念:将模型切分到不同的GPU上,将模型的参数分到不同的GPU上,每一个GPU上的参数量大大减小,这样可以容纳更大的模型进行训练。

2、Megatron-LM:提出Transformer模型并行原语。

  • 两种切分方式:行切分、列切分。目标:找到最优的切分方式,减少训练过程中的通信次数。

3、分类:

  • 粗粒度并行:每个节点算不同的layer(layer之间是存在数据依赖的,这就导致在之前的节点算的时候,后面的节点干等着)。
  • 细粒度并行:将layer也做拆分。

 

三、流水线并行(PP)

1、概念:基于模型并行,一个batch结束前开始下一个batch,以充分利用计算资源。将模型按层进行切分,将不同的层放入不同的GPU,训练的时候数据像流水一样在GPU上进行流动。

2、切分方式:按层切分(流水线并行)、层内切分(模型并行)。

 

四、混合并行(HP)

  混合使用上述的两种或三种方法。

posted @ 2022-03-26 20:40  是小叶呀  阅读(5221)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/