Diffusers documentation
DEISMultistepScheduler
DEISMultistepScheduler
Diffusion Exponential Integrator Sampler (DEIS) được đề xuất trong Fast Sampling of Diffusion Models with Exponential Integrator 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.
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.
Ngưỡng động từ Imagen đượ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
lớp diffusers.DEISMultistepScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = 'linear'trained_betas: numpy.ndarray | list[float] | None = Nonesolver_order: int = 2prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon'thresholding: bool = Falsedynamic_thresholding_ratio: float = 0.995sample_max_value: float = 1.0algorithm_type: typing.Literal['deis'] = 'deis'solver_type: typing.Literal['logrho'] = 'logrho'lower_order_final: bool = Trueuse_karras_sigmas: bool = Falseuse_exponential_sigmas: bool = Falseuse_beta_sigmas: bool = Falseuse_flow_sigmas: bool = Falseflow_shift: float = 1.0timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace'steps_offset: int = 0use_dynamic_shifting: bool = Falsetime_shift_type: typing.Literal['exponential'] = 'exponential' )
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ịbetaban đầu của suy luận. - beta_end (
float, mặc định là0.02) — Giá trịbetacuối cùng. - beta_schedule (
"linear","scaled_linear", hoặc"squaredcos_cap_v2", mặc định là"linear") — Lịch trình beta, một ánh xạ từ một khoảng beta sang một chuỗi các beta để bước qua mô hình. Chọn từlinear,scaled_linear, hoặcsquaredcos_cap_v2. - trained_betas (
np.ndarrayhoặclist[float], tùy chọn) — Truyền trực tiếp một mảng betas vào constructor để bỏ quabeta_startvàbeta_end. - solver_order (
int, mặc định là2) — Bậc DEIS có thể là1hoặc2hoặc3. Khuyến nghị sử dụngsolver_order=2cho việc lấy mẫu có hướng dẫn (guided sampling) vàsolver_order=3cho việc lấy mẫu không điều kiện (unconditional sampling). - prediction_type (
"epsilon","sample","v_prediction", or"flow_prediction", defaults to"epsilon") — Prediction type of the scheduler function; can beepsilon(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), orflow_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 (latent-space) như Stable Diffusion. - dynamic_thresholding_ratio (
float, mặc định là0.995) — Tỷ số cho phương pháp ngưỡng động. Chỉ hợp lệ khithresholding=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ệ khithresholding=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") — Loại solver cho DEIS. - lower_order_final (
bool, mặc định làTrue) — Có sử dụng bộ giải bậc thấp hơn 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ếuTrue, các sigmas đượ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 exponential 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. - use_beta_sigmas (
bool, tùy 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 để 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, tùy chọn, mặc định là1.0) — Tham số dịch chuyển dòng (flow shift) cho các mô hình dựa trên dòng (flow-based). - timestep_spacing (
"linspace","leading", hoặc"trailing", mặc định là"linspace") — Cách các timestep nên được scale. Xem Bảng 2 của Common Diffusion Noise Schedules and Sample Steps are Flawed để 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ố nhóm mô hình. - use_dynamic_shifting (
bool, mặc định làFalse) — Có sử dụng dynamic shifting cho 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 và 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 trình lập lịch, chẳng hạn như tải và lưu.
add_noise
< source >( original_samples: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor
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
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
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 thể hiện hiện tại của mẫu đượ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
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
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 thể hiện hiện tại của mẫu đượ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
< source >( timestep: typing.Union[int, torch.Tensor]schedule_timesteps: typing.Optional[torch.Tensor] = None ) → int
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
< source >( model_output_list: list[torch.Tensor]*argssample: Tensor = None**kwargs ) → torch.Tensor
Một bước cho DEIS đa bước bậc hai.
multistep_deis_third_order_update
< source >( model_output_list: list[torch.Tensor]*argssample: Tensor = None**kwargs ) → torch.Tensor
Một bước cho DEIS đa bước bậc ba.
scale_model_input
< source >( sample: Tensor*args**kwargs ) → torch.Tensor
Đả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
< source >( begin_index: int = 0 )
Đặ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
< source >( num_inference_steps: intdevice: typing.Union[str, torch.device] = Nonemu: float | None = None )
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ô hình đã được huấn luyện trước. - device (
strhoặctorch.device, tùy 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, tuỳ chọn) — Tham số mu cho việc dịch chuyển động. Chỉ được sử dụng khiuse_dynamic_shifting=Truevà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
< source >( model_output: Tensortimestep: typing.Union[int, torch.Tensor]sample: Tensorreturn_dict: bool = True ) → SchedulerOutput or tuple
Tham số
- model_output (
torch.Tensor) — Đầu ra trực tiếp từ mô hình khuếch tán đã học. - timestep (
inthoặctorch.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 thể hiện hiện tại của mẫu đượ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ề SchedulerOutput haytuplehay không.
Trả về
SchedulerOutput hoặc tuple
If return_dict is True, 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
lớp diffusers.schedulers.scheduling_utils.SchedulerOutput
< source >( prev_sample: Tensor )
Lớp cơ sở cho kết quả của hàm step của một trình lập lịch.