# DEISMultistepScheduler

Diffusion Exponential Integrator Sampler (DEIS) được đề xuất trong [Fast Sampling of Diffusion Models with Exponential Integrator](https://huggingface.co/papers/2204.13902) bởi Qinsheng Zhang và Yongxin Chen. `DEISMultistepScheduler` là một bộ giải nhanh bậc cao cho các phương trình vi phân thường (ODE) của mô hình khuếch tán.

Cài đặt này thay đổi công thức khớp đa thức trong không gian log-rho thay vì không gian `t` tuyến tính ban đầu trong bài báo DEIS. Sự thay đổi này cho phép có các hệ số dạng đóng cho phép cập nhật đa bước mũ thay vì phải dựa vào bộ giải số.

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

*Vài năm qua đã chứng kiến thành công lớn của các mô hình Diffusion~(DMs) trong việc tạo ra các mẫu có độ trung thực cao trong các tác vụ mô hình hóa sinh. Một hạn chế chính của DM là quy trình lấy mẫu chậm chạp, thường đòi hỏi hàng trăm đến hàng nghìn bước rời rạc hóa thời gian của quá trình diffusion đã học để đạt được độ chính xác mong muốn. Mục tiêu của chúng tôi là phát triển một phương pháp lấy mẫu nhanh cho DMs với số bước ít hơn nhiều trong khi vẫn giữ được chất lượng mẫu cao. Để đạt được điều này, chúng tôi phân tích có hệ thống quy trình lấy mẫu trong DMs và xác định các yếu tố chính ảnh hưởng đến chất lượng mẫu, trong đó phương pháp rời rạc hóa là quan trọng nhất. Bằng cách xem xét kỹ lưỡng quá trình diffusion đã học, chúng tôi đề xuất Diffusion Exponential Integrator Sampler~(DEIS). Phương pháp này dựa trên Exponential Integrator được thiết kế để rời rạc hóa các phương trình vi phân thường (ODEs) và tận dụng cấu trúc bán tuyến tính của quá trình diffusion đã học để giảm sai số rời rạc hóa. Phương pháp đề xuất có thể áp dụng cho bất kỳ DMs nào và có thể tạo ra các mẫu có độ trung thực cao chỉ với 10 bước. Trong các thí nghiệm của chúng tôi, mất khoảng 3 phút trên một GPU A6000 để tạo 50k hình ảnh từ CIFAR10. Hơn nữa, bằng cách sử dụng trực tiếp các DMs đã huấn luyện trước, chúng tôi đạt được hiệu suất lấy mẫu tiên tiến khi số lần đánh giá hàm score~(NFE) bị giới hạn, ví dụ: FID 4.17 với 10 NFEs, FID 3.37, và IS 9.74 với chỉ 15 NFEs trên CIFAR10. Mã nguồn có sẵn tại [this https URL](https://github.com/qsh-zh/deis).*

## Mẹo

Khuyến nghị đặt `solver_order` thành 2 hoặc 3, trong khi `solver_order=1` tương đương với [DDIMScheduler](/docs/diffusers/v0.43.0/vi/api/schedulers/ddim#diffusers.DDIMScheduler).

Ngưỡng động từ [Imagen](https://huggingface.co/papers/2205.11487) được hỗ trợ, và đối với các mô hình khuếch tán trong không gian pixel, bạn có thể đặt `thresholding=True` để sử dụng ngưỡng động.

## DEISMultistepScheduler[[diffusers.DEISMultistepScheduler]]

#### diffusers.DEISMultistepScheduler[[diffusers.DEISMultistepScheduler]]

```python
diffusers.DEISMultistepScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, solver_order: int = 2, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, algorithm_type: typing.Literal['deis'] = 'deis', solver_type: typing.Literal['logrho'] = 'logrho', lower_order_final: bool = True, use_karras_sigmas: bool = False, use_exponential_sigmas: bool = False, use_beta_sigmas: bool = False, use_flow_sigmas: bool = False, flow_shift: float = 1.0, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace', steps_offset: int = 0, use_dynamic_shifting: bool = False, time_shift_type: typing.Literal['exponential'] = 'exponential')
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L86)

**Tham số:**

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

beta_start (`float`, mặc định là `0.0001`) : Giá trị `beta` ban đầu của suy luận.

beta_end (`float`, mặc định là `0.02`) : Giá trị `beta` cuối cùng.

beta_schedule (`"linear"`, `"scaled_linear"`, hoặc `"squaredcos_cap_v2"`, mặc định là `"linear"`) : Lịch beta, một ánh xạ từ một khoảng beta đến một chuỗi các beta để bước qua mô hình. Chọn từ `linear`, `scaled_linear`, hoặc `squaredcos_cap_v2`.

trained_betas (`np.ndarray` hoặc `list[float]`, *tùy chọn*) : Truyền một mảng betas trực tiếp vào constructor để bỏ qua `beta_start` và `beta_end`.

solver_order (`int`, mặc định là `2`) : Bậc DEIS, có thể là `1` hoặc `2` hoặc `3`. Khuyến nghị sử dụng `solver_order=2` cho việc lấy mẫu có hướng dẫn và `solver_order=3` cho việc lấy mẫu không điều kiện.

prediction_type (`"epsilon"`, `"sample"`, `"v_prediction"`, or `"flow_prediction"`, defaults to `"epsilon"`) : Prediction type of the scheduler function; can be `epsilon` (predicts the noise of the diffusion process), `sample` (directly predicts the noisy sample`), `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper), or `flow_prediction`.

thresholding (`bool`, mặc định là `False`) : Có sử dụng phương pháp "dynamic thresholding" hay không. Phương pháp này không phù hợp với các mô hình khuếch tán trong không gian ẩn như Stable Diffusion.

dynamic_thresholding_ratio (`float`, mặc định là `0.995`) : Tỷ lệ cho phương pháp ngưỡng động. Chỉ hợp lệ khi `thresholding=True`.

sample_max_value (`float`, mặc định là `1.0`) : Giá trị ngưỡng cho việc đặt ngưỡng động. Chỉ hợp lệ khi `thresholding=True`.

algorithm_type (`"deis"`, mặc định là `"deis"`) : Loại thuật toán cho bộ giải.

solver_type (`"logrho"`, mặc định là `"logrho"`) : Kiểu solver cho DEIS.

lower_order_final (`bool`, mặc định là `True`) : Có sử dụng các bộ giải bậc thấp trong các bước cuối cùng hay không. Chỉ hợp lệ khi số bước suy luận < 15.

use_karras_sigmas (`bool`, *tùy chọn*, mặc định là `False`) : Có sử dụng Karras sigmas cho kích thước bước trong lịch trình nhiễu trong quá trình lấy mẫu hay không. Nếu `True`, các sigmas sẽ được xác định theo một chuỗi các mức nhiễu {σi}.

use_exponential_sigmas (`bool`, *tùy chọn*, mặc định là `False`) : Có sử dụng các sigma mũ cho kích thước bước trong lịch trình nhiễu trong quá trình lấy mẫu hay không.

use_beta_sigmas (`bool`, *tuỳ chọn*, mặc định là `False`) : Có sử dụng beta sigmas cho kích thước bước trong lịch trình nhiễu trong quá trình lấy mẫu hay không. Xem [Beta Sampling is All You Need](https://huggingface.co/papers/2407.12173) để biết thêm thông tin.

use_flow_sigmas (`bool`, *tùy chọn*, mặc định là `False`) : Có sử dụng flow sigmas cho kích thước bước trong lịch trình nhiễu trong quá trình lấy mẫu hay không.

flow_shift (`float`, *tuỳ chọn*, mặc định là `1.0`) : Tham số flow shift cho các mô hình dựa trên flow.

timestep_spacing (`"linspace"`, `"leading"`, hoặc `"trailing"`, mặc định là `"linspace"`) : Cách các bước thời gian (timesteps) nên được điều chỉnh. Xem Bảng 2 trong [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) để biết thêm thông tin.

steps_offset (`int`, mặc định là `0`) : Một giá trị bù được cộng vào các bước suy luận, theo yêu cầu của một số họ mô hình.

use_dynamic_shifting (`bool`, mặc định là `False`) : Có sử dụng dịch chuyển động (dynamic shifting) cho lịch trình nhiễu (noise schedule) hay không.

time_shift_type (`"exponential"`, mặc định là `"exponential"`) : Loại dịch chuyển thời gian cần áp dụng.

`DEISMultistepScheduler` là bộ giải bậc cao nhanh cho các phương trình vi phân thường (ODE) của mô hình khuếch tán.

Mô hình này kế thừa từ [SchedulerMixin](/docs/diffusers/v0.43.0/vi/api/schedulers/overview#diffusers.SchedulerMixin) và [ConfigMixin](/docs/diffusers/v0.43.0/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.DEISMultistepScheduler.add_noise]]

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

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L997)

**Tham số:**

original_samples (`torch.Tensor`) : Các mẫu gốc không có nhiễu.

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

timesteps (`torch.IntTensor`) : Các bước thời gian (timesteps) tại đó sẽ thêm nhiễu vào các mẫu.

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

Các mẫu nhiễu.

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.

#### convert_model_output[[diffusers.DEISMultistepScheduler.convert_model_output]]

```python
convert_model_output(model_output: Tensor, *args, sample: Tensor = None, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L581)

**Tham số:**

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

timestep (`int`) : Bước thời gian rời rạc 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.

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

Đầu ra của mô hình đã được chuyển đổi.

Chuyển đổi đầu ra của mô hình sang kiểu tương ứng mà thuật toán DEIS cần.

#### deis_first_order_update[[diffusers.DEISMultistepScheduler.deis_first_order_update]]

```python
deis_first_order_update(model_output: Tensor, *args, sample: Tensor = None, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L641)

**Tham số:**

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

timestep (`int`) : Bước thời gian rời rạc hiện tại trong chuỗi khuếch tán.

prev_timestep (`int`) : Bước thời gian rời rạc trước đó 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.

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

Tensor mẫu tại bước thời gian trước đó.

Một bước cho DEIS bậc nhất (tương đương với DDIM).

#### index_for_timestep[[diffusers.DEISMultistepScheduler.index_for_timestep]]

```python
index_for_timestep(timestep: typing.Union[int, torch.Tensor], schedule_timesteps: typing.Optional[torch.Tensor] = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L864)

**Tham số:**

timestep (`int` hoặc `torch.Tensor`) : Bước thời gian để tìm chỉ số.

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.

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

#### multistep_deis_second_order_update[[diffusers.DEISMultistepScheduler.multistep_deis_second_order_update]]

```python
multistep_deis_second_order_update(model_output_list: list[torch.Tensor], *args, sample: Tensor = None, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L702)

**Tham số:**

model_output_list (`list[torch.Tensor]`) : Đầu ra trực tiếp từ mô hình khuếch tán đã học tại các bước thời gian hiện tại và sau đó.

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.

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

Tensor mẫu tại bước thời gian trước đó.

Một bước cho DEIS đa bước bậc hai.

#### multistep_deis_third_order_update[[diffusers.DEISMultistepScheduler.multistep_deis_third_order_update]]

```python
multistep_deis_third_order_update(model_output_list: list[torch.Tensor], *args, sample: Tensor = None, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L775)

**Tham số:**

model_output_list (`list[torch.Tensor]`) : Đầu ra trực tiếp từ mô hình khuếch tán đã học tại các bước thời gian hiện tại và sau đó.

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.

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

Tensor mẫu tại bước thời gian trước đó.

Một bước cho DEIS đa bước bậc ba.

#### scale_model_input[[diffusers.DEISMultistepScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, *args, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L981)

**Tham số:**

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

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

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

Đảm bảo khả năng hoán đổi với các trình lập lịch cần mở rộng đầu vào của mô hình khử nhiễu tùy thuộc vào bước thời gian hiện tại.

#### set_begin_index[[diffusers.DEISMultistepScheduler.set_begin_index]]

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

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L262)

**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.DEISMultistepScheduler.set_timesteps]]

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

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L272)

**Tham số:**

num_inference_steps (`int`) : 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.

mu (`float`, *optional*) : Tham số mu cho việc dịch chuyển động. Chỉ được sử dụng khi `use_dynamic_shifting=True` và `time_shift_type="exponential"`.

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

#### bước[[diffusers.DEISMultistepScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[int, torch.Tensor], sample: Tensor, return_dict: bool = True)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_deis_multistep.py#L917)

**Tham số:**

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

timestep (`int` hoặc `torch.Tensor`) : Bước thời gian rời rạc 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.

return_dict (`bool`, mặc định là `True`) : Có nên trả về một [SchedulerOutput](/docs/diffusers/v0.43.0/vi/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) hay `tuple` hay không.

**Trả về:** [SchedulerOutput](/docs/diffusers/v0.43.0/vi/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) hoặc `tuple`

If return_dict is `True`, [SchedulerOutput](/docs/diffusers/v0.43.0/vi/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) 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 mẫu bằng DEIS đa bước.

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

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L66)

**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 cơ sở cho kết quả của hàm `step` của một trình lập lịch.

