Pytorch/Tips

랜덤시드 고정 안될때

khslab 2025. 3. 25. 15:49

Pytorch 실험할 때는 재현성을 위해 랜덤 시드를 고정해야 한다.

이때 보통 다음코드를 써서 고정을 한다.

print("random seed fix--")
torch.manual_seed(args.seed)
random.seed(args.seed)
os.environ['PYTHONHASHSEED'] = str(args.seed)
np.random.seed(args.seed)
torch.cuda.manual_seed(args.seed)
torch.cuda.manual_seed_all(args.seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False

이렇게 seed를 고정했음에도 불구하고 고정이 안되는 경우가 있다.

이때는 반드시 2가지를 점검해야 한다.

1. 특정 라이브리가 c++에서 구현되지 않았는지 확인

특정 라이브러리가 c++에서 구현을 했는데 이 라이브러리에서 random을 쓰고 있다면 파이썬에서 seed를 고정해도 소용이 없다.

이때는 라이브러리의 c++파일의 seed를 어떻게든 고정해야 한다.

2. multiprocessing 내에 random문이 있는지 확인

병렬처리를 위해 multiprocessing을 할 때는 절대 해당 코드에 random이 포함되면 안된다.

컴퓨터의 랜덤 할당 방식은 특정 기준으로 난수 리스트를 만든 다음 random을 한번 호출할 때마다 하나씩 꺼내쓰는 개념이다.

이 multiprocessing은 코어의 실행 순서는 고려하지 않기 때문에 seed 고정이 풀리는 효과가 있다.

(엄밀히 말하면 풀리는건 아닌데 실행 순서때문에 풀리는것과 같은 효과..)

따라서 multiprocessing할 때는 절대 random을 넣지 않도록 해야 한다.