背景
《使用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() # 添加这一行