학습을 할 때 어떨 때는 Accuracy가 잘 나오고 어떨 때는 안 나올 때 가 있다.
이번 포스트에서는 학습의 결과를 킵하고
다음번에도 이대로 나오게 하고 싶을 때 쓰는 방법들을 알아보려고 한다.
아래 링크에서 reproducibility 관련 pytorch documentation을 볼 수 있다.
https://pytorch.org/docs/stable/notes/randomness.html
사실 위 링크에 있는 것을 한글로 정리한 느낌으로 작성했다.
난수 고정
난수를 항상 다르게 뽑기 위해 random을 사용하지만 seed를 고정하여 항상 같은 수를 뽑게 할 수 있다.
pytorch나 numpy 라이브러리에서 사용되는 seed도 함께 고정해주어야 한다.
아래는 python, numpy, pytorch에서 모두 seed를 고정하는 예제이다.
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
Nondeterministic 한 알고리즘 피하기
CUDA 컨볼루션 작업에서 사용하는 cuDNN 라이브러리는 여러 컨볼루션 알고리즘을 실행하여
가장 빠른 알고리즘을 찾기 위해 벤치마킹한다.
벤치마킹 노이즈와 다른 하드웨어로 인해 동일한 시스템에서 실행을 해도 다른 알고리즘을 선택할 수 있기에
알고리즘을 deterministic 하게 선택하도록 해야 한다.
(하지만 성능이 저하될 수 있다.)
torch.backends.cudnn.benchmark = False
아래처럼 아예 에러를 일으키는 방법도 있다.
실행하는 함수가 deterministic 한 대안 없이 nondeterministic 한 경우 에러를 발생시킨다.
torch.use_deterministic_algorithms()
아래 pytorch 공식문서에서 설정에 영향을 받는 연산들을 확인할 수 있다.
DataLoader
Dataloader는 Multiprocess dataload 알고리즘에서 worker를 다시 시드 한다.
worker_init_fn()을 넣어서 reproducibility를 지킬 수 있다.
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,
)
'Studying > Machine Learning' 카테고리의 다른 글
[머신러닝] 자연어 처리 파이썬 모듈 (NLP Python module) (4) | 2022.08.03 |
---|---|
[머신러닝] 파이썬 정규 표현식 regex (1) | 2022.08.01 |
[머신러닝] Style transfer - 스타일 변환 (2) | 2022.07.27 |
[머신러닝] CIFAR-10 이미지 분류 - VGG-19 모델 (5) | 2022.07.25 |
[머신러닝] Local optimum이란? (0) | 2022.07.25 |
댓글