| # 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]). |
|
|