[`CVT`] Fix module initialization issue
Author: younesbelkada
Pull request: yes

# What does this PR do?

This PR fixes the issue described in the PR https://github.com/huggingface/transformers/pull/20803 and this comment: https://github.com/huggingface/transformers/pull/20803#discussion_r1059138540 for `CVT`

Before this PR if a user wants to initialize CVT model in half precision with the example script below they will encounter an issue that is hard to interpret: 
```
from transformers import AutoFeatureExtractor, CvtForImageClassification
from PIL import Image
import requests
import torch

url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)

feature_extractor = AutoFeatureExtractor.from_pretrained('microsoft/cvt-13')
model = CvtForImageClassification.from_pretrained('microsoft/cvt-13', torch_dtype=torch.float16).to(0)

inputs = feature_extractor(images=image, return_tensors="pt").to(0, torch.float16)
outputs = model(**inputs)
logits = outputs.logits
# model predicts one of the 1000 ImageNet classes
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])
```
Error message:
```
RuntimeError: "erfinv_vml_cpu" not implemented for 'Half'
```
The reason of the error is described in https://github.com/huggingface/transformers/pull/20803#discussion_r1059138540 
Therefore this PR circumvent this issue by forcing the `cls_token` module to be initialized on the correct place. 
All slow tests pass

cc @sgugger @ydshieh  

If this PR gets merged, there should be no more modules in `transformers` that will be initialized with `trunc_normal_` outside `init_weights` method

Comments:
_The documentation is not available anymore as the PR was closed or merged._

Regardless of anything else, the initialization should always be done in `_init_weights`. This is the reason we have many flaky failures with tests that check slow/fast init give the same results for instance.

Thanks everyone for double checking! 


Here is another explanation on why we should centralise weights initialization under `init_weights` (i.e. a more condensed explanation of https://github.com/huggingface/transformers/pull/20803#discussion_r1059138540 for anyone that wants to know more about the problem)

Regardless if you are in a GPU or CPU, `from_pretrained`[ calls `model = cls(config, *model_args, **model_kwargs) `  at some point under the hood,](https://github.com/huggingface/transformers/blob/b9403e951661b53630afd95166874f75ede885c4/src/transformers/modeling_utils.py#L2360) (i.e. calls `model.__init__`) that will sequentially call `__init__` functions of each submodule of the model. This is called on CPU, sometimes on `meta` if `device_map` is enabled.

Before this PR, this caused calling `trunc_normal` for `CVT` from `torch.nn` that is not supported under `fp16`.

Since `init_weights` is not called by `from_pretrained` - ([`_fast_init` is always set to `True`](https://github.com/huggingface/transformers/blob/b9403e951661b53630afd95166874f75ede885c4/src/transformers/modeling_utils.py#L2002) so `transformers` models never calls `init_weights` if `from_pretrained` is called, except if a user forces to do so - but there is no benefit doing it), we should centralise all weights initialization inside this function, therefore avoid calling this function when it is not needed.