Diffusers 文档

Stable Diffusion XL Turbo

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Stable Diffusion XL Turbo

SDXL Turbo 是一种对抗性时间蒸馏的 Stable Diffusion XL (SDXL) 模型,能够以最少 1 步运行推理。

本指南将向您展示如何使用 SDXL-Turbo 进行文本到图像和图像到图像的生成。

在开始之前,请确保您已安装以下库

# uncomment to install the necessary libraries in Colab
#!pip install -q diffusers transformers accelerate

加载模型检查点

模型权重可能存储在 Hub 上或本地的单独子文件夹中,在这种情况下,您应该使用 from_pretrained() 方法

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")

您还可以使用 from_single_file() 方法从 Hub 或本地加载以单文件格式(.ckpt.safetensors)存储的模型检查点。 对于此加载方法,您需要设置 timestep_spacing="trailing" (可以随意尝试其他 scheduler 配置值以获得更好的结果)

from diffusers import StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler
import torch

pipeline = StableDiffusionXLPipeline.from_single_file(
    "https://huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors",
    torch_dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")
pipeline.scheduler = EulerAncestralDiscreteScheduler.from_config(pipeline.scheduler.config, timestep_spacing="trailing")

文本到图像

对于文本到图像,传递文本提示。 默认情况下,SDXL Turbo 生成 512x512 图像,并且该分辨率可提供最佳结果。 您可以尝试将 heightwidth 参数设置为 768x768 或 1024x1024,但这样做时应该会降低质量。

确保将 guidance_scale 设置为 0.0 以禁用,因为该模型在没有它的情况下进行训练。 单个推理步骤足以生成高质量图像。 将步骤数增加到 2、3 或 4 应该可以提高图像质量。

from diffusers import AutoPipelineForText2Image
import torch

pipeline_text2image = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipeline_text2image = pipeline_text2image.to("cuda")

prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."

image = pipeline_text2image(prompt=prompt, guidance_scale=0.0, num_inference_steps=1).images[0]
image
generated image of a racoon in a robe

图像到图像

对于图像到图像的生成,请确保 num_inference_steps * strength 大于或等于 1。 图像到图像的 pipeline 将运行 int(num_inference_steps * strength) 步,例如,在我们下面的示例中为 0.5 * 2.0 = 1 步。

from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image, make_image_grid

# use from_pipe to avoid consuming additional memory when loading a checkpoint
pipeline_image2image = AutoPipelineForImage2Image.from_pipe(pipeline_text2image).to("cuda")

init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
init_image = init_image.resize((512, 512))

prompt = "cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney, 8k"

image = pipeline_image2image(prompt, image=init_image, strength=0.5, guidance_scale=0.0, num_inference_steps=2).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
Image-to-image generation sample using SDXL Turbo

进一步加速 SDXL Turbo

  • 如果您使用的是 PyTorch 2.0 或更高版本,请编译 UNet。 第一次推理运行会非常慢,但随后的运行会快得多。
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
  • 使用默认 VAE 时,将其保留在 float32 中,以避免在每次生成前后进行昂贵的 dtype 转换。 您只需要在第一次生成之前执行此操作
pipe.upcast_vae()

作为替代方案,您还可以使用社区成员 @madebyollin 创建的 16 位 VAE,该 VAE 不需要升级到 float32

< > 更新 在 GitHub 上