什么是LCM?
我们提出了潜在一致性模型(LCM)来克服缓慢的迭代 潜在扩散模型 (LDM) 的采样过程,以最少的步骤实现快速推理 在任何预训练的 LDM(例如 Stable Diffusion)上。
将引导式逆向扩散过程视为求解增强概率流 ODE (PF-ODE) , LCMs直接在潜空间中预测其解,实现超 只需几个步骤即可快速推理。
从 Stable Diffusion 中提炼出来的高质量 768x768 LCM 只需要 32 个 A100 GPU 训练小时(8 节点仅 4 小时)用于 2~4 步推理。
LCM 这个技术可以让 4090在1 秒钟生成 10 张 512X512 大小的图片,太强了,如果可以用在 Animetadiff 中的话可以大幅提高视频生成效率。以往我们用 SD 生成图片起码需要 20 步的推导步骤,但是使用 LCM 只需要 4 步就行,从一些测试结果看 6-8 步可能是一个理想的步骤。你现在可以在 WebUI 和 ComfyUI 中尝试 LCM,但是这两个插件我安装的时候都遇到了不同程度的问题,感兴趣的可以自己安装一下。LCM 有个问题是目前只能用自己的模型,不能兼容现有的 SD 模型,不过如果效率足够高的话我感觉会有更多适配。
整合包下载
代码语言:javascript复制https://drive.uc.cn/s/dd61f22a804e4
如何安装插件
扩展--->安装复制以下地址
代码语言:javascript复制https://github.com/luosiallen/latent-consistency-model.git
升级本地diffusers版本
代码语言:javascript复制pip install --upgrade diffusers # make sure to use at least diffusers >= 0.22
pip install transformers accelerate
通过将无分类器的引导提炼到模型的输入中,LCM 可以在非常短的推理时间内生成高质量的图像。我们比较了使用 A768 GPU 在 768 x 8 分辨率、CFG 规模 w=4、batchsize=800 设置下的推理时间
潜在扩散模型(LDMs)在合成高分辨率图像方面取得了显著的成果。但是,迭代采样过程是计算密集型的,并且会导致生成缓慢。受一致性模型(song 等人)的启发,我们提出了潜在一致性模型 (LCM),可以在任何预训练的 LDM 上以最少的步骤进行快速推理,包括稳定扩散(rombach 等人)。将引导反向扩散过程视为求解增强概率流常微分方程 (PF-ODE),LCM 旨在直接预测此类常微分方程在潜在空间中的解,从而减少对多次迭代的需求,并允许快速、高保真采样。高质量的 768 x 768 2~4 步 LCM 从预先训练的无分类器引导扩散模型中高效提炼出来,训练时间仅为 32 个 A100 GPU 小时。此外,我们还引入了潜在一致性微调 (LCF),这是一种为在自定义图像数据集上微调 LCM 量身定制的新方法。对 LAION-5B-Aesthetics 数据集的评估表明,LCM 通过几步推理实现了最先进的文本到图像生成性能
以下文字引用自huggingface
方法概述
到底用了啥技巧?
在使用原始 LCM 蒸馏时,每个模型都需要单独蒸馏。而 LCM LoRA 的核心思想是只对少量适配器 (即 LoRA 层) 进行训练,而不用对完整模型进行训练。推理时,可将生成的 LoRA 用于同一模型的任何微调版本,而无需对每个版本都进行蒸馏。如果你已经迫不及待地想试试这种方法的实际效果了,可以直接跳到下一节试一下推理代码。如果你想训练自己的 LoRA,流程如下:
从 Hub 中选择一个教师模型。如: 你可以使用 SDXL (base),或其任何微调版或 dreambooth 微调版,随你喜欢。
在该模型上 训练 LCM LoRA 模型。LoRA 是一种参数高效的微调 (PEFT),其实现成本比全模型微调要便宜得多。有关 PEFT 的更详细信息,请参阅 此博文 或 diffusers 库的 LoRA 文档。
将 LoRA 与任何 SDXL 模型和 LCM 调度器一起组成一个流水线,进行推理。就这样!用这个流水线,你只需几步推理即可生成高质量的图像。
快速推理 SDXL LCM LoRA 模型
在最新版的 diffusers 中,大家可以非常容易地用上 LCM LoRA:
代码语言:javascript复制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 微调后的 SDXL 模型用 4 步生成的图像
生成质量
我们看下步数对生成质量的影响。以下代码将分别用 1 步到 8 步生成图像:
代码语言:javascript复制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 1 至 8 步生成的图像
不出所料,仅使用 1 步即可生成细节和纹理欠缺的粗略图像。然而,随着步数的增加,效果改善迅速,通常只需 4 到 6 步就可以达到满意的效果。个人经验是,8 步生成的图像对于我来说有点过饱和及“卡通化”,所以本例中我个人倾向于选择 5 步和 6 步生成的图像。生成速度非常快,你只需 4 步即可生成一堆图像,并从中选择你喜欢的,然后根据需要对步数和提示词进行调整和迭代。
作者:HuggingFace
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!