انتشار پنهان و انتشار پایدار
Type: Build
Languages: Python
Prerequisites: Phase 8 · 02 (VAE), Phase 8 · 06 (DDPM), Phase 7 · 09 (ViT)
Time: ~75 minutes
مشکل
انتشار پکسل-فضا در 5122 به این معنی است که U-Net روی تنسورهای شکل اجرا می شود[B, 3, 512, 512]هر مرحله نمونه گیری حدود 100 GFLOPS برای یک شبکه U-Net 500M است. 50 مرحله 5 TFLOPS برای هر تصویر است. در یک میلیارد تصویر راه اندازی کنید و حساب حساب بی معنی است.
اکثر این FLOPs به فشار دادن جزئیات بی اهمیت در نظر گرفته شده از طریق شبکه می روند بافت فرکانس بالا که یک VAE از دست رفته می تواند فشرده شود. ایده Rombach: آموزش یک VAE یک بار (در مرحله اول) ، آن را منجمد کنید و انتشار را به طور کامل در فضای پنهان 4 کانال 64×64 (در مرحله دوم) اجرا کنید. همان U-Net. 1/16 پیکسل. ~ 64x FLOPs کمتر برای کیفیت قابل مقایسه.
این نسخه ی انتشار پایدار است. SD 1.x / 2.x از یک شبکه ی U-Net 860M استفاده کرد.64×64×4در حال حاضر، SDXL از شبکه U-Net 2.6B استفاده کرده است128×128×4در سال ۲۰۲۴، SD3 U-Net را با یک ترانسفورماتور انتشار (DiT) با تطابق جریان جایگزین کرد. Flux.1-dev (Black Forest Labs، 2024) یک DiT-MMDiT 12B-param را حمل می کند. همه بر روی یک زیربنای دو مرحله ای اجرا می شوند.
مفهوم
!Latent diffusion: VAE compression + diffusion in latent space
Two stages, separately trained.
- Stage 1 — VAE.کدیگر
E(x) → z، کدگرD(z) → x. فشرده سازی هدف: 8× نمونه پایین در هر محور فضایی + تنظیم کانال ها به طوری که کل اندازه پنهان ~1/16 از تعداد پیکسل است. از دست دادن = بازسازی (L1 + LPIPS درک) + KL (وزن کوچک بنابراینzبه اندازه گاوسیان مجبور نیست، چون ما به نمونه گیری دقیق ازzاغلب با شکست در مقابل مقابل تمرین می کنند، بنابراین تصاویر رمزگذاری شده به شدت تیز هستند.
- Stage 2 — diffusion on
z.درمانz = E(x_real)آموزش یک شبکه U-Net (یا DiT) برای انکارz_t. در نتیجه: نمونهz_0پس از پخشx = D(z_0). .
Text conditioning.دو جزء اضافی. یک کدگر متن منجمد (CLIP-L برای SD 1.x، CLIP-L+OpenCLIP-G برای SD 2/XL، T5-XXL برای SD3 و Flux). یک تزریق توجه متقابل: هر بلوک U-Net می گیرد [Q = image features, K = V = text tokens]و آنها را در میان می گذارد. توکن ها تنها راه تاثیر متن بر تصویر هستند.
The loss function is identical to Lesson 06.همان DDPM / جریان مطابق MSE در صدا. شما فقط دامنه داده را عوض می کنید.
انواع معماری
| Model | Year | Backbone | Latent shape | Text encoder | Params |
|---|---|---|---|---|---|
| SD 1.5 | 2022 | U-Net | 64×64×4 | CLIP-L (77 tokens) | 860M |
| SD 2.1 | 2022 | U-Net | 64×64×4 | OpenCLIP-H | 865M |
| SDXL | 2023 | U-Net + refiner | 128×128×4 | CLIP-L + OpenCLIP-G | 2.6B + 6.6B |
| SDXL-Turbo | 2023 | Distilled | 128×128×4 | same | 1-4 step sampling |
| SD3 | 2024 | MMDiT (multimodal DiT) | 128×128×16 | T5-XXL + CLIP-L + CLIP-G | 2B / 8B |
| Flux.1-dev | 2024 | MMDiT | 128×128×16 | T5-XXL + CLIP-L | 12B |
| Flux.1-schnell | 2024 | MMDiT distilled | 128×128×16 | T5-XXL + CLIP-L | 12B, 1-4 step |
روند: جایگزین U-Net با DiT (ترانسفارمر در پیچ های پنهان) ، مقیاس کدرس متن (T5 برای پیوستن سریع CLIP را می پیشه است) ، افزایش کانال های پنهان (4 → 16 فضای بیشتر جزئیات را می دهد).
آن را بسازید
code/main.pyیک بازی 1D "VAE" (تخفیک هویت + کدگر، برای نشان دادن؛ یک VAE واقعی یک شبکه conv خواهد بود) را در بالای DDPM از درس 06 و اضافه کردن شرایط کلاس با راهنمایی بدون طبقه بندی. این نشان می دهد که همان از دست دادن انتشار کار می کند چه شما در خام 1D ارزش ها یا در کد بندی ارزش ها بینش کلیدی.
مرحله اول: کدگر/دکدر
pythondef encode(x): return x * 0.5 # toy "compression" to smaller scale
def decode(z): return z * 2.0یک VAE واقعی دارای وزنه های آموزش دیده است. برای آموزش، این نقشه خطی کافی است تا نشان دهد که انتشار بر روی zبدون اینکه به فضای داده های اصلی اهمیت بدهیم.
مرحله دوم: پخش درz- فضا
همان DDPM با درس 06. داده های شبکه دیده می شودz = E(x)بعد از نمونه گیریz_0، رمزگشاییش با D(z_0). .
مرحله سوم: راهنمایی بدون طبقه بندی
در طول آموزش، برچسب کلاس را 10% از زمان رها کنید (به جای یک توکن صفر) در نتیجه، هر دو را محاسبه کنید ε_condوε_uncond، پس:
pythoneps_cfg = (1 + w) * eps_cond - w * eps_uncondw = 0= هیچ راهنمایی (تنوع کامل)w = 3= پیش فرض، w = 7+= پر شده / بیش از حد تیز
مرحله 4: تنظیم متن (فهام، نه کد)
برچسب کلاس را با یک کدگر متن منجمد جایگزین کنید. متن درون U-Net را از طریق توجه متقابل تغذیه کنید:
pythonh = h + CrossAttention(Q=h, K=text_embed, V=text_embed)این تنها تفاوت اساسی بین یک مدل انتشار طبقاتی و انتشار ثابت است.
دام ها
- VAE-scale mismatch.SD 1.x VAEs دارای ثابت مقیاس (
scaling_factor ≈ 0.18215. پس از رمزگذاری استفاده می شود. فراموش کردن این باعث می شود شبکه ی U-Net در حال حرکت است. - Text encoder silently wrong.SD3 به T5-XXL با >=128 توکن نیاز دارد و بازگشت به CLIP-فقط زیان آور است. همیشه چک کنید
use_t5=Trueیا کراترهای وفاداری سریع - Mixing latent spaces.SDXL، SD3، Flux همه از VAEs مختلف استفاده می کنند. یک LoRA که در SDXL پنهان آموزش داده شده است، در SD3 کار نمی کند. پخش کننده های Hugging Face 0.30+ از بارگذاری نقاط بازرسی نامتناسبه خودداری می کند.
- CFG too high.
w > 10این محصول تصاویر پرتو و روغن دار را تولید می کند و به قیمت تنوع به این موضوع اضافه می کند.w = 3-7. . - Negative prompts leaking.یک پیام منفی خالی به علامت صفر تبدیل می شود؛ یک پیام منفی پر شده به می شود
ε_uncondاین ها یکسان نیستند؛ بعضی از لوله ها به طور خاموش به صفر می رسند.
ازش استفاده کن
دسته های تولید در سال 2026:
| Target | Recommended backbone |
|---|---|
| Narrow domain, paired data, training a model from scratch | SDXL fine-tune (LoRA / full) — fastest to ship |
| Open-domain text-to-image, open weights | Flux.1-dev (12B, Apache / non-commercial) or SD3.5-Large |
| Fastest inference, open weights | Flux.1-schnell (1-4 step, Apache) or SDXL-Lightning |
| Best prompt adherence, hosted | GPT-Image / DALL-E 3 (still), Midjourney v7, Imagen 4 |
| Edit workflows | Flux.1-Kontext (Dec 2024) — natively accepts image + text |
| Research, baseline | SD 1.5 — ancient but well-studied |
-باده
نگه دارoutputs/skill-sd-prompter.md. مهارت یک پیامک متن + سبک هدف و خروجی را می گیرد: مدل + نقطه چک، مقیاس CFG، نمونه، پیامک منفی، وضوح، ترکیب کنترولنت / IP-آداپتور اختیاری و یک لیست چک QA در هر مرحله.
تمرینات
- Easy.فرار کن
code/main.pyبا راهنمائیw ∈ {0, 1, 3, 7, 15}. نمونه متوسطي را به طبقات ثبت کنwآیا کلاس معنی فراتر از داده های واقعی معنی متفاوت است؟ - Medium.کدگر خطی بازی را با یک کدگر/دکودر TANH-MLP با یک از دست دادن بازسازی عوض کنید. انتشار را در لانت های جدید تمرین کنید. آیا کیفیت نمونه تغییر می کند؟
- Hard.با پخش کننده ها یک نتیجه گیری واقعی Stable Diffusion را تنظیم کنید: بار
sdxl-base،30 مرحله ایولر رو با CFG=7 اجرا کن، زمانش رو بگیرهsdxl-turboبا 4 مرحله و CFG=0، همان موضوع، کیفیت متفاوت توضیح دهید چه چیزی تغییر کرده و چرا.
اصطلاحات کلیدی
| Term | What people say | What 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. |
یادداشت تولید: اجرا کردن Flux-12B در یک GPU مصرف کننده 8GB
ترکیب فلوکس مرجع این است که دستور "من یک GPU مصرف کننده دارم، آیا می توانم این را ارسال کنم؟"
- Staggered loading.فلکس سه شبکه دارد که هرگز نیازی به همبستگی در VRAM ندارند: کدگر متن T5-XXL (~ 10 GB در fp32) ، CLIP-L (کوچیک) ، 12B MMDiT و VAE. ابتدا پرامپت را کدگذاری کنید، حذف کدرها را بارگذاری کنید، DiT را حذف کنید، حذف DiT را بارگذاری کنید، VAE را رمزگذاری کنید. GPU های مصرف کننده 8GB فقط یک مرحله در یک زمان مناسب هستند.
- 4-bit quantization via bitsandbytes.
BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)در هر دو کدگر T5 و DiT. حافظه 8× را کاهش می دهد، کاهش کیفیت برای متن به تصویر در معیار های آریترا (در نوت بوک مرتبط) قابل تشخیص نیست. - CPU offload.
pipe.enable_model_cpu_offload()ماژول های خودکار را بین CPU و GPU تغییر می دهد تا هر گذرگاه پیشروی پیشرفت کند. تاخیر 10-20٪ را اضافه می کند اما لوله را به طور کامل اجرا می کند.
حسابداري حافظه:10 GB T5 / 8 = 1.25 GBمقدارش مشخص شده12 B params × 0.5 bytes = ~6 GBدر اصطلاح stas00 این انتهای انتهای TP=1 است نتیجه گیری هیچ موازی مدل، حداکثر کوانتاسیون. برای تولید شما TP=2 یا TP=4 را روی H100 اجرا می کنید؛ برای یک لپ تاپ واحد توسعه دهنده، این دستور است.
خواندن بیشتر
- Rombach et al. (2022). High-Resolution Image Synthesis with Latent Diffusion Models انتشار ثابت
- Podell et al. (2023). SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis SDXL
- Peebles & Xie (2023). Scalable Diffusion Models with Transformers (DiT) دیت
- Esser et al. (2024). Scaling Rectified Flow Transformers for High-Resolution Image Synthesis SD3، MMDiT
- Ho & Salimans (2022). Classifier-Free Diffusion Guidance CFG
- Labs (2024). Flux.1 — Black Forest Labs announcement خانواده Flux.1
- Hugging Face Diffusers docs اجرای مرجع برای هر نقطه بازرسی بالا.
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.