- 항상 찾아보는 코드... 블로그에 적어놓고 봐야할 것 같아서 작성해놓음.
- 모델 구조 바꾸고 파라미터 변경하면서 실험을 할 때, 동일한 시드로 고정해놓고 해야 성능이 개선되는지 아닌지를 확인할 수 있음.
- 아래 코드 사용하면 Weight 도 고정되어 나오므로, 모델 코드를 동일하게 여러번 돌려도 성능이 동일하게 나온다.
# Utils
import os, ast, wfdb, warnings, random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from argparse import Namespace
warnings.filterwarnings('ignore')
%matplotlib inline
%config InlineBackend.figure_format='retina'
# Torch
import torch, random
import torch.backends.cudnn as cudnn
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import TensorDataset, DataLoader, WeightedRandomSampler
from torch.optim.lr_scheduler import StepLR, ReduceLROnPlateau
SEED = 0
os.environ['SEED'] = str(SEED)
os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID'
np.random.seed(SEED)
random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
torch.backends.cudnn.deterministic = True
np.random.seed(SEED)
cudnn.benchmark = False
cudnn.deterministic = True
random.seed(SEED)
- Multi-GPU 사용 시, 아래 코드를 적용하기도 한다. (링크 참고)
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,
)