Enable SFT script to do multi-round/epoch training 
**Is your feature request related to a problem? Please describe.**

In the current SFT training script, it runs for 1 epoch with the given max_step number, the max_epoch does not matter as the script generates a temp data file according to the max_step and runs through it. But in some applications, it is desirable to build a multi-epoch baseline for comparison purpose (e.g. for comparing a 5-round (1 epoch per round) federated learning result against a 5-epoch centralized training with the same number of steps per epoch). Currently this cannot be done, since the data used are not the same: 1-epoch-1000-step is not equivalent to 5-epoch-200-step due to the difference in the actual data being sampled.

**Describe the solution you'd like**

I wonder if we could enable multi-epoch training for SFT: the per-epoch data will be specified by max_step (or call it step_per_epoch). 

**Describe alternatives you've considered**

An "explicit" implementation of multi-round training will further be helpful: instead of calling .fit() once, something like below will really help easy-transition to FL:
for round in range(K):
    #necessary state loading
    trainer.fit(model)
    #necessary state saving

**Additional context**

Add any other context or screenshots about the feature request here.
