딥러닝 학습에 있어서 random seed 설정에 관해 질문이 있습니다!

2023.01.28 23:21 5,209 Views

안녕하세요. 비전공자 초보 데이커입니다..

딥러닝 학습을 하다보면 학습 과정을 그대로 구현하기 위해 random seed도 고정시키는 것으로 알고 있습니다.

하지만 pytorch를 사용해 학습을 하다보면

매번 재시작을 해서 돌릴때마다 같은 코드인데도 accuracy나 f1 score가 다르게 나옵니다. 심하게 요동치기도 하구요...

이런 경우에는 모델을 저장하지 않으면 그대로 다시 복원하는 것이 불가능한가요?

또, 왜 시드값을 고정시켰는데도 매번 다르게 학습되는 것일까요?

로그인이 필요합니다
0 / 1000
다냐니라
2023.01.29 00:05

혹 dropout layer가 있으면 random seed 해도 바뀌더라구요.. dropout은 따로 고정해줘야 하는걸로 알고있습니다.

이세의인공지능
2023.01.29 00:17

와 감사합니다.. dropout이 없으면 완전재현이 가능한가요?ㅠ 또 dropout을 고정하는 방법 참고할만한게 있을까요??

다냐니라
2023.01.29 00:52

정확한 정보는 아니에요...! 글을 찾아보면 torch.manual_seed만으로 충분하다고 하는 글도 있고해서.. 저번 대회때 위와같은 경우가 있어서 테스트해보니 dropout을 제외하면 재현이 가능했어서... 저도 정확한 사실을 알고싶네요.. 막상 dropout을 고정하는 방법은 따로 없는것 같더라구요. 이걸보면 manual_seed나 manual_seed_all?? 이걸로 가능해보이긴합니다.. 다른 부분에서 random될만한게 있나 확인해보시는게 더 도움이 될것같네요..

아니면.. ipynb파일에서 작업을 하셨을 경우, 모델을 돌릴때, seed를 다시 새로 실행안해줘서 그런걸수도 있구요..

kazakan
2023.01.29 01:35

manual_seed에 torch.backends.cudnn.deterministic = True 도 설정해주어야 gpu상에서 결과가 고정되는것으로 알고있습니다. 이것도 파이토치 버전이나 cuda 버전에 따라 차이가 있어서 방법이 조금씩 차이가 있습니다. 어떤 버전은 torch import 전에 환경변수 "CUBLAS_WORKSPACE_CONFIG" 값을 설정해주어야 되는 버전도 있더라고요.

전 torch 임포트 전에 아래 코드를 수행한 후
os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"

임포트 후에 아래 메소드를 실행하여서 재현합니다.
def seed_everything(seed=42):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.benchmark = False
    torch.use_deterministic_algorithms(True)
    os.environ["PYTHONHASHSEED"] = str(seed)
    os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0"



pytorch 에서 재현성과 관련된 것은 아래 링크를 참고하시면 좋을듯합니다. 추가로 dataloader의 worker에도 seed 를 조절해줘야된다고 아래 링크에 나와있습니다.
https://pytorch.org/docs/stable/notes/randomness.html

cuda 관련해서 재현성 관련된 내용은 아래 링크에 2.1.4절을 참고하였습니다.
https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility

다냐니라
2023.01.29 01:57

오.. 하나 배워갑니다.. 감사합니다

이세의인공지능
2023.01.29 03:06

오... 고정시키는 방법이 있군요! 진즉 했어야했는데ㅠㅠ 감사합니다!

초밥좋아
2023.01.29 14:29

위에 분께서 말씀드린 시드 7-8개만 고정하면 재현하시는데 무리는 없을거에요. 근데 시드 값을 모두 고정시키면 학습 시간이 약간 늘어나서 완벽하게 재현하는 경우가 아니면 Baseline처럼 기본적인 Seed 고정만 한 후 학습 하는 방법이 빠를거에요

Team
2023.01.29 20:17

seed를 전부 고정시키는 코드가 위에서 설명한 것처럼 있긴한데, 서버환경에 따라서 바뀌기도하고 영향을 받는 요인이 너무 많아서요..
개인적으로는 시드 고정시켜서 성능 재현시키는 것에 너무 매달리지 않으시는 걸 추천드립니다