전공관련/Deep Learning

[Pytorch] 학습 재현을 위해 seed를 고정하자

매직블럭 2024. 4. 29. 16:56

학습을 수행하다보면 이전 학습 결과 재현이 필요한 경우가 있다.

 

일반 적인 경우는 다양한 난수로 인해 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