본문 바로가기

기록

[Pytorch] 학습 과정에서의 Randomness 제어하기 (seed 고정하기)

  딥러닝 실험을 진행 할 때에는 신경을 써야할 변수가 많다. 하지만 그 중 가장 중요한 것은 변인통제라고 생각한다. 예를 들어 데이터가 들어가는 순서만 바뀌어도 모델의 성능은 바뀌게 된다. 이런 문제를 제어하고 실험을 재현 가능하게 하기 위해서 고려 해야하는 사항들을 살펴보자.

 

최종 코드

  우선 최종 코드부터 적어두겠다. 아래의 코드를 사용하면 (deterministic은 True) 같은 실험을 반복해도 재현이 보장된다.

import random
import numpy as np
import torch

seed = 2021
deterministic = True

random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
if deterministic:
	torch.backends.cudnn.deterministic = True
	torch.backends.cudnn.benchmark = False

 

 

 

1. Python 자체의 random seed를 고정

random.seed(seed)

 

2. Numpy Library 의 random seed를 고정해준다.

np.random.seed(seed)

 

3. Pytorch의 random seed를 고정해준다.

torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

 

4. cudnn의 random seed를 고정해준다.

if deterministic:
	torch.backends.cudnn.deterministic = True
	torch.backends.cudnn.benchmark = False

  cudnn random seed를 고정하게 될 경우 학습 속도가 느려진다는 단점이 있다. 나의 경우는 정확한 모델 성능 재현이 필요한 상황이 아니면 cudnn은 제외하고 나머지 seed만 고정하고 사용한다.