问题描述
我正在处理多GPU服务器上的神经网络训练。我正在使用TensorFlow 2.1中的MirroredStrategy API,但感到有点困惑。
我有8个GPU(Nvidia V100 32GB)
- 我指定的批处理大小为32(如何管理?每个gpu将有一批32个样本?我应该将256指定为批处理大小-32x8-吗?)
- 何时以及如何应用反向传播?我已经了解到MirroredStrategy是同步的:这是否意味着在向前执行步骤之后,所有批次都被分组为一个大小为32x8的批次,并且在应用了反向传播之后?还是按顺序将Back-prop应用于每批大小为32的批次?
我真的想确定我要提交给服务器的哪种实验,因为每项训练工作实际上都很耗时,并且根据可用GPU的数量更改批处理大小(以及反向支持)会影响结果的正确性
感谢您提供的任何帮助。
解决方法
使用MirroredStrategy时,批次大小是指全局批次大小。 You can see in the docs here
例如,如果将MirroredStrategy与2个GPU一起使用,则每批大小为10的批处理将分配给2个GPU,每个步骤在每个步骤中接收5个输入示例。
因此,如果您希望每个GPU每步处理32个样本,则可以将批处理大小设置为32 * strategy.num_replicas_in_sync
。
每个GPU都会在输入数据的不同切片上计算通过模型的正向和反向传递。然后,将这些切片中每个切片计算出的梯度汇总到所有设备上,并以称为AllReduce的过程进行缩减(通常是平均)。然后,优化程序以这些减小的梯度执行参数更新,从而使设备保持同步。