跳到正文
原文
Hugging Face:Blog(RSS)·· 2023-11-09精选AI 评分81

Hugging Face 发布 LCM LoRA,让 SDXL 4 步完成图像生成

SDXL in 4 steps with Latent Consistency LoRAs

AI 导读

Hugging Face 与 LCM 团队发布 LCM LoRA 方法及 diffusers 集成,通过训练少量 LoRA 适配层,让 Stable Diffusion 和 SDXL 无需单独蒸馏即可用 4 步生成图像。

推荐理由

原文给出 LCM LoRA 的原理、可用权重和各硬件基准数据,读者可以直接复用代码把 SDXL 推理降到 4 步。

正文 · AI 翻译

潜在一致性模型(LCM)是一种通过将原始模型蒸馏为另一个所需步骤更少的版本(从原来的25到50步减少到4到8步),从而减少使用Stable Diffusion(或SDXL)生成图像所需步骤的方法。蒸馏是一种训练过程,旨在使用新模型复制源模型的输出。蒸馏后的模型可能被设计得更小(如DistilBERT或最近发布的Distil-Whisper),或者在本例中,需要更少的运行步骤。这通常是一个漫长且昂贵的过程,需要大量数据、耐心和几块GPU。

嗯,那是今天之前的情况!

我们很高兴地宣布一种新方法,它基本上可以让Stable Diffusion和SDXL变得更快,就好像它们已经通过LCM过程蒸馏过一样!在3090上以大约1秒而不是7秒运行任何SDXL模型,或者在Mac上快10倍,听起来怎么样?继续阅读了解详情!

目录

方法概述

那么,诀窍是什么? 对于潜在一致性蒸馏,每个模型都需要单独蒸馏。LCM LoRA的核心思想是只训练少量适配器,即LoRA层,而不是整个模型。然后,生成的LoRA可以应用于模型的任何微调版本,而无需单独蒸馏它们。如果你迫不及待想看看实际效果,请直接跳到下一节来体验推理代码。如果你想训练自己的LoRA,可以使用以下流程:

  1. 从Hub中选择一个可用的教师模型。例如,你可以使用SDXL(基础版),或任何你喜欢的微调或dreambooth版本。
  2. 在模型上训练LCM LoRA。LoRA是一种性能高效的微调方法,即PEFT,比完整模型微调便宜得多。有关PEFT的更多详细信息,请查看这篇博客文章或diffusers LoRA文档。
  3. 将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,这是潜在一致性模型中使用的调度器。
  • 就是这样!

这将生成以下全分辨率图像:

SDXL in 4 steps with LCM LoRA
使用 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 张图像:

LCM LoRA generations with 1 to 8 steps
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 results for various inference steps
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 technique with a Dreambooth Stable Diffusion v1.5 model, allowing 4-step inference.
将 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 和模型

额外内容:将 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

Combining LoRAs for fast inference
标准 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