[Pytorch] 학습 재현을 위해 seed를 고정하자
학습을 수행하다보면 이전 학습 결과 재현이 필요한 경우가 있다.
일반 적인 경우는 다양한 난수로 인해 random 값이 달라지기 때문에 재현이 불가능하다.
그래서 실험을 위한 학습에서는 난수의 시드를 고정 할 필요가 있다.
그러나 은근히 이게 고정하게 많아서 이참에 정리.
1. pytorch seed 고정
- 파이토치 기본 난수에 영향을 줌. 초기값 등에 영향을 줌
- torch.manual_seed(val)
2. CUDA seed 고정
- GPU 에서 동작하는 난수에 영향을 줌
- torch.cuda.manual_seed(val)
- torch.cuda.manual_seed_all(val)
3. numpy seed 고정
- numpy 난수에 영향을 줌.
- Albumentations 의 random도 numpy seed에 영향을 받(는것으로 알고있는데 확인필요)
- np.random.seed(val)
4. python random seed 고정
- 파이썬 기본 난수에 영향을 줌
- random.seed(val)
5. cudnn deterministic 옵션
- CUDA 에서 conv 등의 일부 연산은 deterministic 하여 동일입력, 시드에서도 다른 결과 발생 가능
- 이 옵션을 True로 설정하면 더 느릴수 있지만 결과값은 결정적
- torch.backends.cudnn.deterministic = True
- 이 옵션을 False로 설정하면 런타임 연산 최적화를 수행하지 않고 일관된 연산 수행
- torch.backends.cudnn.benchmark = False
[ 정리 ]
import torch
import numpy as np
import random
def set_seed(val):
torch.manual_seed(val)
torch.cuda.manual_seed(val)
torch.cuda.manual_seed_all(val) # 멀티 GPU를 사용하는 경우
np.random.seed(val)
random.seed(val)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False