Coggle requires JavaScript to display documents.
模型计算流水线并行 在处理来自不同流水线的数据更新时进行参数异步更新,不同流水线之间互不影响 在计算一批简单的样例时,允许进行“填充间隙”(空余时间计算别流水线),这可以充分利用空闲的设备资源
分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分
RNN模型并行DeviceWrapper
多设备(GPU或者机器)
后端
将每个piece通过分布式task分发到真实的节点去运行
不同的机器有同一个模型的多个副本,每个机器分配到不同的数据,然后将所有机器的计算结果按照某种方式合并
数据并行训练方法都需要一些组合结果和在每个worker之间同步模型参数的方法
各个设备根据loss计算各自的gradient,更新各自的参数,然后在一段时间后同步梯度
设置一个大于1的平均周期averaging period
如果求均值周期太长,那么每个节点得到的局部参数更多样化,求均值之后的模型效果非常差。我们的想法是N个局部最小值的均值并不保证就是局部最小
还没有结论性的回答,究结论(比如[16])建议平均的周期为每10~20个minibatch计算一次(每个工作节点)能够取得比较好的效果
每个GPU根据loss计算各自的gradient,汇总所有GPU的gradient,求平均梯度,根据平均梯度更新模型参数
等待所有计算节点完成计算后统一更新参数
同步数据并行的速度取决于最慢的GPU,当各个GPU的性能相差不大时适用
在处理来自不同设备的数据更新时进行异步更新,不同设备之间互不影响,对于每一个图副本都有一个单独的客户端线程与其对应
陈旧梯度问题(stale gradient problem)
梯度(更新)的计算需要时间。 当worker完成这些计算并将结果应用于全局参数向量时,参数可能已经多次更新
平均梯度陈旧度等于worker的数量从生成到完成传输总共需要n-1次 有N个执行器,这意味着在将梯度应用于全局参数向量时,梯度将平均过时N步(每个一步,就是N步) 高梯度过时会显著降低网络收敛速度,甚至会阻止某些配置收敛。 早期的异步SGD实现(例如Google的DistBelief系统[2])没有考虑到这种影响,因此学习效率远远低于原本应有水平
陈旧梯度问题(stale gradient problem):由于设备间互不影响,所以在更新参数时可能其他设备已经更好的更新过了,所以会造成参数的抖动
中心化同步
GPU之间的通信是在大规模环境中训练分布式深度学习模型时的众多挑战之一。 在所有GPU上交换梯度的延迟是数据并行同步分布式深度学习中的严重瓶颈
分布式同步
每一个GPU都是一个Process
通过p-1次传递,把scatter-reduce中每个process有的数组传输给别的process
通信量和P没有关系
在一个集群中,既有模型并行,又有数据并行
在使用 128 个 GPU 进行训练时,因为低效率损失了一半的计算资源
服务器内使用NCCL,服务器间使用mpi实现数据并行