콘텐츠로 이동

v7 실험 프로세스 재설계 (Smoke Test + Fail-Fast)

0. 요약 (Executive Summary)

exp-critic 적대적 검토 결과 REJECT (현 6단계 그대로)단계 0.5 Vertical Slice Smoke Test 삽입 시 CONDITIONAL PASS. 본 문서는 5건의 Critical 사각지대(silent NaN, PAPE dual definition, scaler leakage, figure 비재현성, paired seed 깨짐)를 단계 0.5 + per-run fail-fast hook + 단계 1 early checkpoint 의 3-layer 안전망으로 차단한 재설계안.

추가 비용: +1.5h (총 ≈26.5h, 2~3일). 회피 시나리오: 6h 재실행 + Apt 5가구 silent leak 감지 지연 (ROI 4~10×).


1. 수정안 vs 원안 diff

항목 원안 (6단계) 수정안 (0.5 + 6단계 + Gates)
시작 단계 1 (B0 25 runs) 직진 단계 0.5 (4 runs vslice) → Gate 5건 PASS 후 단계 1
Per-run 종료 metric 로깅 후 다음 run fail-fast hook (loss explosion / nan / artifact 누락 → 즉시 fail + 다음 run skip)
단계 1 중간 점검 25 runs 일괄 완료 후 분석 B0 5-seed 완료 시점 early checkpoint (NaN/scaler/artifact 검증 → 통과 시 B1~B4 진행)
Seed NaN 처리 미정의 (drop 또는 무시) pre-register 결정 규칙 (사용자 승인 필요)
Figure 보고서 표 → 수동 작성 smoke test부터 mlflow.search_runs(...) 직접 query, run_id 메타데이터 figure 임베드
MLflow 사전 등록 metric best/avg PAPE, HR + final_train_loss, final_val_loss, nan_step_count, n_nan_predictions, final_codebook_util, pape_definition_hash
총 workload 60 runs ≈ 25h 64 runs ≈ 26.5h

2. 단계 0.5 — Vertical Slice Smoke Test 명세

2.1 실행 개요

항목
스크립트 experiments/federated/v7_0420_vslice_smoke.py
MLflow experiment v7-vslice-smoke
가구 Apt6 단일
Seeds {42, 43} (paired 구조 검증 최소단위)
Cells B0 (Local-only baseline) + A3 (peak-loss + VQ + DLinear, full ablation)
Total runs 4 (= 2 seeds × 2 cells)
예상 실행 시간 ≈ 1.5h (단일 GPU 직렬 실행, 가구 1개로 가벼움)
산출물 MLflow runs 4건 + outputs/v7_smoke_YYYYMMDD/{gate1..5}_report.json + pape_compare.png

2.2 5 Critical Gate 측정 절차 + PASS 기준

Gate 1 — PAPE/HR 정의 일치

  • 측정: smoke 종료 후 tests/smoke/test_pape_definition_consistency.py 자동 실행. 동일 (y_true, y_pred) numpy 텐서를 (a) baseline 코드 경로 B0._compute_metrics(), (b) ablation 코드 경로 A3._compute_metrics()에 통과시켜 PAPE/HR 값 비교
  • PASS 기준: abs(pape_b0 − pape_a3) < 1e-6 AND hr_b0 == hr_a3 (동일 입력 동일 출력)
  • MLflow 로깅: 각 run의 params.pape_definition_hash (SHA256 of metric source code) 동일성 확인
  • FAIL 처리: 즉시 stop. engineer 호출 → metrics.py 단일 진입점으로 정리 후 smoke 재실행

Gate 2 — Scaler space 일치 (VQ + DLinear residual)

  • 측정: A3 cell의 forward pass 중간에 hook 등록, vq_outputdlinear_residual 텐서의 (mean, std, min, max) 4-tuple을 MLflow metrics.{scaler_check_*}로 로깅. 합산 전후 분포 통계 비교
  • PASS 기준:
  • 두 출력의 std ratio ∈ [0.5, 2.0] (동일 scaler space 가정 시 수용 범위)
  • final_pred = vq + dlinear 후 inverse_transform 시 unit이 kW
  • tests/smoke/test_scaler_alignment.py 통과
  • FAIL 처리: stop. engineer 호출 → dual-path 입출력 unit 명시 (Z-score vs kW vs MinMax) 후 재실행

Gate 3 — MLflow artifact 완전성

  • 측정: smoke run 1개 종료 직후 tests/smoke/test_mlflow_artifacts.py 자동 실행. 다음 5종 존재 확인:
  • best.ckpt (best validation PAPE 시점)
  • y_true.npy, y_pred.npy (test set 예측)
  • metrics.train_loss step별 entry ≥ 5
  • metrics.val_loss step별 entry ≥ 5
  • params.{seed, cell_id, household, pape_definition_hash, scaler_space} 모두 존재
  • PASS 기준: 5/5 모두 존재. 누락 0건
  • FAIL 처리: stop. engineer 호출 → 로깅 코드 보완 후 단계 0.5 재실행

Gate 4 — Figure 재현성

  • 측정: smoke 종료 후 experiments/federated/v7_smoke_figure.py 실행
    runs = mlflow.search_runs(experiment_names=["v7-vslice-smoke"])
    # PAPE bar chart with run_id annotation
    
  • PASS 기준:
  • figure가 mlflow.search_runs() query에서 직접 그려짐 (하드코딩 0건)
  • figure metadata (PNG EXIF or JSON sidecar)에 4 run_id 모두 임베드
  • 동일 스크립트 재실행 시 byte-identical (또는 numerical identical, depending on matplotlib backend)
  • FAIL 처리: stop. figure 코드 수정 → 재실행

Gate 5 — 수렴성 (학습 안정성)

  • 측정: 4 runs 모두 metrics.train_loss 시계열 분석
  • PASS 기준: 4/4 runs 모두 final_train_loss < initial_train_loss × 0.5 AND nan_step_count == 0
  • FAIL 처리:
  • 1~2 runs FAIL: 해당 cell의 hyperparam (lr, batch) 점검 후 재실행
  • 3~4 runs FAIL: 단계 중단, engineer + 사용자 검토

2.3 단계 0.5 종료 조건

5 Gate 모두 PASS 시에만 단계 1 진입. 1건이라도 FAIL 시 engineer 수정 → smoke 재실행 (반복).


3. Fail-Fast 안전장치 (단계 1~4 전체 적용)

3.1 MLflow 사전 등록 metric (모든 run에 강제)

Metric 측정 시점 Fail-fast threshold
final_train_loss run 종료 시 > 1e6 OR is_nan → run FAIL 마킹
final_val_loss run 종료 시 > 1e6 OR is_nan → run FAIL 마킹
nan_step_count 매 epoch 누적 > 0 → 즉시 stop, run FAIL
n_nan_predictions test eval 시 > 0 → run FAIL (PAPE 계산 무의미)
final_codebook_util VQ 포함 cell만 < 0.05 → soft warning (kill 아님, 단계 4 분석 시 flag)
pape_definition_hash run 시작 시 params 캠페인 전체에서 unique value 1개만 허용
scaler_space run 시작 시 params 캠페인 전체에서 unique value 1개만 허용

3.2 Per-run 자동 검증 hook

experiments/federated/v7_runner.py_post_run_validate(run_id) 추가: 1. MLflow client로 위 7개 metric/param query 2. threshold 위반 시 mlflow.set_tag("status", "FAIL_AUTO") + mlflow.end_run(status="FAILED") 3. 다음 run (paired seed의 다음 cell) 실행 직전 _pre_run_check(prev_run_id) 호출 4. prev run이 FAIL이면 옵션: - (default) 동일 seed 내 다음 cell skip (paired 구조 보존을 위해) - 사용자 결정에 따라 변경 가능 (§4 참조)

3.3 단계 1 Early Checkpoint (B0 5-seed 완료 시점)

단계 1 시작 후 B0 (Local-only) × 5 seeds = 5 runs 완료 직후 자동 검증: - 5/5 runs 모두 status != FAIL_AUTO - PAPE 표준편차가 sane range (std < mean × 0.5) - 5 runs의 pape_definition_hash 동일 - 5 runs의 scaler_space 동일

PASS 시 자동으로 B1~B4 진행. FAIL 시 stop + 사용자 알림.


4. Seed 1개 NaN 시 결정 규칙 (pre-register, 사용자 결정 필요)

Option A — 동일 seed 전체 method 재실행 (paired 보존)

  • 장점: paired Wilcoxon 가정 유지, 통계 검정력 보존
  • 단점: 1 seed 재실행 = 5 cells × ~30min ≈ 2.5h 추가
  • 적용 가능 조건: NaN 원인이 seed-specific (수치적 불안정) 임이 명확

Option B — 해당 seed 전체 drop, 4-seed 통계

  • 장점: 즉시 진행 가능, 추가 compute 0
  • 단점: 검정력 약화 (paired n=5 → n=4, Wilcoxon 최소 n=6 권장에 미달)
  • 적용 가능 조건: 시간 압박 高 + 이미 4 seeds에서 effect size가 매우 큼

Option C — Critical fail, 단계 중단 + engineer 호출

  • 장점: 근본 원인 추적, 향후 NaN 재발 방지
  • 단점: 일정 지연 (engineer turnaround 필요)
  • 적용 가능 조건: NaN이 cell-specific (특정 method 자체 결함)

Recommendation (exp-expert)

기본: Option A, 단 동일 cell의 다른 seed에서도 NaN 발생 시 Option C로 escalate.

근거: - 5-seed paired 구조가 본 캠페인의 통계 검증 핵심 - Apt 5가구 × 5 cells × 5 seeds = 125 runs 규모에서 1~2건 재실행은 허용 가능 (~5h) - cell-specific 패턴이면 코드 결함이므로 단순 재실행은 무의미

사용자 승인 필요 항목 (§7 참조).


5. 수정 워크플로 다이어그램

[단계 0.5] Vertical Slice Smoke (4 runs, 1.5h)
   ├── Gate 1~5 측정
   │     │
   │     ├── ANY FAIL → engineer 수정 → 단계 0.5 재실행 (loop)
   │     │
   │     └── ALL PASS
   │           ↓
[단계 1] Baseline 5종 × 5-seed = 25 runs
   ├── B0 5 runs 완료 → early checkpoint
   │     │
   │     ├── FAIL → stop + 사용자 알림
   │     │
   │     └── PASS → B1~B4 진행 (per-run fail-fast hook 활성)
   ├── 단계 1 종료 → run-level 검증 (status=FAIL_AUTO 0건 확인)
[단계 2] Ablation 5종 × 5-seed = 20 runs (per-run hook 동일)
[단계 4] VQ 개선 3종 × 5-seed = 15 runs
[단계 5] 통계 검증 (paired Wilcoxon + bootstrap CI + Bonferroni)
   │     ↓ claim별 자동 rollback (PAPE 9.8% 미달 시 method 섹션 from abstract 제거)
[단계 6] TSFM zero-shot 비교 + 발표자료 figure 생성 (mlflow.search_runs 기반)

(단계 3 = Heterogeneity 보류 — 사용자 결정)


6. 수정 workload + 타임라인

단계 Runs 시간 (단일 GPU 2-way 병렬 가정) 누적
0.5 vslice smoke 4 1.5h (직렬) 1.5h
1 baseline 25 ~5h (2-way) 6.5h
2 ablation 20 ~4h (2-way) 10.5h
4 VQ improve 15 ~3h (2-way) 13.5h
5 통계 + rollback ~6h (분석) 19.5h
6 TSFM + 발표자료 ~7h (TSFM 추론 + figure) 26.5h

원안 대비 +1.5h (5.7% 증가). 회피 시나리오: - silent NaN 발견 지연으로 25-run 재실행 = 5h 손실 - scaler leakage가 ablation 단계에서 발견 = 45 runs 재실행 = 9h 손실 - figure 비재현성으로 발표 직전 재생성 = 4h + 신뢰도 손상

ROI 보수적 추정: 1.5h 투자 → 3~9h 회피 = 2~6×.


7. 메인 세션 사용자 확인 요청 항목

Q1. Seed NaN 처리 규칙 (필수)

§4의 Option A/B/C 중 default policy 채택. exp-expert recommendation = A (동일 cell 재발 시 C로 escalate). 사용자 승인 시 experiments/federated/v7_runner.py_pre_run_check()에 하드코딩.

Q2. 단계 0.5 FAIL 시 engineer 호출 권한

Gate 1~5 중 1건이라도 FAIL → engineer agent 자동 호출 + 사용자 알림 둘 다? 아니면 engineer만? 또는 사용자 승인 후 engineer? - exp-expert recommendation: engineer 자동 호출 + 사용자 알림 동시 (속도 우선, 사용자가 반려 가능)

Q3. 단계 1 early checkpoint FAIL 시 자동 재시작 vs stop-and-wait

B0 5 runs FAIL 시: - (a) 자동으로 단계 0.5 재실행 (engineer 수정 후 자동 re-trigger 가정) - (b) 무조건 stop, 사용자 결정 대기 - exp-expert recommendation: (b) stop-and-wait (5-run 단위 실패는 systematic issue 가능성 高, 자동 loop 위험)


8. 산출물 경로 요약

  • 본 문서: report/version7/exp-expert/v7_0419_process_redesign_with_smoke_test.md
  • 단계 0.5 스크립트: experiments/federated/v7_0420_vslice_smoke.py (engineer 작성)
  • Smoke test gate scripts: tests/smoke/test_{pape_definition_consistency, scaler_alignment, mlflow_artifacts}.py
  • Per-run hook: experiments/federated/v7_runner.py::_post_run_validate()
  • MLflow experiment: v7-vslice-smoke (단계 0.5), v7-main-campaign (단계 1~4)
  • Figure: outputs/v7_smoke_YYYYMMDD/pape_compare.png + *.run_ids.json sidecar

9. 다음 단계

  1. 사용자가 §7의 Q1~Q3 결정
  2. 본 문서 → exp-critic 재검토 (CONDITIONAL PASS 조건 충족 여부)
  3. PASS 시 engineer agent에 단계 0.5 스크립트 + smoke test gate scripts 구현 요청
  4. 구현 완료 후 단계 0.5 실행 → Gate 5건 검증 → 단계 1 진입