To make it working w/o much change, add create_graph=True, retain_graph=True to the backward call.
However, a more efficient way is:
gradspred, = autograd.grad(ypred, inp, 
                           grad_outputs=ypred.data.new(y_pred.shape).fill_(1),
                           create_graph=True)
loss = ...
loss.backward()