Code Reproduction을 위한 Seed 고정 (feat. OS, Numpy, Random, PyTorch, Tensorflow)

Jaehwan Lee·2021년 9월 13일
2

모델의 학습 결과를 Reproduction 하기 위해 매우 중요한 Seed 고정하기

경진대회나 공모전에 나가서 수상하게 되면 본인의 코드를 재현성 서버에 올리고 재현성 검사 및 검증을 받게 되는데, 본인의 점수를 그래도 재현하기 위해서는 기존에 항상 Seed 를 고정해두어야 한다. 고정하지 않으면 매번 결과가 달라질테니까... 경진대회에서는 0.01점도 소중합니다...

따라서 항상 맨 먼저 작성하는 습관을 가집시다!

아래는 제가 항상 고정으로 사용하는, 정말 copy and paste만 하면 되는 코드를 공유합니다.

참고로 Jupyter Notebook으로 코드를 작성한 경우, train을 시작하기 전에 다시 seed를 고정해줘야 한다. 혹은, 런타임 초기화 후에 다시 처음부터 실행하자. 아니면 계속 고정된 seed 내에서 반복되면서 다른 값이 나온다.


Pytorch - Seed 고정 코드

import torch
import numpy as np
import random
import os

def my_seed_everywhere(seed: int = 42):
    random.seed(seed) # random
    np.random.seed(seed) # numpy
    os.environ["PYTHONHASHSEED"] = str(seed) # os
    # pytorch
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed) 
    torch.backends.cudnn.deterministic = True 
    torch.backends.cudnn.benchmark = False 

my_seed = 42
my_seed_everywhere(my_seed)

Tensorflow - Seed 고정 코드

import tensorflow as tf
import numpy as np
import random
import os

def my_seed_everywhere(seed: int = 42):
    random.seed(seed) # random
    np.random.seed(seed) # np
    os.environ["PYTHONHASHSEED"] = str(seed) # os
    tf.random.set_seed(seed) # tensorflow

my_seed = 42
my_seed_everywhere(my_seed)
profile
느리더라도 꾸준히 멈춤 없이

0개의 댓글