본문 바로가기

Pytorch

[Pytorch] 재생산성을 위한 랜덤설정 reproductibility, randomness control, seed

반응형

Pytorch에서는 초기화와 속도향상을 위해서 다양한 random함수들이 사용됩니다. 하지만 딥러닝 모델 학습을 재생산하거나 동일한 조건내에서 실험을 해야 할 경우, 이런 randomness를 컨트롤해줘야 할 필요가 있습니다.

# torch random 값 생성
torch.manual_seed(random_seed)
# 현 gpu에서의 random 값 생성 \ 
torch.cuda.manual_seed(random_seed)
# 2개 이상의 gpu를 사용할 때
torch.cuda.manual_seed_all(random_seed)
# randomness가 들어간 함수 미사용
torch.backends.cudnn.deterministic = True
# True일 시, 동일한 사이즈에 텐서들이 들어올때의 속도향상을 불러온다.
torch.backends.cudnn.benchmark = False
# numpy의 random seed 고정
np.random.seed(random_seed)
# random 라이브러리의 seed 고정
random.seed(random_seed)

multi gpu 사용시, dataloader에서 worker에 따른 random algorithm이 사용된다고 합니다. 아래 함수를 사용함으로써 해결할 수 있습니다.

def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    numpy.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(0)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker,
    generator=g,
)
반응형