Hugging Face 发布 LCM LoRA,让 SDXL 4 步完成图像生成
SDXL in 4 steps with Latent Consistency LoRAs
Hugging Face 与 LCM 团队发布 LCM LoRA 方法及 diffusers 集成,通过训练少量 LoRA 适配层,让 Stable Diffusion 和 SDXL 无需单独蒸馏即可用 4 步生成图像。
原文给出 LCM LoRA 的原理、可用权重和各硬件基准数据,读者可以直接复用代码把 SDXL 推理降到 4 步。
潜在一致性模型(LCM)是一种通过将原始模型蒸馏为另一个所需步骤更少的版本(从原来的25到50步减少到4到8步),从而减少使用Stable Diffusion(或SDXL)生成图像所需步骤的方法。蒸馏是一种训练过程,旨在使用新模型复制源模型的输出。蒸馏后的模型可能被设计得更小(如DistilBERT或最近发布的Distil-Whisper),或者在本例中,需要更少的运行步骤。这通常是一个漫长且昂贵的过程,需要大量数据、耐心和几块GPU。
嗯,那是今天之前的情况!
我们很高兴地宣布一种新方法,它基本上可以让Stable Diffusion和SDXL变得更快,就好像它们已经通过LCM过程蒸馏过一样!在3090上以大约1秒而不是7秒运行任何SDXL模型,或者在Mac上快10倍,听起来怎么样?继续阅读了解详情!
目录
- 方法概述
- 为什么这很重要
- Fast Inference with SDXL LCM LoRAs
- 基准测试
- 今日发布的LCM LoRA和模型
- 额外内容:将LCM LoRA与常规SDXL LoRA结合
- 如何训练LCM LoRA
- 资源
- 致谢
方法概述
那么,诀窍是什么? 对于潜在一致性蒸馏,每个模型都需要单独蒸馏。LCM LoRA的核心思想是只训练少量适配器,即LoRA层,而不是整个模型。然后,生成的LoRA可以应用于模型的任何微调版本,而无需单独蒸馏它们。如果你迫不及待想看看实际效果,请直接跳到下一节来体验推理代码。如果你想训练自己的LoRA,可以使用以下流程:
- 从Hub中选择一个可用的教师模型。例如,你可以使用SDXL(基础版),或任何你喜欢的微调或dreambooth版本。
- 在模型上训练LCM LoRA。LoRA是一种性能高效的微调方法,即PEFT,比完整模型微调便宜得多。有关PEFT的更多详细信息,请查看这篇博客文章或diffusers LoRA文档。
- 将LoRA与任何SDXL扩散模型和LCM调度器一起使用;搞定!你只需几步就能获得高质量的推理结果。
有关该过程的更多详细信息,请下载我们的论文。
为什么这很重要?
Stable Diffusion和SDXL的快速推理带来了新的用例和工作流程。仅举几例:
- 可及性:即使没有最新硬件,更多人也能有效使用生成工具。
- 更快的迭代:在极短的时间内获得更多图像和多种变体!这对艺术家和研究人员来说非常棒;无论是个人还是商业用途。
- 生产工作负载可能可以在不同的加速器上运行,包括CPU。
- 更便宜的图像生成服务。
为了衡量我们所说的速度差异,在 M1 Mac 上使用 SDXL(基础版)生成一张 1024x1024 的图像大约需要一分钟。使用 LCM LoRA,我们只需约 6 秒(4 步)就能获得出色的结果。这快了一个数量级,无需等待结果简直是颠覆性的改变。使用 4090,我们几乎可以瞬间得到响应(不到 1 秒)。这为在需要实时事件的应用中使用 SDXL 打开了大门。
使用 SDXL LCM LoRA 进行快速推理
今天发布的 diffusers 版本使得使用 LCM LoRA 变得非常容易:
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
lcm_lora_id = "latent-consistency/lcm-lora-sdxl"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.load_lora_weights(lcm_lora_id)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.to(device="cuda", dtype=torch.float16)
prompt = "close-up photography of old man standing in the rain at night, in a street lit by lamps, leica 35mm summilux"
images = pipe(
prompt=prompt,
num_inference_steps=4,
guidance_scale=1,
).images[0]
注意代码是如何:
- 使用 SDXL 1.0 基础模型实例化一个标准的扩散管道。
- 应用 LCM LoRA。
- 将调度器更改为 LCMScheduler,这是潜在一致性模型中使用的调度器。
- 就是这样!
这将生成以下全分辨率图像:

使用 LCM LoRA 以 4 步通过 SDXL 生成的图像。
质量比较
让我们看看步数如何影响生成质量。以下代码将生成总推理步数为 1 到 8 的图像:
images = []
for steps in range(8):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps+1,
guidance_scale=1,
generator=generator,
).images[0]
images.append(image)
以下是网格中显示的 8 张图像:

1 到 8 步的 LCM LoRA 生成结果。
正如预期,仅使用 1 步会产生一个没有可辨别特征且缺乏纹理的近似形状。然而,结果迅速改善,通常只需 4 到 6 步就能获得非常令人满意的效果。就我个人而言,我觉得之前测试中的 8 步图像对我来说有点过于饱和和“卡通化”,所以在这个例子中我可能会在 5 步和 6 步的图像之间选择。生成速度如此之快,你可以仅用 4 步创建一堆不同的变体,然后选择你喜欢的,并根据需要使用更多步数和改进的提示进行迭代。
引导比例和负面提示
请注意,在前面的示例中,我们使用了 guidance_scale 为 1,这实际上禁用了它。这对大多数提示都有效,而且速度最快,但会忽略负面提示。你也可以通过提供 1 到 2 之间的引导比例来探索使用负面提示——我们发现更大的值不起作用。
与基础 SDXL 的质量对比
在质量方面,这与标准 SDXL 管道相比如何?让我们看一个例子!
我们可以通过卸载 LoRA 权重并切换到默认调度器,快速将管道恢复为标准 SDXL 管道:
from diffusers import EulerDiscreteScheduler
pipe.unload_lora_weights()
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
然后我们可以像往常一样为 SDXL 运行推理。我们将使用不同的步数收集结果:
images = []
for steps in (1, 4, 8, 15, 20, 25, 30, 50):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps,
generator=generator,
).images[0]
images.append(image)

SDXL 管道结果(相同的提示和随机种子),使用 1、4、8、15、20、25、30 和 50 步。
如你所见,此示例中的图像直到约 20 步(第二行)才基本可用,而且质量随着步数增加仍有显著提升。最终图像中的细节令人惊叹,但达到该效果需要 50 步。
LCM LoRA 与其他模型
这项技术也适用于任何其他微调的 SDXL 或 Stable Diffusion 模型。为了演示,让我们看看如何在 collage-diffusion 上运行推理,这是一个使用 Dreambooth 从 Stable Diffusion v1.5 微调的模型。
代码与我们之前示例中看到的类似。我们加载微调后的模型,然后加载适用于 Stable Diffusion v1.5 的 LCM LoRA。
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "wavymulder/collage-diffusion"
lcm_lora_id = "latent-consistency/lcm-lora-sdv1-5"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.load_lora_weights(lcm_lora_id)
pipe.to(device="cuda", dtype=torch.float16)
prompt = "collage style kid sits looking at the night sky, full of stars"
generator = torch.Generator(device=pipe.device).manual_seed(1337)
images = pipe(
prompt=prompt,
generator=generator,
negative_prompt=negative_prompt,
num_inference_steps=4,
guidance_scale=1,
).images[0]
images

将 LCM LoRA 技术用于 Dreambooth Stable Diffusion v1.5 模型,实现 4 步推理。
完整的 Diffusers 集成
在 diffusers 中集成 LCM 使得可以利用 diffusers 工具箱中的许多功能和工作流。例如:
- 开箱即用的
mps支持搭载 Apple Silicon 的 Mac。 - 内存和性能优化,如 flash attention 或
torch.compile()。 - 针对低内存环境的额外内存节省策略,包括模型卸载。
- 工作流,如 ControlNet 或图像到图像。
- 训练和微调脚本。
基准测试
本节并非详尽无遗,而是展示我们在各种计算机上实现的生成速度。让我们再次强调,如此轻松地探索图像生成是多么自由。
| 硬件 | SDXL LoRA LCM(4 步) | SDXL 标准(25 步) |
|---|---|---|
| Mac, M1 Max | 6.5s | 64s |
| 2080 Ti | 4.7s | 10.2s |
| 3090 | 1.4s | 7s |
| 4090 | 0.7s | 3.4s |
| T4(Google Colab 免费层) | 8.4s | 26.5s |
| A100(80 GB) | 1.2s | 3.8s |
| Intel i9-10980XE CPU(使用 1/36 核心) | 29s | 219s |
这些测试在所有情况下均以批量大小 1 运行,使用 此脚本,作者为 Sayak Paul。
对于容量较大的显卡,如 A100,一次性生成多张图像时性能显著提升,这通常是生产工作负载的情况。
今日发布的 LCM LoRA 和模型
-
latent-consistency/lcm-lora-sdxl。用于 SDXL 1.0 base 的 LCM LoRA,如上述示例所示。latent-consistency/lcm-lora-sdv1-5。用于 Stable Diffusion 1.5 的 LCM LoRA。latent-consistency/lcm-lora-ssd-1b。用于segmind/SSD-1B的 LCM LoRA,这是一个蒸馏的 SDXL 模型,比原始 SDXL 小 50% 且快 60%。
latent-consistency/lcm-sdxl。源自 SDXL 1.0 base 的完全微调一致性模型。latent-consistency/lcm-ssd-1b。源自segmind/SSD-1B的完全微调一致性模型。
额外内容:将 LCM LoRA 与常规 SDXL LoRA 结合
使用 diffusers + PEFT 集成,您可以将 LCM LoRA 与常规 SDXL LoRA 结合,赋予它们在仅 4 步内运行 LCM 推理的超能力。
这里我们将把 CiroN2022/toy_face LoRA 与 LCM LoRA 结合:
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
lcm_lora_id = "latent-consistency/lcm-lora-sdxl"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.load_lora_weights(lcm_lora_id)
pipe.load_lora_weights("CiroN2022/toy-face", weight_name="toy_face_sdxl.safetensors", adapter_name="toy")
pipe.set_adapters(["lora", "toy"], adapter_weights=[1.0, 0.8])
pipe.to(device="cuda", dtype=torch.float16)
prompt = "a toy_face man"
negative_prompt = "blurry, low quality, render, 3D, oversaturated"
images = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=4,
guidance_scale=0.5,
).images[0]
images

标准 LoRA 和 LCM LoRA 结合用于快速(4 步)推理。
需要探索一些 LoRA 的想法?查看我们的实验性 LoRA the Explorer(LCM 版本) Space,测试社区的惊人创作并获得灵感!
如何训练 LCM 模型和 LoRA
作为今天 diffusers 发布的一部分,我们提供了与 LCM 团队作者合作开发的训练和微调脚本。它们允许用户:
- 在大型数据集(如 Laion)上对 Stable Diffusion 或 SDXL 模型进行全模型蒸馏。
- 训练 LCM LoRA,这是一个简单得多的过程。正如我们在本文中所示,它还可以实现 Stable Diffusion 的快速推理,而无需经过蒸馏训练。
更多详情,请查看仓库中 SDXL 或 Stable Diffusion 的说明。
我们希望这些脚本能激发社区尝试自己的微调。如果您将它们用于您的项目,请务必告知我们!
资源
演示
训练脚本
致谢
Latent Consistency Models 的出色工作由 LCM 团队完成,请务必查看他们的代码、报告和论文。本项目是 diffusers 团队、LCM 团队以及社区贡献者 Daniel Gu 合作的成果。我们相信这证明了开源 AI 的赋能力量,它是让研究人员、从业者和爱好者探索新想法并开展协作的基石。我们还要感谢 @madebyollin 对社区的持续贡献,包括我们在训练脚本中使用的 float16 自编码器。
来源:Hugging Face:Blog(RSS) · huggingface.co