Buckets:

mishig's picture
|
download
raw
13.5 kB

DDIMScheduler

Denoising Diffusion Implicit Models (DDIM) oleh Jiaming Song, Chenlin Meng, dan Stefano Ermon.

Abstrak dari makalah tersebut adalah:

Model probabilistik difusi denoising (DDPM) telah mencapai kualitas generasi gambar yang tinggi tanpa pelatihan adversarial, namun mereka mensimulasikan rantai Markov selama banyak langkah untuk menghasilkan sampel. Untuk mempercepat pengambilan sampel, kami memperkenalkan model implisit difusi denoising (DDIM), kelas model probabilistik iteratif implisit yang lebih efisien dengan prosedur pelatihan yang sama seperti DDPM. Pada DDPM, proses generatif didefinisikan sebagai kebalikan dari proses difusi Markovian. Kami membangun kelas proses difusi non-Markovian yang mengarah ke tujuan pelatihan yang sama, tetapi proses kebalikannya dapat disampelkan jauh lebih cepat. Kami mendemonstrasikan secara empiris bahwa DDIM dapat menghasilkan sampel berkualitas tinggi 10× hingga 50× lebih cepat dalam hal waktu nyata dibandingkan DDPM, memungkinkan kami untuk menukar komputasi dengan kualitas sampel, dan dapat melakukan interpolasi gambar yang bermakna secara semantik langsung di ruang laten.

Kode sumber asli dari makalah ini dapat ditemukan di ermongroup/ddim, dan Anda dapat menghubungi penulis di tsong.me.

Tips

Paper Common Diffusion Noise Schedules and Sample Steps are Flawed menyatakan bahwa ketidakcocokan antara pengaturan pelatihan dan inferensi menyebabkan hasil generasi inferensi yang tidak optimal untuk Stable Diffusion. Untuk memperbaikinya, para penulis mengusulkan:

🧪 Ini adalah fitur eksperimental!

  1. skalakan ulang jadwal noise untuk menegakkan rasio sinyal-ke-noise (SNR) terminal nol
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, rescale_betas_zero_snr=True)
  1. latih model dengan v_prediction (tambahkan argumen berikut ke skrip train_text_to_image.py atau train_text_to_image_lora.py)
--prediction_type="v_prediction"
  1. ubah sampler agar selalu dimulai dari timestep terakhir
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
  1. skala ulang classifier-free guidance untuk mencegah over-exposure
image = pipe(prompt, guidance_rescale=0.7).images[0]

Sebagai contoh:

from diffusers import DiffusionPipeline, DDIMScheduler
import torch

pipe = DiffusionPipeline.from_pretrained("ptx0/pseudo-journey-v2", dtype=torch.float16)
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config, rescale_betas_zero_snr=True, timestep_spacing="trailing"
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A lion in galaxies, spirals, nebulae, stars, smoke, iridescent, intricate detail, octane render, 8k"
image = pipe(prompt, guidance_rescale=0.7).images[0]
image

DDIMScheduler[[diffusers.DDIMScheduler]]

diffusers.DDIMScheduler[[diffusers.DDIMScheduler]]

diffusers.DDIMScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: str = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, clip_sample: bool = True, set_alpha_to_one: bool = True, steps_offset: int = 0, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, clip_sample_range: float = 1.0, sample_max_value: float = 1.0, timestep_spacing: typing.Literal['leading', 'trailing', 'linspace'] = 'leading', rescale_betas_zero_snr: bool = False)

Sumber

Parameter:

num_train_timesteps (int, defaultnya 1000) : Jumlah langkah difusi untuk melatih model.

beta_start (float, defaultnya 0.0001) : Nilai awal beta untuk inferensi.

beta_end (float, defaultnya 0.02) : Nilai beta akhir.

beta_schedule (Literal["linear", "scaled_linear", "squaredcos_cap_v2"], defaultnya "linear") : Jadwal beta, pemetaan dari rentang beta ke urutan beta untuk melangkahkan model. Harus salah satu dari "linear", "scaled_linear", atau "squaredcos_cap_v2".

trained_betas (np.ndarray, opsional) : Lewatkan beta_start dan beta_end dengan meneruskan array betas secara langsung ke konstruktor.

clip_sample (bool, defaultnya True) : Memotong sampel prediksi untuk stabilitas numerik.

clip_sample_range (float, defaultnya 1.0) : Magnitudo maksimum untuk pemotongan sampel. Hanya valid ketika clip_sample=True.

set_alpha_to_one (bool, defaultnya True) : Setiap langkah difusi menggunakan nilai produk alfa pada langkah tersebut dan pada langkah sebelumnya. Untuk langkah terakhir, tidak ada alfa sebelumnya. Ketika opsi ini True, produk alfa sebelumnya ditetapkan ke 1, selain itu menggunakan nilai alfa pada langkah 0.

steps_offset (int, default 0) : Offset yang ditambahkan ke langkah inferensi, sesuai kebutuhan beberapa keluarga model.

prediction_type (Literal["epsilon", "sample", "v_prediction"], defaultnya "epsilon") : Jenis prediksi dari fungsi scheduler. Harus salah satu dari "epsilon" (memprediksi noise dari proses difusi), "sample" (langsung memprediksi sampel berisik), atau "v_prediction" (lihat bagian 2.4 dari paper Imagen Video).

thresholding (bool, defaultnya False) : Apakah akan menggunakan metode "dynamic thresholding". Metode ini tidak cocok untuk model difusi ruang laten seperti Stable Diffusion.

dynamic_thresholding_ratio (float, defaultnya 0.995) : Rasio untuk metode ambang batas dinamis. Hanya valid ketika thresholding=True.

sample_max_value (float, defaultnya 1.0) : Nilai ambang untuk pengambangan dinamis. Hanya valid ketika thresholding=True.

timestep_spacing (Literal["leading", "trailing", "linspace"], defaultnya "leading") : Cara timestep harus diskalakan. Harus salah satu dari "leading", "trailing", atau "linspace". Lihat Tabel 2 dari Common Diffusion Noise Schedules and Sample Steps are Flawed untuk informasi lebih lanjut.

rescale_betas_zero_snr (bool, defaultnya False) : Apakah akan melakukan penskalaan ulang betas agar memiliki SNR terminal nol. Hal ini memungkinkan model untuk menghasilkan sampel yang sangat terang dan gelap, alih-alih membatasi pada sampel dengan kecerahan sedang. Terkait secara longgar dengan --offset_noise.

DDIMScheduler memperluas prosedur denoising yang diperkenalkan dalam denoising diffusion probabilistic models (DDPM) dengan panduan non-Markovian.

Model ini mewarisi dari SchedulerMixin dan ConfigMixin. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan pustaka ini untuk semua scheduler, seperti pemuatan dan penyimpanan.

add_noise[[diffusers.DDIMScheduler.add_noise]]

add_noise(original_samples: Tensor, noise: Tensor, timesteps: IntTensor)

Sumber

Parameter:

original_samples (torch.Tensor) : Sampel asli yang akan ditambahkan dengan noise.

noise (torch.Tensor) : Kebisingan yang akan ditambahkan ke sampel.

timesteps (torch.IntTensor) : Langkah waktu yang menunjukkan tingkat noise untuk setiap sampel.

Mengembalikan: torch.Tensor

Sampel yang bising.

Tambahkan noise ke sampel asli sesuai dengan magnitudo noise pada setiap timestep (ini adalah proses difusi maju).

get_velocity[[diffusers.DDIMScheduler.get_velocity]]

get_velocity(sample: Tensor, noise: Tensor, timesteps: IntTensor)

Sumber

Parameter:

sample (torch.Tensor) : Sampel input.

noise (torch.Tensor) : Tensor noise.

timesteps (torch.IntTensor) : Langkah waktu untuk komputasi kecepatan.

Mengembalikan: torch.Tensor

Kecepatan yang dihitung.

Hitung prediksi kecepatan dari sampel dan noise sesuai dengan rumus kecepatan.

scale_model_input[[diffusers.DDIMScheduler.scale_model_input]]

scale_model_input(sample: Tensor, timestep: int = None)

Sumber

Parameter:

sample (torch.Tensor) : Sampel input.

timestep (int, opsional) : Langkah waktu (timestep) saat ini dalam rantai difusi.

Mengembalikan: torch.Tensor

Contoh input yang diskalakan.

Memastikan interoperabilitas dengan scheduler yang perlu menskalakan input model denoising berdasarkan timestep saat ini.

set_timesteps[[diffusers.DDIMScheduler.set_timesteps]]

set_timesteps(num_inference_steps: int, device: typing.Union[str, torch.device] = None)

Sumber

Parameter:

num_inference_steps (int) : Jumlah langkah difusi yang digunakan saat menghasilkan sampel dengan model terlatih sebelumnya.

device (str | torch.device, opsional) : Perangkat yang akan digunakan untuk timesteps.

Mengangkat: ValueError

  • ValueError -- Jika num_inference_steps lebih besar dari self.config.num_train_timesteps.

Menetapkan langkah waktu diskrit yang digunakan untuk rantai difusi (untuk dijalankan sebelum inferensi).

langkah[[diffusers.DDIMScheduler.step]]

step(model_output: Tensor, timestep: int, sample: Tensor, eta: float = 0.0, use_clipped_model_output: bool = False, generator: typing.Optional[torch.Generator] = None, variance_noise: typing.Optional[torch.Tensor] = None, return_dict: bool = True)

Sumber

Parameter:

model_output (torch.Tensor) : Output langsung dari model difusi yang telah dipelajari.

timestep (int) : Langkah waktu diskret saat ini dalam rantai difusi.

sample (torch.Tensor) : Instans saat ini dari sampel yang dibuat oleh proses difusi.

eta (float, opsional, default 0.0) : Bobot noise untuk noise yang ditambahkan pada langkah difusi. Nilai 0 sesuai dengan DDIM (deterministik) dan 1 sesuai dengan DDPM (sepenuhnya stokastik).

use_clipped_model_output (bool, opsional, defaultnya False) : Jika True, menghitung model_output yang "dikoreksi" dari sampel asli prediksi yang dipangkas. Hal ini diperlukan karena sampel asli prediksi dipangkas ke [-1, 1] ketika self.config.clip_sample bernilai True. Jika tidak ada pemangkasan yang terjadi, model_output yang "dikoreksi" akan sama dengan yang diberikan sebagai input dan use_clipped_model_output tidak memiliki efek.

generator (torch.Generator, opsional) : Generator angka acak untuk pengambilan sampel yang dapat direproduksi.

variance_noise (torch.Tensor, opsional) : Alternatif untuk menghasilkan noise dengan generator dengan cara menyediakan noise untuk varians secara langsung. Berguna untuk metode seperti CycleDiffusion.

return_dict (bool, opsional, defaultnya True) : Apakah akan mengembalikan DDIMSchedulerOutput atau tuple.

Mengembalikan: DDIMSchedulerOutput atau tuple

If return_dict is True, DDIMSchedulerOutput is returned, otherwise a tuple is returned where the first element is the sample tensor.

Prediksi sampel dari langkah waktu sebelumnya dengan membalik SDE. Fungsi ini menyebarkan proses difusi dari keluaran model yang dipelajari (paling sering berupa noise yang diprediksi).

DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput(prev_sample: Tensor, pred_original_sample: typing.Optional[torch.Tensor] = None)

Sumber

Parameter:

prev_sample (torch.Tensor dengan bentuk (batch_size, num_channels, height, width) untuk gambar) : Sampel (x_{t-1}) yang dihitung dari timestep sebelumnya. prev_sample harus digunakan sebagai input model berikutnya dalam loop denoising.

pred_original_sample (torch.Tensor dengan bentuk (batch_size, num_channels, height, width) untuk gambar) : Sampel denoised yang diprediksi (x_{0}) berdasarkan output model dari timestep saat ini. pred_original_sample dapat digunakan untuk pratinjau progres atau untuk guidance.

Kelas output untuk output fungsi step scheduler.

Xet Storage Details

Size:
13.5 kB
·
Xet hash:
8b8d62b55e2d620ce8604181b8605c4bb286755605ba2d25b245610ffbc30023

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.