跳转至

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 在扩散模型中的应用