Diffusers documentation
DEISMultistepScheduler
DEISMultistepScheduler
Diffusion Exponential Integrator Sampler (DEIS) предложен в статье Fast Sampling of Diffusion Models with Exponential Integrator авторами Qinsheng Zhang и Yongxin Chen. DEISMultistepScheduler — это быстрый решатель высокого порядка для обыкновенных дифференциальных уравнений (ОДУ) диффузии.
Эта реализация модифицирует формулу полиномиальной аппроксимации в логарифмическом пространстве t вместо исходного линейного пространства t из статьи DEIS. Благодаря модификации коэффициенты для экспоненциального многошагового обновления имеют замкнутую форму, что позволяет отказаться от использования численного решателя.
Аннотация из статьи:
За последние несколько лет модели диффузии~(DM) продемонстрировали значительный успех в генерации образцов высокого качества в задачах генеративного моделирования. Основным ограничением DM является их, как известно, медленная процедура выборки, которая обычно требует сотен или тысяч шагов дискретизации по времени для достижения желаемой точности. Наша цель — разработать быстрый метод выборки для DM, требующий значительно меньшего числа шагов при сохранении высокого качества образцов. Для этого мы систематически анализируем процедуру выборки в DM и выявляем ключевые факторы, влияющие на качество образцов, среди которых метод дискретизации является наиболее важным. Тщательно изучив обученный процесс диффузии, мы предлагаем Diffusion Exponential Integrator Sampler~(DEIS). Он основан на экспоненциальном интеграторе, предназначенном для дискретизации обыкновенных дифференциальных уравнений (ODE), и использует полунеарную структуру обученного процесса диффузии для снижения ошибки дискретизации. Предложенный метод может применяться к любым DM и позволяет генерировать образцы высокого качества всего за 10 шагов. В наших экспериментах генерация 50 тыс. изображений из CIFAR10 занимает около 3 минут на одном GPU A6000. Более того, используя предобученные DM напрямую, мы достигаем наилучшего результата по качеству выборки при ограниченном числе вычислений функции оценки~(NFE), например, FID 4.17 при 10 NFE, FID 3.37 и IS 9.74 всего при 15 NFE на CIFAR10. Код доступен по этой ссылке.
Советы
Рекомендуется устанавливать solver_order в 2 или 3, при этом solver_order=1 эквивалентно DDIMScheduler.
Поддерживается динамическое пороговое срабатывание из Imagen, а для диффузионных моделей в пиксельном пространстве можно установить thresholding=True, чтобы использовать динамическое пороговое срабатывание.
DEISMultistepScheduler
класс diffusers.DEISMultistepScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = 'linear'trained_betas: numpy.ndarray | list[float] | None = Nonesolver_order: int = 2prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon'thresholding: bool = Falsedynamic_thresholding_ratio: float = 0.995sample_max_value: float = 1.0algorithm_type: typing.Literal['deis'] = 'deis'solver_type: typing.Literal['logrho'] = 'logrho'lower_order_final: bool = Trueuse_karras_sigmas: bool = Falseuse_exponential_sigmas: bool = Falseuse_beta_sigmas: bool = Falseuse_flow_sigmas: bool = Falseflow_shift: float = 1.0timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace'steps_offset: int = 0use_dynamic_shifting: bool = Falsetime_shift_type: typing.Literal['exponential'] = 'exponential' )
Параметры
- num_train_timesteps (
int, по умолчанию1000) — Количество шагов диффузии для обучения модели. - beta_start (
float, по умолчанию0.0001) — Начальное значениеbetaдля вывода. - beta_end (
float, по умолчанию0.02) — Конечное значениеbeta. - beta_schedule (
"linear","scaled_linear"или"squaredcos_cap_v2", по умолчанию"linear") — Расписание бета, отображающее диапазон бета в последовательность значений бета для шагов модели. Выберите одно из значений:linear,scaled_linearилиsquaredcos_cap_v2. - trained_betas (
np.ndarrayилиlist[float], необязательный) — Передайте массив betas непосредственно в конструктор, чтобы обойтиbeta_startиbeta_end. - solver_order (
int, по умолчанию2) — порядок DEIS, который может быть1или2или3. Рекомендуется использоватьsolver_order=2для управляемого сэмплирования иsolver_order=3для безусловного сэмплирования. - prediction_type (
"epsilon","sample","v_prediction", or"flow_prediction", defaults to"epsilon") — Prediction type of the scheduler function; can beepsilon(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), orflow_prediction`. - thresholding (
bool, по умолчаниюFalse) — Использовать ли метод «динамического порогового значения». Этот метод не подходит для моделей диффузии в латентном пространстве, таких как Stable Diffusion. - dynamic_thresholding_ratio (
float, по умолчанию0.995) — Коэффициент для метода динамического порогового значения. Действительно только приthresholding=True. - sample_max_value (
float, по умолчанию1.0) — Пороговое значение для динамического порогового выделения. Действительно только приthresholding=True. - algorithm_type (
"deis", по умолчанию"deis") — Тип алгоритма для решателя. - solver_type (
"logrho", по умолчанию"logrho") — Тип решателя для DEIS. - lower_order_final (
bool, по умолчаниюTrue) — Использовать ли решатели низшего порядка на последних шагах. Действительно только для < 15 шагов инференса. - use_karras_sigmas (
bool, необязательный, по умолчаниюFalse) — Использовать ли Karras sigmas для определения размеров шагов в расписании шума в процессе выборки. ЕслиTrue, значения сигм определяются согласно последовательности уровней шума {σi}. - use_exponential_sigmas (
bool, необязательный, по умолчаниюFalse) — Использовать ли экспоненциальные сигмы для размеров шагов в расписании шума во время процесса выборки. - use_beta_sigmas (
bool, optional, defaults toFalse) — Whether to use beta sigmas for step sizes in the noise schedule during the sampling process. Refer to Beta Sampling is All You Need for more information. - use_flow_sigmas (
bool, необязательный, по умолчаниюFalse) — Использовать ли flow sigmas для определения размеров шагов в расписании шума во время процесса выборки. - flow_shift (
float, необязательный, по умолчанию1.0) — Параметр сдвига потока для моделей на основе потока. - timestep_spacing (
"linspace","leading", or"trailing", 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 for more information. - steps_offset (
int, по умолчанию0) — Смещение, добавляемое к шагам инференса, как требуется некоторыми семействами моделей. - use_dynamic_shifting (
bool, по умолчаниюFalse) — Использовать ли динамический сдвиг для расписания шума. - time_shift_type (
"exponential", по умолчанию"exponential") — Тип применяемого сдвига во времени.
DEISMultistepScheduler — это быстрый решатель высокого порядка для обыкновенных дифференциальных уравнений (ОДУ) диффузии.
Эта модель наследуется от SchedulerMixin и ConfigMixin. Общую документацию по методам, которые библиотека реализует для всех планировщиков (например, загрузка и сохранение), см. в документации суперкласса.
add_noise
< source >( original_samples: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor
Добавьте шум к исходным образцам в соответствии с расписанием шума на указанных временных шагах.
convert_model_output
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
Преобразуйте выход модели в соответствующий тип, необходимый для алгоритма DEIS.
deis_first_order_update
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
Параметры
- model_output (
torch.Tensor) — Прямой вывод из обученной диффузионной модели. - timestep (
int) — Текущий дискретный шаг в цепочке диффузии. - prev_timestep (
int) — Предыдущий дискретный шаг времени в цепочке диффузии. - sample (
torch.Tensor) — Текущий экземпляр сэмпла, созданный процессом диффузии.
Возвращает
torch.Tensor
Тензор выборки на предыдущем шаге.
Один шаг для DEIS первого порядка (эквивалентен DDIM).
index_for_timestep
< source >( timestep: typing.Union[int, torch.Tensor]schedule_timesteps: typing.Optional[torch.Tensor] = None ) → int
Найдите индекс для заданного шага в расписании.
multistep_deis_second_order_update
< source >( model_output_list: list*argssample: Tensor = None**kwargs ) → torch.Tensor
Один шаг метода DEIS второго порядка с несколькими шагами.
multistep_deis_third_order_update
< source >( model_output_list: list*argssample: Tensor = None**kwargs ) → torch.Tensor
Один шаг метода DEIS третьего порядка с несколькими шагами.
scale_model_input
< source >( sample: Tensor*args**kwargs ) → torch.Tensor
Обеспечивает совместимость с планировщиками, которым необходимо масштабировать входную модель денуазинга в зависимости от текущего шага.
set_begin_index
< source >( begin_index: int = 0 )
Устанавливает начальный индекс для планировщика. Эта функция должна выполняться из конвейера перед инференсом.
set_timesteps
< source >( num_inference_steps: intdevice: typing.Union[str, torch.device] = Nonemu: float | None = None )
Параметры
- num_inference_steps (
int) — Количество шагов диффузии, используемых при генерации образцов с помощью предобученной модели. - device (
strилиtorch.device, необязательный) — Устройство, на которое следует переместить шаги. ЕслиNone, шаги не перемещаются. - mu (
float, необязательный) — Параметр mu для динамического сдвига. Используется только приuse_dynamic_shifting=Trueиtime_shift_type="exponential".
Устанавливает дискретные временные шаги, используемые для цепочки диффузии (выполняется перед инференсом).
шаг
< source >( model_output: Tensortimestep: typing.Union[int, torch.Tensor]sample: Tensorreturn_dict: bool = True ) → SchedulerOutput or tuple
Параметры
- model_output (
torch.Tensor) — Прямой вывод из обученной диффузионной модели. - timestep (
intилиtorch.Tensor) — Текущий дискретный шаг в цепочке диффузии. - sample (
torch.Tensor) — Текущий экземпляр сэмпла, созданный процессом диффузии. - return_dict (
bool, по умолчаниюTrue) — Определяет, возвращать ли SchedulerOutput илиtuple.
Возвращает
SchedulerOutput или tuple
If return_dict is True, SchedulerOutput is returned, otherwise a
tuple is returned where the first element is the sample tensor.
Предскажите образец из предыдущего шага времени, инвертируя SDE. Эта функция распространяет образец с помощью многошагового DEIS.
SchedulerOutput
класс diffusers.schedulers.scheduling_utils.SchedulerOutput
< source >( prev_sample: Tensor )
Базовый класс для результата функции step планировщика.