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