# DPMSolverMultistepInverse

`DPMSolverMultistepInverse` — это инвертированный планировщик из статей [DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps](https://huggingface.co/papers/2206.00927) и [DPM-Solver++: Fast Solver for Guided Sampling of Diffusion Probabilistic Models](https://huggingface.co/papers/2211.01095) авторов Cheng Lu, Yuhao Zhou, Fan Bao, Jianfei Chen, Chongxuan Li и Jun Zhu.

Реализация в основном основана на определении инверсии DDIM из [Null-text Inversion for Editing Real Images using Guided Diffusion Models](https://huggingface.co/papers/2211.09794) и реализации в ноутбуке латентной инверсии `DiffEdit` из [Xiang-cd/DiffEdit-stable-diffusion](https://github.com/Xiang-cd/DiffEdit-stable-diffusion/blob/main/diffedit.ipynb).

## Советы

Поддерживается динамическое пороговое срабатывание из [Imagen](https://huggingface.co/papers/2205.11487). Для диффузионных моделей в пиксельном пространстве можно установить и `algorithm_type="dpmsolver++"`, и `thresholding=True`, чтобы использовать динамическое пороговое срабатывание. Этот метод порогового срабатывания не подходит для диффузионных моделей в латентном пространстве, таких как Stable Diffusion.

## DPMSolverMultistepInverseScheduler[[diffusers.DPMSolverMultistepInverseScheduler]]

#### diffusers.DPMSolverMultistepInverseScheduler[[diffusers.DPMSolverMultistepInverseScheduler]]

```python
diffusers.DPMSolverMultistepInverseScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = '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, algorithm_type: typing.Literal['dpmsolver', 'dpmsolver++', 'sde-dpmsolver', 'sde-dpmsolver++'] = 'dpmsolver++', solver_type: typing.Literal['midpoint', 'heun'] = 'midpoint', lower_order_final: bool = True, euler_at_final: bool = False, 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, lambda_min_clipped: float = -inf, variance_type: typing.Optional[typing.Literal['learned', 'learned_range']] = None, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace', steps_offset: int = 0)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L86)

**Параметры:**

num_train_timesteps (`int`, по умолчанию 1000) : Количество шагов диффузии для обучения модели.

beta_start (`float`, по умолчанию 0.0001) : начальное значение `beta` для инференса.

beta_end (`float`, по умолчанию 0.02) : Итоговое значение `beta`.

beta_schedule (`str`, по умолчанию `"linear"`) : Расписание бета, отображение диапазона бета в последовательность бета для шагов модели. Выберите одно из значений: `linear`, `scaled_linear` или `squaredcos_cap_v2`.

trained_betas (`np.ndarray`, *необязательный*) : Передайте массив бета непосредственно в конструктор, чтобы обойти `beta_start` и `beta_end`.

solver_order (`int`, по умолчанию 2) : Порядок DPMSolver, который может быть `1` или `2` или `3`. Рекомендуется использовать `solver_order=2` для управляемого сэмплирования и `solver_order=3` для безусловного сэмплирования.

prediction_type (`str`, 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`) or `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper).

thresholding (`bool`, по умолчанию `False`) : Использовать ли метод «динамического порога». Этот метод не подходит для моделей диффузии в латентном пространстве, таких как Stable Diffusion.

dynamic_thresholding_ratio (`float`, по умолчанию 0.995) : Коэффициент для метода динамического порогового значения. Действительно только при `thresholding=True`.

sample_max_value (`float`, по умолчанию 1.0) : Пороговое значение для динамического порогового срабатывания. Действительно только при `thresholding=True` и `algorithm_type="dpmsolver++"`.

algorithm_type (`str`, по умолчанию `dpmsolver++`) : Тип алгоритма для решателя; может быть `dpmsolver`, `dpmsolver++`, `sde-dpmsolver` или `sde-dpmsolver++`. Тип `dpmsolver` реализует алгоритмы из статьи [DPMSolver](https://huggingface.co/papers/2206.00927), а тип `dpmsolver++` реализует алгоритмы из статьи [DPMSolver++](https://huggingface.co/papers/2211.01095). Рекомендуется использовать `dpmsolver++` или `sde-dpmsolver++` с `solver_order=2` для направленного сэмплирования, как в Stable Diffusion.

solver_type (`str`, по умолчанию `midpoint`) : Тип решателя для решателя второго порядка; может быть `midpoint` или `heun`. Тип решателя незначительно влияет на качество выборки, особенно при малом числе шагов. Рекомендуется использовать решатели `midpoint`.

lower_order_final (`bool`, по умолчанию `True`) : Использовать ли решатели низшего порядка на последних шагах. Действительно только для < 15 шагов инференса. Это может стабилизировать сэмплирование DPMSolver для шагов < 15, особенно для шагов <= 10.

euler_at_final (`bool`, по умолчанию `False`) : Использовать ли метод Эйлера на последнем шаге. Это компромисс между численной стабильностью и детализацией. Это может стабилизировать сэмплинг SDE-варианта DPMSolver при малом количестве шагов инференса, но иногда приводит к размыванию.

use_karras_sigmas (`bool`, *необязательный*, по умолчанию `False`) : Использовать ли сигмы Карраса для размеров шагов в расписании шума во время процесса выборки. Если `True`, сигмы определяются согласно последовательности уровней шума {σi}.

use_exponential_sigmas (`bool`, *необязательный*, по умолчанию `False`) : Использовать ли экспоненциальные сигмы для размеров шагов в расписании шума во время процесса выборки.

use_beta_sigmas (`bool`, *optional*, defaults to `False`) : Whether to use beta sigmas for step sizes in the noise schedule during the sampling process. Refer to [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) for more information.

use_flow_sigmas (`bool`, *необязательный*, по умолчанию `False`) : Использовать ли сигмы потока для определения размеров шагов в расписании шума во время процесса выборки.

flow_shift (`float`, *optional*, по умолчанию 1.0) : Коэффициент сдвига потока. Действительно только при `use_flow_sigmas=True`.

lambda_min_clipped (`float`, по умолчанию `-inf`) : Порог обрезки для минимального значения `lambda(t)` ради численной стабильности. Это критически важно для косинусной (`squaredcos_cap_v2`) схемы шума.

variance_type (`str`, *необязательный*) : Установите значение "learned" или "learned_range" для диффузионных моделей, предсказывающих дисперсию. Если параметр задан, выход модели содержит предсказанную гауссову дисперсию.

timestep_spacing (`str`, defaults to `"linspace"`) : The way the timesteps should be scaled. Refer to Table 2 of the [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) for more information.

steps_offset (`int`, по умолчанию 0) : Смещение, добавляемое к шагам инференса, как требуется некоторыми семействами моделей.

`DPMSolverMultistepInverseScheduler` — это обратный планировщик для [DPMSolverMultistepScheduler](/docs/diffusers/main/ru/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler).

Эта модель наследуется от [SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin) и [ConfigMixin](/docs/diffusers/main/ru/api/configuration#diffusers.ConfigMixin). Общие методы, которые библиотека реализует для всех планировщиков, такие как загрузка и сохранение, описаны в документации суперкласса.

#### add_noise[[diffusers.DPMSolverMultistepInverseScheduler.add_noise]]

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L1118)

**Параметры:**

original_samples (`torch.Tensor`) : исходные образцы, к которым нужно добавить шум.

noise (`torch.Tensor`) : Тензор шума.

timesteps (`torch.IntTensor`) : Шаги, на которых добавляется шум.

**Возвращает:** `torch.Tensor`

Шумные образцы.

Добавьте шум к чистым `original_samples`, используя эквивалентную функцию планировщика.

#### convert_model_output[[diffusers.DPMSolverMultistepInverseScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, *args, sample: typing.Optional[torch.Tensor] = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L600)

**Параметры:**

model_output (`torch.Tensor`) : Прямой вывод из обученной диффузионной модели.

sample (`torch.Tensor`, *необязательный*) : Текущая инстанция сэмпла, созданная процессом диффузии.

**Возвращает:** `torch.Tensor`

Вывод сконвертированной модели.

Преобразуйте выход модели в соответствующий тип, необходимый для алгоритма DPMSolver/DPMSolver++. DPM-Solver предназначен для дискретизации интеграла модели предсказания шума, а DPM-Solver++ — для дискретизации интеграла модели предсказания данных.

> [!TIP] > Алгоритм и тип модели разделены. Вы можете использовать как DPMSolver, так и DPMSolver++ для обоих
noise > prediction и модели предсказания данных.

#### dpm_solver_first_order_update[[diffusers.DPMSolverMultistepInverseScheduler.dpm_solver_first_order_update]]

```python
dpm_solver_first_order_update(model_output: Tensor, *args, sample: typing.Optional[torch.Tensor] = None, noise: typing.Optional[torch.Tensor] = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L699)

**Параметры:**

model_output (`torch.Tensor`) : Прямой вывод из обученной диффузионной модели.

sample (`torch.Tensor`, *необязательный*) : Текущая инстанция сэмпла, созданная процессом диффузии.

noise (`torch.Tensor`, *необязательный*) : Тензор шума.

**Возвращает:** `torch.Tensor`

Тензор выборки на предыдущем шаге.

Один шаг для DPMSolver первого порядка (эквивалентен DDIM).

#### multistep_dpm_solver_second_order_update[[diffusers.DPMSolverMultistepInverseScheduler.multistep_dpm_solver_second_order_update]]

```python
multistep_dpm_solver_second_order_update(model_output_list: list[torch.Tensor], *args, sample: typing.Optional[torch.Tensor] = None, noise: typing.Optional[torch.Tensor] = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L774)

**Параметры:**

model_output_list (`list[torch.Tensor]`) : Прямые выходы обученной диффузионной модели на текущих и последующих временных шагах.

sample (`torch.Tensor`, *необязательный*) : Текущая инстанция сэмпла, созданная процессом диффузии.

noise (`torch.Tensor`, *необязательный*) : Случайный шум, используемый стохастическими вариантами решателей (`sde-*`). Обязателен, если `algorithm_type` установлен в одно из этих значений, в противном случае не используется.

**Возвращает:** `torch.Tensor`

Тензор выборки на предыдущем шаге.

Один шаг для двухшагового метода DPMSolver второго порядка.

#### multistep_dpm_solver_third_order_update[[diffusers.DPMSolverMultistepInverseScheduler.multistep_dpm_solver_third_order_update]]

```python
multistep_dpm_solver_third_order_update(model_output_list: list[torch.Tensor], *args, sample: typing.Optional[torch.Tensor] = None, noise: typing.Optional[torch.Tensor] = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L901)

**Параметры:**

model_output_list (`list[torch.Tensor]`) : Прямые выходы обученной диффузионной модели на текущих и последующих временных шагах.

sample (`torch.Tensor`, *необязательный*) : Текущая инстанция сэмпла, созданная процессом диффузии.

noise (`torch.Tensor`, *необязательный*) : Тензор шума.

**Возвращает:** `torch.Tensor`

Тензор выборки на предыдущем шаге.

Один шаг для многошагового DPMSolver третьего порядка.

#### scale_model_input[[diffusers.DPMSolverMultistepInverseScheduler.scale_model_input]]

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L1103)

**Параметры:**

sample (`torch.Tensor`) : Входной образец.

**Возвращает:** `torch.Tensor`

Масштабированный входной образец.

Обеспечивает совместимость с планировщиками, которым необходимо масштабировать входную модель денуазинга в зависимости от текущего шага.

#### set_timesteps[[diffusers.DPMSolverMultistepInverseScheduler.set_timesteps]]

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L283)

**Параметры:**

num_inference_steps (`int`) : Количество шагов диффузии, используемое при генерации образцов с помощью предобученной модели.

device (`str` или `torch.device`, *необязательный*) : Устройство, на которое следует переместить шаги. Если `None`, шаги не перемещаются.

Устанавливает дискретные временные шаги, используемые для цепочки диффузии (выполняется перед инференсом).

#### шаг[[diffusers.DPMSolverMultistepInverseScheduler.step]]

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

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py#L1017)

**Параметры:**

model_output (`torch.Tensor`) : Прямой вывод из обученной диффузионной модели.

timestep (`int`) : Текущий дискретный шаг времени в цепочке диффузии.

sample (`torch.Tensor`) : Текущая инстанция сэмпла, созданная процессом диффузии.

generator (`torch.Generator`, *необязательный*) : генератор случайных чисел.

variance_noise (`torch.Tensor`) : Альтернатива генерации шума с помощью `generator` путём прямого предоставления шума для дисперсии. Полезно для методов, таких как `CycleDiffusion`.

return_dict (`bool`) : Возвращать ли [SchedulerOutput](/docs/diffusers/main/ru/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) или `tuple`.

**Возвращает:** [SchedulerOutput](/docs/diffusers/main/ru/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) или `tuple`

If return_dict is `True`, [SchedulerOutput](/docs/diffusers/main/ru/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

Предскажите образец из предыдущего шага времени, инвертируя SDE. Эта функция распространяет образец с помощью многошагового DPMSolver.

## 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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py#L66)

**Параметры:**

prev_sample (`torch.Tensor` формы `(batch_size, num_channels, height, width)` для изображений) : Вычисленная выборка `(x_{t-1})` для предыдущего шага. `prev_sample` следует использовать как следующий вход модели в цикле шумоподавления.

Базовый класс для результата функции `step` планировщика.

