外观
多 GPU 训练(multi-GPU training)的 4 种策略
4 Strategies for Multi-GPU Training
默认情况下,深度学习模型即使有多个 GPU 可用,也只使用单个 GPU 进行训练。

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


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

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

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

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

这通常被视为数据并行(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 训练的四种常见策略。

