Skip to content

多 GPU 训练(multi-GPU training)的 4 种策略

4 Strategies for Multi-GPU Training

默认情况下,深度学习模型即使有多个 GPU 可用,也只使用单个 GPU 进行训练。

ds p45 1

理想的做法(尤其是在大数据场景下)是将训练工作负载分散到多个 GPU 上。下图描绘了多 GPU 训练的四种常见策略:

ds p45 2

ds p46 1

  • 模型的不同部分(或层)被放置在不同的 GPU 上。
  • 适用于无法容纳在单个 GPU 上的超大模型。
  • 然而,模型并行(model parallelism)也带来了严重的瓶颈,因为当激活值从一个 GPU 传递到另一个 GPU 时,它需要在 GPU 之间进行数据流动。

ds p46 2

  • 将单个张量运算分布到多个设备或处理器上执行。
  • 它基于这样一个想法:一个大型张量运算(例如矩阵乘法)可以拆分为更小的张量运算,而每个更小的运算可以在单独的设备或处理器上执行。
  • 53

ds p46 3

  • 这种并行化策略内置于 PyTorch 和其他深度学习框架的标准实现中,但在分布式环境下它们会变得更加显著。

ds p47 1

  • 在所有 GPU 上复制模型。
  • 将可用数据划分为更小的批次,每个批次由一个单独的 GPU 处理。
  • 然后,来自每个 GPU 的更新(或梯度)被聚合起来,用于更新每个 GPU 上的模型参数。

ds p47 2

  • 这通常被视为数据并行(data parallelism)与模型并行的结合。

  • 因此,标准模型并行的问题在于,当数据流经第 2 个 GPU 上的各层时,第 1 个 GPU 处于空闲状态:

  • 流水线并行(pipeline parallelism)通过以下方式解决这一问题:一旦第 1 个 GPU 完成了对第 1 个微批次的计算并将激活值传递给第 2 个 GPU 上的各层,就加载下一个微批次的数据。该过程如下:

    • 第 1 个微批次流经第 1 个 GPU 上的各层。
    • 第 2 个 GPU 从第 1 个 GPU 接收第 1 个微批次的激活值。
    • 在第 2 个 GPU 让数据流经其各层的同时,另一个微批次被加载到第 1 个 GPU 上。
    • 如此循环往复。
  • 这样能极大地提高 GPU 利用率。从下面的动画中可以明显看出,多个 GPU 在同一时间戳上被同时利用(注意 t=1、t=2、t=3 以及 t=6):

  • 以上就是多 GPU 训练的四种常见策略。

ds p48 1

ds p48 2

本站内容仅供学习交流,版权归原作者所有。