본문 바로가기
C.W.K.
Stream
Lesson 08 of 08 · published

재현성과 시드

~16 min · seed, reproducibility, determinism

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

완벽한 재현이 어려운 이유

현대 GPU 코드는 속도를 높이기 위해 비결정적 커널을 사용해. 병렬 축약 과정에서 연산 순서가 달라질 수 있고, atomic add는 비트 단위로 같은 결과를 보장하지 않아. cuDNN도 runtime에 가장 빠른 합성곱 알고리즘을 선택해. 그래서 시드를 고정해도 두 학습 결과가 몇 에폭 뒤부터 소수점 셋째 자리에서 달라질 수 있어.

보통 필요한 건 비트 단위 재현성이 아니라 통계적 재현성이야. 최종 정확도가 ± 0.1% 안에 들고 손실 곡선의 모양이 같으면 돼. 시드를 고정하고 데이터 순서를 일정하게 유지한 뒤 몇 가지 cuDNN 플래그를 설정하면 이 정도는 달성할 수 있어.

원칙: Python random, numpy, PyTorch CPU, PyTorch CUDA, DataLoader worker_init의 시드를 모두 고정해. 그래도 GPU의 비결정성 때문에 소수점 셋째 자리부터 결과가 달라질 수 있다는 점은 받아들여야 해.

시드 설정 절차

학습 코드 맨 위에서 모델을 만들기 전에 set_seed(42)를 호출해. 비교할 실행에는 같은 시드를 사용해. Ablation에서는 한 번에 하나의 설정만 바꾸고 시드는 그대로 유지해.

비트 단위 결정성이 필요할 때

유닛 테스트, 회귀 테스트, 일부 규제 적용 파이프라인에서는 torch.use_deterministic_algorithms(True)를 설정하고 자주 2x에 이르는 속도 저하를 감수해야 해. 행렬곱의 결정성을 확보하려면 CUBLAS_WORKSPACE_CONFIG=:4096:8도 설정해. Python version, package version, GPU driver를 포함한 전체 실행 환경을 저장해야 해. 모든 플래그를 설정해도 환경이 조금만 달라지면 결정성이 깨질 수 있어.

팁: 재현성은 이분법이 아니야. 실제로 필요한 건 대부분 통계적 재현성, 즉 같은 시드와 같은 데이터, 같은 코드로 비슷한 결과를 얻는 것이야. 비트 단위 결정성은 규제 산업에서 요구되는 특수 조건이지 기본값이 아니야.

Code

표준 시드 설정 함수·python
import random, os, numpy as np, torch

def set_seed(seed: int):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed_all(seed)
    os.environ["PYTHONHASHSEED"] = str(seed)

def worker_init_fn(worker_id):
    seed = torch.initial_seed() % 2**32
    np.random.seed(seed)
    random.seed(seed)

set_seed(42)
loader = DataLoader(ds, batch_size=32, num_workers=8,
                    worker_init_fn=worker_init_fn,
                    generator=torch.Generator().manual_seed(42))

External links

Exercise

같은 시드로 같은 학습 스크립트를 두 번 실행해. 두 손실 곡선을 겹쳐서 그려. 눈으로 구분할 수 없을 정도로 같아야 하며, 작은 수치 차이는 GPU의 비결정성 때문에 생겨. 이제 시드를 1만큼 바꿔서 다시 실행해. 곡선은 비슷해 보이지만 더 이상 정확히 겹치지 않아야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.