(EDIT 4)
That makes sense, actually. What do you think about my last edit(s)? (i.e. replacing x and x.grad with x.data and x.grad.data, respectively?)
CODE:

def helper(x):
return 2 * x[0] + 3 * x[1]**2
x = autograd.Variable(torch.FloatTensor([1, 2]), requires_grad=True)
total = autograd.Variable(torch.FloatTensor([0]))
for i in range(3): # number of epochs
print("iteration: " + str(i))
total += helper(x)
total.backward()
x -= 0.1 * x.grad
print(x.grad[0], x.grad[1]) # never gets here

OUTPUT:
at x -= 0.1 * x.grad:
RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.