# CMStochasticIterativeScheduler

Yang Song, Prafulla Dhariwal, Mark Chen, Ilya Sutskever의 [Consistency Models](https://huggingface.co/papers/2303.01469)는 1단계 또는 소수의 단계로 고품질 샘플을 생성할 수 있는 multistep 및 onestep 스케줄러(Algorithm 1)를 소개했습니다.

해당 논문의 초록은 다음과 같습니다:

*Diffusion models은 이미지, 오디오 및 비디오 생성 분야에서 상당한 발전을 이루었지만, 느린 생성을 초래하는 반복적 샘플링 프로세스에 의존합니다. 이러한 한계를 극복하기 위해, 노이즈를 데이터로 직접 매핑하여 고품질 샘플을 생성하는 새로운 모델 계열인 consistency models를 제안합니다. 이들은 설계상 빠른 1단계 생성을 지원하면서도, 계산 비용을 샘플 품질과 교환할 수 있도록 다단계 샘플링을 허용합니다. 또한, 이러한 작업에 대한 명시적인 학습 없이도 이미지 inpainting, 컬러라이제이션, 초해상도와 같은 zero-shot 데이터 편집을 지원합니다. Consistency models는 사전 학습된 diffusion models를 증류하여 학습하거나, 완전히 독립적인 생성 모델로 학습할 수 있습니다. 광범위한 실험을 통해, 1단계 및 소수 단계 샘플링에서 기존 diffusion models 증류 기법보다 우수한 성능을 보이며, 1단계 생성에서 CIFAR-10의 FID 3.55와 ImageNet 64x64의 FID 6.20이라는 새로운 state-of-the-art를 달성함을 입증했습니다. 독립적으로 학습된 경우, consistency models는 CIFAR-10, ImageNet 64x64 및 LSUN 256x256과 같은 표준 벤치마크에서 기존 1단계, 비적대적 생성 모델보다 우수한 성능을 발휘할 수 있는 새로운 생성 모델 계열이 됩니다.*

원본 코드베이스는 [openai/consistency_models](https://github.com/openai/consistency_models)에서 찾을 수 있습니다.

## CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

#### diffusers.CMStochasticIterativeScheduler[[diffusers.CMStochasticIterativeScheduler]]

```python
diffusers.CMStochasticIterativeScheduler(num_train_timesteps: int = 40, sigma_min: float = 0.002, sigma_max: float = 80.0, sigma_data: float = 0.5, s_noise: float = 1.0, rho: float = 7.0, clip_denoised: bool = True)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L43)

**매개변수:**

num_train_timesteps (`int`, 기본값 40) : 모델을 학습할 때 사용할 diffusion step 수입니다.

sigma_min (`float`, 기본값 0.002) : sigma 스케줄의 최소 노이즈 크기입니다. 원래 구현에서와 같이 기본값은 0.002입니다.

sigma_max (`float`, 기본값 80.0) : 시그마 스케줄의 최대 노이즈 크기입니다. 원래 구현에서와 같이 기본값은 80.0입니다.

sigma_data (`float`, 기본값 0.5) : EDM [논문](https://huggingface.co/papers/2206.00364)에서 정의한 데이터 분포의 표준 편차입니다. 원래 구현과 동일하게 기본값은 0.5입니다.

s_noise (`float`, 기본값 1.0) : 샘플링 중 세부 정보 손실을 상쇄하기 위한 추가 노이즈의 양입니다. 적절한 범위는 [1.000, 1.011]입니다. 원래 구현에서 기본값은 1.0입니다.

rho (`float`, 기본값 7.0) : EDM [논문](https://huggingface.co/papers/2206.00364)에서 Karras sigma 스케줄을 계산하는 데 사용되는 매개변수. 원래 구현에서와 같이 기본값은 7.0입니다.

clip_denoised (`bool`, 기본값 `True`) : 노이즈 제거된 출력을 `(-1, 1)`로 클리핑할지 여부.

timesteps (`list` 또는 `np.ndarray` 또는 `torch.Tensor`, *선택 사항*) : 선택적으로 지정할 수 있는 명시적인 timestep 스케줄입니다. timesteps는 증가하는 순서로 제공되어야 합니다.

일관성 모델의 다단계 및 단일 단계 샘플링.

이 모델은 [SchedulerMixin](/docs/diffusers/main/ko/api/schedulers/overview#diffusers.SchedulerMixin)과 [ConfigMixin](/docs/diffusers/main/ko/api/configuration#diffusers.ConfigMixin)을 상속합니다. 로딩 및 저장과 같은 모든 스케줄러에 대해 라이브러리가 구현하는 일반적 메서드에 대해서는 상위 클래스 문서를 확인하세요.

#### add_noise[[diffusers.CMStochasticIterativeScheduler.add_noise]]

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

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L461)

**매개변수:**

original_samples (`torch.Tensor`) : 노이즈가 추가될 원래 샘플.

noise (`torch.Tensor`) : 원래 샘플에 추가할 노이즈 텐서.

timesteps (`torch.Tensor`) : 노이즈를 추가할 타임스텝으로, 스케줄에서 노이즈 레벨을 결정합니다.

**반환값:** `torch.Tensor`

timestep 스케줄에 따라 노이즈가 스케일링되어 추가된 노이즈 샘플.

지정된 timesteps의 noise schedule에 따라 원래 샘플에 노이즈를 추가합니다.

#### get_scalings[[diffusers.CMStochasticIterativeScheduler.get_scalings]]

```python
get_scalings(sigma: Tensor)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L276)

**매개변수:**

sigma (`torch.Tensor`) : 노이즈 스케줄의 현재 sigma 값.

**반환값:** `tuple[torch.Tensor, torch.Tensor]`

`c_skip`(입력 샘플의 스케일링)와 `c_out`(모델 출력의 스케일링)을 포함하는 튜플.

consistency model 출력을 위한 스케일링 계수를 계산합니다.

#### get_scalings_for_boundary_condition[[diffusers.CMStochasticIterativeScheduler.get_scalings_for_boundary_condition]]

```python
get_scalings_for_boundary_condition(sigma: Tensor)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L294)

**매개변수:**

sigma (`torch.Tensor`) : Karras sigma 스케줄의 현재 sigma 값.

**반환값:** `tuple[torch.Tensor, torch.Tensor]`

`c_skip`(현재 샘플의 가중치를 결정)가 첫 번째 요소이고 `c_out`(consistency model 출력의 가중치를 결정)이 두 번째 요소인 2개 요소의 tuple입니다.

[논문](https://huggingface.co/papers/2303.01469) 부록 C의 consistency model parameterization에서 경계 조건을 강제하기 위해 사용되는 scalings를 가져옵니다.

> [!TIP] > `c_skip` 및 `c_out` 공식에서 `epsilon`은 `sigma_min`으로 설정됩니다.

#### index_for_timestep[[diffusers.CMStochasticIterativeScheduler.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_consistency_models.py#L318)

**매개변수:**

timestep (`float` 또는 `torch.Tensor`) : 스케줄에서 찾을 타임스텝 값.

schedule_timesteps (`torch.Tensor`, *선택 사항*) : 검색할 timestep schedule입니다. `None`인 경우 `self.timesteps`를 사용합니다.

**반환값:** `int`

스케줄에서 timestep의 인덱스입니다. 가장 첫 번째 단계의 경우, 스케줄 중간에서 시작할 때(예: image-to-image) sigma를 건너뛰지 않도록 여러 매치가 존재하면 두 번째 인덱스를 반환합니다.

…

#### scale_model_input[[diffusers.CMStochasticIterativeScheduler.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_consistency_models.py#L136)

**매개변수:**

sample (`torch.Tensor`) : 입력 샘플.

timestep (`float` 또는 `torch.Tensor`) : diffusion chain의 현재 timestep.

**반환값:** `torch.Tensor`

스케일된 입력 샘플.

일관성 모델 입력을 `(sigma**2 + sigma_data**2) ** 0.5`로 스케일링합니다.

#### set_begin_index[[diffusers.CMStochasticIterativeScheduler.set_begin_index]]

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

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L126)

**매개변수:**

begin_index (`int`, 기본값 `0`) : 스케줄러의 시작 인덱스입니다.

… 스케줄러의 시작 인덱스를 설정합니다. 이 함수는 추론 전에 파이프라인에서 실행해야 합니다.

#### set_timesteps[[diffusers.CMStochasticIterativeScheduler.set_timesteps]]

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

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L180)

**매개변수:**

num_inference_steps (`int`, *선택 사항*) : 사전 학습된 모델로 샘플을 생성할 때 사용되는 확산 단계 수입니다.

device (`str` 또는 `torch.device`, *선택 사항*) : timesteps를 이동할 대상 device입니다. `None`인 경우 timesteps는 이동되지 않습니다.

timesteps (`list[int]`, *선택 사항*) : timestep 간 임의의 간격을 지원하기 위해 사용되는 사용자 지정 timestep입니다. `None`인 경우, timestep 간 균등 간격이라는 기본 timestep 간격 전략이 사용됩니다. `timesteps`가 전달되면 `num_inference_steps`는 `None`이어야 합니다.

추론 실행 전에 실행할 diffusion chain에 사용할 timesteps를 설정합니다.

#### sigma_to_t[[diffusers.CMStochasticIterativeScheduler.sigma_to_t]]

```python
sigma_to_t(sigmas: float | numpy.ndarray)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L161)

**매개변수:**

sigmas (`float` 또는 `np.ndarray`) : 단일 Karras sigma 또는 Karras sigmas 배열.

**반환값:** `np.ndarray`

스케일된 입력 타임스텝 배열.

일관성 모델 입력을 위한 Karras sigmas에서 스케일된 timesteps를 가져옵니다.

#### step[[diffusers.CMStochasticIterativeScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[float, 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_consistency_models.py#L364)

**매개변수:**

model_output (`torch.Tensor`) : 학습된 diffusion 모델의 직접적인 출력입니다.

timestep (`float` 또는 `torch.Tensor`) : diffusion chain의 현재 timestep.

sample (`torch.Tensor`) : 확산 과정에서 생성된 샘플의 현재 인스턴스.

generator (`torch.Generator`, *선택 사항*) : 난수 생성기입니다.

return_dict (`bool`, 기본값 `True`) : [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) 또는 `tuple`을 반환할지 여부.

**반환값:** [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) 또는 `tuple`

return_dict가 `True`인 경우 [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput)이 반환되고, 그렇지 않으면 첫 번째 요소가 샘플 텐서인 튜플이 반환됩니다.

이전 시간 단계의 샘플을 SDE를 역방향으로 적용하여 예측합니다. 이 함수는 학습된 모델의 출력(대부분 예측된 노이즈)으로부터 확산 과정을 전파합니다.

## CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

#### diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput[[diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput]]

```python
diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput(prev_sample: Tensor)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L30)

**매개변수:**

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

스케줄러의 `step` 함수에 대한 출력 클래스입니다.

