cuda out of memory

显存足够,但是使用sovits推理的时候给我报了cudaout of memory,我3070的显卡,8g,使用原先可以推理的模型进行推理的,这次突然就不行了,如果说和之前有什么不一样,就是在搭建vits虚拟环境的时候,装pytorch一直卡在solving environment所以重装了好几次pytorch,本来想着放弃了,去推理sovits的模型,但是从此就爆了 哪位知道怎么办

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
  • 除此之外, 这篇博客: cuda out of memory(pytorch)问题的解决中的 修改过程 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    上述的(一)(二)(三)(四)都尝试了之后,未能解决我的程序的问题。
    我的程序报错的地方:
    在这里插入图片描述
    将其改为:
    在这里插入图片描述
    这一步不保存中间的梯度信息。
    继续报错:element 0 of tensors does not require grad and does not have a grad_fn
    继续改,原因是require_grad是False,改为True:train_loss = train_loss.requires_grad_(True)
    哦莫,就成了!喜大普奔!还是GPU跑得快啊!
    具体修改情况

  • 以下回答来自chatgpt:

    针对此问题,有以下解决方案:

    1. 减小batch size

    由于cuda out of memory的错误通常是由于显存不足引起的,因此可以尝试减小batch size来减少显存的使用量,具体做法是:

    batch_size = 4 # 可以尝试4或2等较小的batch size
    
    1. 减小模型复杂度

    如果batch size已经设得比较小,但仍然出现cuda out of memory的错误,那么可以考虑减小模型复杂度来减少显存的使用量,具体做法是:

    • 减小模型参数量,例如可以选择较小的模型或减少网络层数;
    • 减小embedding大小和隐藏状态的维度,例如将embedding和隐藏状态的维度减小为256或甚至更小;
    • 减少模型中的卷积、循环等计算量较大的操作,例如减少卷积核数量或减少时间步数等。

    • 清理GPU缓存

    在训练大型模型时,GPU的缓存会变得很大,而有时候缓存中的一些数据已经不再需要了,这时就需要清理缓存来节省显存。具体做法是:

    import torch
    torch.cuda.empty_cache() # 清理GPU缓存
    

    可以选择在每个epoch或每个batch结束时清理缓存,例如:

    for epoch in range(num_epochs):
        for batch in data_loader:
            # 训练代码
        torch.cuda.empty_cache() # 在每个epoch结束时清理缓存
    
    1. 使用半精度浮点数

    半精度浮点数(half precision)的精度比单精度浮点数(float precision)低,但占用的内存也减少了一半,因此可以尝试使用半精度浮点数来减少显存的使用量,具体做法是:

    model.half() # 将模型转为半精度浮点数
    

    需要注意的是,在使用半精度浮点数时需要确保模型参数不会出现溢出或欠精度的情况,否则会导致模型性能下降。

    1. 分批推理

    如果在推理时出现了cuda out of memory的错误,可以尝试将输入数据分成多个小批次来减少显存的使用量,具体做法是:

    outputs = []
    for i in range(0, len(inputs), batch_size):
        batch_inputs = inputs[i:i+batch_size]
        batch_outputs = model(batch_inputs)
        outputs.append(batch_outputs)
    outputs = torch.cat(outputs, dim=0) # 将多个小批次的输出合并起来
    

    需要注意的是,使用这种方法可能会增加计算时间,因为需要多次调用模型推理。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

1.看下后台,你有可能是后台某个程序或者其他占用了部分显存导致的之前刚好,这次不行了,如果是这种,可以停止掉这些后台,如果不知道怎么停的话,直接重启。
2.还有一种可能是,你改了某些代码导致就是显存不足,也是有这种可能的。你可以将输入大小改小一些,batch size啥的一起设置小一点看下。