Phase 08: Generative AI

Latent Diffusion ve Stable Diffusion

Rombach ve diğerleri (2022) bir görüntü oluşturmak için tüm 786k boyutlarına ihtiyacınız olmadığını fark etti.

Type: Build

Languages: Python

Prerequisites: Phase 8 · 02 (VAE), Phase 8 · 06 (DDPM), Phase 7 · 09 (ViT)

Time: ~75 minutes

Sorun

5122 ' de piksel-uzayda yayılma U-Net ' in şekil tensörleri üzerinde çalışmasını sağlar .[B, 3, 512, 512]Her örnekleme adımı 500M-param U-Net için ~100 GFLOPS. 50 adım bir görüntü başına 5 TFLOPS. Bir milyar görüntü üzerinde çalıştırın ve hesaplama faturu saçmalık.

Bu FLOP'lerin çoğu, kaybeden bir VAE'nin sıkıştırdığı yüksek frekanslı dokuyu ağ üzerinden algılamaca önemsiz detayları itmeye gider. Rombach'un fikri: bir VAE'yi bir kez ( birinci aşama) eğitmek, dondurmak ve tamamen 4 kanal 64×64 gizli alanında ( ikinci aşama) yayılmayı çalıştırmak. Aynı U-Net.

Bu, Stable Diffusion tarifi. SD 1.x / 2.x 860M U-Net kullanıyor.64×64×4SDXL'de 2.6B U-Net kullanıldı.128×128×4, SD3 U-Net'i akış eşleşmesi ile bir Diffusion Transformer (DiT) ile değiştirdi. Flux.1-dev (Black Forest Labs, 2024) 12B-param DiT-MMDiT'yi gönderir. Hepsi aynı iki aşamalı altyapıda çalışır.

Anlaşım

!Latent diffusion: VAE compression + diffusion in latent space

Two stages, separately trained.

  1. Stage 1 — VAE.KodlayıcıE(x) → z, dekodörD(z) → x. Hedef sıkıştırma: her alan eksisinde 8× aşağı örnek + kanalları ayarlayın böylece toplam gizli boyut piksel sayısının 1/16'sidir. Kayıp = yeniden yapılandırma (L1 + LPIPS algılama) + KL (küçük ağırlık böylece zBu çok Gaussian zorunlu değil, çünkü tam örnekleme ihtiyacımız yok.zGenellikle bir düşmana karşı bir kayıpla eğitilmiştir. Bu yüzden kodlanmış görüntüler keskin.
  1. Stage 2 — diffusion on z.Tedavi et .z = E(x_real)Bir U-Net (veya DiT) 'yi denetlemeyi eğit.z_tSonuçta: örnekz_0O zaman difüzyondan.x = D(z_0)- Evet .

Text conditioning.İki ek bileşen. Dondurulmuş bir metin kodlayıcısı (SD 1.x için CLIP-L, SD 2/XL için CLIP-L+OpenCLIP-G, SD3 ve Flux için T5-XXL).[Q = image features, K = V = text tokens]Tek yol metin görüntüyü etkilemektir.

The loss function is identical to Lesson 06.Aynı DDPM / akış eşleşen MSE gürültü. Sadece veri alanı değiştirmek.

Mimarlık çeşitleri

ModelYearBackboneLatent shapeText encoderParams
SD 1.52022U-Net64×64×4CLIP-L (77 tokens)860M
SD 2.12022U-Net64×64×4OpenCLIP-H865M
SDXL2023U-Net + refiner128×128×4CLIP-L + OpenCLIP-G2.6B + 6.6B
SDXL-Turbo2023Distilled128×128×4same1-4 step sampling
SD32024MMDiT (multimodal DiT)128×128×16T5-XXL + CLIP-L + CLIP-G2B / 8B
Flux.1-dev2024MMDiT128×128×16T5-XXL + CLIP-L12B
Flux.1-schnell2024MMDiT distilled128×128×16T5-XXL + CLIP-L12B, 1-4 step

Eğilim: U-Net'i DiT (lakent yamalar üzerinde transformatör) ile değiştirin, metin kodlayıcısını ölçeklendirin (T5 hızlı bir şekilde takip için CLIP'i yener), latent kanalları artırın (4 → 16 daha fazla ayrıntılı bir yer verir).

Yapın

code/main.pyDers 06'dan DDPM'nin üstüne bir oyuncak 1-D "VAE" (tıpkı gösterim için kimlik kodlayıcı + dekoder; gerçek bir VAE bir konfor ağı olurdu) yığar ve sınıflandırıcı-sağ rehberliği ile sınıf koşullandırmasını ekler.

Adım 1: Kodlayıcı/Kodlayıcı

pythondef encode(x):    return x * 0.5          # toy "compression" to smaller scale
def decode(z):    return z * 2.0

Gerçek bir VAE'nin eğitimli ağırlıkları vardır.zOrijinal veri alanını önemsemeden.

İkinci adım: z- Uzay

DDPM'nin 06. dersiyle aynı.z = E(x)Örnek alıncaz_0, ile çözülür .D(z_0)- Evet .

Adım 3: sınıflandırıcı dışı rehberlik

Eğitim sırasında sınıf etiketini %10'da bırakın (sürekli bir simge ile değiştirin).ε_condve ε_uncondO zaman:

pythoneps_cfg = (1 + w) * eps_cond - w * eps_uncond

w = 0= rehberlik yok (tam çeşitlilik),w = 3= default, w = 7+= doymuş / aşırı keskin.

Adım 4: Metin koşullandırması (konsept, kod değil)

Sınıf etiketini dondurulmuş bir metin kodlayıcı çıkışı ile değiştirin. U-Net'e gömülü metni çapraz dikkat yoluyla besleyin:

pythonh = h + CrossAttention(Q=h, K=text_embed, V=text_embed)

Bu, sınıf koşullı bir difüzyon modeli ile sabit difüzyon arasındaki tek önemli fark.

Tuzaklar

  • VAE-scale mismatch.SD 1.x VAE'ler ölçekleme sabitine sahiptir (scaling_factor ≈ 0.18215Bu, U-Net'in çok yanlış bir değişim ile gizli bir şekilde çalışmasını sağlar.
  • Text encoder silently wrong.SD3'nin T5-XXL'ye ihtiyacı var ve T5 = 128 tokeni vardır.use_t5=TrueYa da hızlı sadakat kraterleri.
  • Mixing latent spaces.SDXL, SD3, Flux hepsi farklı VAE'ler kullanır. SDXL latenti üzerinde eğitilmiş bir LoRA SD3 üzerinde çalışmaz.
  • CFG too high. w > 10Doymuş, yağlı görüntüler üretir ve çeşitlilik masrafına karşı uyarıyı aşırı uyarır.w = 3-7- Evet .
  • Negative prompts leaking.Boş negatif istek sıfır simge olur; doldurulmuş negatif istek ε_uncondBunlar aynı değil; bazı boru hattları sessizce sıfır açılır.

Kullan

2026'da üretim aşamaları:

TargetRecommended backbone
Narrow domain, paired data, training a model from scratchSDXL fine-tune (LoRA / full) — fastest to ship
Open-domain text-to-image, open weightsFlux.1-dev (12B, Apache / non-commercial) or SD3.5-Large
Fastest inference, open weightsFlux.1-schnell (1-4 step, Apache) or SDXL-Lightning
Best prompt adherence, hostedGPT-Image / DALL-E 3 (still), Midjourney v7, Imagen 4
Edit workflowsFlux.1-Kontext (Dec 2024) — natively accepts image + text
Research, baselineSD 1.5 — ancient but well-studied

Gönder

  • Kaydet .outputs/skill-sd-prompter.md. Skill bir metin uyarısı + hedef stil ve çıkışları alır: model + kontrol noktası, CFG ölçeği, örnekleme, negatif uyarı, çözünürlük, seçmeli ControlNet/IP-Adapter kombinasyonu ve adım başına bir kalite kontrol listesi.

Egzersizler

  1. Easy.Çık .code/main.pyYönlendirmelerlew ∈ {0, 1, 3, 7, 15}Sınıflara göre ortalama örnek kaydet.wsınıf anlamları gerçek verilerin anlamlarından daha uzak mı?
  2. Medium.Oyuncak çizgisi kodlayıcıyı yeniden yapılandırma kaybı olan tanh-MLP kodlayıcı/dekoder çiftine değiştirin. Yeni latentlerde yayılımı yeniden eğit. Örnek kalitesi değişiyor mu?
  3. Hard.Düzenleyici ile gerçek Stable Diffusion inference ayarlayın: yük sdxl-baseCFG=7 ile 30 Euler adımı at.sdxl-turboAynı konu, farklı kalite neyin değiştiğini ve neden değiştiğini açıklayın.

Anahtar Terimler

TermWhat people sayWhat it actually means
First stage"The VAE"Trained encoder/decoder pair; compresses 512² to 64².
Second stage"The U-Net"Diffusion model over the latent space.
CFG"Guidance scale"(1+w)·ε_cond - w·ε_uncond; tunes conditioning strength.
Null token"Empty prompt embed"Unconditional embed used for ε_uncond.
Cross-attention"How text gets in"Each U-Net block attends to text tokens as K and V.
DiT"Diffusion Transformer"Replace U-Net with a transformer over latent patches; scales better.
MMDiT"Multi-modal DiT"SD3's architecture: text and image streams with joint attention.
VAE scaling factor"Magic number"Divides latents by ~5.4 so diffusion operates in unit-variance space.

Üretim notu: 8GB tüketici GPU'da Flux-12B çalıştırılıyor

Referans Flux entegrasyonu kanonik "Benim tüketici bir GPU var, bunu gönderebilir miyim?" tarifi.

  1. Staggered loading.Flux'in VRAM'da birlikte yaşamaya ihtiyacı olmayan üç ağı vardır: T5-XXL metin kodleyicisi (fp32'de ~ 10 GB), CLIP-L (küçük), 12B MMDiT ve VAE. Önce istekle kodlayın, kodlayıcıları silin, DiT'yi yükleyin, denoise, delete* DiT'yi yükleyin, VAE'yi yükleyin, dekode edin.
  2. 4-bit quantization via bitsandbytes. BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)T5 kodlayıcı ve DiT'de. 8× hafıza keser, Aritra'nın referans değerleri (notbukta bağlantılı) için metin-resim oranında kalitede düşüş algılanamaz.
  3. CPU offload. pipe.enable_model_cpu_offload()CPU ve GPU arasında otomatik olarak modül değiştirir. Her ileri geçiş ilerlerken, %10-20 gecikme artırır.

Hatıra muhasebe: 10 GB T5 / 8 = 1.25 GBKvantistik olarak12 B params × 0.5 bytes = ~6 GBTP=1 sonucu model paralelliği, maksimum kuantitasyon. üretim için H100'lerde TP=2 veya TP=4 çalıştırırsınız; tek bir dev dizüstü bilgisayar için, bu tarif.

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.