I followed your instructions however I cannot make it reproduce the same results.
This is the function that is called after each time I initialize my network (and before dataloaders):
def set_seed(seed):
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    np.random.seed(seed)
    random.seed(seed)

So each time before starting the train loop my code looks like this:
network = network.cuda() if use_cuda else network
set_seed(0)
train_loader = torch.utils.data.DataLoader(train_set, num_workers=0, batch_size=run.batch_size, shuffle=True, worker_init_fn=np.random.seed(0))
set_seed(0)
valid_loader = torch.utils.data.DataLoader(valid_set, num_workers=0, batch_size=run.batch_size, shuffle=True, worker_init_fn=np.random.seed(0))