URL
TL;DR
- 本文提出一种和
Gpipe类似的pipeline parallelism并行训练机制PipeDream,和Gpipe可以任意划分模型不同,PipeDream自动化划分网络,以实现负载均衡和最小通信开销。 - 与
Gpipe的同步更新机制不同,PipeDream采用异步参数更新机制。
Algorithm

backward的过程实际同时包含了 参数更新
- 与
Gpipe使用的Micro-Batch+ 同步参数更新机制不同,PipeDream使用异步更新机制,异步更新主要包含以下几点:
weigt stashing
- 从上图可以看出
Machine 1在forward 5时,使用的是更新过1次的参数(forward 5之前只做了backward 1);但当backward 5时,参数已经被更新了4次,如果直接使用会出现forward和backward参数不一致问题 - 因此,
PipeDream提出了weight stashing(权重存储),即保存多组weights,每次forward过程使用最新版本的weights,当backward时,使用forward时刻对应的weights - 使用
weight stashing之前,,其中:- 表示
learning rate - 表示
stage的数量,即GPU数量 - 表示
weights of stage i after t mini-batch,即当运行了t个mini-batch之后的stage i的权重 - 表示梯度
- 表示
- 使用
weight stashing之后,
vertical sync
weight stashing解决了forward和backward使用的weight版本不一致问题,但依然存在另外一个问题:同一个mini-batch在不同stage上forward使用的weight版本不一致- 例如,对于
mini-batch 4,在Machine 2上forward使用的参数版本是未更新版本,在Machine 3上forward使用的版本是更新过一次的版本 - 为解决这个问题,作者提出
vertical sync概念,即:对于一个mini-batch在每个stage上forward都使用最旧版本的参数,stage forward and backward结束后统一更新参数 vertical sync应用之后,- 事实上实验证明,
weight stashing对训练精度提升明显,vertical sync提升较小
Thought
- 感觉
PipeDream为了充分排流水,减小bubble,没有等forward全部结束就开始backward,然后发现和单GPU更新机制不等价,然后用了weight stashing和vertical sync去找补,做到等价 - 和
Gpipe相比,灵活性更差,实现难度更高(需要缓存各个版本的weights,听上去也是几倍的存储开销以及吞吐量)










