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 ์ง์ ์์ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด๋ฐ์ ์๋ ์ค์ผ์ค๋๋ก ์์น.
์ด๋ป๊ฒ (๊ตฌํ)
- ๊ฐ์ค์น:
init_from์ด accelerate ckpt ๋๋ ํ ๋ฆฌ๋ ๋ฐ๋๋ก ํ์ฅ โ step380000์ model.safetensors(encoder+pool+DiT+cond) ๋ก๋. (loss ์ฐ์์ฑ์ผ๋ก ๊ฒ์ฆ: ์์ diff/repa๊ฐ Phase-1 ์ข ๋ฃ๊ฐ๊ณผ ๋์ผ) - LR ์ค์ผ์ค ์์น: trainer์
PHASE2_RESUME_STEPenv ์ถ๊ฐ โself.steps=380000์ผ๋ก ์ค์ . loaded_steps=-1์ด๋ผ ๋ฐ์ดํฐ fast-forward ์์ด(38 epoch ์ฌ์ฝ๊ธฐ ํํผ) ์ค์ผ์ค๋ฌ๊ฐstep_update(380000)์ผ๋ก lr=9e-6 ์์น. warmup_epochs=100 ์ ์ง. - optimizer: fresh (frozenโunfrozen์ด๋ฉด param group 134Mโ599M ๋ณ๊ฒฝ โ accelerate ์ ์ฒด load_state ๋ถ๊ฐ). momentum๋ง ์๋ก, LR ์์น๋ ์ ํ.
- ckpt ๋ฒํธ: step380000๋ถํฐ ์ด์ด๊ฐ step390000, 400000... ์ฐ์ ์ ์ฅ (์ฌ์์ ์๋).
- 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 (์ ์๋ฒ)
code/์ ํ์ผ๋ค +semanticistrepo์ ๋ฐฐ์น,diffusion_trainer.py์ PHASE2 ํจ์น ์ ์ฉ.- Phase-2 ์ด์ด๊ฐ๊ธฐ: ์ต์
phase2_stepN/(HF)์ ๋ก์ปฌ์ ๋๊ณconfigs/tokenizer_l_spatial_phase2.yaml์init_from์ ๊ทธ ๊ฒฝ๋ก๋ก,PHASE2_RESUME_STEP=N์ผ๋กtrain_spatial_l_phase2.sh์คํ. - 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), configenable_nest: True. - inference:
inference_with_n_slots(ํ ํฐ budget)๋ฅผ whole-level prefix๋ก ๋งคํ (85โall, 21โ8x8 drop, 5โ[2x2,1x1], 1โ[1x1]).