ΠΠ³ΠΎ-Π³ΠΎ! π₯ ΠΠ΄ΠΈΠ½ ΡΠΌΠ΅Π»ΡΡΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΡΠΎΠ±ΡΠ°Π» Stable Diffusion 3.5 Ρ Π½ΡΠ»Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠ»ΡΠΊΠΎ PyTorch! π€― ΠΠΈΠΊΠ°ΠΊΠΈΡ Π³ΠΎΡΠΎΠ²ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ β ΡΠΈΡΡΡΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΎΠΉ. ΠΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΎΡΠΊ, Π° Π³Π»ΡΠ±ΠΎΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΏΠΎ Π²ΠΈΠ½ΡΠΈΠΊΠ°ΠΌ. π οΈπ» Π’Π°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ β Π·ΠΎΠ»ΠΎΡΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄ΠΈΡΡΡΠ·ΠΈΠΎΠ½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠ²ΡΠΎΡ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π½Π΅ ΠΈΡΠ΅Ρ Π»ΡΠ³ΠΊΠΈΡ ΠΏΡΡΠ΅ΠΉ ΠΈ Π΄Π΅Π»ΠΈΡΡΡ ΠΎΠΏΡΡΠΎΠΌ Π² Π΄Π΅ΡΠ°Π»ΡΡ (ΠΆΠ΄ΡΠΌ ΠΊΠΎΠ΄ Π½Π° GitHub?). π€ ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ β ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠ°Π½Ρ Π·Π°Π³Π»ΡΠ½ΡΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΠ Π±Π΅Π· ΡΡΡΠ½ΡΡ ΡΡΠΈΠΊΠΎΠ². π¨βπ» ΠΠΎΡΠΎΠ²Ρ ΠΊ dive deep?
ΠΠΊΡΠΏΠ΅ΡΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· miniDiffusion: Stable Diffusion 3.5 Π½Π° Π±Π°Π·Π΅ PyTorch
Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ
ΠΡΠΎΠ΅ΠΊΡ miniDiffusion ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠΊΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Stable Diffusion 3.5 (SD3), ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π° PyTorch. ΠΠ»ΡΡΠ΅Π²Π°Ρ ΠΈΠ½Π½ΠΎΠ²Π°ΡΠΈΡ β Π²ΠΎΡΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ SD3.5 pipeline Π² ~2800 ΡΡΡΠΎΠΊΠ°Ρ ΠΊΠΎΠ΄Π° Π±Π΅Π· external Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ:
- ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Diffusion Transformer (DiT)
- ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ Rectified Flow ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- ΠΠ°ΡΡΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠΉ Deep Dive
Π―Π΄ΡΠΎ DiT (Diffusion Transformer)
ΠΠ°Π·ΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΡ :
# dit.py - ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ DiT
class DiffusionTransformer(nn.Module):
def __init__(self, config):
super().__init__()
self.patch_embed = PatchEmbed(config)
self.blocks = nn.ModuleList([
DiTBlock(config) for _ in range(config.depth)
])
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
- Joint Attention (attention.py): ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΊΡΠΎΡΡ-ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΠΊΡΡΠ° ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
- ΠΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ LayerNorm Π±Π΅Π· bias Π΄Π»Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
- ΠΠ΄Π°ΠΏΡΠΈΠ²Π½Π°Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ Π°ΠΏΡΡΠΌΠΏΠ»ΠΈΠ½Π³
Pipeline Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
- Π’Π΅ΠΊΡΡΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°: Π’ΠΎΠΊΠ΅Π½ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· CLIP/T5 (tokenizer.py)
- ΠΠ½ΠΊΠΎΠ΄ΠΈΠ½Π³: T5_Encoder (t5_encoder.py) ΠΈ CLIP-ViT (clip.py)
- ΠΠΈΡΡΡΠ·ΠΈΠΎΠ½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ: Rectified Flow Ρ EulerScheduler (noise.py)
- ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΠ°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π°Π²ΡΠΎΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊ (VAE)
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Rectified Flow
# noise.py - Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΠΠ£ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΠΉΠ»Π΅ΡΠ°
class EulerScheduler:
def step(self, model_output, sample, timestep):
dt = self.timesteps[timestep] - self.timesteps[timestep-1]
prev_sample = sample + dt * model_output
return prev_sample
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- Logit-Normal Sampling Π΄Π»Ρ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
- ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° Flow Matching
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° multi-step sampling
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
Workflow Π·Π°ΠΏΡΡΠΊΠ°
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
git clone https://github.com/yousef-rafat/miniDiffusion
pip install -r requirements.txt
# ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π²Π΅ΡΠΎΠ²
python3 encoders/get_checkpoints.py --hf_token YOUR_TOKEN
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ
β οΈ ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ°ΡΡΡ:
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΏΠΎΠ΄ production (XFormers, TensorRT)
- ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° mixed-precision
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° hyperparameters
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΌ SD3
| ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ SD3 | miniDiffusion |
|---|---|---|
| ΠΠΎΠ΄ΠΎΠ²ΠΎΡ Π±Π°Π·Π° | >50k ΡΡΡΠΎΠΊ | ~2.8k ΡΡΡΠΎΠΊ |
| ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ | Diffusers, Transformers | Π§ΠΈΡΡΡΠΉ PyTorch |
| ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° | Production-ready | Educational/Experimental |
| ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ | ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° | ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ |
ΠΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Ρ ΡΠ°Π·Π²ΠΈΡΠΈΡ
ΠΡΠΎΠ΅ΠΊΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ:
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ LoRA ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ²
- ΠΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ
- ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΊΠ²Π°Π½ΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
- ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ latent space ΡΠ΅ΡΠ΅Π· TensorBoard
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
miniDiffusion ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΡΡΠΈΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ SD3.5 Π½Π° ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ production-ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π½Π΅Π½ Π΄Π»Ρ research ΠΈ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅Π»Π΅ΠΉ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ sandbox Π΄Π»Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ Π΄ΠΈΡΡΡΠ·ΠΈΠΎΠ½Π½ΡΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ.