# 调度器

🤗 Diffusers 为扩散过程提供了许多调度器函数。调度器接收模型的输出（即扩散过程正在迭代的样本）和一个时间步，并返回一个去噪后的样本。时间步至关重要，因为它决定了当前步骤在扩散过程中的位置：数据通过向前迭代 *n* 个时间步来生成，而推理则通过沿时间步向后传播来实现。根据时间步的类型，调度器可以是 *离散* 的，此时时间步为 `int`；也可以是 *连续* 的，此时时间步为 `float`。

根据上下文的不同，调度器定义了如何迭代地为图像添加噪声，或如何基于模型的输出来更新样本：

- 在*训练*过程中，调度器会向样本添加噪声（添加噪声有不同的算法），以训练扩散模型。
- 在*推理*期间，调度器定义了如何根据预训练模型的输出来更新样本。

许多调度器由 [Katherine Crowson](https://github.com/crowsonkb/) 的 [k-diffusion](https://github.com/crowsonkb/k-diffusion) 库实现，并且它们也在 A1111 中被广泛使用。为了帮助您将 k-diffusion 和 A1111 中的调度器映射到 🤗 Diffusers 中的调度器，请查看下表：

| A1111/k-diffusion    | 🤗 Diffusers                         | 用法                                                                                                         |
|---------------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------|
| DPM++ 2M            | [DPMSolverMultistepScheduler](/docs/diffusers/main/zh/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     |                                                                                                               |
| DPM++ 2M Karras     | [DPMSolverMultistepScheduler](/docs/diffusers/main/zh/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | 使用 `use_karras_sigmas=True` 进行初始化                                                                            |
| DPM++ 2M SDE        | [DPMSolverMultistepScheduler](/docs/diffusers/main/zh/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | 使用 `algorithm_type="sde-dpmsolver++"` 进行初始化                                                                  |
| DPM++ 2M SDE Karras | [DPMSolverMultistepScheduler](/docs/diffusers/main/zh/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/main/zh/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    |                                                                                                               |
| DPM++ SDE Karras    | [DPMSolverSinglestepScheduler](/docs/diffusers/main/zh/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    | 使用 `use_karras_sigmas=True` 进行初始化                                                                            |
| DPM2                | [KDPM2DiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          |                                                                                                               |
| DPM2 Karras         | [KDPM2DiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          | 使用 `use_karras_sigmas=True` 进行初始化                                                                            |
| DPM2 a              | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) |                                                                                                               |
| DPM2 a Karras       | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) | 使用 `use_karras_sigmas=True` 进行初始化                                                                            |
| DPM 自适应        | N/A                                 |                                                                                                               |
| DPM 快速            | N/A                                 |                                                                                                               |
| Euler               | [EulerDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/euler#diffusers.EulerDiscreteScheduler)          |                                                                                                               |
| Euler a             | [EulerAncestralDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) |                                                                                                               |
| Heun                | [HeunDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/heun#diffusers.HeunDiscreteScheduler)           |                                                                                                               |
| LMS                 | [LMSDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            |                                                                                                               |
| LMS Karras          | [LMSDiscreteScheduler](/docs/diffusers/main/zh/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            | 使用 `use_karras_sigmas=True` 进行初始化                                                                            |
| N/A                 | [DEISMultistepScheduler](/docs/diffusers/main/zh/api/schedulers/deis#diffusers.DEISMultistepScheduler)          |                                                                                                               |
| N/A                 | [UniPCMultistepScheduler](/docs/diffusers/main/zh/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/main/zh/api/schedulers/overview#diffusers.SchedulerMixin) 基类构建，该基类实现了所有调度器共用的底层实用工具。

## SchedulerMixin[[diffusers.SchedulerMixin]]

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

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

[源代码](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_utils.py#L79)

所有调度器的基类。

[SchedulerMixin](/docs/diffusers/main/zh/api/schedulers/overview#diffusers.SchedulerMixin) 包含所有调度器共用的通用函数，例如通用的加载和保存功能。

[ConfigMixin](/docs/diffusers/main/zh/api/configuration#diffusers.ConfigMixin) 负责存储传递给调度器 `__init__` 函数的配置属性（例如 `num_train_timesteps`），这些属性可以通过 `scheduler.config.num_train_timesteps` 进行访问。

类属性：
- **_compatibles** (`list[str]`) -- 与父调度器类兼容的调度器类列表。使用 [from_config()](/docs/diffusers/main/zh/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/main/src/diffusers/schedulers/scheduling_utils.py#L99)

**参数：**

pretrained_model_name_or_path (`str` 或 `os.PathLike`，*可选*) : 可以是以下之一： - 一个字符串，即托管在 Hub 上的预训练模型的 *model id*（例如 `google/ddpm-celebahq-256`）。 - 一个 *目录* 的路径（例如 `./my_model_directory`），其中包含使用 [save_pretrained()](/docs/diffusers/main/zh/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained) 保存的调度器配置。

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/main/zh/api/schedulers/overview#diffusers.SchedulerMixin) 或 `tuple[SchedulerMixin, dict[str, Any]]`

从配置实例化的调度器。如果 `return_unused_kwargs` 为 `True`，则返回一个元组，其中第二个元素是一个包含未使用关键字参数的字典。

从本地目录或 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/main/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/main/zh/api/schedulers/overview#diffusers.utils.PushToHubMixin.push_to_hub) 方法的额外关键字参数。

将调度器配置对象保存到目录中，以便使用 [from_pretrained()](/docs/diffusers/main/zh/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/main/src/diffusers/schedulers/scheduling_utils.py#L66)

**参数：**

prev_sample （对于图像，形状为 `(batch_size, num_channels, height, width)` 的 `torch.Tensor`）：计算得到的前一时间步的样本 `(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/main/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/main/src/diffusers/utils/hub_utils.py#L526)

**参数：**

repo_id (`str`) : 要推送模型、调度器或流水线文件的目标仓库名称。推送到组织时，应包含组织名称。`repo_id` 也可以是本地目录的路径。

commit_message (`str`, *可选*) : 推送时提交的说明信息。默认为 `"Upload {object}"`。

private (`bool`，*可选*)：是否将仓库设为私有。如果为 `None`（默认值），除非组织的默认设置为私有，否则仓库将是公开的。如果仓库已存在，则忽略此值。

token (`str`, *可选*) : 用于远程文件的 HTTP bearer 授权令牌。该令牌是在运行 `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")
```

