Diffusers documentation
Penjadwal
Penjadwal
Penjadwal memberi tahu loop denoising berapa banyak noise yang harus dihapus pada setiap langkah. Penjadwal yang berbeda menukar kecepatan dengan kualitas.
Panduan ini menunjukkan cara memuat scheduler dan menyesuaikan jadwal timestep, jarak, dan sigmanya.
Memilih scheduler
Mulai dari checkpoint default. Ganti hanya jika Anda memerlukan tradeoff kecepatan atau kualitas yang berbeda.
- DPM++ 2M SDE Karras adalah pilihan serbaguna yang kuat untuk banyak checkpoint difusi laten.
- TCDScheduler bekerja dengan baik untuk model yang telah didistilasi.
- Gunakan FlowMatchEulerDiscreteScheduler atau FlowMatchHeunDiscreteScheduler untuk model FlowMatch (Qwen-Image, Flux, dan sejenisnya).
- EulerDiscreteScheduler atau EulerAncestralDiscreteScheduler sering kali bekerja dengan baik untuk gambar bergaya anime.
- LCMScheduler dengan LCM UNet atau LoRA untuk generasi beberapa langkah saat checkpoint mendukungnya.
Memuat penjadwal
Model flow-matching seperti Qwen-Image dan Flux menyertakan FlowMatchEulerDiscreteScheduler sebagai default. Pertahankan scheduler tersebut kecuali Anda sengaja melakukan eksperimen. Ganti dengan from_config() hanya jika penggantian tersebut kompatibel dengan checkpoint.
Schedulers hanya berupa konfigurasi dan tidak menyertakan tensor bobot. Akses atribut .scheduler pada pipeline untuk memeriksa konfigurasi yang dimuat.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.schedulerUntuk mengganti scheduler pada pipeline yang sudah dimuat, gunakan from_config() dengan konfigurasi scheduler yang ada agar num_train_timesteps dan field terkait tetap selaras. Untuk checkpoint FlowMatch (Qwen-Image, Flux, dan sejenisnya), pertahankan FlowMatchEulerDiscreteScheduler kecuali Anda sengaja bereksperimen dengan pengganti yang kompatibel.
from diffusers import DPMSolverMultistepScheduler
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)Anda juga dapat memuat konfigurasi scheduler dari Hub dengan from_pretrained() dan meneruskannya ke from_pretrained() melalui scheduler.
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
dpm = DPMSolverMultistepScheduler.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler"
)
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
scheduler=dpm,
dtype=torch.float16,
device_map="cuda", # or "mps", "xpu", "cpu"
)
pipeline.schedulerJadwal timestep
Timestep atau jadwal noise menentukan bagaimana noise didistribusikan selama proses denoising. Jadwal ini dapat berupa linear atau lebih terkonsentrasi di bagian awal atau akhir. Ini adalah urutan tingkat noise yang dihitung sebelumnya, dihasilkan dari konfigurasi default scheduler, tetapi dapat dikustomisasi untuk menggunakan jadwal lain.
linear (even steps) AYS (denser where it matters) noise noise ^ ^ | * | * | * | * | * | ** | * | *** | * | ** | * | * | * | * +-----------------> step +-----------------> step
timestepskustom hanya berfungsi jikaset_timestepsdari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melaluiretrieve_timestepsdan akan melemparValueErrorjika tidak). Periksa halaman API scheduler atau signatureset_timestepssebelum meneruskannya.
Contoh di bawah ini menggunakan jadwal Align Your Steps (AYS) yang dapat menghasilkan gambar berkualitas tinggi dalam 10 langkah, sehingga secara signifikan mempercepat proses generasi dan mengurangi waktu komputasi.
Impor jadwal dan teruskan ke argumen timesteps di pipeline.
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.schedulers import AysSchedules
sampling_schedule = AysSchedules["StableDiffusionXLTimesteps"]
print(sampling_schedule)
# [999, 845, 730, 587, 443, 310, 193, 116, 53, 13]
pipeline = DiffusionPipeline.from_pretrained(
"SG161222/RealVisXL_V4.0",
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
pipeline.scheduler.config, algorithm_type="sde-dpmsolver++"
)
prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
prompt=prompt,
negative_prompt="",
timesteps=sampling_schedule,
).images[0]
Untuk v-prediction/zero-SNR rescaling pada checkpoint lama, lihat Legacy checkpoints.
Jarak antar-timestep
Jarak timestep merujuk pada langkah-langkah spesifik t untuk diambil dari jadwal. Diffusers menyediakan tiga jenis jarak seperti yang ditunjukkan di bawah ini.
| strategi spasi | perhitungan spasi | langkah waktu contoh |
|---|---|---|
leading | langkah-langkah yang berjarak sama | [900, 800, 700, ..., 100, 0] |
linspace | termasuk langkah pertama dan terakhir serta membagi rata langkah-langkah perantara yang tersisa | [1000, 888.89, 777.78, ..., 111.11, 0] |
trailing | termasuk langkah terakhir dan membagi rata langkah-langkah perantara yang tersisa mulai dari akhir | [999, 899, 799, 699, 599, 499, 399, 299, 199, 99] |
Lewatkan strategi spasi ke argumen timestep_spacing di scheduler.
Strategi
trailingumumnya menghasilkan gambar dengan kualitas lebih tinggi dan detail lebih banyak dalam jumlah langkah yang lebih sedikit, namun perbedaan kualitasnya tidak terlalu jelas untuk nilai langkah yang lebih standar.
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
pipeline = DiffusionPipeline.from_pretrained(
"SG161222/RealVisXL_V4.0",
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
pipeline.scheduler.config, timestep_spacing="trailing"
)
prompt = "A cinematic shot of a cute little black cat sitting on a pumpkin at night"
image = pipeline(
prompt=prompt,
negative_prompt="",
num_inference_steps=5,
).images[0]
image
Sigmas
Sigmas adalah ukuran seberapa bising suatu sampel pada langkah tertentu sebagaimana didefinisikan oleh jadwal. Saat menggunakan sigmas kustom, timesteps dihitung dari nilai-nilai ini alih-alih dari konfigurasi scheduler default.
step: 0 1 2 3 4
sigma: σ0 > σ1 > σ2 > σ3 > σ4 ≈ 0
high noise ---> clean sample
sigmaskustom hanya berfungsi jikaset_timestepsdari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melaluiretrieve_timestepsdan akan melemparValueErrorjika tidak). Periksa halaman API scheduler atau signatureset_timestepssebelum meneruskannya.
Lewatkan sigmas kustom ke argumen sigmas di pipeline. Contoh di bawah menggunakan sigmas dari jadwal AYS 10-langkah.
import torch
from diffusers import DiffusionPipeline, EulerDiscreteScheduler
from diffusers.schedulers import AysSchedules
pipeline = DiffusionPipeline.from_pretrained(
"SG161222/RealVisXL_V4.0",
dtype=torch.float16,
device_map="cuda", # or "mps", "xpu", "cpu"
)
pipeline.scheduler = EulerDiscreteScheduler.from_config(pipeline.scheduler.config)
sigmas = AysSchedules["StableDiffusionXLSigmas"]
prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
prompt=prompt,
negative_prompt="",
sigmas=sigmas,
).images[0]Karras sigmas
Karras sigmas melakukan resampling jadwal noise untuk sampling yang lebih efisien dengan mengelompokkan sigma lebih rapat di tengah urutan tempat rekonstruksi struktur sangat krusial, sementara menggunakan lebih sedikit sigma di awal dan akhir tempat perubahan noise memiliki dampak yang lebih kecil. Hal ini dapat meningkatkan tingkat detail pada gambar yang dihasilkan.
default σ: * * * * * * * * even-ish
Karras σ: * * * * * * * denser mid, sparser ends
|---structure---|Setel use_karras_sigmas=True pada scheduler untuk mengaktifkannya.
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
pipeline = DiffusionPipeline.from_pretrained(
"SG161222/RealVisXL_V4.0",
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
pipeline.scheduler.config,
algorithm_type="sde-dpmsolver++",
use_karras_sigmas=True,
)
prompt = "A cinematic shot of a cute little rabbit wearing a jacket and doing a thumbs up"
image = pipeline(
prompt=prompt,
negative_prompt="",
num_inference_steps=20,
).images[0]
Lihat ringkasan API scheduler untuk daftar scheduler yang mendukung Karras sigmas. Ini hanya harus digunakan untuk model yang dilatih dengan Karras sigmas.
Langkah selanjutnya
- Baca paper Common Diffusion Noise Schedules and Sample Steps are Flawed untuk detail lebih lanjut tentang rescaling noise schedule untuk menegakkan zero SNR.