Fix gradient checkpointing + fp16 autocast for most models
# What does this PR do?

This PR fixes a bug users can encounter when using gradient checkpointing under fp16 autocast context manager. Currently if a user trains a model using autocast and GC the last layer's weights will never get updated. 

<details><summary>Handy reproducible snippet</summary>

```python
import torch
from transformers import AutoModelForCausalLM

model_id = "facebook/opt-350m"

model = AutoModelForCausalLM.from_pretrained(model_id).to(0)
model.gradient_checkpointing_enable()
model.train()

assert model.training and model.is_gradient_checkpointing

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
with torch.cuda.amp.autocast(True, dtype=torch.float16):
    dummy_input = torch.LongTensor([[0, 1, 0, 1]]).to(0)
    model.train()
    logits = model(dummy_input).logits
    loss = logits.sum()

    loss.backward()
    optimizer.step()

    for n, param in model.named_parameters():
        if param.grad is None:
            print(n)
```
</details>

As discussed internally, the fix seems to be to force-set `use_reentrant=False` when calling the gradient checkpointing. Putting that boolean to False lifts the restriction that the input tensors initially need to have if `use_reentrant=True` - according to PT team  `use_reentrant=True` led to some silent bugs and they are planning to remove that boolean in the next releases and use `False` by deafault.

This might be problematic for users that train adapters (using PEFT for example) where they will see some training performance downside. I propose a PoC to fix this for most common architectures until PyTorch remove that support for the next releases.

For more context, users that train models using PEFT end up using autocast inside the trainer as they use 4bit / 8bit base models


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