Keras 多 GPU 批量标准化

数据挖掘 深度学习 喀拉斯 张量流 批量标准化
2022-02-07 13:21:54

1) 批量归一化层如何与multi_gpu_model一起工作?

它是在每个 GPU 上单独计算,还是在 GPU 之间以某种方式同步?

2) 保存模型时保存了哪些batch normalization参数?(因为在 Keras 中使用多 GPU 时,必须保存原始模型,如此处建议

在 is 的文档中multi_gpu_model说:

具体来说,这个函数实现了单机多GPU数据并行。

批量标准化意味着什么?

1个回答

1) 批量归一化层如何与 multi_gpu_model 一起工作?

对于 N 个 GPU,有 N 个模型副本,每个 GPU 上一个。对于每个副本,对子批次执行前向和后向传递(每个子批次是批次的 1/N)。这意味着,批归一化实际上是子批归一化,无法访问批的其余部分。

# This `fit` call will be distributed on 8 GPUs.
# Since the batch size is 256, each GPU will process 32 samples.
parallel_model.fit(x, y, epochs=20, batch_size=256)

2)保存模型时保存了哪些batch normalization参数(因为在Keras原始模型中使用multiple-gpus时必须保存,如建议here)?

保存一个统一的(模板)权重,而不是 N 个不同的权重。由于接收到不同的子批次,每个 GPU 计算出不同的梯度。然后,或者 (1) 在每个 GPU 上单独更新权重并定期同步,或者 (2) 在模板模型上(在 CPU 上)聚合 N 个输出/梯度,然后将新的权重广播回 GPU。在这两种情况下,都有一个统一的(模板)模型,尽管在第一种情况下,模板模型可能并不总是具有最新的权重,因为它保持不同步并且偶尔会更新。

额外说明

  1. 一些研究人员提出了一种特定的批量标准化同步技术,以利用整个批次而不是子批次。他们说:

    公共框架(如 Caffe、MXNet、Torch、TF、PyTorch)中 BN 的标准实现是不同步的,这意味着数据在每个 GPU 内进行了标准化。

  2. 由于权重同步,我们不能期望GPU 数量的线性加速。

  3. multi_gpu_model这个github issue中讨论了一些技术细节multi_gpu_model当权重稀疏时(与密集层相比),速度会有所提高,否则权重同步会成为瓶颈。

  4. 此外,这是来自Nvidia的 GPU-GPU 权重同步流程示例