# CMStochasticIterativeScheduler

[Consistency Models](https://huggingface.co/papers/2303.01469) của Yang Song, Prafulla Dhariwal, Mark Chen và Ilya Sutskever đã giới thiệu một trình lập lịch đa bước và một bước (Algorithm 1) có khả năng tạo ra các mẫu tốt chỉ trong một hoặc một số lượng nhỏ các bước.

Tóm tắt từ bài báo là:

*Các mô hình khuếch tán đã thúc đẩy đáng kể các lĩnh vực tạo hình ảnh, âm thanh và video, nhưng chúng phụ thuộc vào quá trình lấy mẫu lặp lại, dẫn đến tốc độ tạo chậm. Để khắc phục hạn chế này, chúng tôi đề xuất các mô hình nhất quán (consistency models), một họ mô hình mới tạo ra các mẫu chất lượng cao bằng cách ánh xạ trực tiếp từ nhiễu sang dữ liệu. Chúng hỗ trợ tạo mẫu một bước nhanh chóng theo thiết kế, đồng thời vẫn cho phép lấy mẫu nhiều bước để đánh đổi giữa chi phí tính toán và chất lượng mẫu. Chúng cũng hỗ trợ chỉnh sửa dữ liệu zero-shot, chẳng hạn như inpainting hình ảnh, tô màu và siêu phân giải, mà không cần huấn luyện rõ ràng trên các tác vụ này. Mô hình nhất quán có thể được huấn luyện bằng cách chưng cất (distill) các mô hình khuếch tán đã huấn luyện trước, hoặc như các mô hình tạo độc lập hoàn toàn. Thông qua các thí nghiệm rộng rãi, chúng tôi chứng minh rằng chúng vượt trội hơn các kỹ thuật chưng cất hiện có cho mô hình khuếch tán trong lấy mẫu một bước và ít bước, đạt được FID mới là 3.55 trên CIFAR-10 và 6.20 trên ImageNet 64x64 cho tạo mẫu một bước. Khi được huấn luyện độc lập, mô hình nhất quán trở thành một họ mô hình tạo mới có thể vượt trội hơn các mô hình tạo một bước, không đối kháng hiện có trên các benchmark tiêu chuẩn như CIFAR-10, ImageNet 64x64 và LSUN 256x256.*

Mã nguồn gốc có thể được tìm thấy tại [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)
```

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

**Tham số:**

num_train_timesteps (`int`, mặc định là 40) : Số bước khuếch tán để huấn luyện mô hình.

sigma_min (`float`, mặc định là 0.002) : Độ lớn nhiễu tối thiểu trong lịch sigma. Mặc định là 0.002 từ bản triển khai gốc.

sigma_max (`float`, mặc định là 80.0) : Độ lớn nhiễu tối đa trong lịch sigma. Mặc định là 80.0 từ bản triển khai gốc.

sigma_data (`float`, mặc định là 0.5) : Độ lệch chuẩn của phân phối dữ liệu từ [bài báo](https://huggingface.co/papers/2206.00364) EDM. Mặc định là 0.5 từ bản triển khai gốc.

s_noise (`float`, mặc định là 1.0) : Lượng nhiễu bổ sung để bù đắp cho việc mất chi tiết trong quá trình lấy mẫu. Khoảng hợp lý là [1.000, 1.011]. Mặc định là 1.0 từ bản triển khai gốc.

rho (`float`, mặc định là 7.0) : Tham số để tính lịch sigma Karras từ [bài báo](https://huggingface.co/papers/2206.00364) EDM. Mặc định là 7.0 từ bản triển khai gốc.

clip_denoised (`bool`, mặc định là `True`) : Có nên cắt các đầu ra khử nhiễu trong khoảng `(-1, 1)` hay không.

timesteps (`list` hoặc `np.ndarray` hoặc `torch.Tensor`, *tùy chọn*) : Một lịch trình bước thời gian (timestep) rõ ràng, có thể được chỉ định tùy chọn. Các bước thời gian được kỳ vọng là theo thứ tự tăng dần.

Mẫu nhiều bước và mẫu một bước cho các mô hình nhất quán.

Mô hình này kế thừa từ [SchedulerMixin](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin) và [ConfigMixin](/docs/diffusers/main/vi/api/configuration#diffusers.ConfigMixin). Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các scheduler, chẳng hạn như tải và lưu.

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

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

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

**Tham số:**

original_samples (`torch.Tensor`) : Các mẫu gốc mà nhiễu sẽ được thêm vào.

noise (`torch.Tensor`) : Tensor nhiễu cần thêm vào các mẫu gốc.

timesteps (`torch.Tensor`) : Các bước thời gian (timesteps) để thêm nhiễu, xác định mức nhiễu từ lịch trình (schedule).

**Trả về:** `torch.Tensor`

Các mẫu nhiễu với nhiễu được thêm vào, được điều chỉnh theo lịch trình bước thời gian.

Thêm nhiễu vào các mẫu gốc theo lịch trình nhiễu tại các bước thời gian được chỉ định.

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

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

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

**Tham số:**

sigma (`torch.Tensor`) : Giá trị sigma hiện tại trong lịch trình nhiễu.

**Trả về:** `tuple[torch.Tensor, torch.Tensor]`

Một tuple chứa `c_skip` (thang đo cho mẫu đầu vào) và `c_out` (thang đo cho đầu ra của mô hình).

Tính các hệ số tỷ lệ cho đầu ra của mô hình nhất quán.

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

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

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

**Tham số:**

sigma (`torch.Tensor`) : sigma hiện tại trong lịch trình sigma Karras.

**Trả về:** `tuple[torch.Tensor, torch.Tensor]`

Một tuple hai phần tử trong đó `c_skip` (định trọng số cho mẫu hiện tại) là phần tử đầu tiên và `c_out` (định trọng số cho đầu ra của mô hình nhất quán) là phần tử thứ hai.

Lấy các hệ số tỷ lệ được sử dụng trong tham số hóa mô hình nhất quán (từ Phụ lục C của [bài báo](https://huggingface.co/papers/2303.01469)) để áp đặt điều kiện biên.

> [!TIP] > `epsilon` trong các phương trình cho `c_skip` và `c_out` được đặt bằng `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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L318)

**Tham số:**

timestep (`float` hoặc `torch.Tensor`) : Giá trị bước thời gian cần tìm trong lịch trình.

schedule_timesteps (`torch.Tensor`, *tùy chọn*) : Lịch trình bước thời gian để tìm kiếm. Nếu là `None`, sẽ sử dụng `self.timesteps`.

**Trả về:** `int`

Chỉ số của bước thời gian trong lịch trình. Đối với bước đầu tiên, trả về chỉ số thứ hai nếu có nhiều kết quả khớp để tránh bỏ qua một sigma khi bắt đầu giữa lịch trình (ví dụ: cho image-to-image).

Tìm chỉ số của một bước thời gian (timestep) cho trước trong lịch trình bước thời gian.

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

```python
scale_model_input(sample: Tensor, timestep: typing.Union[float, torch.Tensor])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L136)

**Tham số:**

sample (`torch.Tensor`) : Mẫu đầu vào.

timestep (`float` hoặc `torch.Tensor`) : Bước thời gian hiện tại trong chuỗi khuếch tán.

**Trả về:** `torch.Tensor`

Một mẫu đầu vào đã được chuẩn hóa.

Thang đo đầu vào của mô hình nhất quán bằng `(sigma**2 + sigma_data**2) ** 0.5`.

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

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

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

**Tham số:**

begin_index (`int`, mặc định là `0`) : Chỉ số bắt đầu cho trình lập lịch.

Đặt chỉ số bắt đầu cho trình lập lịch. Hàm này nên được chạy từ pipeline trước khi suy luận.

#### 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)
```

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

**Tham số:**

num_inference_steps (`int`, *tuỳ chọn*) : Số bước khuếch tán được sử dụng khi tạo mẫu bằng một mô hình đã được huấn luyện trước.

device (`str` hoặc `torch.device`, *tuỳ chọn*) : Thiết bị mà các bước thời gian (timesteps) sẽ được chuyển đến. Nếu là `None`, các bước thời gian sẽ không được chuyển.

timesteps (`list[int]`, *optional*) : Các bước thời gian tùy chỉnh được sử dụng để hỗ trợ khoảng cách tùy ý giữa các bước thời gian. Nếu là `None`, chiến lược khoảng cách bước thời gian mặc định với khoảng cách đều giữa các bước thời gian sẽ được sử dụng. Nếu `timesteps` được truyền vào, `num_inference_steps` phải là `None`.

Đặt các bước thời gian (timesteps) được sử dụng cho chuỗi khuếch tán (cần chạy trước khi suy luận).

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

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

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

**Tham số:**

sigmas (`float` hoặc `np.ndarray`) : Một Karras sigma đơn hoặc một mảng các Karras sigma.

**Trả về:** `np.ndarray`

Mảng bước thời gian đầu vào đã được điều chỉnh tỷ lệ.

Lấy các bước thời gian đã được điều chỉnh tỷ lệ từ các sigma Karras để làm đầu vào cho mô hình nhất quán.

#### bước[[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)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_consistency_models.py#L364)

**Tham số:**

model_output (`torch.Tensor`) : Đầu ra trực tiếp từ mô hình khuếch tán đã học.

timestep (`float` hoặc `torch.Tensor`) : Bước thời gian hiện tại trong chuỗi khuếch tán.

sample (`torch.Tensor`) : Một bản sao mẫu hiện tại được tạo ra bởi quá trình khuếch tán.

generator (`torch.Generator`, *tùy chọn*) : Bộ tạo số ngẫu nhiên.

return_dict (`bool`, mặc định là `True`) : Có nên trả về [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) hay `tuple` hay không.

**Trả về:** [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) hoặc `tuple`

If return_dict is `True`, [CMStochasticIterativeSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/cm_stochastic_iterative#diffusers.schedulers.scheduling_consistency_models.CMStochasticIterativeSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

Dự đoán mẫu từ bước thời gian trước đó bằng cách đảo ngược SDE. Hàm này lan truyền quá trình khuếch tán từ các đầu ra của mô hình đã học (thường nhất là nhiễu được dự đoán).

## 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)
```

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

**Tham số:**

prev_sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)` đối với ảnh) : Mẫu `(x_{t-1})` đã tính của bước thời gian trước đó. `prev_sample` nên được dùng làm đầu vào mô hình tiếp theo trong vòng lặp khử nhiễu.

Lớp đầu ra cho hàm `step` của trình lập lịch.

