跳转至

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-视频生成与时空扩散 — 视频生成前沿技术全景