Add `Trainer.end` (#48875)
* Add Trainer.end
Nothing tears down the process group the Trainer set up through accelerate, so every distributed
run warns at exit. It cannot happen at the end of train(): evaluate, predict, save_model and
push_to_hub all need the group, so the teardown belongs at the end of the script.
* Call trainer.end() in the pytorch examples