Diffusers documentation
UniPCMultistepScheduler
UniPCMultistepScheduler
UniPCMultistepScheduler là một framework không cần huấn luyện, được thiết kế để lấy mẫu nhanh các mô hình khuếch tán. Nó được giới thiệu trong UniPC: A Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models bởi Wenliang Zhao, Lujia Bai, Yongming Rao, Jie Zhou, Jiwen Lu.
Nó bao gồm một bộ hiệu chỉnh (UniC) và một bộ dự đoán (UniP) chia sẻ một dạng phân tích thống nhất và hỗ trợ các bậc tùy ý. UniPC được thiết kế để không phụ thuộc vào mô hình, hỗ trợ các DPM trong không gian pixel/không gian ẩn cho việc lấy mẫu không điều kiện/có điều kiện. Nó cũng có thể được áp dụng cho cả các mô hình dự đoán nhiễu và mô hình dự đoán dữ liệu. Bộ hiệu chỉnh UniC cũng có thể được áp dụng sau bất kỳ bộ giải nào có sẵn để tăng bậc chính xác.
Tóm tắt từ bài báo là:
Các mô hình xác suất khuếch tán (DPM) đã chứng minh khả năng rất hứa hẹn trong tổng hợp ảnh độ phân giải cao. Tuy nhiên, việc lấy mẫu từ một DPM đã được huấn luyện là tốn thời gian do phải đánh giá mạng khử nhiễu nhiều lần, khiến việc tăng tốc lấy mẫu của DPM ngày càng trở nên quan trọng. Mặc dù có những tiến bộ gần đây trong việc thiết kế các trình lấy mẫu nhanh, các phương pháp hiện có vẫn không thể tạo ra những hình ảnh thỏa mãn trong nhiều ứng dụng mà người ta ưu tiên số bước ít hơn (ví dụ: <10). Trong bài báo này, chúng tôi phát triển một bộ hiệu chỉnh thống nhất (UniC) có thể được áp dụng sau bất kỳ trình lấy mẫu DPM hiện có nào để tăng bậc chính xác mà không cần đánh giá mô hình thêm, và suy ra một bộ dự đoán thống nhất (UniP) hỗ trợ bậc tùy ý như một sản phẩm phụ. Kết hợp UniP và UniC, chúng tôi đề xuất một khung dự đoán - hiệu chỉnh thống nhất gọi là UniPC cho việc lấy mẫu nhanh của DPM, có dạng phân tích thống nhất cho bất kỳ bậc nào và có thể cải thiện đáng kể chất lượng lấy mẫu so với các phương pháp trước đó, đặc biệt là trong trường hợp số bước cực kỳ ít. Chúng tôi đánh giá các phương pháp của mình thông qua các thí nghiệm rộng rãi bao gồm cả lấy mẫu không điều kiện và có điều kiện sử dụng DPM trong không gian pixel và không gian tiềm ẩn. UniPC của chúng tôi có thể đạt FID 3.87 trên CIFAR10 (không điều kiện) và FID 7.51 trên ImageNet 256×256 (có điều kiện) với chỉ 10 lần đánh giá hàm. Mã nguồn có sẵn tại this https URL.
Mẹo
Khuyến nghị đặt solver_order thành 2 cho guide sampling, và solver_order=3 cho unconditional sampling.
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 cả predict_x0=True và thresholding=True để sử dụng ngưỡng động. Phương pháp ngưỡng 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.
UniPCMultistepScheduler
lớp diffusers.UniPCMultistepScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: str = '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.0predict_x0: bool = Truesolver_type: typing.Literal['bh1', 'bh2'] = 'bh2'lower_order_final: bool = Truedisable_corrector: list = []solver_p: SchedulerMixin = Noneuse_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 = 0final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero'rescale_betas_zero_snr: bool = Falseuse_dynamic_shifting: bool = Falsetime_shift_type: typing.Literal['exponential'] = 'exponential'sigma_min: float | None = Nonesigma_max: bool | None = Noneshift_terminal: bool | None = None )
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.ndarray, tùy chọn) — Truyền một mảng betas trực tiếp vào constructor để bỏ quabeta_startvàbeta_end. - solver_order (
int, mặc định là2) — Bậc UniPC, có thể là bất kỳ số nguyên dương nào. Bậc chính xác hiệu dụng làsolver_order + 1do UniC. Khuyến nghị sử dụngsolver_order=2cho lấy mẫu có hướng dẫn vàsolver_order=3cho lấy mẫu không điều kiện. - prediction_type (
"epsilon","sample","v_prediction", or"flow_prediction", defaults to"epsilon", optional) — 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=Truevàpredict_x0=True. - predict_x0 (
bool, mặc định làTrue) — Có sử dụng thuật toán cập nhật trên x0 dự đoán hay không. - solver_type (
"bh1"hoặc"bh2", mặc định là"bh2") — Loại solver cho UniPC. Khuyến nghị sử dụngbh1cho việc lấy mẫu không điều kiện khi steps < 10, vàbh2trong các trường hợp khác. - lower_order_final (
bool, mặc địnhTrue) — Có sử dụng bộ giải bậc thấp hơn ở các bước cuối cùng hay không. Chỉ hợp lệ với < 15 bước suy luận. Điều này có thể ổn định việc lấy mẫu của DPMSolver cho các bước < 15, đặc biệt là cho các bước <= 10. - disable_corrector (
list, mặc định[]) — Quyết định bước nào để tắt corrector nhằm giảm thiểu sự lệch pha giữaepsilon_theta(x_t, c)vàepsilon_theta(x_t^c, c), điều có thể ảnh hưởng đến sự hội tụ khi guidance scale lớn. Corrector thường được tắt trong vài bước đầu tiên. - solver_p (
SchedulerMixin, mặc địnhNone) — Bất kỳ trình lập lịch nào khác, nếu được chỉ định, thuật toán sẽ trở thànhsolver_p + UniC. - 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. - 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ố họ mô hình. - final_sigmas_type (
"zero"hoặc"sigma_min", mặc định là"zero") — Giá trịsigmacuối cùng cho lịch trình nhiễu trong quá trình lấy mẫu. Nếu là"sigma_min", sigma cuối cùng sẽ giống với sigma cuối cùng trong lịch trình huấn luyện. Nếu làzero, sigma cuối cùng được đặt thành 0. - rescale_betas_zero_snr (
bool, mặc định làFalse) — Có nên điều chỉnh lại betas để có SNR cuối bằng zero hay không. Điều này cho phép mô hình tạo ra các mẫu rất sáng và rất tối thay vì giới hạn ở các mẫu có độ sáng trung bình. Liên quan lỏng lẻo đến--offset_noise.
UniPCMultistepScheduler là một framework không cần huấn luyện, được thiết kế để lấy mẫu nhanh cho các 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 UniPC cần.
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_uni_c_bh_update
< source >( this_model_output: Tensor*argslast_sample: Tensor = Nonethis_sample: Tensor = Noneorder: int = None**kwargs ) → torch.Tensor
Tham số
- this_model_output (
torch.Tensor) — Đầu ra của mô hình tạix_t. - this_timestep (
int) — Bước thời gian hiện tạit. - last_sample (
torch.Tensor) — Mẫu được tạo ra trước bộ dự đoán cuối cùngx_{t-1}. - this_sample (
torch.Tensor) — Mẫu được tạo ra sau bộ dự đoán cuối cùngx_{t}. - order (
int) — Giá trịpcủa UniC-p tại bước này. Bậc chính xác hiệu dụng nên làorder + 1.
Trả về
torch.Tensor
Tensor mẫu đã được hiệu chỉnh tại bước thời gian hiện tại.
Một bước cho UniC (phiên bản B(h)).
multistep_uni_p_bh_update
< source >( model_output: Tensor*argssample: Tensor = Noneorder: int = 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 tại bước thời gian hiện tại. - 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. - order (
int) — Bậc của UniP tại bước thời gian này (tương ứng với p trong UniPC-p).
Trả về
torch.Tensor
Tensor mẫu tại bước thời gian trước đó.
Một bước cho UniP (phiên bản B(h)). Ngoài ra, self.solver_p sẽ được sử dụng nếu được chỉ định.
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: int | None = Nonedevice: typing.Union[str, torch.device] = Nonesigmas: list[float] | None = Nonemu: bool | 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. - sigmas (
List[float], tùy chọn) — Các giá trị tùy chỉnh cho sigmas được sử dụng cho mỗi bước khuếch tán. NếuNone, các sigmas sẽ được tính toán tự động. - mu (
float, tuỳ chọn) — Tham số mu tuỳ chọn cho việc dịch chuyển động khi sử dụng kiểu dịch chuyển thời gian mũ.
Đặ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 multistep UniPC.
stretch_shift_to_terminal
< source >( t: Tensor ) → torch.Tensor
Kéo giãn và dịch lịch trình bước thời gian để đảm bảo nó kết thúc tại giá trị cấu hình shift_terminal đã được thiết lập.
time_shift
< source >( mu: floatsigma: floatt: Tensor ) → torch.Tensor
Áp dụng dịch chuyển thời gian vào các sigma.
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.