1 분 소요

TL;DR

실험 재현성을 위해 아래 함수를 코드 상단에 추가하고 실행하세요.

import os
import random
import numpy as np
import torch

def set_random_seed(seed=42):
    """
    실험 재현성을 위해 PyTorch, Numpy, Python 등의 랜덤 시드를 고정합니다.
    
    Args:
        seed (int): 고정할 시드 값
    """
    os.environ["PYTHONHASHSEED"] = str(seed)
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)  # if use multi-GPU

    # CuDNN 관련 설정
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

set_random_seed()

코드 상세 설명

  • random.seed(seed) & os.environ['PYTHONHASHSEED']: 파이썬 내장 random 모듈과 해시 함수의 무작위성을 제어합니다.
  • np.random.seed(seed): Numpy에서 사용하는 무작위 연산의 결과를 고정합니다. 데이터 전처리 등에 사용될 수 있습니다.
  • torch.manual_seed(seed): PyTorch의 CPU 연산에 대한 시드를 고정합니다.
  • torch.cuda.manual_seed(seed): 현재 사용 중인 GPU 연산에 대한 시드를 고정합니다.
  • torch.cuda.manual_seed_all(seed): 모든 GPU(Multi-GPU 환경)에 대한 시드를 고정합니다.
  • torch.backends.cudnn.deterministic = True: CuDNN 라이브러리가 사용하는 비결정적(non-deterministic) 알고리즘을 비활성화하여 결정적(deterministic)인 알고리즘만 사용하도록 합니다.
  • torch.backends.cudnn.benchmark = False: 이 값을 True로 설정하면 CuDNN이 내장된 벤치마크를 통해 현재 모델에 가장 적합하고 빠른 알고리즘을 동적으로 찾아줍니다. 하지만 이 과정에서 무작위성이 발생하므로, 재현성을 위해서는 False로 설정해야 합니다. (단, 속도가 저하될 수 있습니다.)

사용 시 참고사항

💡 Jupyter Notebook이나 Google Colab 환경에서는 스크립트 최상단이나, 모델 학습을 시작하기 직전의 셀에서 이 함수를 실행해주는 것이 가장 확실합니다. 여러 셀에 걸쳐 코드를 실행할 경우, 의도치 않게 시드가 초기화될 수 있기 때문입니다. 가장 좋은 습관은 학습 루프를 실행하기 바로 전에 호출하는 것입니다.