可以使用callback_on_step_end参数,使用自定义定义的函数来修改管道的去噪循环。回调函数在每个步骤结束时执行,并修改下一步的管道属性和变量。这对于动态调整某些管道属性或修改张量变量非常有用。这种多功能性允许有趣的用例,例如在每个时间步长更改提示嵌入,为提示嵌入分配不同的权重,以及编辑引导量表。通过回调,您可以在不修改底层代码的情况下实现新功能!
import torch from diffusers import DPMSolverMultistepScheduler, StableDiffusionXLPipeline from diffusers.callbacks import SDXLCFGCutoffCallback
# 设置SDXL Callback
# 对于所有SDXL管道,包括文生图、图生图、Inpaint和ControlNet,在经过一定数量的步骤后禁用CFG。
callback = SDXLCFGCutoffCallback(cutoff_step_ratio=0.4)
# can also be used with cutoff_step_index
# callback = SDXLCFGCutoffCallback(cutoff_step_ratio=None, cutoff_step_index=10)
pipeline = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config, use_karras_sigmas=True)
prompt = "a sports car at the road, best quality, high quality, high detail, 8k resolution"
generator = torch.Generator(device="cpu").manual_seed(2628670641)
out = pipeline(
prompt=prompt,
negative_prompt="",
guidance_scale=6.5,
num_inference_steps=25,
generator=generator,
callback_on_step_end=callback,
)
out.images[0].save("official_callback.png")
以下为生成的图片呢