【问题标题】:CUDA out of memory error, cannot reduce batch sizeCUDA 内存不足错误,无法减小批量大小
【发布时间】:2021-07-22 04:34:30
【问题描述】:

我想在我的 GPU 设备上运行一些实验,但我收到此错误:

RuntimeError: CUDA 内存不足。试图分配 3.63 GiB (GPU 0; 15.90 GiB 总容量;已分配 13.65 GiB; 1.57 GiB 免费; PyTorch 总共保留了 13.68 GiB)

我阅读了可能的解决方案here,常见的解决方案是这样的:

这是因为小批量数据不适合 GPU 内存。 只需减小批量大小。当我为 cifar10 设置批量大小 = 256 数据集我得到了同样的错误;然后我设置batch size = 128,它是 解决了。​​

但就我而言,这是一个研究项目,我想要特定的超参数,我无法减少诸如批量大小之类的任何东西。

有人对此有解决方案吗?

【问题讨论】:

  • 我之前在自己的研究中遇到过类似的问题。 ???对我来说,替代方案是使用一些等效的稀疏张量(如果可能的话),或者招募更多的 GPU 来分布我的数据。如果您使用的是pytorch,后者在pytorch-lightning 中相当简单。如果您要免费使用框架,pytorch 也同样简单,尽管您需要编写更多开销。
  • 你的研究项目对 BATCH_SIZE 有那么敏感吗?模型不会在较小的批量大小下收敛吗?
  • @pavel 其实是对敏感性分析的研究。我的模型收敛。但我想比较它们,看看它们对这些超参数有多敏感
  • @John 感谢您的建议。我会试试他们作为我的第二个选择。
  • 那你需要另一个显卡....或者在 CPU 上训练模型。

标签: python pytorch


【解决方案1】:

Shai 的回答很合适,但我想提供另一种解决方案。最近,我一直在观察 Nvidia AMP - Automatic Mixed Precision 的出色结果,这是 fp16 与 fp32 优势的完美结合。一个积极的副作用是它也显着加快了训练速度。

在tensorflow中只有一行代码:opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)

更多详情here

您还可以将 AMP 与 Shai 的解决方案叠加。

【讨论】:

  • AMP 很棒。您也可以将它用于 pytorch,请参阅 here 请注意,您应该使用 amp 进行渐变缩放。
  • AMP 是否也有助于解决 CUDA 内存不足问题?我认为它只会启用混合精度还是通过将精度降低到 fp16,我们不会占用大量内存?
  • fp16 使用了 fp32 一半的内存。使用混合精度时,我通常会看到内存使用量减少 20-40%,有时甚至更多。
【解决方案2】:

只要单个样本可以放入 GPU 内存,您就不必减少有效批量大小:您可以这样做gradient accumulation。 您可以累积几个小批量的梯度,而不是在每次迭代后更新权重(基于从太小的小批量计算的梯度),并且只有在看到足够多的示例时,才更新重量。
这很好解释in this video

实际上,您的训练代码看起来像这样。 假设您的大批量大小为large_batch,但只能将small_batch 放入GPU 内存中,例如large_batch = small_batch * k。 然后你想在每k 迭代更新一次权重:

train_data = DataLoader(train_set, batch_size=small_batch, ...)

opt.zero_grad()  # this signifies the start of a large_batch
for i, (x, y) in train_data:
  pred = model(x)
  loss = criterion(pred, y)
  loss.backward()  # gradeints computed for small_batch
  if (i+1) % k == 0 or (i+1) == len(train_data):
    opt.step()  # update the weights only after accumulating k small batches
    opt.zero_grad()  # reset gradients for accumulation for the next large_batch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2018-09-14
    • 2014-08-02
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多