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.
Files changed (268) hide show
  1. diffusers/__init__.py +97 -4
  2. diffusers/callbacks.py +56 -3
  3. diffusers/configuration_utils.py +13 -1
  4. diffusers/image_processor.py +282 -71
  5. diffusers/loaders/__init__.py +24 -3
  6. diffusers/loaders/ip_adapter.py +543 -16
  7. diffusers/loaders/lora_base.py +138 -125
  8. diffusers/loaders/lora_conversion_utils.py +647 -0
  9. diffusers/loaders/lora_pipeline.py +2216 -230
  10. diffusers/loaders/peft.py +380 -0
  11. diffusers/loaders/single_file_model.py +71 -4
  12. diffusers/loaders/single_file_utils.py +597 -10
  13. diffusers/loaders/textual_inversion.py +5 -3
  14. diffusers/loaders/transformer_flux.py +181 -0
  15. diffusers/loaders/transformer_sd3.py +89 -0
  16. diffusers/loaders/unet.py +56 -12
  17. diffusers/models/__init__.py +49 -12
  18. diffusers/models/activations.py +22 -9
  19. diffusers/models/adapter.py +53 -53
  20. diffusers/models/attention.py +98 -13
  21. diffusers/models/attention_flax.py +1 -1
  22. diffusers/models/attention_processor.py +2160 -346
  23. diffusers/models/autoencoders/__init__.py +5 -0
  24. diffusers/models/autoencoders/autoencoder_dc.py +620 -0
  25. diffusers/models/autoencoders/autoencoder_kl.py +73 -12
  26. diffusers/models/autoencoders/autoencoder_kl_allegro.py +1149 -0
  27. diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +213 -105
  28. diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +1176 -0
  29. diffusers/models/autoencoders/autoencoder_kl_ltx.py +1338 -0
  30. diffusers/models/autoencoders/autoencoder_kl_mochi.py +1166 -0
  31. diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +3 -10
  32. diffusers/models/autoencoders/autoencoder_tiny.py +4 -2
  33. diffusers/models/autoencoders/vae.py +18 -5
  34. diffusers/models/controlnet.py +47 -802
  35. diffusers/models/controlnet_flux.py +70 -0
  36. diffusers/models/controlnet_sd3.py +26 -376
  37. diffusers/models/controlnet_sparsectrl.py +46 -719
  38. diffusers/models/controlnets/__init__.py +23 -0
  39. diffusers/models/controlnets/controlnet.py +872 -0
  40. diffusers/models/{controlnet_flax.py → controlnets/controlnet_flax.py} +5 -5
  41. diffusers/models/controlnets/controlnet_flux.py +536 -0
  42. diffusers/models/{controlnet_hunyuan.py → controlnets/controlnet_hunyuan.py} +7 -7
  43. diffusers/models/controlnets/controlnet_sd3.py +489 -0
  44. diffusers/models/controlnets/controlnet_sparsectrl.py +788 -0
  45. diffusers/models/controlnets/controlnet_union.py +832 -0
  46. diffusers/models/{controlnet_xs.py → controlnets/controlnet_xs.py} +14 -13
  47. diffusers/models/controlnets/multicontrolnet.py +183 -0
  48. diffusers/models/embeddings.py +996 -92
  49. diffusers/models/embeddings_flax.py +23 -9
  50. diffusers/models/model_loading_utils.py +264 -14
  51. diffusers/models/modeling_flax_utils.py +1 -1
  52. diffusers/models/modeling_utils.py +334 -51
  53. diffusers/models/normalization.py +157 -13
  54. diffusers/models/transformers/__init__.py +6 -0
  55. diffusers/models/transformers/auraflow_transformer_2d.py +3 -2
  56. diffusers/models/transformers/cogvideox_transformer_3d.py +69 -13
  57. diffusers/models/transformers/dit_transformer_2d.py +1 -1
  58. diffusers/models/transformers/latte_transformer_3d.py +4 -4
  59. diffusers/models/transformers/pixart_transformer_2d.py +10 -2
  60. diffusers/models/transformers/sana_transformer.py +488 -0
  61. diffusers/models/transformers/stable_audio_transformer.py +1 -1
  62. diffusers/models/transformers/transformer_2d.py +1 -1
  63. diffusers/models/transformers/transformer_allegro.py +422 -0
  64. diffusers/models/transformers/transformer_cogview3plus.py +386 -0
  65. diffusers/models/transformers/transformer_flux.py +189 -51
  66. diffusers/models/transformers/transformer_hunyuan_video.py +789 -0
  67. diffusers/models/transformers/transformer_ltx.py +469 -0
  68. diffusers/models/transformers/transformer_mochi.py +499 -0
  69. diffusers/models/transformers/transformer_sd3.py +112 -18
  70. diffusers/models/transformers/transformer_temporal.py +1 -1
  71. diffusers/models/unets/unet_1d_blocks.py +1 -1
  72. diffusers/models/unets/unet_2d.py +8 -1
  73. diffusers/models/unets/unet_2d_blocks.py +88 -21
  74. diffusers/models/unets/unet_2d_condition.py +9 -9
  75. diffusers/models/unets/unet_3d_blocks.py +9 -7
  76. diffusers/models/unets/unet_motion_model.py +46 -68
  77. diffusers/models/unets/unet_spatio_temporal_condition.py +23 -0
  78. diffusers/models/unets/unet_stable_cascade.py +2 -2
  79. diffusers/models/unets/uvit_2d.py +1 -1
  80. diffusers/models/upsampling.py +14 -6
  81. diffusers/pipelines/__init__.py +69 -6
  82. diffusers/pipelines/allegro/__init__.py +48 -0
  83. diffusers/pipelines/allegro/pipeline_allegro.py +938 -0
  84. diffusers/pipelines/allegro/pipeline_output.py +23 -0
  85. diffusers/pipelines/animatediff/__init__.py +2 -0
  86. diffusers/pipelines/animatediff/pipeline_animatediff.py +45 -21
  87. diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +52 -22
  88. diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +18 -4
  89. diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +3 -1
  90. diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +104 -72
  91. diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +1341 -0
  92. diffusers/pipelines/audioldm2/modeling_audioldm2.py +3 -3
  93. diffusers/pipelines/aura_flow/pipeline_aura_flow.py +2 -9
  94. diffusers/pipelines/auto_pipeline.py +88 -10
  95. diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
  96. diffusers/pipelines/cogvideo/__init__.py +2 -0
  97. diffusers/pipelines/cogvideo/pipeline_cogvideox.py +80 -39
  98. diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +825 -0
  99. diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +108 -50
  100. diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +89 -50
  101. diffusers/pipelines/cogview3/__init__.py +47 -0
  102. diffusers/pipelines/cogview3/pipeline_cogview3plus.py +674 -0
  103. diffusers/pipelines/cogview3/pipeline_output.py +21 -0
  104. diffusers/pipelines/controlnet/__init__.py +86 -80
  105. diffusers/pipelines/controlnet/multicontrolnet.py +7 -178
  106. diffusers/pipelines/controlnet/pipeline_controlnet.py +20 -3
  107. diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +9 -2
  108. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +9 -2
  109. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +37 -15
  110. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +12 -4
  111. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +9 -4
  112. diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +1790 -0
  113. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +1501 -0
  114. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +1627 -0
  115. diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +22 -4
  116. diffusers/pipelines/controlnet_sd3/__init__.py +4 -0
  117. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +56 -20
  118. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +1153 -0
  119. diffusers/pipelines/ddpm/pipeline_ddpm.py +2 -2
  120. diffusers/pipelines/deepfloyd_if/pipeline_output.py +6 -5
  121. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +16 -4
  122. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +1 -1
  123. diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +32 -9
  124. diffusers/pipelines/flux/__init__.py +23 -1
  125. diffusers/pipelines/flux/modeling_flux.py +47 -0
  126. diffusers/pipelines/flux/pipeline_flux.py +256 -48
  127. diffusers/pipelines/flux/pipeline_flux_control.py +889 -0
  128. diffusers/pipelines/flux/pipeline_flux_control_img2img.py +945 -0
  129. diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +1141 -0
  130. diffusers/pipelines/flux/pipeline_flux_controlnet.py +1006 -0
  131. diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +998 -0
  132. diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +1204 -0
  133. diffusers/pipelines/flux/pipeline_flux_fill.py +969 -0
  134. diffusers/pipelines/flux/pipeline_flux_img2img.py +856 -0
  135. diffusers/pipelines/flux/pipeline_flux_inpaint.py +1022 -0
  136. diffusers/pipelines/flux/pipeline_flux_prior_redux.py +492 -0
  137. diffusers/pipelines/flux/pipeline_output.py +16 -0
  138. diffusers/pipelines/free_noise_utils.py +365 -5
  139. diffusers/pipelines/hunyuan_video/__init__.py +48 -0
  140. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +687 -0
  141. diffusers/pipelines/hunyuan_video/pipeline_output.py +20 -0
  142. diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +20 -4
  143. diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +9 -9
  144. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +2 -2
  145. diffusers/pipelines/kolors/pipeline_kolors.py +1 -1
  146. diffusers/pipelines/kolors/pipeline_kolors_img2img.py +14 -11
  147. diffusers/pipelines/kolors/text_encoder.py +2 -2
  148. diffusers/pipelines/kolors/tokenizer.py +4 -0
  149. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +1 -1
  150. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +1 -1
  151. diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
  152. diffusers/pipelines/latte/pipeline_latte.py +2 -2
  153. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +15 -3
  154. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +15 -3
  155. diffusers/pipelines/ltx/__init__.py +50 -0
  156. diffusers/pipelines/ltx/pipeline_ltx.py +789 -0
  157. diffusers/pipelines/ltx/pipeline_ltx_image2video.py +885 -0
  158. diffusers/pipelines/ltx/pipeline_output.py +20 -0
  159. diffusers/pipelines/lumina/pipeline_lumina.py +3 -10
  160. diffusers/pipelines/mochi/__init__.py +48 -0
  161. diffusers/pipelines/mochi/pipeline_mochi.py +748 -0
  162. diffusers/pipelines/mochi/pipeline_output.py +20 -0
  163. diffusers/pipelines/pag/__init__.py +13 -0
  164. diffusers/pipelines/pag/pag_utils.py +8 -2
  165. diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +2 -3
  166. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +1543 -0
  167. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +3 -5
  168. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +1683 -0
  169. diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +22 -6
  170. diffusers/pipelines/pag/pipeline_pag_kolors.py +1 -1
  171. diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +7 -14
  172. diffusers/pipelines/pag/pipeline_pag_sana.py +886 -0
  173. diffusers/pipelines/pag/pipeline_pag_sd.py +18 -6
  174. diffusers/pipelines/pag/pipeline_pag_sd_3.py +18 -9
  175. diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +1058 -0
  176. diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +5 -1
  177. diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +1094 -0
  178. diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +1356 -0
  179. diffusers/pipelines/pag/pipeline_pag_sd_xl.py +18 -6
  180. diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +31 -16
  181. diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +42 -19
  182. diffusers/pipelines/pia/pipeline_pia.py +2 -0
  183. diffusers/pipelines/pipeline_flax_utils.py +1 -1
  184. diffusers/pipelines/pipeline_loading_utils.py +250 -31
  185. diffusers/pipelines/pipeline_utils.py +158 -186
  186. diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +7 -14
  187. diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +7 -14
  188. diffusers/pipelines/sana/__init__.py +47 -0
  189. diffusers/pipelines/sana/pipeline_output.py +21 -0
  190. diffusers/pipelines/sana/pipeline_sana.py +884 -0
  191. diffusers/pipelines/stable_audio/pipeline_stable_audio.py +12 -1
  192. diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +35 -3
  193. diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +2 -2
  194. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +46 -9
  195. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +1 -1
  196. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +1 -1
  197. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +241 -81
  198. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +228 -23
  199. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +82 -13
  200. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +60 -11
  201. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -1
  202. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +1 -1
  203. diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +16 -4
  204. diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +16 -4
  205. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +16 -12
  206. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +29 -22
  207. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +29 -22
  208. diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +1 -1
  209. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +1 -1
  210. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +16 -4
  211. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +15 -3
  212. diffusers/pipelines/unidiffuser/modeling_uvit.py +2 -2
  213. diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
  214. diffusers/quantizers/__init__.py +16 -0
  215. diffusers/quantizers/auto.py +139 -0
  216. diffusers/quantizers/base.py +233 -0
  217. diffusers/quantizers/bitsandbytes/__init__.py +2 -0
  218. diffusers/quantizers/bitsandbytes/bnb_quantizer.py +561 -0
  219. diffusers/quantizers/bitsandbytes/utils.py +306 -0
  220. diffusers/quantizers/gguf/__init__.py +1 -0
  221. diffusers/quantizers/gguf/gguf_quantizer.py +159 -0
  222. diffusers/quantizers/gguf/utils.py +456 -0
  223. diffusers/quantizers/quantization_config.py +669 -0
  224. diffusers/quantizers/torchao/__init__.py +15 -0
  225. diffusers/quantizers/torchao/torchao_quantizer.py +285 -0
  226. diffusers/schedulers/scheduling_ddim.py +4 -1
  227. diffusers/schedulers/scheduling_ddim_cogvideox.py +4 -1
  228. diffusers/schedulers/scheduling_ddim_parallel.py +4 -1
  229. diffusers/schedulers/scheduling_ddpm.py +6 -7
  230. diffusers/schedulers/scheduling_ddpm_parallel.py +6 -7
  231. diffusers/schedulers/scheduling_deis_multistep.py +102 -6
  232. diffusers/schedulers/scheduling_dpmsolver_multistep.py +113 -6
  233. diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +111 -5
  234. diffusers/schedulers/scheduling_dpmsolver_sde.py +125 -10
  235. diffusers/schedulers/scheduling_dpmsolver_singlestep.py +126 -7
  236. diffusers/schedulers/scheduling_edm_euler.py +8 -6
  237. diffusers/schedulers/scheduling_euler_ancestral_discrete.py +4 -1
  238. diffusers/schedulers/scheduling_euler_discrete.py +92 -7
  239. diffusers/schedulers/scheduling_flow_match_euler_discrete.py +153 -6
  240. diffusers/schedulers/scheduling_flow_match_heun_discrete.py +4 -5
  241. diffusers/schedulers/scheduling_heun_discrete.py +114 -8
  242. diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +116 -11
  243. diffusers/schedulers/scheduling_k_dpm_2_discrete.py +110 -8
  244. diffusers/schedulers/scheduling_lcm.py +2 -6
  245. diffusers/schedulers/scheduling_lms_discrete.py +76 -1
  246. diffusers/schedulers/scheduling_repaint.py +1 -1
  247. diffusers/schedulers/scheduling_sasolver.py +102 -6
  248. diffusers/schedulers/scheduling_tcd.py +2 -6
  249. diffusers/schedulers/scheduling_unclip.py +4 -1
  250. diffusers/schedulers/scheduling_unipc_multistep.py +127 -5
  251. diffusers/training_utils.py +63 -19
  252. diffusers/utils/__init__.py +7 -1
  253. diffusers/utils/constants.py +1 -0
  254. diffusers/utils/dummy_pt_objects.py +240 -0
  255. diffusers/utils/dummy_torch_and_transformers_objects.py +435 -0
  256. diffusers/utils/dynamic_modules_utils.py +3 -3
  257. diffusers/utils/hub_utils.py +44 -40
  258. diffusers/utils/import_utils.py +98 -8
  259. diffusers/utils/loading_utils.py +28 -4
  260. diffusers/utils/peft_utils.py +6 -3
  261. diffusers/utils/testing_utils.py +115 -1
  262. diffusers/utils/torch_utils.py +3 -0
  263. {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/METADATA +73 -72
  264. {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/RECORD +268 -193
  265. {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/WHEEL +1 -1
  266. {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/LICENSE +0 -0
  267. {diffusers-0.30.3.dist-info → diffusers-0.32.0.dist-info}/entry_points.txt +0 -0
  268. {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
- Rescale `noise_cfg` according to `guidance_rescale`. Based on findings of [Common Diffusion Noise Schedules and
142
- Sample Steps are Flawed](https://arxiv.org/pdf/2305.08891.pdf). See Section 3.4
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
- timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :]
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
- # Strength is irrelevant if we directly request a timestep to start at;
1033
- # that is, strength is determined by the denoising_start instead.
1034
- if denoising_start is not None:
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
- timesteps = timesteps[-num_inference_steps:]
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,