首页 > 解决方案 > Pytorch:将同一批数据发送到多个 GPU,并在每个 GPU 上单独执行操作

问题描述

我有相同的数据加载器来向 4 个模型提供数据,每个模型都在单独的 GPU 上加载不同的超参数。我想减少数据加载造成的瓶颈,所以我打算在所有 GPU 上加载由数据加载器准备的同一批,以便它们单独计算并执行反向传播步骤。我已经将数据缓存到 RAM 中以避免在实例化数据加载器时出现磁盘瓶颈。

我在尝试着:

  1. 将同一批数据发送/广播到N个GPU。我想这只有在我们可以同步/等待所有 GPU 完成一个批次的操作,然后才能继续下一个的情况下才有可能。
  2. 奖励:一旦一个批次准备好(最多 P 个批次)就预取下一个批次可以帮助确保数据连续流向 GPU,避免等待。

我不想达到:

  1. 数据并行- 将大批量拆分为N个部分,并在一个 GPU 上计算每个部分
  2. 模型并行性 - 将大型模型(不适合在一个 GPU 上)的计算拆分为N个(或更少)部分,并将每个部分放在一个 GPU 上。

类似的问题:

  1. 这个关于跨多个 GPU 进行 Conv2D 操作
  2. 这个关于并行执行不同的 GPU 计算,但我不知道我的问题是否可以用torch.cuda.Stream()解决
  3. 这个关于加载不同的模型,但它不处理共享同一个批次。
  4. 这正是我要问的,但它是 CUDA/PCIe 和 7 年前的

更新:

我在 Pytorch中发现了一个非常相似的问题,讨论最后有一个使用多处理的正向道具的小例子,但我想知道如何将这种方法扩展到火炬数据加载器。

标签: parallel-processingpytorchshared-data

解决方案


推荐阅读