RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [1, 64, 7, 7]]

Viewed 332

Trying to figure out errors with multiple grads. Each time i run the code, the 'expected version' changes. Also, the error triggers after 53 iterations of the program running, leaving me at a loss of understanding of why it will work for the first iterations but keep stalling on the 52-55th.

I am using retain_graph=True so it must not be coming from that but I just cant seem to figure out the issue. Thanks in advance.

for epoch in range(0, epoch_num):
    net.train()

    for i, data in enumerate(music_dataloader):
        torch.autograd.set_detect_anomaly(True)
        ite = ite + 1
        ite_num4val = ite_num4val + 1
        real_a, real_b, real_mixed = data['bar_a'], data['bar_b'], data['bar_mixed']
        real_a = torch.FloatTensor(real_a)
        real_b = torch.FloatTensor(real_b)
        real_mixed = torch.FloatTensor(real_mixed)

        if torch.cuda.is_available():
            real_a = real_a.cuda()
            real_b = real_b.cuda()
            real_mixed = real_mixed.cuda()

        # zero the parameter gradients
        optimizer_GA2B.zero_grad()
        optimizer_GB2A.zero_grad()
        optimizer_DA.zero_grad()
        optimizer_DB.zero_grad()
        optimizer_DA_all.zero_grad()
        optimizer_DB_all.zero_grad()

        c_loss, DA_real, DB_real, DA_fake, DB_fake, DA_fake_sample, DB_fake_sample, DA_real_all, DB_real_all, DA_fake_all, DB_fake_all = net(
            real_a, real_b, real_mixed)

        # Generator loss
        g_A2B_loss = l1loss(DB_fake, torch.ones_like(DB_fake)) + c_loss
        g_B2A_loss = l1loss(DA_fake, torch.ones_like(DA_fake)) + c_loss
        g_loss = g_A2B_loss + g_B2A_loss - c_loss

        # Discriminator loss
        d_A_loss_real = l2loss(DA_real, torch.ones_like(DA_real))
        d_A_loss_fake = l2loss(
            DA_fake_sample, torch.zeros_like(DA_fake_sample))
        d_A_loss = (d_A_loss_real + d_A_loss_fake) / 2
        d_B_loss_real = l2loss(DB_real, torch.ones_like(DB_real))
        d_B_loss_fake = l2loss(
            DB_fake_sample, torch.zeros_like(DB_fake_sample))
        d_B_loss = (d_B_loss_real + d_B_loss_fake) / 2
        d_loss = d_A_loss + d_B_loss

        d_A_all_loss_real = l2loss(DA_real_all, torch.ones_like(DA_real_all))
        d_A_all_loss_fake = l2loss(DA_fake_all, torch.zeros_like(DA_fake_all))
        d_A_all_loss = (d_A_all_loss_real + d_A_all_loss_fake) / 2
        d_B_all_loss_real = l2loss(DB_real_all, torch.ones_like(DB_real_all))
        d_B_all_loss_fake = l2loss(DB_fake_all, torch.zeros_like(DB_fake_all))
        d_B_all_loss = (d_B_all_loss_real + d_B_all_loss_fake) / 2
        d_all_loss = d_A_all_loss + d_B_all_loss
        D_loss = d_loss + gamma * d_all_loss
        
        d_A_loss.backward(retain_graph=True)
        d_B_loss.backward(retain_graph=True)

        g_A2B_loss.backward(retain_graph=True)
        g_B2A_loss.backward(retain_graph=True)


        d_A_all_loss.backward(retain_graph=True)
        d_B_all_loss.backward()

        optimizer_GA2B.step()
        optimizer_GB2A.step()
        optimizer_DA.step()
        optimizer_DB.step()
        optimizer_DA_all.step()
        optimizer_DB_all.step()

        g_running_loss += g_loss.data.item()
        d_running_loss += D_loss.data.item()

        del DA_real, DB_real, DA_fake, DB_fake, DA_fake_sample, DB_fake_sample, DA_real_all, DB_real_all, DA_fake_all, DB_fake_all
        del g_A2B_loss, g_B2A_loss, g_loss, d_A_loss_real, d_A_loss_fake, d_A_loss, d_B_loss_real, d_B_loss_fake, d_B_loss, d_loss, d_A_all_loss_real, d_A_all_loss_fake, d_A_all_loss, d_B_all_loss_real, d_B_all_loss_fake, d_B_all_loss, d_all_loss, D_loss

        print("[epoch: %3d/%3d, batch: %5d/%5d, ite: %d] Generator : %3f, Discriminator : %3f " % (
            epoch +
            1, epoch_num, (i + 1) *
            batch_size_train, train_num, ite, g_running_loss / ite_num4val,
            d_running_loss / ite_num4val))

        if ite % save_frq == 0:
            torch.save(net, model_dir + model_name + "_itr_%d_G_%3f_D_%3f.pth" % (
                ite, g_running_loss / ite_num4val, d_running_loss / ite_num4val))
            g_running_loss = 0.0
            d_running_loss = 0.0
            net.train()
            ite_num4val = 0
<ipython-input-43-b3abb9101fab> in <module>
    132         D_loss = d_loss + gamma * d_all_loss
    133 
--> 134         d_A_loss.backward(retain_graph=True)
    135         d_B_loss.backward(retain_graph=True)
    136 

/software/python3/3.9.5/lib/python3.9/site-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph, inputs)
    243                 create_graph=create_graph,
    244                 inputs=inputs)
--> 245         torch.autograd.backward(self, gradient, retain_graph, create_graph, inputs=inputs)
    246 
    247     def register_hook(self, hook):

/software/python3/3.9.5/lib/python3.9/site-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)
    143         retain_graph = create_graph
    144 
--> 145     Variable._execution_engine.run_backward(
    146         tensors, grad_tensors_, retain_graph, create_graph, inputs,
    147         allow_unreachable=True, accumulate_grad=True)  # allow_unreachable flag

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [1, 64, 7, 7]] is at version 53; expected version 25 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!
0 Answers
Related