# スケジューラー

🤗 Diffusers は、拡散プロセスのための多くのスケジューラ関数を提供しています。スケジューラは、モデルの出力（拡散プロセスが反復処理しているサンプル）とタイムステップを受け取り、ノイズ除去されたサンプルを返します。タイムステップは、拡散プロセス内のどの位置でそのステップが行われるかを決定するため重要です。データは *n* 個のタイムステップを前方に反復することで生成され、推論はタイムステップを後方へ伝播させることで行われます。タイムステップに基づいて、スケジューラは *discrete*（この場合、タイムステップは `int`）または *continuous*（この場合、タイムステップは `float`）のいずれかになります。

コンテキストに応じて、スケジューラは画像に反復的にノイズを追加する方法、またはモデルの出力に基づいてサンプルを更新する方法を定義します。

- *学習*中、スケジューラーはサンプルにノイズを追加して拡散モデルを学習します（ノイズの追加方法にはさまざまなアルゴリズムがあります）。
- *推論*時、スケジューラは事前学習済みモデルの出力に基づいてサンプルを更新する方法を定義します。

[k-diffusion](https://github.com/crowsonkb/k-diffusion) ライブラリによって実装された多くのスケジューラーは、[Katherine Crowson](https://github.com/crowsonkb/) 氏によって開発され、A1111 でも広く使用されています。k-diffusion および A1111 のスケジューラーを 🤗 Diffusers のスケジューラーに対応させるために、以下の表をご覧ください。

| A1111/k-diffusion    | 🤗 Diffusers                         | 使用方法                                                                                                         |
|---------------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------|
| DPM++ 2M            | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     |                                                                                                               |
| DPM++ 2M Karras     | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | `use_karras_sigmas=True` で初期化                                                                            |
| DPM++ 2M SDE        | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | `algorithm_type="sde-dpmsolver++"` で初期化                                                                  |
| DPM++ 2M SDE Karras | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | `use_karras_sigmas=True` および `algorithm_type="sde-dpmsolver++"` で初期化します                                     |
| DPM++ 2S a          | N/A                                 | `DPMSolverSinglestepScheduler` と非常に似ています                         |
| DPM++ 2S a Karras   | N/A                                 | `DPMSolverSinglestepScheduler(use_karras_sigmas=True, ...)` と非常に似ています |
| DPM++ SDE           | [DPMSolverSinglestepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    |                                                                                                               |
| DPM++ SDE Karras    | [DPMSolverSinglestepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    | `use_karras_sigmas=True` で初期化                                                                            |
| DPM2                | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          |                                                                                                               |
| DPM2 Karras         | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          | `use_karras_sigmas=True` で初期化                                                                            |
| DPM2 a              | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) |                                                                                                               |
| DPM2 a Karras       | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) | `use_karras_sigmas=True` で初期化                                                                            |
| DPM 適応        | N/A                                 |                                                                                                               |
| DPM fast            | N/A                                 |                                                                                                               |
| Euler               | [EulerDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/euler#diffusers.EulerDiscreteScheduler)          |                                                                                                               |
| Euler a             | [EulerAncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) |                                                                                                               |
| Heun                | [HeunDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/heun#diffusers.HeunDiscreteScheduler)           |                                                                                                               |
| LMS                 | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            |                                                                                                               |
| LMS Karras          | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            | `use_karras_sigmas=True` で初期化                                                                            |
| N/A                 | [DEISMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/deis#diffusers.DEISMultistepScheduler)          |                                                                                                               |
| N/A                 | [UniPCMultistepScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)         |                                                                                                               |

## ノイズスケジュールとスケジュールの種類
| A1111/k-diffusion        | 🤗 Diffusers                                                               |
|--------------------------|----------------------------------------------------------------------------|
| Karras                   | `use_karras_sigmas=True` で初期化                                         |
| sgm_uniform              | `timestep_spacing="trailing"` で初期化                                    |
| シンプル                   | `timestep_spacing="trailing"` で初期化                                    |
| 指数              | `timestep_spacing="linspace"`、`use_exponential_sigmas=True` で初期化します     |
| beta                     | `timestep_spacing="linspace"`、`use_beta_sigmas=True` で初期化します            |

すべてのスケジューラーは、すべてのスケジューラーで共有される低レベルのユーティリティを実装するベースクラスである [SchedulerMixin](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin) から構築されています。

## SchedulerMixin[[diffusers.SchedulerMixin]]

#### diffusers.SchedulerMixin[[diffusers.SchedulerMixin]]

```python
diffusers.SchedulerMixin()
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L79)

すべてのスケジューラの基底クラス。

[SchedulerMixin](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin) には、すべてのスケジューラーで共有される一般的な機能、例えば読み込みや保存などの共通関数が含まれています。

[ConfigMixin](/docs/diffusers/v0.43.0/ja/api/configuration#diffusers.ConfigMixin)は、スケジューラの`__init__`関数に渡される設定属性（`num_train_timesteps`など）の保存を管理し、これらの属性は`scheduler.config.num_train_timesteps`によってアクセスできます。

クラス属性:
- **_compatibles** (`list[str]`) -- 親スケジューラクラスと互換性のあるスケジューラクラスのリストです。別の互換性のあるスケジューラクラスを読み込むには [from_config()](/docs/diffusers/v0.43.0/ja/api/configuration#diffusers.ConfigMixin.from_config) を使用します（親クラスでオーバーライドされるべきです）。

#### from_pretrained[[diffusers.SchedulerMixin.from_pretrained]]

```python
from_pretrained(pretrained_model_name_or_path: str | os.PathLike | None = None, subfolder: str | None = None, return_unused_kwargs: bool = False, **kwargs: Any)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L99)

**パラメータ:**

pretrained_model_name_or_path (`str` または `os.PathLike`、*省略可能*) : 以下のいずれかです:  - Hub にホストされている事前学習済みモデルの *model id*（例: `google/ddpm-celebahq-256`）を表す文字列。 - [save_pretrained()](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained) で保存されたスケジューラの設定を含む *ディレクトリ*（例: `./my_model_directory`）へのパス。

subfolder (`str`, *省略可*) : Hub上のモデルリポジトリ全体、またはローカル環境における、モデルファイルのサブフォルダの場所。

return_unused_kwargs (`bool`, *任意*, デフォルトは `False`) : Python クラスによって消費されない kwargs を返すかどうかを指定します。

cache_dir (`str` または `os.PathLike`、*任意*) : 標準のキャッシュを使用しない場合、ダウンロードした事前学習済みモデルの設定がキャッシュされるディレクトリのパス。

force_download (`bool`, *任意*, デフォルトは `False`) : モデルの重みと設定ファイルの(再)ダウンロードを強制するかどうか。キャッシュされたバージョンが存在する場合でも、それを上書きします。

proxies (`dict[str, str]`、*省略可*) : プロトコルまたはエンドポイントごとに使用するプロキシサーバーの辞書です。例えば、`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}` のように指定します。これらのプロキシは、各リクエストで使用されます。

output_loading_info (`bool`、*任意*、デフォルトは`False`) : 欠落キー、予期しないキー、エラーメッセージを含む辞列も返すかどうかを指定します。

local_files_only (`bool`、*任意*、デフォルトは`False`) : ローカルのモデルの重みと設定ファイルのみを読み込むかどうかを指定します。`True`に設定すると、モデルは Hub からダウンロードされません。

token (`str` または `bool`、*省略可能*) : リモートファイルの HTTP ベアラ認証に使用するトークンです。`True` の場合、`diffusers-cli login` で生成されたトークン（`~/.huggingface` に保存）が使用されます。

revision (`str`、*任意*、デフォルトは`"main"`) : 使用する特定のモデルバージョンです。ブランチ名、タグ名、コミット ID、または Git で許可されている任意の識別子を使用できます。

**戻り値:** [SchedulerMixin](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin) または `tuple[SchedulerMixin, dict[str, Any]]`

設定からインスタンス化されたスケジューラ。`return_unused_kwargs`が`True`の場合、未使用のキーワード引数の辞書が第2要素であるタプルが返されます。

ローカルディレクトリまたは Hub リポジトリにある事前定義済みの JSON 設定ファイルから、スケジューラーをインスタンス化します。

> [!TIP] > プライベートモデルや[ゲート付きモデル](https://huggingface.co/docs/hub/models-gated#gated-models)を使用するには、ログインしてください
`hf > auth login` を使用します。また、ファイアウォールが設定された環境でこの方法を使用するために、特別な ["offline-mode"](https://huggingface.co/diffusers/installation.html#offline-mode) を有効にすることもできます。

#### save_pretrained[[diffusers.SchedulerMixin.save_pretrained]]

```python
save_pretrained(save_directory: str | os.PathLike, push_to_hub: bool = False, **kwargs: Any)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L164)

**パラメータ:**

save_directory (`str` または `os.PathLike`) : 設定 JSON ファイルを保存するディレクトリ（存在しない場合は作成されます）。

push_to_hub (`bool`、*任意*、デフォルトは`False`) : モデルを保存した後に Hugging Face Hub にプッシュするかどうかを指定します。`repo_id` でプッシュ先のリポジトリを指定できます（指定しない場合、`save_directory` の名前があなたのネームスペース内でデフォルトとして使用されます）。

kwargs (`dict[str, Any]`、*省略可*) : [push_to_hub()](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.utils.PushToHubMixin.push_to_hub) メソッドに渡される追加のキーワード引数。

スケジューラの設定オブジェクトをディレクトリに保存し、[from_pretrained()](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained)クラスメソッドを使って再読み込みできるようにします。

## 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/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L66)

**パラメータ:**

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

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

## KarrasDiffusionSchedulers

`KarrasDiffusionSchedulers` は、🤗 Diffusers のスケジューラーの広範な一般化です。このクラスのスケジューラーは、ノイズサンプリング戦略、ネットワークの種類とスケーリング、学習戦略、および損失の重み付け方法によって、高レベルで区別されます。

このクラスに含まれる各種スケジューラは、常微分方程式（ODE）ソルバの種類に応じて、上記の分類体系に属し、🤗 Diffusers に実装されている主要なスケジューラの設計において優れた抽象化を提供します。このクラスのスケジューラは[こちら](https://github.com/huggingface/diffusers/blob/a69754bb879ed55b9b6dc9dd0b3cf4fa4124c765/src/diffusers/schedulers/scheduling_utils.py#L32)で確認できます。

## PushToHubMixin[[diffusers.utils.PushToHubMixin]]

#### diffusers.utils.PushToHubMixin[[diffusers.utils.PushToHubMixin]]

```python
diffusers.utils.PushToHubMixin()
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/utils/hub_utils.py#L491)

Hugging Face Hub にモデル、スケジューラ、またはパイプラインをプッシュするための Mixin。

#### push_to_hub[[diffusers.utils.PushToHubMixin.push_to_hub]]

```python
push_to_hub(repo_id: str, commit_message: str | None = None, private: bool | None = None, token: str | None = None, create_pr: bool = False, safe_serialization: bool = True, variant: str | None = None, subfolder: str | None = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/utils/hub_utils.py#L526)

**パラメータ:**

repo_id (`str`) : モデル、スケジューラ、またはパイプラインのファイルをプッシュするリポジトリの名前です。組織にプッシュする場合は、組織名を含める必要があります。`repo_id` はローカルディレクトリへのパス也可以是。

commit_message (`str`, *任意*) : push 時にコミットするメッセージ。デフォルトは `"Upload {object}"` です。

private (`bool`, *任意*) : リポジトリを非公開にするかどうか。`None`（デフォルト）の場合、組織のデフォルトが非公開でない限り、リポジトリは公開になります。リポジトリが既に存在する場合、この値は無視されます。

token (`str`, *任意*) : リモートファイルの HTTP ベアラ認証に使用するトークン。`hf auth login` を実行した際に生成されるトークン（`~/.huggingface` に保存されます）。

create_pr (`bool`, *任意*, デフォルトは `False`) : アップロードしたファイルを含む PR を作成するか、直接コミットするかどうかを指定します。

safe_serialization (`bool`、*任意*、デフォルトは `True`) : モデルの重みを `safetensors` 形式に変換するかどうか。

variant (`str`, *任意*) : 指定した場合、重みは`pytorch_model.<variant>.bin`の形式で保存されます。

モデル、スケジューラー、またはパイプラインのファイルを🤗 Hugging Face Hubにアップロードします。

例:

```python
from diffusers import UNet2DConditionModel

unet = UNet2DConditionModel.from_pretrained("stabilityai/stable-diffusion-2", subfolder="unet")

# Push the `unet` to your namespace with the name "my-finetuned-unet".
unet.push_to_hub("my-finetuned-unet")

# Push the `unet` to an organization with the name "my-finetuned-unet".
unet.push_to_hub("your-org/my-finetuned-unet")
```

