Intro
Randomization 함수를 많이 사용하는 코드에서 random seed control은 reproducibility를 위해 꼭 필요한 작업이다. 특히 randomness가 성능에 강하게 영향을 미치는 neural network의 코드 내에서 온갖 곳에 적용되고 있는 random 함수들, 예를 들어 initialization과 같은 함수의 randomness를 고정시켜야 추후 동일한 model의 reproduce를 가능하게 하기 때문이다. 이를 위해 간단한 글을 작성한다.
Python
가장 먼저 Python의 기본 random package의 seed를 고정시켜야 한다.
import random
random.seed(seed)
Numpy
pytorch와 긴밀하게 사용되는 matrix package인 numpy의 random seed도 고정시키는 편이 좋다.
import numpy as np
np.random.seed(seed)
Pytorch
Pytorch의 경우, torch 자체적인 randomness와 cuda, cudnn의 randomness도 고정해야 한다.
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.detreministic = True
torch.backends.cudnn.benchmark = False
CUDA
cuda가 자체적으로 가지고 있는 randomness를 고정한다. pytorch의 torch.nn.RNN()
과 torch.nn.LSTM()
의 경우, non-determinism으로 인해 cuda까지 고정해야하나, determinism을 강제할 경우, 연산속도가 극단적으로 느려질 수 있기 때문에, 사용을 추천하지 않는다.
# under CUDA 10.1
os.environ['CUDA_LAUNCH_BLOCKING'] = 1
# upper CUDA 10.2
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8' # or ':4096:2'