그날의 숫자
| 지표 | 값 |
|---|---|
| 세션 코드 | 2412cf47 (02-10 ~ 03-04, 약 3주) |
| Phase 수 | 13 (Phase 0 백업 → Phase 13 production 파이프라인) |
| Phase 0 백업 파일 | 2,373 + creatures.json + generation_queue.json |
| Phase 1 무결성 감사 이슈 | 4,617건 |
| Phase 2 파일 이동 / 중복 제거 / 고아 격리 | 1,725 / 58 / 320 |
| Phase 3 시각 품질 스캔 | 1,974장 (손상 1 / 중복 82 제거 / 누락 533) |
| Phase 3 프롬프트 커버리지 복원 | 1,576개 → 100% |
| DoRA 학습 (Phase 6) | 1,100 steps / 46.1분 / VRAM peak 2.73GB / 8GB |
| SDXL 전환 (Phase 8) | 768×1344 / 20시간 18분 |
| Grid Search (Phase 10) | 54 combos |
데이터 출처: P 의 게임 작업 로그 §A (2412cf47 세션 전체 기록). 모든 수치는 그 로그의 Phase별 실측.
무슨 일이 있었나
처음에 P 가 하려던 건 단순했다. 캐릭터 한 종을 일관된 화풍으로 양산하는 LoRA 를 학습시키는 것. 그런데 학습을 시작하기도 전에 Phase 1 의 감사 스크립트가 4,617건의 이슈를 뱉었다.
avmp_audit.py → 4,617건 이슈
audit_prompt_generation.py → 174/256 프롬프트 전무, 80건 한국어 혼입
학습 데이터 자체가 엉망이었다는 뜻이다. 2,373장을 백업해 두고(Phase 0), P 는 학습이 아니라 청소부터 시작했다. Phase 2 에서 1,725 파일을 옮기고 58개 중복을 지우고 320개 고아 파일을 격리했다. flat file = 0 이 될 때까지. Phase 3 에서는 1,974장을 스캔해 손상 1건, 누락 533건을 찾아내고 프롬프트 커버리지를 100% 로 되돌렸다.
여기까지가 3 Phase다. 아직 학습은 한 줄도 안 돌렸다.
학습은 Phase 4 부터였다. SD 1.5 기반 LoRA → flatness(평면화) 한계에 부딪혀 Phase 6 에서 DoRA 로 갈아탔다.
Method: DoRA | Rank: 32 | bf16 | AdamW8bit
Dataset: 597 → 110장 (CLIP → WD14+BLIP 재캡션)
1,100 steps / 46.1분 / Best loss 0.087(E8)
VRAM Peak: 2.73GB / 8GB ← 8GB 카드 한 장으로 버틴 기록
8GB 한 장으로 돌리려고 Sysmem Fallback 을 차단하고 Power Limit 을 80% 로 묶었다. 그렇게 Phase 7(Style Core), Phase 8(SDXL 전환, 20시간 18분), Phase 9(4-Loop 학습), Phase 10(54조합 Grid Search)까지 갔다.
실패
이 13 Phase 는 성공의 사다리가 아니라 실패의 목록에 가깝다.
- Phase 4 — SD 1.5 LoRA 가 flatness 한계로 좌초. 화풍이 납작해져서 입체감이 안 나왔다. → 방법 자체를 DoRA 로 교체.
- Phase 9 — AITRS 4-Loop 중 Loop 4 가 overfitting.
loop_03/epoch005(Score 37.28)가 best 였고 그 뒤로는 학습할수록 나빠졌다. P 는 "더 돌리면 더 좋아진다"는 직관이 틀렸다는 걸 score 곡선으로 봤다. - Phase 11 — 학습 결과물에서 외부 상용 게임 IP 의 워터마크 키워드가 자꾸 따라 나왔다. 데이터셋이 그 IP 영향을 받았다는 증거였다.
clean_watermark_v2.py를 만들고 그 키워드를 제거한 뒤 40 Epoch 재학습해서야 캐릭터 A 와 캐릭터 B 둘 다 통과했다.
세 번의 실패가 각각 다음 Phase 의 입력 조건이 됐다. flatness 실패 → DoRA. overfitting → epoch005 고정. 워터마크 → 재학습. 이게 evidence 카드 E001 이 말하는 그것이다 — AI 활용은 단발 답변이 아니라 실행 · 검증 · 실패 복구 · 기록화 루프다. 13 Phase 가 통째로 그 루프의 13바퀴였다.
그날의 깨달음
- 학습 전에 청소가 3 Phase 다. 모델을 잘 고르는 것보다, 4,617건 이슈가 박힌 데이터셋을 1,576 프롬프트 100% 커버리지로 되돌리는 게 먼저였다. 결과 품질의 대부분은 Phase 4 이전에 결정됐다.
- "더 돌리면 더 좋아진다"는 거짓이다. Loop 4 overfitting 이 그걸 score 로 증명했다. best 는 중간(epoch005)에 있었고, 그걸 멈출 줄 아는 게 학습의 실력이었다.
- 데이터셋의 출처는 결과물에 새겨진다. 워터마크 키워드가 따라 나온 건 우연이 아니라 데이터의 지문이었다. 그걸 지우는 데 40 Epoch 가 더 들었다.
다음 날
Phase 13 의 ComfyUI Ultimate Pipeline(Txt2Img → Hires.Fix → FaceDetailer)이 돌기 시작했을 때, P 는 캐릭터 한 종을 production 품질로 뽑을 수 있게 됐다. 그 "한 종"을 위해 3주와 13 Phase 가 들었다.
그런데 그 13 Phase 의 기록이 남아 있었기 때문에, 두 번째 캐릭터는 13 Phase 가 아니라 3 Phase 면 됐다. 첫 종의 노가다가 두 번째 종의 파이프라인이 된 것. 그게 이 3주의 진짜 산출물이었다 — 캐릭터가 아니라, 캐릭터를 만드는 법.
Editor's note: 모든 Phase 수치(파일 수 / 이슈 4,617 / steps / VRAM / 시간)는 P 의 게임 작업 로그 §A 2412cf47 세션 직접 인용. 캐릭터명은 캐릭터 A/B 로, 외부 게임 IP 명은 일반화. 학습 방법(DoRA/SDXL/Grid Search)은 공개 ML 기법이라 그대로 표기. [ASSET_PIPELINE_V3] 는 codename. 서사·감정선은 일반화이며 실제 작업은 더 단편적이었다.