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-6ANDhr_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_output과dlinear_residual텐서의 (mean, std, min, max) 4-tuple을 MLflowmetrics.{scaler_check_*}로 로깅. 합산 전후 분포 통계 비교 - PASS 기준:
- 두 출력의
stdratio ∈ [0.5, 2.0] (동일 scaler space 가정 시 수용 범위) final_pred = vq + dlinear후 inverse_transform 시 unit이 kWtests/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_lossstep별 entry ≥ 5metrics.val_lossstep별 entry ≥ 5params.{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실행 - 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.5ANDnan_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.jsonsidecar
9. 다음 단계¶
- 사용자가 §7의 Q1~Q3 결정
- 본 문서 → exp-critic 재검토 (CONDITIONAL PASS 조건 충족 여부)
- PASS 시 engineer agent에 단계 0.5 스크립트 + smoke test gate scripts 구현 요청
- 구현 완료 후 단계 0.5 실행 → Gate 5건 검증 → 단계 1 진입