LCM 模型 通过将原始模型蒸馏为另一个需求更少步数 (4 到 8 步,而不是原来的 25 到 50 步) 的版别以减少用 Stable Diffusion (或 SDXL) 生成图画所需的步数。蒸馏是一种练习进程,其主要思维是尝试用一个新模型来仿制源模型的输出。蒸馏后的模型要么尺度更小 (如 DistilBERT 或最近发布的 Distil-Whisper),要么需求运转的步数更少 (本文便是这种状况)。一般来讲,蒸馏是一个漫长且成本昂扬的进程,需求大量数据、耐性以及一些 GPU 运算。

但以上所述皆为过往,今日咱们翻新篇了!

今日,咱们很快乐地揭露一种新办法,其能够从本质上加快 Stable Diffusion 和 SDXL,效果跟用 LCM 蒸馏过一样!有了它,咱们在 3090 上运转 任何 SDXL 模型,不需求 70 秒,也不需求 7 秒,仅需求约 1 秒就行了!在 Mac 上,咱们也有 10 倍的加快!听起来是不是很起劲?那继续往下读吧!

目录

办法概述

究竟用了啥技巧?

在运用原始 LCM 蒸馏时,每个模型都需求独自蒸馏。而 LCM LoRA 的核心思维是只对少数适配器 (即 LoRA 层) 进行练习,而不必对完好模型进行练习。推理时,可将生成的 LoRA 用于同一模型的任何微调版别,而无需对每个版别都进行蒸馏。假如你现已刻不容缓地想试试这种办法的实际效果了,能够直接跳到 下一节 试一下推理代码。假如你想练习自己的 LoRA,流程如下:

  1. 从 Hub 中挑选一个教师模型。如: 你能够运用 SDXL (base),或其任何微调版或 dreambooth 微调版,随你喜爱。
  2. 在该模型上 练习 LCM LoRA 模型。LoRA 是一种参数高效的微调 (PEFT),其完成成本比全模型微调要廉价得多。有关 PEFT 的更详细信息,请参阅 此博文diffusers 库的 LoRA 文档
  3. 将 LoRA 与任何 SDXL 模型和 LCM 调度器一起组成一个流水线,进行推理。就这样!用这个流水线,你只需几步推理即可生成高质量的图画。

欲知更多概况,请 下载咱们的论文

快有啥用?

Stable Diffusion 和 SDXL 的快速推理为新运用和新作业流打开了大门,仅举几例:

  • 更易得: 变快后,生成东西能够被更多人运用,即便他们没有最新的硬件。
  • 迭代更快: 无论从个人仍是商业角度来看,在短时间内生成更多图画或进行更多尝试关于艺术家和研究人员来说都十分有用。
  • 能够在各种不同的加快器上进行出产化部署,包含 CPU。
  • 图画生成服务会更廉价。

为了衡量咱们所说的速度差异,在 M1 Mac 上用 SDXL (base) 生成一张 1024×1024 图画大约需求一分钟。而用 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 base 模型去实例化一个规范的 diffusion 流水线。
  • 运用 LCM LoRA。
  • 将调度器改为 LCMScheduler,这是 LCM 模型运用的调度器。
  • 完毕!

生成的全分辨率图画如下所示:

运用 LCM LoRA 4 步完结 SDXL 推理

LCM LORA 微调后的 SDXL 模型用 4 步生成的图画

生成质量

咱们看下步数对生成质量的影响。以下代码将分别用 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 4 步完结 SDXL 推理

LCM LoRA 1 至 8 步生成的图画

不出所料,仅运用 1 步即可生成细节和纹路欠缺的大略图画。然而,跟着步数的添加,效果改善迅速,一般只需 4 到 6 步就能够到达满意的效果。个人经历是,8 步生成的图画关于我来说有点过饱和及“卡通化”,所以本例中我个人倾向于挑选 5 步和 6 步生成的图画。生成速度十分快,你只需 4 步即可生成一堆图画,并从中挑选你喜爱的,然后根据需求对步数和提示词进行调整和迭代。

引导份额及反向提示

请注意,在前面的示例中,咱们将引导份额 guidance_scale 设为 1 ,实际上便是禁用它。对大多数提示而言,这样设置就能够了,此时速度最快,但会忽略反向提示。你还能够将其值设为 12 之间,用于探究反向提示的影响——但咱们发现再大就不起作用了。

与规范 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)

运用 LCM LoRA 4 步完结 SDXL 推理

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 4 步完结 SDXL 推理

根据 Dreambooth Stable Diffusion v1.5 模型运用 LCM LoRA,4 步推理

Diffusers 全集成

LCM 在 diffusers 中的全面集成使得其能够使用 diffusers 东西箱中的许多特性和作业流,如:

  • 对采用 Apple 芯片的 Mac 供给开箱即用的 mps 支持。
  • 内存和功能优化,例如 flash 注意力或 torch.compile()
  • 针对低 RAM 场景的其他内存节省策略,包含模型卸载。
  • ControlNet 或图生图等作业流。
  • 练习和微调脚本。

测验基准

本节列出了 SDXL LCM LoRA 在各种硬件上的生成速度,给咱们一个印象。不由得再提一句,能如此轻松地探究图画生成真是太爽了!

硬件 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 Free Tier) 8.4s 26.5s
A100 (80 GB) 1.2s 3.8s
Intel i9-10980XE CPU (共 36 核,仅用 1 核) 29s 219s

上述一切测验的 batch size 均为 1,运用是 Sayak Paul 开发的 这个脚本

关于显存容量比较大的卡 (例如 A100),一次生成多张图画,功能会有明显提高,一般来讲出产部署时会采取添加 batch size 的办法来添加吞吐。

已揭露发布的 LCM LoRA 及 LCM 模型

加分项: 将 LCM LoRA 与惯例 SDXL LoRA 结合起来

运用 diffusers + PEFT 集成,你能够将 LCM LoRA 与惯例 SDXL LoRA 结合起来,使其也拥有 4 步推理的超能力。

这儿,咱们将 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

运用 LCM LoRA 4 步完结 SDXL 推理

规范 LoRA 和 LCM LoRA 相结合完成 4 步快速推理

想要探究更多有关 LoRA 的新主意吗?能够试试咱们的实验性 LoRA the Explorer (LCM 版别) 空间,在这儿你能够把玩社区的惊人创作并从中获取灵感!

怎么练习 LCM 模型及 LCM LoRA

最新的 diffusers 中,咱们供给了与 LCM 团队作者协作开发的练习和微调脚本。有了它们,用户能够:

  • 在 Laion 等大型数据集上履行 Stable Diffusion 或 SDXL 模型的全模型蒸馏。
  • 练习 LCM LoRA,它比全模型蒸馏更简略。正如咱们在这篇文章中所示,练习后,能够用它对 Stable Diffusion 完成快速推理,而无需进行蒸馏练习。

更多详细信息,请查阅代码库中的 SDXLStable Diffusion 阐明文档。

咱们希望这些脚本能够鼓励社区探究完成自己的微调。假如你将它们用于自己的项目,请告诉咱们!

资源

称谢

LCM 团队 完结了 LCM 模型的超卓作业,请务必查阅他们的代码、陈述和论文。该项目是 diffusers 团队、LCM 团队以及社区贡献者 Daniel Gu 协作的成果。咱们信任,这证明了开源人工智能的强壮力量,它是研究人员、从业者和探客 (tinkerer) 们探究新主意和协作的柱石。咱们还要感谢 @madebyollin 对社区的持续贡献,其中包含咱们在练习脚本中运用的 float16 自编码器。


英文原文: hf.co/blog/lcm_lo…

原文作者: Pedro Cuenca,Suraj Patil,Simian Luo,Daniel Gu,Yiqin Tan,Sayak Paul,Apolinrio

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,作业方向为 transformer-family 模型在各模态数据上的运用及大规模模型的练习推理。

审校/排版: zhongdongy (阿东)