본문 바로가기
Studying/Machine Learning

[머신러닝] 학습의 Reproducibility를 위한 설정

by giem 2022. 8. 9.
반응형

학습을 할 때 어떨 때는 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 공식문서에서 설정에 영향을 받는 연산들을 확인할 수 있다.

https://pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html#torch.use_deterministic_algorithms

 

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,
)

 

 

반응형

댓글