I’m not sure, if registering a backward hook in the modules would be triggered before the gradients are accumulated, so the zero gradients might be expected.
Could you check the .grad attributes of all parameters directly via:
for param in model.parameters():
    param.register_hook(lambda grad: print(grad))

instead?