requires_grad does not change the train/eval mode, but will avoid calculating the gradients for the affine parameters (weight and bias).
bn.train() and bn.eval() will change the usage of the running stats (running_mean and running_var).