Dayanıklı Diffusion Memuriyete ve Düzgün Düzenleme
Type: Learn + Use
Languages: Python
Prerequisites: Phase 4 Lesson 10 (Diffusion), Phase 7 Lesson 02 (Self-Attention)
Time: ~75 minutes
Öğrenme Hedefleri
- Stable Diffusion borusunun beş parçasını izleyin: VAE, metin kodlayıcı, U-Net, programlayıcı, güvenlik kontrolcisi ve bunların her biri aslında ne yapar
- Gizli difüzyonunu ve 4x64x64 gizli alanlarda (3x512x512 görüntü yerine) eğitim yapmanın neden kalite kaybı olmadan hesaplamaları 48 kat azalttığını açıklayın.
- Kullanım
diffusersResim üretmek, resimden resme çalıştırmak, boyalama ve ControlNet tarafından yönlendirilmiş jenerasyon - Küçük özel veri kümesine LoRA ile sabit difüsiyon ve LoRA adaptörünü sonuçta yükle
Sorun
DDPM'yi doğrudan 512x512 RGB görüntülerinde eğitmek pahalıdır. Her eğitim adımı 3x512x512 = 786,432 giriş değerlerini gören bir U-Net üzerinden geriye doğru ilerler ve örnekleme aynı U-Net üzerinden 50+ ileri geçiş alır. Stable Diffusion 1.5 (2022'de yayınlanan) kalite seviyesinde, piksel-uzayı difüsiyon yaklaşık 256 GPU-aylık eğitim ve tüketici GPU'da bir görüntü başına 10-30 saniye gerekecektir.
Açık ağırlığı olan metin-resim uygulamasını sağlayan numara:latent diffusion(Rombach et al., CVPR 2022). 3x512x512 resmini 4x64x64 gizli tensöre ve geriye harcayacak bir VAE eğit, sonra bu gizli alanda yayım yapın.(3512512)/(46464) = 48x- Aynı GPU'da örneği almak on saniyelik bir düşüşten iki saniyeye kadar düşüyor.
Neredeyse her modern görüntü üretimi modeli SDXL, SD3, FLUX, HunyuanDiT, Wan-Video otomatik kodlayıcı, tanımlayıcı (U-Net veya DiT) ve metin koşullandırmasıdaki değişikliklerle gizli bir yayılma modelidir.
Anlaşım
- Boru hattı
flowchart LR
TXT["Text prompt"] --> TE["Text encoder<br/>(CLIP-L or T5)"]
TE --> CT["Text<br/>embedding"]
NOISE["Noise<br/>4x64x64"] --> UNET["UNet<br/>(denoiser with<br/>cross-attention<br/>to text)"]
CT --> UNET
UNET --> SCHED["Scheduler<br/>(DPM-Solver++,<br/>Euler)"]
SCHED --> LATENT["Clean latent<br/>4x64x64"]
LATENT --> VAE["VAE decoder"]
VAE --> IMG["512x512<br/>RGB image"]
style TE fill:#dbeafe,stroke:#2563eb
style UNET fill:#fef3c7,stroke:#d97706
style SCHED fill:#fecaca,stroke:#dc2626
style IMG fill:#dcfce7,stroke:#16a34a- VAE dondurulmuş oto kodlayıcı. Kodlayıcı görüntüyi latente (img2img ve eğitim için kullanılır).
- Text encoder CLIP metin kodlayıcı (SD 1.x/2.x), CLIP-L + CLIP-G (SDXL) veya T5-XXL (SD3/FLUX).
- U-Net denoiser. Her çözünürlük düzeyinde yerleştirilen metne latentlerden katılan çapraz dikkat katmanlarına sahiptir.
- Scheduler örnekleme algoritması (DDIM, Euler, DPM-Solver++). Sigmaları seçer, öngörülen gürültüyü geri gizli içine karıştırır.
- Safety checker çıkış görüntüsünde seçmeli NSFW / yasadışı içerik filtresi.
Sınıflandırıcıdan Çekilmeyen Rehberlik (CFG)
Basit metin koşullandırması öğrenir epsilon_theta(x_t, t, c)Her çağrısı için .cCFG aynı ağı cBu nedenle, bu durumun sonucunda, hem koşullu hem de koşulsuz gürültüyi tahmin eden tek bir model oluşturuldu.
eps = eps_uncond + w * (eps_cond - eps_uncond)w- Bu yönlendirme ölçeği.w=0Şartsızdır.w=1- Kesinlikle şartlı.w>1SD standart olarak w=7.5- Evet .
CFG, metin-resim kalitesi için çalışmanın nedenidür.
Latent uzay geometrisinin
VAE'nin 4 kanallı gizli görüntüsü sadece sıkıştırılmış bir görüntü değil. Bu, aritmetiklerin yaklaşık olarak semantik düzenlemelere (sürekli mühendislik + interpolasyon her ikisi de burada yaşar) karşılık geldiği ve U-Net'in tüm modelleme bütçesini harcamak için eğitildiği bir çeşitliliktir. Rastgele bir 4x64x64 latenti çözme rastgele görünen bir görüntü üretmez çöp üretir, çünkü yalnızca belirli bir alt çeşitlilikte latenler geçerli görüntülere çözür.
İki sonuç:
- Img2img= görüntüyi gizli olarak kodlayın, kısmi gürültü ekleyin, denosörü çalıştırın, dekode edin. Görüntü yapısı, kodlamanın dönüştürülebilir olması nedeniyle hayatta kalır; içeriği istek üzerine göre değişir.
- Inpainting= img2img ile aynı ama denoiser sadece maskeli bölgeleri güncelleyebilir; maskeli olmayan bölgeler kodlanmış gizli olarak tutulur.
U-Net mimarisi
SD U-Net, Ders 10'dan TinyUNet'in büyük bir versiyonu ve üç eklemedir:
- Transformer blocksHer boşluk çözünürlüğünde, kendi dikkatini + metin yerleştirilmesine karşı dikkatini içerir.
- Time embeddingSinusoidal kodlama üzerinden MLP.
- Skip connectionsEşleşen çözünürlüklerde kodlayıcı ve dekodör arasında.
SD 1.5'deki toplam parametreler: ~860M. SDXL: ~2.6B. FLUX: ~12B. Paramlarda atlama çoğunlukla dikkat katmanlarında gerçekleşir.
LoRA ince ayarlama
Stable Diffusion'un tam ince ayarlaması 20 GB'dan fazla VRAM gerektirir ve 860M parametreleri güncelleyebilir. LoRA (Low-Rank Adaptation) temel modelin dondurulmasını sağlar ve dikkat katmanlarına küçük sıra-karşılaşma matrislerini enjekte eder. SD için bir LoRA adaptörü tipik olarak 10-50 MB'dir, tek bir tüketici GPU'da 10-60 dakika boyunca çalışır ve bir düşüş değiştirimi olarak sonuçlama zamanında yüklenir.
Original: W_q : (d_in, d_out) frozen
LoRA: W_q + alpha * (A @ B) where A : (d_in, r), B : (r, d_out)
r is typically 4-32.LoRA, neredeyse tüm toplulukların ince sesleri dağıtma şekli. CivitAI ve Hugging Face milyonlarca sesini evlat edinir.
Gördüğün zamanlamalar
- DDIM Deterministik, ~50 adım, basit.
- Euler ancestral Stochastic, 30-50 adım, biraz daha yaratıcı örnekler.
- DPM-Solver++ 2M Karras Deterministik, 20-30 adım, üretim default.
- LCM / TCD / Turbo tutarlılık modelleri ve destilli çeşitleri; 1-4 adım bir kalite masrafı.
Programlamaları değiştirmek , bir satırlık bir değişimdir .diffusersVe bazen de herhangi bir yeniden eğitim olmadan örnek sorunlarını düzeltir.
Yapın
Bu ders kullanıyor .diffusersBu nedenle, bu programın temelinde, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, yeni bir sistem oluşturmak için, bir sistem oluşturmak için, bir sistem oluşturmak için, bir sistem oluşturmak için, bir sistem oluşturmak için, bir sistem oluşturmak için, bir sistem oluşturmak için, bir temel oluşturmak için, bir amaç, bir temel oluşturmak için, bir temel oluşturmak için, bir amaç, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak, bir temel oluşturmak için, bir temel oluşturmak için, bir temel oluşturmak, bir temel oluşturmak,
Adım 1: Resme metin
pythonimport torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
image = pipe(
prompt="a dog riding a skateboard in tokyo, studio ghibli style",
guidance_scale=7.5,
num_inference_steps=25,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
image.save("dog.png")float16Görülebilir bir kalite kaybı olmadan VRAM' ı yarıya çıkarır. num_inference_steps=25Öntanımlı DPM-Solver++ eşleşmeleri ile num_inference_steps=50DDIM ile.
Adım 2: Programlayıcıyı değiştir
pythonfrom diffusers import DPMSolverMultistepScheduler, EulerAncestralDiscreteScheduler
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)Programlayıcı durum U-Net ağırlıklarından koparılmış. DDPM üzerinde eğitim alabilir ve herhangi bir programcı ile örnek alabilirsiniz.
Adım 3: Resimden resme
pythonfrom diffusers import StableDiffusionImg2ImgPipeline
from PIL import Image
img2img = StableDiffusionImg2ImgPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
init_image = Image.open("dog.png").convert("RGB").resize((512, 512))
out = img2img(
prompt="a dog riding a skateboard, oil painting",
image=init_image,
strength=0.6,
guidance_scale=7.5,
).images[0]strengthBu, denoze edilmeden önce ne kadar gürültü eklenmesi (0,0 = değişmez, 1.0 = tam yenilenme) anlamına gelir.
Dördüncü adım: Boyanma
pythonfrom diffusers import StableDiffusionInpaintPipeline
inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16,
).to("cuda")
image = Image.open("dog.png").convert("RGB").resize((512, 512))
mask = Image.open("dog_mask.png").convert("L").resize((512, 512))
out = inpaint(
prompt="a cat",
image=image,
mask_image=mask,
guidance_scale=7.5,
).images[0]Maskedeki beyaz pikseller yenilenmek için alan.
Adım 5: LoRA yükleme
pythonpipe.load_lora_weights(
"artificialguybr/studioghibli-redmond-1-5v-studio-ghibli-lora-for-liberteredmond-sd-1-5",
weight_name="StudioGhibliRedmond-15V-LiberteRedmond-StdGBRedmAF-StudioGhibli.safetensors",
)
pipe.fuse_lora(lora_scale=0.8)
image = pipe(prompt="a village square, StdGBRedmAF, Studio Ghibli").images[0]Modeldeki tetikleyici cümle (StdGBRedmAF, Studio Ghibli) stilini açar. lora_scaleGüç kontrolü; 0.0 = hiçbir etki, 1.0 = tam etki. fuse_loraAdaptörü hız için yerindeki ağırlıklara pişirir ama değişimi engeller.pipe.unfuse_lora()Farklı bir adaptör yüklenmeden önce.
Adım 6: LoRA eğitimi (sketç)
Gerçek LoRA eğitimleri hayatın içinde peftveya diffusers.training- Şekil:
python# Pseudocode
for step, batch in enumerate(dataloader):
images, prompts = batch
latents = vae.encode(images).latent_dist.sample() * 0.18215
t = torch.randint(0, num_train_timesteps, (batch_size,))
noise = torch.randn_like(latents)
noisy_latents = scheduler.add_noise(latents, noise, t)
text_emb = text_encoder(tokenizer(prompts))
pred_noise = unet(noisy_latents, t, text_emb) # LoRA weights injected here
loss = F.mse_loss(pred_noise, noise)
loss.backward()
optimizer.step()Sadece LoRA matrisleri gradient alır; temel U-Net, VAE ve metin kodlayıcı dondurulmuştur.
Kullan
Üretim sırasında, gerçekte aldığınız kararlar:
- Model family: SD 1.5 açık kaynaklı topluluk ince tonları için, SDXL daha yüksek sadakat için, SD3 / FLUX son teknoloji ve sıkı lisans gereksinimleri için.
- Scheduler: DPM-Solver++ 20 ila 30 adım için 2M Karras, 1 saniye altında geciktiğinde LCM-LoRA.
- Precision- Evet .
float164080/4090'da,bfloat16A100 ve daha yeni,int8(den)bitsandbytesveyacompel) VRAM sıkıken. - Conditioning: düz metin çalışması; daha güçlü kontrol için, temel boru hattının üstüne ControlNet (sıkı, derin, poz) ekleyin.
Satır üretimi için,AUTO1111- Ne ?ComfyUITopluluk araçları; üretim API'leri için,diffusers+ accelerateveya optimum-nvidiaTensorRT komisyonu ile.
Gönder
Bu ders şunları ortaya çıkarır:
outputs/prompt-sd-pipeline-planner.mdSD 1.5 / SDXL / SD3 / FLUX'i ve programlayıcıyı ve bir gecikme bütçesi, sadakat hedefi ve lisans kısıtlaması göz önüne alındığında kesinliği seçen bir istek.outputs/skill-lora-training-setup.mdBaşlıkları, sıralama, parti boyutu ve öğrenme oranı dahil olmak üzere özel bir veri kümesi için tam bir LoRA eğitim yapılandırmasını yazma becerisi.
Egzersizler
- (Easy)Aynı istekleri oluştur
guidance_scaleİçeride[1, 3, 5, 7.5, 10, 15]- Resim nasıl değişiyor? - (Medium)Gerçek fotoğraflar çek, onları tarayın.
StableDiffusionImg2ImgPipeline- ...strengthİçeride[0.2, 0.4, 0.6, 0.8, 1.0]1.0. neden girişleri tamamen görmezden gelir? - (Hard)Bir tek konuyu (bir evcil hayvan, logo, bir karakter) oluşturan 10-20 görüntü üzerinde LoRA'yı eğit ve bu konuyu içeren yenilikçi sahneler oluştur.
Anahtar Terimler
| Term | What people say | What it actually means |
|---|---|---|
| Latent diffusion | "Diffuse in latents" | Run the entire DDPM in the VAE latent space (4x64x64) instead of pixel space (3x512x512); 48x compute saving |
| VAE scale factor | "0.18215" | Constant that rescales the VAE's raw latent to roughly unit variance; hardcoded in every SD pipeline |
| Classifier-free guidance | "CFG" | Mix conditional and unconditional noise predictions; the single most impactful inference knob |
| Scheduler | "Sampler" | The algorithm that turns noise + model predictions into a denoised latent trajectory |
| LoRA | "Low-rank adapter" | Small rank-decomposition matrices that fine-tune attention layers without touching base weights |
| Cross-attention | "Text-image attention" | Attention from latent tokens to text tokens; injects prompt information at every U-Net level |
| ControlNet | "Structure conditioning" | A separately-trained adapter that steers SD with an extra input (canny, depth, pose, segmentation) |
| DPM-Solver++ | "The default scheduler" | Second-order deterministic ODE solver; best quality at low step counts (20-30) in 2026 |
Daha Fazla Okumak
- High-Resolution Image Synthesis with Latent Diffusion (Rombach et al., 2022) Stable Diffusion kağıdı; tasarımı haklı çıkaran her bir ablation içerir
- Classifier-Free Diffusion Guidance (Ho & Salimans, 2022) CFG kağıdı
- LoRA: Low-Rank Adaptation of Large Language Models (Hu et al., 2021) LoRA ilk olarak NLP'yi kullanmış; neredeyse hiç değişim olmadan SD'ye aktarılmış.
- diffusers documentation her SD / SDXL / SD3 / FLUX boru hattı için referans
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.