실험 추적 (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)을 계산한다:
- \(M_{\text{new}}\): 새 모델의 메트릭 값
- \(M_{\text{baseline}}\): 기준 모델의 메트릭 값
단순 차이만으로는 개선이 의미 있는지 판단할 수 없다. 통계적 유의성 검정이 필요하다. K-Fold 교차 검증에서 두 모델 \(A\)와 \(B\)의 성능 차이에 대해 Paired t-test를 수행한다:
- \(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를 사용하는 것이 더 엄밀하다.
실용 팁¶
-
자동화: 실험 기록을 수동으로 관리하면 누락이 발생한다. MLflow나 W&B를 코드에 통합하여 자동으로 기록하라.
-
명명 규칙: 실험에 의미 있는 이름을 부여하라 (예:
resnet50_lr001_aug_v2). -
태깅: 실험에 태그를 붙여 필터링과 검색을 용이하게 하라 (예:
baseline,final,ablation). -
비교 대시보드: 메트릭을 시각화하여 병렬 비교할 수 있는 환경을 구축하라.
언제 사용하는가¶
| 상황 | 추적 수준 |
|---|---|
| 개인 연구/실험 | 최소한 git + 간단한 로깅 |
| 팀 프로젝트 | MLflow 또는 W&B |
| 프로덕션 ML | MLflow + Model Registry + CI/CD |
| 규제 환경 (금융, 의료) | 엄격한 감사 추적 필수 |
흔한 오해와 함정¶
-
코드만 버전 관리하고 데이터/환경은 무시: 동일 코드라도 다른 데이터나 패키지 버전에서 다른 결과를 낸다. DVC 등으로 데이터도 버전 관리하라.
-
"나중에 기록하면 돼": 실험 직후가 아니면 세부 사항을 잊는다. 코드에 추적 로직을 미리 포함시켜라.
-
랜덤 시드 하나만 고정: Python 내장 random, NumPy, PyTorch, CUDA 등 모든 랜덤 소스의 시드를 고정해야 한다. GPU 연산의 비결정적 특성(non-deterministic)도 고려해야 한다.
-
하이퍼파라미터만 기록: 전처리 방법, 데이터 분할 방식, 증강 설정 등도 결과에 영향을 미친다. 모든 결정을 기록하라.
-
실험 추적을 오버엔지니어링: 초기에는 간단한 CSV나 JSON 로깅으로 시작해도 충분하다. 필요에 따라 도구를 도입하라.
다른 주제와의 연결¶
- ML 파이프라인 설계: 파이프라인의 기록과 관리
- 모델 배포: Model Registry로 배포 관리
- MLOps 기초: CI/CD와 실험 추적의 통합
- ML 시스템 설계 패턴: 프로덕션 실험 관리
- 흔한 실수: 재현 불가능한 실험