pipeline parallelism 流水线并行

流水线并行简介

流水线并行:按模型layer层切分到不同的设备,即层间并行。但是原始的流水线并行非常浪费时间。

同一时刻只有一个计算设备,其余设备处于空闲状态,计算设备录用率非常低。

然后就引入了小批次流水线并行:将朴素的流水线并行的batch再进行切分,减小设备间的空闲状态,可以显著提升流水线并行设备录用率

这样就让我们的bubble(机器空载的时间)大大降低。mini batch中最经典的一篇文章是谷歌的Gpipe。

在网络模型优化的阶段,Gpipe提出了重计算的概念,比如途中反向计算的时候计算B0,3的值是依赖F0,3的值其的结果需要缓存到内存中,然后被重新读取。文章提出了一个重计算的概念,也就是不用正向的参数直接计算。使得它可以存放更大的网络模型。但是大量的前向重计算会降低效率。网络模型的权重和激活的中间变量会上升(时间换空间)。

1F1B

但其实之间介绍的都是F-than-B的情况

也就是先算每个batch的正向,在算每个batch的反向。微软在2021年提出了1forward1backward。pipe Dream。

也就是算完正向之后开始算反向。极大的减少了机器的空载时间,但是随着时间会越来越乱。

PipeDream分为俩个阶段。第一个是startup阶段,另一个是steady state阶段。它在执行一个正向之后马上执行一个反向。通过这种方式使得,在steady state的时候基本上没有空载(idle)。但是随着时间推荐,每个权重什么时候更新又变得很乱,所以文章提出了俩个概念。

解决方案为

  • 权重隐藏:weight stashing
  • 垂直同步:vertical sync

weight stashing

我们为每一个激活或者每一个计算的输出都保存一份,前向计算的时候,每个stage都是用最新的参数去处理minibatch的。然后把这份参数保存下来,用于同minibatch后向的的计算。我们对第五个minibatch进行前向计算时

权重隐藏:用的是前一个最新的反向计算的结果,去更新第五个正向的计算。第五个反向计算的时候保留了前向计算1的权重。简单来说,就是训练时候网络的参数的样子进行记忆,然后反向传播的时候还原出那时候的样子。然后进行更新。

垂直同步是被关闭的

贴士

一般来说机器内使用张量并行,机器外使用流水线并行。

流水线并行作为模型并行的一部分,一般不会单独使用,而是通过混合张量并行、数据并行等方式共同进行的。

Last modification:October 9, 2024
如果觉得我的文章对你有用,请随意赞赏