我认为对于 GPU 内存不足的 PyTorch 用户来说,这是一条很常见的信息:
RuntimeError: CUDA out of memory. Tried to allocate 😊 MiB (GPU 😊; 😊 GiB total capacity; 😊 GiB already allocated; 😊 MiB free; 😊 cached)
我尝试通过将每一层加载到 GPU 然后将其加载回来来处理图像:
for m in self.children():
m.cuda()
x = m(x)
m.cpu()
torch.cuda.empty_cache()
但它似乎不是很有效。我想知道在使用少量 GPU 内存的同时训练大型深度学习模型是否有任何提示和技巧。
torch.cuda.empty_cache()
不起作用。而是先禁用 GPU,然后重新启动内核,然后重新激活 GPU。这对我有用。
虽然
import torch
torch.cuda.empty_cache()
为清除占用的cuda内存提供了一个很好的选择,我们也可以通过使用手动清除未使用的变量,
import gc
del variables
gc.collect()
但是在使用这些命令之后,错误可能再次出现,因为pytorch实际上并没有清除内存,而是清除了对变量占用的内存的引用。因此,在重新启动内核并找到最佳的 batch_size 后减小 batch_size 是最好的选择(但有时不是一个非常可行的选择)。
另一种更深入地了解 gpu 中内存分配的方法是使用:
torch.cuda.memory_summary(device=None, abbreviated=False)
其中,两个参数都是可选的。这给出了内存分配的可读摘要,并允许您找出 CUDA 内存不足的原因并重新启动内核以避免再次发生错误(就像我在我的案例中所做的那样)。
迭代地传递数据可能会有所帮助,但改变网络层的大小或将它们分解也会被证明是有效的(因为有时模型也会占用大量内存,例如,在进行迁移学习时)。
只需减少批量大小,它就会起作用。在我训练时,它给出了以下错误:
CUDA 内存不足。尝试分配 20.00 MiB(GPU 0;10.76 GiB 总容量;4.29 GiB 已分配;10.12 MiB 空闲;PyTorch 总共保留 4.46 GiB)
而且我使用的批量大小为 32。所以我只是将其更改为 15,它对我有用。
将批次迭代地发送到 CUDA,并制作小批量。不要一开始就一次将所有数据发送到 CUDA。相反,请按以下方式进行:
for e in range(epochs):
for images, labels in train_loader:
if torch.cuda.is_available():
images, labels = images.cuda(), labels.cuda()
# blablabla
您还可以使用占用较少内存的 dtypes
。例如,torch.float16
或 torch.half
。
torch.cuda.empty_cache()
目前没有帮助。即使它可能应该...... :(
尽量不要把你的毕业生拖得太远。
当我试图总结所有批次的损失时,我得到了同样的错误。
loss = self.criterion(pred, label)
total_loss += loss
然后我使用 loss.item 而不是需要毕业生的损失,然后解决了问题
loss = self.criterion(pred, label)
total_loss += loss.item()
以下解决方案归功于 kaggle question 中的 yuval reina
此错误与 GPU 内存有关,而不是一般内存 => @cjinny 评论可能不起作用。你使用 TensorFlow/Keras 还是 Pytorch?尝试使用较小的批量大小。如果您使用 Keras,请尝试减少一些隐藏层大小。如果您使用 Pytorch:您是否一直将所有训练数据保存在 GPU 上?确保不要将毕业生拖得太远检查隐藏层的大小
大部分东西都涵盖了,还是会加一点。
如果 torch 给出错误为“试图分配 2 MiB”等,这是一个误导性消息。实际上,CUDA 耗尽了训练模型所需的总内存。您可以减少批量大小。比如说,即使批量大小为 1 不起作用(当您训练具有大量序列的 NLP 模型时发生),尝试传递较少的数据,这将帮助您确认您的 GPU 没有足够的内存来训练模型。
此外,如果您想重新训练模型,则必须再次完成垃圾收集和清理缓存部分。
有一些方法可以避免,但这当然取决于你的 GPU 内存大小:
迭代解包数据时在GPU中加载数据,
features, labels in batch:
features, labels = features.to(device), labels.to(device)
使用 FP_16 或单精度浮点数据类型。如果内存不足,请尝试减小批量大小。使用 .detach() 方法从 GPU 中删除不需要的张量。
如果以上所有都使用得当,PyTorch 库已经是高度优化和高效的。
按着这些次序:
减少训练,验证,测试数据减少批量大小{例如。 16 或 32} 减少模型参数的数量{例如。不到百万}
就我而言,当我在 kaggle 内核中训练通用语音数据集时,也会出现相同的错误。我将训练数据集减少到 20000,批量大小减少到 16,模型参数减少到 112K。
执行:
将图像批量输入 gpu。在训练或推理期间使用小批量。使用较小的图像尺寸调整输入图像的大小。
技术上:
大多数网络都过度参数化,这意味着它们对于学习任务来说太大了。因此,找到合适的网络结构可以帮助:
一个。使用模型压缩、网络修剪和量化等技术压缩您的网络。
湾。直接使用像mobileNetv1/2/3这样更紧凑的网络结构。
C。网络架构搜索(NAS)。
我有同样的错误,但通过使用以下行将图像的大小从 ~600 调整为 100 来修复它:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.Resize((100, 100)),
transforms.ToTensor()
])
虽然这看起来很奇怪,但我发现有许多会话在后台运行以进行协作,即使我们恢复出厂设置运行时或关闭选项卡也是如此。我通过单击菜单中的“运行时”然后选择“管理会话”来克服这个问题。我终止了所有不需要的会话,我很高兴。
我建议使用 PyTorch 的混合精度训练。它可以使训练更快,消耗更少的内存。
看看https://spell.ml/blog/mixed-precision-training-with-pytorch-Xuk7YBEAACAASJam。
现在有一个非常棒的库,它使这变得非常简单:https://github.com/rentruewang/koila
pip install koila
在您的代码中,只需用惰性包装输入:
from koila import lazy
input = lazy(input, batch=0)
pip install koila
仍然给我 ModuleNotFoundError: No module named 'koila'
,即使在 Restart and Run All 之后
which pip
、which python
、which python3
、which pip3
,看看你是如何运行你的 python 代码的,这应该可以说明发生了什么。
只要您不超过 32 的批量大小,就可以了。请记住刷新或重新启动运行时,否则即使您减少批量大小,您也会遇到相同的错误。我将批量大小设置为 16,它减少了训练期间出现的零梯度,并且模型更好地匹配了真实函数。而不是使用导致训练损失波动的 4 或 8 的批量大小,而不是
我遇到了同样的错误,我的 GPU 是 GTX1650,具有 4g 显存和 16G ram。当我将batch_size减少到3时它对我有用。希望这可以帮助你
我遇到了同样的问题,并通过使用代码 11.3 将 PyTorch 版本从 1.10.1 降级到 1.8.1 来解决它。就我而言,我使用的是 GPU RTX 3060,它仅适用于 Cuda 11.3 或更高版本,当我安装 Cuda 11.3 时,它附带了 PyTorch 1.10.1。所以我降级了 PyTorch 版本,现在它工作正常。
$ pip3 install torch==1.8.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
2-您也可以通过减少火车批量大小来检查。
最好的方法是降低批量大小。通常它会起作用。否则试试这个:
import gc
del variable #delete unnecessary variables
gc.collect()
This gives a readable summary of memory allocation and allows you to figure the reason of CUDA running out of memory
。我打印了torch.cuda.memory_summary()
调用的结果,但似乎没有任何信息可以导致修复。我看到Allocated memory
、Active memory
、GPU reserved memory
等行。我应该查看什么,我应该如何采取行动?