Diffusers documentation
DDIMScheduler
DDIMScheduler
Denoising Diffusion Implicit Models (DDIM) của Jiaming Song, Chenlin Meng và Stefano Ermon.
Tóm tắt từ bài báo là:
Các mô hình xác suất khuếch tán khử nhiễu (DDPM) đã đạt được chất lượng tạo ảnh cao mà không cần huấn luyện đối kháng, nhưng chúng yêu cầu mô phỏng một chuỗi Markov qua nhiều bước để tạo ra một mẫu. Để tăng tốc quá trình lấy mẫu, chúng tôi giới thiệu các mô hình xác suất ẩn khử nhiễu (DDIM), một lớp mô hình xác suất ẩn lặp hiệu quả hơn với cùng quy trình huấn luyện như DDPM. Trong DDPM, quá trình sinh được định nghĩa là quá trình ngược của một quá trình khuếch tán Markov. Chúng tôi xây dựng một lớp các quá trình khuếch tán phi Markov dẫn đến cùng mục tiêu huấn luyện, nhưng quá trình ngược của chúng có thể lấy mẫu nhanh hơn nhiều. Chúng tôi chứng minh thực nghiệm rằng DDIM có thể tạo ra các mẫu chất lượng cao nhanh hơn 10 lần đến 50 lần về thời gian thực so với DDPM, cho phép đánh đổi giữa tính toán và chất lượng mẫu, và có thể thực hiện nội suy ảnh có ý nghĩa ngữ nghĩa trực tiếp trong không gian ẩn.
Mã nguồn gốc của bài báo này có thể được tìm thấy tại ermongroup/ddim, và bạn có thể liên hệ với tác giả qua tsong.me.
Mẹo
Bài báo Common Diffusion Noise Schedules and Sample Steps are Flawed cho rằng sự không khớp giữa các cài đặt huấn luyện và suy luận dẫn đến kết quả sinh suy luận không tối ưu cho Stable Diffusion. Để khắc phục điều này, các tác giả đề xuất:
🧪 Đây là một tính năng thử nghiệm!
- tái chuẩn hóa lịch nhiễu để đảm bảo tỷ số tín hiệu trên nhiễu (SNR) cuối cùng bằng không
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, rescale_betas_zero_snr=True)- huấn luyện một mô hình với
v_prediction(thêm đối số sau vào các script train_text_to_image.py hoặc train_text_to_image_lora.py)
--prediction_type="v_prediction"- thay đổi trình lấy mẫu để luôn bắt đầu từ bước thời gian cuối
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")- tái chuẩn hóa hướng dẫn không phân loại để ngăn ngừa phơi sáng quá mức
image = pipe(prompt, guidance_rescale=0.7).images[0]Ví dụ:
from diffusers import DiffusionPipeline, DDIMScheduler
import torch
pipe = DiffusionPipeline.from_pretrained("ptx0/pseudo-journey-v2", dtype=torch.float16)
pipe.scheduler = DDIMScheduler.from_config(
pipe.scheduler.config, rescale_betas_zero_snr=True, timestep_spacing="trailing"
)
pipe.to("cuda") # or "mps", "xpu", "cpu"
prompt = "A lion in galaxies, spirals, nebulae, stars, smoke, iridescent, intricate detail, octane render, 8k"
image = pipe(prompt, guidance_rescale=0.7).images[0]
imageDDIMScheduler
lớp diffusers.DDIMScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: str = 'linear'trained_betas: numpy.ndarray | list[float] | None = Noneclip_sample: bool = Trueset_alpha_to_one: bool = Truesteps_offset: int = 0prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon'thresholding: bool = Falsedynamic_thresholding_ratio: float = 0.995clip_sample_range: float = 1.0sample_max_value: float = 1.0timestep_spacing: typing.Literal['leading', 'trailing', 'linspace'] = 'leading'rescale_betas_zero_snr: bool = False )
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 (
Literal["linear", "scaled_linear", "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. Phải là một trong"linear","scaled_linear"hoặc"squaredcos_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. - clip_sample (
bool, mặc định làTrue) — Cắt mẫu dự đoán để đảm bảo ổn định về mặt số học. - clip_sample_range (
float, mặc định là 1.0) — Độ lớn tối đa cho việc cắt mẫu. Chỉ hợp lệ khiclip_sample=True. - set_alpha_to_one (
bool, mặc định làTrue) — Mỗi bước khuếch tán sử dụng giá trị tích của alpha tại bước đó và tại bước trước đó. Đối với bước cuối cùng, không có alpha trước đó. Khi tùy chọn này làTrue, tích alpha trước đó được cố định thành1, ngược lại nó sử dụng giá trị alpha tại bước 0. - 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. - prediction_type (
Literal["epsilon", "sample", "v_prediction"], mặc định là"epsilon") — Loại dự đoán của hàm scheduler. Phải là một trong"epsilon"(dự đoán nhiễu của quá trình khuếch tán),"sample"(dự đoán trực tiếp mẫu nhiễu), hoặc"v_prediction"(xem mục 2.4 của bài báo Imagen Video). - 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. - timestep_spacing (
Literal["leading", "trailing", "linspace"], mặc định là"leading") — Cách các bước thời gian (timesteps) nên được điều chỉnh. Phải là một trong"leading","trailing"hoặc"linspace". Xem Bảng 2 trong Common Diffusion Noise Schedules and Sample Steps are Flawed để biết thêm thông tin. - 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.
DDIMScheduler mở rộng quy trình khử nhiễu được giới thiệu trong các mô hình xác suất khuếch tán khử nhiễu (DDPM) bằng cách sử dụng hướng dẫn phi Markov.
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 mức độ nhiễu tại mỗi bước thời gian (đây là quá trình khuếch tán thuận).
get_velocity
< source >( sample: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor
Tính dự đoán vận tốc từ mẫu và nhiễu theo công thức vận tốc.
scale_model_input
< source >( sample: Tensortimestep: int = None ) → 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_timesteps
< source >( num_inference_steps: intdevice: typing.Union[str, torch.device] = 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 (
str | torch.device, tùy chọn) — Thiết bị được sử dụng cho các bước thời gian (timesteps).
Gây ra
ValueError
ValueError— Nếunum_inference_stepslớn hơnself.config.num_train_timesteps.
Đặ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: intsample: Tensoreta: float = 0.0use_clipped_model_output: bool = Falsegenerator: typing.Optional[torch.Generator] = Nonevariance_noise: typing.Optional[torch.Tensor] = Nonereturn_dict: bool = True ) → DDIMSchedulerOutput 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 (
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. - eta (
float, tùy chọn, mặc định là 0.0) — Trọng số của nhiễu cho nhiễu được thêm vào trong bước khuếch tán. Giá trị 0 tương ứng với DDIM (xác định) và 1 tương ứng với DDPM (ngẫu nhiên hoàn toàn). - use_clipped_model_output (
bool, tùy chọn, mặc định làFalse) — NếuTrue, tính toánmodel_output“đã hiệu chỉnh” từ mẫu gốc dự đoán đã bị cắt. Điều này là cần thiết vì mẫu gốc dự đoán bị cắt về [-1, 1] khiself.config.clip_samplelàTrue. Nếu không có việc cắt nào xảy ra,model_output“đã hiệu chỉnh” sẽ trùng khớp với giá trị được cung cấp làm đầu vào vàuse_clipped_model_outputkhông có tác dụng. - generator (
torch.Generator, tùy chọn) — Bộ tạo số ngẫu nhiên để lấy mẫu có thể tái lập. - variance_noise (
torch.Tensor, tuỳ chọn) — Cách thay thế cho việc tạo nhiễu bằnggeneratorbằng cách cung cấp trực tiếp nhiễu cho phương sai bản thân. Hữu ích cho các phương pháp nhưCycleDiffusion. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về DDIMSchedulerOutput haytuplehay không.
Trả về
DDIMSchedulerOutput hoặc tuple
If return_dict is True, DDIMSchedulerOutput 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).
DDIMSchedulerOutput
lớp diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput
< source >( prev_sample: Tensorpred_original_sample: typing.Optional[torch.Tensor] = None )
Tham số
- prev_sample (
torch.Tensorcó shape(batch_size, num_channels, height, width)đối với ảnh) — Mẫu đã tính(x_{t-1})của bước thời gian trước đó.prev_samplenên được sử dụng làm đầu vào mô hình tiếp theo trong vòng lặp khử nhiễu. - pred_original_sample (
torch.Tensorcó hình dạng(batch_size, num_channels, height, width)đối với ảnh) — Mẫu khử nhiễu dự đoán(x_{0})dựa trên đầu ra của mô hình tại bước thời gian hiện tại.pred_original_samplecó thể được sử dụng để xem trước tiến độ hoặc cho việc dẫn hướng.
Lớp đầu ra cho kết quả của hàm step của trình lập lịch.