The problem is that you created 2 tensors that have no grad function by calling the clone operation on the .data.grad tensor.
Below is a simplified, working example:
a = torch.tensor([-2.], requires_grad=True)
b = torch.tensor([-2.], requires_grad=True)


for i in range(1):

    var_loss = torch.tensor(a/b)
    var_loss.backward()
    a.grad.zero_()
    b.grad.zero_()


print("done")

No, to illustrate your code implementation in the context of this simplified example above, consider the following:
a = torch.tensor([-2.], requires_grad=True)
b = torch.tensor([-2.], requires_grad=True)


for i in range(1):

    var_loss = torch.tensor(a/b)
    var_loss.backward()
    
    gr_b = b.grad.clone()
    gr_a = a.grad.clone()
    
    a.grad.zero_()
    b.grad.zero_()
    
    var_loss2 = torch.tensor(gr_b/gr_a)
    var_loss2.backward()

print("done")

This code example would now fail with the same error message you got at var_loss2.backward() due to the missing grad_fn. How to fix this is by setting requires_grad=True for gr_b and gr_a:
gr_b = torch.tensor(b.grad.clone(), requires_grad=True)
gr_a = torch.tensor(a.grad.clone(), requires_grad=True)