# CMStochasticIterativeScheduler

[Consistency Models](https://huggingface.co/papers/2303.01469) авторов Янга Сонга, Прафулла Дхаривала, Марка Чена и Ильи Сутскевера представили многошаговый и одношаговый планировщик (алгоритм 1), способный генерировать качественные образцы за один или небольшое количество шагов.

Аннотация из статьи:

*Модели диффузии значительно продвинули области генерации изображений, аудио и видео, но они зависят от итеративного процесса выборки, что приводит к медленной генерации. Чтобы преодолеть это ограничение, мы предлагаем consistency models — новое семейство моделей, которые генерируют образцы высокого качества, напрямую отображая шум в данные. По своей конструкции они поддерживают быструю генерацию за один шаг, при этом позволяя многошаговую выборку для обмена вычислительных ресурсов на качество образцов. Они также поддерживают редактирование данных в режиме zero-shot, такое как inpainting изображений, колоризация и суперразрешение, без необходимости явного обучения на этих задачах. Consistency models можно обучать либо путём дистилляции предобученных диффузионных моделей, либо как самостоятельные генеративные модели. В ходе обширных экспериментов мы демонстрируем, что они превосходят существующие техники дистилляции для диффузионных моделей при одношаговой и малошаговой выборке, достигая нового state-of-the-art значения FID 3.55 на CIFAR-10 и 6.20 на ImageNet 64x64 для генерации за один шаг. При обучении в изоляции consistency models становятся новым семейством генеративных моделей, которые могут превосходить существующие одношаговые, неадверсариальные генеративные модели на стандартных бенчмарках, таких как CIFAR-10, ImageNet 64x64 и LSUN 256x256.*

Исходный код можно найти в [openai/consistency_models](https://github.com/openai/consistency_models).

## CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

#### diffusers.CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

```python
diffusers.CMStochasticIterativeScheduler(num_train_timesteps: int = 40, sigma_min: float = 0.002, sigma_max: float = 80.0, sigma_data: float = 0.5, s_noise: float = 1.0, rho: float = 7.0, clip_denoised: bool = True)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L43)

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

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

sigma_min (`float`, по умолчанию 0.002) : Минимальная величина шума в расписании сигм. По умолчанию 0.002, как в исходной реализации.

sigma_max (`float`, по умолчанию 80.0) : Максимальная величина шума в расписании сигма. По умолчанию 80.0, как в исходной реализации.

sigma_data (`float`, по умолчанию 0.5) : Стандартное отклонение распределения данных из статьи EDM [paper](https://huggingface.co/papers/2206.00364). По умолчанию 0.5, как в исходной реализации.

s_noise (`float`, по умолчанию 1.0) : Количество дополнительного шума для компенсации потери деталей при сэмплировании. Разумный диапазон — [1.000, 1.011]. По умолчанию 1.0, как в исходной реализации.

rho (`float`, по умолчанию 7.0) : Параметр для вычисления расписания сигм Karras из статьи EDM [paper](https://huggingface.co/papers/2206.00364). По умолчанию 7.0, как в исходной реализации.

clip_denoised (`bool`, по умолчанию `True`) : Нужно ли ограничивать значения после шумоподавления диапазоном `(-1, 1)`.

timesteps (`list` или `np.ndarray` или `torch.Tensor`, *optional*) : Явно заданное расписание временных шагов, которое можно указать по желанию. Ожидается, что временные шаги будут расположены в порядке возрастания.

Многошаговая и одношаговая выборка для моделей согласованности.

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

#### add_noise[[diffusers.CMStochasticIterativeScheduler.add_noise]]

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

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L461)

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

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

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

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

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

Шумовые образцы с добавленным шумом, масштабированным в соответствии с расписанием шагов времени.

Добавьте шум к исходным образцам в соответствии с расписанием шума на указанных временных шагах.

#### get_scalings[[diffusers.CMStochasticIterativeScheduler.get_scalings]]

```python
get_scalings(sigma: Tensor)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L276)

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

sigma (`torch.Tensor`) : текущее значение сигмы в расписании шума.

**Возвращает:** `tuple[torch.Tensor, torch.Tensor]`

Кортеж, содержащий `c_skip` (масштабирование для входного образца) и `c_out` (масштабирование для вывода модели).

Вычисляет коэффициенты масштабирования для вывода модели согласованности.

#### get_scalings_for_boundary_condition[[diffusers.CMStochasticIterativeScheduler.get_scalings_for_boundary_condition]]

```python
get_scalings_for_boundary_condition(sigma: Tensor)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L294)

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

sigma (`torch.Tensor`) : текущее значение сигмы в расписании сигмы Karras.

**Возвращает:** `tuple[torch.Tensor, torch.Tensor]`

Кортеж из двух элементов, где `c_skip` (веса текущего образца) — первый элемент, а `c_out` (веса вывода модели согласованности) — второй.

Получает масштабы, используемые в параметризации модели согласованности (из Приложения C [статьи](https://huggingface.co/papers/2303.01469)) для обеспечения граничного условия.

> [!TIP] > `epsilon` в уравнениях для `c_skip` и `c_out` задан как `sigma_min`.

#### index_for_timestep[[diffusers.CMStochasticIterativeScheduler.index_for_timestep]]

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

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L318)

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

timestep (`float` или `torch.Tensor`) : значение шага времени, которое нужно найти в расписании.

schedule_timesteps (`torch.Tensor`, *необязательный*) : Расписание временных шагов, в котором выполняется поиск. Если `None`, используется `self.timesteps`.

**Возвращает:** `int`

Индекс шага времени в расписании. Для самого первого шага возвращает второй индекс, если существует несколько совпадений, чтобы избежать пропуска сигмы при начале с середины расписания (например, для image-to-image).

Найдите индекс заданного шага времени в расписании шагов времени.

#### scale_model_input[[diffusers.CMStochasticIterativeScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: typing.Union[float, torch.Tensor])
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L136)

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

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

timestep (`float` или `torch.Tensor`) : Текущий шаг (timestep) в цепочке диффузии.

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

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

Масштабирует вход модели согласованности на `(sigma**2 + sigma_data**2) ** 0.5`.

#### set_begin_index[[diffusers.CMStochasticIterativeScheduler.set_begin_index]]

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

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L126)

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

begin_index (`int`, по умолчанию `0`) : Начальный индекс для планировщика.

Устанавливает начальный индекс для планировщика. Эта функция должна выполняться из конвейера перед инференсом.

#### set_timesteps[[diffusers.CMStochasticIterativeScheduler.set_timesteps]]

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

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L180)

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

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

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

timesteps (`list[int]`, *optional*) : Пользовательские шаги (timesteps) для поддержки произвольного интервала между ними. Если `None`, используется стандартная стратегия равномерного распределения шагов. Если передан параметр `timesteps`, `num_inference_steps` должен быть `None`.

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

#### sigma_to_t[[diffusers.CMStochasticIterativeScheduler.sigma_to_t]]

```python
sigma_to_t(sigmas: float | numpy.ndarray)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L161)

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

sigmas (`float` или `np.ndarray`) : одно значение сигмы Карраса или массив сигм Карраса.

**Возвращает:** `np.ndarray`

Массив шагов времени с масштабированным входом.

Получает масштабированные временные шаги из сигм Karras для ввода в модель согласованности.

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

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

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L364)

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

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

timestep (`float` или `torch.Tensor`) : Текущий шаг (timestep) в цепочке диффузии.

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

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

return_dict (`bool`, по умолчанию `True`) : Возвращать ли [CMStochasticIterativeSchedulerOutput](/docs/diffusers/v0.43.0/ru/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) или `tuple`.

**Возвращает:** [CMStochasticIterativeSchedulerOutput](/docs/diffusers/v0.43.0/ru/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) или `tuple`

If return_dict is `True`, [CMStochasticIterativeSchedulerOutput](/docs/diffusers/v0.43.0/ru/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

Предскажите образец из предыдущего шага времени, обращая SDE. Эта функция распространяет процесс диффузии от выходов обученной модели (чаще всего — предсказанного шума).

## CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

#### diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

```python
diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput(prev_sample: Tensor)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_consistency_models.py#L30)

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

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

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

