# UniPCMultistepScheduler

`UniPCMultistepScheduler`, difüzyon modellerinin hızlı örneklenmesi için tasarlanmış eğitim gerektirmeyen bir çerçevedir. Wenliang Zhao, Lujia Bai, Yongming Rao, Jie Zhou ve Jiwen Lu tarafından [UniPC: A Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models](https://huggingface.co/papers/2302.04867) makalesinde tanıtılmıştır.

UniPC, birleştirilmiş analitik bir forma sahip olan ve keyfi dereceleri destekleyen bir düzeltici (UniC) ve bir tahmin edici (UniP) ile oluşur. UniPC, tasarım gereği model bağımsızdır ve koşulsuz/koşullu örneklemelerde piksel uzayında/latent uzayda DPM'leri destekler. Hem gürültü tahmini hem de veri tahmini modellerine uygulanabilir. Düzeltici UniC, doğruluk derecesini artırmak için herhangi bir hazır çözücünün ardından da uygulanabilir.

Makalenin özeti şudur:

*Diffusion probabilistic models (DPMs), yüksek çözünürlüklü görüntü sentezinde çok umut verici bir yetenek sergilemiştir. Ancak, gürültü azaltma ağının birden fazla kez değerlendirilmesi nedeniyle, önceden eğitilmiş bir DPM'den örnek almak zaman alıcıdır; bu durum, DPM örneklemesinin hızlandırılmasını giderek daha önemli hale getirmektedir. Hızlı örnekleme tasarımlarındaki son ilerlemelere rağmen, mevcut yöntemler, daha az adımın (ör. <10) tercih edildiği birçok uygulamada tatmin edici görüntüler üretememektedir. Bu makalede, herhangi bir mevcut DPM örnekleme yönteminin ardından uygulanabilen, ek model değerlendirmesi gerektirmeden doğruluk derecesini artıran birleşik bir düzeltici (UniC) geliştirdik ve bir yan ürün olarak, keyfi dereceleri destekleyen birleşik bir tahmin edici (UniP) türettik. UniP ve UniC'yi birleştirerek, DPM'lerin hızlı örneklemesi için UniPC adını verdiğimiz birleşik bir tahmin edici-düzeltici çerçevesi öneriyoruz. Bu çerçeve, herhangi bir derece için birleşik analitik bir forma sahiptir ve önceki yöntemlere kıyasla örneklemeyi, özellikle son derece az adımlarda, önemli ölçüde iyileştirebilir. Yöntemlerimizi, hem piksel uzayında hem de gizli uzayda DPM'ler kullanarak hem koşulsuz hem de koşullu örneklemeyi içeren kapsamlı deneylerle değerlendiriyoruz. UniPC'miz, yalnızca 10 fonksiyon değerlendirmesiyle CIFAR10'da (koşulsuz) 3,87 FID ve ImageNet 256×256'da (koşullu) 7,51 FID elde edebilir. Kod, [bu https URL](https://github.com/wl-zhao/UniPC) adresinde mevcuttur.*

## İpuçları

Rehber örneklemesi için `solver_order`'ın 2 olarak ayarlanması, koşulsuz örneklemesi için ise `solver_order=3` olarak ayarlanması önerilir.

[Imagen](https://huggingface.co/papers/2205.11487)'den dinik eşikleme desteklenmektedir ve piksel uzayında çalışan difüzyon modelleri için dinamik eşikleme kullanmak üzere hem `predict_x0=True` hem de `thresholding=True` değerlerini ayarlayabilirsiniz. Bu eşikleme yöntemi, Stable Diffusion gibi gizli uzayda çalışan difüzyon modelleri için uygun değildir.

## UniPCMultistepScheduler[[diffusers.UniPCMultistepScheduler]]

#### diffusers.UniPCMultistepScheduler[[diffusers.UniPCMultistepScheduler]]

```python
diffusers.UniPCMultistepScheduler(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, solver_order: int = 2, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, predict_x0: bool = True, solver_type: typing.Literal['bh1', 'bh2'] = 'bh2', lower_order_final: bool = True, disable_corrector: list = [], solver_p: SchedulerMixin = None, use_karras_sigmas: bool = False, use_exponential_sigmas: bool = False, use_beta_sigmas: bool = False, use_flow_sigmas: bool = False, flow_shift: float = 1.0, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace', steps_offset: int = 0, final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero', rescale_betas_zero_snr: bool = False, use_dynamic_shifting: bool = False, time_shift_type: typing.Literal['exponential'] = 'exponential', sigma_min: float | None = None, sigma_max: bool | None = None, shift_terminal: bool | None = None)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L123)

**Parametreler:**

num_train_timesteps (`int`, varsayılan 1000) : Modelin eğitileceği difüzyon adım sayısı.

beta_start (`float`, varsayılan 0.0001) : Çıkarımın başlangıç `beta` değeri.

beta_end (`float`, varsayılan 0.02) : Son `beta` değeri.

beta_schedule (`"linear"`, `"scaled_linear"` veya `"squaredcos_cap_v2"`, varsayılan olarak `"linear"`) : Beta zamanlaması, modelin adım atması için beta aralığından beta dizisine bir eşleme. `linear`, `scaled_linear` veya `squaredcos_cap_v2` seçeneklerinden birini seçin.

trained_betas (`np.ndarray`, *isteğe bağlı*) : `beta_start` ve `beta_end` parametrelerini atlamak için beta dizisini doğrudan yapılandırıcıya iletin.

solver_order (`int`, varsayılan `2`) : UniPC derecesi, herhangi bir pozitif tam sayı olabilir. UniC nedeniyle etkin doğruluk derecesi `solver_order + 1`'dir. Rehberli örneklemeler için `solver_order=2`, koşulsuz örneklemeler için ise `solver_order=3` kullanılması önerilir.

prediction_type (`"epsilon"`, `"sample"`, `"v_prediction"`, or `"flow_prediction"`, defaults to `"epsilon"`, *optional*) : Prediction type of the scheduler function; can be `epsilon` (predicts the noise of the diffusion process), `sample` (directly predicts the noisy sample`), `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper), or `flow_prediction`.

thresholding (`bool`, varsayılan `False`) : "Dinik eşikleme" yönteminin kullanılıp kullanılmayacağını belirtir. Bu, Stable Diffusion gibi gizli uzay difüzyon modelleri için uygun değildir.

dynamic_thresholding_ratio (`float`, varsayılan 0.995) : Dinamik eşikleme yöntemi için oran. Yalnızca `thresholding=True` olduğunda geçerlidir.

sample_max_value (`float`, varsayılan 1.0) : Dinamik eşikleme için eşik değeri. Yalnızca `thresholding=True` ve `predict_x0=True` olduğunda geçerlidir.

predict_x0 (`bool`, varsayılan `True`) : Tahmin edilen x0 üzerinde güncelleme algoritmasının kullanılıp kullanılmayacağı.

solver_type (`"bh1"` veya `"bh2"`, varsayılan `"bh2"`) : UniPC için çözücü türü. Adım sayısı < 10 olduğunda koşulsuz örneklemeler için `bh1` kullanılması, diğer durumlarda ise `bh2` kullanılması önerilir.

lower_order_final (`bool`, varsayılan `True`) : Son adımlarda düşük dereceli çözücülerin kullanılıp kullanılmayacağı. Yalnızca 15'ten az çıkarım adımı için geçerlidir. Bu, özellikle 10 ve altı adımlar için DPMSolver'ın 15'ten az adımlarda örneklemesini kararlı hale getirebilir.

disable_corrector (`list`, varsayılan `[]`) : `epsilon_theta(x_t, c)` ile `epsilon_theta(x_t^c, c)` arasındaki, büyük bir yönlendirme ölçeğinde yakınsamayı etkileyebilecek hizasızlığı azaltmak için düzelticinin (corrector) hangi adımda devre dışı bırakılacağını belirler. Düzeltici genellikle ilk birkaç adımda devre dışı bırakılır.

solver_p (`SchedulerMixin`, varsayılan `None`) : Belirtilirse, algoritmanın `solver_p + UniC` haline gelmesini sağlayan başka bir zamanlayıcı.

use_karras_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasındaki adım boyutları için Karras sigmalarının kullanılıp kullanılmayacağını belirtir. `True` ise, sigmalar {σi} gürültü seviyeleri dizisine göre belirlenir.

use_exponential_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasındaki adım boyutları için üstel sigmaların kullanılıp kullanılmayacağını belirtir.

use_beta_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasında adım boyutları için beta sigmaların kullanılıp kullanılmayacağını belirtir. Daha fazla bilgi için [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) makalesine bakın.

use_flow_sigmas (`bool`, *isteğe bağlı*, varsayılan `False`) : Örnekleme sürecinde gürültü zamanlamasında adım boyutları için akış sigmalarının kullanılıp kullanılmayacağı.

timestep_spacing (`"linspace"`, `"leading"` veya `"trailing"`, varsayılan olarak `"linspace"`) : Zaman adımlarının ölçeklendirilme yöntemi. Daha fazla bilgi için [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) makalesindeki Tablo 2'ye bakın.

steps_offset (`int`, varsayılan 0) : Bazı model ailelerinin gerektirdiği gibi, çıkarım adımlarına eklenen bir ofset.

final_sigmas_type (`"zero"` veya `"sigma_min"`, varsayılan `"zero"`) : Örnekleme süreci sırasında gürültü zamanlaması için son `sigma` değeri. `"sigma_min"` ise, son sigma, eğitim zamanlamasındaki son sigma ile aynıdır. `zero` ise, son sigma 0 olarak ayarlanır.

rescale_betas_zero_snr (`bool`, varsayılan `False`) : Betaların sıfır terminal SNR'ye sahip olacak şekilde yeniden ölçeklenip ölçeklenmeyeceğini belirtir. Bu, modelin orta parlaklıktaki örneklerle sınırlı kalmak yerine çok parlak ve karanlık örnekler üretmesini sağlar. [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506) ile gevşek bir şekilde ilişkilidir.

`UniPCMultistepScheduler`, difüzyon modellerinin hızlı örneklenmesi için tasarlanmış, eğitim gerektirmeyen bir çerçevedir.

Bu model [SchedulerMixin](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin) ve [ConfigMixin](/docs/diffusers/main/tr/api/configuration#diffusers.ConfigMixin) sınıflarından devralır. Kütüphanenin tüm zamanlayıcılar için yükleme ve kaydetme gibi genel yöntemleri uyguladığı üst sınıf belgelendirmesini kontrol edin.

#### add_noise[[diffusers.UniPCMultistepScheduler.add_noise]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L1250)

**Parametreler:**

original_samples (`torch.Tensor`) : Gürültüsüz orijinal örnekler.

noise (`torch.Tensor`) : Örneklere eklenecek gürültü.

timesteps (`torch.IntTensor`) : Örneklerin gürültü eklenmesi için kullanılacak zaman adımları.

**Dönüş:** `torch.Tensor`

Gürültülü örnekler.

Belirtilen zaman adımlarındaki gürültü planına göre orijinal örneklerin gürültü ekleyin.

#### convert_model_output[[diffusers.UniPCMultistepScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, *args, sample: Tensor = None, **kwargs)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L760)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

**Dönüş:** `torch.Tensor`

Dönüştürülen model çıktısı.

Model çıktısını UniPC algoritmasının gerektirdiği ilgili tipe dönüştürün.

#### index_for_timestep[[diffusers.UniPCMultistepScheduler.index_for_timestep]]

```python
index_for_timestep(timestep: typing.Union[int, torch.Tensor], schedule_timesteps: typing.Optional[torch.Tensor] = None)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L1100)

**Parametreler:**

timestep (`int` veya `torch.Tensor`) : İndeksini bulmak istediğiniz zaman adımı.

schedule_timesteps (`torch.Tensor`, *isteğe bağlı*) : Aranacak zaman adımı zamanlaması. `None` ise `self.timesteps` kullanılır.

**Dönüş:** `int`

Zaman adımı planındaki zaman adımının indeksi.

Zamanlamadaki (schedule) belirli bir zaman adımının (timestep) indeksini bulun.

#### multistep_uni_c_bh_update[[diffusers.UniPCMultistepScheduler.multistep_uni_c_bh_update]]

```python
multistep_uni_c_bh_update(this_model_output: Tensor, *args, last_sample: Tensor = None, this_sample: Tensor = None, order: int = None, **kwargs)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L962)

**Parametreler:**

this_model_output (`torch.Tensor`) : `x_t` konumundaki model çıktıları.

this_timestep (`int`) : Güncel zaman adımı `t`.

last_sample (`torch.Tensor`) : Son tahminci `x_{t-1}`'den önceki üretilmiş örnek.

this_sample (`torch.Tensor`) : Son tahmin edici `x_{t}`'den sonra üretilen örnek.

order (`int`) : Bu adımda UniC-p'nin `p` değeri. Etkin doğruluk derecesi `order + 1` olmalıdır.

**Dönüş:** `torch.Tensor`

Güncel zaman adımındaki düzeltilmiş örnek tensörü.

UniC (B(h) sürümü) için bir adım.

#### multistep_uni_p_bh_update[[diffusers.UniPCMultistepScheduler.multistep_uni_p_bh_update]]

```python
multistep_uni_p_bh_update(model_output: Tensor, *args, sample: Tensor = None, order: int = None, **kwargs)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L833)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinin mevcut zaman adımındaki doğrudan çıktısı.

prev_timestep (`int`) : Difüzyon zincirindeki bir önceki ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

order (`int`) : Bu zaman adımında UniP'in derecesi (UniPC-p'deki *p*'ye karşılık gelir).

**Dönüş:** `torch.Tensor`

Önceki zaman adımındaki örnek tensör.

UniP (B(h) sürümü) için bir adım. Alternatif olarak, `self.solver_p` belirtilirse kullanılır.

#### scale_model_input[[diffusers.UniPCMultistepScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, *args, **kwargs)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L1234)

**Parametreler:**

sample (`torch.Tensor`) : Girdi örneği.

**Dönüş:** `torch.Tensor`

Ölçeklendirilmiş bir girdi örneği.

Gürültüden arındırma modelinin girdisinin mevcut zaman adımına bağlı olarak ölçeklenmesi gereken zamanlayıcılarla değiştirilebilirliği sağlar.

#### set_begin_index[[diffusers.UniPCMultistepScheduler.set_begin_index]]

```python
set_begin_index(begin_index: int = 0)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L308)

**Parametreler:**

begin_index (`int`, varsayılan `0`) : Zamanlayıcının başlangıç indeksi.

Zamanlayıcının başlangıç indeksini ayarlar. Bu işlev, çıkarım (inference) öncesinde pipeline'dan çalıştırılmalıdır.

#### set_timesteps[[diffusers.UniPCMultistepScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int | None = None, device: typing.Union[str, torch.device] = None, sigmas: list[float] | None = None, mu: bool | None = None)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L318)

**Parametreler:**

num_inference_steps (`int`) : Ön eğitilmiş bir modelle örnekler oluşturulurken kullanılan difüzyon adım sayısı.

device (`str` veya `torch.device`, *opsiyonel*) : Timestep'lerin taşınacağı cihaz. `None` ise timestep'ler taşınmaz.

sigmas (`List[float]`, *isteğe bağlı*) : Her difüzyon adımı için kullanılacak sigma değerleri için özel değerler. `None` ise, sigmalar otomatik olarak hesaplanır.

mu (`float`, *isteğe bağlı*) : Üstel zaman kaydırma türü kullanılırken dinamik kaydırma için isteğe bağlı mu parametresi.

Difüzyon zinciri için kullanılan ayrık zaman adımlarını ayarlar (çalıştırılmadan önce çıkarım yapılmalıdır).

#### adım[[diffusers.UniPCMultistepScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[int, torch.Tensor], sample: Tensor, return_dict: bool = True)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L1153)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int` veya `torch.Tensor`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

return_dict (`bool`, varsayılan `True`) : [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) mu yoksa `tuple` mu döndürüleceğini belirtir.

**Dönüş:** [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) veya `tuple`

return_dict `True` ise [SchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) döndürülür, aksi halde bir tuple döndürülür ve bu tuple'ın ilk öğesi örnek tensörüdür.

Önceki zaman adımındaki örneği SDE'yi tersine çevirerek tahmin edin. Bu fonksiyon, örneği çok adımlı UniPC ile ilerletir.

#### stretch_shift_to_terminal[[diffusers.UniPCMultistepScheduler.stretch_shift_to_terminal]]

```python
stretch_shift_to_terminal(t: Tensor)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L506)

**Parametreler:**

t (`torch.Tensor`) : Uzatılacak ve kaydırılacak zaman adımlarının tensörü.

**Dönüş:** `torch.Tensor`

Son değeri `self.config.shift_terminal` değerine eşit olacak şekilde ayarlanmış adımlardan oluşan bir tensör.

Adım zamanı zaman çizelgesini uzatarak ve kaydırarak, yapılandırılmış `shift_terminal` yapılandırma değeriyle sonlandığından emin olunur.

Referans: https://github.com/Lightricks/LTX-Video/blob/a01a171f8fe3d99dce2728d60a73fecf4d4238ae/ltx_video/schedulers/rf.py#L51

#### time_shift[[diffusers.UniPCMultistepScheduler.time_shift]]

```python
time_shift(mu: float, sigma: float, t: Tensor)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_unipc_multistep.py#L484)

**Parametreler:**

mu (`float`) : Zaman kaydırması için mu parametresi.

sigma (`float`) : Zaman kaydırması için sigma parametresi.

t (`torch.Tensor`) : Girdi zaman adımları.

**Dönüş:** `torch.Tensor`

Zaman kaydırılmış zaman adımları.

Sigmalara zaman kaydırma uygulayın.

## SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

#### diffusers.schedulers.scheduling_utils.SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

```python
diffusers.schedulers.scheduling_utils.SchedulerOutput(prev_sample: Tensor)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py#L66)

**Parametreler:**

prev_sample (`torch.Tensor`, görüntüler için `(batch_size, num_channels, height, width)` boyutunda) : Önceki zaman adımının hesaplanan `(x_{t-1})` örneği. `prev_sample`, gürültü azaltma döngüsünde bir sonraki model girdisi olarak kullanılmalıdır.

Bir zamanlayıcının `step` işlevinin çıktısı için temel sınıf.

