Black Forest Labs์ FLUX.2 [dev] 32B ๋ชจ๋ธ ์ํคํ ์ฒ๋ฅผ FLUX.1๊ณผ ๋น๊ตํ๋ฉฐ, ํ ์คํธ ์ธ์ฝ๋, Transformer ๊ตฌ์กฐ, VAE, Sampling ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ด ๋๋ค. ๋ณธ ํฌ์คํ ์ claude code์๊ฒ flux.2[dev] ๊ตฌ์กฐ๋ฅผ ๋ถ์์ํจ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๊ธ ๋ํ claude code๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ ๋ฐ ์ ๋ฆฌ๋์์ต๋๋ค.
Introduction
FLUX.1์ Stability AI์์ ๋ ๋ฆฝํ Black Forest Labs๊ฐ 2024๋ ์ ๊ณต๊ฐํ flow matching ๊ธฐ๋ฐ์ text-to-image ๋ชจ๋ธ์ ๋๋ค.1 FLUX.1์ ์ ์ฒด์ ์ธ ๋ฐฐ๊ฒฝ๊ณผ flow matching์ ๋ํด์๋ ์ด์ ํฌ์คํ ์์ ๋ค๋ฃจ๊ณ ์์ผ๋ ์ฐธ๊ณ ํ์๋ฉด ์ข์ต๋๋ค.
FLUX.1์ 12B ํ๋ผ๋ฏธํฐ๋ก ๋น์ ๋ฐ์ด๋ ์ด๋ฏธ์ง ํ์ง์ ๋ณด์ฌ์ฃผ์์ง๋ง, ๋ช ๊ฐ์ง ํ๊ณ๊ฐ ์์์ต๋๋ค.12
- ํ ์คํธ ์ธ์ฝ๋: CLIP-L๊ณผ T5-XXL ๋ ๊ฐ์ ๋ณ๋ ๋ชจ๋ธ์ ๋์์ ๋ก๋ฉํด์ผ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ด ํผ3
- ์ด๋ฏธ์ง ํธ์ง: ๋ค์ดํฐ๋ธ ํธ์ง ๊ธฐ๋ฅ์ด ์์ด, InstructPix2Pix ๋ฑ ๋ณ๋ ๋ชจ๋ธ์ด ํ์3
- ์ ๋ ฅ ๋ชจ๋ฌ๋ฆฌํฐ: ํ ์คํธ๋ง ์ ๋ ฅ ๊ฐ๋ฅํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํ๋ ๋ฉํฐ๋ชจ๋ฌ ์์ฑ์ด ๋ถ๊ฐ๋ฅ1718
- ๋ชจ๋ธ ๋ค์์ฑ: ๋จ์ผ ํฌ๊ธฐ์ ๋ชจ๋ธ๋ง ์ ๊ณตํ์ฌ ๋ค์ํ ์ปดํจํ ํ๊ฒฝ์ ๋์ํ๊ธฐ ์ด๋ ค์1
FLUX.2 [dev]๋ ์ด๋ฌํ ํ๊ณ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.22 ํ ์คํธ ์ธ์ฝ๋๋ฅผ ๋ฉํฐ๋ชจ๋ฌ LLM ํ๋๋ก ํตํฉํ๊ณ 4, 32B ํ๋ผ๋ฏธํฐ๋ก ๋ชจ๋ธ ์ฉ๋์ ํค์ฐ๋ฉด์๋ ๋ ํจ์จ์ ์ธ ๋ธ๋ก ๊ตฌ์ฑ์ ์ ์ฉํ์์ต๋๋ค.6 ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง ํธ์ง๊ณผ ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ๋ ์ง์ํ๋ฉฐ4, Klein ๋ณํ(9B, 4B)์ ํตํด ๊ฒฝ๋ํ ์ต์ ๋ ์ ๊ณตํฉ๋๋ค.21 ์ด ๊ธ์์๋ FLUX.2์ ์ํคํ ์ฒ๋ฅผ FLUX.1๊ณผ ๋น๊ตํ๋ฉฐ ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Overall Pipeline
FLUX.2์ ์ ์ฒด ์ถ๋ก ๊ณผ์ ์ ํฌ๊ฒ ๋ค์ฏ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค.4
flowchart LR
A["Text Encoding<br>(Mistral-Small-3.2)"] --> C["Denoising Loop<br>(Flux2 Transformer)"]
B["VAE Encoding<br>(Image to Latent)"] --> C
C --> D["VAE Decoding<br>(Latent to Image)"]
D --> E["Post-processing<br>(C2PA, Watermark)"]ํ ์คํธ ํ๋กฌํํธ๋ Mistral ๊ธฐ๋ฐ์ ํ ์คํธ ์ธ์ฝ๋๋ฅผ ํตํด ์๋ฒ ๋ฉ์ผ๋ก ๋ณํ๋๊ณ 4, ์ด๋ฏธ์ง ํธ์ง ๋ชจ๋์์๋ ์ ๋ ฅ ์ด๋ฏธ์ง๊ฐ VAE๋ฅผ ํตํด ์ ์ฌ ๊ณต๊ฐ(latent space)์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค.4 ์ด ๋ ์ ๋ณด๊ฐ Flux2 Transformer์ denoising loop์ ๋ค์ด๊ฐ ๋ ธ์ด์ฆ๋ก๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ์ ์ง์ ์ผ๋ก ์์ฑํ๊ณ , ์ต์ข ์ ์ผ๋ก VAE ๋์ฝ๋๊ฐ ์ ์ฌ ๋ฒกํฐ๋ฅผ ๋ค์ ์ด๋ฏธ์ง๋ก ๋ณต์ํฉ๋๋ค.4
FLUX.1๊ณผ์ ํ์ดํ๋ผ์ธ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.2346
| ํญ๋ชฉ | FLUX.1 [dev] 12B | FLUX.2 [dev] 32B |
|---|---|---|
| Text Encoder | CLIP-L + T5-XXL (2๊ฐ) | Mistral-Small-3.2-24B (1๊ฐ) |
| ์ ๋ ฅ ๋ชจ๋ฌ๋ฆฌํฐ | ํ ์คํธ๋ง | ํ ์คํธ + ์ด๋ฏธ์ง (๋ฉํฐ๋ชจ๋ฌ) |
| ์ด๋ฏธ์ง ํธ์ง | ๋ฏธ์ง์ | ๋ค์ดํฐ๋ธ ์ง์ (single/multi-ref) |
| VAE Scale Factor | 8 | 16 |
| Transformer | 12B (Double 19 + Single 38) | 32B (Double 8 + Single 48) |
FLUX.2์์๋ ์ด๋ฏธ์ง ํธ์ง ๋ชจ๋๋ ์ง์ํฉ๋๋ค.4 ํธ์ง ๋์ ์ด๋ฏธ์ง๋ฅผ VAE ์ธ์ฝ๋์ ๋ฃ์ด ์ ์ฌ ๋ฒกํฐ๋ก ๋ณํํ ๋ค, ํ ์คํธ ํ๋กฌํํธ์ ํจ๊ป Transformer์ ์ ๋ ฅํ๋ฉด ์๋ณธ ์ด๋ฏธ์ง์ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์๋ ํ๋กฌํํธ์ ๋ฐ๋ผ ์์ ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.4 ๋ํ ์ฐธ์กฐ ์ด๋ฏธ์ง(reference image)๋ฅผ ์ฌ๋ฌ ์ฅ ์ ๋ ฅํ์ฌ ์คํ์ผ์ด๋ ๊ตฌ๋๋ฅผ ์ฐธ๊ณ ํ ์์ฑ๋ ๊ฐ๋ฅํฉ๋๋ค.4 ์ด๋ ์ฐธ์กฐ ์ด๋ฏธ์ง๋ ์ต๋ 768ร768 ํด์๋๋ก center crop๋ ๋ค, ํ ์คํธ ์ธ์ฝ๋(Mistral)๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค.4
Text Encoder
FLUX.1 ๋๋น FLUX.2์์ ๊ฐ์ฅ ๋์ ๋๋ ๋ณํ ์ค ํ๋๋ CLIP + T5์์ Mistral๋ก์ ํ ์คํธ ์ธ์ฝ๋ ์ ๋ฉด ๊ต์ฒด์ ๋๋ค.34
FLUX.1์ ๋ฐฉ์: ๋ ๋ชจ๋ธ์ ์กฐํฉ
FLUX.1์ CLIP-L(768์ฐจ์)๊ณผ T5-XXL(4096์ฐจ์) ๋ ๊ฐ์ ํ ์คํธ ์ธ์ฝ๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.2 CLIP-L์ ์ด๋ฏธ์ง-ํ ์คํธ ์ ๋ ฌ์ ํนํ๋ ์งง์ ์๋ฒ ๋ฉ์ ์ ๊ณตํ๊ณ , T5-XXL์ ๊ธด ํ ์คํธ์ ๋ํ ํ๋ถํ ์๋ฏธ ์๋ฒ ๋ฉ์ ์ ๊ณตํฉ๋๋ค.1718 CLIP-L์ ์ถ๋ ฅ์ ์ฃผ๋ก ์ ์ญ์ ์ธ conditioning vector๋ก ํ์ฉ๋์๊ณ , T5-XXL์ ์ถ๋ ฅ์ cross-attention์ ์ํ sequence ํํ์ ํ ์คํธ ์๋ฒ ๋ฉ์ผ๋ก ์ฌ์ฉ๋์์ต๋๋ค.3
ํ์ง๋ง ์ด ๋ฐฉ์์๋ ํ๊ณ๊ฐ ์์์ต๋๋ค. ๋ ๋ชจ๋ธ์ ๋์์ ๋ก๋ฉํด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ด ์ปธ๊ณ 3, ๊ฐ ๋ชจ๋ธ์ ์ถ๋ ฅ ์ฐจ์์ด ๋ฌ๋ผ ๋ณ๋์ projection์ด ํ์ํ์ต๋๋ค.2 ๋ํ CLIP๊ณผ T5๋ ํ ์คํธ๋ง ์ฒ๋ฆฌํ ์ ์์ด, ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐ ์กฐ๊ฑด์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค.1718
FLUX.2์ ๋ฐฉ์: ๋ฉํฐ๋ชจ๋ฌ LLM ํ๋๋ก ํตํฉ
FLUX.2๋ Mistral-Small-3.2-24B ํ๋๋ก ํ ์คํธ ์ธ์ฝ๋ฉ์ ์ฒ๋ฆฌํฉ๋๋ค.4 ๋จ์ํ ๋ง์ง๋ง ๋ ์ด์ด์ ์ถ๋ ฅ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, Layer 10, 20, 30์์ hidden state๋ฅผ ๊ฐ๊ฐ ์ถ์ถํฉ๋๋ค.4 Mistral์ hidden size๊ฐ 5120์ฐจ์์ด๋ฏ๋ก, ์ธ ๋ ์ด์ด์ ์ถ๋ ฅ์ concatํ๋ฉด ์ฐจ์์ ํ ์คํธ ์๋ฒ ๋ฉ์ด ๋ฉ๋๋ค.620
์ฌ๋ฌ ๋์ด์์ ์ฌ์ง์ ์ฐ๋ฏ์ด, ์์ ์ธต(Layer 10)์์๋ ํ๋ฉด์ ์ธ ๊ตฌ๋ฌธ ์ ๋ณด๋ฅผ, ์ค๊ฐ ์ธต(Layer 20)์์๋ ์๋ฏธ๋ก ์ ์ ๋ณด๋ฅผ, ๊น์ ์ธต(Layer 30)์์๋ ๊ณ ์ฐจ์์ ์ธ ์ถ๋ก ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค๊ณ ์ดํดํ ์ ์์ต๋๋ค.22 ์ด ๋ฐฉ์์ Qwen3-VL์ DeepStack ๋ฉ์ปค๋์ฆ๊ณผ๋ ์ ์ฌํ ๋ฐ์์ ๋๋ค.19 DeepStack์์๋ ViT์ ๋ง์ง๋ง ๋ ์ด์ด ๋ฟ ์๋๋ผ ์ค๊ฐ ๋ ์ด์ด๋ค์์ visual feature๋ฅผ ์ถ์ถํ์ฌ LLM์ ์๋ก ๋ค๋ฅธ ๋ ์ด์ด์ ์ฃผ์ ํจ์ผ๋ก์จ, ์ ์์ค ํ ์ค์ฒ ์ ๋ณด๋ถํฐ ๊ณ ์์ค ์๋ฏธ ์ ๋ณด๊น์ง ํ์ฉํ ์ ์๊ฒ ํ์ต๋๋ค.19
์ ๋ ฅ ์ฒ๋ฆฌ ์์๋ chat template๊ณผ system message๋ฅผ ์ ์ฉํ์ฌ Mistral์ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํฉ๋๋ค.4 ์ต๋ 512 ํ ํฐ๊น์ง ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ4, ์ด๋ฏธ์ง ์ ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ ์ต๋ 768ร768 ํด์๋๊น์ง ์ง์ํฉ๋๋ค.4 ๋ํ NSFW ํํฐ๋ง(threshold 0.85)์ ํตํด ๋ถ์ ์ ํ ์ฝํ ์ธ ๋ฅผ ๊ฑธ๋ฌ๋ ๋๋ค.4
| ํญ๋ชฉ | FLUX.1 | FLUX.2 |
|---|---|---|
| ๋ชจ๋ธ | CLIP-L + T5-XXL | Mistral-Small-3.2-24B |
| ๋ชจ๋ธ ์ | 2๊ฐ | 1๊ฐ |
| ์ถ๋ ฅ ์ฐจ์ | 768 + 4,096 | 15,360 (5,120 ร 3) |
| ์ถ์ถ ๋ฐฉ์ | ๋ง์ง๋ง ๋ ์ด์ด | Multi-layer (L10, L20, L30) |
| ์ด๋ฏธ์ง ์ ๋ ฅ | ๋ถ๊ฐ | ๊ฐ๋ฅ (768ร768) |
๊ทธ๋ ๋ค๋ฉด ์ ์ด๋ฐ ๋ณํ๋ฅผ ์ฃผ์์๊น์? ์ฒซ์งธ, ๋ฉํฐ๋ชจ๋ฌ LLM์ ์ฌ์ฉํจ์ผ๋ก์จ ํ ์คํธ๋ฟ ์๋๋ผ ์ด๋ฏธ์ง ์ ๋ ฅ๋ ๊ฐ์ ์ธ์ฝ๋๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค.20 ์ด๋ฅผ ํตํด ์ฐธ์กฐ ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ ์์ฑ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.4 ๋์งธ, ๋ ๊ฐ์ ๋ณ๋ ๋ชจ๋ธ ๋์ ํ๋์ ๋ชจ๋ธ๋ก ํตํฉํ์ฌ ํ์ดํ๋ผ์ธ์ด ๋จ์ํด์ก์ต๋๋ค.22 ์ ์งธ, 15,360์ฐจ์์ด๋ผ๋ ํ๋ถํ ์๋ฒ ๋ฉ ๊ณต๊ฐ์ ํตํด ๋ ์ธ๋ฐํ ํ ์คํธ ์กฐ๊ฑด ์ ์ด๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.22
Transformer
FLUX.2์ Transformer๋ FLUX.1๊ณผ ๋์ผํ๊ฒ Double-Stream Block๊ณผ Single-Stream Block์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ง๋ง, ๊ทธ ๋น์จ๊ณผ ๊ท๋ชจ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ก์ต๋๋ค.26
| ํญ๋ชฉ | FLUX.1 [dev] 12B | FLUX.2 [dev] 32B |
|---|---|---|
| Hidden Size | 3,072 (24 heads ร 128d) | 6,144 (48 heads ร 128d) |
| Double-Stream Blocks | 19 | 8 |
| Single-Stream Blocks | 38 | 48 |
| in_channels | 64 | 128 |
| FFN Activation | GELU | SwiGLU |
| joint_attention_dim | 4,096 | 15,360 |
FLUX.1์์๋ Double Block 19๊ฐ, Single Block 38๊ฐ์์ง๋ง, FLUX.2์์๋ Double Block์ 8๊ฐ๋ก ๋ํญ ์ค์ด๊ณ Single Block์ 48๊ฐ๋ก ๋๋ ธ์ต๋๋ค.26 ๊ทธ๋ ๋ค๋ฉด ์ Double Block์ ์ค์ด๊ณ Single Block์ ๋๋ ธ์๊น์?
Double Block์ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ๋ณ๋ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด์ joint attention์ผ๋ก ๊ต๋ฅํ๋ ๊ตฌ์กฐ์ ๋๋ค.5 ์ด๊ธฐ์ ๋ ๋ชจ๋ฌ๋ฆฌํฐ ๊ฐ์ ์ ๋ ฌ(alignment)์ ์ก์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.22 ํ์ง๋ง hidden size๊ฐ 6,144๋ก ๋ ๋ฐฐ๊ฐ ๋๋ฉด์ ๊ฐ ๋ธ๋ก์ ํํ๋ ฅ์ด ํจ์ฌ ์ปค์ก๊ธฐ ๋๋ฌธ์, 8๊ฐ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ ๋ ฌ์ด ๊ฐ๋ฅํด์ง ๊ฒ์ ๋๋ค.22
Double Block์ ์ด๋ฏธ์ง์ ํ ์คํธ ๊ฐ๊ฐ์ ๋ณ๋์ QKV, FFN ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์งํ๋ฏ๋ก ํ๋ผ๋ฏธํฐ ํจ์จ์ด ๋ฎ์ต๋๋ค.5 ๋ฐ๋ฉด Single Block์ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ํ๋์ ์ํ์ค๋ก ํตํฉํ์ฌ ํ๋์ ํ๋ผ๋ฏธํฐ ์ธํธ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ํ๋ผ๋ฏธํฐ ๋๋น ์ฒ๋ฆฌ ํจ์จ์ด ๋์ต๋๋ค.5 ์ด ๋ถ๋ถ์ ๋๋ ค์ ์ธ๋ฐํ ์์ฑ ํ์ง์ ๋์ด๋ ์ ๋ต์ ์ทจํ ๊ฒ์ ๋๋ค.22
๋ํ FLUX.1์์๋ FFN activation์ผ๋ก GELU๋ฅผ ์ฌ์ฉํ์ง๋ง, FLUX.2์์๋ SwiGLU๋ก ์ ํํ์ต๋๋ค.56 SwiGLU๋ ํํ๋ก, ์ ๋ ฅ์ ๋ ๊ฐ๋๋ก ๋๋ ํ๋์๋ SiLU(Swish) ํ์ฑํ๋ฅผ ์ ์ฉํ๊ณ ๋ค๋ฅธ ํ๋์ element-wise ๊ณฑ์ ์ํํฉ๋๋ค.12 ๊ฒ์ดํ ๋ฉ์ปค๋์ฆ์ด ์ถ๊ฐ๋์ด ์ ๋ณด ํ๋ฆ์ ๋ ์ ๊ตํ๊ฒ ์ ์ดํ ์ ์์ผ๋ฉฐ, LLM ๋ถ์ผ์์ GELU ๋๋น ์ผ๊ด๋๊ฒ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ ์ต๊ทผ ํ์ค์ผ๋ก ์๋ฆฌ์ก๊ณ ์์ต๋๋ค.12
์ ๋ ฅ ์๋ฒ ๋ฉ
Transformer์ ์ ๋ ฅ์ด ๋ค์ด๊ฐ๊ธฐ ์ ์ ๊ฐ๊ฐ์ ์๋ฒ ๋ฉ ๋ ์ด์ด๋ฅผ ๊ฑฐ์นฉ๋๋ค.6
- x_embedder: ์ด๋ฏธ์ง ์ ์ฌ ๋ฒกํฐ(128์ฐจ์)๋ฅผ
Linear(128 โ 6144)๋ก ํฌ์6 - context_embedder: ํ
์คํธ ์๋ฒ ๋ฉ(15,360์ฐจ์)์
Linear(15360 โ 6144)๋ก ํฌ์6 - timestep_embedding: ํ์ฌ timestep ๋ฅผ sinusoidal 256์ฐจ์ โ MLP โ 6,144์ฐจ์์ผ๋ก ๋ณํ6
- guidance_embedding: guidance scale ๋ฅผ timestep๊ณผ ๋์ผํ ๋ฐฉ์(sinusoidal 256์ฐจ์ โ MLP โ 6,144์ฐจ์)์ผ๋ก ๋ณํํ๋ ๋ณ๋์ MLP ๋ ์ด์ด์
๋๋ค.6 ์ถ๋ก ์ ์ฌ์ฉ์๊ฐ
guidance_scale=3.5์ฒ๋ผ float ๊ฐ์ ์ง์ ํ๋ฉด, ์ด ์ค์นผ๋ผ ๊ฐ์ดร 1000์ค์ผ์ผ๋ง โ sinusoidal embedding(256d) โMLPEmbedder(256 โ 6144)์์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.6 ์์ฑ๋ guidance ์๋ฒ ๋ฉ์ timestep ์๋ฒ ๋ฉ๊ณผ element-wise ๋ง์ ์ผ๋ก ํฉ์ณ์ ธ ํ๋์ conditioning vector๊ฐ ๋ฉ๋๋ค.6- ์ ํต์ ์ธ CFG์์๋ ๋งค step๋ง๋ค ๋ชจ๋ธ์ 2๋ฒ(conditional + unconditional) ๋๋ฆฐ ๋ค ์ธ๋ถ์์ ๋ก ๋ณด๊ฐํด์ผ ํฉ๋๋ค.15 Guidance embedding์ ๊ฐ ์์ฒด๋ฅผ ๋ชจ๋ธ ๋ด๋ถ์ conditioning์ผ๋ก ์ฃผ์ ํ์ฌ, ๋ชจ๋ธ์ด ํ ๋ฒ์ forward pass๋ก guided output์ ์ง์ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค.6 ์ด๋ฅผ ํตํด ์ถ๋ก ๋น์ฉ์ด ์ ๋ฐ์ผ๋ก ์ค์ด๋ญ๋๋ค.22
- Klein ๋ชจ๋ธ๋ค์ guidance embedding์ด ์์ผ๋ฏ๋ก CFG ์์ด ๋์ํฉ๋๋ค.21
์ด conditioning vector๊ฐ AdaLN(Adaptive Layer Normalization)์ ํตํด ๊ฐ ๋ธ๋ก์ ์ ๋ฌ๋์ด, ํ์ฌ timestep๊ณผ guidance ๊ฐ๋์ ๋ง๊ฒ ๋ธ๋ก์ ๋์์ ์กฐ์ ํฉ๋๋ค.6
์ ์ฒด Transformer ํ๋ฆ์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
flowchart TB
subgraph Embed["Embedding"]
TS["Timestep + Guidance<br>โ vec (6144d)"]
TXT_P["Text (15360d)<br>โ context_embedder<br>โ 6144d"]
IMG_P["Latent (128d)<br>โ x_embedder<br>โ 6144d"]
ROPE["RoPE Position<br>(32,32,32,32)"]
end
DB["Double-Stream Blocks ร8<br>(img โ txt ๋ณ๋ ์ฒ๋ฆฌ, Joint Attention)"]
CONCAT["img + txt concat"]
SB["Single-Stream Blocks ร48<br>(ํตํฉ ์ฒ๋ฆฌ, Fused QKV+MLP)"]
SPLIT["img portion ์ถ์ถ"]
FL["Final Layer<br>(AdaLN โ Linear โ 128d)"]
TS --> DB
TS --> SB
TS --> FL
TXT_P --> DB
IMG_P --> DB
ROPE --> DB
ROPE --> SB
DB --> CONCAT --> SB --> SPLIT --> FLDouble-Stream Block
Double-Stream Block์ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๋, attention ๋จ๊ณ์์๋ง ํฉ์ณ์ ์๋ก์ ์ ๋ณด๋ฅผ ๊ตํํ๋ ๊ตฌ์กฐ์ ๋๋ค.5 ๋ง์น ๋ ์ฌ๋์ด ๊ฐ์ ๋ฉ๋ชจ๋ฅผ ์ ๋ฆฌํ๋ฉด์, ์ค๊ฐ์ค๊ฐ ์๋ก์ ๋ฉ๋ชจ๋ฅผ ๋ณด๊ณ ์๋ ผํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.22
๊ฐ ์คํธ๋ฆผ(์ด๋ฏธ์ง/ํ ์คํธ)์ ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- AdaLN-Zero Modulation: conditioning vector ๋ฅผ
Linear(6144 โ 6144ร6)์ ํต๊ณผ์์ผ shift, scale, gate ๊ฐ 6๊ฐ๋ฅผ ์์ฑํฉ๋๋ค.56 ์ด ์ค 3๊ฐ(shift, scale, gate)๋ attention์ฉ, ๋๋จธ์ง 3๊ฐ๋ FFN์ฉ์ ๋๋ค.5 ์ด ๊ฐ๋ค์ด Layer Normalization์ ์ถ๋ ฅ์ ์กฐ์ ํ์ฌ, ํ์ฌ timestep๊ณผ guidance์ ๋ง๊ฒ ๋ธ๋ก์ ๋์์ ์ ์์ํต๋๋ค.5 - QKV Projection: Query, Key, Value๋ฅผ ์์ฑํฉ๋๋ค.
Linear(6144 โ 6144ร3)์ผ๋ก Q, K, V๋ฅผ ํ ๋ฒ์ ์์ฑํ ๋ค, 48๊ฐ head๋ก ๋ถํ ํฉ๋๋ค (head๋น 128์ฐจ์).6 - QK-Norm: RMSNorm(128)์ผ๋ก Q, K๋ฅผ ์ ๊ทํํฉ๋๋ค.56 ๊ณ ํด์๋ ์ด๋ฏธ์ง ์์ฑ ์ attention logit์ด ๋๋ฌด ์ปค์ ธ ํ์ต์ด ๋ฐ์ฐํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ์ญํ ์ ํฉ๋๋ค.9 Stable Diffusion 3 ๋ ผ๋ฌธ์์๋ ์ด ๊ธฐ๋ฒ์ ์ค์์ฑ์ ๊ฐ์กฐํ ๋ฐ ์์ต๋๋ค.9
- RoPE ์ ์ฉ: Q, K์ ์์น ์ธ์ฝ๋ฉ์ ์ ์ฉํฉ๋๋ค.56
- Joint Attention: ์ด๋ฏธ์ง์ ํ ์คํธ์ QKV๋ฅผ concatํ์ฌ ํ๋์ SDPA(Scaled Dot-Product Attention)๋ฅผ ์ํํ ํ ๋ค์ ๋ถ๋ฆฌํฉ๋๋ค.5
- FFN (SwiGLU): ๊ฐ ์คํธ๋ฆผ๋ณ๋ก
Linear(6144 โ 36864) โ SwiGLU โ Linear(18432 โ 6144)์ฒ๋ฆฌํฉ๋๋ค.6 mlp_ratio๊ฐ 3.0์ด๋ฏ๋ก ์ค๊ฐ ์ฐจ์์ด ๊ฐ ๋ฉ๋๋ค.6 - Gated Residual: gate ๊ฐ์ผ๋ก ๊ฐ์ค๋ ์ถ๋ ฅ์ ์๋ ์ ๋ ฅ์ ๋ํฉ๋๋ค. Attention ์ถ๋ ฅ๊ณผ FFN ์ถ๋ ฅ ๊ฐ๊ฐ์ ๋ณ๋์ gate๊ฐ ์ ์ฉ๋ฉ๋๋ค.5
Joint Attention์ด ํต์ฌ์ ๋๋ค. ์ด๋ฏธ์ง์ Q, K, V์ ํ ์คํธ์ Q, K, V๋ฅผ sequence ์ฐจ์์ผ๋ก concatํ ๋ค ํ๋์ attention์ ์ํํฉ๋๋ค.5 ์ด๋ฅผ ํตํด ์ด๋ฏธ์ง ํ ํฐ์ด ํ ์คํธ ํ ํฐ์ attendํ๊ณ , ํ ์คํธ ํ ํฐ๋ ์ด๋ฏธ์ง ํ ํฐ์ attendํ ์ ์๊ฒ ๋ฉ๋๋ค.5 Attention ํ์๋ ๋ค์ ์ด๋ฏธ์ง์ ํ ์คํธ ๋ถ๋ถ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ ์คํธ๋ฆผ์ผ๋ก ๋๋ ค์ค๋๋ค.5
flowchart TB
subgraph DoubleBlock["Double-Stream Block"]
IMG["Image Stream x"] --> IMG_ADALN["AdaLN โ QKV โ QK-Norm"]
TXT["Text Stream y"] --> TXT_ADALN["AdaLN โ QKV โ QK-Norm"]
IMG_ADALN --> ROPE_A["RoPE ์ ์ฉ"]
TXT_ADALN --> ROPE_A
ROPE_A --> JA["Joint Attention<br>(concat โ SDPA โ split)"]
JA --> IMG_FFN["Image FFN (SwiGLU)<br>+ gated residual"]
JA --> TXT_FFN["Text FFN (SwiGLU)<br>+ gated residual"]
IMG_FFN --> IMG_OUT["x' (updated image)"]
TXT_FFN --> TXT_OUT["y' (updated text)"]
end์ด ๊ตฌ์กฐ์ ์ฅ์ ์ ๋ ๋ชจ๋ฌ๋ฆฌํฐ๊ฐ ์๋ก์ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ๋ฉด์๋, ๊ฐ์์ ํํ ๊ณต๊ฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ ์ ์๋ค๋ ์ ์ ๋๋ค.22 ์ผ๋ฐ์ ์ธ cross-attention์์๋ ํ์ชฝ(๋ณดํต ์ด๋ฏธ์ง)๋ง ๋ค๋ฅธ ์ชฝ(ํ ์คํธ)์ ์ฐธ์กฐํ์ง๋ง, joint attention์์๋ ์๋ฐฉํฅ์ผ๋ก ์ ๋ณด๊ฐ ํ๋ฆ ๋๋ค.9 ์ด ์ค๊ณ๋ FLUX.1์ Stable Diffusion 3 ๊ธฐ๋ฐ MM-DiT ๊ตฌ์กฐ์์ ์๊ฐ์ ๋ฐ์์ผ๋ฉฐ, FLUX.2์์๋ ๋์ผํ ์๋ฆฌ๋ฅผ ์ ์งํ๊ณ ์์ต๋๋ค.956
Single-Stream Block
Double-Stream Block์ ๊ฑฐ์น ๋ค, ์ด๋ฏธ์ง์ ํ ์คํธ๋ sequence ์ฐจ์์ผ๋ก concat๋์ด ํ๋์ ํตํฉ ์ํ์ค๊ฐ ๋ฉ๋๋ค.6 ์๋ฅผ ๋ค์ด 1024ร1024 ์ด๋ฏธ์ง ์์ฑ ์, ์ด๋ฏธ์ง 4,096 ํ ํฐ๊ณผ ํ ์คํธ 512 ํ ํฐ์ด ํฉ์ณ์ ธ 4,608 ํ ํฐ์ ์ํ์ค๊ฐ ๋ฉ๋๋ค.22 ์ดํ 48๊ฐ์ Single-Stream Block์ด ์ด ํตํฉ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.6
Fused QKV + MLP
Single-Stream Block์ ๊ฐ์ฅ ํฐ ํน์ง์ QKV projection๊ณผ MLP input projection์ ํ๋์ linear layer๋ก ํตํฉ(fuse)ํ๋ค๋ ์ ์ ๋๋ค.5
ํ๋์ projection์์ Q, K, V(๊ฐ 6,144์ฐจ์)์ MLP ์ ๋ ฅ(SwiGLU๋ฅผ ์ํ ๋ ๊ฐ๋, ๊ฐ 18,432์ฐจ์)์ ๋์์ ์์ฑํฉ๋๋ค.5 ์ด๋ ๊ฒ ํ๋ฉด ๋ณ๋์ forward pass ๋ ๋ฒ ๋์ ํ ๋ฒ์ ํฐ ํ๋ ฌ ๊ณฑ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด GPU ํ์ฉ ํจ์จ์ด ๋์์ง๋๋ค.[^23] GPU๋ ์์ ํ๋ ฌ ๊ณฑ์ ์ฌ๋ฌ ๋ฒ ์ํํ๋ ๊ฒ๋ณด๋ค ํฐ ํ๋ ฌ ๊ณฑ์ ํ ๋ฒ ์ํํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.[^23]
์์ฑ๋ Q, K์๋ RMSNorm(QK-Norm)๊ณผ RoPE๊ฐ ์ ์ฉ๋ ํ 48๊ฐ head๋ก ๋ถํ ๋์ด SDPA๊ฐ ์ํ๋ฉ๋๋ค.56 MLP ์ ๋ ฅ์ SwiGLU ํ์ฑํ๋ฅผ ๊ฑฐ์นฉ๋๋ค.6 ์ดํ attention ์ถ๋ ฅ(6,144์ฐจ์)๊ณผ MLP ์ถ๋ ฅ(18,432์ฐจ์)์ด ๋ค์ concat๋์ด ํ๋์ ์ถ๋ ฅ projection์ ๊ฑฐ์นฉ๋๋ค.5
Gated Residual
์ต์ข ์ถ๋ ฅ์ AdaLN์์ ์์ฑ๋ gate ๊ฐ๊ณผ ๊ณฑํด์ง ๋ค residual connection์ผ๋ก ์ ๋ ฅ์ ๋ํด์ง๋๋ค.5 Double Block์์๋ attention๊ณผ FFN ๊ฐ๊ฐ์ ๋ณ๋์ gate๊ฐ ์์์ง๋ง, Single Block์์๋ ํ๋์ gate๋ก ํตํฉ๋ ์ถ๋ ฅ ์ ์ฒด๋ฅผ ์ ์ดํฉ๋๋ค.5 Gate ๊ฐ์ ํ์ต์ ํตํด ๊ฐ ๋ธ๋ก์ด ์ผ๋ง๋ ๊ฐํ๊ฒ ์ ๋ ฅ์ ๋ณํํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.10 ํ์ต ์ด๊ธฐ์๋ gate ๊ฐ์ด 0์ ๊ฐ๊น์ residual connection์ด ์ง๋ฐฐ์ ์ด๊ณ , ํ์ต์ด ์งํ๋ ์๋ก ๋ธ๋ก์ ๋ณํ์ด ์ ์ง์ ์ผ๋ก ์ปค์ง๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.1022
flowchart TB
subgraph SingleBlock["Single-Stream Block"]
X["Combined x (img+txt)"]
X --> ADALN_S["AdaLN โ LayerNorm"]
ADALN_S --> FUSED["Fused Projection<br>(โ QKV + MLP input)"]
FUSED --> |"Q,K,V"| ATTN["RoPE โ SDPA (48 heads)"]
FUSED --> |"MLP input"| MLP_S["SwiGLU Activation"]
ATTN --> CAT["Concat [attn, mlp]"]
MLP_S --> CAT
CAT --> PROJ["Output Projection"]
PROJ --> GATE_S["Gate ร output + residual"]
end48๊ฐ์ Single-Stream Block์ ๋ชจ๋ ํต๊ณผํ ๋ค์๋, **์ด๋ฏธ์ง ๋ถ๋ถ๋ง ์ถ์ถ(ํ ์คํธ ๋ถ๋ถ ์ ๊ฑฐ)**ํ๊ณ Final Layer(AdaLN modulation โ Linear(6144 โ 128))๋ฅผ ๊ฑฐ์ณ denoised latent๋ฅผ ์ถ๋ ฅํฉ๋๋ค.6
Positional Encoding
FLUX.1๊ณผ FLUX.2 ๋ชจ๋ Rotary Position Embedding(RoPE)์ ์ฌ์ฉํ์ง๋ง, ์ค์ ์ด ์๋นํ ๋ฌ๋ผ์ก์ต๋๋ค.56
| ํญ๋ชฉ | FLUX.1 | FLUX.2 |
|---|---|---|
| axes_dims | (16, 56, 56) | (32, 32, 32, 32) |
| theta | 10,000 | 2,000 |
| ์ด ์ฐจ์ | 128 (16+56+56) | 128 (32+32+32+32) |
FLUX.1์ 3์ถ(์๊ฐ 16 + ๋์ด 56 + ๋๋น 56)์ผ๋ก ์์น๋ฅผ ์ธ์ฝ๋ฉํ์ต๋๋ค.5 ๋์ด์ ๋๋น์ ๋๋ถ๋ถ์ ์ฐจ์์ ํ ๋นํ๊ณ ์๊ฐ ์ถ์๋ ์ ์ ์ฐจ์์ ๋ถ์ฌํ ํํ์ ๋๋ค.5 ์ด ๊ตฌ์ฑ์์๋ ๋์ดยท๋๋น ์ ๋ณด๊ฐ ํ๋ถํ ๋์ , ์๊ฐ ์ถ์ ํํ๋ ฅ์ด ์๋์ ์ผ๋ก ์ฝํฉ๋๋ค.22
FLUX.2๋ 4์ถ(32 + 32 + 32 + 32)์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.6 ๋ชจ๋ ์ถ์ ๋์ผํ ์ฐจ์์ ๊ท ๋ฑํ๊ฒ ๋ฐฐ๋ถํฉ๋๋ค.6 ์ด ๋ณํ๋ Qwen3-VL์ Interleaved MRoPE์์๋ ๋ฐ๊ฒฌ๋ ๊ฒ์ฒ๋ผ, ํน์ ์ถ์ ์ฃผํ์๊ฐ ํธ์ค๋๋ ๋ถ๊ท ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.22 Qwen3-VL์์๋ ์๊ฐ(t), ๋์ด(h), ๋๋น(w) ์ฑ๋ถ์ ์๋ฒ ๋ฉ ์ฐจ์ ์ ๋ฐ์ ๊ฑธ์ณ ๊ต์ฐจ ๋ฐฐ์นํ์ฌ, ๊ฐ ์ฐจ์์ด ์ ์ฃผํ์์ ๊ณ ์ฃผํ์ ๋์ญ์ ๊ท ์ผํ๊ฒ ๋ถํฌ๋๋๋ก ํ์ต๋๋ค.19
4๋ฒ์งธ ์ถ์ด ์ถ๊ฐ๋ ์ด์ ๋ ์ด๋ฏธ์ง ํธ์ง ๋ชจ๋์์ ์ฐธ์กฐ ์ด๋ฏธ์ง์ ์์ฑ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์์น ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.22 ์์ฑ ์ ์ฉ ๋ชจ๋์์๋ ์ด 4๋ฒ์งธ ์ถ์ ์ํ์ค ๋ด ์ถ๊ฐ์ ์ธ ๊ตฌ์กฐ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฐ ํ์ฉ๋ ์ ์์ต๋๋ค.22
๋ํ theta ๊ฐ์ด 10,000์์ 2,000์ผ๋ก ๋ฎ์์ก์ต๋๋ค.56 RoPE์์ theta๋ ํ์ ์ฃผํ์์ ๊ธฐ์ (base)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.11 theta๊ฐ ๋ฎ์์๋ก ์์น์ ๋ฐ๋ฅธ ํ์ ์ฃผ๊ธฐ๊ฐ ์งง์์ ธ, ๊ทผ์ ํ ์์น ๊ฐ์ ์ฐจ์ด๋ฅผ ๋ ๋ฏผ๊ฐํ๊ฒ ํฌ์ฐฉํ ์ ์์ต๋๋ค.11 ๋ฐ๋ฉด theta๊ฐ ๋์ผ๋ฉด ๋จผ ๊ฑฐ๋ฆฌ์ ์์น ๊ด๊ณ๊น์ง ์ธ์ฝ๋ฉํ ์ ์์ง๋ง, ๊ฐ๊น์ด ์์น ๊ฐ์ ๊ตฌ๋ถ๋ ฅ์ด ๋จ์ด์ง๋๋ค.11 FLUX.2์์ theta๋ฅผ ๋ฎ์ถ ๊ฒ์ scale factor 16์ผ๋ก ์ธํด ๋ ์์ถ๋ ์ ์ฌ ๊ณต๊ฐ์์ ์ธ๋ฐํ ๊ณต๊ฐ ๊ด๊ณ๋ฅผ ์ก์๋ด๊ธฐ ์ํ ์ ํ์ผ๋ก ํด์๋ฉ๋๋ค.22
VAE
VAE(Variational Autoencoder)๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฌ ๊ณต๊ฐ์ผ๋ก ์์ถํ๊ณ ๋ค์ ๋ณต์ํ๋ ์ญํ ์ ํฉ๋๋ค.[^23] FLUX.2์ VAE์์ ๊ฐ์ฅ ํฐ ๋ณํ๋ scale factor๊ฐ 8์์ 16์ผ๋ก ์ปค์ง ๊ฒ์ ๋๋ค.87
Scale Factor 8 vs 16
Scale factor๋ ์ ๋ ฅ ์ด๋ฏธ์ง ๋๋น Transformer์ ์ ๋ ฅ๋๋ ์ ์ฌ ๋ฒกํฐ์ ๊ณต๊ฐ ํด์๋ ๋น์จ์ ๋ํ๋ ๋๋ค.[^23]
| ํญ๋ชฉ | FLUX.1 | FLUX.2 |
|---|---|---|
| VAE downsample | 3ํ (8ร) | 3ํ (8ร) |
| Patchification | ํ์ดํ๋ผ์ธ์์ ์ํ | VAE ๋ด๋ถ ํตํฉ |
| ์ค์ง Scale Factor | 8 (VAE) + 2 (patch) = 16 | 16 (VAE ๋ด์ฅ) |
| latent_channels | 16 | 32 |
| Transformer in_channels | 64 (16ร4) | 128 (32ร4) |
์ค์ ๋ก ๋ ๋ชจ๋ธ ๋ชจ๋ ๋์ผํ block_out_channels=[128, 256, 512, 512]๊ณผ 3ํ downsample์ ์ฌ์ฉํฉ๋๋ค.78 ํต์ฌ ์ฐจ์ด๋ FLUX.2๊ฐ 2ร2 patchification์ VAE ๋ด๋ถ์ ํตํฉ(patch_size=(2,2))ํ๋ค๋ ์ ๊ณผ, latent_channels๊ฐ 16์์ 32๋ก ๋ ๋ฐฐ๊ฐ ๋์๋ค๋ ์ ์
๋๋ค.7 ์ฑ๋ ์๋ฅผ ๋๋ ค์ ๋ ์์ถ๋ ๊ณต๊ฐ์์๋ ์ ๋ณด๋ฅผ ๋ณด์กดํฉ๋๋ค.22 ๋ง์น ๋์ ์ฑ
์ ๋์ ์๋์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ, ๋ฉด์ ์ ์ค์ด๋ ๊น์ด(์ฑ๋)๋ก ์ ๋ณด๋ฅผ ๋ด๋ ๋ฐฉ์์
๋๋ค.22
์ด๋ก ์ธํด Transformer๊ฐ ์ฒ๋ฆฌํด์ผ ํ ์ํ์ค ๊ธธ์ด๋ ๋์ผํ์ง๋ง(1024ร1024 ๊ธฐ์ค 4,096 ํ ํฐ), ๊ฐ ํ ํฐ์ด ๋ด๋ ์ ๋ณด๋์ด 64์ฐจ์์์ 128์ฐจ์์ผ๋ก ๋ ๋ฐฐ๊ฐ ๋ฉ๋๋ค.22
Encoder ๊ตฌ์กฐ
Encoder๋ 3๋ฒ์ downsample์ ํตํด ๊ณต๊ฐ ํด์๋๋ฅผ ๋ก ์ค์ด๊ณ , ์ถ๊ฐ์ ์ผ๋ก patch rearrangement(2ร2 ํจ์น๋ฅผ ์ฑ๋๋ก ์ ๊ธฐ)๋ฅผ ํตํด ์ต์ข ์ ์ผ๋ก ์ scale factor๋ฅผ ๋ฌ์ฑํฉ๋๋ค.7 ์ถ๋ ฅ์ 64์ฑ๋(mean + logvar)์์ mean๋ง ์ทจํด 32์ฑ๋์ ์ ์ฌ ๋ฒกํฐ๊ฐ ๋ฉ๋๋ค.7
flowchart TB
subgraph Encoder["VAE Encoder"]
E_IN["Input Image<br>(3ch, 1024ร1024)"]
E_CONV["Conv2d(3โ128)"]
E_D1["ResBlockร2 โ Downsample<br>(128ch, 512ร512)"]
E_D2["ResBlockร2 โ Downsample<br>(256ch, 256ร256)"]
E_D3["ResBlockร2 โ Downsample<br>(512ch, 128ร128)"]
E_D4["ResBlockร2<br>(512ch, 128ร128, no downsample)"]
E_MID["Mid Block<br>(ResBlock โ AttnBlock โ ResBlock)"]
E_OUT["GroupNorm โ Swish<br>โ Conv2d(512โ64ch)"]
E_MEAN["mean ์ถ์ถ โ 32ch"]
E_PATCH["Patch Rearrange (2ร2)<br>(32ch, 128ร128) โ (128ch, 64ร64)"]
E_NORM["BatchNorm Normalize"]
E_IN --> E_CONV --> E_D1 --> E_D2 --> E_D3 --> E_D4 --> E_MID --> E_OUT --> E_MEAN --> E_PATCH --> E_NORM
end์ฐธ๊ณ ๋ก FLUX.1๊ณผ FLUX.2์ VAE๋ ๋์ผํ block_out_channels=[128, 256, 512, 512]๊ณผ 3ํ downsample ๊ตฌ์กฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.78 ํต์ฌ ์ฐจ์ด๋ latent_channels๊ฐ 16์์ 32๋ก ๋ ๋ฐฐ๊ฐ ๋์๋ค๋ ์ ์
๋๋ค.78 FLUX.1์์๋ patchification์ด ํ์ดํ๋ผ์ธ ๋ ๋ฒจ์์ ์ํ๋์์ง๋ง, FLUX.2์์๋ VAE ๋ด๋ถ์ patch_size=(2,2)๋ก ํตํฉ๋์ด ์์ด VAE ์์ฒด์ ์ค์ง์ scale factor๊ฐ 16์ด ๋ฉ๋๋ค.37
Decoder ๊ตฌ์กฐ
Decoder๋ Encoder์ ์ญ๊ณผ์ ์ ๋๋ค.[^23] 32์ฑ๋ ์ ์ฌ ๋ฒกํฐ๋ฅผ ๋ฐ์ ์๋ณธ ํด์๋์ ์ด๋ฏธ์ง๋ฅผ ๋ณต์ํฉ๋๋ค.7 ์ฃผ๋ชฉํ ์ ์ Decoder์ ๊ฐ level์์ ResBlock์ด 3๊ฐ์ฉ(Encoder๋ 2๊ฐ) ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค.7 ์ด๋ ๋ณต์ ๊ณผ์ ์ด ์์ถ ๊ณผ์ ๋ณด๋ค ๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ํ ๋นํ์ฌ ๋ํ ์ผ ๋ณต์ ํ์ง์ ๋์ด๊ธฐ ์ํ ์ค๊ณ์ ๋๋ค.22
flowchart TB
subgraph Decoder["VAE Decoder"]
D_DENORM["Denormalize (BatchNorm ์ญ๋ณํ)"]
D_UNPATCH["Unpatch (2ร2)<br>(128ch, 64ร64) โ (32ch, 128ร128)"]
D_CONV["Conv2d(32โ512)"]
D_MID["Mid Block<br>(ResBlock โ AttnBlock โ ResBlock)"]
D_U4["ResBlockร3<br>(512ch, 128ร128)"]
D_U3["ResBlockร3 โ Upsample<br>(512ch, 256ร256)"]
D_U2["ResBlockร3 โ Upsample<br>(256ch, 512ร512)"]
D_U1["ResBlockร3 โ Upsample<br>(128ch, 1024ร1024)"]
D_OUT["GroupNorm โ Swish<br>โ Conv2d(128โ3ch RGB)"]
D_IMG["Output Image<br>(3ch, 1024ร1024)"]
D_DENORM --> D_UNPATCH --> D_CONV --> D_MID --> D_U4 --> D_U3 --> D_U2 --> D_U1 --> D_OUT --> D_IMG
end์ฐจ์ ๋ณํ ์ถ์ (1024ร1024 ์ด๋ฏธ์ง ์์ฑ ์์)
์ ์ฒด ์ถ๋ก ๊ณผ์ ์์ ํ ์์ ์ฐจ์์ด ์ด๋ป๊ฒ ๋ณํํ๋์ง๋ฅผ ์ถ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.22
flowchart TB
subgraph TextPath["Text Encoding Path"]
T1["Text Prompt<br>'a cat on the moon'"]
T2["Mistral Layer 10, 20, 30 ์ถ์ถ<br>(B, 512, 5120) ร 3"]
T3["concat โ (B, 512, 15360)"]
T4["context_embedder<br>Linear(15360โ6144)<br>โ (B, 512, 6144)"]
T1 --> T2 --> T3 --> T4
end
subgraph NoisePath["Noise Initialization"]
N1["x_T ~ N(0, I)<br>(B, 4096, 128)<br>โ 64ร64 latent patches"]
N2["x_embedder<br>Linear(128โ6144)<br>โ (B, 4096, 6144)"]
N1 --> N2
end
subgraph TransformerPath["Transformer Processing"]
DB["Double Blocks ร8<br>img: (B, 4096, 6144)<br>txt: (B, 512, 6144)"]
CAT["concat โ (B, 4608, 6144)"]
SB["Single Blocks ร48<br>(B, 4608, 6144)"]
SP["split (img only)<br>(B, 4096, 6144)"]
FL["Final Layer<br>โ (B, 4096, 128)"]
DB --> CAT --> SB --> SP --> FL
end
subgraph DecodePath["VAE Decoding"]
RS["reshape + unpatch<br>โ (B, 32, 128, 128)"]
UP["upsample ร3<br>โ (B, 3, 1024, 1024)"]
OUT["Output Image<br>1024ร1024 RGB"]
RS --> UP --> OUT
end
T4 --> DB
N2 --> DB
FL --> RSSampling
FLUX.2์ sampling ๊ณผ์ ์ FLUX.1๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Rectified Flow ๊ธฐ๋ฐ์ velocity prediction ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.413
Rectified Flow Velocity Prediction
๊ธฐ์กด DDPM ๋ฑ์ diffusion model์์๋ ๊ฐ timestep์์ ์ถ๊ฐ๋ ๋ ธ์ด์ฆ ์ ์์ธกํ๋ ๋ฐฉ์์ด์์ต๋๋ค.16 ๋ฐ๋ฉด rectified flow์์๋ ๋ฐ์ดํฐ ๋ถํฌ์ ๋ ธ์ด์ฆ ๋ถํฌ๋ฅผ ์ง์ ์ผ๋ก ์ฐ๊ฒฐํ๊ณ , ์ด ์ง์ ์์์์ velocity๋ฅผ ์์ธกํฉ๋๋ค.1314 ์์ ์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
์ด๋ฉด ์๋ณธ ๋ฐ์ดํฐ ์ด๊ณ , ์ด๋ฉด ์์ ๋ ธ์ด์ฆ ์ ๋๋ค.13 ๋ชจ๋ธ์ ์ด ์์์ velocity ๋ฅผ ์์ธกํ๋ฉฐ, ํ๋์ denoising step์ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฉ๋๋ค.
๋ 1(์์ ๋ ธ์ด์ฆ)์์ 0(๊นจ๋ํ ์ด๋ฏธ์ง)์ผ๋ก ๊ฐ์ํ๋ฏ๋ก, ๋ ์์๊ฐ ๋์ด velocity ๋ฐฉํฅ์ ๋ฐ๋์ชฝ, ์ฆ ๊นจ๋ํ ์ด๋ฏธ์ง ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.22 ์ง์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ๊ธฐ ๋๋ฌธ์, ๊ณก์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๋ diffusion model ๋๋น ์ ์ step์ผ๋ก๋ ๋์ ํ์ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.14
Schedule ์์ฑ
Timestep schedule์ ๊ท ์ผํ๊ฒ ์ N ์คํ ์ผ๋ก ๋๋๋, SNR(Signal-to-Noise Ratio) shift๋ฅผ ์ ์ฉํฉ๋๋ค.4 Shift ์ ๋๋ ์ด๋ฏธ์ง ์ํ์ค ๊ธธ์ด์ ๋ฐ๋ผ ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.4 ์ด๋ฅผ ํตํด ๊ณ ํด์๋ ์ด๋ฏธ์ง์ผ์๋ก(์ํ์ค๊ฐ ๊ธธ์๋ก) ์ค์ผ์ค์ด ์ ์ ํ ์กฐ์ ๋ฉ๋๋ค.22
Guidance
์ ํต์ ์ธ CFG์์๋ ๋งค denoising step๋ง๋ค ๋ชจ๋ธ์ 2๋ฒ ์คํ(conditional + unconditional)ํ ๋ค ์ธ๋ถ์์ ๋ณด๊ฐํฉ๋๋ค.15
FLUX.2 [dev]๋ ์ด ๋ฐฉ์ ๋์ , guidance scale ๋ฅผ ๋ชจ๋ธ ๋ด๋ถ์ embedding์ผ๋ก ์ฃผ์ ํฉ๋๋ค.6 ๋ชจ๋ธ์ด ๊ฐ์ ์ธ์ํ ์ํ์์ ํ ๋ฒ์ forward pass๋ง์ผ๋ก guided output์ ์ง์ ์์ฑํ๋ฏ๋ก, ์ ํต์ ์ธ two-pass CFG ๋๋น ์ถ๋ก ๋น์ฉ์ด ์ ๋ฐ์ ๋๋ค.622 ์ด๋ ํ์ต ๊ณผ์ ์์ ๋ค์ํ ๊ฐ์ ๋ํด CFG๊ฐ ์ ์ฉ๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ์ถ๋ ฅํ๋๋ก distillation๋ ๊ฒ์ ๋๋ค.22
flowchart TB
NOISE["x_T ~ N(0, I)<br>(์์ ๋
ธ์ด์ฆ)"]
LOOP{"Denoising Step<br>t: 1.0 โ 0.0"}
MODEL["Flux2 Transformer<br>(x_t, t, txt_emb, guidance)"]
PRED["velocity v ์์ธก"]
UPDATE["x(t-1) = x(t) + ฮt ร v"]
CLEAN["x_0 (clean latent)"]
NOISE --> LOOP
LOOP -->|"๊ฐ step"| MODEL --> PRED --> UPDATE
UPDATE -->|"๋ค์ step"| LOOP
LOOP -->|"์๋ฃ"| CLEANFLUX.2 Model Family
FLUX.2๋ 32B ๋ชจ๋ธ ์ธ์๋ ๊ฒฝ๋ํ๋ Klein ๋ณํ์ ์ ๊ณตํฉ๋๋ค.21 Hidden size์ ๋ธ๋ก ์๋ฅผ ์ค์ฌ ๋ค์ํ ์ปดํจํ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค.21
| ํญ๋ชฉ | FLUX.2 [dev] 32B | Klein 9B | Klein 4B |
|---|---|---|---|
| Hidden Size | 6,144 (48 heads ร 128d) | 4,096 (32 heads ร 128d) | 3,072 (24 heads ร 128d) |
| Double Blocks | 8 | 8 | 5 |
| Single Blocks | 48 | 24 | 20 |
| Guidance Embedding | Yes | No | No |
Klein ๋ชจ๋ธ๋ค์ guidance embedding์ด ์์ผ๋ฏ๋ก CFG ์์ด ๋์ํ๋ฉฐ, ๋ ์ ์ ์์ Single Block์ผ๋ก ๋น ๋ฅธ ์ถ๋ก ์ด ๊ฐ๋ฅํฉ๋๋ค.21 ํฅ๋ฏธ๋ก์ด ์ ์ Klein 4B์ hidden size๊ฐ 3,072๋ก FLUX.1 [dev] 12B์ ๋์ผํ๋ค๋ ๊ฒ์ ๋๋ค.221 ํ์ง๋ง ๋ธ๋ก ์๊ฐ Double 5 + Single 20์ผ๋ก FLUX.1์ Double 19 + Single 38๋ณด๋ค ํจ์ฌ ์ ์ด, ํ๋ผ๋ฏธํฐ ์๋ 4B์ ๊ทธ์นฉ๋๋ค.221 ์ฆ, FLUX.1๊ณผ ์ ์ฌํ ๋ธ๋ก ํญ(width)์ ๊ฐ์ง๋ฉด์๋ ๊น์ด(depth)๋ฅผ ์ค์ฌ ๊ฒฝ๋ํํ ํํ์ ๋๋ค.22
๋ชจ๋ Klein ๋ณํ์ 32B ๋ชจ๋ธ๊ณผ ๋์ผํ VAE(scale factor 16, 128 in_channels)๋ฅผ ๊ณต์ ํ๋ฏ๋ก, ์ ์ฌ ๊ณต๊ฐ์ ํํ๋ ฅ์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.22 ์ฐจ์ด๋ Transformer ๋ด๋ถ์ ์ฒ๋ฆฌ ์ฉ๋์์๋ง ๋ฐ์ํฉ๋๋ค.22
Conclusion
๋ง์ง๋ง์ผ๋ก, FLUX.1๊ณผ FLUX.2์ ์ฃผ์ ์ฐจ์ด๋ฅผ ํ ํ ์ด๋ธ๋ก ์ ๋ฆฌํฉ๋๋ค.25678
| ํญ๋ชฉ | FLUX.1 [dev] 12B | FLUX.2 [dev] 32B |
|---|---|---|
| Text Encoder | CLIP-L + T5-XXL (๋ณ๋ 2๊ฐ) | Mistral-Small-3.2-24B (1๊ฐ) |
| Text Embed Dim | 4,096 (T5) + 768 (CLIP) | 15,360 (5,120 ร 3 layers) |
| in_channels | 64 | 128 |
| Hidden Size | 3,072 (24 heads ร 128d) | 6,144 (48 heads ร 128d) |
| Double Blocks | 19 | 8 |
| Single Blocks | 38 | 48 |
| RoPE axes | (16, 56, 56) | (32, 32, 32, 32) |
| RoPE theta | 10,000 | 2,000 |
| FFN Activation | GELU | SwiGLU |
| VAE latent_channels | 16 | 32 |
| VAE Scale Factor | 8 (+ ํ์ดํ๋ผ์ธ patchify) | 16 (VAE ๋ด์ฅ patchify) |
| Image Editing | ๋ฏธ์ง์ | ๋ค์ดํฐ๋ธ ์ง์ |
| Multimodal Input | Text only | Vision-Language |
| Model Family | ๋จ์ผ ๋ชจ๋ธ | dev 32B + Klein 9B/4B |
ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ ์คํธ ์ธ์ฝ๋ ํตํฉ: ๋ ๊ฐ์ ๋ณ๋ ๋ชจ๋ธ(CLIP-L + T5-XXL)์์ ๋ฉํฐ๋ชจ๋ฌ LLM ํ๋(Mistral-Small-3.2-24B)๋ก ์ ํ. Multi-layer extraction(Layer 10, 20, 30)์ ํตํด ๋ ํ๋ถํ 15,360์ฐจ์ ์๋ฒ ๋ฉ ์์ฑ46
- Transformer ๊ตฌ์กฐ ์ฌ์ค๊ณ: Hidden size๋ฅผ 3,072์์ 6,144๋ก ๋ ๋ฐฐ ํค์ฐ๊ณ , Double Block์ 19โ8๋ก ์ค์ด๋ Single Block์ 38โ48๋ก ๋๋ ค ํจ์จ์ฑ๊ณผ ํ์ง์ ๊ท ํ ๊ฐ์ . FFN์ GELU์์ SwiGLU๋ก ์ ํ26
- VAE ๊น์ ์์ถ: latent_channels๋ฅผ 16์์ 32๋ก, in_channels๋ฅผ 64์์ 128๋ก ๋๋ ค ๋ ํ๋ถํ ์ ์ฌ ํํ ํ๋ณด. Patchification์ VAE ๋ด๋ถ์ ํตํฉ78
- RoPE ๊ท ๋ฑ ๋ถํ : 3์ถ ๋ถ๊ท ๋ฑ ๋ฐฐ๋ถ(16,56,56)์์ 4์ถ ๊ท ๋ฑ ๋ฐฐ๋ถ(32,32,32,32)์ผ๋ก ์ ํ. theta๋ฅผ 10,000์์ 2,000์ผ๋ก ๋ฎ์ถฐ ์ธ๋ฐํ ์์น ์ธ์ ๊ฐํ5622
- ๋ค์ดํฐ๋ธ ๋ฉํฐ๋ชจ๋ฌ: ์ด๋ฏธ์ง ํธ์ง๊ณผ ์ฐธ์กฐ ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์์ฑ์ด ๋ณ๋ ๋ชจ๋ธ ์์ด ๊ธฐ๋ณธ ์ง์4
- ๋ชจ๋ธ ํจ๋ฐ๋ฆฌ: Klein 9B, Klein 4B ๊ฒฝ๋ ๋ณํ์ ํตํด ๋ค์ํ ์ปดํจํ ํ๊ฒฝ ๋์21
FLUX.2๋ ๋จ์ํ ๋ชจ๋ธ์ ํค์ด ๊ฒ์ด ์๋๋ผ, ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ์ฌ์ค๊ณํ์ฌ ๋ ํตํฉ๋๊ณ ํจ์จ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๋ง๋ค์ด๋ธ ์ฌ๋ก์ ๋๋ค.22 ํ ์คํธ ์ธ์ฝ๋๋ก ๋ฉํฐ๋ชจ๋ฌ LLM์ ์ฑํํ ๊ฒ์ CLIP/T5 ์กฐํฉ์ด ํ์ค์ด์๋ ์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ ๋ถ์ผ์์ ์๋ก์ด ๋ฐฉํฅ์ ์ ์ํ๋ ์๋ฏธ ์๋ ๋ณํ์ ๋๋ค.22 ์์ผ๋ก ๋ค๋ฅธ ์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ๋ค๋ ์ด์ ์ ์ฌํ ๋ฐฉํฅ์ผ๋ก ์งํํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.22
Reference
- BFL ๊ณต์ ๋ฐํ โ Black Forest Labs FLUX.1/FLUX.2 ๊ณต๊ฐโฉ
- FLUX.1-dev HuggingFace
config.jsonโ{attention_head_dim:128, guidance_embeds:true, in_channels:64, joint_attention_dim:4096, num_attention_heads:24, num_layers:19, num_single_layers:38, pooled_projection_dim:768}โฉ - diffusers
pipeline_flux.pyโ FLUX.1 ํ์ดํ๋ผ์ธ ๊ตฌํโฉ - CLIP (Radford et al., 2021) โ ํ ์คํธ ์ ์ฉ ์ธ์ฝ๋โฉ
- T5 (Raffel et al., 2020) โ ํ ์คํธ ์ ์ฉ ์ธ์ฝ๋โฉ
- Claude์ ์๊ฒฌ: ์ฝ๋ ๋ถ์์ ๊ธฐ๋ฐํ ํด์, ๋น์ , ๊ณ์ฐ, ์ ๋ง ๋ฑ Claude๊ฐ ์ง์ ์์ฑํ ๋ถ๋ถ (BFL ๊ณต์ ๋ ผ๋ฌธ์ด ๋ฏธ๊ณต๊ฐ ์ํ์ด๋ฏ๋ก ๊ณต์ ๊ทผ๊ฑฐ ์์ด ์ถ๋ก ํ ๋ด์ฉ ํฌํจ)โฉ
- diffusers
pipeline_flux2.pyโ FLUX.2 ํ์ดํ๋ผ์ธ ๊ตฌํ (Mistral3ForConditionalGeneration, ํธ์ง ๋ชจ๋, NSFW ํํฐ๋ง, denoising loop, schedule ์์ฑ ๋ฑ)โฉ - diffusers
transformer_flux2.pyโ FLUX.2 Transformer ๊ตฌํ. defaults:num_attention_heads=48, attention_head_dim=128, num_layers=8, num_single_layers=48, in_channels=128, joint_attention_dim=15360, mlp_ratio=3.0, axes_dims_rope=(32,32,32,32), rope_theta=2000, timestep_guidance_channels=256, guidance_embeds=True. MLPEmbedder(256โ6144), SwiGLU activationโฉ - HuggingFace FLUX.2-dev-Klein ๋ฆฌํฌ config โ Klein 9B/4B ๋ชจ๋ธ ์คํโฉ
- Mistral AI ๊ณต์ โ Mistral-Small-3.2-24B (vision-language model, hidden_size=5120)โฉ
- Qwen3-VL ๊ธฐ์ ๋ณด๊ณ ์ โ DeepStack, Interleaved MRoPEโฉ
- diffusers
transformer_flux.pyโ FLUX.1 Transformer ๊ตฌํ. FluxTransformerBlock, FluxSingleTransformerBlock, Modulation ํด๋์ค. defaults:axes_dims_rope=(16,56,56),theta=10000, GELU activationโฉ - SwiGLU (Shazeer, 2020) โ GLU Variants Improve Transformerโฉ
- CFG (Ho & Salimans, 2022) โ Classifier-Free Diffusion Guidanceโฉ
- Stable Diffusion 3 (Esser et al., 2024) โ MM-DiT, Joint Attention, QK-Normโฉ
- DiT (Peebles & Xie, 2023) โ AdaLN-Zero: gate์ zero initialization์ผ๋ก ๊ฐ ๋ธ๋ก์ด identity function์์ ์์. ๋จ, FLUX.2์์ ์ค์ zero init ์ ์ฉ ์ฌ๋ถ๋ ์ฝ๋์์ ์ง์ ํ์ธํ์ง ๋ชปํจโฉ
- RoPE (Su et al., 2021) โ Rotary Position Embedding. ์์ base(theta)๊ฐ ์ฃผํ์ ํน์ฑ์ ๊ฒฐ์ โฉ
- FLUX.1 VAE config โ
latent_channels:16, scaling_factor:0.3611, block_out_channels:[128,256,512,512]โฉ - diffusers
autoencoder_kl_flux2.pyโ FLUX.2 VAE ๊ตฌํ.latent_channels=32, patch_size=(2,2), block_out_channels=(128,256,512,512)โฉ - Flow Matching (Lipman et al., 2022) โ linear interpolation path, velocity predictionโฉ
- DDPM (Ho et al., 2020) โ noise prediction ๋ฐฉ์โฉ
- Rectified Flow (Liu et al., 2022) โ ์ง์ ๊ฒฝ๋ก์ ์ฅ์ โฉ