콘텐츠로 이동

실험 추적 (Experiment Tracking)

개요

실험 추적(Experiment Tracking)은 ML 실험의 코드, 데이터, 하이퍼파라미터, 메트릭, 아티팩트를 체계적으로 기록하고 관리하는 것이다. "지난주에 좋았던 모델의 설정이 뭐였지?"라는 질문에 답할 수 없다면, 실험 추적이 부족한 것이다. 재현성(reproducibility), 비교 가능성, 그리고 팀 협업을 위해 필수적이다.


핵심 개념

1. 왜 실험을 추적해야 하는가

목적 설명
재현성 어떤 코드/데이터/하이퍼파라미터로 어떤 결과를 얻었는지 기록
비교 여러 실험의 성능을 체계적으로 비교
감사 추적 모델 결정의 근거를 추적 (규제 환경에서 특히 중요)
팀 협업 팀원 간 실험 결과와 인사이트 공유
회귀 방지 이전 최고 성능 대비 새 모델의 성능 검증

2. MLflow

오픈소스 ML 생명주기 관리 플랫폼이다.

구성 요소:

컴포넌트 역할
Tracking 파라미터, 메트릭, 아티팩트 기록
Projects 재현 가능한 실행 환경 정의
Models 모델 패키징 포맷
Registry 모델 버전 관리, staging/production 단계

3. Weights & Biases (W&B)

클라우드 기반 실험 추적 플랫폼이다.

주요 기능: - 실시간 학습 시각화 (loss, accuracy 곡선) - Sweep: 하이퍼파라미터 자동 탐색 - Artifacts: 데이터셋과 모델의 버전 관리 및 계보(lineage) 추적 - Reports: 실험 결과를 팀과 공유하는 인터랙티브 문서

4. 재현성 체크리스트 (Reproducibility Checklist)

flowchart TD
    A["재현성 보장"] --> B["랜덤 시드 고정<br>Python, NumPy, PyTorch, CUDA"]
    A --> C["환경 기록<br>requirements.txt, Docker"]
    A --> D["데이터 버전 관리<br>DVC, 해시 기록"]
    A --> E["코드 버전<br>git commit hash"]
    A --> F["하드웨어/GPU 정보"]
    A --> G["하이퍼파라미터<br>설정 파일 저장"]

기록해야 할 항목:

범주 항목
코드 git commit hash, branch
데이터 데이터셋 버전, 해시, 분할 방법
환경 Python 버전, 패키지 버전, OS, GPU
하이퍼파라미터 학습률, 배치 크기, 에폭, 모델 구조
메트릭 loss, accuracy, F1, 사용자 정의 지표
아티팩트 모델 가중치, 설정 파일, 예측 결과
시드 모든 랜덤 시드 값

상세 내용

실험 추적 워크플로우

sequenceDiagram
    participant R as 연구자
    participant T as 추적 시스템
    participant M as 모델 레지스트리

    R->>T: 실험 시작 (파라미터 기록)
    R->>T: 학습 중 메트릭 로깅
    R->>T: 아티팩트 저장 (모델, 차트)
    R->>T: 실험 종료
    R->>T: 이전 실험과 비교
    R->>M: 최고 모델을 레지스트리에 등록
    M->>M: staging → production 전환

메트릭 비교와 통계적 유의성

실험 간 성능 비교 시, 상대적 개선율(Relative Improvement)을 계산한다:

\[\Delta_{\text{rel}} = \frac{M_{\text{new}} - M_{\text{baseline}}}{M_{\text{baseline}}} \times 100\%\]
  • \(M_{\text{new}}\): 새 모델의 메트릭 값
  • \(M_{\text{baseline}}\): 기준 모델의 메트릭 값

단순 차이만으로는 개선이 의미 있는지 판단할 수 없다. 통계적 유의성 검정이 필요하다. K-Fold 교차 검증에서 두 모델 \(A\)\(B\)의 성능 차이에 대해 Paired t-test를 수행한다:

\[t = \frac{\bar{d}}{s_d / \sqrt{K}}, \quad \bar{d} = \frac{1}{K}\sum_{k=1}^{K}(e_k^A - e_k^B), \quad s_d = \sqrt{\frac{1}{K-1}\sum_{k=1}^{K}(d_k - \bar{d})^2}\]
  • \(e_k^A, e_k^B\): 각 fold에서 모델 \(A\), \(B\)의 오차
  • \(\bar{d}\): 평균 성능 차이
  • \(K\): fold 수

\(|t| > t_{\alpha/2, K-1}\)이면 두 모델의 성능 차이가 통계적으로 유의하다고 판단한다. 단, fold 간 상관관계로 인해 paired t-test는 Type I 오류를 과소추정할 수 있으므로, corrected resampled t-test 또는 5x2 CV paired t-test를 사용하는 것이 더 엄밀하다.

실용 팁

  1. 자동화: 실험 기록을 수동으로 관리하면 누락이 발생한다. MLflow나 W&B를 코드에 통합하여 자동으로 기록하라.

  2. 명명 규칙: 실험에 의미 있는 이름을 부여하라 (예: resnet50_lr001_aug_v2).

  3. 태깅: 실험에 태그를 붙여 필터링과 검색을 용이하게 하라 (예: baseline, final, ablation).

  4. 비교 대시보드: 메트릭을 시각화하여 병렬 비교할 수 있는 환경을 구축하라.


언제 사용하는가

상황 추적 수준
개인 연구/실험 최소한 git + 간단한 로깅
팀 프로젝트 MLflow 또는 W&B
프로덕션 ML MLflow + Model Registry + CI/CD
규제 환경 (금융, 의료) 엄격한 감사 추적 필수

흔한 오해와 함정

  1. 코드만 버전 관리하고 데이터/환경은 무시: 동일 코드라도 다른 데이터나 패키지 버전에서 다른 결과를 낸다. DVC 등으로 데이터도 버전 관리하라.

  2. "나중에 기록하면 돼": 실험 직후가 아니면 세부 사항을 잊는다. 코드에 추적 로직을 미리 포함시켜라.

  3. 랜덤 시드 하나만 고정: Python 내장 random, NumPy, PyTorch, CUDA 등 모든 랜덤 소스의 시드를 고정해야 한다. GPU 연산의 비결정적 특성(non-deterministic)도 고려해야 한다.

  4. 하이퍼파라미터만 기록: 전처리 방법, 데이터 분할 방식, 증강 설정 등도 결과에 영향을 미친다. 모든 결정을 기록하라.

  5. 실험 추적을 오버엔지니어링: 초기에는 간단한 CSV나 JSON 로깅으로 시작해도 충분하다. 필요에 따라 도구를 도입하라.


다른 주제와의 연결