如何让出图速度倍增!使用 LCM LoRA 4 步完成 SDXL 推理

文生图、图生图已经不是什么新鲜事。但在使用这些工具的过程中,我们发现它们通常运行缓慢,导致我们要等一段时间才能拿到生成结果。

但最近,一种名叫「LCM」的模型改变了这种情况,它甚至能做到实时的连续生图。

LCM 的全称是 Latent Consistency Models(潜在一致性模型),由清华大学交叉信息研究院的研究者们构建。在这个模型发布之前,Stable Diffusion 等潜在扩散模型(LDM)由于迭代采样过程计算量大,生成速度非常缓慢。通过一些创新性的方法,LCM 只用少数的几步推理就能生成高分辨率图像。据统计,LCM 能将主流文生图模型的效率提高 5-10 倍,所以能呈现出实时的效果。

方法概述

到底用了啥技巧?

在使用原始 LCM 蒸馏时,每个模型都需要单独蒸馏。而 LCM LoRA 的核心思想是只对少量适配器 (即 LoRA 层) 进行训练,而不用对完整模型进行训练。推理时,可将生成的 LoRA 用于同一模型的任何微调版本,而无需对每个版本都进行蒸馏。

潜在一致性模型的快速生成能力为图像生成技术开辟了新的应用领域。这种模型可以快速地根据输入的文本(Prompt)处理和渲染实时捕捉到的画面,从而实现高速图像生成。这意味着用户可以自定义他们想要展示的场景或视觉效果。

在 X 平台上,不少研究者也晒出了他们利用该模型实现的生成效果,包括图生图、视频生成、图像编辑、实时视频渲染等各类应用。

AIGC 时代,包括 Stable Diffusion 和 DALL-E 3 等基于扩散模型的文生图模型受到了广泛关注。扩散模型通过向训练数据添加噪声,然后逆转这一过程来生成高质量图像。然而,扩散模型生成图片需要进行多步采样,这一过程相对较慢,增加了推理成本。缓慢的多步采样问题是部署这类模型时的主要瓶颈。

OpenAI 的宋飏博士在今年提出的一致性模型(Consistency Model,CM)为解决上述问题提供了一个思路。一致性模型被指出在设计上具有单步生成的能力,展现出极大的加速扩散模型的生成的潜力。然而,由于一致性模型局限于无条件图片生成,导致包括文生图、图生图等在内的许多实际应用还难以享受这一模型的潜在优势。

潜在一致性模型(Latent Consistency Model,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 推理》- 投稿作者:AI小分队 - 发布于:GetAI社区

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) 

生成图像如下图所示:《如何让出图速度倍增!使用 LCM LoRA 4 步完成 SDXL 推理》- 投稿作者:AI小分队 - 发布于:GetAI社区不出所料,仅使用 1 步即可生成细节和纹理欠缺的粗略图像。然而,随着步数的增加,效果改善迅速,通常只需 4 到 6 步就可以达到满意的效果。个人经验是,8 步生成的图像对于我来说有点过饱和及“卡通化”,所以本例中我个人倾向于选择 5 步和 6 步生成的图像。生成速度非常快,你只需 4 步即可生成一堆图像,并从中选择你喜欢的,然后根据需要对步数和提示词进行调整和迭代。

其他模型的 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 推理》- 投稿作者:AI小分队 - 发布于:GetAI社区

测试基准

本节列出了 SDXL LCM LoRA 在各种硬件上的生成速度,给大家一个印象。忍不住再提一句,能如此轻松地探索图像生成真是太爽了!

《如何让出图速度倍增!使用 LCM LoRA 4 步完成 SDXL 推理》- 投稿作者:AI小分队 - 发布于:GetAI社区

上述所有测试的 batch size 均为 1,使用是 Sayak Paul 开发的 这个脚本。

对于显存容量比较大的卡 (例如 A100),一次生成多张图像,性能会有显著提高,一般来讲生产部署时会采取增加 batch size 的方法来增加吞吐。

 

0

评论0

请先
显示验证码