File size: 4,334 Bytes
f065e53 adc76ac | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # Phase-2 ์ ํ ๋
ธํธ (DiT unfreeze) โ 2026-07-16 (์ต์ข
๋ณธ, B ๋ฐฉ์)
## ๋ฌด์์ด ๋ฐ๋์๋
Phase-1: **DiT trunk(453M) ์์ freeze**, encoder(ViT)+attn-pool+cond๋ง ํ์ต.
Phase-2: **DiT unfreeze**, encoder์ **๋์ผ lr**๋ก ํจ๊ป ํ์ต (dit_lr_scale ์์).
## LR ์ฒ๋ฆฌ (์ค์ โ B ๋ฐฉ์์ผ๋ก ํ์ )
Phase-1์ step380000์์ **100-epoch warmup์ 38% ์ง์ (lrโ9.5e-6)**์ด์์.
Phase-2๋ ์ด ์ง์ ๋ถํฐ **์๋ warmup ์ค์ผ์ค์ ๊ทธ๋๋ก ์ด์ด๊ฐ**:
- ์์ lr โ **9e-6** (step380000 ๊ฐ๊ณผ ๋์ผ), warmup์ด ๋๋๋ฉฐ(step 1,000,800) **2.5e-5๋ก ์ ์ ๋๋ฌ**.
- โ fresh 100ep warmup(0๋ถํฐ, full๊น์ง 48h) ์๋ โ ๊ทธ๊ฑด ๋ญ๋น๋ผ ํ๊ธฐ.
- โ 3ep ๋จ์ถ warmup(0โ2.5e-5 ๊ธ์์น) ์๋ โ DiT init์ ๊ธ๊ฒฉ.
- โ
step380000 LR ์ง์ ์์ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด๋ฐ์ ์๋ ์ค์ผ์ค๋๋ก ์์น.
## ์ด๋ป๊ฒ (๊ตฌํ)
1. **๊ฐ์ค์น**: `init_from`์ด accelerate ckpt ๋๋ ํ ๋ฆฌ๋ ๋ฐ๋๋ก ํ์ฅ โ step380000์
model.safetensors(encoder+pool+DiT+cond) ๋ก๋. (loss ์ฐ์์ฑ์ผ๋ก ๊ฒ์ฆ: ์์ diff/repa๊ฐ
Phase-1 ์ข
๋ฃ๊ฐ๊ณผ ๋์ผ)
2. **LR ์ค์ผ์ค ์์น**: trainer์ `PHASE2_RESUME_STEP` env ์ถ๊ฐ โ `self.steps=380000`์ผ๋ก
์ค์ . loaded_steps=-1์ด๋ผ **๋ฐ์ดํฐ fast-forward ์์ด**(38 epoch ์ฌ์ฝ๊ธฐ ํํผ) ์ค์ผ์ค๋ฌ๊ฐ
`step_update(380000)`์ผ๋ก lr=9e-6 ์์น. warmup_epochs=100 ์ ์ง.
3. **optimizer**: fresh (frozenโunfrozen์ด๋ฉด param group 134Mโ599M ๋ณ๊ฒฝ โ accelerate ์ ์ฒด
load_state ๋ถ๊ฐ). momentum๋ง ์๋ก, LR ์์น๋ ์ ํ.
4. **ckpt ๋ฒํธ**: step380000๋ถํฐ ์ด์ด๊ฐ **step390000, 400000...** ์ฐ์ ์ ์ฅ (์ฌ์์ ์๋).
5. trainable 134M(P1) โ **599M(P2, DiT ํฌํจ)**. FID eval์ step400000(50k ๋ฐฐ์)์์ ์ฒซ ์์.
## ํ์ผ (์ ๋ถ ์ด repo code/ ์ ์
๋ก๋๋จ)
- `spatial_diffuse_slot.py` โ ๋ชจ๋ธ(SpatialAttnPool + DiTSpatial + init_from ๋๋ ํ ๋ฆฌ ์ง์)
- `spatial_mask.py` โ spatial-align mask ๋น๋
- `diffusion_trainer_PHASE2_PATCH.txt` โ trainer์ PHASE2_RESUME_STEP ํจ์น (์ ์ฉ ์์น ๋ช
์)
- `trainer_utils_create_optimizer.py` โ dit_lr_scale ์ง์ create_optimizer (B์์ ๋ฏธ์ฌ์ฉ, ์ฐธ๊ณ )
- `tokenizer_l_spatial.yaml` (Phase-1) / `tokenizer_l_spatial_phase2.yaml` (Phase-2)
- `train_spatial_l.sh` (P1) / `train_spatial_l_phase2.sh` (P2, PHASE2_RESUME_STEP env)
- `hf_ckpt_watcher.py` (P1) / `hf_ckpt_watcher_phase2.py` (P2) / `make_loss_plot*.py`
## HF ๋ค์์คํ์ด์ค (์ด repo)
- Phase-1(frozen, ๋ณด์กด): `step360000~380000/`, `samples_all_steps/`, `loss_curves.png`
โ **step380000/์ Phase-2 init ์์ค๋ผ ๋ฐ๋์ ์ ์ง** (resume์ ํ์)
- Phase-2(unfrozen): `phase2_step390000+/`, `samples_all_steps_phase2/`, `loss_curves_phase2.png`, `logs_phase2/`
- watcher๊ฐ ์ต์ 2๊ฐ ์ ์ง + squash(์ฉ๋ ํ์). repo๋ **public**(private ์ฉ๋ํ๋ ํํผ).
## resume (์ ์๋ฒ)
1. `code/`์ ํ์ผ๋ค + `semanticist` repo์ ๋ฐฐ์น, `diffusion_trainer.py`์ PHASE2 ํจ์น ์ ์ฉ.
2. Phase-2 ์ด์ด๊ฐ๊ธฐ: ์ต์ `phase2_stepN/`(HF)์ ๋ก์ปฌ์ ๋๊ณ `configs/tokenizer_l_spatial_phase2.yaml`์
`init_from`์ ๊ทธ ๊ฒฝ๋ก๋ก, `PHASE2_RESUME_STEP=N`์ผ๋ก `train_spatial_l_phase2.sh` ์คํ.
3. Phase-2 ์ฒ์๋ถํฐ: `init_from=step380000` + `PHASE2_RESUME_STEP=380000` (ํ์ฌ ์ค์ ).
## Level drop ์ถ๊ฐ (2026-07-16, step390000๋ถํฐ)
์ฐ๋ฆฌ multi-res ๋ฐฉ์์ ํต์ฌ์ธ **level drop(nested)** ๋ฅผ Phase-2์ ์ถ๊ฐ (step390000์์ resume).
- **๋ฐฉ์**: whole-level, coarse-first. keep_levels ~ uniform(1,4) โ {1x1},{1x1,2x2},{1x1,2x2,4x4},{all} ๊ฐ **25%**.
โ ๋ ๋ฒจ๋ณ ์ ์งํ๋ฅ 1x1=100%, 2x2=75%, 4x4=50%, 8x8=25%.
- **์ 25%(๋ ๋ฒจ๊ท ๋ฑ)**: ํ ํฐ๋น์จ(uniform-over-token) ๋ฐฉ์์ 8x8์ด 64/85๋ผ coarse-only๊ฐ ๊ฑฐ์ ํ์ต ์ ๋จ.
๋ ๋ฒจ๊ท ๋ฑ์ ๋ชจ๋ granularity๋ฅผ ๊ณ ๋ฅด๊ฒ ํ์ต โ ๊ฐ ๋ ๋ฒจ์ด ๋
๋ฆฝ์ ์ผ๋ก ์ธ๋ชจ์์ (multi-res reasoning ๋ชฉ์ ).
- **๋๋กญ ์์**: 8x8(finest, DiT ์ด๋ฏธ์งํ ํฐ๊ณผ 1:1)๋ถํฐ ๋๋กญ, 1x1(global)์ ํญ์ ์ ์ง.
์ ๋ถ ๋๋กญ(uncond)์ CFG(uncond_drop_prob)๊ฐ ๋ฐ๋ก ๋ด๋น.
- **๊ตฌํ**: `LevelNestedSampler` (spatial_diffuse_slot.py), config `enable_nest: True`.
- inference: `inference_with_n_slots`(ํ ํฐ budget)๋ฅผ whole-level prefix๋ก ๋งคํ (85โall, 21โ8x8 drop, 5โ[2x2,1x1], 1โ[1x1]).
|