Preprocess/transform logits before gathering them for computing metrics.
### Feature request

In `trainer.evaluation_loop`, `preprocess_logits_for_metrics` should be executed before `_nested_gather` to avoid GPU OOM.

### Motivation

`preprocess_logits_for_metrics` processes logits after gathering them when do distributed learning. When training with large batch_size, token_length or vocab_size, gathering all logits to 1 node will cause to out of GPU memory. This preprocessing should be executed before `_nested_gather`.

### Your contribution

The main modification would be this in `trainer.evaluation_loop`:
```
           if logits is not None:
                logits = self._pad_across_processes(logits)
                if self.preprocess_logits_for_metrics is not None:
                    logits = self.preprocess_logits_for_metrics(logits, labels)
                logits = self._nested_gather(logits)
                preds_host = logits if preds_host is None else nested_concat(preds_host, logits, padding_index=-100)
```
As replied on the PR, this is incorrect. You should probably use a custom training loop powered by Accelerate to be able to move the logits when you want.