diffusers 0.30.3__py3-none-any.whl → 0.32.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diffusers/__init__.py +97 -4
- diffusers/callbacks.py +56 -3
- diffusers/configuration_utils.py +13 -1
- diffusers/image_processor.py +282 -71
- diffusers/loaders/__init__.py +24 -3
- diffusers/loaders/ip_adapter.py +543 -16
- diffusers/loaders/lora_base.py +138 -125
- diffusers/loaders/lora_conversion_utils.py +647 -0
- diffusers/loaders/lora_pipeline.py +2216 -230
- diffusers/loaders/peft.py +380 -0
- diffusers/loaders/single_file_model.py +71 -4
- diffusers/loaders/single_file_utils.py +597 -10
- diffusers/loaders/textual_inversion.py +5 -3
- diffusers/loaders/transformer_flux.py +181 -0
- diffusers/loaders/transformer_sd3.py +89 -0
- diffusers/loaders/unet.py +56 -12
- diffusers/models/__init__.py +49 -12
- diffusers/models/activations.py +22 -9
- diffusers/models/adapter.py +53 -53
- diffusers/models/attention.py +98 -13
- diffusers/models/attention_flax.py +1 -1
- diffusers/models/attention_processor.py +2160 -346
- diffusers/models/autoencoders/__init__.py +5 -0
- diffusers/models/autoencoders/autoencoder_dc.py +620 -0
- diffusers/models/autoencoders/autoencoder_kl.py +73 -12
- diffusers/models/autoencoders/autoencoder_kl_allegro.py +1149 -0
- diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +213 -105
- diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +1176 -0
- diffusers/models/autoencoders/autoencoder_kl_ltx.py +1338 -0
- diffusers/models/autoencoders/autoencoder_kl_mochi.py +1166 -0
- diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +3 -10
- diffusers/models/autoencoders/autoencoder_tiny.py +4 -2
- diffusers/models/autoencoders/vae.py +18 -5
- diffusers/models/controlnet.py +47 -802
- diffusers/models/controlnet_flux.py +70 -0
- diffusers/models/controlnet_sd3.py +26 -376
- diffusers/models/controlnet_sparsectrl.py +46 -719
- diffusers/models/controlnets/__init__.py +23 -0
- diffusers/models/controlnets/controlnet.py +872 -0
- diffusers/models/{controlnet_flax.py → controlnets/controlnet_flax.py} +5 -5
- diffusers/models/controlnets/controlnet_flux.py +536 -0
- diffusers/models/{controlnet_hunyuan.py → controlnets/controlnet_hunyuan.py} +7 -7
- diffusers/models/controlnets/controlnet_sd3.py +489 -0
- diffusers/models/controlnets/controlnet_sparsectrl.py +788 -0
- diffusers/models/controlnets/controlnet_union.py +832 -0
- diffusers/models/{controlnet_xs.py → controlnets/controlnet_xs.py} +14 -13
- diffusers/models/controlnets/multicontrolnet.py +183 -0
- diffusers/models/embeddings.py +996 -92
- diffusers/models/embeddings_flax.py +23 -9
- diffusers/models/model_loading_utils.py +264 -14
- diffusers/models/modeling_flax_utils.py +1 -1
- diffusers/models/modeling_utils.py +334 -51
- diffusers/models/normalization.py +157 -13
- diffusers/models/transformers/__init__.py +6 -0
- diffusers/models/transformers/auraflow_transformer_2d.py +3 -2
- diffusers/models/transformers/cogvideox_transformer_3d.py +69 -13
- diffusers/models/transformers/dit_transformer_2d.py +1 -1
- diffusers/models/transformers/latte_transformer_3d.py +4 -4
- diffusers/models/transformers/pixart_transformer_2d.py +10 -2
- diffusers/models/transformers/sana_transformer.py +488 -0
- diffusers/models/transformers/stable_audio_transformer.py +1 -1
- diffusers/models/transformers/transformer_2d.py +1 -1
- diffusers/models/transformers/transformer_allegro.py +422 -0
- diffusers/models/transformers/transformer_cogview3plus.py +386 -0
- diffusers/models/transformers/transformer_flux.py +189 -51
- diffusers/models/transformers/transformer_hunyuan_video.py +789 -0
- diffusers/models/transformers/transformer_ltx.py +469 -0
- diffusers/models/transformers/transformer_mochi.py +499 -0
- diffusers/models/transformers/transformer_sd3.py +112 -18
- diffusers/models/transformers/transformer_temporal.py +1 -1
- diffusers/models/unets/unet_1d_blocks.py +1 -1
- diffusers/models/unets/unet_2d.py +8 -1
- diffusers/models/unets/unet_2d_blocks.py +88 -21
- diffusers/models/unets/unet_2d_condition.py +9 -9
- diffusers/models/unets/unet_3d_blocks.py +9 -7
- diffusers/models/unets/unet_motion_model.py +46 -68
- diffusers/models/unets/unet_spatio_temporal_condition.py +23 -0
- diffusers/models/unets/unet_stable_cascade.py +2 -2
- diffusers/models/unets/uvit_2d.py +1 -1
- diffusers/models/upsampling.py +14 -6
- diffusers/pipelines/__init__.py +69 -6
- diffusers/pipelines/allegro/__init__.py +48 -0
- diffusers/pipelines/allegro/pipeline_allegro.py +938 -0
- diffusers/pipelines/allegro/pipeline_output.py +23 -0
- diffusers/pipelines/animatediff/__init__.py +2 -0
- diffusers/pipelines/animatediff/pipeline_animatediff.py +45 -21
- diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +52 -22
- diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +18 -4
- diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +3 -1
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +104 -72
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +1341 -0
- diffusers/pipelines/audioldm2/modeling_audioldm2.py +3 -3
- diffusers/pipelines/aura_flow/pipeline_aura_flow.py +2 -9
- diffusers/pipelines/auto_pipeline.py +88 -10
- diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
- diffusers/pipelines/cogvideo/__init__.py +2 -0
- diffusers/pipelines/cogvideo/pipeline_cogvideox.py +80 -39
- diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +825 -0
- diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +108 -50
- diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +89 -50
- diffusers/pipelines/cogview3/__init__.py +47 -0
- diffusers/pipelines/cogview3/pipeline_cogview3plus.py +674 -0
- diffusers/pipelines/cogview3/pipeline_output.py +21 -0
- diffusers/pipelines/controlnet/__init__.py +86 -80
- diffusers/pipelines/controlnet/multicontrolnet.py +7 -178
- diffusers/pipelines/controlnet/pipeline_controlnet.py +20 -3
- diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +9 -2
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +9 -2
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +37 -15
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +12 -4
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +9 -4
- diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +1790 -0
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +1501 -0
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +1627 -0
- diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +22 -4
- diffusers/pipelines/controlnet_sd3/__init__.py +4 -0
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +56 -20
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +1153 -0
- diffusers/pipelines/ddpm/pipeline_ddpm.py +2 -2
- diffusers/pipelines/deepfloyd_if/pipeline_output.py +6 -5
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +16 -4
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +1 -1
- diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +32 -9
- diffusers/pipelines/flux/__init__.py +23 -1
- diffusers/pipelines/flux/modeling_flux.py +47 -0
- diffusers/pipelines/flux/pipeline_flux.py +256 -48
- diffusers/pipelines/flux/pipeline_flux_control.py +889 -0
- diffusers/pipelines/flux/pipeline_flux_control_img2img.py +945 -0
- diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +1141 -0
- diffusers/pipelines/flux/pipeline_flux_controlnet.py +1006 -0
- diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +998 -0
- diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +1204 -0
- diffusers/pipelines/flux/pipeline_flux_fill.py +969 -0
- diffusers/pipelines/flux/pipeline_flux_img2img.py +856 -0
- diffusers/pipelines/flux/pipeline_flux_inpaint.py +1022 -0
- diffusers/pipelines/flux/pipeline_flux_prior_redux.py +492 -0
- diffusers/pipelines/flux/pipeline_output.py +16 -0
- diffusers/pipelines/free_noise_utils.py +365 -5
- diffusers/pipelines/hunyuan_video/__init__.py +48 -0
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +687 -0
- diffusers/pipelines/hunyuan_video/pipeline_output.py +20 -0
- diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +20 -4
- diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +9 -9
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +2 -2
- diffusers/pipelines/kolors/pipeline_kolors.py +1 -1
- diffusers/pipelines/kolors/pipeline_kolors_img2img.py +14 -11
- diffusers/pipelines/kolors/text_encoder.py +2 -2
- diffusers/pipelines/kolors/tokenizer.py +4 -0
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +1 -1
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +1 -1
- diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
- diffusers/pipelines/latte/pipeline_latte.py +2 -2
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +15 -3
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +15 -3
- diffusers/pipelines/ltx/__init__.py +50 -0
- diffusers/pipelines/ltx/pipeline_ltx.py +789 -0
- diffusers/pipelines/ltx/pipeline_ltx_image2video.py +885 -0
- diffusers/pipelines/ltx/pipeline_output.py +20 -0
- diffusers/pipelines/lumina/pipeline_lumina.py +3 -10
- diffusers/pipelines/mochi/__init__.py +48 -0
- diffusers/pipelines/mochi/pipeline_mochi.py +748 -0
- diffusers/pipelines/mochi/pipeline_output.py +20 -0
- diffusers/pipelines/pag/__init__.py +13 -0
- diffusers/pipelines/pag/pag_utils.py +8 -2
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +2 -3
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +1543 -0
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +3 -5
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +1683 -0
- diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +22 -6
- diffusers/pipelines/pag/pipeline_pag_kolors.py +1 -1
- diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +7 -14
- diffusers/pipelines/pag/pipeline_pag_sana.py +886 -0
- diffusers/pipelines/pag/pipeline_pag_sd.py +18 -6
- diffusers/pipelines/pag/pipeline_pag_sd_3.py +18 -9
- diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +1058 -0
- diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +5 -1
- diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +1094 -0
- diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +1356 -0
- diffusers/pipelines/pag/pipeline_pag_sd_xl.py +18 -6
- diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +31 -16
- diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +42 -19
- diffusers/pipelines/pia/pipeline_pia.py +2 -0
- diffusers/pipelines/pipeline_flax_utils.py +1 -1
- diffusers/pipelines/pipeline_loading_utils.py +250 -31
- diffusers/pipelines/pipeline_utils.py +158 -186
- diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +7 -14
- diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +7 -14
- diffusers/pipelines/sana/__init__.py +47 -0
- diffusers/pipelines/sana/pipeline_output.py +21 -0
- diffusers/pipelines/sana/pipeline_sana.py +884 -0
- diffusers/pipelines/stable_audio/pipeline_stable_audio.py +12 -1
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +35 -3
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +2 -2
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +46 -9
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +241 -81
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +228 -23
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +82 -13
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +60 -11
- diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -1
- diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +1 -1
- diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +16 -4
- diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +16 -4
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +16 -12
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +29 -22
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +29 -22
- diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +1 -1
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +1 -1
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +16 -4
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +15 -3
- diffusers/pipelines/unidiffuser/modeling_uvit.py +2 -2
- diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
- diffusers/quantizers/__init__.py +16 -0
- diffusers/quantizers/auto.py +139 -0
- diffusers/quantizers/base.py +233 -0
- diffusers/quantizers/bitsandbytes/__init__.py +2 -0
- diffusers/quantizers/bitsandbytes/bnb_quantizer.py +561 -0
- diffusers/quantizers/bitsandbytes/utils.py +306 -0
- diffusers/quantizers/gguf/__init__.py +1 -0
- diffusers/quantizers/gguf/gguf_quantizer.py +159 -0
- diffusers/quantizers/gguf/utils.py +456 -0
- diffusers/quantizers/quantization_config.py +669 -0
- diffusers/quantizers/torchao/__init__.py +15 -0
- diffusers/quantizers/torchao/torchao_quantizer.py +285 -0
- diffusers/schedulers/scheduling_ddim.py +4 -1
- diffusers/schedulers/scheduling_ddim_cogvideox.py +4 -1
- diffusers/schedulers/scheduling_ddim_parallel.py +4 -1
- diffusers/schedulers/scheduling_ddpm.py +6 -7
- diffusers/schedulers/scheduling_ddpm_parallel.py +6 -7
- diffusers/schedulers/scheduling_deis_multistep.py +102 -6
- diffusers/schedulers/scheduling_dpmsolver_multistep.py +113 -6
- diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +111 -5
- diffusers/schedulers/scheduling_dpmsolver_sde.py +125 -10
- diffusers/schedulers/scheduling_dpmsolver_singlestep.py +126 -7
- diffusers/schedulers/scheduling_edm_euler.py +8 -6
- diffusers/schedulers/scheduling_euler_ancestral_discrete.py +4 -1
- diffusers/schedulers/scheduling_euler_discrete.py +92 -7
- diffusers/schedulers/scheduling_flow_match_euler_discrete.py +153 -6
- diffusers/schedulers/scheduling_flow_match_heun_discrete.py +4 -5
- diffusers/schedulers/scheduling_heun_discrete.py +114 -8
- diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +116 -11
- diffusers/schedulers/scheduling_k_dpm_2_discrete.py +110 -8
- diffusers/schedulers/scheduling_lcm.py +2 -6
- diffusers/schedulers/scheduling_lms_discrete.py +76 -1
- diffusers/schedulers/scheduling_repaint.py +1 -1
- diffusers/schedulers/scheduling_sasolver.py +102 -6
- diffusers/schedulers/scheduling_tcd.py +2 -6
- diffusers/schedulers/scheduling_unclip.py +4 -1
- diffusers/schedulers/scheduling_unipc_multistep.py +127 -5
- diffusers/training_utils.py +63 -19
- diffusers/utils/__init__.py +7 -1
- diffusers/utils/constants.py +1 -0
- diffusers/utils/dummy_pt_objects.py +240 -0
- diffusers/utils/dummy_torch_and_transformers_objects.py +435 -0
- diffusers/utils/dynamic_modules_utils.py +3 -3
- diffusers/utils/hub_utils.py +44 -40
- diffusers/utils/import_utils.py +98 -8
- diffusers/utils/loading_utils.py +28 -4
- diffusers/utils/peft_utils.py +6 -3
- diffusers/utils/testing_utils.py +115 -1
- diffusers/utils/torch_utils.py +3 -0
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/METADATA +73 -72
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/RECORD +268 -193
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/WHEEL +1 -1
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/LICENSE +0 -0
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/entry_points.txt +0 -0
- {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/top_level.txt +0 -0
@@ -35,7 +35,7 @@ from ...loaders import (
|
|
35
35
|
StableDiffusionXLLoraLoaderMixin,
|
36
36
|
TextualInversionLoaderMixin,
|
37
37
|
)
|
38
|
-
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, UNet2DConditionModel
|
38
|
+
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, MultiControlNetModel, UNet2DConditionModel
|
39
39
|
from ...models.attention_processor import (
|
40
40
|
AttnProcessor2_0,
|
41
41
|
XFormersAttnProcessor,
|
@@ -54,7 +54,6 @@ from ...utils import (
|
|
54
54
|
from ...utils.torch_utils import is_compiled_module, randn_tensor
|
55
55
|
from ..pipeline_utils import DiffusionPipeline, StableDiffusionMixin
|
56
56
|
from ..stable_diffusion_xl.pipeline_output import StableDiffusionXLPipelineOutput
|
57
|
-
from .multicontrolnet import MultiControlNetModel
|
58
57
|
|
59
58
|
|
60
59
|
if is_invisible_watermark_available():
|
@@ -137,9 +136,21 @@ EXAMPLE_DOC_STRING = """
|
|
137
136
|
|
138
137
|
# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.rescale_noise_cfg
|
139
138
|
def rescale_noise_cfg(noise_cfg, noise_pred_text, guidance_rescale=0.0):
|
140
|
-
"""
|
141
|
-
|
142
|
-
|
139
|
+
r"""
|
140
|
+
Rescales `noise_cfg` tensor based on `guidance_rescale` to improve image quality and fix overexposure. Based on
|
141
|
+
Section 3.4 from [Common Diffusion Noise Schedules and Sample Steps are
|
142
|
+
Flawed](https://arxiv.org/pdf/2305.08891.pdf).
|
143
|
+
|
144
|
+
Args:
|
145
|
+
noise_cfg (`torch.Tensor`):
|
146
|
+
The predicted noise tensor for the guided diffusion process.
|
147
|
+
noise_pred_text (`torch.Tensor`):
|
148
|
+
The predicted noise tensor for the text-guided diffusion process.
|
149
|
+
guidance_rescale (`float`, *optional*, defaults to 0.0):
|
150
|
+
A rescale factor applied to the noise predictions.
|
151
|
+
|
152
|
+
Returns:
|
153
|
+
noise_cfg (`torch.Tensor`): The rescaled noise prediction tensor.
|
143
154
|
"""
|
144
155
|
std_text = noise_pred_text.std(dim=list(range(1, noise_pred_text.ndim)), keepdim=True)
|
145
156
|
std_cfg = noise_cfg.std(dim=list(range(1, noise_cfg.ndim)), keepdim=True)
|
@@ -1024,14 +1035,16 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1024
1035
|
if denoising_start is None:
|
1025
1036
|
init_timestep = min(int(num_inference_steps * strength), num_inference_steps)
|
1026
1037
|
t_start = max(num_inference_steps - init_timestep, 0)
|
1027
|
-
else:
|
1028
|
-
t_start = 0
|
1029
1038
|
|
1030
|
-
|
1039
|
+
timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
|
1040
|
+
if hasattr(self.scheduler, "set_begin_index"):
|
1041
|
+
self.scheduler.set_begin_index(t_start * self.scheduler.order)
|
1042
|
+
|
1043
|
+
return timesteps, num_inference_steps - t_start
|
1031
1044
|
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1045
|
+
else:
|
1046
|
+
# Strength is irrelevant if we directly request a timestep to start at;
|
1047
|
+
# that is, strength is determined by the denoising_start instead.
|
1035
1048
|
discrete_timestep_cutoff = int(
|
1036
1049
|
round(
|
1037
1050
|
self.scheduler.config.num_train_timesteps
|
@@ -1039,7 +1052,7 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1039
1052
|
)
|
1040
1053
|
)
|
1041
1054
|
|
1042
|
-
num_inference_steps = (timesteps < discrete_timestep_cutoff).sum().item()
|
1055
|
+
num_inference_steps = (self.scheduler.timesteps < discrete_timestep_cutoff).sum().item()
|
1043
1056
|
if self.scheduler.order == 2 and num_inference_steps % 2 == 0:
|
1044
1057
|
# if the scheduler is a 2nd order scheduler we might have to do +1
|
1045
1058
|
# because `num_inference_steps` might be even given that every timestep
|
@@ -1050,11 +1063,12 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1050
1063
|
num_inference_steps = num_inference_steps + 1
|
1051
1064
|
|
1052
1065
|
# because t_n+1 >= t_n, we slice the timesteps starting from the end
|
1053
|
-
|
1066
|
+
t_start = len(self.scheduler.timesteps) - num_inference_steps
|
1067
|
+
timesteps = self.scheduler.timesteps[t_start:]
|
1068
|
+
if hasattr(self.scheduler, "set_begin_index"):
|
1069
|
+
self.scheduler.set_begin_index(t_start)
|
1054
1070
|
return timesteps, num_inference_steps
|
1055
1071
|
|
1056
|
-
return timesteps, num_inference_steps - t_start
|
1057
|
-
|
1058
1072
|
def _get_add_time_ids(
|
1059
1073
|
self,
|
1060
1074
|
original_size,
|
@@ -1142,6 +1156,10 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1142
1156
|
def num_timesteps(self):
|
1143
1157
|
return self._num_timesteps
|
1144
1158
|
|
1159
|
+
@property
|
1160
|
+
def interrupt(self):
|
1161
|
+
return self._interrupt
|
1162
|
+
|
1145
1163
|
@torch.no_grad()
|
1146
1164
|
@replace_example_docstring(EXAMPLE_DOC_STRING)
|
1147
1165
|
def __call__(
|
@@ -1424,6 +1442,7 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1424
1442
|
self._guidance_scale = guidance_scale
|
1425
1443
|
self._clip_skip = clip_skip
|
1426
1444
|
self._cross_attention_kwargs = cross_attention_kwargs
|
1445
|
+
self._interrupt = False
|
1427
1446
|
|
1428
1447
|
# 2. Define call parameters
|
1429
1448
|
if prompt is not None and isinstance(prompt, str):
|
@@ -1692,6 +1711,9 @@ class StableDiffusionXLControlNetInpaintPipeline(
|
|
1692
1711
|
|
1693
1712
|
with self.progress_bar(total=num_inference_steps) as progress_bar:
|
1694
1713
|
for i, t in enumerate(timesteps):
|
1714
|
+
if self.interrupt:
|
1715
|
+
continue
|
1716
|
+
|
1695
1717
|
# expand the latents if we are doing classifier free guidance
|
1696
1718
|
latent_model_input = torch.cat([latents] * 2) if self.do_classifier_free_guidance else latents
|
1697
1719
|
|
@@ -38,7 +38,7 @@ from ...loaders import (
|
|
38
38
|
StableDiffusionXLLoraLoaderMixin,
|
39
39
|
TextualInversionLoaderMixin,
|
40
40
|
)
|
41
|
-
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, UNet2DConditionModel
|
41
|
+
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, MultiControlNetModel, UNet2DConditionModel
|
42
42
|
from ...models.attention_processor import (
|
43
43
|
AttnProcessor2_0,
|
44
44
|
XFormersAttnProcessor,
|
@@ -61,8 +61,6 @@ from ..stable_diffusion_xl.pipeline_output import StableDiffusionXLPipelineOutpu
|
|
61
61
|
if is_invisible_watermark_available():
|
62
62
|
from ..stable_diffusion_xl.watermark import StableDiffusionXLWatermarker
|
63
63
|
|
64
|
-
from .multicontrolnet import MultiControlNetModel
|
65
|
-
|
66
64
|
|
67
65
|
logger = logging.get_logger(__name__) # pylint: disable=invalid-name
|
68
66
|
|
@@ -122,7 +120,7 @@ def retrieve_timesteps(
|
|
122
120
|
sigmas: Optional[List[float]] = None,
|
123
121
|
**kwargs,
|
124
122
|
):
|
125
|
-
"""
|
123
|
+
r"""
|
126
124
|
Calls the scheduler's `set_timesteps` method and retrieves timesteps from the scheduler after the call. Handles
|
127
125
|
custom timesteps. Any kwargs will be supplied to `scheduler.set_timesteps`.
|
128
126
|
|
@@ -242,6 +240,7 @@ class StableDiffusionXLControlNetPipeline(
|
|
242
240
|
"add_time_ids",
|
243
241
|
"negative_pooled_prompt_embeds",
|
244
242
|
"negative_add_time_ids",
|
243
|
+
"image",
|
245
244
|
]
|
246
245
|
|
247
246
|
def __init__(
|
@@ -990,6 +989,10 @@ class StableDiffusionXLControlNetPipeline(
|
|
990
989
|
def num_timesteps(self):
|
991
990
|
return self._num_timesteps
|
992
991
|
|
992
|
+
@property
|
993
|
+
def interrupt(self):
|
994
|
+
return self._interrupt
|
995
|
+
|
993
996
|
@torch.no_grad()
|
994
997
|
@replace_example_docstring(EXAMPLE_DOC_STRING)
|
995
998
|
def __call__(
|
@@ -1245,6 +1248,7 @@ class StableDiffusionXLControlNetPipeline(
|
|
1245
1248
|
self._clip_skip = clip_skip
|
1246
1249
|
self._cross_attention_kwargs = cross_attention_kwargs
|
1247
1250
|
self._denoising_end = denoising_end
|
1251
|
+
self._interrupt = False
|
1248
1252
|
|
1249
1253
|
# 2. Define call parameters
|
1250
1254
|
if prompt is not None and isinstance(prompt, str):
|
@@ -1442,6 +1446,9 @@ class StableDiffusionXLControlNetPipeline(
|
|
1442
1446
|
is_torch_higher_equal_2_1 = is_torch_version(">=", "2.1")
|
1443
1447
|
with self.progress_bar(total=num_inference_steps) as progress_bar:
|
1444
1448
|
for i, t in enumerate(timesteps):
|
1449
|
+
if self.interrupt:
|
1450
|
+
continue
|
1451
|
+
|
1445
1452
|
# Relevant thread:
|
1446
1453
|
# https://dev-discuss.pytorch.org/t/cudagraphs-in-pytorch-2-0/1428
|
1447
1454
|
if (is_unet_compiled and is_controlnet_compiled) and is_torch_higher_equal_2_1:
|
@@ -1532,6 +1539,7 @@ class StableDiffusionXLControlNetPipeline(
|
|
1532
1539
|
)
|
1533
1540
|
add_time_ids = callback_outputs.pop("add_time_ids", add_time_ids)
|
1534
1541
|
negative_add_time_ids = callback_outputs.pop("negative_add_time_ids", negative_add_time_ids)
|
1542
|
+
image = callback_outputs.pop("image", image)
|
1535
1543
|
|
1536
1544
|
# call the callback, if provided
|
1537
1545
|
if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0):
|
@@ -38,7 +38,7 @@ from ...loaders import (
|
|
38
38
|
StableDiffusionXLLoraLoaderMixin,
|
39
39
|
TextualInversionLoaderMixin,
|
40
40
|
)
|
41
|
-
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, UNet2DConditionModel
|
41
|
+
from ...models import AutoencoderKL, ControlNetModel, ImageProjection, MultiControlNetModel, UNet2DConditionModel
|
42
42
|
from ...models.attention_processor import (
|
43
43
|
AttnProcessor2_0,
|
44
44
|
XFormersAttnProcessor,
|
@@ -61,8 +61,6 @@ from ..stable_diffusion_xl.pipeline_output import StableDiffusionXLPipelineOutpu
|
|
61
61
|
if is_invisible_watermark_available():
|
62
62
|
from ..stable_diffusion_xl.watermark import StableDiffusionXLWatermarker
|
63
63
|
|
64
|
-
from .multicontrolnet import MultiControlNetModel
|
65
|
-
|
66
64
|
|
67
65
|
logger = logging.get_logger(__name__) # pylint: disable=invalid-name
|
68
66
|
|
@@ -1070,6 +1068,10 @@ class StableDiffusionXLControlNetImg2ImgPipeline(
|
|
1070
1068
|
def num_timesteps(self):
|
1071
1069
|
return self._num_timesteps
|
1072
1070
|
|
1071
|
+
@property
|
1072
|
+
def interrupt(self):
|
1073
|
+
return self._interrupt
|
1074
|
+
|
1073
1075
|
@torch.no_grad()
|
1074
1076
|
@replace_example_docstring(EXAMPLE_DOC_STRING)
|
1075
1077
|
def __call__(
|
@@ -1338,6 +1340,7 @@ class StableDiffusionXLControlNetImg2ImgPipeline(
|
|
1338
1340
|
self._guidance_scale = guidance_scale
|
1339
1341
|
self._clip_skip = clip_skip
|
1340
1342
|
self._cross_attention_kwargs = cross_attention_kwargs
|
1343
|
+
self._interrupt = False
|
1341
1344
|
|
1342
1345
|
# 2. Define call parameters
|
1343
1346
|
if prompt is not None and isinstance(prompt, str):
|
@@ -1510,6 +1513,9 @@ class StableDiffusionXLControlNetImg2ImgPipeline(
|
|
1510
1513
|
num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order
|
1511
1514
|
with self.progress_bar(total=num_inference_steps) as progress_bar:
|
1512
1515
|
for i, t in enumerate(timesteps):
|
1516
|
+
if self.interrupt:
|
1517
|
+
continue
|
1518
|
+
|
1513
1519
|
# expand the latents if we are doing classifier free guidance
|
1514
1520
|
latent_model_input = torch.cat([latents] * 2) if self.do_classifier_free_guidance else latents
|
1515
1521
|
latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
|
@@ -1538,7 +1544,6 @@ class StableDiffusionXLControlNetImg2ImgPipeline(
|
|
1538
1544
|
if isinstance(controlnet_cond_scale, list):
|
1539
1545
|
controlnet_cond_scale = controlnet_cond_scale[0]
|
1540
1546
|
cond_scale = controlnet_cond_scale * controlnet_keep[i]
|
1541
|
-
|
1542
1547
|
down_block_res_samples, mid_block_res_sample = self.controlnet(
|
1543
1548
|
control_model_input,
|
1544
1549
|
t,
|