我遇到了经典:CUDA内存不足。

我想做什么:我想每次使用不同的嵌入矩阵加载相同的模型。我必须这样做300次,对于单词嵌入的每个维度而言,一次。

我没有训练模型,这就是为什么我使用model.eval(),我认为这足以阻止Pytorch创建图形。

请注意,我从未将模型或数据传递给cuda。实际上,我想在发送要由GPU执行的代码之前使用cpu调试代码。

下面的循环执行一次,在第二次迭代中引发RuntimeError

我的猜测是,代码在每次迭代时都会将新模型加载到GPU内存中(我不知道是否有可能明确指出这样做)。 emb_matrix很重,可能会导致GPU内存崩溃。

emb_dim = 300
acc_dim = torch.zeros((emb_dim, 4))
for d in range(emb_dim):

    #create embeddings with one dimension shuffled
    emb_matrix = text_f.vocab.vectors.clone()

    #get a random permutation across one of the dimensions
    rand_index = torch.randperm(text_f.vocab.vectors.shape[0])
    emb_matrix[:, d] =  text_f.vocab.vectors[rand_index, d]

    #load model with the scrumbled embeddings
    model = load_classifier(emb_matrix,
                            encoder_type = encoder_type)
    model.eval()
    for batch in batch_iters["test"]:
        x_pre = batch.premise
        x_hyp = batch.hypothesis
        y = batch.label

        #perform forward pass
        y_pred = model.forward(x_pre, x_hyp)

        #calculate accuracies
        acc_dim[d] += accuracy(y_pred, y)/test_batches

        #avoid memory issues
        y_pred.detach()

    print(f"Dimension {d} accuracies: {acc_dim[d]}")

我收到以下错误:RuntimeError: CUDA out of memory. Tried to allocate 146.88 MiB (GPU 0; 2.00 GiB total capacity; 374.63 MiB already allocated; 0 bytes free; 1015.00 KiB cached)
我尝试将模型和数据传递给CPU,但是却遇到了完全相同的错误。

我四处寻找解决问题的方法,但是找不到明显的解决方案。欢迎提供有关如何在正确的位置加载模型和数据,或在每次迭代后如何清洁GPU内存的任何建议。

最佳答案

看来acc_dim累积了毕业史-请参阅https://pytorch.org/docs/stable/notes/faq.html

因为只进行推断,所以应使用with torch.no_grad():
这将完全避免累积毕业史的可能问题。
model.eval()不会阻止Grad簿记的发生,它只是切换某些层的行为,例如辍学。 model.eval()with torch.no_grad():一起应用于推断。

关于python - RuntimeError : CUDA out of memory. Problem when re-loading the model in a loop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55800592/

10-17 00:39