diffusers 0.33.0__py3-none-any.whl → 0.34.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diffusers/__init__.py +48 -1
- diffusers/commands/__init__.py +1 -1
- diffusers/commands/diffusers_cli.py +1 -1
- diffusers/commands/env.py +1 -1
- diffusers/commands/fp16_safetensors.py +1 -1
- diffusers/dependency_versions_check.py +1 -1
- diffusers/dependency_versions_table.py +1 -1
- diffusers/experimental/rl/value_guided_sampling.py +1 -1
- diffusers/hooks/faster_cache.py +2 -2
- diffusers/hooks/group_offloading.py +128 -29
- diffusers/hooks/hooks.py +2 -2
- diffusers/hooks/layerwise_casting.py +3 -3
- diffusers/hooks/pyramid_attention_broadcast.py +1 -1
- diffusers/image_processor.py +7 -2
- diffusers/loaders/__init__.py +4 -0
- diffusers/loaders/ip_adapter.py +5 -14
- diffusers/loaders/lora_base.py +212 -111
- diffusers/loaders/lora_conversion_utils.py +275 -34
- diffusers/loaders/lora_pipeline.py +1554 -819
- diffusers/loaders/peft.py +52 -109
- diffusers/loaders/single_file.py +2 -2
- diffusers/loaders/single_file_model.py +20 -4
- diffusers/loaders/single_file_utils.py +225 -5
- diffusers/loaders/textual_inversion.py +3 -2
- diffusers/loaders/transformer_flux.py +1 -1
- diffusers/loaders/transformer_sd3.py +2 -2
- diffusers/loaders/unet.py +2 -16
- diffusers/loaders/unet_loader_utils.py +1 -1
- diffusers/loaders/utils.py +1 -1
- diffusers/models/__init__.py +15 -1
- diffusers/models/activations.py +5 -5
- diffusers/models/adapter.py +2 -3
- diffusers/models/attention.py +4 -4
- diffusers/models/attention_flax.py +10 -10
- diffusers/models/attention_processor.py +14 -10
- diffusers/models/auto_model.py +47 -10
- diffusers/models/autoencoders/__init__.py +1 -0
- diffusers/models/autoencoders/autoencoder_asym_kl.py +4 -4
- diffusers/models/autoencoders/autoencoder_dc.py +3 -3
- diffusers/models/autoencoders/autoencoder_kl.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_allegro.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +6 -6
- diffusers/models/autoencoders/autoencoder_kl_cosmos.py +1108 -0
- diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +2 -2
- diffusers/models/autoencoders/autoencoder_kl_ltx.py +3 -3
- diffusers/models/autoencoders/autoencoder_kl_magvit.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_mochi.py +3 -3
- diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_wan.py +256 -22
- diffusers/models/autoencoders/autoencoder_oobleck.py +1 -1
- diffusers/models/autoencoders/autoencoder_tiny.py +3 -3
- diffusers/models/autoencoders/consistency_decoder_vae.py +1 -1
- diffusers/models/autoencoders/vae.py +13 -2
- diffusers/models/autoencoders/vq_model.py +2 -2
- diffusers/models/cache_utils.py +1 -1
- diffusers/models/controlnet.py +1 -1
- diffusers/models/controlnet_flux.py +1 -1
- diffusers/models/controlnet_sd3.py +1 -1
- diffusers/models/controlnet_sparsectrl.py +1 -1
- diffusers/models/controlnets/__init__.py +1 -0
- diffusers/models/controlnets/controlnet.py +3 -3
- diffusers/models/controlnets/controlnet_flax.py +1 -1
- diffusers/models/controlnets/controlnet_flux.py +16 -15
- diffusers/models/controlnets/controlnet_hunyuan.py +2 -2
- diffusers/models/controlnets/controlnet_sana.py +290 -0
- diffusers/models/controlnets/controlnet_sd3.py +1 -1
- diffusers/models/controlnets/controlnet_sparsectrl.py +2 -2
- diffusers/models/controlnets/controlnet_union.py +1 -1
- diffusers/models/controlnets/controlnet_xs.py +7 -7
- diffusers/models/controlnets/multicontrolnet.py +4 -5
- diffusers/models/controlnets/multicontrolnet_union.py +5 -6
- diffusers/models/downsampling.py +2 -2
- diffusers/models/embeddings.py +10 -12
- diffusers/models/embeddings_flax.py +2 -2
- diffusers/models/lora.py +3 -3
- diffusers/models/modeling_utils.py +44 -14
- diffusers/models/normalization.py +4 -4
- diffusers/models/resnet.py +2 -2
- diffusers/models/resnet_flax.py +1 -1
- diffusers/models/transformers/__init__.py +5 -0
- diffusers/models/transformers/auraflow_transformer_2d.py +70 -24
- diffusers/models/transformers/cogvideox_transformer_3d.py +1 -1
- diffusers/models/transformers/consisid_transformer_3d.py +1 -1
- diffusers/models/transformers/dit_transformer_2d.py +2 -2
- diffusers/models/transformers/dual_transformer_2d.py +1 -1
- diffusers/models/transformers/hunyuan_transformer_2d.py +2 -2
- diffusers/models/transformers/latte_transformer_3d.py +4 -5
- diffusers/models/transformers/lumina_nextdit2d.py +2 -2
- diffusers/models/transformers/pixart_transformer_2d.py +3 -3
- diffusers/models/transformers/prior_transformer.py +1 -1
- diffusers/models/transformers/sana_transformer.py +8 -3
- diffusers/models/transformers/stable_audio_transformer.py +5 -9
- diffusers/models/transformers/t5_film_transformer.py +3 -3
- diffusers/models/transformers/transformer_2d.py +1 -1
- diffusers/models/transformers/transformer_allegro.py +1 -1
- diffusers/models/transformers/transformer_chroma.py +742 -0
- diffusers/models/transformers/transformer_cogview3plus.py +5 -10
- diffusers/models/transformers/transformer_cogview4.py +317 -25
- diffusers/models/transformers/transformer_cosmos.py +579 -0
- diffusers/models/transformers/transformer_flux.py +9 -11
- diffusers/models/transformers/transformer_hidream_image.py +942 -0
- diffusers/models/transformers/transformer_hunyuan_video.py +6 -8
- diffusers/models/transformers/transformer_hunyuan_video_framepack.py +416 -0
- diffusers/models/transformers/transformer_ltx.py +2 -2
- diffusers/models/transformers/transformer_lumina2.py +1 -1
- diffusers/models/transformers/transformer_mochi.py +1 -1
- diffusers/models/transformers/transformer_omnigen.py +2 -2
- diffusers/models/transformers/transformer_sd3.py +7 -7
- diffusers/models/transformers/transformer_temporal.py +1 -1
- diffusers/models/transformers/transformer_wan.py +24 -8
- diffusers/models/transformers/transformer_wan_vace.py +393 -0
- diffusers/models/unets/unet_1d.py +1 -1
- diffusers/models/unets/unet_1d_blocks.py +1 -1
- diffusers/models/unets/unet_2d.py +1 -1
- diffusers/models/unets/unet_2d_blocks.py +1 -1
- diffusers/models/unets/unet_2d_blocks_flax.py +8 -7
- diffusers/models/unets/unet_2d_condition.py +2 -2
- diffusers/models/unets/unet_2d_condition_flax.py +2 -2
- diffusers/models/unets/unet_3d_blocks.py +1 -1
- diffusers/models/unets/unet_3d_condition.py +3 -3
- diffusers/models/unets/unet_i2vgen_xl.py +3 -3
- diffusers/models/unets/unet_kandinsky3.py +1 -1
- diffusers/models/unets/unet_motion_model.py +2 -2
- diffusers/models/unets/unet_stable_cascade.py +1 -1
- diffusers/models/upsampling.py +2 -2
- diffusers/models/vae_flax.py +2 -2
- diffusers/models/vq_model.py +1 -1
- diffusers/pipelines/__init__.py +37 -6
- diffusers/pipelines/allegro/pipeline_allegro.py +11 -11
- diffusers/pipelines/amused/pipeline_amused.py +7 -6
- diffusers/pipelines/amused/pipeline_amused_img2img.py +6 -5
- diffusers/pipelines/amused/pipeline_amused_inpaint.py +6 -5
- diffusers/pipelines/animatediff/pipeline_animatediff.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +16 -15
- diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +5 -5
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +5 -5
- diffusers/pipelines/audioldm/pipeline_audioldm.py +8 -7
- diffusers/pipelines/audioldm2/modeling_audioldm2.py +1 -1
- diffusers/pipelines/audioldm2/pipeline_audioldm2.py +23 -13
- diffusers/pipelines/aura_flow/pipeline_aura_flow.py +48 -11
- diffusers/pipelines/auto_pipeline.py +6 -7
- diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
- diffusers/pipelines/blip_diffusion/modeling_ctx_clip.py +2 -2
- diffusers/pipelines/blip_diffusion/pipeline_blip_diffusion.py +11 -10
- diffusers/pipelines/chroma/__init__.py +49 -0
- diffusers/pipelines/chroma/pipeline_chroma.py +949 -0
- diffusers/pipelines/chroma/pipeline_chroma_img2img.py +1034 -0
- diffusers/pipelines/chroma/pipeline_output.py +21 -0
- diffusers/pipelines/cogvideo/pipeline_cogvideox.py +8 -8
- diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +8 -8
- diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +8 -8
- diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +8 -8
- diffusers/pipelines/cogview3/pipeline_cogview3plus.py +9 -9
- diffusers/pipelines/cogview4/pipeline_cogview4.py +7 -7
- diffusers/pipelines/cogview4/pipeline_cogview4_control.py +7 -7
- diffusers/pipelines/consisid/consisid_utils.py +2 -2
- diffusers/pipelines/consisid/pipeline_consisid.py +8 -8
- diffusers/pipelines/consistency_models/pipeline_consistency_models.py +1 -1
- diffusers/pipelines/controlnet/pipeline_controlnet.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_blip_diffusion.py +8 -8
- diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +14 -14
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +10 -6
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +13 -13
- diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +14 -14
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +5 -5
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +13 -13
- diffusers/pipelines/controlnet/pipeline_flax_controlnet.py +1 -1
- diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +8 -8
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +7 -7
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +7 -7
- diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs.py +12 -10
- diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs_sd_xl.py +9 -7
- diffusers/pipelines/cosmos/__init__.py +54 -0
- diffusers/pipelines/cosmos/pipeline_cosmos2_text2image.py +673 -0
- diffusers/pipelines/cosmos/pipeline_cosmos2_video2world.py +792 -0
- diffusers/pipelines/cosmos/pipeline_cosmos_text2world.py +664 -0
- diffusers/pipelines/cosmos/pipeline_cosmos_video2world.py +826 -0
- diffusers/pipelines/cosmos/pipeline_output.py +40 -0
- diffusers/pipelines/dance_diffusion/pipeline_dance_diffusion.py +5 -4
- diffusers/pipelines/ddim/pipeline_ddim.py +4 -4
- diffusers/pipelines/ddpm/pipeline_ddpm.py +1 -1
- diffusers/pipelines/deepfloyd_if/pipeline_if.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_img2img.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_superresolution.py +10 -10
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +8 -8
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +5 -5
- diffusers/pipelines/deprecated/audio_diffusion/mel.py +1 -1
- diffusers/pipelines/deprecated/audio_diffusion/pipeline_audio_diffusion.py +3 -3
- diffusers/pipelines/deprecated/latent_diffusion_uncond/pipeline_latent_diffusion_uncond.py +1 -1
- diffusers/pipelines/deprecated/pndm/pipeline_pndm.py +2 -2
- diffusers/pipelines/deprecated/repaint/pipeline_repaint.py +4 -3
- diffusers/pipelines/deprecated/score_sde_ve/pipeline_score_sde_ve.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/continuous_encoder.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/midi_utils.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/notes_encoder.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/pipeline_spectrogram_diffusion.py +1 -1
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py +7 -7
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_onnx_stable_diffusion_inpaint_legacy.py +9 -9
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py +10 -10
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py +10 -8
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py +5 -5
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py +18 -18
- diffusers/pipelines/deprecated/stochastic_karras_ve/pipeline_stochastic_karras_ve.py +1 -1
- diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +2 -2
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion.py +6 -6
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_dual_guided.py +5 -5
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_image_variation.py +5 -5
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_text_to_image.py +5 -5
- diffusers/pipelines/deprecated/vq_diffusion/pipeline_vq_diffusion.py +1 -1
- diffusers/pipelines/dit/pipeline_dit.py +1 -1
- diffusers/pipelines/easyanimate/pipeline_easyanimate.py +4 -4
- diffusers/pipelines/easyanimate/pipeline_easyanimate_control.py +4 -4
- diffusers/pipelines/easyanimate/pipeline_easyanimate_inpaint.py +7 -6
- diffusers/pipelines/flux/modeling_flux.py +1 -1
- diffusers/pipelines/flux/pipeline_flux.py +10 -17
- diffusers/pipelines/flux/pipeline_flux_control.py +6 -6
- diffusers/pipelines/flux/pipeline_flux_control_img2img.py +6 -6
- diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +6 -6
- diffusers/pipelines/flux/pipeline_flux_controlnet.py +6 -6
- diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +30 -22
- diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +2 -1
- diffusers/pipelines/flux/pipeline_flux_fill.py +6 -6
- diffusers/pipelines/flux/pipeline_flux_img2img.py +39 -6
- diffusers/pipelines/flux/pipeline_flux_inpaint.py +11 -6
- diffusers/pipelines/flux/pipeline_flux_prior_redux.py +1 -1
- diffusers/pipelines/free_init_utils.py +2 -2
- diffusers/pipelines/free_noise_utils.py +3 -3
- diffusers/pipelines/hidream_image/__init__.py +47 -0
- diffusers/pipelines/hidream_image/pipeline_hidream_image.py +1026 -0
- diffusers/pipelines/hidream_image/pipeline_output.py +35 -0
- diffusers/pipelines/hunyuan_video/__init__.py +2 -0
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_skyreels_image2video.py +8 -8
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +8 -8
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_framepack.py +1114 -0
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_image2video.py +71 -15
- diffusers/pipelines/hunyuan_video/pipeline_output.py +19 -0
- diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +8 -8
- diffusers/pipelines/i2vgen_xl/pipeline_i2vgen_xl.py +10 -8
- diffusers/pipelines/kandinsky/pipeline_kandinsky.py +6 -6
- diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +34 -34
- diffusers/pipelines/kandinsky/pipeline_kandinsky_img2img.py +19 -26
- diffusers/pipelines/kandinsky/pipeline_kandinsky_inpaint.py +7 -7
- diffusers/pipelines/kandinsky/pipeline_kandinsky_prior.py +11 -11
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2.py +6 -6
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +35 -35
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet.py +6 -6
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet_img2img.py +17 -39
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_img2img.py +17 -45
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_inpainting.py +7 -7
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior.py +10 -10
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior_emb2emb.py +10 -10
- diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py +7 -7
- diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py +17 -38
- diffusers/pipelines/kolors/pipeline_kolors.py +10 -10
- diffusers/pipelines/kolors/pipeline_kolors_img2img.py +12 -12
- diffusers/pipelines/kolors/text_encoder.py +3 -3
- diffusers/pipelines/kolors/tokenizer.py +1 -1
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +2 -2
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +2 -2
- diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
- diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py +3 -3
- diffusers/pipelines/latte/pipeline_latte.py +12 -12
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +13 -13
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +17 -16
- diffusers/pipelines/ltx/__init__.py +4 -0
- diffusers/pipelines/ltx/modeling_latent_upsampler.py +188 -0
- diffusers/pipelines/ltx/pipeline_ltx.py +51 -6
- diffusers/pipelines/ltx/pipeline_ltx_condition.py +107 -29
- diffusers/pipelines/ltx/pipeline_ltx_image2video.py +50 -6
- diffusers/pipelines/ltx/pipeline_ltx_latent_upsample.py +277 -0
- diffusers/pipelines/lumina/pipeline_lumina.py +13 -13
- diffusers/pipelines/lumina2/pipeline_lumina2.py +10 -10
- diffusers/pipelines/marigold/marigold_image_processing.py +2 -2
- diffusers/pipelines/mochi/pipeline_mochi.py +6 -6
- diffusers/pipelines/musicldm/pipeline_musicldm.py +16 -13
- diffusers/pipelines/omnigen/pipeline_omnigen.py +13 -11
- diffusers/pipelines/omnigen/processor_omnigen.py +8 -3
- diffusers/pipelines/onnx_utils.py +15 -2
- diffusers/pipelines/pag/pag_utils.py +2 -2
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +12 -8
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +10 -6
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +14 -14
- diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_kolors.py +10 -10
- diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +11 -11
- diffusers/pipelines/pag/pipeline_pag_sana.py +18 -12
- diffusers/pipelines/pag/pipeline_pag_sd.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_sd_3.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +6 -6
- diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +5 -5
- diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_sd_xl.py +16 -15
- diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +18 -17
- diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +12 -12
- diffusers/pipelines/paint_by_example/image_encoder.py +1 -1
- diffusers/pipelines/paint_by_example/pipeline_paint_by_example.py +8 -7
- diffusers/pipelines/pia/pipeline_pia.py +8 -6
- diffusers/pipelines/pipeline_flax_utils.py +3 -4
- diffusers/pipelines/pipeline_loading_utils.py +89 -13
- diffusers/pipelines/pipeline_utils.py +105 -33
- diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +11 -11
- diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +11 -11
- diffusers/pipelines/sana/__init__.py +4 -0
- diffusers/pipelines/sana/pipeline_sana.py +23 -21
- diffusers/pipelines/sana/pipeline_sana_controlnet.py +1106 -0
- diffusers/pipelines/sana/pipeline_sana_sprint.py +23 -19
- diffusers/pipelines/sana/pipeline_sana_sprint_img2img.py +981 -0
- diffusers/pipelines/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py +7 -6
- diffusers/pipelines/shap_e/camera.py +1 -1
- diffusers/pipelines/shap_e/pipeline_shap_e.py +1 -1
- diffusers/pipelines/shap_e/pipeline_shap_e_img2img.py +1 -1
- diffusers/pipelines/shap_e/renderer.py +3 -3
- diffusers/pipelines/stable_audio/modeling_stable_audio.py +1 -1
- diffusers/pipelines/stable_audio/pipeline_stable_audio.py +5 -5
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +8 -8
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py +13 -13
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +9 -9
- diffusers/pipelines/stable_diffusion/__init__.py +0 -7
- diffusers/pipelines/stable_diffusion/clip_image_project_model.py +1 -1
- diffusers/pipelines/stable_diffusion/convert_from_ckpt.py +11 -4
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_img2img.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_inpaint.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_img2img.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_inpaint.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py +9 -9
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +8 -8
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_image_variation.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +4 -4
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_unclip.py +7 -7
- diffusers/pipelines/stable_diffusion/pipeline_stable_unclip_img2img.py +5 -5
- diffusers/pipelines/stable_diffusion/safety_checker.py +1 -1
- diffusers/pipelines/stable_diffusion/safety_checker_flax.py +1 -1
- diffusers/pipelines/stable_diffusion/stable_unclip_image_normalizer.py +1 -1
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +7 -7
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +7 -7
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +7 -7
- diffusers/pipelines/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py +12 -8
- diffusers/pipelines/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py +15 -9
- diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py +11 -9
- diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -9
- diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +18 -12
- diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_xl_k_diffusion.py +11 -8
- diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +11 -8
- diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +15 -12
- diffusers/pipelines/stable_diffusion_safe/pipeline_stable_diffusion_safe.py +8 -6
- diffusers/pipelines/stable_diffusion_safe/safety_checker.py +1 -1
- diffusers/pipelines/stable_diffusion_sag/pipeline_stable_diffusion_sag.py +15 -11
- diffusers/pipelines/stable_diffusion_xl/pipeline_flax_stable_diffusion_xl.py +1 -1
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +16 -15
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +18 -17
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +12 -12
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_instruct_pix2pix.py +16 -15
- diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +3 -3
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +12 -12
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +18 -17
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth.py +12 -7
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth_img2img.py +12 -7
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero.py +15 -13
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +24 -21
- diffusers/pipelines/unclip/pipeline_unclip.py +4 -3
- diffusers/pipelines/unclip/pipeline_unclip_image_variation.py +4 -3
- diffusers/pipelines/unclip/text_proj.py +2 -2
- diffusers/pipelines/unidiffuser/modeling_text_decoder.py +2 -2
- diffusers/pipelines/unidiffuser/modeling_uvit.py +1 -1
- diffusers/pipelines/unidiffuser/pipeline_unidiffuser.py +8 -7
- diffusers/pipelines/visualcloze/__init__.py +52 -0
- diffusers/pipelines/visualcloze/pipeline_visualcloze_combined.py +444 -0
- diffusers/pipelines/visualcloze/pipeline_visualcloze_generation.py +952 -0
- diffusers/pipelines/visualcloze/visualcloze_utils.py +251 -0
- diffusers/pipelines/wan/__init__.py +2 -0
- diffusers/pipelines/wan/pipeline_wan.py +17 -12
- diffusers/pipelines/wan/pipeline_wan_i2v.py +42 -20
- diffusers/pipelines/wan/pipeline_wan_vace.py +976 -0
- diffusers/pipelines/wan/pipeline_wan_video2video.py +18 -18
- diffusers/pipelines/wuerstchen/modeling_paella_vq_model.py +1 -1
- diffusers/pipelines/wuerstchen/modeling_wuerstchen_diffnext.py +1 -1
- diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen.py +8 -8
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen_combined.py +16 -15
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen_prior.py +6 -6
- diffusers/quantizers/__init__.py +179 -1
- diffusers/quantizers/base.py +6 -1
- diffusers/quantizers/bitsandbytes/bnb_quantizer.py +4 -0
- diffusers/quantizers/bitsandbytes/utils.py +10 -7
- diffusers/quantizers/gguf/gguf_quantizer.py +13 -4
- diffusers/quantizers/gguf/utils.py +16 -13
- diffusers/quantizers/quantization_config.py +18 -16
- diffusers/quantizers/quanto/quanto_quantizer.py +4 -0
- diffusers/quantizers/torchao/torchao_quantizer.py +5 -1
- diffusers/schedulers/__init__.py +3 -1
- diffusers/schedulers/deprecated/scheduling_karras_ve.py +4 -3
- diffusers/schedulers/deprecated/scheduling_sde_vp.py +1 -1
- diffusers/schedulers/scheduling_consistency_models.py +1 -1
- diffusers/schedulers/scheduling_cosine_dpmsolver_multistep.py +10 -5
- diffusers/schedulers/scheduling_ddim.py +8 -8
- diffusers/schedulers/scheduling_ddim_cogvideox.py +5 -5
- diffusers/schedulers/scheduling_ddim_flax.py +6 -6
- diffusers/schedulers/scheduling_ddim_inverse.py +6 -6
- diffusers/schedulers/scheduling_ddim_parallel.py +22 -22
- diffusers/schedulers/scheduling_ddpm.py +9 -9
- diffusers/schedulers/scheduling_ddpm_flax.py +7 -7
- diffusers/schedulers/scheduling_ddpm_parallel.py +18 -18
- diffusers/schedulers/scheduling_ddpm_wuerstchen.py +2 -2
- diffusers/schedulers/scheduling_deis_multistep.py +8 -8
- diffusers/schedulers/scheduling_dpm_cogvideox.py +5 -5
- diffusers/schedulers/scheduling_dpmsolver_multistep.py +12 -12
- diffusers/schedulers/scheduling_dpmsolver_multistep_flax.py +22 -20
- diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +11 -11
- diffusers/schedulers/scheduling_dpmsolver_sde.py +2 -2
- diffusers/schedulers/scheduling_dpmsolver_singlestep.py +13 -13
- diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py +13 -8
- diffusers/schedulers/scheduling_edm_euler.py +20 -11
- diffusers/schedulers/scheduling_euler_ancestral_discrete.py +3 -3
- diffusers/schedulers/scheduling_euler_discrete.py +3 -3
- diffusers/schedulers/scheduling_euler_discrete_flax.py +3 -3
- diffusers/schedulers/scheduling_flow_match_euler_discrete.py +20 -5
- diffusers/schedulers/scheduling_flow_match_heun_discrete.py +1 -1
- diffusers/schedulers/scheduling_flow_match_lcm.py +561 -0
- diffusers/schedulers/scheduling_heun_discrete.py +2 -2
- diffusers/schedulers/scheduling_ipndm.py +2 -2
- diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +2 -2
- diffusers/schedulers/scheduling_k_dpm_2_discrete.py +2 -2
- diffusers/schedulers/scheduling_karras_ve_flax.py +5 -5
- diffusers/schedulers/scheduling_lcm.py +3 -3
- diffusers/schedulers/scheduling_lms_discrete.py +2 -2
- diffusers/schedulers/scheduling_lms_discrete_flax.py +1 -1
- diffusers/schedulers/scheduling_pndm.py +4 -4
- diffusers/schedulers/scheduling_pndm_flax.py +4 -4
- diffusers/schedulers/scheduling_repaint.py +9 -9
- diffusers/schedulers/scheduling_sasolver.py +15 -15
- diffusers/schedulers/scheduling_scm.py +1 -1
- diffusers/schedulers/scheduling_sde_ve.py +1 -1
- diffusers/schedulers/scheduling_sde_ve_flax.py +2 -2
- diffusers/schedulers/scheduling_tcd.py +3 -3
- diffusers/schedulers/scheduling_unclip.py +5 -5
- diffusers/schedulers/scheduling_unipc_multistep.py +11 -11
- diffusers/schedulers/scheduling_utils.py +1 -1
- diffusers/schedulers/scheduling_utils_flax.py +1 -1
- diffusers/schedulers/scheduling_vq_diffusion.py +1 -1
- diffusers/training_utils.py +13 -5
- diffusers/utils/__init__.py +5 -0
- diffusers/utils/accelerate_utils.py +1 -1
- diffusers/utils/doc_utils.py +1 -1
- diffusers/utils/dummy_pt_objects.py +120 -0
- diffusers/utils/dummy_torch_and_transformers_objects.py +225 -0
- diffusers/utils/dynamic_modules_utils.py +21 -3
- diffusers/utils/export_utils.py +1 -1
- diffusers/utils/import_utils.py +81 -18
- diffusers/utils/logging.py +1 -1
- diffusers/utils/outputs.py +2 -1
- diffusers/utils/peft_utils.py +91 -8
- diffusers/utils/state_dict_utils.py +20 -3
- diffusers/utils/testing_utils.py +59 -7
- diffusers/utils/torch_utils.py +25 -5
- diffusers/video_processor.py +2 -2
- {diffusers-0.33.0.dist-info → diffusers-0.34.0.dist-info}/METADATA +3 -3
- diffusers-0.34.0.dist-info/RECORD +639 -0
- diffusers-0.33.0.dist-info/RECORD +0 -608
- {diffusers-0.33.0.dist-info → diffusers-0.34.0.dist-info}/LICENSE +0 -0
- {diffusers-0.33.0.dist-info → diffusers-0.34.0.dist-info}/WHEEL +0 -0
- {diffusers-0.33.0.dist-info → diffusers-0.34.0.dist-info}/entry_points.txt +0 -0
- {diffusers-0.33.0.dist-info → diffusers-0.34.0.dist-info}/top_level.txt +0 -0
diffusers/utils/outputs.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -71,6 +71,7 @@ class BaseOutput(OrderedDict):
|
|
71
71
|
cls,
|
72
72
|
torch.utils._pytree._dict_flatten,
|
73
73
|
lambda values, context: cls(**torch.utils._pytree._dict_unflatten(values, context)),
|
74
|
+
serialized_type_name=f"{cls.__module__}.{cls.__name__}",
|
74
75
|
)
|
75
76
|
|
76
77
|
def __post_init__(self) -> None:
|
diffusers/utils/peft_utils.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -21,9 +21,13 @@ from typing import Optional
|
|
21
21
|
|
22
22
|
from packaging import version
|
23
23
|
|
24
|
-
from .
|
24
|
+
from . import logging
|
25
|
+
from .import_utils import is_peft_available, is_peft_version, is_torch_available
|
26
|
+
from .torch_utils import empty_device_cache
|
25
27
|
|
26
28
|
|
29
|
+
logger = logging.get_logger(__name__)
|
30
|
+
|
27
31
|
if is_torch_available():
|
28
32
|
import torch
|
29
33
|
|
@@ -95,8 +99,7 @@ def recurse_remove_peft_layers(model):
|
|
95
99
|
setattr(model, name, new_module)
|
96
100
|
del module
|
97
101
|
|
98
|
-
|
99
|
-
torch.cuda.empty_cache()
|
102
|
+
empty_device_cache()
|
100
103
|
return model
|
101
104
|
|
102
105
|
|
@@ -153,19 +156,19 @@ def get_peft_kwargs(rank_dict, network_alpha_dict, peft_state_dict, is_unet=True
|
|
153
156
|
r = lora_alpha = list(rank_dict.values())[0]
|
154
157
|
|
155
158
|
if len(set(rank_dict.values())) > 1:
|
156
|
-
# get the rank
|
159
|
+
# get the rank occurring the most number of times
|
157
160
|
r = collections.Counter(rank_dict.values()).most_common()[0][0]
|
158
161
|
|
159
|
-
# for modules with rank different from the most
|
162
|
+
# for modules with rank different from the most occurring rank, add it to the `rank_pattern`
|
160
163
|
rank_pattern = dict(filter(lambda x: x[1] != r, rank_dict.items()))
|
161
164
|
rank_pattern = {k.split(".lora_B.")[0]: v for k, v in rank_pattern.items()}
|
162
165
|
|
163
166
|
if network_alpha_dict is not None and len(network_alpha_dict) > 0:
|
164
167
|
if len(set(network_alpha_dict.values())) > 1:
|
165
|
-
# get the alpha
|
168
|
+
# get the alpha occurring the most number of times
|
166
169
|
lora_alpha = collections.Counter(network_alpha_dict.values()).most_common()[0][0]
|
167
170
|
|
168
|
-
# for modules with alpha different from the most
|
171
|
+
# for modules with alpha different from the most occurring alpha, add it to the `alpha_pattern`
|
169
172
|
alpha_pattern = dict(filter(lambda x: x[1] != lora_alpha, network_alpha_dict.items()))
|
170
173
|
if is_unet:
|
171
174
|
alpha_pattern = {
|
@@ -288,3 +291,83 @@ def check_peft_version(min_version: str) -> None:
|
|
288
291
|
f"The version of PEFT you are using is not compatible, please use a version that is greater"
|
289
292
|
f" than {min_version}"
|
290
293
|
)
|
294
|
+
|
295
|
+
|
296
|
+
def _create_lora_config(
|
297
|
+
state_dict,
|
298
|
+
network_alphas,
|
299
|
+
metadata,
|
300
|
+
rank_pattern_dict,
|
301
|
+
is_unet: bool = True,
|
302
|
+
):
|
303
|
+
from peft import LoraConfig
|
304
|
+
|
305
|
+
if metadata is not None:
|
306
|
+
lora_config_kwargs = metadata
|
307
|
+
else:
|
308
|
+
lora_config_kwargs = get_peft_kwargs(
|
309
|
+
rank_pattern_dict, network_alpha_dict=network_alphas, peft_state_dict=state_dict, is_unet=is_unet
|
310
|
+
)
|
311
|
+
|
312
|
+
_maybe_raise_error_for_ambiguous_keys(lora_config_kwargs)
|
313
|
+
|
314
|
+
# Version checks for DoRA and lora_bias
|
315
|
+
if "use_dora" in lora_config_kwargs and lora_config_kwargs["use_dora"]:
|
316
|
+
if is_peft_version("<", "0.9.0"):
|
317
|
+
raise ValueError("DoRA requires PEFT >= 0.9.0. Please upgrade.")
|
318
|
+
|
319
|
+
if "lora_bias" in lora_config_kwargs and lora_config_kwargs["lora_bias"]:
|
320
|
+
if is_peft_version("<=", "0.13.2"):
|
321
|
+
raise ValueError("lora_bias requires PEFT >= 0.14.0. Please upgrade.")
|
322
|
+
|
323
|
+
try:
|
324
|
+
return LoraConfig(**lora_config_kwargs)
|
325
|
+
except TypeError as e:
|
326
|
+
raise TypeError("`LoraConfig` class could not be instantiated.") from e
|
327
|
+
|
328
|
+
|
329
|
+
def _maybe_raise_error_for_ambiguous_keys(config):
|
330
|
+
rank_pattern = config["rank_pattern"].copy()
|
331
|
+
target_modules = config["target_modules"]
|
332
|
+
|
333
|
+
for key in list(rank_pattern.keys()):
|
334
|
+
# try to detect ambiguity
|
335
|
+
# `target_modules` can also be a str, in which case this loop would loop
|
336
|
+
# over the chars of the str. The technically correct way to match LoRA keys
|
337
|
+
# in PEFT is to use LoraModel._check_target_module_exists (lora_config, key).
|
338
|
+
# But this cuts it for now.
|
339
|
+
exact_matches = [mod for mod in target_modules if mod == key]
|
340
|
+
substring_matches = [mod for mod in target_modules if key in mod and mod != key]
|
341
|
+
|
342
|
+
if exact_matches and substring_matches:
|
343
|
+
if is_peft_version("<", "0.14.1"):
|
344
|
+
raise ValueError(
|
345
|
+
"There are ambiguous keys present in this LoRA. To load it, please update your `peft` installation - `pip install -U peft`."
|
346
|
+
)
|
347
|
+
|
348
|
+
|
349
|
+
def _maybe_warn_for_unhandled_keys(incompatible_keys, adapter_name):
|
350
|
+
warn_msg = ""
|
351
|
+
if incompatible_keys is not None:
|
352
|
+
# Check only for unexpected keys.
|
353
|
+
unexpected_keys = getattr(incompatible_keys, "unexpected_keys", None)
|
354
|
+
if unexpected_keys:
|
355
|
+
lora_unexpected_keys = [k for k in unexpected_keys if "lora_" in k and adapter_name in k]
|
356
|
+
if lora_unexpected_keys:
|
357
|
+
warn_msg = (
|
358
|
+
f"Loading adapter weights from state_dict led to unexpected keys found in the model:"
|
359
|
+
f" {', '.join(lora_unexpected_keys)}. "
|
360
|
+
)
|
361
|
+
|
362
|
+
# Filter missing keys specific to the current adapter.
|
363
|
+
missing_keys = getattr(incompatible_keys, "missing_keys", None)
|
364
|
+
if missing_keys:
|
365
|
+
lora_missing_keys = [k for k in missing_keys if "lora_" in k and adapter_name in k]
|
366
|
+
if lora_missing_keys:
|
367
|
+
warn_msg += (
|
368
|
+
f"Loading adapter weights from state_dict led to missing keys in the model:"
|
369
|
+
f" {', '.join(lora_missing_keys)}."
|
370
|
+
)
|
371
|
+
|
372
|
+
if warn_msg:
|
373
|
+
logger.warning(warn_msg)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -16,6 +16,7 @@ State dict utilities: utility methods for converting state dicts easily
|
|
16
16
|
"""
|
17
17
|
|
18
18
|
import enum
|
19
|
+
import json
|
19
20
|
|
20
21
|
from .import_utils import is_torch_available
|
21
22
|
from .logging import get_logger
|
@@ -219,7 +220,7 @@ def convert_state_dict_to_diffusers(state_dict, original_type=None, **kwargs):
|
|
219
220
|
kwargs (`dict`, *args*):
|
220
221
|
Additional arguments to pass to the method.
|
221
222
|
|
222
|
-
- **adapter_name**: For example, in case of PEFT, some keys will be
|
223
|
+
- **adapter_name**: For example, in case of PEFT, some keys will be prepended
|
223
224
|
with the adapter name, therefore needs a special handling. By default PEFT also takes care of that in
|
224
225
|
`get_peft_model_state_dict` method:
|
225
226
|
https://github.com/huggingface/peft/blob/ba0477f2985b1ba311b83459d29895c809404e99/src/peft/utils/save_and_load.py#L92
|
@@ -290,7 +291,7 @@ def convert_state_dict_to_kohya(state_dict, original_type=None, **kwargs):
|
|
290
291
|
kwargs (`dict`, *args*):
|
291
292
|
Additional arguments to pass to the method.
|
292
293
|
|
293
|
-
- **adapter_name**: For example, in case of PEFT, some keys will be
|
294
|
+
- **adapter_name**: For example, in case of PEFT, some keys will be prepended
|
294
295
|
with the adapter name, therefore needs a special handling. By default PEFT also takes care of that in
|
295
296
|
`get_peft_model_state_dict` method:
|
296
297
|
https://github.com/huggingface/peft/blob/ba0477f2985b1ba311b83459d29895c809404e99/src/peft/utils/save_and_load.py#L92
|
@@ -347,3 +348,19 @@ def state_dict_all_zero(state_dict, filter_str=None):
|
|
347
348
|
state_dict = {k: v for k, v in state_dict.items() if any(f in k for f in filter_str)}
|
348
349
|
|
349
350
|
return all(torch.all(param == 0).item() for param in state_dict.values())
|
351
|
+
|
352
|
+
|
353
|
+
def _load_sft_state_dict_metadata(model_file: str):
|
354
|
+
import safetensors.torch
|
355
|
+
|
356
|
+
from ..loaders.lora_base import LORA_ADAPTER_METADATA_KEY
|
357
|
+
|
358
|
+
with safetensors.torch.safe_open(model_file, framework="pt", device="cpu") as f:
|
359
|
+
metadata = f.metadata() or {}
|
360
|
+
|
361
|
+
metadata.pop("format", None)
|
362
|
+
if metadata:
|
363
|
+
raw = metadata.get(LORA_ADAPTER_METADATA_KEY)
|
364
|
+
return json.loads(raw) if raw else None
|
365
|
+
else:
|
366
|
+
return None
|
diffusers/utils/testing_utils.py
CHANGED
@@ -38,6 +38,7 @@ from .import_utils import (
|
|
38
38
|
is_note_seq_available,
|
39
39
|
is_onnx_available,
|
40
40
|
is_opencv_available,
|
41
|
+
is_optimum_quanto_available,
|
41
42
|
is_peft_available,
|
42
43
|
is_timm_available,
|
43
44
|
is_torch_available,
|
@@ -132,6 +133,29 @@ def numpy_cosine_similarity_distance(a, b):
|
|
132
133
|
return distance
|
133
134
|
|
134
135
|
|
136
|
+
def check_if_dicts_are_equal(dict1, dict2):
|
137
|
+
dict1, dict2 = dict1.copy(), dict2.copy()
|
138
|
+
|
139
|
+
for key, value in dict1.items():
|
140
|
+
if isinstance(value, set):
|
141
|
+
dict1[key] = sorted(value)
|
142
|
+
for key, value in dict2.items():
|
143
|
+
if isinstance(value, set):
|
144
|
+
dict2[key] = sorted(value)
|
145
|
+
|
146
|
+
for key in dict1:
|
147
|
+
if key not in dict2:
|
148
|
+
return False
|
149
|
+
if dict1[key] != dict2[key]:
|
150
|
+
return False
|
151
|
+
|
152
|
+
for key in dict2:
|
153
|
+
if key not in dict1:
|
154
|
+
return False
|
155
|
+
|
156
|
+
return True
|
157
|
+
|
158
|
+
|
135
159
|
def print_tensor_test(
|
136
160
|
tensor,
|
137
161
|
limit_to_slices=None,
|
@@ -290,6 +314,18 @@ def require_torch_version_greater_equal(torch_version):
|
|
290
314
|
return decorator
|
291
315
|
|
292
316
|
|
317
|
+
def require_torch_version_greater(torch_version):
|
318
|
+
"""Decorator marking a test that requires torch with a specific version greater."""
|
319
|
+
|
320
|
+
def decorator(test_case):
|
321
|
+
correct_torch_version = is_torch_available() and is_torch_version(">", torch_version)
|
322
|
+
return unittest.skipUnless(
|
323
|
+
correct_torch_version, f"test requires torch with the version greater than {torch_version}"
|
324
|
+
)(test_case)
|
325
|
+
|
326
|
+
return decorator
|
327
|
+
|
328
|
+
|
293
329
|
def require_torch_gpu(test_case):
|
294
330
|
"""Decorator marking a test that requires CUDA and PyTorch."""
|
295
331
|
return unittest.skipUnless(is_torch_available() and torch_device == "cuda", "test requires PyTorch+CUDA")(
|
@@ -299,9 +335,7 @@ def require_torch_gpu(test_case):
|
|
299
335
|
|
300
336
|
def require_torch_cuda_compatibility(expected_compute_capability):
|
301
337
|
def decorator(test_case):
|
302
|
-
if
|
303
|
-
return unittest.skip(test_case)
|
304
|
-
else:
|
338
|
+
if torch.cuda.is_available():
|
305
339
|
current_compute_capability = get_torch_cuda_device_capability()
|
306
340
|
return unittest.skipUnless(
|
307
341
|
float(current_compute_capability) == float(expected_compute_capability),
|
@@ -486,6 +520,13 @@ def require_bitsandbytes(test_case):
|
|
486
520
|
return unittest.skipUnless(is_bitsandbytes_available(), "test requires bitsandbytes")(test_case)
|
487
521
|
|
488
522
|
|
523
|
+
def require_quanto(test_case):
|
524
|
+
"""
|
525
|
+
Decorator marking a test that requires quanto. These tests are skipped when quanto isn't installed.
|
526
|
+
"""
|
527
|
+
return unittest.skipUnless(is_optimum_quanto_available(), "test requires quanto")(test_case)
|
528
|
+
|
529
|
+
|
489
530
|
def require_accelerate(test_case):
|
490
531
|
"""
|
491
532
|
Decorator marking a test that requires accelerate. These tests are skipped when accelerate isn't installed.
|
@@ -627,10 +668,10 @@ def load_numpy(arry: Union[str, np.ndarray], local_path: Optional[str] = None) -
|
|
627
668
|
return arry
|
628
669
|
|
629
670
|
|
630
|
-
def load_pt(url: str, map_location: str):
|
671
|
+
def load_pt(url: str, map_location: Optional[str] = None, weights_only: Optional[bool] = True):
|
631
672
|
response = requests.get(url, timeout=DIFFUSERS_REQUEST_TIMEOUT)
|
632
673
|
response.raise_for_status()
|
633
|
-
arry = torch.load(BytesIO(response.content), map_location=map_location)
|
674
|
+
arry = torch.load(BytesIO(response.content), map_location=map_location, weights_only=weights_only)
|
634
675
|
return arry
|
635
676
|
|
636
677
|
|
@@ -1186,6 +1227,13 @@ if is_torch_available():
|
|
1186
1227
|
"mps": 0,
|
1187
1228
|
"default": 0,
|
1188
1229
|
}
|
1230
|
+
BACKEND_SYNCHRONIZE = {
|
1231
|
+
"cuda": torch.cuda.synchronize,
|
1232
|
+
"xpu": getattr(torch.xpu, "synchronize", None),
|
1233
|
+
"cpu": None,
|
1234
|
+
"mps": None,
|
1235
|
+
"default": None,
|
1236
|
+
}
|
1189
1237
|
|
1190
1238
|
|
1191
1239
|
# This dispatches a defined function according to the accelerator from the function definitions.
|
@@ -1197,8 +1245,8 @@ def _device_agnostic_dispatch(device: str, dispatch_table: Dict[str, Callable],
|
|
1197
1245
|
|
1198
1246
|
# Some device agnostic functions return values. Need to guard against 'None' instead at
|
1199
1247
|
# user level
|
1200
|
-
if fn
|
1201
|
-
return
|
1248
|
+
if not callable(fn):
|
1249
|
+
return fn
|
1202
1250
|
|
1203
1251
|
return fn(*args, **kwargs)
|
1204
1252
|
|
@@ -1208,6 +1256,10 @@ def backend_manual_seed(device: str, seed: int):
|
|
1208
1256
|
return _device_agnostic_dispatch(device, BACKEND_MANUAL_SEED, seed)
|
1209
1257
|
|
1210
1258
|
|
1259
|
+
def backend_synchronize(device: str):
|
1260
|
+
return _device_agnostic_dispatch(device, BACKEND_SYNCHRONIZE)
|
1261
|
+
|
1262
|
+
|
1211
1263
|
def backend_empty_cache(device: str):
|
1212
1264
|
return _device_agnostic_dispatch(device, BACKEND_EMPTY_CACHE)
|
1213
1265
|
|
diffusers/utils/torch_utils.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -18,7 +18,7 @@ PyTorch utilities: Utilities related to PyTorch
|
|
18
18
|
from typing import List, Optional, Tuple, Union
|
19
19
|
|
20
20
|
from . import logging
|
21
|
-
from .import_utils import is_torch_available, is_torch_version
|
21
|
+
from .import_utils import is_torch_available, is_torch_npu_available, is_torch_version
|
22
22
|
|
23
23
|
|
24
24
|
if is_torch_available():
|
@@ -38,7 +38,7 @@ except (ImportError, ModuleNotFoundError):
|
|
38
38
|
def randn_tensor(
|
39
39
|
shape: Union[Tuple, List],
|
40
40
|
generator: Optional[Union[List["torch.Generator"], "torch.Generator"]] = None,
|
41
|
-
device: Optional["torch.device"] = None,
|
41
|
+
device: Optional[Union[str, "torch.device"]] = None,
|
42
42
|
dtype: Optional["torch.dtype"] = None,
|
43
43
|
layout: Optional["torch.layout"] = None,
|
44
44
|
):
|
@@ -47,6 +47,8 @@ def randn_tensor(
|
|
47
47
|
is always created on the CPU.
|
48
48
|
"""
|
49
49
|
# device on which tensor is created defaults to device
|
50
|
+
if isinstance(device, str):
|
51
|
+
device = torch.device(device)
|
50
52
|
rand_device = device
|
51
53
|
batch_size = shape[0]
|
52
54
|
|
@@ -61,7 +63,7 @@ def randn_tensor(
|
|
61
63
|
logger.info(
|
62
64
|
f"The passed generator was created on 'cpu' even though a tensor on {device} was expected."
|
63
65
|
f" Tensors will be created on 'cpu' and then moved to {device}. Note that one can probably"
|
64
|
-
f"
|
66
|
+
f" slightly speed up this function by passing a generator that was created on the {device} device."
|
65
67
|
)
|
66
68
|
elif gen_device_type != device.type and gen_device_type == "cuda":
|
67
69
|
raise ValueError(f"Cannot generate a {device} tensor from a generator of type {gen_device_type}.")
|
@@ -91,7 +93,7 @@ def is_compiled_module(module) -> bool:
|
|
91
93
|
|
92
94
|
|
93
95
|
def fourier_filter(x_in: "torch.Tensor", threshold: int, scale: int) -> "torch.Tensor":
|
94
|
-
"""Fourier filter as introduced in FreeU (https://
|
96
|
+
"""Fourier filter as introduced in FreeU (https://huggingface.co/papers/2309.11497).
|
95
97
|
|
96
98
|
This version of the method comes from here:
|
97
99
|
https://github.com/huggingface/diffusers/pull/5164#issuecomment-1732638706
|
@@ -159,3 +161,21 @@ def get_torch_cuda_device_capability():
|
|
159
161
|
return float(compute_capability)
|
160
162
|
else:
|
161
163
|
return None
|
164
|
+
|
165
|
+
|
166
|
+
def get_device():
|
167
|
+
if torch.cuda.is_available():
|
168
|
+
return "cuda"
|
169
|
+
elif is_torch_npu_available():
|
170
|
+
return "npu"
|
171
|
+
elif hasattr(torch, "xpu") and torch.xpu.is_available():
|
172
|
+
return "xpu"
|
173
|
+
else:
|
174
|
+
return "cpu"
|
175
|
+
|
176
|
+
|
177
|
+
def empty_device_cache(device_type: Optional[str] = None):
|
178
|
+
if device_type is None:
|
179
|
+
device_type = get_device()
|
180
|
+
device_mod = getattr(torch, device_type, torch.cuda)
|
181
|
+
device_mod.empty_cache()
|
diffusers/video_processor.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -67,7 +67,7 @@ class VideoProcessor(VaeImageProcessor):
|
|
67
67
|
|
68
68
|
# ensure the input is a list of videos:
|
69
69
|
# - if it is a batch of videos (5d torch.Tensor or np.ndarray), it is converted to a list of videos (a list of 4d torch.Tensor or np.ndarray)
|
70
|
-
# - if it is a single video, it is
|
70
|
+
# - if it is a single video, it is converted to a list of one video.
|
71
71
|
if isinstance(video, (np.ndarray, torch.Tensor)) and video.ndim == 5:
|
72
72
|
video = list(video)
|
73
73
|
elif isinstance(video, list) and is_valid_image(video[0]) or is_valid_image_imagelist(video):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: diffusers
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.34.0
|
4
4
|
Summary: State-of-the-art diffusion in PyTorch and JAX.
|
5
5
|
Home-page: https://github.com/huggingface/diffusers
|
6
6
|
Author: The Hugging Face team (past and future) with the help of all our contributors (https://github.com/huggingface/diffusers/graphs/contributors)
|
@@ -42,7 +42,7 @@ Requires-Dist: datasets; extra == "training"
|
|
42
42
|
Requires-Dist: protobuf<4,>=3.20.3; extra == "training"
|
43
43
|
Requires-Dist: tensorboard; extra == "training"
|
44
44
|
Requires-Dist: Jinja2; extra == "training"
|
45
|
-
Requires-Dist: peft>=0.
|
45
|
+
Requires-Dist: peft>=0.15.0; extra == "training"
|
46
46
|
Provides-Extra: test
|
47
47
|
Requires-Dist: compel==0.1.8; extra == "test"
|
48
48
|
Requires-Dist: GitPython<3.1.19; extra == "test"
|
@@ -111,7 +111,7 @@ Requires-Dist: datasets; extra == "dev"
|
|
111
111
|
Requires-Dist: protobuf<4,>=3.20.3; extra == "dev"
|
112
112
|
Requires-Dist: tensorboard; extra == "dev"
|
113
113
|
Requires-Dist: Jinja2; extra == "dev"
|
114
|
-
Requires-Dist: peft>=0.
|
114
|
+
Requires-Dist: peft>=0.15.0; extra == "dev"
|
115
115
|
Requires-Dist: hf-doc-builder>=0.3.0; extra == "dev"
|
116
116
|
Requires-Dist: torch>=1.4; extra == "dev"
|
117
117
|
Requires-Dist: accelerate>=0.31.0; extra == "dev"
|