diffusers 0.31.0__py3-none-any.whl → 0.32.1__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 (214) hide show
  1. diffusers/__init__.py +66 -5
  2. diffusers/callbacks.py +56 -3
  3. diffusers/configuration_utils.py +1 -1
  4. diffusers/dependency_versions_table.py +1 -1
  5. diffusers/image_processor.py +25 -17
  6. diffusers/loaders/__init__.py +22 -3
  7. diffusers/loaders/ip_adapter.py +538 -15
  8. diffusers/loaders/lora_base.py +124 -118
  9. diffusers/loaders/lora_conversion_utils.py +318 -3
  10. diffusers/loaders/lora_pipeline.py +1688 -368
  11. diffusers/loaders/peft.py +379 -0
  12. diffusers/loaders/single_file_model.py +71 -4
  13. diffusers/loaders/single_file_utils.py +519 -9
  14. diffusers/loaders/textual_inversion.py +3 -3
  15. diffusers/loaders/transformer_flux.py +181 -0
  16. diffusers/loaders/transformer_sd3.py +89 -0
  17. diffusers/loaders/unet.py +17 -4
  18. diffusers/models/__init__.py +47 -14
  19. diffusers/models/activations.py +22 -9
  20. diffusers/models/attention.py +13 -4
  21. diffusers/models/attention_flax.py +1 -1
  22. diffusers/models/attention_processor.py +2059 -281
  23. diffusers/models/autoencoders/__init__.py +5 -0
  24. diffusers/models/autoencoders/autoencoder_dc.py +620 -0
  25. diffusers/models/autoencoders/autoencoder_kl.py +2 -1
  26. diffusers/models/autoencoders/autoencoder_kl_allegro.py +1149 -0
  27. diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +36 -27
  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 +29 -495
  36. diffusers/models/controlnet_sd3.py +25 -379
  37. diffusers/models/controlnet_sparsectrl.py +46 -718
  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 +838 -43
  49. diffusers/models/model_loading_utils.py +88 -6
  50. diffusers/models/modeling_flax_utils.py +1 -1
  51. diffusers/models/modeling_utils.py +72 -26
  52. diffusers/models/normalization.py +78 -13
  53. diffusers/models/transformers/__init__.py +5 -0
  54. diffusers/models/transformers/auraflow_transformer_2d.py +2 -2
  55. diffusers/models/transformers/cogvideox_transformer_3d.py +46 -11
  56. diffusers/models/transformers/dit_transformer_2d.py +1 -1
  57. diffusers/models/transformers/latte_transformer_3d.py +4 -4
  58. diffusers/models/transformers/pixart_transformer_2d.py +1 -1
  59. diffusers/models/transformers/sana_transformer.py +488 -0
  60. diffusers/models/transformers/stable_audio_transformer.py +1 -1
  61. diffusers/models/transformers/transformer_2d.py +1 -1
  62. diffusers/models/transformers/transformer_allegro.py +422 -0
  63. diffusers/models/transformers/transformer_cogview3plus.py +1 -1
  64. diffusers/models/transformers/transformer_flux.py +30 -9
  65. diffusers/models/transformers/transformer_hunyuan_video.py +789 -0
  66. diffusers/models/transformers/transformer_ltx.py +469 -0
  67. diffusers/models/transformers/transformer_mochi.py +499 -0
  68. diffusers/models/transformers/transformer_sd3.py +105 -17
  69. diffusers/models/transformers/transformer_temporal.py +1 -1
  70. diffusers/models/unets/unet_1d_blocks.py +1 -1
  71. diffusers/models/unets/unet_2d.py +8 -1
  72. diffusers/models/unets/unet_2d_blocks.py +88 -21
  73. diffusers/models/unets/unet_2d_condition.py +1 -1
  74. diffusers/models/unets/unet_3d_blocks.py +9 -7
  75. diffusers/models/unets/unet_motion_model.py +5 -5
  76. diffusers/models/unets/unet_spatio_temporal_condition.py +23 -0
  77. diffusers/models/unets/unet_stable_cascade.py +2 -2
  78. diffusers/models/unets/uvit_2d.py +1 -1
  79. diffusers/models/upsampling.py +8 -0
  80. diffusers/pipelines/__init__.py +34 -0
  81. diffusers/pipelines/allegro/__init__.py +48 -0
  82. diffusers/pipelines/allegro/pipeline_allegro.py +938 -0
  83. diffusers/pipelines/allegro/pipeline_output.py +23 -0
  84. diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +8 -2
  85. diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +1 -1
  86. diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +0 -6
  87. diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +8 -8
  88. diffusers/pipelines/audioldm2/modeling_audioldm2.py +3 -3
  89. diffusers/pipelines/aura_flow/pipeline_aura_flow.py +1 -8
  90. diffusers/pipelines/auto_pipeline.py +53 -6
  91. diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
  92. diffusers/pipelines/cogvideo/pipeline_cogvideox.py +50 -22
  93. diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +51 -20
  94. diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +69 -21
  95. diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +47 -21
  96. diffusers/pipelines/cogview3/pipeline_cogview3plus.py +1 -1
  97. diffusers/pipelines/controlnet/__init__.py +86 -80
  98. diffusers/pipelines/controlnet/multicontrolnet.py +7 -178
  99. diffusers/pipelines/controlnet/pipeline_controlnet.py +11 -2
  100. diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +1 -2
  101. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +1 -2
  102. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +1 -2
  103. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +3 -3
  104. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +1 -3
  105. diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +1790 -0
  106. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +1501 -0
  107. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +1627 -0
  108. diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +5 -1
  109. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +53 -19
  110. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +7 -7
  111. diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +31 -8
  112. diffusers/pipelines/flux/__init__.py +13 -1
  113. diffusers/pipelines/flux/modeling_flux.py +47 -0
  114. diffusers/pipelines/flux/pipeline_flux.py +204 -29
  115. diffusers/pipelines/flux/pipeline_flux_control.py +889 -0
  116. diffusers/pipelines/flux/pipeline_flux_control_img2img.py +945 -0
  117. diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +1141 -0
  118. diffusers/pipelines/flux/pipeline_flux_controlnet.py +49 -27
  119. diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +40 -30
  120. diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +78 -56
  121. diffusers/pipelines/flux/pipeline_flux_fill.py +969 -0
  122. diffusers/pipelines/flux/pipeline_flux_img2img.py +33 -27
  123. diffusers/pipelines/flux/pipeline_flux_inpaint.py +36 -29
  124. diffusers/pipelines/flux/pipeline_flux_prior_redux.py +492 -0
  125. diffusers/pipelines/flux/pipeline_output.py +16 -0
  126. diffusers/pipelines/hunyuan_video/__init__.py +48 -0
  127. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +687 -0
  128. diffusers/pipelines/hunyuan_video/pipeline_output.py +20 -0
  129. diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +5 -1
  130. diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +9 -9
  131. diffusers/pipelines/kolors/text_encoder.py +2 -2
  132. diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
  133. diffusers/pipelines/ltx/__init__.py +50 -0
  134. diffusers/pipelines/ltx/pipeline_ltx.py +789 -0
  135. diffusers/pipelines/ltx/pipeline_ltx_image2video.py +885 -0
  136. diffusers/pipelines/ltx/pipeline_output.py +20 -0
  137. diffusers/pipelines/lumina/pipeline_lumina.py +1 -8
  138. diffusers/pipelines/mochi/__init__.py +48 -0
  139. diffusers/pipelines/mochi/pipeline_mochi.py +748 -0
  140. diffusers/pipelines/mochi/pipeline_output.py +20 -0
  141. diffusers/pipelines/pag/__init__.py +7 -0
  142. diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +1 -2
  143. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +1 -2
  144. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +1 -3
  145. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +1 -3
  146. diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +5 -1
  147. diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +6 -13
  148. diffusers/pipelines/pag/pipeline_pag_sana.py +886 -0
  149. diffusers/pipelines/pag/pipeline_pag_sd_3.py +6 -6
  150. diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +1058 -0
  151. diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +3 -0
  152. diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +1356 -0
  153. diffusers/pipelines/pipeline_flax_utils.py +1 -1
  154. diffusers/pipelines/pipeline_loading_utils.py +25 -4
  155. diffusers/pipelines/pipeline_utils.py +35 -6
  156. diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +6 -13
  157. diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +6 -13
  158. diffusers/pipelines/sana/__init__.py +47 -0
  159. diffusers/pipelines/sana/pipeline_output.py +21 -0
  160. diffusers/pipelines/sana/pipeline_sana.py +884 -0
  161. diffusers/pipelines/stable_audio/pipeline_stable_audio.py +12 -1
  162. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +18 -3
  163. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +216 -20
  164. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +62 -9
  165. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +57 -8
  166. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -1
  167. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +0 -8
  168. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +0 -8
  169. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +0 -8
  170. diffusers/pipelines/unidiffuser/modeling_uvit.py +2 -2
  171. diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
  172. diffusers/quantizers/auto.py +14 -1
  173. diffusers/quantizers/bitsandbytes/bnb_quantizer.py +4 -1
  174. diffusers/quantizers/gguf/__init__.py +1 -0
  175. diffusers/quantizers/gguf/gguf_quantizer.py +159 -0
  176. diffusers/quantizers/gguf/utils.py +456 -0
  177. diffusers/quantizers/quantization_config.py +280 -2
  178. diffusers/quantizers/torchao/__init__.py +15 -0
  179. diffusers/quantizers/torchao/torchao_quantizer.py +292 -0
  180. diffusers/schedulers/scheduling_ddpm.py +2 -6
  181. diffusers/schedulers/scheduling_ddpm_parallel.py +2 -6
  182. diffusers/schedulers/scheduling_deis_multistep.py +28 -9
  183. diffusers/schedulers/scheduling_dpmsolver_multistep.py +35 -9
  184. diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +35 -8
  185. diffusers/schedulers/scheduling_dpmsolver_sde.py +4 -4
  186. diffusers/schedulers/scheduling_dpmsolver_singlestep.py +48 -10
  187. diffusers/schedulers/scheduling_euler_discrete.py +4 -4
  188. diffusers/schedulers/scheduling_flow_match_euler_discrete.py +153 -6
  189. diffusers/schedulers/scheduling_heun_discrete.py +4 -4
  190. diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +4 -4
  191. diffusers/schedulers/scheduling_k_dpm_2_discrete.py +4 -4
  192. diffusers/schedulers/scheduling_lcm.py +2 -6
  193. diffusers/schedulers/scheduling_lms_discrete.py +4 -4
  194. diffusers/schedulers/scheduling_repaint.py +1 -1
  195. diffusers/schedulers/scheduling_sasolver.py +28 -9
  196. diffusers/schedulers/scheduling_tcd.py +2 -6
  197. diffusers/schedulers/scheduling_unipc_multistep.py +53 -8
  198. diffusers/training_utils.py +16 -2
  199. diffusers/utils/__init__.py +5 -0
  200. diffusers/utils/constants.py +1 -0
  201. diffusers/utils/dummy_pt_objects.py +180 -0
  202. diffusers/utils/dummy_torch_and_transformers_objects.py +270 -0
  203. diffusers/utils/dynamic_modules_utils.py +3 -3
  204. diffusers/utils/hub_utils.py +31 -39
  205. diffusers/utils/import_utils.py +67 -0
  206. diffusers/utils/peft_utils.py +3 -0
  207. diffusers/utils/testing_utils.py +56 -1
  208. diffusers/utils/torch_utils.py +3 -0
  209. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/METADATA +6 -6
  210. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/RECORD +214 -162
  211. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/WHEEL +1 -1
  212. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/LICENSE +0 -0
  213. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/entry_points.txt +0 -0
  214. {diffusers-0.31.0.dist-info → diffusers-0.32.1.dist-info}/top_level.txt +0 -0
@@ -13,35 +13,21 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- from dataclasses import dataclass
17
- from typing import Any, Dict, List, Optional, Tuple, Union
18
-
19
- import torch
20
- import torch.nn as nn
21
-
22
- from ..configuration_utils import ConfigMixin, register_to_config
23
- from ..loaders import FromOriginalModelMixin, PeftAdapterMixin
24
- from ..models.attention import JointTransformerBlock
25
- from ..models.attention_processor import Attention, AttentionProcessor, FusedJointAttnProcessor2_0
26
- from ..models.modeling_outputs import Transformer2DModelOutput
27
- from ..models.modeling_utils import ModelMixin
28
- from ..utils import USE_PEFT_BACKEND, is_torch_version, logging, scale_lora_layers, unscale_lora_layers
29
- from .controlnet import BaseOutput, zero_module
30
- from .embeddings import CombinedTimestepTextProjEmbeddings, PatchEmbed
16
+ from ..utils import deprecate, logging
17
+ from .controlnets.controlnet_sd3 import SD3ControlNetModel, SD3ControlNetOutput, SD3MultiControlNetModel
31
18
 
32
19
 
33
20
  logger = logging.get_logger(__name__) # pylint: disable=invalid-name
34
21
 
35
22
 
36
- @dataclass
37
- class SD3ControlNetOutput(BaseOutput):
38
- controlnet_block_samples: Tuple[torch.Tensor]
39
-
23
+ class SD3ControlNetOutput(SD3ControlNetOutput):
24
+ def __init__(self, *args, **kwargs):
25
+ deprecation_message = "Importing `SD3ControlNetOutput` from `diffusers.models.controlnet_sd3` is deprecated and this will be removed in a future version. Please use `from diffusers.models.controlnets.controlnet_sd3 import SD3ControlNetOutput`, instead."
26
+ deprecate("diffusers.models.controlnet_sd3.SD3ControlNetOutput", "0.34", deprecation_message)
27
+ super().__init__(*args, **kwargs)
40
28
 
41
- class SD3ControlNetModel(ModelMixin, ConfigMixin, PeftAdapterMixin, FromOriginalModelMixin):
42
- _supports_gradient_checkpointing = True
43
29
 
44
- @register_to_config
30
+ class SD3ControlNetModel(SD3ControlNetModel):
45
31
  def __init__(
46
32
  self,
47
33
  sample_size: int = 128,
@@ -57,366 +43,26 @@ class SD3ControlNetModel(ModelMixin, ConfigMixin, PeftAdapterMixin, FromOriginal
57
43
  pos_embed_max_size: int = 96,
58
44
  extra_conditioning_channels: int = 0,
59
45
  ):
60
- super().__init__()
61
- default_out_channels = in_channels
62
- self.out_channels = out_channels if out_channels is not None else default_out_channels
63
- self.inner_dim = num_attention_heads * attention_head_dim
64
-
65
- self.pos_embed = PatchEmbed(
66
- height=sample_size,
67
- width=sample_size,
46
+ deprecation_message = "Importing `SD3ControlNetModel` from `diffusers.models.controlnet_sd3` is deprecated and this will be removed in a future version. Please use `from diffusers.models.controlnets.controlnet_sd3 import SD3ControlNetModel`, instead."
47
+ deprecate("diffusers.models.controlnet_sd3.SD3ControlNetModel", "0.34", deprecation_message)
48
+ super().__init__(
49
+ sample_size=sample_size,
68
50
  patch_size=patch_size,
69
51
  in_channels=in_channels,
70
- embed_dim=self.inner_dim,
52
+ num_layers=num_layers,
53
+ attention_head_dim=attention_head_dim,
54
+ num_attention_heads=num_attention_heads,
55
+ joint_attention_dim=joint_attention_dim,
56
+ caption_projection_dim=caption_projection_dim,
57
+ pooled_projection_dim=pooled_projection_dim,
58
+ out_channels=out_channels,
71
59
  pos_embed_max_size=pos_embed_max_size,
60
+ extra_conditioning_channels=extra_conditioning_channels,
72
61
  )
73
- self.time_text_embed = CombinedTimestepTextProjEmbeddings(
74
- embedding_dim=self.inner_dim, pooled_projection_dim=pooled_projection_dim
75
- )
76
- self.context_embedder = nn.Linear(joint_attention_dim, caption_projection_dim)
77
-
78
- # `attention_head_dim` is doubled to account for the mixing.
79
- # It needs to crafted when we get the actual checkpoints.
80
- self.transformer_blocks = nn.ModuleList(
81
- [
82
- JointTransformerBlock(
83
- dim=self.inner_dim,
84
- num_attention_heads=num_attention_heads,
85
- attention_head_dim=self.config.attention_head_dim,
86
- context_pre_only=False,
87
- )
88
- for i in range(num_layers)
89
- ]
90
- )
91
-
92
- # controlnet_blocks
93
- self.controlnet_blocks = nn.ModuleList([])
94
- for _ in range(len(self.transformer_blocks)):
95
- controlnet_block = nn.Linear(self.inner_dim, self.inner_dim)
96
- controlnet_block = zero_module(controlnet_block)
97
- self.controlnet_blocks.append(controlnet_block)
98
- pos_embed_input = PatchEmbed(
99
- height=sample_size,
100
- width=sample_size,
101
- patch_size=patch_size,
102
- in_channels=in_channels + extra_conditioning_channels,
103
- embed_dim=self.inner_dim,
104
- pos_embed_type=None,
105
- )
106
- self.pos_embed_input = zero_module(pos_embed_input)
107
-
108
- self.gradient_checkpointing = False
109
-
110
- # Copied from diffusers.models.unets.unet_3d_condition.UNet3DConditionModel.enable_forward_chunking
111
- def enable_forward_chunking(self, chunk_size: Optional[int] = None, dim: int = 0) -> None:
112
- """
113
- Sets the attention processor to use [feed forward
114
- chunking](https://huggingface.co/blog/reformer#2-chunked-feed-forward-layers).
115
-
116
- Parameters:
117
- chunk_size (`int`, *optional*):
118
- The chunk size of the feed-forward layers. If not specified, will run feed-forward layer individually
119
- over each tensor of dim=`dim`.
120
- dim (`int`, *optional*, defaults to `0`):
121
- The dimension over which the feed-forward computation should be chunked. Choose between dim=0 (batch)
122
- or dim=1 (sequence length).
123
- """
124
- if dim not in [0, 1]:
125
- raise ValueError(f"Make sure to set `dim` to either 0 or 1, not {dim}")
126
-
127
- # By default chunk size is 1
128
- chunk_size = chunk_size or 1
129
-
130
- def fn_recursive_feed_forward(module: torch.nn.Module, chunk_size: int, dim: int):
131
- if hasattr(module, "set_chunk_feed_forward"):
132
- module.set_chunk_feed_forward(chunk_size=chunk_size, dim=dim)
133
-
134
- for child in module.children():
135
- fn_recursive_feed_forward(child, chunk_size, dim)
136
-
137
- for module in self.children():
138
- fn_recursive_feed_forward(module, chunk_size, dim)
139
-
140
- @property
141
- # Copied from diffusers.models.unets.unet_2d_condition.UNet2DConditionModel.attn_processors
142
- def attn_processors(self) -> Dict[str, AttentionProcessor]:
143
- r"""
144
- Returns:
145
- `dict` of attention processors: A dictionary containing all attention processors used in the model with
146
- indexed by its weight name.
147
- """
148
- # set recursively
149
- processors = {}
150
-
151
- def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]):
152
- if hasattr(module, "get_processor"):
153
- processors[f"{name}.processor"] = module.get_processor()
154
-
155
- for sub_name, child in module.named_children():
156
- fn_recursive_add_processors(f"{name}.{sub_name}", child, processors)
157
-
158
- return processors
159
-
160
- for name, module in self.named_children():
161
- fn_recursive_add_processors(name, module, processors)
162
-
163
- return processors
164
-
165
- # Copied from diffusers.models.unets.unet_2d_condition.UNet2DConditionModel.set_attn_processor
166
- def set_attn_processor(self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]]):
167
- r"""
168
- Sets the attention processor to use to compute attention.
169
-
170
- Parameters:
171
- processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`):
172
- The instantiated processor class or a dictionary of processor classes that will be set as the processor
173
- for **all** `Attention` layers.
174
-
175
- If `processor` is a dict, the key needs to define the path to the corresponding cross attention
176
- processor. This is strongly recommended when setting trainable attention processors.
177
-
178
- """
179
- count = len(self.attn_processors.keys())
180
-
181
- if isinstance(processor, dict) and len(processor) != count:
182
- raise ValueError(
183
- f"A dict of processors was passed, but the number of processors {len(processor)} does not match the"
184
- f" number of attention layers: {count}. Please make sure to pass {count} processor classes."
185
- )
186
-
187
- def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor):
188
- if hasattr(module, "set_processor"):
189
- if not isinstance(processor, dict):
190
- module.set_processor(processor)
191
- else:
192
- module.set_processor(processor.pop(f"{name}.processor"))
193
-
194
- for sub_name, child in module.named_children():
195
- fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor)
196
-
197
- for name, module in self.named_children():
198
- fn_recursive_attn_processor(name, module, processor)
199
-
200
- # Copied from diffusers.models.transformers.transformer_sd3.SD3Transformer2DModel.fuse_qkv_projections
201
- def fuse_qkv_projections(self):
202
- """
203
- Enables fused QKV projections. For self-attention modules, all projection matrices (i.e., query, key, value)
204
- are fused. For cross-attention modules, key and value projection matrices are fused.
205
-
206
- <Tip warning={true}>
207
-
208
- This API is 🧪 experimental.
209
-
210
- </Tip>
211
- """
212
- self.original_attn_processors = None
213
-
214
- for _, attn_processor in self.attn_processors.items():
215
- if "Added" in str(attn_processor.__class__.__name__):
216
- raise ValueError("`fuse_qkv_projections()` is not supported for models having added KV projections.")
217
-
218
- self.original_attn_processors = self.attn_processors
219
-
220
- for module in self.modules():
221
- if isinstance(module, Attention):
222
- module.fuse_projections(fuse=True)
223
-
224
- self.set_attn_processor(FusedJointAttnProcessor2_0())
225
-
226
- # Copied from diffusers.models.unets.unet_2d_condition.UNet2DConditionModel.unfuse_qkv_projections
227
- def unfuse_qkv_projections(self):
228
- """Disables the fused QKV projection if enabled.
229
-
230
- <Tip warning={true}>
231
-
232
- This API is 🧪 experimental.
233
-
234
- </Tip>
235
-
236
- """
237
- if self.original_attn_processors is not None:
238
- self.set_attn_processor(self.original_attn_processors)
239
-
240
- def _set_gradient_checkpointing(self, module, value=False):
241
- if hasattr(module, "gradient_checkpointing"):
242
- module.gradient_checkpointing = value
243
-
244
- @classmethod
245
- def from_transformer(
246
- cls, transformer, num_layers=12, num_extra_conditioning_channels=1, load_weights_from_transformer=True
247
- ):
248
- config = transformer.config
249
- config["num_layers"] = num_layers or config.num_layers
250
- config["extra_conditioning_channels"] = num_extra_conditioning_channels
251
- controlnet = cls(**config)
252
-
253
- if load_weights_from_transformer:
254
- controlnet.pos_embed.load_state_dict(transformer.pos_embed.state_dict())
255
- controlnet.time_text_embed.load_state_dict(transformer.time_text_embed.state_dict())
256
- controlnet.context_embedder.load_state_dict(transformer.context_embedder.state_dict())
257
- controlnet.transformer_blocks.load_state_dict(transformer.transformer_blocks.state_dict(), strict=False)
258
-
259
- controlnet.pos_embed_input = zero_module(controlnet.pos_embed_input)
260
-
261
- return controlnet
262
-
263
- def forward(
264
- self,
265
- hidden_states: torch.FloatTensor,
266
- controlnet_cond: torch.Tensor,
267
- conditioning_scale: float = 1.0,
268
- encoder_hidden_states: torch.FloatTensor = None,
269
- pooled_projections: torch.FloatTensor = None,
270
- timestep: torch.LongTensor = None,
271
- joint_attention_kwargs: Optional[Dict[str, Any]] = None,
272
- return_dict: bool = True,
273
- ) -> Union[torch.FloatTensor, Transformer2DModelOutput]:
274
- """
275
- The [`SD3Transformer2DModel`] forward method.
276
-
277
- Args:
278
- hidden_states (`torch.FloatTensor` of shape `(batch size, channel, height, width)`):
279
- Input `hidden_states`.
280
- controlnet_cond (`torch.Tensor`):
281
- The conditional input tensor of shape `(batch_size, sequence_length, hidden_size)`.
282
- conditioning_scale (`float`, defaults to `1.0`):
283
- The scale factor for ControlNet outputs.
284
- encoder_hidden_states (`torch.FloatTensor` of shape `(batch size, sequence_len, embed_dims)`):
285
- Conditional embeddings (embeddings computed from the input conditions such as prompts) to use.
286
- pooled_projections (`torch.FloatTensor` of shape `(batch_size, projection_dim)`): Embeddings projected
287
- from the embeddings of input conditions.
288
- timestep ( `torch.LongTensor`):
289
- Used to indicate denoising step.
290
- joint_attention_kwargs (`dict`, *optional*):
291
- A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under
292
- `self.processor` in
293
- [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).
294
- return_dict (`bool`, *optional*, defaults to `True`):
295
- Whether or not to return a [`~models.transformer_2d.Transformer2DModelOutput`] instead of a plain
296
- tuple.
297
-
298
- Returns:
299
- If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a
300
- `tuple` where the first element is the sample tensor.
301
- """
302
- if joint_attention_kwargs is not None:
303
- joint_attention_kwargs = joint_attention_kwargs.copy()
304
- lora_scale = joint_attention_kwargs.pop("scale", 1.0)
305
- else:
306
- lora_scale = 1.0
307
-
308
- if USE_PEFT_BACKEND:
309
- # weight the lora layers by setting `lora_scale` for each PEFT layer
310
- scale_lora_layers(self, lora_scale)
311
- else:
312
- if joint_attention_kwargs is not None and joint_attention_kwargs.get("scale", None) is not None:
313
- logger.warning(
314
- "Passing `scale` via `joint_attention_kwargs` when not using the PEFT backend is ineffective."
315
- )
316
-
317
- hidden_states = self.pos_embed(hidden_states) # takes care of adding positional embeddings too.
318
- temb = self.time_text_embed(timestep, pooled_projections)
319
- encoder_hidden_states = self.context_embedder(encoder_hidden_states)
320
-
321
- # add
322
- hidden_states = hidden_states + self.pos_embed_input(controlnet_cond)
323
-
324
- block_res_samples = ()
325
-
326
- for block in self.transformer_blocks:
327
- if self.training and self.gradient_checkpointing:
328
-
329
- def create_custom_forward(module, return_dict=None):
330
- def custom_forward(*inputs):
331
- if return_dict is not None:
332
- return module(*inputs, return_dict=return_dict)
333
- else:
334
- return module(*inputs)
335
-
336
- return custom_forward
337
-
338
- ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {}
339
- encoder_hidden_states, hidden_states = torch.utils.checkpoint.checkpoint(
340
- create_custom_forward(block),
341
- hidden_states,
342
- encoder_hidden_states,
343
- temb,
344
- **ckpt_kwargs,
345
- )
346
-
347
- else:
348
- encoder_hidden_states, hidden_states = block(
349
- hidden_states=hidden_states, encoder_hidden_states=encoder_hidden_states, temb=temb
350
- )
351
-
352
- block_res_samples = block_res_samples + (hidden_states,)
353
-
354
- controlnet_block_res_samples = ()
355
- for block_res_sample, controlnet_block in zip(block_res_samples, self.controlnet_blocks):
356
- block_res_sample = controlnet_block(block_res_sample)
357
- controlnet_block_res_samples = controlnet_block_res_samples + (block_res_sample,)
358
-
359
- # 6. scaling
360
- controlnet_block_res_samples = [sample * conditioning_scale for sample in controlnet_block_res_samples]
361
-
362
- if USE_PEFT_BACKEND:
363
- # remove `lora_scale` from each PEFT layer
364
- unscale_lora_layers(self, lora_scale)
365
-
366
- if not return_dict:
367
- return (controlnet_block_res_samples,)
368
-
369
- return SD3ControlNetOutput(controlnet_block_samples=controlnet_block_res_samples)
370
-
371
-
372
- class SD3MultiControlNetModel(ModelMixin):
373
- r"""
374
- `SD3ControlNetModel` wrapper class for Multi-SD3ControlNet
375
-
376
- This module is a wrapper for multiple instances of the `SD3ControlNetModel`. The `forward()` API is designed to be
377
- compatible with `SD3ControlNetModel`.
378
-
379
- Args:
380
- controlnets (`List[SD3ControlNetModel]`):
381
- Provides additional conditioning to the unet during the denoising process. You must set multiple
382
- `SD3ControlNetModel` as a list.
383
- """
384
-
385
- def __init__(self, controlnets):
386
- super().__init__()
387
- self.nets = nn.ModuleList(controlnets)
388
-
389
- def forward(
390
- self,
391
- hidden_states: torch.FloatTensor,
392
- controlnet_cond: List[torch.tensor],
393
- conditioning_scale: List[float],
394
- pooled_projections: torch.FloatTensor,
395
- encoder_hidden_states: torch.FloatTensor = None,
396
- timestep: torch.LongTensor = None,
397
- joint_attention_kwargs: Optional[Dict[str, Any]] = None,
398
- return_dict: bool = True,
399
- ) -> Union[SD3ControlNetOutput, Tuple]:
400
- for i, (image, scale, controlnet) in enumerate(zip(controlnet_cond, conditioning_scale, self.nets)):
401
- block_samples = controlnet(
402
- hidden_states=hidden_states,
403
- timestep=timestep,
404
- encoder_hidden_states=encoder_hidden_states,
405
- pooled_projections=pooled_projections,
406
- controlnet_cond=image,
407
- conditioning_scale=scale,
408
- joint_attention_kwargs=joint_attention_kwargs,
409
- return_dict=return_dict,
410
- )
411
62
 
412
- # merge samples
413
- if i == 0:
414
- control_block_samples = block_samples
415
- else:
416
- control_block_samples = [
417
- control_block_sample + block_sample
418
- for control_block_sample, block_sample in zip(control_block_samples[0], block_samples[0])
419
- ]
420
- control_block_samples = (tuple(control_block_samples),)
421
63
 
422
- return control_block_samples
64
+ class SD3MultiControlNetModel(SD3MultiControlNetModel):
65
+ def __init__(self, *args, **kwargs):
66
+ deprecation_message = "Importing `SD3MultiControlNetModel` from `diffusers.models.controlnet_sd3` is deprecated and this will be removed in a future version. Please use `from diffusers.models.controlnets.controlnet_sd3 import SD3MultiControlNetModel`, instead."
67
+ deprecate("diffusers.models.controlnet_sd3.SD3MultiControlNetModel", "0.34", deprecation_message)
68
+ super().__init__(*args, **kwargs)