I think all your questions have been answered by others except for -
" but why a tensor’s grad is populated when it does not require gradient?"
I assume that you mean
why would a tensor’s grad be populated when it's requires_grad() is False?
The answer is that a tensor’s grad is not populated when it’s requires_grad() is False.

x = torch.tensor(1.0, requires_grad = True)
y = torch.tensor(2.0)
z = x * y
w = torch.tensor(3.0).requires_grad_(False)
o = z*w
o.backward()
for i, name in zip([x, y, z, w], “xyzw”):
print(f"{name}\ndata: {i.data}\nrequires_grad: {i.requires_grad}\ngrad: {i.grad}\ngrad_fn: {i.grad_fn}\nis_leaf: {i.is_leaf}\n")

In the above example you would see that w has is_leaf True but it’s requires_grad is False as a result its grad is None after applying the .backward().
Which means that requires_grad is more powerful than is_leaf and the gradients are not calculated w.r.t w even if is_leaf is True, because requires_grad is False.