diffusers 0.27.1__py3-none-any.whl → 0.32.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (445) hide show
  1. diffusers/__init__.py +233 -6
  2. diffusers/callbacks.py +209 -0
  3. diffusers/commands/env.py +102 -6
  4. diffusers/configuration_utils.py +45 -16
  5. diffusers/dependency_versions_table.py +4 -3
  6. diffusers/image_processor.py +434 -110
  7. diffusers/loaders/__init__.py +42 -9
  8. diffusers/loaders/ip_adapter.py +626 -36
  9. diffusers/loaders/lora_base.py +900 -0
  10. diffusers/loaders/lora_conversion_utils.py +991 -125
  11. diffusers/loaders/lora_pipeline.py +3812 -0
  12. diffusers/loaders/peft.py +571 -7
  13. diffusers/loaders/single_file.py +405 -173
  14. diffusers/loaders/single_file_model.py +385 -0
  15. diffusers/loaders/single_file_utils.py +1783 -713
  16. diffusers/loaders/textual_inversion.py +41 -23
  17. diffusers/loaders/transformer_flux.py +181 -0
  18. diffusers/loaders/transformer_sd3.py +89 -0
  19. diffusers/loaders/unet.py +464 -540
  20. diffusers/loaders/unet_loader_utils.py +163 -0
  21. diffusers/models/__init__.py +76 -7
  22. diffusers/models/activations.py +65 -10
  23. diffusers/models/adapter.py +53 -53
  24. diffusers/models/attention.py +605 -18
  25. diffusers/models/attention_flax.py +1 -1
  26. diffusers/models/attention_processor.py +4304 -687
  27. diffusers/models/autoencoders/__init__.py +8 -0
  28. diffusers/models/autoencoders/autoencoder_asym_kl.py +15 -17
  29. diffusers/models/autoencoders/autoencoder_dc.py +620 -0
  30. diffusers/models/autoencoders/autoencoder_kl.py +110 -28
  31. diffusers/models/autoencoders/autoencoder_kl_allegro.py +1149 -0
  32. diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +1482 -0
  33. diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +1176 -0
  34. diffusers/models/autoencoders/autoencoder_kl_ltx.py +1338 -0
  35. diffusers/models/autoencoders/autoencoder_kl_mochi.py +1166 -0
  36. diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +19 -24
  37. diffusers/models/autoencoders/autoencoder_oobleck.py +464 -0
  38. diffusers/models/autoencoders/autoencoder_tiny.py +21 -18
  39. diffusers/models/autoencoders/consistency_decoder_vae.py +45 -20
  40. diffusers/models/autoencoders/vae.py +41 -29
  41. diffusers/models/autoencoders/vq_model.py +182 -0
  42. diffusers/models/controlnet.py +47 -800
  43. diffusers/models/controlnet_flux.py +70 -0
  44. diffusers/models/controlnet_sd3.py +68 -0
  45. diffusers/models/controlnet_sparsectrl.py +116 -0
  46. diffusers/models/controlnets/__init__.py +23 -0
  47. diffusers/models/controlnets/controlnet.py +872 -0
  48. diffusers/models/{controlnet_flax.py → controlnets/controlnet_flax.py} +9 -9
  49. diffusers/models/controlnets/controlnet_flux.py +536 -0
  50. diffusers/models/controlnets/controlnet_hunyuan.py +401 -0
  51. diffusers/models/controlnets/controlnet_sd3.py +489 -0
  52. diffusers/models/controlnets/controlnet_sparsectrl.py +788 -0
  53. diffusers/models/controlnets/controlnet_union.py +832 -0
  54. diffusers/models/controlnets/controlnet_xs.py +1946 -0
  55. diffusers/models/controlnets/multicontrolnet.py +183 -0
  56. diffusers/models/downsampling.py +85 -18
  57. diffusers/models/embeddings.py +1856 -158
  58. diffusers/models/embeddings_flax.py +23 -9
  59. diffusers/models/model_loading_utils.py +480 -0
  60. diffusers/models/modeling_flax_pytorch_utils.py +2 -1
  61. diffusers/models/modeling_flax_utils.py +2 -7
  62. diffusers/models/modeling_outputs.py +14 -0
  63. diffusers/models/modeling_pytorch_flax_utils.py +1 -1
  64. diffusers/models/modeling_utils.py +611 -146
  65. diffusers/models/normalization.py +361 -20
  66. diffusers/models/resnet.py +18 -23
  67. diffusers/models/transformers/__init__.py +16 -0
  68. diffusers/models/transformers/auraflow_transformer_2d.py +544 -0
  69. diffusers/models/transformers/cogvideox_transformer_3d.py +542 -0
  70. diffusers/models/transformers/dit_transformer_2d.py +240 -0
  71. diffusers/models/transformers/dual_transformer_2d.py +9 -8
  72. diffusers/models/transformers/hunyuan_transformer_2d.py +578 -0
  73. diffusers/models/transformers/latte_transformer_3d.py +327 -0
  74. diffusers/models/transformers/lumina_nextdit2d.py +340 -0
  75. diffusers/models/transformers/pixart_transformer_2d.py +445 -0
  76. diffusers/models/transformers/prior_transformer.py +13 -13
  77. diffusers/models/transformers/sana_transformer.py +488 -0
  78. diffusers/models/transformers/stable_audio_transformer.py +458 -0
  79. diffusers/models/transformers/t5_film_transformer.py +17 -19
  80. diffusers/models/transformers/transformer_2d.py +297 -187
  81. diffusers/models/transformers/transformer_allegro.py +422 -0
  82. diffusers/models/transformers/transformer_cogview3plus.py +386 -0
  83. diffusers/models/transformers/transformer_flux.py +593 -0
  84. diffusers/models/transformers/transformer_hunyuan_video.py +791 -0
  85. diffusers/models/transformers/transformer_ltx.py +469 -0
  86. diffusers/models/transformers/transformer_mochi.py +499 -0
  87. diffusers/models/transformers/transformer_sd3.py +461 -0
  88. diffusers/models/transformers/transformer_temporal.py +21 -19
  89. diffusers/models/unets/unet_1d.py +8 -8
  90. diffusers/models/unets/unet_1d_blocks.py +31 -31
  91. diffusers/models/unets/unet_2d.py +17 -10
  92. diffusers/models/unets/unet_2d_blocks.py +225 -149
  93. diffusers/models/unets/unet_2d_condition.py +41 -40
  94. diffusers/models/unets/unet_2d_condition_flax.py +6 -5
  95. diffusers/models/unets/unet_3d_blocks.py +192 -1057
  96. diffusers/models/unets/unet_3d_condition.py +22 -27
  97. diffusers/models/unets/unet_i2vgen_xl.py +22 -18
  98. diffusers/models/unets/unet_kandinsky3.py +2 -2
  99. diffusers/models/unets/unet_motion_model.py +1413 -89
  100. diffusers/models/unets/unet_spatio_temporal_condition.py +40 -16
  101. diffusers/models/unets/unet_stable_cascade.py +19 -18
  102. diffusers/models/unets/uvit_2d.py +2 -2
  103. diffusers/models/upsampling.py +95 -26
  104. diffusers/models/vq_model.py +12 -164
  105. diffusers/optimization.py +1 -1
  106. diffusers/pipelines/__init__.py +202 -3
  107. diffusers/pipelines/allegro/__init__.py +48 -0
  108. diffusers/pipelines/allegro/pipeline_allegro.py +938 -0
  109. diffusers/pipelines/allegro/pipeline_output.py +23 -0
  110. diffusers/pipelines/amused/pipeline_amused.py +12 -12
  111. diffusers/pipelines/amused/pipeline_amused_img2img.py +14 -12
  112. diffusers/pipelines/amused/pipeline_amused_inpaint.py +13 -11
  113. diffusers/pipelines/animatediff/__init__.py +8 -0
  114. diffusers/pipelines/animatediff/pipeline_animatediff.py +122 -109
  115. diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +1106 -0
  116. diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +1288 -0
  117. diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +1010 -0
  118. diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +236 -180
  119. diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +1341 -0
  120. diffusers/pipelines/animatediff/pipeline_output.py +3 -2
  121. diffusers/pipelines/audioldm/pipeline_audioldm.py +14 -14
  122. diffusers/pipelines/audioldm2/modeling_audioldm2.py +58 -39
  123. diffusers/pipelines/audioldm2/pipeline_audioldm2.py +121 -36
  124. diffusers/pipelines/aura_flow/__init__.py +48 -0
  125. diffusers/pipelines/aura_flow/pipeline_aura_flow.py +584 -0
  126. diffusers/pipelines/auto_pipeline.py +196 -28
  127. diffusers/pipelines/blip_diffusion/blip_image_processing.py +1 -1
  128. diffusers/pipelines/blip_diffusion/modeling_blip2.py +6 -6
  129. diffusers/pipelines/blip_diffusion/modeling_ctx_clip.py +1 -1
  130. diffusers/pipelines/blip_diffusion/pipeline_blip_diffusion.py +2 -2
  131. diffusers/pipelines/cogvideo/__init__.py +54 -0
  132. diffusers/pipelines/cogvideo/pipeline_cogvideox.py +772 -0
  133. diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +825 -0
  134. diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +885 -0
  135. diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +851 -0
  136. diffusers/pipelines/cogvideo/pipeline_output.py +20 -0
  137. diffusers/pipelines/cogview3/__init__.py +47 -0
  138. diffusers/pipelines/cogview3/pipeline_cogview3plus.py +674 -0
  139. diffusers/pipelines/cogview3/pipeline_output.py +21 -0
  140. diffusers/pipelines/consistency_models/pipeline_consistency_models.py +6 -6
  141. diffusers/pipelines/controlnet/__init__.py +86 -80
  142. diffusers/pipelines/controlnet/multicontrolnet.py +7 -182
  143. diffusers/pipelines/controlnet/pipeline_controlnet.py +134 -87
  144. diffusers/pipelines/controlnet/pipeline_controlnet_blip_diffusion.py +2 -2
  145. diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +93 -77
  146. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +88 -197
  147. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +136 -90
  148. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +176 -80
  149. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +125 -89
  150. diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +1790 -0
  151. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +1501 -0
  152. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +1627 -0
  153. diffusers/pipelines/controlnet/pipeline_flax_controlnet.py +2 -2
  154. diffusers/pipelines/controlnet_hunyuandit/__init__.py +48 -0
  155. diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +1060 -0
  156. diffusers/pipelines/controlnet_sd3/__init__.py +57 -0
  157. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +1133 -0
  158. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +1153 -0
  159. diffusers/pipelines/controlnet_xs/__init__.py +68 -0
  160. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs.py +916 -0
  161. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs_sd_xl.py +1111 -0
  162. diffusers/pipelines/ddpm/pipeline_ddpm.py +2 -2
  163. diffusers/pipelines/deepfloyd_if/pipeline_if.py +16 -30
  164. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img.py +20 -35
  165. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py +23 -41
  166. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting.py +22 -38
  167. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py +25 -41
  168. diffusers/pipelines/deepfloyd_if/pipeline_if_superresolution.py +19 -34
  169. diffusers/pipelines/deepfloyd_if/pipeline_output.py +6 -5
  170. diffusers/pipelines/deepfloyd_if/watermark.py +1 -1
  171. diffusers/pipelines/deprecated/alt_diffusion/modeling_roberta_series.py +11 -11
  172. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +70 -30
  173. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +48 -25
  174. diffusers/pipelines/deprecated/repaint/pipeline_repaint.py +2 -2
  175. diffusers/pipelines/deprecated/spectrogram_diffusion/pipeline_spectrogram_diffusion.py +7 -7
  176. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py +21 -20
  177. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py +27 -29
  178. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py +33 -27
  179. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py +33 -23
  180. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py +36 -30
  181. diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +102 -69
  182. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion.py +13 -13
  183. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_dual_guided.py +10 -5
  184. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_image_variation.py +11 -6
  185. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_text_to_image.py +10 -5
  186. diffusers/pipelines/deprecated/vq_diffusion/pipeline_vq_diffusion.py +5 -5
  187. diffusers/pipelines/dit/pipeline_dit.py +7 -4
  188. diffusers/pipelines/flux/__init__.py +69 -0
  189. diffusers/pipelines/flux/modeling_flux.py +47 -0
  190. diffusers/pipelines/flux/pipeline_flux.py +957 -0
  191. diffusers/pipelines/flux/pipeline_flux_control.py +889 -0
  192. diffusers/pipelines/flux/pipeline_flux_control_img2img.py +945 -0
  193. diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +1141 -0
  194. diffusers/pipelines/flux/pipeline_flux_controlnet.py +1006 -0
  195. diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +998 -0
  196. diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +1204 -0
  197. diffusers/pipelines/flux/pipeline_flux_fill.py +969 -0
  198. diffusers/pipelines/flux/pipeline_flux_img2img.py +856 -0
  199. diffusers/pipelines/flux/pipeline_flux_inpaint.py +1022 -0
  200. diffusers/pipelines/flux/pipeline_flux_prior_redux.py +492 -0
  201. diffusers/pipelines/flux/pipeline_output.py +37 -0
  202. diffusers/pipelines/free_init_utils.py +41 -38
  203. diffusers/pipelines/free_noise_utils.py +596 -0
  204. diffusers/pipelines/hunyuan_video/__init__.py +48 -0
  205. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +687 -0
  206. diffusers/pipelines/hunyuan_video/pipeline_output.py +20 -0
  207. diffusers/pipelines/hunyuandit/__init__.py +48 -0
  208. diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +916 -0
  209. diffusers/pipelines/i2vgen_xl/pipeline_i2vgen_xl.py +33 -48
  210. diffusers/pipelines/kandinsky/pipeline_kandinsky.py +8 -8
  211. diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +32 -29
  212. diffusers/pipelines/kandinsky/pipeline_kandinsky_img2img.py +11 -11
  213. diffusers/pipelines/kandinsky/pipeline_kandinsky_inpaint.py +12 -12
  214. diffusers/pipelines/kandinsky/pipeline_kandinsky_prior.py +10 -10
  215. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2.py +6 -6
  216. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +34 -31
  217. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet.py +10 -10
  218. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet_img2img.py +10 -10
  219. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_img2img.py +6 -6
  220. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_inpainting.py +8 -8
  221. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior.py +7 -7
  222. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior_emb2emb.py +6 -6
  223. diffusers/pipelines/kandinsky3/convert_kandinsky3_unet.py +3 -3
  224. diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py +22 -35
  225. diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py +26 -37
  226. diffusers/pipelines/kolors/__init__.py +54 -0
  227. diffusers/pipelines/kolors/pipeline_kolors.py +1070 -0
  228. diffusers/pipelines/kolors/pipeline_kolors_img2img.py +1250 -0
  229. diffusers/pipelines/kolors/pipeline_output.py +21 -0
  230. diffusers/pipelines/kolors/text_encoder.py +889 -0
  231. diffusers/pipelines/kolors/tokenizer.py +338 -0
  232. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +82 -62
  233. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +77 -60
  234. diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +12 -12
  235. diffusers/pipelines/latte/__init__.py +48 -0
  236. diffusers/pipelines/latte/pipeline_latte.py +881 -0
  237. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +80 -74
  238. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +85 -76
  239. diffusers/pipelines/ledits_pp/pipeline_output.py +2 -2
  240. diffusers/pipelines/ltx/__init__.py +50 -0
  241. diffusers/pipelines/ltx/pipeline_ltx.py +789 -0
  242. diffusers/pipelines/ltx/pipeline_ltx_image2video.py +885 -0
  243. diffusers/pipelines/ltx/pipeline_output.py +20 -0
  244. diffusers/pipelines/lumina/__init__.py +48 -0
  245. diffusers/pipelines/lumina/pipeline_lumina.py +890 -0
  246. diffusers/pipelines/marigold/__init__.py +50 -0
  247. diffusers/pipelines/marigold/marigold_image_processing.py +576 -0
  248. diffusers/pipelines/marigold/pipeline_marigold_depth.py +813 -0
  249. diffusers/pipelines/marigold/pipeline_marigold_normals.py +690 -0
  250. diffusers/pipelines/mochi/__init__.py +48 -0
  251. diffusers/pipelines/mochi/pipeline_mochi.py +748 -0
  252. diffusers/pipelines/mochi/pipeline_output.py +20 -0
  253. diffusers/pipelines/musicldm/pipeline_musicldm.py +14 -14
  254. diffusers/pipelines/pag/__init__.py +80 -0
  255. diffusers/pipelines/pag/pag_utils.py +243 -0
  256. diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +1328 -0
  257. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +1543 -0
  258. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +1610 -0
  259. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +1683 -0
  260. diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +969 -0
  261. diffusers/pipelines/pag/pipeline_pag_kolors.py +1136 -0
  262. diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +865 -0
  263. diffusers/pipelines/pag/pipeline_pag_sana.py +886 -0
  264. diffusers/pipelines/pag/pipeline_pag_sd.py +1062 -0
  265. diffusers/pipelines/pag/pipeline_pag_sd_3.py +994 -0
  266. diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +1058 -0
  267. diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +866 -0
  268. diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +1094 -0
  269. diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +1356 -0
  270. diffusers/pipelines/pag/pipeline_pag_sd_xl.py +1345 -0
  271. diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +1544 -0
  272. diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +1776 -0
  273. diffusers/pipelines/paint_by_example/pipeline_paint_by_example.py +17 -12
  274. diffusers/pipelines/pia/pipeline_pia.py +74 -164
  275. diffusers/pipelines/pipeline_flax_utils.py +5 -10
  276. diffusers/pipelines/pipeline_loading_utils.py +515 -53
  277. diffusers/pipelines/pipeline_utils.py +411 -222
  278. diffusers/pipelines/pixart_alpha/__init__.py +8 -1
  279. diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +76 -93
  280. diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +873 -0
  281. diffusers/pipelines/sana/__init__.py +47 -0
  282. diffusers/pipelines/sana/pipeline_output.py +21 -0
  283. diffusers/pipelines/sana/pipeline_sana.py +884 -0
  284. diffusers/pipelines/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py +27 -23
  285. diffusers/pipelines/shap_e/pipeline_shap_e.py +3 -3
  286. diffusers/pipelines/shap_e/pipeline_shap_e_img2img.py +14 -14
  287. diffusers/pipelines/shap_e/renderer.py +1 -1
  288. diffusers/pipelines/stable_audio/__init__.py +50 -0
  289. diffusers/pipelines/stable_audio/modeling_stable_audio.py +158 -0
  290. diffusers/pipelines/stable_audio/pipeline_stable_audio.py +756 -0
  291. diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +71 -25
  292. diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py +23 -19
  293. diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +35 -34
  294. diffusers/pipelines/stable_diffusion/__init__.py +0 -1
  295. diffusers/pipelines/stable_diffusion/convert_from_ckpt.py +20 -11
  296. diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion.py +1 -1
  297. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py +2 -2
  298. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py +6 -6
  299. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +145 -79
  300. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py +43 -28
  301. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_image_variation.py +13 -8
  302. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +100 -68
  303. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +109 -201
  304. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py +131 -32
  305. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +247 -87
  306. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py +30 -29
  307. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip.py +35 -27
  308. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip_img2img.py +49 -42
  309. diffusers/pipelines/stable_diffusion/safety_checker.py +2 -1
  310. diffusers/pipelines/stable_diffusion_3/__init__.py +54 -0
  311. diffusers/pipelines/stable_diffusion_3/pipeline_output.py +21 -0
  312. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +1140 -0
  313. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +1036 -0
  314. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +1250 -0
  315. diffusers/pipelines/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py +29 -20
  316. diffusers/pipelines/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py +59 -58
  317. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py +31 -25
  318. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +38 -22
  319. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +30 -24
  320. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_xl_k_diffusion.py +24 -23
  321. diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +107 -67
  322. diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +316 -69
  323. diffusers/pipelines/stable_diffusion_safe/pipeline_stable_diffusion_safe.py +10 -5
  324. diffusers/pipelines/stable_diffusion_safe/safety_checker.py +1 -1
  325. diffusers/pipelines/stable_diffusion_sag/pipeline_stable_diffusion_sag.py +98 -30
  326. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +121 -83
  327. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +161 -105
  328. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +142 -218
  329. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_instruct_pix2pix.py +45 -29
  330. diffusers/pipelines/stable_diffusion_xl/watermark.py +9 -3
  331. diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +110 -57
  332. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +69 -39
  333. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +105 -74
  334. diffusers/pipelines/text_to_video_synthesis/pipeline_output.py +3 -2
  335. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth.py +29 -49
  336. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth_img2img.py +32 -93
  337. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero.py +37 -25
  338. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +54 -40
  339. diffusers/pipelines/unclip/pipeline_unclip.py +6 -6
  340. diffusers/pipelines/unclip/pipeline_unclip_image_variation.py +6 -6
  341. diffusers/pipelines/unidiffuser/modeling_text_decoder.py +1 -1
  342. diffusers/pipelines/unidiffuser/modeling_uvit.py +12 -12
  343. diffusers/pipelines/unidiffuser/pipeline_unidiffuser.py +29 -28
  344. diffusers/pipelines/wuerstchen/modeling_paella_vq_model.py +5 -5
  345. diffusers/pipelines/wuerstchen/modeling_wuerstchen_common.py +5 -10
  346. diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +6 -8
  347. diffusers/pipelines/wuerstchen/pipeline_wuerstchen.py +4 -4
  348. diffusers/pipelines/wuerstchen/pipeline_wuerstchen_combined.py +12 -12
  349. diffusers/pipelines/wuerstchen/pipeline_wuerstchen_prior.py +15 -14
  350. diffusers/{models/dual_transformer_2d.py → quantizers/__init__.py} +2 -6
  351. diffusers/quantizers/auto.py +139 -0
  352. diffusers/quantizers/base.py +233 -0
  353. diffusers/quantizers/bitsandbytes/__init__.py +2 -0
  354. diffusers/quantizers/bitsandbytes/bnb_quantizer.py +561 -0
  355. diffusers/quantizers/bitsandbytes/utils.py +306 -0
  356. diffusers/quantizers/gguf/__init__.py +1 -0
  357. diffusers/quantizers/gguf/gguf_quantizer.py +159 -0
  358. diffusers/quantizers/gguf/utils.py +456 -0
  359. diffusers/quantizers/quantization_config.py +669 -0
  360. diffusers/quantizers/torchao/__init__.py +15 -0
  361. diffusers/quantizers/torchao/torchao_quantizer.py +292 -0
  362. diffusers/schedulers/__init__.py +12 -2
  363. diffusers/schedulers/deprecated/__init__.py +1 -1
  364. diffusers/schedulers/deprecated/scheduling_karras_ve.py +25 -25
  365. diffusers/schedulers/scheduling_amused.py +5 -5
  366. diffusers/schedulers/scheduling_consistency_decoder.py +11 -11
  367. diffusers/schedulers/scheduling_consistency_models.py +23 -25
  368. diffusers/schedulers/scheduling_cosine_dpmsolver_multistep.py +572 -0
  369. diffusers/schedulers/scheduling_ddim.py +27 -26
  370. diffusers/schedulers/scheduling_ddim_cogvideox.py +452 -0
  371. diffusers/schedulers/scheduling_ddim_flax.py +2 -1
  372. diffusers/schedulers/scheduling_ddim_inverse.py +16 -16
  373. diffusers/schedulers/scheduling_ddim_parallel.py +32 -31
  374. diffusers/schedulers/scheduling_ddpm.py +27 -30
  375. diffusers/schedulers/scheduling_ddpm_flax.py +7 -3
  376. diffusers/schedulers/scheduling_ddpm_parallel.py +33 -36
  377. diffusers/schedulers/scheduling_ddpm_wuerstchen.py +14 -14
  378. diffusers/schedulers/scheduling_deis_multistep.py +150 -50
  379. diffusers/schedulers/scheduling_dpm_cogvideox.py +489 -0
  380. diffusers/schedulers/scheduling_dpmsolver_multistep.py +221 -84
  381. diffusers/schedulers/scheduling_dpmsolver_multistep_flax.py +2 -2
  382. diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +158 -52
  383. diffusers/schedulers/scheduling_dpmsolver_sde.py +153 -34
  384. diffusers/schedulers/scheduling_dpmsolver_singlestep.py +275 -86
  385. diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py +81 -57
  386. diffusers/schedulers/scheduling_edm_euler.py +62 -39
  387. diffusers/schedulers/scheduling_euler_ancestral_discrete.py +30 -29
  388. diffusers/schedulers/scheduling_euler_discrete.py +255 -74
  389. diffusers/schedulers/scheduling_flow_match_euler_discrete.py +458 -0
  390. diffusers/schedulers/scheduling_flow_match_heun_discrete.py +320 -0
  391. diffusers/schedulers/scheduling_heun_discrete.py +174 -46
  392. diffusers/schedulers/scheduling_ipndm.py +9 -9
  393. diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +138 -29
  394. diffusers/schedulers/scheduling_k_dpm_2_discrete.py +132 -26
  395. diffusers/schedulers/scheduling_karras_ve_flax.py +6 -6
  396. diffusers/schedulers/scheduling_lcm.py +23 -29
  397. diffusers/schedulers/scheduling_lms_discrete.py +105 -28
  398. diffusers/schedulers/scheduling_pndm.py +20 -20
  399. diffusers/schedulers/scheduling_repaint.py +21 -21
  400. diffusers/schedulers/scheduling_sasolver.py +157 -60
  401. diffusers/schedulers/scheduling_sde_ve.py +19 -19
  402. diffusers/schedulers/scheduling_tcd.py +41 -36
  403. diffusers/schedulers/scheduling_unclip.py +19 -16
  404. diffusers/schedulers/scheduling_unipc_multistep.py +243 -47
  405. diffusers/schedulers/scheduling_utils.py +12 -5
  406. diffusers/schedulers/scheduling_utils_flax.py +1 -3
  407. diffusers/schedulers/scheduling_vq_diffusion.py +10 -10
  408. diffusers/training_utils.py +214 -30
  409. diffusers/utils/__init__.py +17 -1
  410. diffusers/utils/constants.py +3 -0
  411. diffusers/utils/doc_utils.py +1 -0
  412. diffusers/utils/dummy_pt_objects.py +592 -7
  413. diffusers/utils/dummy_torch_and_torchsde_objects.py +15 -0
  414. diffusers/utils/dummy_torch_and_transformers_and_sentencepiece_objects.py +47 -0
  415. diffusers/utils/dummy_torch_and_transformers_objects.py +1001 -71
  416. diffusers/utils/dynamic_modules_utils.py +34 -29
  417. diffusers/utils/export_utils.py +50 -6
  418. diffusers/utils/hub_utils.py +131 -17
  419. diffusers/utils/import_utils.py +210 -8
  420. diffusers/utils/loading_utils.py +118 -5
  421. diffusers/utils/logging.py +4 -2
  422. diffusers/utils/peft_utils.py +37 -7
  423. diffusers/utils/state_dict_utils.py +13 -2
  424. diffusers/utils/testing_utils.py +193 -11
  425. diffusers/utils/torch_utils.py +4 -0
  426. diffusers/video_processor.py +113 -0
  427. {diffusers-0.27.1.dist-info → diffusers-0.32.2.dist-info}/METADATA +82 -91
  428. diffusers-0.32.2.dist-info/RECORD +550 -0
  429. {diffusers-0.27.1.dist-info → diffusers-0.32.2.dist-info}/WHEEL +1 -1
  430. diffusers/loaders/autoencoder.py +0 -146
  431. diffusers/loaders/controlnet.py +0 -136
  432. diffusers/loaders/lora.py +0 -1349
  433. diffusers/models/prior_transformer.py +0 -12
  434. diffusers/models/t5_film_transformer.py +0 -70
  435. diffusers/models/transformer_2d.py +0 -25
  436. diffusers/models/transformer_temporal.py +0 -34
  437. diffusers/models/unet_1d.py +0 -26
  438. diffusers/models/unet_1d_blocks.py +0 -203
  439. diffusers/models/unet_2d.py +0 -27
  440. diffusers/models/unet_2d_blocks.py +0 -375
  441. diffusers/models/unet_2d_condition.py +0 -25
  442. diffusers-0.27.1.dist-info/RECORD +0 -399
  443. {diffusers-0.27.1.dist-info → diffusers-0.32.2.dist-info}/LICENSE +0 -0
  444. {diffusers-0.27.1.dist-info → diffusers-0.32.2.dist-info}/entry_points.txt +0 -0
  445. {diffusers-0.27.1.dist-info → diffusers-0.32.2.dist-info}/top_level.txt +0 -0
@@ -11,144 +11,253 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+ import importlib
15
+ import inspect
16
+ import os
14
17
 
15
- from huggingface_hub.utils import validate_hf_hub_args
18
+ import torch
19
+ from huggingface_hub import snapshot_download
20
+ from huggingface_hub.utils import LocalEntryNotFoundError, validate_hf_hub_args
21
+ from packaging import version
16
22
 
17
- from ..utils import is_transformers_available, logging
23
+ from ..utils import deprecate, is_transformers_available, logging
18
24
  from .single_file_utils import (
19
- create_diffusers_unet_model_from_ldm,
20
- create_diffusers_vae_model_from_ldm,
21
- create_scheduler_from_ldm,
22
- create_text_encoders_and_tokenizers_from_ldm,
23
- fetch_ldm_config_and_checkpoint,
24
- infer_model_type,
25
+ SingleFileComponentError,
26
+ _is_legacy_scheduler_kwargs,
27
+ _is_model_weights_in_cached_folder,
28
+ _legacy_load_clip_tokenizer,
29
+ _legacy_load_safety_checker,
30
+ _legacy_load_scheduler,
31
+ create_diffusers_clip_model_from_ldm,
32
+ create_diffusers_t5_model_from_checkpoint,
33
+ fetch_diffusers_config,
34
+ fetch_original_config,
35
+ is_clip_model_in_single_file,
36
+ is_t5_in_single_file,
37
+ load_single_file_checkpoint,
25
38
  )
26
39
 
27
40
 
28
41
  logger = logging.get_logger(__name__)
29
42
 
30
- # Pipelines that support the SDXL Refiner checkpoint
31
- REFINER_PIPELINES = [
32
- "StableDiffusionXLImg2ImgPipeline",
33
- "StableDiffusionXLInpaintPipeline",
34
- "StableDiffusionXLControlNetImg2ImgPipeline",
35
- ]
43
+ # Legacy behaviour. `from_single_file` does not load the safety checker unless explicitly provided
44
+ SINGLE_FILE_OPTIONAL_COMPONENTS = ["safety_checker"]
36
45
 
37
46
  if is_transformers_available():
38
- from transformers import AutoFeatureExtractor
47
+ import transformers
48
+ from transformers import PreTrainedModel, PreTrainedTokenizer
39
49
 
40
50
 
41
- def build_sub_model_components(
42
- pipeline_components,
43
- pipeline_class_name,
44
- component_name,
45
- original_config,
51
+ def load_single_file_sub_model(
52
+ library_name,
53
+ class_name,
54
+ name,
46
55
  checkpoint,
56
+ pipelines,
57
+ is_pipeline_module,
58
+ cached_model_config_path,
59
+ original_config=None,
47
60
  local_files_only=False,
48
- load_safety_checker=False,
49
- model_type=None,
50
- image_size=None,
51
61
  torch_dtype=None,
62
+ is_legacy_loading=False,
52
63
  **kwargs,
53
64
  ):
54
- if component_name in pipeline_components:
55
- return {}
56
-
57
- if component_name == "unet":
58
- num_in_channels = kwargs.pop("num_in_channels", None)
59
- upcast_attention = kwargs.pop("upcast_attention", None)
60
-
61
- unet_components = create_diffusers_unet_model_from_ldm(
62
- pipeline_class_name,
63
- original_config,
64
- checkpoint,
65
- num_in_channels=num_in_channels,
66
- image_size=image_size,
65
+ if is_pipeline_module:
66
+ pipeline_module = getattr(pipelines, library_name)
67
+ class_obj = getattr(pipeline_module, class_name)
68
+ else:
69
+ # else we just import it from the library.
70
+ library = importlib.import_module(library_name)
71
+ class_obj = getattr(library, class_name)
72
+
73
+ if is_transformers_available():
74
+ transformers_version = version.parse(version.parse(transformers.__version__).base_version)
75
+ else:
76
+ transformers_version = "N/A"
77
+
78
+ is_transformers_model = (
79
+ is_transformers_available()
80
+ and issubclass(class_obj, PreTrainedModel)
81
+ and transformers_version >= version.parse("4.20.0")
82
+ )
83
+ is_tokenizer = (
84
+ is_transformers_available()
85
+ and issubclass(class_obj, PreTrainedTokenizer)
86
+ and transformers_version >= version.parse("4.20.0")
87
+ )
88
+
89
+ diffusers_module = importlib.import_module(__name__.split(".")[0])
90
+ is_diffusers_single_file_model = issubclass(class_obj, diffusers_module.FromOriginalModelMixin)
91
+ is_diffusers_model = issubclass(class_obj, diffusers_module.ModelMixin)
92
+ is_diffusers_scheduler = issubclass(class_obj, diffusers_module.SchedulerMixin)
93
+
94
+ if is_diffusers_single_file_model:
95
+ load_method = getattr(class_obj, "from_single_file")
96
+
97
+ # We cannot provide two different config options to the `from_single_file` method
98
+ # Here we have to ignore loading the config from `cached_model_config_path` if `original_config` is provided
99
+ if original_config:
100
+ cached_model_config_path = None
101
+
102
+ loaded_sub_model = load_method(
103
+ pretrained_model_link_or_path_or_dict=checkpoint,
104
+ original_config=original_config,
105
+ config=cached_model_config_path,
106
+ subfolder=name,
67
107
  torch_dtype=torch_dtype,
68
- model_type=model_type,
69
- upcast_attention=upcast_attention,
108
+ local_files_only=local_files_only,
109
+ **kwargs,
70
110
  )
71
- return unet_components
72
111
 
73
- if component_name == "vae":
74
- scaling_factor = kwargs.get("scaling_factor", None)
75
- vae_components = create_diffusers_vae_model_from_ldm(
76
- pipeline_class_name,
77
- original_config,
78
- checkpoint,
79
- image_size,
80
- scaling_factor,
81
- torch_dtype,
82
- model_type=model_type,
83
- )
84
- return vae_components
85
-
86
- if component_name == "scheduler":
87
- scheduler_type = kwargs.get("scheduler_type", "ddim")
88
- prediction_type = kwargs.get("prediction_type", None)
89
-
90
- scheduler_components = create_scheduler_from_ldm(
91
- pipeline_class_name,
92
- original_config,
93
- checkpoint,
94
- scheduler_type=scheduler_type,
95
- prediction_type=prediction_type,
96
- model_type=model_type,
112
+ elif is_transformers_model and is_clip_model_in_single_file(class_obj, checkpoint):
113
+ loaded_sub_model = create_diffusers_clip_model_from_ldm(
114
+ class_obj,
115
+ checkpoint=checkpoint,
116
+ config=cached_model_config_path,
117
+ subfolder=name,
118
+ torch_dtype=torch_dtype,
119
+ local_files_only=local_files_only,
120
+ is_legacy_loading=is_legacy_loading,
97
121
  )
98
122
 
99
- return scheduler_components
100
-
101
- if component_name in ["text_encoder", "text_encoder_2", "tokenizer", "tokenizer_2"]:
102
- text_encoder_components = create_text_encoders_and_tokenizers_from_ldm(
103
- original_config,
104
- checkpoint,
105
- model_type=model_type,
106
- local_files_only=local_files_only,
123
+ elif is_transformers_model and is_t5_in_single_file(checkpoint):
124
+ loaded_sub_model = create_diffusers_t5_model_from_checkpoint(
125
+ class_obj,
126
+ checkpoint=checkpoint,
127
+ config=cached_model_config_path,
128
+ subfolder=name,
107
129
  torch_dtype=torch_dtype,
130
+ local_files_only=local_files_only,
108
131
  )
109
- return text_encoder_components
110
132
 
111
- if component_name == "safety_checker":
112
- if load_safety_checker:
113
- from ..pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker
133
+ elif is_tokenizer and is_legacy_loading:
134
+ loaded_sub_model = _legacy_load_clip_tokenizer(
135
+ class_obj, checkpoint=checkpoint, config=cached_model_config_path, local_files_only=local_files_only
136
+ )
114
137
 
115
- safety_checker = StableDiffusionSafetyChecker.from_pretrained(
116
- "CompVis/stable-diffusion-safety-checker", local_files_only=local_files_only, torch_dtype=torch_dtype
117
- )
118
- else:
119
- safety_checker = None
120
- return {"safety_checker": safety_checker}
138
+ elif is_diffusers_scheduler and (is_legacy_loading or _is_legacy_scheduler_kwargs(kwargs)):
139
+ loaded_sub_model = _legacy_load_scheduler(
140
+ class_obj, checkpoint=checkpoint, component_name=name, original_config=original_config, **kwargs
141
+ )
121
142
 
122
- if component_name == "feature_extractor":
123
- if load_safety_checker:
124
- feature_extractor = AutoFeatureExtractor.from_pretrained(
125
- "CompVis/stable-diffusion-safety-checker", local_files_only=local_files_only
143
+ else:
144
+ if not hasattr(class_obj, "from_pretrained"):
145
+ raise ValueError(
146
+ (
147
+ f"The component {class_obj.__name__} cannot be loaded as it does not seem to have"
148
+ " a supported loading method."
149
+ )
126
150
  )
151
+
152
+ loading_kwargs = {}
153
+ loading_kwargs.update(
154
+ {
155
+ "pretrained_model_name_or_path": cached_model_config_path,
156
+ "subfolder": name,
157
+ "local_files_only": local_files_only,
158
+ }
159
+ )
160
+
161
+ # Schedulers and Tokenizers don't make use of torch_dtype
162
+ # Skip passing it to those objects
163
+ if issubclass(class_obj, torch.nn.Module):
164
+ loading_kwargs.update({"torch_dtype": torch_dtype})
165
+
166
+ if is_diffusers_model or is_transformers_model:
167
+ if not _is_model_weights_in_cached_folder(cached_model_config_path, name):
168
+ raise SingleFileComponentError(
169
+ f"Failed to load {class_name}. Weights for this component appear to be missing in the checkpoint."
170
+ )
171
+
172
+ load_method = getattr(class_obj, "from_pretrained")
173
+ loaded_sub_model = load_method(**loading_kwargs)
174
+
175
+ return loaded_sub_model
176
+
177
+
178
+ def _map_component_types_to_config_dict(component_types):
179
+ diffusers_module = importlib.import_module(__name__.split(".")[0])
180
+ config_dict = {}
181
+ component_types.pop("self", None)
182
+
183
+ if is_transformers_available():
184
+ transformers_version = version.parse(version.parse(transformers.__version__).base_version)
185
+ else:
186
+ transformers_version = "N/A"
187
+
188
+ for component_name, component_value in component_types.items():
189
+ is_diffusers_model = issubclass(component_value[0], diffusers_module.ModelMixin)
190
+ is_scheduler_enum = component_value[0].__name__ == "KarrasDiffusionSchedulers"
191
+ is_scheduler = issubclass(component_value[0], diffusers_module.SchedulerMixin)
192
+
193
+ is_transformers_model = (
194
+ is_transformers_available()
195
+ and issubclass(component_value[0], PreTrainedModel)
196
+ and transformers_version >= version.parse("4.20.0")
197
+ )
198
+ is_transformers_tokenizer = (
199
+ is_transformers_available()
200
+ and issubclass(component_value[0], PreTrainedTokenizer)
201
+ and transformers_version >= version.parse("4.20.0")
202
+ )
203
+
204
+ if is_diffusers_model and component_name not in SINGLE_FILE_OPTIONAL_COMPONENTS:
205
+ config_dict[component_name] = ["diffusers", component_value[0].__name__]
206
+
207
+ elif is_scheduler_enum or is_scheduler:
208
+ if is_scheduler_enum:
209
+ # Since we cannot fetch a scheduler config from the hub, we default to DDIMScheduler
210
+ # if the type hint is a KarrassDiffusionSchedulers enum
211
+ config_dict[component_name] = ["diffusers", "DDIMScheduler"]
212
+
213
+ elif is_scheduler:
214
+ config_dict[component_name] = ["diffusers", component_value[0].__name__]
215
+
216
+ elif (
217
+ is_transformers_model or is_transformers_tokenizer
218
+ ) and component_name not in SINGLE_FILE_OPTIONAL_COMPONENTS:
219
+ config_dict[component_name] = ["transformers", component_value[0].__name__]
220
+
127
221
  else:
128
- feature_extractor = None
129
- return {"feature_extractor": feature_extractor}
222
+ config_dict[component_name] = [None, None]
223
+
224
+ return config_dict
225
+
130
226
 
131
- return
227
+ def _infer_pipeline_config_dict(pipeline_class):
228
+ parameters = inspect.signature(pipeline_class.__init__).parameters
229
+ required_parameters = {k: v for k, v in parameters.items() if v.default == inspect._empty}
230
+ component_types = pipeline_class._get_signature_types()
132
231
 
232
+ # Ignore parameters that are not required for the pipeline
233
+ component_types = {k: v for k, v in component_types.items() if k in required_parameters}
234
+ config_dict = _map_component_types_to_config_dict(component_types)
133
235
 
134
- def set_additional_components(
135
- pipeline_class_name,
136
- original_config,
137
- checkpoint=None,
138
- model_type=None,
236
+ return config_dict
237
+
238
+
239
+ def _download_diffusers_model_config_from_hub(
240
+ pretrained_model_name_or_path,
241
+ cache_dir,
242
+ revision,
243
+ proxies,
244
+ force_download=None,
245
+ local_files_only=None,
246
+ token=None,
139
247
  ):
140
- components = {}
141
- if pipeline_class_name in REFINER_PIPELINES:
142
- model_type = infer_model_type(original_config, checkpoint=checkpoint, model_type=model_type)
143
- is_refiner = model_type == "SDXL-Refiner"
144
- components.update(
145
- {
146
- "requires_aesthetics_score": is_refiner,
147
- "force_zeros_for_empty_prompt": False if is_refiner else True,
148
- }
149
- )
248
+ allow_patterns = ["**/*.json", "*.json", "*.txt", "**/*.txt", "**/*.model"]
249
+ cached_model_path = snapshot_download(
250
+ pretrained_model_name_or_path,
251
+ cache_dir=cache_dir,
252
+ revision=revision,
253
+ proxies=proxies,
254
+ force_download=force_download,
255
+ local_files_only=local_files_only,
256
+ token=token,
257
+ allow_patterns=allow_patterns,
258
+ )
150
259
 
151
- return components
260
+ return cached_model_path
152
261
 
153
262
 
154
263
  class FromSingleFileMixin:
@@ -177,9 +286,7 @@ class FromSingleFileMixin:
177
286
  cache_dir (`Union[str, os.PathLike]`, *optional*):
178
287
  Path to a directory where a downloaded pretrained model configuration is cached if the standard cache
179
288
  is not used.
180
- resume_download (`bool`, *optional*, defaults to `False`):
181
- Whether or not to resume downloading the model weights and configuration files. If set to `False`, any
182
- incompletely downloaded files are deleted.
289
+
183
290
  proxies (`Dict[str, str]`, *optional*):
184
291
  A dictionary of proxy servers to use by protocol or endpoint, for example, `{'http': 'foo.bar:3128',
185
292
  'http://hostname': 'foo.bar:4012'}`. The proxies are used on each request.
@@ -195,22 +302,12 @@ class FromSingleFileMixin:
195
302
  original_config_file (`str`, *optional*):
196
303
  The path to the original config file that was used to train the model. If not provided, the config file
197
304
  will be inferred from the checkpoint file.
198
- model_type (`str`, *optional*):
199
- The type of model to load. If not provided, the model type will be inferred from the checkpoint file.
200
- image_size (`int`, *optional*):
201
- The size of the image output. It's used to configure the `sample_size` parameter of the UNet and VAE model.
202
- load_safety_checker (`bool`, *optional*, defaults to `False`):
203
- Whether to load the safety checker model or not. By default, the safety checker is not loaded unless a `safety_checker` component is passed to the `kwargs`.
204
- num_in_channels (`int`, *optional*):
205
- Specify the number of input channels for the UNet model. Read more about how to configure UNet model with this parameter
206
- [here](https://huggingface.co/docs/diffusers/training/adapt_a_model#configure-unet2dconditionmodel-parameters).
207
- scaling_factor (`float`, *optional*):
208
- The scaling factor to use for the VAE model. If not provided, it is inferred from the config file first.
209
- If the scaling factor is not found in the config file, the default value 0.18215 is used.
210
- scheduler_type (`str`, *optional*):
211
- The type of scheduler to load. If not provided, the scheduler type will be inferred from the checkpoint file.
212
- prediction_type (`str`, *optional*):
213
- The type of prediction to load. If not provided, the prediction type will be inferred from the checkpoint file.
305
+ config (`str`, *optional*):
306
+ Can be either:
307
+ - A string, the *repo id* (for example `CompVis/ldm-text2im-large-256`) of a pretrained pipeline
308
+ hosted on the Hub.
309
+ - A path to a *directory* (for example `./my_pipeline_directory/`) containing the pipeline
310
+ component configs in Diffusers format.
214
311
  kwargs (remaining dictionary of keyword arguments, *optional*):
215
312
  Can be used to overwrite load and saveable variables (the pipeline components of the specific pipeline
216
313
  class). The overwritten components are passed directly to the pipelines `__init__` method. See example
@@ -228,7 +325,7 @@ class FromSingleFileMixin:
228
325
 
229
326
  >>> # Download pipeline from local file
230
327
  >>> # file is downloaded under ./v1-5-pruned-emaonly.ckpt
231
- >>> pipeline = StableDiffusionPipeline.from_single_file("./v1-5-pruned-emaonly")
328
+ >>> pipeline = StableDiffusionPipeline.from_single_file("./v1-5-pruned-emaonly.ckpt")
232
329
 
233
330
  >>> # Enable float16 and move to GPU
234
331
  >>> pipeline = StableDiffusionPipeline.from_single_file(
@@ -237,9 +334,20 @@ class FromSingleFileMixin:
237
334
  ... )
238
335
  >>> pipeline.to("cuda")
239
336
  ```
337
+
240
338
  """
241
339
  original_config_file = kwargs.pop("original_config_file", None)
242
- resume_download = kwargs.pop("resume_download", False)
340
+ config = kwargs.pop("config", None)
341
+ original_config = kwargs.pop("original_config", None)
342
+
343
+ if original_config_file is not None:
344
+ deprecation_message = (
345
+ "`original_config_file` argument is deprecated and will be removed in future versions."
346
+ "please use the `original_config` argument instead."
347
+ )
348
+ deprecate("original_config_file", "1.0.0", deprecation_message)
349
+ original_config = original_config_file
350
+
243
351
  force_download = kwargs.pop("force_download", False)
244
352
  proxies = kwargs.pop("proxies", None)
245
353
  token = kwargs.pop("token", None)
@@ -248,71 +356,195 @@ class FromSingleFileMixin:
248
356
  revision = kwargs.pop("revision", None)
249
357
  torch_dtype = kwargs.pop("torch_dtype", None)
250
358
 
251
- class_name = cls.__name__
359
+ is_legacy_loading = False
360
+
361
+ # We shouldn't allow configuring individual models components through a Pipeline creation method
362
+ # These model kwargs should be deprecated
363
+ scaling_factor = kwargs.get("scaling_factor", None)
364
+ if scaling_factor is not None:
365
+ deprecation_message = (
366
+ "Passing the `scaling_factor` argument to `from_single_file is deprecated "
367
+ "and will be ignored in future versions."
368
+ )
369
+ deprecate("scaling_factor", "1.0.0", deprecation_message)
370
+
371
+ if original_config is not None:
372
+ original_config = fetch_original_config(original_config, local_files_only=local_files_only)
252
373
 
253
- original_config, checkpoint = fetch_ldm_config_and_checkpoint(
254
- pretrained_model_link_or_path=pretrained_model_link_or_path,
255
- class_name=class_name,
256
- original_config_file=original_config_file,
257
- resume_download=resume_download,
374
+ from ..pipelines.pipeline_utils import _get_pipeline_class
375
+
376
+ pipeline_class = _get_pipeline_class(cls, config=None)
377
+
378
+ checkpoint = load_single_file_checkpoint(
379
+ pretrained_model_link_or_path,
258
380
  force_download=force_download,
259
381
  proxies=proxies,
260
382
  token=token,
261
- revision=revision,
262
- local_files_only=local_files_only,
263
383
  cache_dir=cache_dir,
384
+ local_files_only=local_files_only,
385
+ revision=revision,
264
386
  )
265
387
 
266
- from ..pipelines.pipeline_utils import _get_pipeline_class
388
+ if config is None:
389
+ config = fetch_diffusers_config(checkpoint)
390
+ default_pretrained_model_config_name = config["pretrained_model_name_or_path"]
391
+ else:
392
+ default_pretrained_model_config_name = config
393
+
394
+ if not os.path.isdir(default_pretrained_model_config_name):
395
+ # Provided config is a repo_id
396
+ if default_pretrained_model_config_name.count("/") > 1:
397
+ raise ValueError(
398
+ f'The provided config "{config}"'
399
+ " is neither a valid local path nor a valid repo id. Please check the parameter."
400
+ )
401
+ try:
402
+ # Attempt to download the config files for the pipeline
403
+ cached_model_config_path = _download_diffusers_model_config_from_hub(
404
+ default_pretrained_model_config_name,
405
+ cache_dir=cache_dir,
406
+ revision=revision,
407
+ proxies=proxies,
408
+ force_download=force_download,
409
+ local_files_only=local_files_only,
410
+ token=token,
411
+ )
412
+ config_dict = pipeline_class.load_config(cached_model_config_path)
413
+
414
+ except LocalEntryNotFoundError:
415
+ # `local_files_only=True` but a local diffusers format model config is not available in the cache
416
+ # If `original_config` is not provided, we need override `local_files_only` to False
417
+ # to fetch the config files from the hub so that we have a way
418
+ # to configure the pipeline components.
419
+
420
+ if original_config is None:
421
+ logger.warning(
422
+ "`local_files_only` is True but no local configs were found for this checkpoint.\n"
423
+ "Attempting to download the necessary config files for this pipeline.\n"
424
+ )
425
+ cached_model_config_path = _download_diffusers_model_config_from_hub(
426
+ default_pretrained_model_config_name,
427
+ cache_dir=cache_dir,
428
+ revision=revision,
429
+ proxies=proxies,
430
+ force_download=force_download,
431
+ local_files_only=False,
432
+ token=token,
433
+ )
434
+ config_dict = pipeline_class.load_config(cached_model_config_path)
435
+
436
+ else:
437
+ # For backwards compatibility
438
+ # If `original_config` is provided, then we need to assume we are using legacy loading for pipeline components
439
+ logger.warning(
440
+ "Detected legacy `from_single_file` loading behavior. Attempting to create the pipeline based on inferred components.\n"
441
+ "This may lead to errors if the model components are not correctly inferred. \n"
442
+ "To avoid this warning, please explicity pass the `config` argument to `from_single_file` with a path to a local diffusers model repo \n"
443
+ "e.g. `from_single_file(<my model checkpoint path>, config=<path to local diffusers model repo>) \n"
444
+ "or run `from_single_file` with `local_files_only=False` first to update the local cache directory with "
445
+ "the necessary config files.\n"
446
+ )
447
+ is_legacy_loading = True
448
+ cached_model_config_path = None
449
+
450
+ config_dict = _infer_pipeline_config_dict(pipeline_class)
451
+ config_dict["_class_name"] = pipeline_class.__name__
267
452
 
268
- pipeline_class = _get_pipeline_class(
269
- cls,
270
- config=None,
271
- cache_dir=cache_dir,
272
- )
453
+ else:
454
+ # Provided config is a path to a local directory attempt to load directly.
455
+ cached_model_config_path = default_pretrained_model_config_name
456
+ config_dict = pipeline_class.load_config(cached_model_config_path)
273
457
 
274
- expected_modules, optional_kwargs = cls._get_signature_keys(pipeline_class)
458
+ # pop out "_ignore_files" as it is only needed for download
459
+ config_dict.pop("_ignore_files", None)
460
+
461
+ expected_modules, optional_kwargs = pipeline_class._get_signature_keys(cls)
275
462
  passed_class_obj = {k: kwargs.pop(k) for k in expected_modules if k in kwargs}
276
463
  passed_pipe_kwargs = {k: kwargs.pop(k) for k in optional_kwargs if k in kwargs}
277
464
 
278
- model_type = kwargs.pop("model_type", None)
279
- image_size = kwargs.pop("image_size", None)
280
- load_safety_checker = (kwargs.pop("load_safety_checker", False)) or (
281
- passed_class_obj.get("safety_checker", None) is not None
282
- )
465
+ init_dict, unused_kwargs, _ = pipeline_class.extract_init_dict(config_dict, **kwargs)
466
+ init_kwargs = {k: init_dict.pop(k) for k in optional_kwargs if k in init_dict}
467
+ init_kwargs = {**init_kwargs, **passed_pipe_kwargs}
468
+
469
+ from diffusers import pipelines
470
+
471
+ # remove `null` components
472
+ def load_module(name, value):
473
+ if value[0] is None:
474
+ return False
475
+ if name in passed_class_obj and passed_class_obj[name] is None:
476
+ return False
477
+ if name in SINGLE_FILE_OPTIONAL_COMPONENTS:
478
+ return False
479
+
480
+ return True
481
+
482
+ init_dict = {k: v for k, v in init_dict.items() if load_module(k, v)}
483
+
484
+ for name, (library_name, class_name) in logging.tqdm(
485
+ sorted(init_dict.items()), desc="Loading pipeline components..."
486
+ ):
487
+ loaded_sub_model = None
488
+ is_pipeline_module = hasattr(pipelines, library_name)
283
489
 
284
- init_kwargs = {}
285
- for name in expected_modules:
286
490
  if name in passed_class_obj:
287
- init_kwargs[name] = passed_class_obj[name]
491
+ loaded_sub_model = passed_class_obj[name]
492
+
288
493
  else:
289
- components = build_sub_model_components(
290
- init_kwargs,
291
- class_name,
292
- name,
293
- original_config,
294
- checkpoint,
295
- model_type=model_type,
296
- image_size=image_size,
297
- load_safety_checker=load_safety_checker,
298
- local_files_only=local_files_only,
299
- torch_dtype=torch_dtype,
300
- **kwargs,
301
- )
302
- if not components:
303
- continue
304
- init_kwargs.update(components)
494
+ try:
495
+ loaded_sub_model = load_single_file_sub_model(
496
+ library_name=library_name,
497
+ class_name=class_name,
498
+ name=name,
499
+ checkpoint=checkpoint,
500
+ is_pipeline_module=is_pipeline_module,
501
+ cached_model_config_path=cached_model_config_path,
502
+ pipelines=pipelines,
503
+ torch_dtype=torch_dtype,
504
+ original_config=original_config,
505
+ local_files_only=local_files_only,
506
+ is_legacy_loading=is_legacy_loading,
507
+ **kwargs,
508
+ )
509
+ except SingleFileComponentError as e:
510
+ raise SingleFileComponentError(
511
+ (
512
+ f"{e.message}\n"
513
+ f"Please load the component before passing it in as an argument to `from_single_file`.\n"
514
+ f"\n"
515
+ f"{name} = {class_name}.from_pretrained('...')\n"
516
+ f"pipe = {pipeline_class.__name__}.from_single_file(<checkpoint path>, {name}={name})\n"
517
+ f"\n"
518
+ )
519
+ )
520
+
521
+ init_kwargs[name] = loaded_sub_model
522
+
523
+ missing_modules = set(expected_modules) - set(init_kwargs.keys())
524
+ passed_modules = list(passed_class_obj.keys())
525
+ optional_modules = pipeline_class._optional_components
526
+
527
+ if len(missing_modules) > 0 and missing_modules <= set(passed_modules + optional_modules):
528
+ for module in missing_modules:
529
+ init_kwargs[module] = passed_class_obj.get(module, None)
530
+ elif len(missing_modules) > 0:
531
+ passed_modules = set(list(init_kwargs.keys()) + list(passed_class_obj.keys())) - optional_kwargs
532
+ raise ValueError(
533
+ f"Pipeline {pipeline_class} expected {expected_modules}, but only {passed_modules} were passed."
534
+ )
305
535
 
306
- additional_components = set_additional_components(
307
- class_name, original_config, checkpoint=checkpoint, model_type=model_type
308
- )
309
- if additional_components:
310
- init_kwargs.update(additional_components)
536
+ # deprecated kwargs
537
+ load_safety_checker = kwargs.pop("load_safety_checker", None)
538
+ if load_safety_checker is not None:
539
+ deprecation_message = (
540
+ "Please pass instances of `StableDiffusionSafetyChecker` and `AutoImageProcessor`"
541
+ "using the `safety_checker` and `feature_extractor` arguments in `from_single_file`"
542
+ )
543
+ deprecate("load_safety_checker", "1.0.0", deprecation_message)
311
544
 
312
- init_kwargs.update(passed_pipe_kwargs)
313
- pipe = pipeline_class(**init_kwargs)
545
+ safety_checker_components = _legacy_load_safety_checker(local_files_only, torch_dtype)
546
+ init_kwargs.update(safety_checker_components)
314
547
 
315
- if torch_dtype is not None:
316
- pipe.to(dtype=torch_dtype)
548
+ pipe = pipeline_class(**init_kwargs)
317
549
 
318
550
  return pipe