PyTorch:为什么 运行 output = model(images) 使用这么多 GPU 内存?

PyTorch: why does running output = model(images) use so much GPU memory?

在试图理解为什么我的 PyTorch 模型的最大批量大小受到限制时,我注意到使用最多内存的不是模型本身,也不是将张量加载到 GPU 上。大多数内存在第一次生成预测时用完,例如在训练循环中使用以下行:

output = model(images)

其中图像是一些输入张量,模型是我的 PyTorch 模型。在 运行 行之前,我有大约 9GB 的可用 GPU 内存,之后我下降到 2.5GB(然后在 运行 loss = criterion(outputs, labels) 之后进一步下降到 1GB 可用)。

两个问题:

  1. 这正常吗?
  2. 为什么会这样?那些内存是用来做什么的?据我了解,模型已经加载,实际输入张量在调用之前已经在 GPU 上。输出张量本身不可能那么大。跟存储计算图有关系吗?

这很正常:这里的关键是,如果要通过backward-mode微分计算梯度,则必须存储所有中间张量(整个计算图)。 您可以使用 .no_grad 上下文管理器来避免这种情况:

with torch.no_grad():
    output = model(images)

您会发现使用的内存少了很多,因为不会存储计算图。但这也意味着您不能再计算导数了。然而,如果您只想评估模型而不需要任何优化,这是标准方法。

如果你还想优化,有一种方法可以减少内存消耗,叫做checkpointing。每当你在向后传递中需要一个中间张量时,它将从输入(或实际上从最后一个“检查点”)再次计算,而不存储直到该张量的中间张量。但这只是计算上更昂贵。您正在用内存换取计算时间。