Diffusers documentation

Penjadwal

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

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.

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.scheduler

Untuk 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.scheduler

Jadwal 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

timesteps kustom hanya berfungsi jika set_timesteps dari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melalui retrieve_timesteps dan akan melempar ValueError jika tidak). Periksa halaman API scheduler atau signature set_timesteps sebelum 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]
Jadwal timestep AYS 10 langkah
Jadwal timestep yang berjarak linear 10 langkah
Jadwal timestep yang berjarak linear 25 langkah

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 spasiperhitungan spasilangkah waktu contoh
leadinglangkah-langkah yang berjarak sama[900, 800, 700, ..., 100, 0]
linspacetermasuk langkah pertama dan terakhir serta membagi rata langkah-langkah perantara yang tersisa[1000, 888.89, 777.78, ..., 111.11, 0]
trailingtermasuk 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 trailing umumnya 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
spasi di belakang setelah 5 langkah
jarak antar baris setelah 5 langkah

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

sigmas kustom hanya berfungsi jika set_timesteps dari scheduler tersebut menerima argumen tersebut (pipeline memeriksa signature melalui retrieve_timesteps dan akan melempar ValueError jika tidak). Periksa halaman API scheduler atau signature set_timesteps sebelum 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]
Karras sigmas diaktifkan
Karras sigmas dinonaktifkan

Lihat ringkasan API scheduler untuk daftar scheduler yang mendukung Karras sigmas. Ini hanya harus digunakan untuk model yang dilatih dengan Karras sigmas.

Langkah selanjutnya

Update on GitHub