Sự pha trộn ẩn và sự pha trộn ổn định
Type: Build
Languages: Python
Prerequisites: Phase 8 · 02 (VAE), Phase 8 · 06 (DDPM), Phase 7 · 09 (ViT)
Time: ~75 minutes
Vấn đề
Sự phân tán trong không gian phím tại 5122 có nghĩa là U-Net chạy trên các tensor hình dạng .[B, 3, 512, 512]Mỗi bước lấy mẫu là ~ 100 GFLOPS cho một U-Net 500M-param. 50 bước là 5 TFLOPS cho mỗi hình ảnh. Đưa trên một tỷ hình ảnh và hóa đơn tính toán là vô lý.
Hầu hết các FLOP đó đi đến đẩy các chi tiết không quan trọng về nhận thức qua mạng kết cấu tần số cao mà một VAE bị mất có thể nén ra. Ý tưởng của Rombach: đào tạo một VAE một lần (tầng đầu tiên), đóng băng nó, và chạy truyền hoàn toàn trong không gian ẩn 64×64 4 kênh (tầng hai).
Đây là công thức Stable Diffusion. SD 1.x / 2.x sử dụng một U-Net 860M trên 64×64×4Các hệ thống này được phát triển trong các trường hợp tiềm ẩn, SDXL sử dụng một mạng U-Net 2.6B trên 128×128×4, SD3 thay đổi U-Net với một Difusion Transformer (DiT) với dòng chảy phù hợp. Flux.1-dev (Black Forest Labs, 2024) vận chuyển một DiT-MMDiT 12B-param. Tất cả chạy trên cùng một nền hai giai đoạn.
Khái niệm
!Latent diffusion: VAE compression + diffusion in latent space
Two stages, separately trained.
- Stage 1 — VAE.Mã hóa
E(x) → z, decoderD(z) → x. Nhấn mục tiêu: 8x mẫu xuống trong mỗi trục không gian + điều chỉnh các kênh để tổng kích thước ẩn là ~ 1/16 của số lượng pixel.zkhông phải là quá Gaussian, bởi vì chúng tôi không cần mẫu chính xác từzThường được huấn luyện với một thất bại đối thủ vì vậy hình ảnh được giải mã là sắc nét.
- Stage 2 — diffusion on
z.Chữa bệnhz = E(x_real)Đào tạo một U-Net (hoặc DiT) để phản đốiz_t- Khi kết luận: mẫuz_0qua sự phân tán, sau đóx = D(z_0)- Tôi không biết.
Text conditioning.Hai thành phần bổ sung. Một mã hóa văn bản đóng băng (CLIP-L cho SD 1.x, CLIP-L+OpenCLIP-G cho SD 2/XL, T5-XXL cho SD3 và Flux).[Q = image features, K = V = text tokens]Các mã chỉ là cách duy nhất văn bản ảnh hưởng đến hình ảnh.
The loss function is identical to Lesson 06.DDPM / dòng chảy tương ứng MSE trên tiếng ồn. Bạn chỉ cần thay đổi miền dữ liệu.
Các biến thể kiến trúc
| 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 |
Xu hướng: thay thế U-Net bằng DiT (giới chuyển đổi trên các bản vá ẩn), mở rộng mã hóa văn bản (T5 vượt CLIP để tuân thủ nhanh chóng), tăng các kênh ẩn (4 → 16 cung cấp nhiều không gian phân tích hơn).
Hãy xây dựng nó
code/main.pyxếp hàng một đồ chơi 1-D "VAE" (tự xác định mã hóa + decoder, để chứng minh; một VAE thực sự sẽ là một con conv net) trên đầu DDPM từ Bài học 06 và thêm điều kiện lớp với hướng dẫn không phân loại. Nó cho thấy rằng cùng một mất tích phân tán hoạt động cho dù bạn chạy trên giá trị nguyên chất 1-D hoặc trên giá trị mã hóa thông tin sâu sắc chính.
Bước 1: mã hóa/bản giải mã
pythondef encode(x): return x * 0.5 # toy "compression" to smaller scale
def decode(z): return z * 2.0Một VAE thực sự có trọng lượng được đào tạo.zkhông quan tâm đến không gian dữ liệu gốc.
Bước 2: phân tán trong z- Không gian
DDPM tương tự như bài học 06.z = E(x)Sau khi lấy mẫuz_0, giải mã với D(z_0)- Tôi không biết.
Bước 3: hướng dẫn không có phân loại
Trong quá trình đào tạo, hãy bỏ nhãn lớp 10% thời gian (đổi lại bằng một token không).ε_condvà ε_uncond, sau đó:
pythoneps_cfg = (1 + w) * eps_cond - w * eps_uncondw = 0= không có hướng dẫn (cụ thể đa dạng),w = 3= mặc định, w = 7+= bão hòa / quá sắc nét.
Bước 4: Điều kiện văn bản (định nghĩa, không phải mã)
Thay thế nhãn lớp bằng một đầu ra mã hóa văn bản đóng băng. Cho các văn bản nhúng vào U-Net thông qua sự chú ý chéo:
pythonh = h + CrossAttention(Q=h, K=text_embed, V=text_embed)Đây là sự khác biệt đáng kể duy nhất giữa mô hình phân tán theo điều kiện lớp và phân tán ổn định.
Những bẫy
- VAE-scale mismatch.SD 1.x VAEs có một định lượng không đổi (
scaling_factor ≈ 0.18215(Phần 2) được áp dụng sau khi mã hóa. - Text encoder silently wrong.SD3 cần T5-XXL với >=128 token, và sự quay lại CLIP-chỉ là thua lỗ.
use_t5=Truehoặc các miệng núi lửa trung thành. - Mixing latent spaces.SDXL, SD3, Flux đều sử dụng các VAE khác nhau. LoRA được đào tạo trên các laten SDXL sẽ không hoạt động trên SD3.
- CFG too high.
w > 10tạo ra những hình ảnh bão hòa, dầu và quá phù hợp với các yêu cầu với chi phí của sự đa dạng.w = 3-7- Tôi không biết. - Negative prompts leaking.Lần báo âm trống trở thành biểu tượng không; một lời báo âm đầy trở thành
ε_uncondChúng không giống nhau; một số đường ống âm thầm mặc định đến null.
Sử dụng nó
Các đống sản xuất vào năm 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 |
Chuyển nó
- Cứu lại
outputs/skill-sd-prompter.md. Skill lấy một prompt văn bản + phong cách mục tiêu và đầu ra: mô hình + điểm kiểm tra, thang CFG, mẫu, prompt tiêu cực, độ phân giải, sự kết hợp tùy chọn ControlNet / IP-Adapter, và danh sách kiểm tra QA từng bước.
Các bài tập
- Easy.Đi chạy
code/main.pyVới hướng dẫnw ∈ {0, 1, 3, 7, 15}- Đăng mẫu trung bình theo lớp.wcó phải các phương tiện lớp khác nhau ngoài phương tiện dữ liệu thực? - Medium.Thay đổi bộ mã hóa hàng tuyến đồ chơi cho cặp mã hóa / mã hóa tanh-MLP với mất tích tái tạo. Phục trệ phân tán trên các dấu ẩn mới.
- Hard.Thiết lập một suy luận Stable Diffusion thực sự với các diffuser: tải
sdxl-base, chạy 30 bước Euler với CFG=7, thời gian nó.sdxl-turbocùng chủ đề, chất lượng khác nhau mô tả những gì đã thay đổi và tại sao.
Các điều khoản chính
| 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. |
Lưu ý sản xuất: chạy Flux-12B trên GPU tiêu dùng 8GB
Liên kết Flux là công thức "Tôi có một GPU tiêu dùng, tôi có thể vận chuyển này không?"
- Staggered loading.Flux có ba mạng không bao giờ cần phải tồn tại cùng nhau trong VRAM: T5-XXL mã hóa văn bản (~ 10 GB trong fp32), CLIP-L (còn nhỏ), 12B MMDiT và VAE. Mã hóa yêu cầu trước, xóa các mã hóa, tải DiT, từ chối, xóa DiT, tải VAE, giải mã. GPU 8GB tiêu dùng chỉ phù hợp với một giai đoạn tại một thời điểm.
- 4-bit quantization via bitsandbytes.
BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)trên cả mã hóa T5 và DiT. Giảm bộ nhớ 8x, giảm chất lượng không thể nhận thấy cho văn bản-đến hình ảnh theo các tiêu chuẩn của Aritra (được liên kết trong sổ ghi chép). - CPU offload.
pipe.enable_model_cpu_offload()tự động đổi các mô-đun giữa CPU và GPU khi mỗi bước tiến tiến.
Việc ghi nhớ là: 10 GB T5 / 8 = 1.25 GBđược định lượng,12 B params × 0.5 bytes = ~6 GBTP=1 kết luận không có mô hình song song, lượng hóa tối đa. Đối với sản xuất bạn sẽ chạy TP=2 hoặc TP=4 trên H100s; cho một máy tính xách tay phát triển duy nhất, đây là công thức.
Đọc thêm
- Rombach et al. (2022). High-Resolution Image Synthesis with Latent Diffusion Models Sự pha trộn ổn định.
- Podell et al. (2023). SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis SDXL.
- Peebles & Xie (2023). Scalable Diffusion Models with Transformers (DiT) 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 Gia đình Flux1.
- Hugging Face Diffusers docs thực hiện tham chiếu cho mỗi điểm kiểm soát trên.
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.