[trainer] implement support for full fp16 in evaluation/predict
This PR allows users to use `model.half()` in evaluation/predict, which may or may not deliver results identical to fp32 eval. The outcome depends on how the model was trained and the application. e.g. if I use `--label_smoothing` with t5-small I get `eval loss = nan`, but bleu scores are exactly the same as with fp32.

### Need

Besides users asking for it in the past, the real need that prompted me to implement this is based on this Issue:  https://github.com/huggingface/transformers/issues/10161. To explain - DeepSpeed trains in fp16, while keeping master copy of fp32 weights on cpu, which allows fitting a model like t5-11b (45GB in params) onto a 40GB gpu (only 22.5GB in fp16). But then the user wants to eval and deepspeed is of no use here at the moment. So we need to give a way to users to run full fp16 in eval, which is what this PR proposes.

This PR:
* [x] adds `is_in_train` public Trainer attribute which helps to tell whether `evaluation` is running on its own, or called from `train`
* [x] adds `--fp16_full_eval` to enable the full fp16 mode under eval/predict (while `full-fp16` would read better, I picked the name starting with `--fp16_` to align/group well with other3 `--fp16_*` args.
* [x] adds the first test that measures gpu mem deltas - let's hope it proves to work across different gpus 

The logic is a bit tricky since we must not `model.to(device)` before `model.half()` or otherwise the model loading will OOM, but I hope I was able to keep it simple and not error-prone. Perhaps instead of replaying `place_on_device` logic at the end of `train` in the deepspeed clean up section - it'd be better to re-play the full logic in the `predict_loop`? So that each stage can decide at its beginning how and when to put the model on device. 

A few small related fixes:
* [x] fixes `_wrap_model` to do nothing under deepspeed
* [x] fixes `--fp16` help to remove apex-only comment, as it's outdated.

Questions:
* [ ] Should I add a log, saying that half is used at `model.half()` activation
* [ ] I put it inside `prediction_step` which seems to be the right place, it won't run if it's a re-entrant eval-inside-train
* [ ] as the `inputs` are `ints` I don't think we need to switch them to `half()` as well.

@sgugger 