When rank0 validates the model, what do other ranks do? Exit or proceed to the next training phase? And what error did you see?
I am assuming other ranks proceed to the next training phase and then timeout during DDP backward pass. If this is the case, yep, you can try use a dist.barrier() to sync, like:
for _ in range(...):
    train()
    if rank == 0:
        validate()
    dist.barrier()

If you still hit timeout at barrier, you can try setting the timeout arg in init_process_group to a larger value.