# SDXL Turbo

Stable Diffusion XL (SDXL) Turbo 由 Axel Sauer、Dominik Lorenz、Andreas Blattmann 和 Robin Rombach 在 [Adversarial Diffusion Distillation](https://stability.ai/research/adversarial-diffusion-distillation) 中提出。

该论文的摘要如下：

*我们提出了对抗扩散蒸馏（ADD），这是一种新颖的训练方法，能够在仅 1–4 步内高效地对大规模基础图像扩散模型进行采样，同时保持高图像质量。我们利用分数蒸馏，将大规模现成的图像扩散模型作为教师信号，并结合对抗损失，以确保在仅一两步采样的低步数区间内仍能实现高图像保真度。我们的分析表明，与现有的少步方法（GAN、潜在一致性模型）相比，我们的模型在单步情况下表现明显更优，并且仅需四步即可达到最先进扩散模型（SDXL）的性能。ADD 是首个能够利用基础模型实现单步、实时图像合成的方法。*

## 提示

- SDXL Turbo 与 [SDXL](./stable_diffusion_xl) 采用完全相同的架构，因此也拥有相同的 API。有关更多详细信息，请参阅 [SDXL](./stable_diffusion_xl) API 参考。
- SDXL Turbo 应通过设置 `guidance_scale=0.0` 来禁用 guidance scale。
- SDXL Turbo 的调度器应使用 `timestep_spacing='trailing'`，并使用 1 到 4 步。
- SDXL Turbo 经过训练，可生成尺寸为 512x512 的图像。
- SDXL Turbo 是开放获取的，但并非开源，这意味着将其用于商业应用可能需要购买模型许可证。请务必阅读[官方模型卡片](https://huggingface.co/stabilityai/sdxl-turbo)以了解更多信息。

> [!TIP]
> 请前往 [Stability AI](https://huggingface.co/stabilityai) Hub 组织，查看官方的基础模型和精修模型检查点！

请确保已安装以下库。

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

## 加载模型检查点

模型权重可能存储在 Hub 或本地的不同子文件夹中，在这种情况下，您应使用 [from_pretrained()](/docs/diffusers/v0.43.0/zh/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) 方法：

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
```

您还可以使用 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 方法从 Hub 或本地加载以单文件格式（`.ckpt` 或 `.safetensors`）存储的模型检查点。对于此加载方法，您需要设置 `timestep_spacing="trailing"`（您可以尝试其他调度器配置值以获得更好的结果）：

```py
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",
    dtype=torch.float16, variant="fp16")
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
pipeline.scheduler = EulerAncestralDiscreteScheduler.from_config(pipeline.scheduler.config, timestep_spacing="trailing")
```

## 文本到图像

对于文生图任务，请传入文本提示词。默认情况下，SDXL Turbo 会生成 512x512 的图像，该分辨率能带来最佳效果。您可以尝试将 `height` 和 `width` 参数设置为 768x768 或 1024x1024，但这样做时图像质量可能会有所下降。

请确保将 `guidance_scale` 设置为 0.0 以禁用该功能，因为该模型是在未使用此功能的情况下训练的。单步推理即可生成高质量图像。将步数增加到 2、3 或 4 应能进一步提升图像质量。

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline_text2image = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", dtype=torch.float16, variant="fp16")
pipeline_text2image = pipeline_text2image.to("cuda")  # or "mps", "xpu", "cpu"

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
```

    

## 图像到图像

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

```py
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")  # or "mps", "xpu", "cpu"

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)
```

    

## 进一步加速 SDXL Turbo

- 如果使用 PyTorch 2.0 或更高版本，请编译 UNet。首次推理运行会非常慢，但后续运行会快得多。

```py
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
```

- 使用默认 VAE 时，请将其保持在 `float32` 中，以避免在每次生成前后进行代价高昂的 `dtype` 转换。您只需在首次生成之前执行一次此操作：

```py
pipe.upcast_vae()
```

作为替代方案，您也可以使用社区成员 [`@madebyollin`](https://huggingface.co/madebyollin) 创建的 [16 位 VAE](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix)，它无需上转为 `float32`。

