并行训练
How to Train Really Large Models on Many GPUs? (lilianweng.github.io) 对于浮点运算,模型参数的存储和中间计算输出(梯度和优化器状态)的存储的在 GPU 内存上的大量需求使得我们需要并行化,下面我们参考一些常用的并行化范式: 数据并行策略: 在Multi-GPUs上Duplicate模型,然后分别feed数据,进行运算,每个batch同步或者异步的进行多卡间的梯度传递和模型同步。 同步可能会导致每个batch需要停止训练,异步则是可能会使用陈旧的梯度进行一段时间的训练,增加了计算时间。 而在PT1.5以来,使用一种中间的方式:每隔x次迭代,进行多卡间的全局同步梯度一次,使用这种梯度积累的策略,根据计算图来进行计算和通信调度的优化,提高吞吐量。 模型并行范式: 是为了解决单模型过大无法存储在单一的Node上的问题,但是这样会有GPU间的顺序依赖,虽然减少了内存的占用和计算量,但是这种IO的需求导致计算资源的利用率严重不足。 在这种pipeline中,就存在利用率的bubble,也就是空白的部分 Pipeline并行策略: 混合模型和数据并行的策略,来减少低效时间的泡沫,也就是,将一个batch切分成多个小batch,然后分发到每个node上,减少相应的等待时间,只要我们对计算量和运行速度有合理的把握,就能极大的降低这个inefficient time bubbles. 多个mini-batch的梯度聚集起来最后同步更新. 最有情况下甚至可以忽略气泡的开销 $$ 1- \frac{2md}{(2m+2(d-1))d} = \frac{d-1}{m+d-1} $$ m个mini-batch和d个分布, bubble的比例将如上述所示 ...