v7 Peak-Aware FL Clean Restart — 최종(Closure) 보고서¶
본 보고서는 2026-04-19 ADR-007로 착수되어 2026-04-20 ADR-008로 공식 이양된 v7 phase 전체 궤적을 하나의 closure 문서로 정리한다. 중간 보고서(v7_stage0_stage05_interim_report.md, draft)가 Stage 0 + Stage 0.5까지를 다뤘고, 그 뒤 수행된 A3 발산 진단 ablation(A1/A2/A4/V1/V2/V3) 이 v8 전환의 직접 근거가 되었다. 본 최종본은 이 전 범위를 포괄하며, v7 관련 신규 보고서는 이후 작성되지 않는다.
§0 Executive Summary¶
0.1 비전문가용 한 문단 요약¶
v7은 발표자료 제출을 목표로 "peak-aware 연합학습이 baseline과 시계열 파운데이션 모델 대비 우수하다"는 초록을 숫자로 검증하기 위한 clean-restart phase였다. 결과는 조기 종결. Stage 0.5 smoke에서 핵심 cell A3("full proposed")가 3 seed 모두 학습 중 val loss가 오히려 증가하는 현상을 확인했고, 후속 진단 ablation 결과 VQ를 포함한 모든 cell(A2/A3/A4/V1~V3)이 B0 local baseline(PAPE 52.3)보다 악화되는 반면 VQ를 제거한 A1만이 PAPE 47.1로 baseline 수준에 근접했다. 원인은 peak-loss도 DLinear residual도 아니라 v7 runner가 FedPM의 VQ 기본 모듈만 import하고 서버 정렬(MemoryAlignmentServer)과 RESET 기법을 연결하지 않은 구현 결함으로 규명되었다. v7은 여기서 멈추고 ADR-008로 v8 VQ Methodology Rescue phase에 구현 결함 수정 책임을 이양했다. (v8은 그 뒤 2026-04-21에 별도 실패로 closure되었으며 본 보고서 범위 밖)
0.2 최종 수치 (16pp 격차)¶
| Cell | 구성 | PAPE | vs v6 R1b (38.40) | vs B0 (52.3) | 출처 |
|---|---|---|---|---|---|
| v6 R1b | 기준 (v6 FedPM 원본, 동일 구조) | 38.40 | 0 | −13.9 | mlruns/628304840000878755/5e0409718fd347d085190264e43d4284 |
| A1 | peak-weighted, VQ 없음, DLinear only | 47.1 | +8.7 | −5.2 | v8 closure §1 (v7 Stage 0.5 smoke 연장) |
| B0 | Local DLinear (baseline) | 52.3 | +13.9 | 0 | v7 Stage 0.5 smoke |
| V3 | A3 + EMA + K-means | 53.4 | +15.0 | +1.1 | v8 closure §1 |
| V1 | A3 + EMA codebook update | 53.9 | +15.5 | +1.6 | v8 closure §1 |
| V2 | A3 + K-means init | 54.2 | +15.8 | +1.9 | v8 closure §1 |
| A3 | full proposed (peak + VQ + DLinear residual) | 54.3–55.6 | +15.9–17.2 | +2.0–3.3 | v7 Stage 0.5 smoke 3 seed |
| A2 | SmoothL1 + VQ + DLinear (peak 제거) | 56.2 | +17.8 | +3.9 | v8 closure §1 |
| A4 | peak-weighted + VQ (DLinear residual 제거) | 57.9 | +19.5 | +5.6 | v8 closure §1 |
핵심 패턴: VQ를 포함한 전 cell이 B0보다 나쁨, A1만 v6 R1b 수준에 근접. v6 R1b와 v7 A3는 동일 VQ + DLinear dual-path 설계임에도 16pp 격차. → 설계 결함이 아니라 구현 결함.
0.3 쉬운 요약 박스¶
"같은 설계(peak-aware loss + VQ + DLinear residual)로 v6에서 PAPE 38이 나왔는데 v7에서는 54가 나왔다. VQ를 빼면 오히려 47로 좋아진다. 이는 'VQ가 나쁜 아이디어'여서가 아니라 v7 코드가 FedPM 라이브러리의 핵심 2기법을 연결하지 않아서였다."
0.4 최종 판정¶
- Phase 판정: 조기 종결 (inconclusive on claims C2~C7, blocked by implementation defect on VQ path)
- 후속: ADR-008 → v8 VQ Methodology Rescue (MemoryAlignmentServer + RESET 통합, V4/V5 추가)
- v8 결과: 2026-04-21 실패로 closure → ADR-009 track-f (decoder capacity swap)로 재분기
§1 v7 착수 배경과 초록 Claim (C1~C7)¶
1.1 착수 맥락 (ADR-007 요약)¶
v6 phase에서 track-e v3 patchwork, 단일 seed 한계, silent failure(FedPM-Phase2 nan), PAPE/HR 정의 dual-track 위험 등이 누적되어 "동일 track 위에 추가 실험을 누적하면 신뢰도가 더 손상"될 위험이 있다고 판정됨. 사용자는 (c) 완전 재시작 옵션을 명시 선택, clean restart로 진입. (docs/decisions/ADR-007_v6_to_v7.md §맥락, §결정)
1.2 대상 초록 (2026-04-19 확정, 변경 불가)¶
- (i) peak-weighted loss가 peak-time 샘플에 가중치를 부여
- (ii) shared VQ codebook + DLinear residual dual-path 아키텍처
- (iii) lightweight model이 time-series foundation models(TSFM)을 능가
1.3 Claim C1~C7 및 Rollback 규칙 (pre-registered)¶
v7 design spec §1 (track_v7_design.md) 기준. 모든 rollback은 orchestrator override 금지.
| # | Claim | 통과 기준 | Rollback 문구 |
|---|---|---|---|
| C1 | FL + privacy motivation | 서술 | — (없음) |
| C2 | peak-weighted loss 효과 | A1 vs A0 paired Wilcoxon p<0.05 | "asymmetrically weighted" |
| C3 | VQ codebook 기여 | A3 vs A1 bootstrap 95% CI 하한 > 0 | "(ii)" 구절 재구성 |
| C4 | DLinear residual 기여 | A3 vs A4 paired Wilcoxon p<0.05 | "local adaptation head" |
| C5 | best across baselines | A3 vs {B0~B4} Wilcoxon + Bonferroni 다수 PASS | "competitive peak accuracy" |
| C6 | PAPE 9.8% reduction vs local-only | (B0−A3)/B0 CI 하한 > 5% | 실측 CI median % 교체 |
| C7 | lightweight surpasses TSFM | Chronos + TimeMoE zero-shot | 비교 유지 + param 비율 명기 |
1.4 용도 및 우선순위¶
학술 논문이 아닌 발표자료용. 우선순위 = 속도 + 정확성.
쉬운 요약: "peak 지점에 weight 주고, 가구 공용 codebook + 가구별 잔차 경로" 조합이 local 학습·다른 FL 방식·대형 TSFM을 이기는지 확인하는 것이 목표였다.
§2 Stage 0 — 사전 등록 (완료)¶
2.1 완료 상태¶
2 cycle(v1 → critic → v2) 만에 완료, critic 통과. (report/version7/exp-expert/v7_0419_stage0_preregistration_v2.md, report/version7/exp-critic/v7_0419_stage0_preregistration_review.md)
2.2 확정 산출물¶
| 항목 | 확정값 | 근거 |
|---|---|---|
| Golden tensor G1 (toy, Q90=7.9) | PAPE = 20.000000 / HR = 1.000000 | stage-0 v2 §2.2 |
| Golden tensor G2 (degenerate σ=0) | PAPE = NaN / HR = NaN (policy) | std<1e-8 시 NaN 정책 |
| Golden tensor G3 (Apt6 168h, perfect) | PAPE = 0.000000 / HR = 1.000000, q90=2.918 | outputs/v7_stage0/golden_tensors/G3_*.npy |
| Golden tensor G4 (Apt6 168h, const mean) | PAPE = 67.342534 / HR = 0.619048 | 상동 G4 |
| Golden tensor G5 (Apt15 336h, uniform seed=42) | PAPE = 64.279282 / HR = 0.511905, q90=1.721 | critic M1 대응, 14d block (n_hits=2→13) |
Metric definition_hash |
8be2bd2f691deed0 (sha256 상위 16 hex, v2) |
src/peak_analysis/v7/metrics.py |
| Apt_max_load | Apt88 (5/5 peak-load metric 1위, critic M2 민감도 통과) | stage-0 v2 부록 |
| Fail-fast threshold | Option B — val ratio > 1.5 (per-run divergence) + train > 3.0 (static ceiling) |
v6 n=22 converged back-test |
2.3 Option B 임계 근거 (v6 n=22 back-test)¶
final_val_loss / initial_val_loss분포: p50 = 0.929, p95 = 1.001, max = 1.001 → 1.5× 임계는 "명확한 divergence"만 포착final_train_loss분포 (n=3): max = 0.541 → static 3.0 ceiling (~5.5× margin)
2.4 Gate back-test 패턴 적용 (feedback 반영)¶
임계 제시 시 v(N-1) 분포 back-test 통계 동반을 원칙으로, v6 converged runs(MIN_STEPS ≥ 10)을 n=22 사양으로 back-test한 뒤 p05/p10/p50/p95를 함께 보고했다. Gate 5 재설계에도 동일 원칙이 적용되었다(§4).
쉬운 요약: 실험을 시작하기 전에 "합격/불합격을 어떤 값으로 자를지"를 종이로 먼저 적고 잠그는 작업이 Stage 0이다. v6 기록을 back-test해 실제로 통과하는 임계인지 확인한 뒤 잠갔다.
§3 인프라 구축 (완료)¶
3.1 신규 모듈 / 스크립트¶
| 경로 | 역할 |
|---|---|
src/peak_analysis/v7/metrics.py |
PAPE_v7 / HR_v7 / definition_hash 단일 소스 |
experiments/federated/v7_runner.py |
단일 entry point (~77KB), smoke ↔ main 코드 경로 100% 공유, CELL_REGISTRY 12종 (B0~B4, A1~A4, V1~V3) |
experiments/federated/v7_0419_stage0_preregistration.py |
Stage 0 재현 스크립트 (definition_hash 산출) |
experiments/federated/v7_stage05_smoke_analysis.py |
6-Gate 자동 평가 + verdict/report 생성 |
3.2 CLI 설계¶
v7_runner.py
--mode={smoke,main}
--phase={baseline,ablation,vq_improvement}
--cells=B0,B1,B2,B3,B4,A1,A2,A3,A4,V1,V2,V3
--seeds=42,123,456,789,2024
--households=Apt6,Apt15,Apt30,Apt51,Apt88|all
--golden-tensor-check (Gate 1 sanity)
3.3 MLflow 로깅 6종 계약 (설계 spec §2.5)¶
- per-epoch/round
train_loss,val_loss(step=) - best checkpoint (
log_artifact) - test
y_true.npy+y_pred.npy(log_artifact) - 가구별 + avg PAPE, HR, MSE, MAE
- 7-metric fail-fast 지표
- config 전체 (
pape_definition_hash,scaler_space_signature포함)
3.4 테스트 현황 (155+ tests)¶
| 범주 | 대략 규모 |
|---|---|
v7_runner (CLI / registry / dispatch) |
57 |
| v7 training 경로 | 53 |
| Stage 0 재현 | 26 |
| Stage 0.5 smoke analysis | 19 |
| MLflow params 계약 | ~22 |
3.5 인프라 설계 원칙¶
- 단일 entry point: smoke ↔ main 공유 (C-7 mitigation)
- 별도 smoke 스크립트 작성 금지 (spec §6)
- Gate 1 hash assertion 활성: fail-fast 실제 체크, dry-run 아님
쉬운 요약: 실험 스크립트를 하나(v7_runner.py)로 통일해, smoke test와 본실험이 같은 코드에서 돌게 만들었다. 결과가 다르면 즉시 hash mismatch로 멈춘다.
§4 Stage 0.5 Smoke — 9 runs + 6-Gate Matrix¶
4.1 실행 요약¶
- 명령:
v7_runner.py --mode=smoke --households=Apt6,Apt88 --cells=B0,B2,A3 --seeds=42,43,123 - 실제: 9 runs (3 cells × 3 seeds, 단일 household per run)
- MLflow experiment:
v7-peak-aware-fl - 평가 산출:
outputs/v7_stage05/smoke_report_20260420_021905.md,smoke_verdict_20260420_021905.json, 3종 figure PNG
4.2 9 runs run_id¶
| Run | Cell | Seed | run_id (full) |
|---|---|---|---|
| 1 | B0 | 42 | 4c013601955b4240ab8d02b1fa442048 |
| 2 | B0 | 43 | 88b6fdba0e6545f78d892d401504020f |
| 3 | B0 | 123 | 9ce63bc1909f402a901b3b97743b7104 |
| 4 | B2 | 42 | 87716252c99342df9f73763f78116ecc |
| 5 | B2 | 43 | 4b324359c16b41fab909f672d33c813a |
| 6 | B2 | 123 | 70d3176828514ff58b6dcdca125f5c86 |
| 7 | A3 | 42 | e2c2c5137a32436f9be80c113995ad41 |
| 8 | A3 | 43 | 7d2c8fdd952b46068fb4a0ea27aa4b6c |
| 9 | A3 | 123 | 07764d6e45844166af639b071e50efe3 |
4.3 6-Gate Matrix 결과¶
outputs/v7_stage05/smoke_verdict_20260420_021905.json 기반. Gate 5만 FAIL, 전체 verdict = FAIL (1건 FAIL이라도 HOLD).
| Gate | B0-s42 | B0-s43 | B0-s123 | B2-s42 | B2-s43 | B2-s123 | A3-s42 | A3-s43 | A3-s123 | 결과 |
|---|---|---|---|---|---|---|---|---|---|---|
| G1 (hash + golden tensors) | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
| G2 (scaler space, VQ cell만) | n/a | n/a | n/a | n/a | n/a | n/a | PASS | PASS | PASS | PASS |
| G3 (MLflow artifact 완전성) | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
| G4 (figure run_id query + EXIF) | — | — | — | — | — | — | — | — | — | PASS (3 figure) |
| G5 (legacy 임계 기준) | FAIL | FAIL | FAIL | FAIL | FAIL | FAIL | FAIL | FAIL | FAIL | FAIL |
| G6 (paired split data hash) | PASS | PASS | PASS | — | — | — | — | — | — | PASS |
4.4 Gate 세부¶
- G1: 9/9 run
definition_hash = 8be2bd2f691deed0일치 + G1~G5 expected 값 모두 match - G2: 공통 scaler signature =
752452383a98bc03, unit =standardized(VQ cell A3에서만 해당) - G3: 9/9 run이 best.ckpt / y_true.npy / y_pred.npy / per-epoch loss / 7-metric 완비
- G4:
smoke_pape_avg / smoke_hr_avg / smoke_mse_avg3종 PNG가mlflow.search_runs()query 기반 생성 + run_id EXIF 임베드 확인 - G5 legacy:
moving/initialratio 범위 0.975~1.014, 9/9 FAIL → 임계 자체가 작동 불가능 (아래 §4.5) - G6: seed별 (42/43/123) 3개 cell이 동일
train=a00f61e9f82e96a2,val=d454d3e3f2f7eb4d,test=de5cf8b0379cc074
4.5 Gate 5 재설계 (legacy → rel_decrease 3-tier)¶
문제 발견: legacy 식 final_val_loss_moving_avg(last 3) / initial_val_loss_moving_avg(first 3) < 0.5는 "val loss가 반으로 줄어야 수렴 인정". v6 n=22 converged back-test(outputs/v7_stage05/v6_gate5_backtest.json) 결과 legacy_ratio p05=0.911, p50=0.965, p95=0.999, max=1.000 — legacy PASS count = 0 / 22 (false-positive rate = 1.0). v6 정상 수렴 run도 단 하나도 통과하지 못하는 작동 불가능한 임계.
재설계 (v3, critic 반영, report/version7/exp-expert/v7_stage05_gate5_redesign_v2.md):
- 식: rel_decrease = (mean(val_loss[:3]) − mean(val_loss[-3:])) / mean(val_loss[:3])
- 3-tier cutoffs (v6 percentile 기반):
- PASS: rel_decrease ≥ 0.0017 (v6 P10)
- WARNING: 0.0 ≤ rel_decrease < 0.0017 (v6 P05~P10)
- FAIL: rel_decrease < 0.0 (net increase)
- v6 back-test: PASS 19 / WARNING 1 / FAIL 2, TPR(PASS or WARN) = 90.9%
4.6 Smoke 9 run rel_decrease preview¶
| Cell-Seed | rel_decrease | 신 metric verdict | legacy ratio |
|---|---|---|---|
| B0-s42 | 0.030072 | PASS | 0.978628 |
| B0-s43 | 0.029720 | PASS | 0.975406 |
| B0-s123 | 0.018253 | PASS | 0.985070 |
| B2-s42 | 0.001212 | WARNING | 1.000351 |
| B2-s43 | 0.009746 | PASS | 0.995218 |
| B2-s123 | 0.005041 | PASS | 0.996454 |
| A3-s42 | −0.018681 | FAIL | 1.014198 |
| A3-s43 | −0.013291 | FAIL | 1.011567 |
| A3-s123 | −0.013578 | FAIL | 1.010581 |
Tally: PASS 5 / WARNING 1 / FAIL 3 → A3 3/3 FAIL, Stage 1 진입 HOLD 권고.
4.7 쉬운 요약¶
"6개 검문소 중 5개는 통과, '학습이 실제로 내려가는가'를 확인하는 마지막 검문소만 실패했다. 그리고 실패 원인이 A3에만 집중되어 있다 — B0/B2는 정상인데 A3만 loss가 오히려 증가했다."
§5 A3 발산 진단 — Ablation 결과와 원인 규명¶
5.1 A3 val_loss 경향 (smoke 3 seed)¶
9 preview JSON 기반 시계열 (10 round 샘플):
- A3-s42 (e2c2c513): 0.6483 → 0.6310 → 0.6406 → 0.6422 → 0.6483 → 0.6469 → 0.6467 → 0.6567 → 0.6508 → 0.6483
- A3-s43 (7d2c8fdd): 0.6635 → 0.6664 → 0.6599 → 0.6543 → 0.6627 → 0.6653 → 0.6678 → 0.6712 → 0.6707 → 0.6744
- A3-s123 (07764d6e): 0.6070 → 0.6112 → 0.6169 → 0.6151 → 0.6184 → 0.6211 → 0.6147 → 0.6201 → 0.6175 → 0.6224
관찰: 3 seed 모두 10 round에서 rel_decrease ∈ [−1.9%, −1.3%], final_val_loss 0.62~0.67 (B0/B2 ~0.34의 약 2배).
5.2 원인 후보 (진단 전 시점)¶
peak_alpha = 2.0scale 과대: peak-weighted SmoothL1의 peak-time 가중이 전체 grad 크기를 키워 불안정- VQ codebook 초기화 / gradient flow: commitment loss가 DLinear residual과 gradient 충돌
- DLinear residual gradient 충돌: dual-path 합산이 초반 residual을 키워 val 악화
5.3 Ablation 결과 (single-factor attribution)¶
Stage 0.5 이후 수행된 A1/A2/A4/V1/V2/V3 smoke 결과 (v8 closure §1 인용):
| Cell | 구성 | PAPE | 해석 |
|---|---|---|---|
| A1 | peak-weighted, VQ 없음, DLinear only | 47.1 | v6 R1b 수준 근접. "VQ 없는 경로"만 정상 작동 |
| A2 | SmoothL1 + VQ + DLinear (peak 제거) | 56.2 | peak-loss 제거해도 여전히 발산 — peak_alpha 배제 |
| A3 | full proposed | 54.3~55.6 | 발산 확인 (3 seed) |
| A4 | peak-weighted + VQ, DLinear residual 제거 | 57.9 | residual 제거해도 여전히 발산 — residual 배제 |
| V1 | A3 + EMA codebook (γ=0.95) | 53.9 | VQ 개선 변형도 발산 |
| V2 | A3 + K-means init | 54.2 | 동일 |
| V3 | A3 + EMA + K-means | 53.4 | 동일 |
| B0 | Local DLinear (baseline) | 52.3 | 참조 기준 |
5.4 해석: 원인은 "VQ 경로 자체"¶
- VQ를 포함한 모든 cell이 B0(52.3)보다 악화 (A2/A3/A4/V1/V2/V3 = 53.4~57.9)
- VQ를 제거한 A1만이 B0를 능가 (47.1)
- peak-loss(A2)도 DLinear residual(A4)도 단독 제거해도 발산 지속 → 원인 = VQ 경로
5.5 구현 결함 특정 (ADR-008 §맥락)¶
v6 R1b는 같은 구조(peak + VQ + DLinear residual)로 PAPE 38.40 달성. v7 A3는 같은 설계로 54.3~55.6. → 설계 결함이 아니라 구현 결함. 결함 위치:
- v7_runner는
src/fed_learning/fedpm.py의VectorQuantizer(line 112) 만 import MemoryAlignmentServer(line 350) — server-side codebook 정렬 미연결- SoundStream RESET dead-code replacement (threshold=2) 미연결
- track-e v3 계획에 이 2 기법이 있었으나 v7 흡수 시 EMA/K-means(V1~V3) 부분만 scaffold 되고 핵심 2 기법은 미구현 상태로 통과
5.6 FedPM 논문 ablation 대조 (ADR-008 §근거)¶
- "w/ Average" aggregation 대체: −7.18% MAE
- "w/ Local Memory" (서버 정렬 없음, v7 현 상태): −9.34% MAE
즉 FedPM 논문 자체가 "서버 정렬 없는 구성"을 −9.34% MAE 악화로 보고했고, v7 A3의 16pp 격차가 이 구조적 생략과 정합.
5.7 쉬운 요약¶
"A3만 발산하는 이유를 찾기 위해 peak-loss만, VQ만, residual만 남긴 셋을 돌려봤다. 결과적으로 VQ가 들어간 모든 조합이 발산했고 VQ 없는 조합만 정상이었다. v6에서는 같은 VQ가 작동했는데 v7에서는 작동하지 않는다 → v7 코드가 FedPM의 서버 정렬과 RESET을 연결하지 않았기 때문. 아이디어는 살아있고, 배선이 끊어져 있었다."
§6 Claim 영향 (C2~C7)¶
v7 범위에서의 최종 판정. A3 발산 원인이 구현 결함으로 확정되었으므로 claim 자체는 v7 내에서는 검증 불가하며 v8/track-f로 이관되었다.
| # | Claim | v7 내 판정 | 근거 | 이관 경로 |
|---|---|---|---|---|
| C1 | FL + privacy motivation | 영향 없음 | 서술 claim | 그대로 유지 |
| C2 | peak-weighted loss 효과 | 유보 확정 | A0 대비 실험 미실시 (v7 범위). A1은 no-VQ + peak-weighted 단일 조건 | v8/track-f에서 A0 (no peak, no VQ) 추가 필요 |
| C3 | VQ codebook 기여 | v7 내 검증 불가 | 구현 결함 (MemoryAlignmentServer + RESET 미연결) | v8 V4/V5에서 재검증 (이후 실패) → track-f로 이관 |
| C4 | DLinear residual 기여 | 부분 증거 | A4 발산으로 단독 비교 노이즈 큼 | v8/track-f decoder 복원 후 재검증 |
| C5 | best across baselines | v7 내 성립 불가 | A3 loss > B0, B2 | v8/track-f 후 재평가 |
| C6 | PAPE 9.8% reduction | v7 내 산출 불가 | A3 fix 전제 | v8/track-f 후 재계산 |
| C7 | lightweight surpasses TSFM | v7 범위 미수행 | 단계 6 HOLD | track-f로 연기 |
6.1 쉬운 요약¶
"발표 자료에 쓸 7개 주장 중 6개(C2~C7)가 A3 정상 수렴에 걸려 있었다. v7 내에서는 구현 결함 때문에 검증 자체가 불가능했고, 이 검증 책임은 v8로 넘어갔다."
§7 v7 에서 계승된 자산 (v8/track-f로 이전)¶
ADR-008 §"v7 에서 계승" 기반. 본 자산은 v8 실패 이후 track-f에서도 계속 재사용되고 있다 (v8 closure §5).
| 자산 | 위치 | 계승 상태 |
|---|---|---|
| Golden tensor G1~G5 pre-registration | outputs/v7_stage0/golden_tensors/*.npy, definition_hash = 8be2bd2f691deed0 |
변경 없이 유지 |
| v7_runner.py CLI + CELL_REGISTRY (12종) | experiments/federated/v7_runner.py |
v8에서 V4/V5 추가 후 행동 불변 보존 |
| 공용 모듈 | src/peak_analysis/v7/metrics.py |
변경 없음 |
| Smoke infrastructure + 6 Gate | experiments/federated/v7_stage05_smoke_analysis.py |
rel_decrease metric 포함 |
| 155+ test suite | tests/ |
유지 |
| 5-seed set | {42, 123, 456, 789, 2024} | 유지 |
| Apt_max_load 지정 | Apt88 | 유지 |
| Fail-fast threshold | val ratio > 1.5, train > 3.0 | 유지 |
| peak-weighted loss (α=2.0, β=0.1) | src/peak_analysis/v7/metrics.py |
변경 없음 |
| 9-run smoke MLflow 데이터 | experiment v7-peak-aware-fl |
v8 개선 전/후 비교 baseline으로 보존 |
7.1 쉬운 요약¶
"v7 자체는 실패했지만, v7이 만든 스캐폴딩 — 검증 규칙, 단일 runner, 테스트 suite, 9개 증거 run — 은 그대로 다음 phase로 넘어가 지금도 사용 중이다."
§8 v7에서 확인된 Process 가치¶
8.1 Gate 5 재설계: "작동 불가능한 임계"를 실제 분포로 교정¶
- 기존 legacy 임계
moving/initial < 0.5가 v6 n=22 converged back-test에서 0/22 PASS(false-positive rate = 1.0)로 사실상 불가능한 임계임을 발견 - 실제 분포(v6 p05=−0.0005, p10=0.0017, p50=0.0350)에 기반해 rel_decrease 3-tier로 재설계 → v6 back-test TPR 90.9%
- 이 사례는 임계 제시 시 v(N−1) 분포 back-test 동반이라는 원칙의 실증
8.2 Q1/Q2/Q3 정책의 실제 발동¶
- Q2 (Gate FAIL 시 자동 engineer 호출 + 사용자 알림): Gate 5 FAIL에서 실제 발동, policy 검증됨
- Q1 (NaN seed 재실행), Q3 (early checkpoint stop-and-wait)는 Stage 1 진입하지 않아 미발동 (대기)
8.3 Fail-fast + 사전 등록 + 단일 entry point + golden tensor가 구현 결함을 실제로 포착¶
- Stage 0 pre-registration의
definition_hash+ Gate 1 hash assertion이 코드 drift 차단 - 단일 entry point(v7_runner.py) 덕분에 smoke 9 run이 main 경로와 100% 동일 코드로 실행되어 A3 발산이 "실험 스크립트 차이"가 아닌 "진짜 현상"임이 보증됨
- Stage 0.5 smoke가 ~2h 만에 16pp 격차의 구현 결함을 포착 — Stage 1 (25 runs × baselines × ~3h 병렬) 진입 전 fail-fast 성공 사례
8.4 쉬운 요약¶
"v7 프로세스는 Stage 1에 25개 run을 태우기 전에 Stage 0.5 smoke(9 run, 2시간)에서 핵심 결함을 잡아냈다. 실험이 실패로 끝나긴 했지만, 이 실패는 시간이 덜 소모된 지점에서 일어났다 — 이것이 fail-fast 설계의 핵심 가치."
§9 Workload 회고¶
| 항목 | 초기 추정 (design §7) | 실제 진행분 |
|---|---|---|
| Stage 0 사전 등록 | 0.5h | 0.5h (2 cycle, 완료) |
| Stage 0.5 smoke (9 run) | 2h | ~2h (완료, Gate 5 FAIL) |
| Gate 5 재설계 | — | +0.5~1h (완료) |
| A3 발산 진단 ablation (A1/A2/A4/V1~V3) | — | +4~8h (완료, v8 closure §1 인용분) |
| Stage 1 baseline (25 runs) | 3h | HOLD → v8 이관 |
| Stage 2 ablation (20 runs) | 7h | HOLD → v8 이관 |
| Stage 4 VQ 개선 (15 runs) | 5.5h | HOLD → v8 이관 |
| Stage 5 통계 + Stage 6 TSFM + 발표자료 | 12h | HOLD → track-f 이관 |
| v7 총 소요 | 32~34h 추정 | ~7~11h 실제 (Stage 0 + 0.5 + 진단) |
Stage 1~6 HOLD 상태로 v8 이관되었으며 v8 역시 실패하여 track-f로 재분기되었다. 발표자료 마감 일정 영향은 v8 closure §4~§6 및 track-f ADR-009에서 별도 관리.
9.1 쉬운 요약¶
"예정 32~34h 중 ~7~11h를 실제로 썼고, 남은 시간은 다음 단계(v8, track-f)로 넘어갔다. '계획 범위의 20~30%'만 소모한 지점에서 결함을 포착한 것이 설계의 의도대로 동작한 것."
§10 후속 경로¶
10.1 ADR-008 → v8 VQ Methodology Rescue¶
- 착수: 2026-04-20
- 범위: v7 infra 유지 +
MemoryAlignmentServer(γ=0.95, δ=0.6) + RESET(threshold=2) 통합 + 신규 cell V4/V5 - 목표: PAPE < 50 (A1 47.1 이하)
- 결과: 2026-04-21 실패로 closure
- V4 (alignment only): PAPE 56.51 (FAIL)
- V5 (alignment + RESET): PAPE 53.32 (FAIL)
- 원인: v6 decoder가 Transformer가 아니라 FC-MLP(957K params)였고 v7 Conv1d(25K)와 38.6× capacity 격차. VQ 정렬 복원은 이 bottleneck을 우회하지 못함
- v6 FL aggregation도 cos_similarity + client_personalized로 plain FedAvg와 다름 — 추가 교란
10.2 ADR-009 → track-f Decoder Capacity Swap¶
- 착수: 2026-04-21
- 범위: W1 (FC-MLP decoder 복원) + W2 (축소 Transformer decoder) 병렬 1-seed smoke → PAPE 낮은 variant를 5-seed primary로 선정
- 상세:
docs/reference/project_state/track_f_decoder_swap.md, v8 closure §4
10.3 v7 phase 후속 산출물¶
본 closure 보고서가 v7 phase의 최종 공식 산출물이며, 이후 v7 관련 신규 보고서는 작성되지 않는다.
10.4 쉬운 요약¶
"v7 → v8(VQ 서버 정렬 수정 시도, 실패) → track-f(decoder 용량 복원 시도, 진행 중). v7의 결함 규명은 정확했지만, v8에서 고친 것만으로는 v6 성능이 돌아오지 않았다. 진짜 격차는 decoder 크기에 있었다."
§11 참고 자료¶
11.1 상류 결정 문서¶
docs/decisions/ADR-007_v6_to_v7.md— v7 clean restart 착수 결정 (Approved 2026-04-19)docs/decisions/ADR-008_v7_to_v8.md— v7 종결 + v8 착수 결정 (Approved 2026-04-20)
11.2 Design / TODO¶
docs/reference/project_state/track_v7_design.md— v7 design spec (§1 Claim, §2 pre-registration, §3 Stage 0~6, §4 안전망, §7 workload)todos/track-v7_peak_aware_fl.md— 활성 TODO (본 closure 시점에는todos/archive/로 이동 대상)
11.3 Expert / Critic 산출물 (Stage 0)¶
report/version7/exp-expert/v7_0419_stage0_preregistration.md(v1)report/version7/exp-expert/v7_0419_stage0_preregistration_v2.md(v2 최종)report/version7/exp-critic/v7_0419_stage0_preregistration_review.md
11.4 Expert / Critic 산출물 (Stage 0.5)¶
report/version7/exp-expert/v7_stage05_gate_criteria.mdreport/version7/exp-expert/v7_stage05_engineer_contract.mdreport/version7/exp-expert/v7_stage05_smoke_infra_v2.md(v2 최종)report/version7/exp-critic/v7_stage05_smoke_infra_review.mdreport/version7/exp-expert/v7_stage05_gate5_redesign_v2.mdreport/version7/exp-critic/v7_stage05_gate5_threshold_review.mdreport/version7/exp-expert/v7_stage05_gate5_engineer_contract.md
11.5 중간 보고서 (draft)¶
report/version7/reporter/v7_stage0_stage05_interim_report.md— Stage 0 + Stage 0.5 중간 보고서 (본 closure의 전신)
11.6 후속 closure 참조¶
report/version8/reporter/v8_0420_closure.md— v8 closure. §1/§2에 v7의 A3/VQ 진단 수치와 decoder capacity 격차가 정리되어 있으며 본 closure의 §5/§10 수치 근거
11.7 MLflow Experiments¶
| Experiment | 용도 | Runs |
|---|---|---|
v7-stage0-preregistration |
Stage 0 v3 산출 (golden tensor freeze + hash) | 1 |
v7-peak-aware-fl |
Stage 0.5 smoke + 진단 ablation | 9+ |
11.8 주요 출력 파일 (재현 참조)¶
outputs/v7_stage0/stage0_summary.jsonoutputs/v7_stage0/golden_tensors/{G3,G4,G5}_y_{true,pred}.npyoutputs/v7_stage05/smoke_verdict_20260420_021905.jsonoutputs/v7_stage05/smoke_gate5_preview.jsonoutputs/v7_stage05/v6_gate5_backtest.jsonoutputs/v7_stage05/figures/smoke_{pape,hr,mse}_avg_20260420_021905.png
11.9 재현 명령¶
# Stage 0 재실행
uv run python -m experiments.federated.v7_0419_stage0_preregistration
# Smoke 재실행
uv run python -m experiments.federated.v7_runner \
--mode=smoke --households=Apt6,Apt88 --cells=B0,B2,A3 --seeds=42,43,123
# 6-Gate 재평가
uv run python -m experiments.federated.v7_stage05_smoke_analysis
# v6 Gate 5 back-test
uv run python -m experiments.federated.v7_stage05.v6_gate5_backtest
§12 마무리¶
v7 Peak-Aware FL Clean Restart phase는 조기 종결된다. 이 phase의 목표였던 초록 검증(C2~C7)은 Stage 0.5 smoke 및 후속 진단 ablation에서 드러난 VQ 경로 구현 결함으로 인해 v7 범위 내에서 달성되지 않았다. 그러나 이 phase는 다음 세 가지 구체적 가치를 남겼다.
- 검증 규약: Golden tensor 5종 + definition_hash + 7-metric fail-fast + Option B threshold + Gate 5 rel_decrease 3-tier. 이 규약은 v8, track-f 모두에 그대로 계승되었다.
- 단일 entry point + 테스트 suite: v7_runner.py + 155+ tests. 이후 phase는 신규 runner를 쓰지 않고 이 파일에 cell 추가 방식으로만 확장된다.
- 결함 포착 증거: Stage 0.5 smoke ~2h 만에 v6 대비 16pp 격차를 포착하고 원인을 VQ 경로 구현 결함으로 정확히 규명 — Stage 1 (25 runs) 비용 낭비 회피.
v7 관련 추가 실험이나 보고서는 작성되지 않는다. VQ 방법론의 실제 복원 여부는 v8 closure(report/version8/reporter/v8_0420_closure.md)가, decoder capacity 원복에 의한 PAPE 재달성 여부는 track-f(ADR-009)가 각각 처리한다.
보고자: Peak Analysis Research Team (reporter 역할)
상태: final (본 보고서가 v7 phase의 최종 closure 문서)
연계: v8 closure(v8_0420_closure.md, final) + ADR-007/008/009