PyTorch运行时错误:CUDA内存不足。试图分配14.12吉布

PyTorch运行时错误:CUDA内存不足。试图分配14.12吉布,pytorch,Pytorch,对于一个简单的完全连接层模型,我遇到了Cuda内存不足错误。我试过torch.cuda.empty\u cache()和gc.collect()。此外,我还通过del删除了不必要的变量,并尝试减少批量大小。但错误并没有得到解决。此外,该错误仅出现在使用1440个测试图像进行评估的SUN数据集上。但该代码对于测试图像数为7913的AWA2数据集运行良好。我在这里使用谷歌colab。我也用过RTX2060。 以下是代码段,其中出现错误: def euclidean_dist(x, y): #

对于一个简单的完全连接层模型,我遇到了Cuda内存不足错误。我试过
torch.cuda.empty\u cache()
gc.collect()
。此外,我还通过
del
删除了不必要的变量,并尝试减少批量大小。但错误并没有得到解决。此外,该错误仅出现在使用1440个测试图像进行评估的SUN数据集上。但该代码对于测试图像数为7913的AWA2数据集运行良好。我在这里使用谷歌colab。我也用过RTX2060。 以下是代码段,其中出现错误:

def euclidean_dist(x, y):
    # x: N x D
    # y: M x D
    torch.cuda.empty_cache()
    n = x.size(0)
    m = y.size(0)
    d = x.size(1)
    assert d == y.size(1)
    x = x.unsqueeze(1).expand(n, m, d)
    y = y.unsqueeze(0).expand(n, m, d)
    del n,m,d
    return torch.pow(x - y, 2).sum(2)

def compute_accuracy(test_att, test_visual, test_id, test_label):
    global s2v
    s2v.eval()
    with torch.no_grad():
        test_att = Variable(torch.from_numpy(test_att).float().to(device))
        test_visual = Variable(torch.from_numpy(test_visual).float().to(device))
        outpre = s2v(test_att, test_visual)
        del test_att, test_visual
        outpre = torch.argmax(torch.softmax(outpre, dim=1), dim=1)
    
    outpre = test_id[outpre.cpu().data.numpy()]
    
    #compute averaged per class accuracy
    test_label = np.squeeze(np.asarray(test_label))
    test_label = test_label.astype("float32")
    unique_labels = np.unique(test_label)
    acc = 0
    for l in unique_labels:
        idx = np.nonzero(test_label == l)[0]
        acc += accuracy_score(test_label[idx], outpre[idx])
    acc = acc / unique_labels.shape[0]
    return acc   
错误是:

Traceback (most recent call last):   File "GBU_new_v2.py", line 234, in <module>
    acc_seen_gzsl = compute_accuracy(attribute, x_test_seen, np.arange(len(attribute)), test_label_seen)   File "GBU_new_v2.py", line 111, in compute_accuracy
    outpre = s2v(test_att, test_visual)   File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)   File "GBU_new_v2.py", line 80, in forward
    a1 = euclidean_dist(feat, a1)   File "GBU_new_v2.py", line 62, in euclidean_dist
    return torch.pow(x - y, 2).sum(2)#.sqrt() # return: N x M RuntimeError: CUDA out of memory. Tried to allocate 14.12 GiB (GPU 0;
15.90 GiB total capacity; 14.19 GiB already allocated; 669.88 MiB free; 14.55 GiB reserved in total by PyTorch)
Traceback(最近一次调用last):文件“GBU_new_v2.py”,第234行,在
acc_seen_gzsl=计算精度(属性,x_测试,np.arange(len(属性)),测试标签)文件“GBU new_v2.py”,第111行,计算精度
outpre=s2v(测试附件,测试可视化)文件“/usr/local/lib/python3.6/dist packages/torch/nn/modules/module.py”,第550行,在调用中__
结果=self.forward(*输入,**kwargs)文件“GBU_new_v2.py”,第80行,在forward中
a1=欧几里德分布图(feat,a1)文件“GBU新分布图v2.py”,第62行,欧几里德分布图
return torch.pow(x-y,2).sum(2)#.sqrt()#return:nx M运行时错误:CUDA内存不足。试图分配14.12 GiB(GPU 0;
15.90 GiB总容量;14.19 GiB已分配;669.88 MiB空闲;PyTorch共预留14.55 GiB)

您似乎只为培训定义了批,而在测试期间,您试图同时处理整个测试集。

您应该将测试集拆分为更小的“批次”,并一次评估一个批次,以将最后的所有批次分数合并为模型的一个分数。

似乎您只为培训定义了批次,而在测试期间,您尝试同时处理整个测试集。

您应该将测试集拆分为更小的“批”然后一次评估一个批次,将最后的所有批次分数合并为模型的一个分数。

但是对于我提到的更大的测试数据集,代码运行得非常完美,尽管我将尝试您提到的过程。@TownimFaisal不同数据集中的图像大小是多少?您应该查看两个数据集的
test_att
test_visual
的整个
shape
?在Awa2数据集中,test_att是(7913,85),test_visual是(79132048)。对于Sun数据集,test_att为(1440102),test_visual为(14402048)。Sun数据集出现问题。@TownimFaisal在Awa2之后运行Sun时是否发生错误?如果你颠倒顺序会发生什么?如果你只测试太阳会发生什么?在测试Awa2和SUN之前和之后,您能否获得内存使用情况报告()?谢谢,这是主要原因。我还需要制作一批测试图像。但是对于我提到的更大的测试数据集,代码运行得非常完美,尽管我将尝试您提到的过程。@TownimFaisal不同数据集中的图像大小是多少?您应该查看两个数据集的
test_att
test_visual
的整个
shape
?在Awa2数据集中,test_att是(7913,85),test_visual是(79132048)。对于Sun数据集,test_att为(1440102),test_visual为(14402048)。Sun数据集出现问题。@TownimFaisal在Awa2之后运行Sun时是否发生错误?如果你颠倒顺序会发生什么?如果你只测试太阳会发生什么?在测试Awa2和SUN之前和之后,您能否获得内存使用情况报告()?谢谢,这是主要原因。我需要使测试图像批也。