DP简介
在训练模型的时候,nn.DataParallel函数可以用多个GPU实现加速训练,它基于单进程多卡,所有的卡都参与并行运算,其中主卡device[0]负责整合梯度、更新参数。
DataParallel简称DP,它不支持SyncBN(即同步BN),同步BN只在DataDistributedParallel(DDP)中才支持。具体有没有必要使用SyncBN,要看单卡batch size的数量大小:如果单卡batch size太小,使用SyncBN可以提高性能;如果batch size较大的时候不需要使用SyncBN,因为同步时GPU之间的通信会导致训练速度变慢。
DP中的BN与DDP支持的SyncBN
当使用 torch.nn.DataParallel 将代码运行在多张 GPU 卡上时,PyTorch 的 BN 层是非同步的,默认操作是各卡上数据独立地计算均值和标准差,并在单卡上维护自己的参数,只在每一个GPU上对样本进行归一化,相当于减少了batch size的大小,训练的时候实际的 BN 层的 batch-size 为 B a t c h S i z e G P U 数 量 \frac{BatchSize}{GPU数量} GPU数量BatchSize;
SyncBN的意思是每张卡上使用相同的统计量:均值(
μ
\mu
μ)和方差(
σ
2
\sigma^2
σ2)。同步 BN 使用所有卡上的数据(全局样本数据)一起计算 BN 层的均值和标准差,缓解了当批量大小(batch size)比较小时对均值和标准差估计不准的情况,是在目标检测等任务中一个有效的提升性能的技巧。
(本段参考链接)
Pytorch多GPU的计算和Sync BatchNorm
同步BN数学计算方法参考
github上实现的适用于DP的SyncBN代码参考
PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析
[原创][深度][PyTorch] DDP系列第三篇:实战与技巧
PyTorch 单机多卡操作总结:分布式DataParallel,混合精度,Horovod)
PyTorch DistributedDataParallel 单机多卡训练 踩坑记录
神器:多卡同步的Batch Normalization