Diffusers documentation
SDXL Turbo
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 accelerateMuat 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
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)
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
float32untuk menghindari konversidtypeyang 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.