学习率 learning rate:一定条件下,Batch size越大训练效果越好,梯度累积则模拟了batch size增大的效果,如果accumulation steps为4,则Batch size增大了4倍,根据ZOMI的经验,使用梯度累积的时候需要把学习率适当放大。 归一化 Batch Norm:accumulation steps为4时进行Batch size模拟放大效果,和真实Batch size相比,数据的分...
我们可以看到,对 GPT-2 Large(762M) 模型而言,DDP 尚能够支持其中某些 batch size 而不会引起内存不足 (OOM) 错误。但当使用 GPT-2 XL (1.5B) 时,即使 batch size 为 1,DDP 也会失败并出现 OOM 错误。同时,我们看到,FSDP 可以支持以更大的 batch size 训练 GPT-2 Large 模型,同时它还可以使用...
kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channel) self.relu = nn.ReLU() self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channel) ...
图6:Reduce 我们首先在配置[1]的基础上进行实验,并使用相同的batch size(例如总batch size为256时,使用双卡的时候每张卡128,四卡的时候每张卡64),结果如以表4所示(实验中迭代了500个batch,中间300个batch的总时间作为表4中的总时间;DtoD的时间包含两部分,分别是主GPU将每份数据PtoP传给其他GPU的时间,以及主GPU...
很多的 loss 函数都有size_average和reduce两个布尔类型的参数。因为一般损失函数都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 (batch_size, ) 的向量。 (1)如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 losssum ...
continuation with distributedDataParallel.py abovedef get_reduced_loss(loss, dest_device):loss_tensor = loss.clone() torch.distributed.reduce(loss_tensor, dst=dest_device) return loss_tensorif args.local_rank==0: loss_tensor = get_reduced_loss(loss.detach(), 0) print(f'Current batch ...
DDP的梯度汇总使用的是avg,因此如果loss的计算使用的reduce_mean的话,我们不需要再对loss或者grad进行/ world_size的操作。 二、使用DDP时的数据读取 DDP不同于DP需要用卡0进行数据分发,它在每个node会有一个独立的dataloader进行数据读取,一般通过DistributedSampler(DS)来实现: ...
(4)现在函数中仍存在的size_average和reduce在早期是用来设定计算模式的,现已通过reduction来设置。 1.2 实验 1.2.1 通过实验认识CrossEntropyLoss交叉熵的不同计算模式reduction 3个样本分别是输入输出神经元,即第1个样本输入为1,输出值为3,第2个样本输入为1,输出为3,第3个样本输入为1,输出为3。
接着,执行 all-reduce 操作,此时每个工作进程从其余工作进程获取梯度并取平均。这样一轮下来,每个工作进程上的梯度都是相同的,且都是全局梯度,接着优化器再用这些梯度来更新模型参数。我们可以看到,每个 GPU 上都保留完整副本会消耗大量的显存,这限制了该方法所能支持的 batch size 以及模型尺寸。
DDP的梯度汇总使用的是avg,因此如果loss的计算使用的reduce_mean的话,我们不需要再对loss或者grad进行/ world_size的操作。 二、使用DDP时的数据读取 DDP不同于DP需要用卡0进行数据分发,它在每个node会有一个独立的dataloader进行数据读取,一般通过DistributedSampler(DS)来实现: ...