我想我了解了DDP的批处理大小和时间是如何工作的,但我不确定学习的速度。
假设我有一个100 *8图像的数据集。在非分布式场景中,我将批处理大小设置为8,因此每个时期将执行100个梯度步骤。
现在我在一个多节点的多gpu场景中,有2个节点和4个gpu(所以世界大小是8)。
我知道我需要传递8/8= 1的批处理,因为每个更新都会聚合来自8个GPU的梯度。在每个工作人员中,数据加载程序仍将加载100个批,但每个示例都是这样。因此,整个数据集每一个时代准确地解析一次。
我查过了一切看起来都是这样的。
但是学习率呢?根据官方医生
当一个模型在带有batch=N的M个节点上训练时,如果损失在一批实例中被相加(不是通常的平均)(因为不同节点之间的梯度是平均的),则与在一个具有batch=M*N的节点上训练的相同模型相比,梯度将小M倍。..。但在大多数情况下,您只需将单个GPU上的DistributedDataParallel包装模型、DataParallel包装模型和普通模型视为相同的模型(例如,对等效批处理大小使用相同的学习速率)。
我知道梯度是平均的,所以如果损失在样本上是平均的,什么都不会改变,而如果是夏天,我们需要说明这一点。但是,“节点”是指跨越所有集群节点(世界大小)的GPU总数还是仅指集群节点?在我的例子中,M是2还是8?我所链接的线程中的一些帖子说,梯度除以“GPU的数量”。梯度究竟是如何聚合的?
发布于 2022-06-09 02:27:31
请参阅以下讨论:
https://github.com/PyTorchLightning/pytorch-lightning/discussions/3706
“据我所知,学习速度与批次大小成比例,这样梯度的样本方差就会保持接近不变。”
由于DDP平均所有设备的梯度,我认为LR应该按有效批次大小(即batch_size * num_accumulated_batches * num_gpus * num_nodes )进行比例缩放。
在这种情况下,假设batch_size=512、num_accumulated_batches=1、num_gpus=2和num_noeds=1的有效批次大小为1024,因此LR应该按sqrt(2)进行缩放,而不是单个批处理大小为512的gpus。
https://stackoverflow.com/questions/71962572
复制相似问题