분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
딥러닝 학습에 있어서 random seed 설정에 관해 질문이 있습니다!
안녕하세요. 비전공자 초보 데이커입니다..
딥러닝 학습을 하다보면 학습 과정을 그대로 구현하기 위해 random seed도 고정시키는 것으로 알고 있습니다.
하지만 pytorch를 사용해 학습을 하다보면
매번 재시작을 해서 돌릴때마다 같은 코드인데도 accuracy나 f1 score가 다르게 나옵니다. 심하게 요동치기도 하구요...
이런 경우에는 모델을 저장하지 않으면 그대로 다시 복원하는 것이 불가능한가요?
또, 왜 시드값을 고정시켰는데도 매번 다르게 학습되는 것일까요?
와 감사합니다.. dropout이 없으면 완전재현이 가능한가요?ㅠ 또 dropout을 고정하는 방법 참고할만한게 있을까요??
정확한 정보는 아니에요...! 글을 찾아보면 torch.manual_seed만으로 충분하다고 하는 글도 있고해서.. 저번 대회때 위와같은 경우가 있어서 테스트해보니 dropout을 제외하면 재현이 가능했어서... 저도 정확한 사실을 알고싶네요.. 막상 dropout을 고정하는 방법은 따로 없는것 같더라구요. 이걸보면 manual_seed나 manual_seed_all?? 이걸로 가능해보이긴합니다.. 다른 부분에서 random될만한게 있나 확인해보시는게 더 도움이 될것같네요..
아니면.. ipynb파일에서 작업을 하셨을 경우, 모델을 돌릴때, seed를 다시 새로 실행안해줘서 그런걸수도 있구요..
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
오.. 하나 배워갑니다.. 감사합니다
오... 고정시키는 방법이 있군요! 진즉 했어야했는데ㅠㅠ 감사합니다!
위에 분께서 말씀드린 시드 7-8개만 고정하면 재현하시는데 무리는 없을거에요. 근데 시드 값을 모두 고정시키면 학습 시간이 약간 늘어나서 완벽하게 재현하는 경우가 아니면 Baseline처럼 기본적인 Seed 고정만 한 후 학습 하는 방법이 빠를거에요
seed를 전부 고정시키는 코드가 위에서 설명한 것처럼 있긴한데, 서버환경에 따라서 바뀌기도하고 영향을 받는 요인이 너무 많아서요..
개인적으로는 시드 고정시켜서 성능 재현시키는 것에 너무 매달리지 않으시는 걸 추천드립니다
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io | 전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
혹 dropout layer가 있으면 random seed 해도 바뀌더라구요.. dropout은 따로 고정해줘야 하는걸로 알고있습니다.