PyTorch 실험 재현성을 위한 Random Seed 고정 방법
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 환경에서는 스크립트 최상단이나, 모델 학습을 시작하기 직전의 셀에서 이 함수를 실행해주는 것이 가장 확실합니다. 여러 셀에 걸쳐 코드를 실행할 경우, 의도치 않게 시드가 초기화될 수 있기 때문입니다. 가장 좋은 습관은 학습 루프를 실행하기 바로 전에 호출하는 것입니다.