Add `torch_dtype` attribute
# What does this PR do?

Disclaimer: Maybe there is a more canonical way to retrieve the `torch_dtype` of a loaded model !

I propose to add the attribute `torch_dtype` inside `PreTrainedModel` so that it can be conveniently retrieved. Useful for example for `peft` where I see this solution as one of the possible solution to fix forward pass issues in half-precision for `PrefixTuning` models.

To provide more context, the prefix tuning models feed to the base model [new `past_key_values`](https://github.com/huggingface/peft/blob/main/src/peft/tuners/prefix_tuning.py#L103-L109). Those are computed by default in `float32` (and should always stay in `float32`). However, if the base model is in half-precision, the forward pass would fail (`dtype` mismatch errors). This PR would make the retrieving process of the base model's `dtype` super easy, thus handling this error.

cc @sgugger @pacman100 
The `torch_dtype` in the config can't be used for that? <|||||>I don't think so because sometimes (and very often) you load `fp32` models from the Hub, and not all models on the Hub have the `torch_dtype` attribute<|||||>Also there is this : 
```python 
    @property
    def dtype(self) -> torch.dtype:
        """
        `torch.dtype`: The dtype of the module (assuming that all the module parameters have the same dtype).
        """
        return get_parameter_dtype(self)
```
but maybe all the parameters do not have the same dtype? 
<|||||>Ah that works! Thanks for the pointer! I should have digged further :D<|||||>_The documentation is not available anymore as the PR was closed or merged._