# EDMEulerScheduler

Karras らの論文 [Elucidating the Design Space of Diffusion-Based Generative Models](https://huggingface.co/papers/2206.00364) に記載されている Euler スケジューラー（アルゴリズム 2）の Karras 定式化です。これは高速なスケジューラーであり、多くの場合、20〜30 ステップで良好な出力を生成できます。このスケジューラーは、[Katherine Crowson](https://github.com/crowsonkb/) による元の [k-diffusion](https://github.com/crowsonkb/k-diffusion/blob/481677d114f6ea445aa009cf5bd7a9cdee909e47/k_diffusion/sampling.py#L51) 実装に基づいています。

## EDMEulerScheduler[[diffusers.EDMEulerScheduler]]

#### diffusers.EDMEulerScheduler[[diffusers.EDMEulerScheduler]]

```python
diffusers.EDMEulerScheduler(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', 'v_prediction'] = 'epsilon', rho: float = 7.0, final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero')
```

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

**パラメータ:**

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

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

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

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

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

prediction_type (`Literal["epsilon", "v_prediction"]`, *任意*、デフォルトは `"epsilon"`) : スケジューラ関数の予測タイプ。`"epsilon"` は拡散プロセスのノイズを予測し、`"v_prediction"` は [Imagen Video](https://huggingface.co/papers/2210.02303) 論文のセクション 2.4 を参照してください。

rho (`float`、*任意*、デフォルトは`7.0`) : Karras sigma スケジュールの計算に使用される rho パラメータです。EDM の論文 [1] では 7.0 に設定されています。

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

Karras et al. 2022 [1] に示された EDM 定式化における Euler スケジューラーを実装します。

[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.EDMEulerScheduler.add_noise]]

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

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

**パラメータ:**

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

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

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

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

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

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

#### index_for_timestep[[diffusers.EDMEulerScheduler.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/main/src/diffusers/schedulers/scheduling_edm_euler.py#L381)

**パラメータ:**

timestep (`float` または `torch.Tensor`) : スケジュール内で検索するタイムステップの値。

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

**戻り値:** `int`

スケジュールにおけるタイムステップのインデックスです。最初のステップでは、スケジュールの途中から開始する場合（画像から画像への生成など）にシグマをスキップすることを避けるため、複数の一致が存在する場合は2番目のインデックスを返します。

与えられたタイムステップのタイムステップスケジュールにおけるインデックスを特定します。

#### precondition_inputs[[diffusers.EDMEulerScheduler.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_euler.py#L177)

**パラメータ:**

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

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

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

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

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

#### precondition_noise[[diffusers.EDMEulerScheduler.precondition_noise]]

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

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

**パラメータ:**

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

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

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

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

#### precondition_outputs[[diffusers.EDMEulerScheduler.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_euler.py#L214)

**パラメータ:**

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

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

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

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

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

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

#### scale_model_input[[diffusers.EDMEulerScheduler.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_euler.py#L249)

**パラメータ:**

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

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

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

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

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

#### set_begin_index[[diffusers.EDMEulerScheduler.set_begin_index]]

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

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

**パラメータ:**

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

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

#### set_timesteps[[diffusers.EDMEulerScheduler.set_timesteps]]

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

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

**パラメータ:**

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

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

sigmas (`torch.Tensor | list[float]`, *任意*) : 去噪プロセスで使用されるカスタムシグマ。`num_inference_steps`が渡された場合のデフォルトの動作が使用されます。

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

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

```python
step(model_output: Tensor, timestep: typing.Union[float, torch.Tensor], sample: Tensor, s_churn: float = 0.0, s_tmin: float = 0.0, s_tmax: float = inf, s_noise: float = 1.0, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True, pred_original_sample: typing.Optional[torch.Tensor] = None)
```

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

**パラメータ:**

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

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

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

s_churn (`float`、*任意*、デフォルトは`0.0`) : 各ステップで加える確率的ノイズの量です。値が大きいほど、より多くのノイズが加えられます。

s_tmin (`float`、*任意*、デフォルトは`0.0`) : この閾値を下回る sigma にはノイズが追加されません。

s_tmax (`float`、*任意*、デフォルトは`float("inf")`) : この閾値を超えると、ノイズが追加されません。

s_noise (`float`、*任意*、デフォルトは`1.0`) : サンプルに追加されるノイズのスケール係数。

generator (`torch.Generator`, *任意*) : 再現性のために使用する乱数生成器。

return_dict (`bool`, *任意*, デフォルトは `True`) : [EDMEulerSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/edm_euler#diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput) を返すか、タプルを返すかを指定します。

pred_original_sample (`torch.Tensor`, *任意*) : 前回のステップからの予測されたノイズ除去済みサンプルです。指定された場合、再計算をスキップします。

**戻り値:** [EDMEulerSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/edm_euler#diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput) または `tuple`

`return_dict` が `True` の場合、[EDMEulerSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/edm_euler#diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput) が返され、それ以外の場合は、最初の要素が前回のサンプルテンソル、2番目の要素が予測された元のサンプルテンソルであるタプルが返されます。

前回のタイムステップからのサンプルを、SDEを逆方向に適用することで予測します。この関数は、学習済みモデルの出力（最もよく使われるのは予測ノイズ）から拡散過程を伝播させます。

## EDMEulerSchedulerOutput[[diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput]]

#### diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput[[diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput]]

```python
diffusers.schedulers.scheduling_edm_euler.EDMEulerSchedulerOutput(prev_sample: Tensor, pred_original_sample: typing.Optional[torch.Tensor] = None)
```

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

**パラメータ:**

prev_sample (`torch.Tensor`、画像の場合は `(batch_size, num_channels, height, width)` の形状) : 前のタイムステップの計算済みサンプル `(x_{t-1})`。`prev_sample` は、デノイジングループの次のモデル入力として使用する必要があります。

pred_original_sample (`torch.Tensor`、画像の場合は形状 `(batch_size, num_channels, height, width)`) : 現在のタイムステップにおけるモデルの出力に基づいて予測された、ノイズ除去されたサンプル `(x_{0})`。`pred_original_sample` は、進捗のプレビューやガイダンスに使用できます。

スケジューラの`step`関数の出力用のクラス。

