Diffusers documentation

SDXL Turbo

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

SDXL Turbo

Stable Diffusion XL (SDXL) Turbo diusulkan dalam Adversarial Diffusion Distillation oleh Axel Sauer, Dominik Lorenz, Andreas Blattmann, dan Robin Rombach.

Abstrak dari makalah tersebut adalah:

Kami memperkenalkan Adversarial Diffusion Distillation (ADD), sebuah pendekatan pelatihan baru yang secara efisien melakukan sampling pada model difusi gambar foundational berskala besar hanya dalam 1–4 langkah sambil mempertahankan kualitas gambar yang tinggi. Kami menggunakan score distillation untuk memanfaatkan model difusi gambar off-the-shelf berskala besar sebagai sinyal guru, dikombinasikan dengan adversarial loss untuk memastikan fidelitas gambar yang tinggi bahkan dalam rezim langkah rendah, yaitu satu atau dua langkah sampling. Analisis kami menunjukkan bahwa model kami secara jelas melampaui metode few-step yang ada (GAN, Latent Consistency Models) dalam satu langkah dan mencapai kinerja model difusi state-of-the-art (SDXL) hanya dalam empat langkah. ADD adalah metode pertama yang membuka jalan bagi sintesis gambar real-time dalam satu langkah dengan model foundational.

Tips

  • SDXL Turbo menggunakan arsitektur yang persis sama dengan SDXL, yang berarti ia juga memiliki API yang sama. Silakan merujuk pada referensi API SDXL untuk detail lebih lanjut.
  • SDXL Turbo harus menonaktifkan skala panduan dengan mengatur guidance_scale=0.0.
  • SDXL Turbo harus menggunakan timestep_spacing='trailing' untuk scheduler dan menggunakan antara 1 hingga 4 langkah.
  • SDXL Turbo telah dilatih untuk menghasilkan gambar berukuran 512x512.
  • SDXL Turbo bersifat open-access, tetapi bukan open-source, yang berarti Anda mungkin perlu membeli lisensi model untuk menggunakannya dalam aplikasi komersial. Pastikan untuk membaca model card resmi untuk mempelajari lebih lanjut.

Lihat organisasi Stability AI di Hub untuk checkpoint model base dan refiner resmi!

Pastikan Anda telah menginstal pustaka berikut.

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

Muat checkpoint model

Bobot model mungkin disimpan di subfolder terpisah di Hub atau secara lokal, dalam hal ini, Anda harus menggunakan metode from_pretrained():

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"

Anda juga dapat menggunakan metode from_single_file() untuk memuat checkpoint model yang disimpan dalam format file tunggal (.ckpt atau .safetensors) dari Hub atau secara lokal. Untuk metode pemuatan ini, Anda perlu mengatur timestep_spacing="trailing" (silakan bereksperimen dengan nilai konfigurasi scheduler lainnya untuk mendapatkan hasil yang lebih baik):

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

Teks-ke-gambar

Untuk text-to-image, berikan prompt teks. Secara default, SDXL Turbo menghasilkan gambar 512x512, dan resolusi tersebut memberikan hasil terbaik. Anda dapat mencoba mengatur parameter height dan width menjadi 768x768 atau 1024x1024, tetapi Anda harus mengharapkan penurunan kualitas saat melakukannya.

Pastikan untuk mengatur guidance_scale ke 0.0 untuk menonaktifkannya, karena model dilatih tanpa fitur tersebut. Satu langkah inferensi sudah cukup untuk menghasilkan gambar berkualitas tinggi. Meningkatkan jumlah langkah menjadi 2, 3, atau 4 seharusnya dapat meningkatkan kualitas gambar.

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
generated image of a racoon in a robe

Gambar-ke-gambar

Untuk generasi gambar-ke-gambar, pastikan bahwa num_inference_steps * strength lebih besar atau sama dengan 1. Pipeline gambar-ke-gambar akan berjalan selama int(num_inference_steps * strength) langkah, misalnya 0.5 * 2.0 = 1 langkah dalam contoh di bawah ini.

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)
Image-to-image generation sample using SDXL Turbo

Percepat SDXL Turbo lebih lanjut

  • Compile UNet jika Anda menggunakan PyTorch versi 2.0 atau lebih tinggi. Eksekusi inferensi pertama akan sangat lambat, tetapi eksekusi berikutnya akan jauh lebih cepat.
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
  • Saat menggunakan VAE default, pertahankan dalam float32 untuk menghindari konversi dtype yang mahal sebelum dan sesudah setiap generasi. Anda hanya perlu melakukan ini satu kali sebelum generasi pertama Anda:
pipe.upcast_vae()

Sebagai alternatif, Anda juga dapat menggunakan VAE 16-bit yang dibuat oleh anggota komunitas @madebyollin yang tidak perlu di-upcast ke float32.

Update on GitHub