使用Diffusers调用civitai中的checkpoint及LoRA 补遗

2023-09-08 17:08:55 浏览数 (1)

背景

《使用Diffusers调用civitai中的checkpoint及lora》一文主要描述了使用diffusers离线脚本的方式加载C站的checkpoint和LoRA。那如何进一步使用diffusers库提升生成图像的质量呢?本文提供了一些小技巧。

解除77个tokens限制

在当前版本的diffusers库中,可用于生成图像的提示令牌限制为 77 个。这个问题有几个解决方案。通过使用社区提供的"lpw_stable_diffusion",我们可以解锁77个tokens限制,并通过更长的prompt生成高质量图像。

代码语言:python代码运行次数:0复制
pipeline = DiffusionPipeline.from_pretrained(
    model_path,
    custom_pipeline="lpw_stable_diffusion",  # 增加这一行代码
    ... ...
)

在以上代码中,我们使用from_pretrained方法初始化一个新的 DiffusionPipeline 对象。我们指定预训练模型的路径并将custom_pipeline参数设置为lpw_stable_diffusion。此参数要求diffusers使用lpw_stable_diffusion的pipeline,这将解除77个tokens限制。

在执行如上代码的过程中,如果仍然看到警告消息,例如: Token indices sequence length is longer than the specified maximum sequence length for this model ( *** > 77 ) . Running this sequence through the model will result in indexing errors. 可以忽略它。

动态加载Lora

如果需要动态加载C站的Lora,直接在代码中执行pipeline.load_lora_weights(lora_path)是不行的。对于v0.19.2及以上版本,需要用如下方式:

代码语言:txt复制
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5"
)
lora_path = "./lora_dir"
pipeline.load_lora_weights(pretrained_model_name, use_safetensors=True, weight_name="lora_name.safetensors")

注意,这张方式,最大的问题是不能像sd-webui那样设置lora的权重。

优化diffusers效率

1. 使用半精度权重

代码语言:python代码运行次数:0复制
from diffusers import DiffusionPipeline
import torch # 添加这一行
pipeline = DiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype = torch.float16 # 添加这一行
)
pipeline.to("cuda")

使用这种方式,速度能快大概5倍。

2. 使用xformer

代码语言:shell复制
pip install xformers
代码语言:python代码运行次数:0复制
pipeline.to("cuda")
pipeline.enable_xformers_memory_efficient_attention() # 添加这一行

使用这种方式,性能将再提高 20%。

优化diffusers CUDA 内存使用

使用diffusers加载多个模型处理生成的图像时,需要特别关注CUDA内存使用情况。一不小心,我们可能会遇到由于 RuntimeError: CUDA out of memory,这是因为,原来的diffusers模型仍然占用 CUDA 内存。为了缓解此问题,可以:

1. attention_slicing

代码语言:python代码运行次数:0复制
pipeline.enable_attention_slicing() # 添加这一行

2. model_cpu_offload

代码语言:python代码运行次数:0复制
pipeline.enable_model_cpu_offload() # 添加这一行

0 人点赞