# 스케줄러

🤗 Diffusers는 확산 과정에 사용할 수 있는 다양한 스케줄러 함수를 제공합니다. 스케줄러는 모델의 출력(확산 과정이 반복적으로 처리하는 샘플)과 타임스텝을 받아 노이즈가 제거된 샘플을 반환합니다. 타임스텝은 확산 과정에서 해당 단계가 어디에 위치하는지를 결정하므로 중요합니다. 데이터는 *n*개의 타임스텝을 순방향으로 반복하여 생성되고, 추론은 타임스텝을 역방향으로 전파하여 수행됩니다. 타임스텝에 따라 스케줄러는 *discrete*일 수 있으며, 이 경우 타임스텝은 `int`입니다. 또는 *continuous*일 수 있으며, 이 경우 타임스텝은 `float`입니다.

컨텍스트에 따라 스케줄러는 이미지에 노이즈를 반복적으로 추가하는 방법 또는 모델의 출력을 기반으로 샘플을 업데이트하는 방법을 정의합니다:

- *training* 동안 스케줄러는 샘플에 노이즈를 추가하여(노이즈를 추가하는 방식에 따라 다양한 알고리즘이 존재합니다) diffusion 모델을 학습시킵니다
- *추론* 중에 스케줄러는 사전 학습된 모델의 출력을 기반으로 샘플을 업데이트하는 방식을 정의합니다

[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/ko/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     |                                                                                                               |
| DPM++ 2M Karras     | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | `use_karras_sigmas=True`로 초기화                                                                            |
| DPM++ 2M SDE        | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | `algorithm_type="sde-dpmsolver++"`로 초기화                                                                  |
| DPM++ 2M SDE Karras | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ko/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/ko/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    |                                                                                                               |
| DPM++ SDE Karras    | [DPMSolverSinglestepScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    | `use_karras_sigmas=True`로 초기화                                                                            |
| DPM2                | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          |                                                                                                               |
| DPM2 Karras         | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          | `use_karras_sigmas=True`로 초기화                                                                            |
| DPM2 a              | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) |                                                                                                               |
| DPM2 a Karras       | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ko/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/ko/api/schedulers/euler#diffusers.EulerDiscreteScheduler)          |                                                                                                               |
| Euler a             | [EulerAncestralDiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) |                                                                                                               |
| Heun                | [HeunDiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/heun#diffusers.HeunDiscreteScheduler)           |                                                                                                               |
| LMS                 | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            |                                                                                                               |
| LMS Karras          | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            | `use_karras_sigmas=True`로 초기화                                                                            |
| N/A                 | [DEISMultistepScheduler](/docs/diffusers/v0.43.0/ko/api/schedulers/deis#diffusers.DEISMultistepScheduler)          |                                                                                                               |
| N/A                 | [UniPCMultistepScheduler](/docs/diffusers/v0.43.0/ko/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/ko/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/ko/api/schedulers/overview#diffusers.SchedulerMixin)에는 모든 스케줄러에서 공유하는 일반적인 로딩 및 저장 기능과 같은 공통 함수가 포함되어 있습니다.

[ConfigMixin](/docs/diffusers/v0.43.0/ko/api/configuration#diffusers.ConfigMixin)은 스케줄러의 `__init__` 함수에 전달되는 구성 속성(예: `num_train_timesteps`)을 저장하는 역할을 하며, 해당 속성은 `scheduler.config.num_train_timesteps`을 통해 접근할 수 있습니다.

클래스 속성:
- **_compatibles** (`list[str]`) -- 상위 스케줄러 클래스와 호환되는 스케줄러 클래스 목록입니다. [from_config()](/docs/diffusers/v0.43.0/ko/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에 호스팅된 사전 학습 모델의 *모델 ID* 문자열(예: `google/ddpm-celebahq-256`). - [save_pretrained()](/docs/diffusers/v0.43.0/ko/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 bearer 인증으로 사용할 토큰입니다. `True`인 경우, `diffusers-cli login`에서 생성된 토큰(`~/.huggingface`에 저장됨)이 사용됩니다.

revision (`str`, *선택 사항*, 기본값 `"main"`) : 사용할 특정 모델 버전입니다. Git에서 허용하는 브랜치 이름, 태그 이름, 커밋 ID 또는 기타 식별자일 수 있습니다.

**반환값:** [SchedulerMixin](/docs/diffusers/v0.43.0/ko/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`을(를) 통해 수행할 수 있습니다. 또한 방화벽이 있는 환경에서 이 방법을 사용하려면 특수한 ["오프라인 모드"](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/ko/api/schedulers/overview#diffusers.utils.PushToHubMixin.push_to_hub) 메서드에 함께 전달되는 추가 키워드 인자입니다.

Save a scheduler configuration object to a directory so that it can be reloaded using the [from_pretrained()](/docs/diffusers/v0.43.0/ko/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained) class method.

## 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`, 이미지인 경우 shape는 `(batch_size, num_channels, height, width)`) : 이전 timestep의 계산된 샘플 `(x_{t-1})`. `prev_sample`은 denoising 루프에서 다음 모델 입력으로 사용해야 합니다.

스케줄러의 `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 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")
```

