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的权重。简单来说,就是训练时候网络的参数的样子进行记忆,然后反向传播的时候还原出那时候的样子。然后进行更新。
垂直同步是被关闭的
贴士
一般来说机器内使用张量并行,机器外使用流水线并行。
流水线并行作为模型并行的一部分,一般不会单独使用,而是通过混合张量并行、数据并行等方式共同进行的。