跳转至

08 - 流匹配与一致性模型

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

学习时间: 5 小时 重要性: ⭐⭐⭐⭐⭐ SD3/FLUX/Sora 的核心训练范式;一致性模型实现实时生成


🎯 学习目标

完成本章后,你将能够: - 理解 Flow Matching 理论框架( CNF 、条件 Flow Matching 、最优传输路径) - 掌握 Rectified Flow 的原理与 ReFlow 蒸馏 - 深入理解一致性模型( CT/CD )的自一致性约束 - 了解 iCT 、 sCT 的改进思路 - 掌握 LCM ( Latent Consistency Models )与 LCM-LoRA 的工程实践 - 通过代码实现 LCM 快速推理


1. Flow Matching 理论

1.1 连续归一化流( CNF )

基本思想:定义一个时间连续的向量场 \(v_t(x)\),将简单分布(如高斯噪声)\(p_0\) 通过 ODE 变换到目标数据分布 \(p_1\)

\[\frac{dx_t}{dt} = v_t(x_t), \quad t \in [0, 1]\]
\[x_0 \sim p_0 = \mathcal{N}(0, I), \quad x_1 \sim p_1 = p_{data}\]

训练目标:学习一个参数化的速度场 \(v_\theta(x_t, t)\) 使其尽可能匹配真实的概率路径。

1.2 直接训练 CNF 的困难

传统 CNF (如 Neural ODE )训练需要: - 前向:集成 ODE 计算 \(x_1\) - 反向:伴随方法计算梯度

这导致训练极其昂贵且不稳定。

1.3 条件 Flow Matching ( CFM )

Lipman et al. (2023, "Flow Matching for Generative Modeling") 提出了条件 Flow Matching ,绕过了直接训练 CNF 的困难:

核心洞察:不需要知道全局的概率路径 \(p_t(x)\),只需要为每个数据点 \(x_1\) 定义一个条件概率路径 \(p_t(x|x_1)\),然后对条件速度场进行回归。

条件高斯路径: $\(p_t(x|x_1) = \mathcal{N}(x; \mu_t(x_1), \sigma_t^2(x_1) I)\)$

最简单的选择是线性插值: $\(x_t = (1-t) \cdot x_0 + t \cdot x_1, \quad x_0 \sim \mathcal{N}(0, I)\)$

对应的条件速度场为: $\(u_t(x_t|x_1) = x_1 - x_0\)$

训练损失( CFM Loss ): $\(\mathcal{L}_{CFM} = \mathbb{E}_{t, x_0, x_1}\left[ \| v_\theta(x_t, t) - (x_1 - x_0) \|^2 \right]\)$

注意这与 DDPM 的 \(\epsilon\)-prediction 损失形式几乎一致,但有重要的概念差异: - DDPM 学习预测噪声 \(\epsilon\) - CFM 学习预测"速度" \(v = x_1 - x_0 = x_1 - \epsilon\)

1.4 最优传输路径( OT-CFM )

不同的路径选择会影响学习难度。 Tong et al. (2024, "Improving and Generalizing Flow-Based Generative Models with Minibatch Optimal Transport") 提出使用 mini-batch 最优传输配对 \(x_0\)\(x_1\)

标准 CFM:随机配对 \(x_0 \sim \mathcal{N}(0,I)\)\(x_1 \sim p_{data}\)

OT-CFM:在 mini-batch 内使用最优传输找到最佳配对,使路径更直:

\[\pi^* = \arg\min_{\pi \in \Pi(p_0, p_1)} \mathbb{E}_{(x_0, x_1) \sim \pi}[\|x_0 - x_1\|^2]\]

OT-CFM 使学习到的路径更直更短,减少采样步数。


2. Rectified Flow

2.1 基本原理

Rectified Flow ( Liu et al., 2023, "Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow")的核心思想是让数据和噪声之间的传输路径尽可能

直线插值: $\(z_t = (1 - t) \cdot z_0 + t \cdot \epsilon, \quad t \in [0, 1]\)$

\[z_0 \sim p_{data}, \quad \epsilon \sim \mathcal{N}(0, I)\]

模型学习预测速度: $\(v_\theta(z_t, t) \approx \epsilon - z_0\)$

为什么直线路径好?

如果路径完全是直线,理论上一步 Euler 积分即可完成采样: $\(z_0 = z_1 - v_\theta(z_1, 1) \cdot \Delta t\)$

实际中路径不是完美直线(因为不同数据点的路径会交叉),所以需要多步。但路径越直,所需步数越少。

2.2 ReFlow 蒸馏

ReFlow 是将弯曲路径"拉直"的迭代过程:

Text Only
第1轮 Rectified Flow: 训练 v₁(z_t, t),路径还有弯曲
         ↓ 用v₁生成(z₀, z₁)配对
第2轮 ReFlow: 在新配对上训练 v₂(z_t, t),路径更直
         ↓ 用v₂生成新配对
第k轮 ReFlow: v_k接近直线,1-2步即可生成

数学形式:给定第 \(k\) 轮模型 \(v_k\),生成配对数据: $\(\hat{z}_0 = \text{ODE\_solve}(z_1, v_k), \quad z_1 \sim \mathcal{N}(0,I)\)$

然后在 \((\hat{z}_0, z_1)\) 配对上训练新模型 \(v_{k+1}\)

2.3 SD3 中的 Rectified Flow

SD3 ( Esser et al., 2024 )在大规模文生图模型中采用 Rectified Flow :

  • 使用 logit-normal 时间步采样:\(t \sim \sigma(\mathcal{N}(0, 1))\),在中间时间步采样更多
  • 配合 MM-DiT 架构, 20-28 步即可高质量生成
  • 时间步调度经过仔细调优,在质量和速度间取得平衡
Python
import torch

def rectified_flow_loss(model, x_0, text_cond, t=None):
    """Rectified Flow 训练损失"""
    batch_size = x_0.shape[0]

    # 采样时间步 (logit-normal分布)
    if t is None:
        t = torch.sigmoid(torch.randn(batch_size, device=x_0.device))

    # 采样噪声
    epsilon = torch.randn_like(x_0)

    # 线性插值: z_t = (1-t) * x_0 + t * epsilon
    t_expand = t.view(-1, 1, 1, 1)  # 重塑张量形状
    z_t = (1 - t_expand) * x_0 + t_expand * epsilon

    # 目标速度: v = epsilon - x_0
    target_v = epsilon - x_0

    # 模型预测速度
    pred_v = model(z_t, t, text_cond)

    # MSE损失
    loss = ((pred_v - target_v) ** 2).mean()
    return loss

def rectified_flow_sample(model, shape, text_cond, num_steps=28):
    """Rectified Flow Euler采样"""
    device = text_cond.device
    dt = 1.0 / num_steps

    # 从纯噪声开始 (t=1)
    z = torch.randn(shape, device=device)

    for i in range(num_steps):
        t = torch.ones(shape[0], device=device) * (1.0 - i * dt)
        v = model(z, t, text_cond)
        z = z - v * dt  # Euler步: z_{t-dt} = z_t - v * dt

    return z  # z_0 ≈ 数据

3. 一致性模型( Consistency Models )

3.1 核心动机

一致性模型( Song et al., 2023, "Consistency Models")追求单步生成——从任何噪声水平直接映射到干净数据。

关键约束——自一致性( Self-Consistency )

对于 PF-ODE 轨迹上的任意两个时间点 \(t_1, t_2\),一致性函数 \(f_\theta\) 必须满足:

\[f_\theta(x_{t_1}, t_1) = f_\theta(x_{t_2}, t_2)\]

即同一轨迹上的所有点都映射到同一个干净数据 \(x_0\)

边界条件: $\(f_\theta(x_\epsilon, \epsilon) = x_\epsilon \quad (\text{当} t \to 0 \text{时,输出等于输入})\)$

3.2 一致性训练( CT )

无需预训练的扩散模型,直接从数据训练一致性函数:

\[\mathcal{L}_{CT} = \mathbb{E}_{x_0, t}\left[d\left(f_\theta(x_{t_{n+1}}, t_{n+1}), \; f_{\theta^-}(x_{t_n}, t_n)\right)\right]\]

其中: - \(x_{t_{n+1}}\)\(x_{t_n}\) 是同一轨迹上相邻的两个噪声版本 - \(\theta^-\) 是 EMA 目标网络(类似 DDPM 中的 target network ) - \(d(\cdot, \cdot)\) 是距离度量(如 LPIPS )

3.3 一致性蒸馏( CD )

预训练的扩散模型蒸馏出一致性函数:

\[\mathcal{L}_{CD} = \mathbb{E}_{x_0, t}\left[d\left(f_\theta(x_{t_{n+1}}, t_{n+1}), \; f_{\theta^-}(\hat{x}_{t_n}, t_n)\right)\right]\]

其中 \(\hat{x}_{t_n}\) 是用预训练的扩散模型从 \(x_{t_{n+1}}\) 去噪一步得到的。

Text Only
训练好的扩散模型 (教师)
     ↓ ODE一步求解
x_{t_{n+1}} ──→ x_{t_n}
     ↓              ↓
  f_θ(·,t_{n+1})  f_{θ⁻}(·,t_n)
     ↓              ↓
   pred_1  ═══  pred_2   (一致性损失: 两者应相等)

3.4 采样方式

一致性模型支持灵活的多步采样,在质量和速度间权衡:

Python
def consistency_model_sample(f_theta, z_T, steps=[1.0, 0.5, 0.2]):
    """
    一致性模型多步采样
    steps: 从高噪声到低噪声的时间点列表
    """
    x = z_T
    for i, t in enumerate(steps):  # enumerate同时获取索引和元素
        # 一步去噪到x_0
        x_0_pred = f_theta(x, t)

        if i < len(steps) - 1:
            # 重新加噪到下一个时间点
            t_next = steps[i + 1]
            noise = torch.randn_like(x_0_pred)
            x = x_0_pred + t_next * noise
        else:
            x = x_0_pred

    return x
  • 1 步:最快,质量可接受( FID ~3.55 on CIFAR-10 )
  • 2 步:质量显著提升
  • 多步:接近标准扩散模型质量

4. 改进的一致性模型

4.1 iCT ( Improved Consistency Training )

Song & Dhariwal (2024, "Improved Techniques for Training Consistency Models") 提出多项改进:

  • 连续时间一致性训练:消除离散时间步的限制
  • 改进的距离度量:使用 Pseudo-Huber 损失替代 LPIPS
  • 自适应噪声调度:动态调整训练时的噪声分布
  • EMA 衰减调度:改进目标网络的更新策略
\[d_{pseudo-huber}(x, y) = \sqrt{\|x - y\|^2 + c^2} - c\]

4.2 sCT ( Simplified Consistency Training )

Lu & Song (2024) 提出简化版一致性训练:

  • 去除了 EMA 目标网络的需求
  • 直接使用 TrigFlow 参数化
  • 训练更简单稳定,与标准扩散训练复杂度相当
  • 在 ImageNet 64×64 上取得最佳单步 FID

5. LCM ( Latent Consistency Models )

5.1 动机与原理

LCM ( Luo et al., 2023, "Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference")将一致性模型思想应用到潜空间,直接在 Stable Diffusion 等 LDM 上实现少步生成。

核心创新: - 在潜空间(而非像素空间)进行一致性蒸馏 - 从预训练 SD 蒸馏,保留 SD 的生成能力 - 4 步即可生成高质量 1024×1024 图像 - 仅需约 40-60 A100 GPU 小时训练

5.2 LCM 训练过程

\[\mathcal{L}_{LCM} = \mathbb{E}_{z_0, c, t}\left[\| f_\theta(z_{t_{n+1}}, c, t_{n+1}) - f_{\theta^-}(\hat{z}_{t_n}^{\phi}, c, t_n) \|^2\right]\]

其中 \(\hat{z}_{t_n}^{\phi}\) 由预训练 SD 模型(参数 \(\phi\))执行一步去噪得到。

5.3 LCM-LoRA

LCM-LoRA ( Luo et al., 2024 )是 LCM 的轻量级版本,仅需训练 LoRA 参数即可将任何 SD 模型加速:

关键优势: - LoRA 参数仅几十 MB ,可与其他 LoRA 组合使用 - 训练资源需求极低(单卡即可) - 可即插即用到任何 SD/SDXL 模型

Python
from diffusers import LCMScheduler, StableDiffusionXLPipeline
import torch

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

# 加载LCM-LoRA
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl")
pipe.fuse_lora()

# 使用LCM调度器
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.to("cuda")  # 移至GPU/CPU

# 仅需4步 + 低CFG即可生成
image = pipe(
    prompt="A beautiful sunset over the ocean, masterpiece, 8K",
    num_inference_steps=4,
    guidance_scale=1.5,  # LCM使用低CFG (1.0-2.0)
).images[0]
image.save("lcm_lora_output.png")

5.4 SDXL-Lightning 与 Hyper-SD

在 LCM 之后,还出现了更多高效蒸馏方案:

方法 蒸馏策略 步数 SDXL FID
LCM-LoRA 一致性蒸馏 4 步 ~25
SDXL-Turbo 对抗蒸馏( ADD ) 1-4 步 ~23
SDXL-Lightning 渐进对抗蒸馏 1-4 步 ~21
Hyper-SD 人类反馈学习+蒸馏 1-8 步 ~20

6. 速度-质量对比与实时生成应用

6.1 综合对比

Text Only
采样步数 vs 生成质量 (示意)

质量
 │          ╱ DDPM (1000步)
 │        ╱
 │      ╱── DDIM (50步)
 │    ╱──── DPM-Solver++ (20步)
 │  ╱────── Rectified Flow (20-28步)
 │╱──────── LCM/Lightning (4步)
 │════════ 一致性模型 (1-2步)
 └─────────────────────→ 步数

6.2 实时交互式生成

StreamDiffusion ( Kodaira et al., 2024 )等框架实现了实时交互式图像生成:

  • 结合 LCM 的少步采样
  • 流水线并行解码
  • 在 RTX 4090 上达到>60 FPS ( 512×512 )
  • 应用:实时风格迁移、直播特效、创意工具

6.3 速度优化技术栈

Text Only
模型层面: LCM / 一致性模型 → 减少采样步数到1-4步
     +
推理层面: TensorRT / ONNX Runtime → 单步推理加速2-5×
     +
系统层面: 流水线并行 + DeepCache → 帧间复用
     =
     实时生成 (>30 FPS @ 512×512)

7. LCM 快速推理完整代码

Python
"""
LCM快速推理示例 — 对比标准SD与LCM的速度差异
"""
import torch
import time
from diffusers import (
    StableDiffusionPipeline,
    LCMScheduler,
    DPMSolverMultistepScheduler,
)

device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.float32

# === 1. 加载基础模型 ===
model_id = "Lykon/dreamshaper-8"  # 社区微调SD 1.5模型

pipe = StableDiffusionPipeline.from_pretrained(
    model_id, torch_dtype=dtype
)
pipe.to(device)

prompt = "A cyberpunk city at night, neon lights, rain, ultra detailed"
negative_prompt = "blurry, low quality, deformed"

# === 2. 标准采样 (DPM-Solver++, 25步) ===
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    pipe.scheduler.config
)

start = time.time()
image_standard = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=25,
    guidance_scale=7.5,
).images[0]
time_standard = time.time() - start
print(f"标准采样 (25步): {time_standard:.2f}s")
image_standard.save("standard_25step.png")

# === 3. LCM加速采样 (4步) ===
pipe.load_lora_weights("latent-consistency/lcm-lora-sd-v1-5")
pipe.fuse_lora()
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)

start = time.time()
image_lcm = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=4,
    guidance_scale=1.5,  # LCM需要低CFG
).images[0]
time_lcm = time.time() - start
print(f"LCM采样 (4步): {time_lcm:.2f}s")
image_lcm.save("lcm_4step.png")

print(f"加速比: {time_standard / time_lcm:.1f}x")

典型输出( RTX 4090 ):

Text Only
标准采样 (25步): 2.15s
LCM采样 (4步): 0.38s
加速比: 5.7x

📋 面试要点

高频面试题

  1. Flow Matching 与 DDPM 的核心区别是什么?
  2. DDPM :前向过程按固定噪声调度添加噪声(\(\sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t}\epsilon\)),路径弯曲
  3. Flow Matching :直接线性插值(\((1-t)x_0 + t\epsilon\)),路径更直
  4. DDPM 学习预测噪声 \(\epsilon\); FM 学习预测速度 \(v = \epsilon - x_0\)
  5. FM 的直线路径使得采样所需步数更少

  6. Rectified Flow 的"拉直"过程是怎样的?

  7. 第 1 轮:随机配对 \((x_0, \epsilon)\) 训练,路径有交叉
  8. ReFlow :用已训练模型生成新的 \((\hat{x}_0, \epsilon)\) 配对
  9. 新配对对应的 ODE 轨迹更不容易交叉,路径更直
  10. 迭代几轮后路径接近直线, 1-2 步足够

  11. 一致性模型如何实现单步生成?

  12. 核心约束:同一 ODE 轨迹上的所有点映射到同一个 \(x_0\)
  13. 通过自一致性损失训练:相邻噪声水平的预测应相同
  14. 推理时从任意噪声水平一步直接预测 \(x_0\)
  15. 多步采样:先去噪再加噪再去噪,可逐步提升质量

  16. LCM-LoRA 为什么工程价值巨大?

  17. 将一致性蒸馏以 LoRA 形式实现,仅需训练少量参数
  18. 可即插即用到任何 SD/SDXL 模型,不改变原模型
  19. 方便与其他 LoRA (风格、角色等)组合使用
  20. 训练成本极低,社区可广泛复现

✏️ 练习

练习 1 : LCM-LoRA 效果对比

分别使用 25 步标准采样和 4 步 LCM 采样生成同一提示的图像,从视觉质量、一致性、细节等维度对比。

练习 2 :步数-质量曲线

使用 LCM-LoRA ,测试步数从 1 到 8 的生成质量变化,结合 CLIP Score 或人工评分绘制曲线。

练习 3 : Flow Matching 训练

在 CIFAR-10 上实现一个简单的 Flow Matching 训练循环,对比线性路径和余弦路径的收敛速度。

练习 4 :论文精读清单

  • Flow Matching: Lipman et al., 2023
  • Rectified Flow: Liu et al., 2023
  • Consistency Models: Song et al., 2023
  • LCM: Luo et al., 2023

参考文献

  1. Lipman et al., 2023. "Flow Matching for Generative Modeling" — CFM 理论
  2. Tong et al., 2024. "Improving and Generalizing Flow-Based Generative Models with Minibatch Optimal Transport" — OT-CFM
  3. Liu et al., 2023. "Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow" — Rectified Flow
  4. Song et al., 2023. "Consistency Models" — 一致性模型
  5. Song & Dhariwal, 2024. "Improved Techniques for Training Consistency Models" — iCT
  6. Luo et al., 2023. "Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference" — LCM
  7. Luo et al., 2024. "LCM-LoRA: A Universal Stable-Diffusion Acceleration Module" — LCM-LoRA
  8. Esser et al., 2024. "Scaling Rectified Flow Transformers for High-Resolution Image Synthesis" — SD3
  9. Kodaira et al., 2024. "StreamDiffusion: A Pipeline-Level Solution for Real-Time Interactive Generation" — 实时生成

下一章: 09-视频生成与时空扩散 — 视频生成前沿技术全景