TL;DR
- 경계: prefix 조건 LoRA(250 step)로 경계 프레임 차이가 중앙값의 3.5–5.3x → 0.9–2.7x (300클립 9개 측정 중 1.5x 이하 3개)
- 붕괴: step 1,500에서 첫 chunk 화질 붕괴 (대장간 밝기 75.2→29.0, 선명도 145→35). 3,510클립(1.7 epoch)에서도 동일 → "300클립 과적합" 가설 기각
- 결론: 지금은 step 250–750 조기 중단만 가능. 원인 분리 대조실험(prefix=0) 필요
1 배경 / 목적
261006 학습 없는 overlap 고정은 3클립 모두 실패(경계 프레임 차이가 chunk 내부 중앙값의 3.5–5.3x). 모델이 "앞 프레임 clean, 뒤 noise" 상태를 학습한 적이 없기 때문으로 판단. 큰 비용 전에 pilot으로 판정.
통과 기준: (1) 경계 차이 ≤ 중앙값의 1.5x, (2) 처음부터 생성하는 첫 chunk 품질이 기존 LoRA 대비 눈에 띄게 나빠지지 않을 것.
2 작업 내용
args.py: --max_prefix_latents (기본 0 = 기존), --init_lora_path
sft_trainer.py compute_loss: step의 1/4은 K=0, 나머지 K∈[1,5]개 ego 앞 latent를 clean으로 두고 loss 제외
trainer.py: init_lora_path state dict 로드 (640 tensors)
추론: overlap_clean / --overlap_clean / OVERLAP_CLEAN=1, LORA_PATH
scripts/finetune_prefix.sh: ckpt-10000에서 시작, rank 256 / alpha 256, lr 2e-5, batch 1×GPU, 250 step마다 저장(6개 유지), 자동 재개
기존 학습 경로 버그 3건
1) wan_dataset.py is_t2v가 T2V 하위 클래스에서만 설정 → I2V AttributeError를 while True: try/except가 삼켜 무한 재시도 (job 176927 1:30h 헛돌고 로그 429MB). 2) latent 캐시만 있고 attn map 캐시가 없으면 UnboundLocalError. 3) do_kv_cache=True 고정 → 학습에서 첫 샘플 exo K/V 재사용 + gradient checkpointing dtype 불일치 크래시 → False로 변경.
checkpoint-10000의 원래 학습 설정(kv cache)은 확인 불가 (해당 코드가 git에 커밋된 적 없음).
평가: 3클립(호떡 / 야구장 / 대장간), 89프레임 2 chunk, overlap 9, seed 42.
3 결과
300클립 pilot (4 GPU, 16.0 s/step, 1,500 step, job 177136→177275)
경계(48→49) 프레임 차이 / chunk 내부 중앙값 배수
| 클립 | 학습 전 | step 250 | step 750 | step 1,500 |
| 호떡 | 3.5x | 0.9x | 2.1x | 1.2x |
| 야구장 | 4.4x | 2.3x | 1.6x | 2.7x |
| 대장간 | 5.3x | 1.7x | 1.5x | 1.6x |
첫 chunk ego 평균 밝기 (기존 LoRA: 62.1 / 59.9 / 75.2)
| 클립 | step 250 | step 750 | step 1,500 |
| 호떡 | 76.3 | 75.1 | 71.0 |
| 야구장 | 54.7 | 52.2 | 47.6 |
| 대장간 | 87.9 | 50.4 | 29.0 (선명도 145→35) |
기준 1.5x 이하는 9개 중 3개, step에 따라 단조 감소 아님(야구장 2.3→1.6→2.7). 첫 chunk 화질은 step이 늘수록 악화, ego PSNR(기존 LoRA 첫 chunk 대비) 11.8–16.0 dB.
3,510클립 재실행 (과적합 가설 검증, 1.7 epoch, preempt 4회 자동 재개)
캐시 이름 충돌 버그 발견: 같은 take의 다른 구간 클립이 한 캐시를 공유해 3,510→1,394 latent로 뭉개짐, 약 60% 영상-캡션 구간 어긋남 (job 177639 취소). 클립 폴더명 기반으로 수정. 3,508개 사용(2개는 dtype NoneType 오류 제외).
| 클립 | 경계 학습 전 | step 250 | step 750 | step 1,500 |
| 호떡 | 3.5x | 3.9x | 0.9x | 2.0x |
| 야구장 | 4.4x | 1.5x | 2.2x | 2.3x |
| 대장간 | 5.3x | 1.7x | 1.5x | 1.2x |
대장간 선명도 146→53, 야구장 139→70 (step 1,500). 호떡은 ego가 아닌 상인 정면 장면 생성. 경계 1.5x 이하 4/9.
4 Takeaway
prefix 조건 학습은 250 step만으로 chunk 간 장면 연속성을 만든다 (학습 없는 방식은 불가).
데이터 11.7배, epoch 1.7에도 같은 step에서 같은 붕괴 → 원인은 데이터 양이 아니라 학습 설정. 후보: (a) kv cache off가 원래 학습과 다름, (b) prefix 조건이 K=0 생성을 해침, (c) lr 2e-5 / batch 4.
현재 쓸 수 있는 것은 step 250–750 조기 중단뿐. "확실히 된다"고 할 수 없는 상태.
5 Next Steps
- 대조 실험:
--max_prefix_latents 0 동일 학습 (4 GPU, 750 step ≈ 3.5h). 붕괴하면 kv cache/lr 문제, 아니면 prefix 부작용.
- checkpoint-10000 원래 설정(kv cache, lr) 확인.
- seed 3개 이상, 3 chunk(129f) drift, 첫 chunk 정량 지표.
- 디스크: prefix_full_v2 47GB, prefix_pilot 47GB, train_full/cache 118GB (잘못된 캐시 ~30GB 포함) 정리.