跳转至

06 - Stable Diffusion进阶:从SDXL到SD3

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

学习时间: 5小时 重要性: ⭐⭐⭐⭐⭐ AIGC工程落地的核心技术栈


🎯 学习目标

完成本章后,你将能够: - 掌握Stable Diffusion从1.5到3.5的完整技术演进脉络 - 深入理解SDXL的双U-Net、Refiner和微条件机制 - 理解SD3/SD3.5的MM-DiT架构与Rectified Flow采样 - 了解FLUX系列模型的技术突破与工程实践 - 使用diffusers库完成各版本SD的推理与微调


1. Stable Diffusion发展历程

1.1 技术演进时间线

版本 发布时间 核心创新 分辨率 参数量
SD 1.4/1.5 2022.08/10 LDM + CLIP text encoder 512×512 ~860M UNet
SD 2.0/2.1 2022.11/12 OpenCLIP ViT-H, v-prediction 768×768 ~860M UNet
SDXL 2023.07 双CLIP编码器、Refiner、微条件 1024×1024 ~3.5B Base + ~3.1B Refiner(总约~6.6B)
SDXL Turbo 2023.11 ADD对抗蒸馏,1-4步生成 512×512 2.6B
SD3 2024.03 MM-DiT + Rectified Flow + 三编码器 1024×1024 2B/8B
SD3.5 2024.10 MM-DiT改进、QK-Norm 1024×1024 2.5B/8B
FLUX.1 2024.08 混合DiT、并行注意力 1024×1024 12B

1.2 SD 1.5 回顾

SD 1.5是LDM(Rombach et al., 2022, "High-Resolution Image Synthesis with Latent Diffusion Models")的直接工程化产物:

架构组成

Text Only
文本 → CLIP ViT-L/14 → 77×768 文本嵌入
                              ↓ cross-attention
噪声 z_T → UNet (860M) → 去噪 → z_0 → VAE Decoder → 图像(512×512)

局限性: - 单一CLIP编码器语义理解有限 - 仅支持512×512,更高分辨率易出现重复构图 - 人手、文字渲染能力差


2. SDXL架构创新

2.1 整体架构

SDXL(Podell et al., 2023, "SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis")对SD进行了全面升级。

双阶段流水线

Text Only
文本 prompt
[CLIP ViT-L/14] + [OpenCLIP ViT-bigG/14]
    ↓ 拼接 → 2048维文本嵌入
Stage 1: Base UNet (2.6B) → 1024×1024 潜空间去噪
    ↓ (可选)
Stage 2: Refiner UNet (3.1B) → 精细化细节
VAE Decoder → 最终图像

2.2 双文本编码器

SDXL使用两个CLIP编码器并拼接其输出,显著增强了文本理解能力:

Python
import torch
from transformers import CLIPTextModel, CLIPTextModelWithProjection

# CLIP ViT-L/14: 提供细粒度局部语义
text_encoder_1 = CLIPTextModel.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    subfolder="text_encoder"
)
# OpenCLIP ViT-bigG/14: 提供全局语义对齐
text_encoder_2 = CLIPTextModelWithProjection.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    subfolder="text_encoder_2"
)

# 文本嵌入拼接
# text_encoder_1 输出: [B, 77, 768]
# text_encoder_2 输出: [B, 77, 1280]
# 拼接后: [B, 77, 2048] → 送入 UNet cross-attention

2.3 微条件(Micro-Conditioning)

SDXL引入了多种微条件来精细控制生成:

1. 原始分辨率条件(Original Size Conditioning): 将训练图像的原始尺寸 \((h_{orig}, w_{orig})\) 作为条件注入,避免因数据增强(裁剪/缩放)导致的伪影。

2. 裁剪坐标条件(Crop Coordinates Conditioning): 将裁剪左上角坐标 \((c_{top}, c_{left})\) 作为条件,防止生成"被截断"的图像。

3. 目标尺寸条件(Target Size Conditioning): 指定生成图像的目标尺寸 \((h_{target}, w_{target})\)

Python
# 微条件嵌入方式
def get_micro_conditioning(original_size, crop_coords, target_size):
    """
    将微条件编码为Fourier特征并与时间步嵌入相加
    """
    # 所有条件值 → Fourier嵌入
    cond = torch.tensor([
        original_size[0], original_size[1],   # 原始尺寸
        crop_coords[0], crop_coords[1],        # 裁剪坐标
        target_size[0], target_size[1]          # 目标尺寸
    ])
    # Sinusoidal编码后与timestep embedding相加
    return sinusoidal_embedding(cond)

2.4 Refiner模型

Refiner是专门用于精细化Base模型输出的第二阶段模型:

  • 仅在低噪声水平(\(t < 200\))上训练
  • 使用更大的模型容量关注细节质量
  • 接收Base模型的中间去噪结果继续精化
\[x_{refined} = \text{Refiner}(x_{base}^{(t=200)}, t, c_{text})\]

2.5 UNet架构改进

改进点 SD 1.5 SDXL
通道数 320 320
Attention Block位置 stages 1,2,3 stages 1,2(移除最小分辨率stage的attention)
Transformer深度 [1,1,1,1] [0,2,10](更多中间层attention)
文本嵌入维度 768 2048
总参数量 860M 2.6B

3. SD3/SD3.5——Transformer取代U-Net

3.1 核心创新

SD3(Esser et al., 2024, "Scaling Rectified Flow Transformers for High-Resolution Image Synthesis")标志着从U-Net到Transformer的范式转变。

三大技术支柱: 1. MM-DiT(Multimodal Diffusion Transformer):图文联合建模 2. Rectified Flow:替代DDPM的噪声调度 3. 三编码器文本系统:CLIP-L + CLIP-G + T5-XXL

3.2 MM-DiT架构

MM-DiT的核心思想是将文本和图像token放在同一个Transformer中处理,通过独立的模态权重实现深度交互:

Text Only
图像 patches: z → Linear → [img_tokens]   (N_img × D)
文本 tokens:  c → Linear → [txt_tokens]   (N_txt × D)
         拼接 → [img_tokens; txt_tokens]
         Joint Attention (共享QKV投影)
         独立的MLP(图像MLP / 文本MLP)
         拆分 → img_out, txt_out

数学形式: $\(\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{[Q_{img}; Q_{txt}] \cdot [K_{img}; K_{txt}]^T}{\sqrt{d}}\right) \cdot [V_{img}; V_{txt}]\)$

其中图像和文本的QKV投影权重是独立的,但注意力计算是联合的,这样既保留了模态特异性又实现了深度交互。

3.3 三编码器文本系统

Python
# SD3的三编码器文本系统
# 1. CLIP-L/14: 局部细粒度语义 [B, 77, 768]
# 2. CLIP-G/14: 全局语义对齐   [B, 77, 1280]
# 3. T5-XXL:    深度语言理解    [B, 77, 4096]

# CLIP-L和CLIP-G的pooled output → 拼接为全局条件向量
# T5-XXL的sequence output → 与CLIP序列输出拼接, 送入cross-attention

# 实际推理时T5-XXL可选(节省显存),
# 但对复杂prompt的理解(空间关系、属性绑定)提升明显

3.4 Rectified Flow

SD3使用Rectified Flow替代传统DDPM的噪声调度(详见第08章):

\[z_t = (1-t) \cdot z_0 + t \cdot \epsilon, \quad t \in [0,1]\]

模型学习预测"速度场" \(v_\theta\)

\[v_\theta(z_t, t) \approx \epsilon - z_0\]

优势: - 数据和噪声之间的路径更直,采样步数更少 - 在20-28步即可获得高质量结果 - 配合Euler求解器即可高效采样

3.5 SD3.5改进

SD3.5(2024.10)在SD3基础上进行了工程优化: - QK-Normalization:稳定大模型训练中的注意力数值 - 改进的VAE:16通道潜空间(SD3为16通道,SD1.5/SDXL为4通道) - 多尺寸版本:SD3.5 Large (8B) / SD3.5 Medium (2.5B) / SD3.5 Large Turbo


4. FLUX系列

4.1 FLUX.1简介

FLUX.1由Black Forest Labs(Stability AI核心团队出走创立)于2024年8月发布,是目前开源图像生成效果最好的模型之一。

FLUX.1系列: | 版本 | 参数量 | 特点 | 许可证 | |------|--------|------|--------| | FLUX.1 [schnell] | 12B | 4步快速生成 | Apache 2.0 | | FLUX.1 [dev] | 12B | 高质量引导蒸馏 | 非商用 | | FLUX.1 [pro] | 12B | 最高质量,API访问 | 商用API |

4.2 FLUX技术架构

FLUX在SD3的MM-DiT基础上进一步改进:

Text Only
文本 → CLIP-L + T5-XXL → 文本嵌入
图像 → VAE Encoder → Patchify → 图像tokens
       ┌──────────────────────────┐
       │  Double Stream Blocks ×19 │ ← 图文独立处理 + 联合注意力
       │  (类似MM-DiT)             │
       └──────────────────────────┘
       ┌──────────────────────────┐
       │  Single Stream Blocks ×38 │ ← 图文合并处理
       │  (高效融合)               │
       └──────────────────────────┘
       Unpatchify → VAE Decoder → 图像

关键创新: - 混合架构:前半部分双流(类似MM-DiT),后半部分单流(纯拼接处理),兼顾模态特异性和计算效率 - Rotary Positional Embedding (RoPE):替代绝对位置编码,更好地推广到不同分辨率 - 并行注意力:Attention和FFN并行计算减少延迟 - Flow Matching训练:继承SD3的Rectified Flow

4.3 FLUX快速生成机制

FLUX.1 [schnell] 通过LADD(Latent Adversarial Diffusion Distillation) 实现4步高质量生成:

Python
# 使用diffusers运行FLUX.1 schnell
from diffusers import FluxPipeline
import torch

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-schnell",
    torch_dtype=torch.bfloat16
)
pipe.to("cuda")  # 移至GPU/CPU

# 仅需4步即可生成高质量1024×1024图像
image = pipe(
    prompt="A photorealistic cat wearing sunglasses on a beach",
    num_inference_steps=4,
    guidance_scale=0.0,  # schnell不需要CFG
    height=1024,
    width=1024,
).images[0]
image.save("flux_output.png")

5. 开源生态与工程实践

5.1 ComfyUI工作流

ComfyUI是目前最流行的节点式扩散模型工作流编辑器:

Text Only
[加载模型] → [CLIP文本编码] → [KSampler采样]
[加载VAE] ← ─ ─ ─ ─ ─ ─ → [VAE解码] → [保存图像]

优势: - 可视化节点编辑,易于复现工作流 - 支持几乎所有主流SD变体(SDXL, SD3, FLUX) - 丰富的自定义节点生态 - 支持LoRA、ControlNet、IPAdapter等插件

5.2 LoRA微调

LoRA(Low-Rank Adaptation)是最常用的轻量微调方法:

Python
from diffusers import StableDiffusionXLPipeline
import torch

# 加载SDXL基础模型
pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16"
)
pipe.to("cuda")

# 加载LoRA权重
pipe.load_lora_weights(
    "path/to/lora/weights",
    weight_name="custom_style.safetensors"
)
# 可调节LoRA强度
pipe.fuse_lora(lora_scale=0.8)

image = pipe(
    prompt="一只可爱的猫咪,动漫风格",
    num_inference_steps=30,
    guidance_scale=7.5,
).images[0]

5.3 ControlNet控制

ControlNet(Zhang & Agrawala, 2023)为SD添加了精细的空间控制:

ControlNet类型 条件输入 典型应用
Canny Edge 边缘图 保持物体轮廓
Depth 深度图 控制3D空间关系
OpenPose 人体骨架 控制人物姿势
Scribble 涂鸦草图 草稿转精稿
Tile 低分辨率图 超分辨率
IP-Adapter 参考图像 风格/内容迁移

5.4 SDXL完整推理代码

Python
from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
from diffusers import DPMSolverMultistepScheduler
import torch

# === 1. 加载Base模型 ===
base_pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
base_pipe.to("cuda")
# 使用DPM-Solver++加速采样
base_pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    base_pipe.scheduler.config
)

# === 2. 加载Refiner模型(可选) ===
refiner_pipe = StableDiffusionXLImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
refiner_pipe.to("cuda")

# === 3. 两阶段生成 ===
prompt = "A majestic dragon flying over a crystal lake, epic fantasy art, 8K"
negative_prompt = "blurry, low quality, deformed"

# Base生成(在高噪声区间去噪)
base_image = base_pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=40,
    denoising_end=0.8,     # 在t=0.8处停止
    output_type="latent",  # 输出潜空间表示
).images

# Refiner精化(在低噪声区间去噪)
refined_image = refiner_pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=40,
    denoising_start=0.8,   # 从t=0.8处开始
    image=base_image,
).images[0]

refined_image.save("sdxl_result.png")

5.5 SD3推理代码

Python
from diffusers import StableDiffusion3Pipeline
import torch

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-large",
    torch_dtype=torch.bfloat16,
)
pipe.to("cuda")

# SD3使用Rectified Flow,默认28步
image = pipe(
    prompt="An astronaut riding a horse on Mars, photorealistic, cinematic lighting",
    negative_prompt="blurry, cartoon",
    num_inference_steps=28,
    guidance_scale=7.0,
    height=1024,
    width=1024,
).images[0]
image.save("sd3_result.png")

6. 各版本性能对比

6.1 生成质量与效率

指标 SD 1.5 SDXL SD3 (8B) FLUX.1 dev
FID (COCO-30K) ~8.5 ~6.5 ~5.8 ~5.2
人体解剖正确率 很高
文字渲染能力 一般 很好
推理显存 (fp16) ~4GB ~7GB ~16GB ~24GB
推理速度 (A100) ~2s ~5s ~10s ~15s

6.2 选型建议

Text Only
需求分析:
├── 速度优先、资源受限 → SD 1.5 / SDXL Turbo
├── 质量优先、充足显存 → FLUX.1 dev / SD3.5 Large
├── 平衡质量与速度 → SDXL + DPM-Solver++
├── 实时生成 → FLUX.1 schnell (4步) / SDXL Turbo (1-4步)
└── 商用部署 → SDXL (开源) / FLUX.1 pro (API)

📋 面试要点

高频面试题

  1. SDXL相比SD 1.5有哪些关键改进?
  2. 双CLIP文本编码器(ViT-L + ViT-bigG),文本嵌入从768维升至2048维
  3. 微条件机制(原始分辨率、裁剪坐标、目标尺寸)消除训练数据增强引入的伪影
  4. 可选的Refiner模型专注低噪声区间精细化
  5. UNet参数从860M增至2.6B,Transformer深度显著增加

  6. SD3的MM-DiT与标准DiT有什么区别?

  7. MM-DiT是多模态联合Transformer,图像和文本token在同一序列中进行联合注意力
  8. 图像和文本使用独立的QKV投影矩阵和MLP,保持模态特异性
  9. 标准DiT只处理图像token,文本条件通过AdaLN注入

  10. Rectified Flow相比DDPM的优势是什么?

  11. 数据和噪声之间的插值路径更直(线性),比DDPM的弯曲路径更易学习
  12. 需要更少的采样步数(20-28步 vs 50-1000步)
  13. 可进一步通过ReFlow蒸馏减少步数

  14. FLUX.1的混合双流/单流架构有什么好处?

  15. 前半部分双流(Double Stream):图文各自保留模态特征,联合注意力实现深度交互
  16. 后半部分单流(Single Stream):合并处理降低计算量
  17. 兼顾了表达能力和计算效率

✏️ 练习

练习1:SDXL推理与对比

使用diffusers库分别运行SD 1.5和SDXL,对同一prompt生成图像并对比质量差异,记录推理时间和显存占用。

练习2:LoRA微调SDXL

收集20-30张特定风格的图片,使用kohya-ss训练脚本为SDXL训练一个风格LoRA,观察不同rank(4/8/16)对效果的影响。

练习3:FLUX.1步数实验

使用FLUX.1 schnell测试不同步数(½/4/8步)的生成效果,绘制"步数-质量-速度"曲线。

练习4:论文精读

  • 精读SDXL论文,总结微条件机制的消融实验结果
  • 精读SD3论文,理解MM-DiT与U-ViT、DiT的实验对比

参考文献

  1. Rombach et al., 2022. "High-Resolution Image Synthesis with Latent Diffusion Models" — LDM/Stable Diffusion原始论文
  2. Podell et al., 2023. "SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis" — SDXL
  3. Esser et al., 2024. "Scaling Rectified Flow Transformers for High-Resolution Image Synthesis" — SD3
  4. Black Forest Labs, 2024. "FLUX.1 Technical Report" — FLUX系列
  5. Zhang & Agrawala, 2023. "Adding Conditional Control to Text-to-Image Diffusion Models" — ControlNet
  6. Hu et al., 2022. "LoRA: Low-Rank Adaptation of Large Language Models" — LoRA

下一章: 07-DiT与Transformer扩散架构 — 深入Transformer在扩散模型中的应用