何时将 pytorch 张量放在 GPU 上?

Div*_*oML 3 numpy pytorch pytorch-dataloader

我正在尝试使用 pytorch 在 GPU 上运行神经网络,并且我的数据有一些不寻常的形状,因此我使用 Dataset 和 DataLoader 来生成数据批次。我的代码在 CPU 上运行良好,但我对何时是将数据放到 GPU 上的正确时机有点困惑:

  1. 我的数据量足够小,可以全部放在 GPU 上,我是否应该在拟合之前将所有数据放在 GPU 上,以便所有 DataLoader 和 Dataset 操作仅在 GPU 上进行,以获得最佳执行速度?
  2. 另一种可能性是将所有数据保留在 CPU 上,当数据量变大时,这可能会很有用。在这种情况下,我应该调用batch.to("cuda")DataLoader 生成的每个批次吗?
  3. 我还应该在训练之前先将模型放在 GPU 上吗?它是一个足够小的模型,可以放在 GPU 上。
  4. 我的原始数据是 numpy 数组,因此我可以自由地编写在__getitem()___方法中返回 numpy 数组的数据集,或者将 numpy 数组转换为 pytorch 张量并编写返回 pytorch 张量的数据集。一种方法优于另一种方法吗?

Saw*_*aha 6

让我澄清一件事。通过模型传递数据时,您的模型和数据(特定批次)必须位于同一设备上。要自动化您的代码以在 GPU 和非 GPU 环境中工作,您可以使用此行。

device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
Run Code Online (Sandbox Code Playgroud)

因此,如果您希望使用 GPU 进行训练,则必须在训练之前将模型放在 GPU 上。就我个人而言,我更喜欢在创建模型对象时将模型加载到 GPU。[答案3]

model = MyModel().to(device)
Run Code Online (Sandbox Code Playgroud)

然后你还需要将数据放入 GPU 中。一个明显的选择是一次放置所有数据。但我建议反对。因为无论您的数据集有多小,通过一次将一批数据放入 GPU,而不是一次放入整个数据,您总是会获得更好的性能。我知道您在想,将每个批次从 CPU 转移到 GPU 都会有时间延迟。你是对的!

但是,一次放置一个批次将允许您使用更大的批次大小,并且与较小的批次大小和一次加载所有数据相比,较大的批次大小始终会在性能方面获胜。[答案1和2]

for x_data, y_data in train_dataloader:
    x_data, y_data = x_data.to(device), y_data.to(device)
Run Code Online (Sandbox Code Playgroud)

最后,关于写入__getitem__,Numpy 数组到 PyTorch 张量将由数据加载器处理,以便您的getitem可以返回 Numpy 数组。但当我看到代码中显式编写的转换时,我感觉很好。它给我一种完整且易于理解的管道的感觉。[答案4]