Is there a difference between taking the the .grad from the inputs of the first module (if I set those to require gradient) and doing it via autograd.grad ?

The value will be the same but it is trickier to do with .backward() because you need to make sure to reset the value properly and saving in .grad a Tensor that requires gradient is not recommended.