In a lot of use cases training a complete epoch takes a lot of more time than reinitializing the worker processes, so that the epoch start could be ignored.
It’s probably an edge case, but you could also manipulate some arguments of the DataLoader itself or the underlying Dataset between epochs.
However, if this behavior is the bottleneck in your code, you might try to e.g. increase the length of your Dataset artificially (__len__ could return multiple epochs and in __getitem__ you could use the % operator) or warm-up the next iterator via loader_iter2 = iter(train_loader) during one of the last iterations of your training.