pytorch에서 학습 후 다시 재현하기 위해서는 random과 관련된 요소들의 randomness들을 제어해야한다.
1.pytorch의 random 제어
torch.manual_seed(random_seed) # cpu 연산 무작위 고정
torch.cuda.manual_seed(random_seed) # gpu 연산 무작위 고정
torch.cuda.manual_seed_all(random_seed) # 멀티 gpu 연산 무작위 고정
{ 다만 cuda함수를 사용하는 pytorch 함수들 중에 nondeterministic한 함수 존재 }
2. CuDNN은 random 제어
torch.backends.cudnn.deterministic=True
torch.backends.cudnn.benchmark=False
→ 위 코드를 사용 시 처리속도가 감소되는 문제가 발생한다. 실험 초기 단계 말고 실험을 대부분 완료하고 배포해야 하는 단계에 사용하자.
3. Numpy random 제어
np.random.seed(random_seed)
4. Python library random 제어
random.seed(random_seed)
( 참고 blog 링크 : https://hoya012.github.io/blog/reproducible_pytorch/ )
[ 적용시 ]
random.seed(config['seed'])
np.random.seed(config['seed'])
torch.manual_seed(config['seed'])
torch.cuda.manual_seed_all(config['seed'])