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")的直接工程化产物:
架构组成:
文本 → 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 进行了全面升级。
双阶段流水线:
文本 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 编码器并拼接其输出,显著增强了文本理解能力:
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})\)。
# 微条件嵌入方式
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 模型的中间去噪结果继续精化
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 中处理,通过独立的模态权重实现深度交互:
图像 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 三编码器文本系统¶
# 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 章):
模型学习预测"速度场" \(v_\theta\):
优势: - 数据和噪声之间的路径更直,采样步数更少 - 在 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 基础上进一步改进:
文本 → 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 步高质量生成:
# 使用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 是目前最流行的节点式扩散模型工作流编辑器:
优势: - 可视化节点编辑,易于复现工作流 - 支持几乎所有主流 SD 变体( SDXL, SD3, FLUX ) - 丰富的自定义节点生态 - 支持 LoRA 、 ControlNet 、 IPAdapter 等插件
5.2 LoRA 微调¶
LoRA ( Low-Rank Adaptation )是最常用的轻量微调方法:
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 完整推理代码¶
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 推理代码¶
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 选型建议¶
需求分析:
├── 速度优先、资源受限 → 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)
📋 面试要点¶
高频面试题¶
- SDXL 相比 SD 1.5 有哪些关键改进?
- 双 CLIP 文本编码器( ViT-L + ViT-bigG ),文本嵌入从 768 维升至 2048 维
- 微条件机制(原始分辨率、裁剪坐标、目标尺寸)消除训练数据增强引入的伪影
- 可选的 Refiner 模型专注低噪声区间精细化
-
UNet 参数从 860M 增至 2.6B , Transformer 深度显著增加
-
SD3 的 MM-DiT 与标准 DiT 有什么区别?
- MM-DiT 是多模态联合 Transformer ,图像和文本 token 在同一序列中进行联合注意力
- 图像和文本使用独立的 QKV 投影矩阵和 MLP ,保持模态特异性
-
标准 DiT 只处理图像 token ,文本条件通过 AdaLN 注入
-
Rectified Flow 相比 DDPM 的优势是什么?
- 数据和噪声之间的插值路径更直(线性),比 DDPM 的弯曲路径更易学习
- 需要更少的采样步数( 20-28 步 vs 50-1000 步)
-
可进一步通过 ReFlow 蒸馏减少步数
-
FLUX.1 的混合双流/单流架构有什么好处?
- 前半部分双流( Double Stream ):图文各自保留模态特征,联合注意力实现深度交互
- 后半部分单流( Single Stream ):合并处理降低计算量
- 兼顾了表达能力和计算效率
✏️ 练习¶
练习 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 的实验对比
参考文献¶
- Rombach et al., 2022. "High-Resolution Image Synthesis with Latent Diffusion Models" — LDM/Stable Diffusion 原始论文
- Podell et al., 2023. "SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis" — SDXL
- Esser et al., 2024. "Scaling Rectified Flow Transformers for High-Resolution Image Synthesis" — SD3
- Black Forest Labs, 2024. "FLUX.1 Technical Report" — FLUX 系列
- Zhang & Agrawala, 2023. "Adding Conditional Control to Text-to-Image Diffusion Models" — ControlNet
- Hu et al., 2022. "LoRA: Low-Rank Adaptation of Large Language Models" — LoRA
下一章: 07-DiT 与 Transformer 扩散架构 — 深入 Transformer 在扩散模型中的应用