我想在我的 GPU 设备上运行一些实验,但出现此错误:
运行时错误:CUDA 内存不足。尝试分配 3.63 GiB(GPU 0;15.90 GiB 总容量;13.65 GiB 已分配;1.57 GiB 空闲;PyTorch 总共保留 13.68 GiB)
我在这里阅读了可能的解决方案,常见的解决方案是:
这是因为小批量数据不适合 GPU 内存。只需减少批量大小。当我为 cifar10 数据集设置批量大小 = 256 时,我遇到了同样的错误;然后我设置batch size=128,就解决了。
但就我而言,这是一个研究项目,我想拥有特定的超参数,我无法减少任何东西,例如批量大小。
有没有人对此有解决方案?
只要单个样本可以放入 GPU 内存,您就不必减少有效批量大小:您可以进行梯度累积。您可以累积多个小批量的梯度,并且只有在看到足够的示例时才更新权重,而不是在每次迭代后更新权重(基于从太小的小批量计算的梯度)。这个视频对此
进行了很好的解释。
实际上,您的训练代码看起来像这样。假设您的大批量大小为large_batch,但只能放入small_batchGPU 内存,因此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
Run Code Online (Sandbox Code Playgroud)
Shai 的回答是合适的,但我想提供另一种解决方案。最近,我一直在观察 Nvidia AMP - 自动混合精度的惊人结果,这是 fp16 与 fp32 优势的完美结合。一个积极的副作用是它也显着加快了训练速度。
在 tensorflow 中只有一行代码: opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
更多细节在这里
您还可以将 AMP 与 Shai 的解决方案叠加使用。