Phase 08: Generative AI

انتشار پنهان و انتشار پایدار

انتشار فضای پیکسل در تصاویر 512 × 512 یک جرم جنگی محاسباتی است. Rombach و همکاران (2022) متوجه شدند که شما برای تولید یک تصویر به تمام ابعاد 786k نیاز ندارید. شما برای گرفتن ساختار معنوی و یک دیکودر جداگانه برای بقیه نیاز دارید. انتشار را در فضای پنهان VAE اجرا کنید. این ایده یک انتشار پایدار است.

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.

  1. Stage 1 — VAE.کدیگرE(x) → z، کدگرD(z) → x. فشرده سازی هدف: 8× نمونه پایین در هر محور فضایی + تنظیم کانال ها به طوری که کل اندازه پنهان ~1/16 از تعداد پیکسل است. از دست دادن = بازسازی (L1 + LPIPS درک) + KL (وزن کوچک بنابراین zبه اندازه گاوسیان مجبور نیست، چون ما به نمونه گیری دقیق ازzاغلب با شکست در مقابل مقابل تمرین می کنند، بنابراین تصاویر رمزگذاری شده به شدت تیز هستند.
  1. 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 در صدا. شما فقط دامنه داده را عوض می کنید.

انواع معماری

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

روند: جایگزین 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_uncond

w = 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:

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

-باده

نگه دارoutputs/skill-sd-prompter.md. مهارت یک پیامک متن + سبک هدف و خروجی را می گیرد: مدل + نقطه چک، مقیاس CFG، نمونه، پیامک منفی، وضوح، ترکیب کنترولنت / IP-آداپتور اختیاری و یک لیست چک QA در هر مرحله.

تمرینات

  1. Easy.فرار کنcode/main.pyبا راهنمائیw ∈ {0, 1, 3, 7, 15}. نمونه متوسطي را به طبقات ثبت کنwآیا کلاس معنی فراتر از داده های واقعی معنی متفاوت است؟
  2. Medium.کدگر خطی بازی را با یک کدگر/دکودر TANH-MLP با یک از دست دادن بازسازی عوض کنید. انتشار را در لانت های جدید تمرین کنید. آیا کیفیت نمونه تغییر می کند؟
  3. Hard.با پخش کننده ها یک نتیجه گیری واقعی Stable Diffusion را تنظیم کنید: بار sdxl-base،30 مرحله ایولر رو با CFG=7 اجرا کن، زمانش رو بگیرهsdxl-turboبا 4 مرحله و CFG=0، همان موضوع، کیفیت متفاوت توضیح دهید چه چیزی تغییر کرده و چرا.

اصطلاحات کلیدی

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.

یادداشت تولید: اجرا کردن Flux-12B در یک GPU مصرف کننده 8GB

ترکیب فلوکس مرجع این است که دستور "من یک GPU مصرف کننده دارم، آیا می توانم این را ارسال کنم؟"

  1. Staggered loading.فلکس سه شبکه دارد که هرگز نیازی به همبستگی در VRAM ندارند: کدگر متن T5-XXL (~ 10 GB در fp32) ، CLIP-L (کوچیک) ، 12B MMDiT و VAE. ابتدا پرامپت را کدگذاری کنید، حذف کدرها را بارگذاری کنید، DiT را حذف کنید، حذف DiT را بارگذاری کنید، VAE را رمزگذاری کنید. GPU های مصرف کننده 8GB فقط یک مرحله در یک زمان مناسب هستند.
  2. 4-bit quantization via bitsandbytes. BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)در هر دو کدگر T5 و DiT. حافظه 8× را کاهش می دهد، کاهش کیفیت برای متن به تصویر در معیار های آریترا (در نوت بوک مرتبط) قابل تشخیص نیست.
  3. 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 اجرا می کنید؛ برای یک لپ تاپ واحد توسعه دهنده، این دستور است.

خواندن بیشتر

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.