# EDMDPMSolverMultistepScheduler

`EDMDPMSolverMultistepScheduler` は、Cheng Lu、Yuhao Zhou、Fan Bao、Jianfei Chen、Chongxuan Li、Jun Zhu による [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) に由来するマルチステップスケジューラである `DPMSolverMultistepScheduler` の [Karras 定式化](https://huggingface.co/papers/2206.00364) です。

DPMSolver （改善版のDPMSolver++）は、収束次数を保証する拡散ODE用の高速な専用高次数ソルバーです。実証的に、DPMSolverサンプリングはわずか20ステップで高品質なサンプルを生成でき、10ステップでもかなり良いサンプルを生成できます。

## EDMDPMSolverMultistepScheduler[[diffusers.EDMDPMSolverMultistepScheduler]]

#### diffusers.EDMDPMSolverMultistepScheduler[[diffusers.EDMDPMSolverMultistepScheduler]]

```python
diffusers.EDMDPMSolverMultistepScheduler(sigma_min: float = 0.002, sigma_max: float = 80.0, sigma_data: float = 0.5, sigma_schedule: typing.Literal['karras', 'exponential'] = 'karras', num_train_timesteps: int = 1000, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', rho: float = 7.0, solver_order: int = 2, thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, algorithm_type: typing.Literal['dpmsolver++', 'sde-dpmsolver++'] = 'dpmsolver++', solver_type: typing.Literal['midpoint', 'heun'] = 'midpoint', lower_order_final: bool = True, euler_at_final: bool = False, final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero')
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L28)

**パラメータ:**

sigma_min (`float`、*optional*、デフォルト値は 0.002) : sigma スケジュールにおける最小ノイズ量。EDM 論文 [1] では 0.002 に設定されています。適切な範囲は [0, 10] です。

sigma_max (`float`、*optional*、デフォルト値は 80.0) : sigma スケジュールにおける最大ノイズ量。EDM 論文 [1] では 80.0 に設定されており、適切な範囲は [0.2, 80.0] です。

sigma_data (`float`、*任意*、デフォルトは 0.5) : データ分布の標準偏差です。EDM の論文 [1] では 0.5 に設定されています。

sigma_schedule (`str`、*任意*、デフォルトは`karras`) : `sigmas`を計算するためのシグマスケジュール。デフォルトでは、EDM論文（https://huggingface.co/papers/2206.00364）で導入されたスケジュールを使用します。その他の許容値は"exponential"です。exponentialスケジュールはこのモデルに組み込まれています：https://huggingface.co/stabilityai/cosxl。

num_train_timesteps (`int`、デフォルトは 1000) : モデルを学習するための拡散ステップ数。

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).

rho (`float`、*optional*、デフォルト値は 7.0) : Karras sigma スケジュールにおける rho パラメータです。EDM 論文 [1] では 7.0 に設定されていました。

solver_order (`int`、デフォルトは 2) : `1`、`2`、または `3` を指定できる DPMSolver の order です。ガイド付きサンプリングには `solver_order=2`、無条件サンプリングには `solver_order=3` の使用を推奨します。

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++` または `sde-dpmsolver++` を指定できます。`dpmsolver++` タイプは、[DPMSolver++](https://huggingface.co/papers/2211.01095) 論文に記述されているアルゴリズムを実装しています。Stable Diffusion におけるガイド付きサンプリングのような用途では、`dpmsolver++` または `sde-dpmsolver++` を `solver_order=2` と組み合わせて使用することを推奨します。

solver_type (`str`、デフォルトは `midpoint`) : 2 階のソルバーのソルバータイプ。`midpoint` または `heun` を指定できます。ソルバータイプはサンプルの品質にわずかな影響を与えますが、ステップ数が少ない場合に特に顕著です。`midpoint` ソルバーの使用を推奨します。

lower_order_final (`bool`、デフォルトは`True`) : 最終ステップで低次のソルバーを使用するかどうか。15ステップ未満の推論ステップでのみ有効です。ステップ数が15未満、特に10以下の場合、DPMSolverのサンプリングを安定化させることができます。

euler_at_final (`bool`、デフォルトは`False`) : 最終ステップでEuler法を使用するかどうか。数値安定性とディテールの豊かさのトレードオフです。推論ステップ数が少ない場合、DPMSolverのSDEバリアントのサンプリングを安定させることができますが、場合によってはぼやけの原因になります。

final_sigmas_type (`str`、デフォルトは `"zero"`) : サンプリングプロセス中のノイズスケジュールにおける最終的な `sigma` 値。`"sigma_min"` の場合、最終的な sigma は学習スケジュールの最後の sigma と同じになります。`zero` の場合、最終的な sigma は 0 に設定されます。

Karras et al. 2022 [1] に示された EDM 定式化における DPMSolverMultistepScheduler を実装します。`EDMDPMSolverMultistepScheduler` は、拡散 ODE 向けの高速な専用高次ソルバーです。

[1] Karras, Tero, et al. "Elucidating the Design Space of Diffusion-Based Generative Models." https://huggingface.co/papers/2206.00364

このモデルは [SchedulerMixin](/docs/diffusers/main/ja/api/schedulers/overview#diffusers.SchedulerMixin) と [ConfigMixin](/docs/diffusers/main/ja/api/configuration#diffusers.ConfigMixin) を継承しています。読み込みや保存など、ライブラリがすべてのスケジューラに対して実装している汎用的なメソッドについては、スーパークラスのドキュメントを参照してください。

#### add_noise[[diffusers.EDMDPMSolverMultistepScheduler.add_noise]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L808)

**パラメータ:**

original_samples (`torch.Tensor`) : ノイズが加えられる元のサンプル。

noise (`torch.Tensor`) : 元のサンプルに追加するノイズのテンソル。

timesteps (`torch.Tensor`) : ノイズを追加するタイムステップ。スケジュールに基づいてノイズレベルを決定します。

**戻り値:** `torch.Tensor`

タイムステップスケジュールに従ってスケーリングされたノイズが加えられたノイズ付きサンプル。

指定されたタイムステップにおけるノイズスケジュールに従って、元のサンプルにノイズを追加します。

#### convert_model_output[[diffusers.EDMDPMSolverMultistepScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, sample: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L471)

**パラメータ:**

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

**戻り値:** `torch.Tensor`

変換後のモデルの出力。

モデルの出力を、DPMSolver/DPMSolver++ アルゴリズムが要求する対応する型に変換します。DPM-Solver はノイズ予測モデルの積分を離散化するように設計されており、DPM-Solver++ はデータ予測モデルの積分を離散化するように設計されています。

> [!TIP] > アルゴリズムとモデルタイプは分離されています。DPMSolverとDPMSolver++のいずれかを、両方の
noise > prediction および data prediction models。

#### dpm_solver_first_order_update[[diffusers.EDMDPMSolverMultistepScheduler.dpm_solver_first_order_update]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L502)

**パラメータ:**

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

noise (`torch.Tensor`, *任意*) : 元のサンプルに追加するノイズテンソル。

**戻り値:** `torch.Tensor`

前のタイムステップのサンプルテンソル。

1次DPMSolverの1ステップ（DDIMと同等）。

#### index_for_timestep[[diffusers.EDMDPMSolverMultistepScheduler.index_for_timestep]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L673)

**パラメータ:**

timestep (`int` または `torch.Tensor`) : インデックスを特定するためのタイムステップ。

schedule_timesteps (`torch.Tensor`, *任意*) : 検索対象のタイムステップスケジュール。`None` の場合は `self.timesteps` を使用します。

**戻り値:** `int`

スケジュールにおけるタイムステップのインデックス。

スケジュール内の指定されたタイムステップのインデックスを取得します。

#### multistep_dpm_solver_second_order_update[[diffusers.EDMDPMSolverMultistepScheduler.multistep_dpm_solver_second_order_update]]

```python
multistep_dpm_solver_second_order_update(model_output_list: typing.List[torch.Tensor], sample: Tensor, noise: typing.Optional[torch.Tensor] = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L545)

**パラメータ:**

model_output_list (`list[torch.Tensor]`) : 学習済み拡散モデルが現在のタイムステップおよびその後のタイムステップで直接出力する値。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

noise (`torch.Tensor`, *任意*) : 元のサンプルに追加するノイズテンソル。

**戻り値:** `torch.Tensor`

前のタイムステップのサンプルテンソル。

2次多ステップDPMSolverの1ステップ。

#### multistep_dpm_solver_third_order_update[[diffusers.EDMDPMSolverMultistepScheduler.multistep_dpm_solver_third_order_update]]

```python
multistep_dpm_solver_third_order_update(model_output_list: list, sample: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L618)

**パラメータ:**

model_output_list (`list[torch.Tensor]`) : 学習済み拡散モデルが現在のタイムステップおよびその後のタイムステップで直接出力する値。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

**戻り値:** `torch.Tensor`

前のタイムステップのサンプルテンソル。

3階の多段DPMSolverの1ステップ。

#### precondition_inputs[[diffusers.EDMDPMSolverMultistepScheduler.precondition_inputs]]

```python
precondition_inputs(sample: Tensor, sigma: typing.Union[float, torch.Tensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L180)

**パラメータ:**

sample (`torch.Tensor`) : 事前処理を行う入力サンプルテンソル。

sigma (`float` または `torch.Tensor`) : 現在の sigma（ノイズレベル）の値。

**戻り値:** `torch.Tensor`

スケーリングされた入力サンプル。

EDMの定式化に従ってスケーリングすることにより、入力サンプルを事前処理します。

#### precondition_noise[[diffusers.EDMDPMSolverMultistepScheduler.precondition_noise]]

```python
precondition_noise(sigma: typing.Union[float, torch.Tensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L199)

**パラメータ:**

sigma (`float` または `torch.Tensor`) : 事前処理を行う sigma（ノイズレベル）の値。

**戻り値:** `torch.Tensor`

`0.25 * log(sigma)` として計算される事前条件付きノイズ値。

対数変換を適用して、ノイズレベルを事前処理します。

#### precondition_outputs[[diffusers.EDMDPMSolverMultistepScheduler.precondition_outputs]]

```python
precondition_outputs(sample: Tensor, model_output: Tensor, sigma: typing.Union[float, torch.Tensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L219)

**パラメータ:**

sample (`torch.Tensor`) : 入力サンプルのテンソル。

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

sigma (`float` または `torch.Tensor`) : 現在の sigma（ノイズレベル）の値。

**戻り値:** `torch.Tensor`

スキップ接続と出力スケーリングを組み合わせることで計算されるノイズ除去済みサンプル。

EDMの定式化に従って、モデルの出力を事前処理します。

#### scale_model_input[[diffusers.EDMDPMSolverMultistepScheduler.scale_model_input]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L255)

**パラメータ:**

sample (`torch.Tensor`) : 入力サンプルのテンソル。

timestep (`float` または `torch.Tensor`) : 拡散チェーンにおける現在のタイムステップ。

**戻り値:** `torch.Tensor`

スケーリングされた入力サンプル。

Eulerアルゴリズムに合わせて、ノイズ除去モデルの入力をスケーリングします。現在のタイムステップに応じてノイズ除去モデルの入力をスケーリングする必要があるスケジューラーとの相互運用性を保証します。

#### set_begin_index[[diffusers.EDMDPMSolverMultistepScheduler.set_begin_index]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L169)

**パラメータ:**

begin_index (`int`、デフォルトは`0`) : スケジューラの開始インデックス。

スケジューラの開始インデックスを設定します。この関数は、推論の前にパイプラインから実行する必要があります。

#### set_timesteps[[diffusers.EDMDPMSolverMultistepScheduler.set_timesteps]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L279)

**パラメータ:**

num_inference_steps (`int`) : 事前学習済みモデルでサンプルを生成する際に使用される拡散ステップの数。

device (`str` または `torch.device`、*任意*) : timesteps を移動先とするデバイスです。`None` の場合、timesteps は移動されません。

拡散チェーンで使用される離散タイムステップを設定します（推論の実行前に実行する必要があります）。

#### ステップ[[diffusers.EDMDPMSolverMultistepScheduler.step]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py#L726)

**パラメータ:**

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

timestep (`int`) : 拡散チェーンにおける現在の離散タイムステップ。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

generator (`torch.Generator`, *任意*) : 乱数生成器。

return_dict (`bool`) : [SchedulerOutput](/docs/diffusers/main/ja/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput)を返すか、`tuple`を返すかを指定します。

**戻り値:** [SchedulerOutput](/docs/diffusers/main/ja/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) または `tuple`

`True` の場合、[SchedulerOutput](/docs/diffusers/main/ja/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) が返され、それ以外の場合は、最初の要素がサンプルテンソルであるタプルが返されます。

前のタイムステップのサンプルを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`関数の出力の基底クラス。

