diffusers 0.33.1__py3-none-any.whl → 0.35.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 +145 -1
- diffusers/callbacks.py +35 -0
- diffusers/commands/__init__.py +1 -1
- diffusers/commands/custom_blocks.py +134 -0
- diffusers/commands/diffusers_cli.py +3 -1
- diffusers/commands/env.py +1 -1
- diffusers/commands/fp16_safetensors.py +2 -2
- diffusers/configuration_utils.py +11 -2
- diffusers/dependency_versions_check.py +1 -1
- diffusers/dependency_versions_table.py +3 -3
- diffusers/experimental/rl/value_guided_sampling.py +1 -1
- diffusers/guiders/__init__.py +41 -0
- diffusers/guiders/adaptive_projected_guidance.py +188 -0
- diffusers/guiders/auto_guidance.py +190 -0
- diffusers/guiders/classifier_free_guidance.py +141 -0
- diffusers/guiders/classifier_free_zero_star_guidance.py +152 -0
- diffusers/guiders/frequency_decoupled_guidance.py +327 -0
- diffusers/guiders/guider_utils.py +309 -0
- diffusers/guiders/perturbed_attention_guidance.py +271 -0
- diffusers/guiders/skip_layer_guidance.py +262 -0
- diffusers/guiders/smoothed_energy_guidance.py +251 -0
- diffusers/guiders/tangential_classifier_free_guidance.py +143 -0
- diffusers/hooks/__init__.py +17 -0
- diffusers/hooks/_common.py +56 -0
- diffusers/hooks/_helpers.py +293 -0
- diffusers/hooks/faster_cache.py +9 -8
- diffusers/hooks/first_block_cache.py +259 -0
- diffusers/hooks/group_offloading.py +332 -227
- diffusers/hooks/hooks.py +58 -3
- diffusers/hooks/layer_skip.py +263 -0
- diffusers/hooks/layerwise_casting.py +5 -10
- diffusers/hooks/pyramid_attention_broadcast.py +15 -12
- diffusers/hooks/smoothed_energy_guidance_utils.py +167 -0
- diffusers/hooks/utils.py +43 -0
- diffusers/image_processor.py +7 -2
- diffusers/loaders/__init__.py +10 -0
- diffusers/loaders/ip_adapter.py +260 -18
- diffusers/loaders/lora_base.py +261 -127
- diffusers/loaders/lora_conversion_utils.py +657 -35
- diffusers/loaders/lora_pipeline.py +2778 -1246
- diffusers/loaders/peft.py +78 -112
- diffusers/loaders/single_file.py +2 -2
- diffusers/loaders/single_file_model.py +64 -15
- diffusers/loaders/single_file_utils.py +395 -7
- diffusers/loaders/textual_inversion.py +3 -2
- diffusers/loaders/transformer_flux.py +10 -11
- diffusers/loaders/transformer_sd3.py +8 -3
- diffusers/loaders/unet.py +24 -21
- diffusers/loaders/unet_loader_utils.py +6 -3
- diffusers/loaders/utils.py +1 -1
- diffusers/models/__init__.py +23 -1
- diffusers/models/activations.py +5 -5
- diffusers/models/adapter.py +2 -3
- diffusers/models/attention.py +488 -7
- diffusers/models/attention_dispatch.py +1218 -0
- diffusers/models/attention_flax.py +10 -10
- diffusers/models/attention_processor.py +113 -667
- diffusers/models/auto_model.py +49 -12
- diffusers/models/autoencoders/__init__.py +2 -0
- diffusers/models/autoencoders/autoencoder_asym_kl.py +4 -4
- diffusers/models/autoencoders/autoencoder_dc.py +17 -4
- diffusers/models/autoencoders/autoencoder_kl.py +5 -5
- 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 +1110 -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_qwenimage.py +1070 -0
- diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_wan.py +626 -62
- 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 +32 -10
- 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 +21 -20
- 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 +5 -5
- 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 +36 -46
- diffusers/models/embeddings_flax.py +2 -2
- diffusers/models/lora.py +3 -3
- diffusers/models/model_loading_utils.py +233 -1
- diffusers/models/modeling_flax_utils.py +1 -2
- diffusers/models/modeling_utils.py +203 -108
- diffusers/models/normalization.py +4 -4
- diffusers/models/resnet.py +2 -2
- diffusers/models/resnet_flax.py +1 -1
- diffusers/models/transformers/__init__.py +7 -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 +641 -0
- diffusers/models/transformers/transformer_cogview3plus.py +5 -10
- diffusers/models/transformers/transformer_cogview4.py +353 -27
- diffusers/models/transformers/transformer_cosmos.py +586 -0
- diffusers/models/transformers/transformer_flux.py +376 -138
- diffusers/models/transformers/transformer_hidream_image.py +942 -0
- diffusers/models/transformers/transformer_hunyuan_video.py +12 -8
- diffusers/models/transformers/transformer_hunyuan_video_framepack.py +416 -0
- diffusers/models/transformers/transformer_ltx.py +105 -24
- 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_qwenimage.py +645 -0
- diffusers/models/transformers/transformer_sd3.py +7 -7
- diffusers/models/transformers/transformer_skyreels_v2.py +607 -0
- diffusers/models/transformers/transformer_temporal.py +1 -1
- diffusers/models/transformers/transformer_wan.py +316 -87
- diffusers/models/transformers/transformer_wan_vace.py +387 -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 +4 -3
- 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/modular_pipelines/__init__.py +83 -0
- diffusers/modular_pipelines/components_manager.py +1068 -0
- diffusers/modular_pipelines/flux/__init__.py +66 -0
- diffusers/modular_pipelines/flux/before_denoise.py +689 -0
- diffusers/modular_pipelines/flux/decoders.py +109 -0
- diffusers/modular_pipelines/flux/denoise.py +227 -0
- diffusers/modular_pipelines/flux/encoders.py +412 -0
- diffusers/modular_pipelines/flux/modular_blocks.py +181 -0
- diffusers/modular_pipelines/flux/modular_pipeline.py +59 -0
- diffusers/modular_pipelines/modular_pipeline.py +2446 -0
- diffusers/modular_pipelines/modular_pipeline_utils.py +672 -0
- diffusers/modular_pipelines/node_utils.py +665 -0
- diffusers/modular_pipelines/stable_diffusion_xl/__init__.py +77 -0
- diffusers/modular_pipelines/stable_diffusion_xl/before_denoise.py +1874 -0
- diffusers/modular_pipelines/stable_diffusion_xl/decoders.py +208 -0
- diffusers/modular_pipelines/stable_diffusion_xl/denoise.py +771 -0
- diffusers/modular_pipelines/stable_diffusion_xl/encoders.py +887 -0
- diffusers/modular_pipelines/stable_diffusion_xl/modular_blocks.py +380 -0
- diffusers/modular_pipelines/stable_diffusion_xl/modular_pipeline.py +365 -0
- diffusers/modular_pipelines/wan/__init__.py +66 -0
- diffusers/modular_pipelines/wan/before_denoise.py +365 -0
- diffusers/modular_pipelines/wan/decoders.py +105 -0
- diffusers/modular_pipelines/wan/denoise.py +261 -0
- diffusers/modular_pipelines/wan/encoders.py +242 -0
- diffusers/modular_pipelines/wan/modular_blocks.py +144 -0
- diffusers/modular_pipelines/wan/modular_pipeline.py +90 -0
- diffusers/pipelines/__init__.py +68 -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 +22 -13
- diffusers/pipelines/aura_flow/pipeline_aura_flow.py +48 -11
- diffusers/pipelines/auto_pipeline.py +23 -20
- 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 +17 -16
- diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +17 -16
- diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +18 -17
- diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +17 -16
- diffusers/pipelines/cogview3/pipeline_cogview3plus.py +9 -9
- diffusers/pipelines/cogview4/pipeline_cogview4.py +23 -22
- 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 +11 -10
- 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 +226 -107
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +12 -8
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +207 -105
- 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 +8 -8
- 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 +4 -2
- 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/__init__.py +4 -0
- diffusers/pipelines/flux/modeling_flux.py +1 -1
- diffusers/pipelines/flux/pipeline_flux.py +37 -36
- diffusers/pipelines/flux/pipeline_flux_control.py +9 -9
- diffusers/pipelines/flux/pipeline_flux_control_img2img.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_controlnet.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +31 -23
- diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +3 -2
- diffusers/pipelines/flux/pipeline_flux_fill.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_img2img.py +40 -7
- diffusers/pipelines/flux/pipeline_flux_inpaint.py +12 -7
- diffusers/pipelines/flux/pipeline_flux_kontext.py +1134 -0
- diffusers/pipelines/flux/pipeline_flux_kontext_inpaint.py +1460 -0
- diffusers/pipelines/flux/pipeline_flux_prior_redux.py +2 -2
- diffusers/pipelines/flux/pipeline_output.py +6 -4
- 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 +26 -25
- 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 +64 -18
- diffusers/pipelines/ltx/pipeline_ltx_condition.py +117 -38
- diffusers/pipelines/ltx/pipeline_ltx_image2video.py +63 -18
- 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 +15 -14
- 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 +5 -6
- diffusers/pipelines/pipeline_loading_utils.py +113 -15
- diffusers/pipelines/pipeline_utils.py +127 -48
- diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +14 -12
- diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +31 -11
- diffusers/pipelines/qwenimage/__init__.py +55 -0
- diffusers/pipelines/qwenimage/pipeline_output.py +21 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage.py +726 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_edit.py +882 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_img2img.py +829 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_inpaint.py +1015 -0
- 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/skyreels_v2/__init__.py +59 -0
- diffusers/pipelines/skyreels_v2/pipeline_output.py +20 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2.py +610 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing.py +978 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_i2v.py +1059 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_v2v.py +1063 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_i2v.py +745 -0
- 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 +12 -11
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_img2img.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_inpaint.py +11 -11
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +10 -9
- 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 +13 -12
- 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 +91 -30
- diffusers/pipelines/wan/pipeline_wan_i2v.py +145 -45
- diffusers/pipelines/wan/pipeline_wan_vace.py +975 -0
- diffusers/pipelines/wan/pipeline_wan_video2video.py +14 -16
- 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 +3 -1
- diffusers/quantizers/base.py +17 -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 +108 -16
- diffusers/quantizers/pipe_quant_config.py +202 -0
- diffusers/quantizers/quantization_config.py +18 -16
- diffusers/quantizers/quanto/quanto_quantizer.py +4 -0
- diffusers/quantizers/torchao/torchao_quantizer.py +31 -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 +16 -9
- diffusers/schedulers/scheduling_dpm_cogvideox.py +5 -5
- diffusers/schedulers/scheduling_dpmsolver_multistep.py +18 -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 +19 -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 -2
- 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 +21 -12
- diffusers/schedulers/scheduling_utils.py +3 -3
- diffusers/schedulers/scheduling_utils_flax.py +2 -2
- diffusers/schedulers/scheduling_vq_diffusion.py +1 -1
- diffusers/training_utils.py +91 -5
- diffusers/utils/__init__.py +15 -0
- diffusers/utils/accelerate_utils.py +1 -1
- diffusers/utils/constants.py +4 -0
- diffusers/utils/doc_utils.py +1 -1
- diffusers/utils/dummy_pt_objects.py +432 -0
- diffusers/utils/dummy_torch_and_transformers_objects.py +480 -0
- diffusers/utils/dynamic_modules_utils.py +85 -8
- diffusers/utils/export_utils.py +1 -1
- diffusers/utils/hub_utils.py +33 -17
- diffusers/utils/import_utils.py +151 -18
- diffusers/utils/logging.py +1 -1
- diffusers/utils/outputs.py +2 -1
- diffusers/utils/peft_utils.py +96 -10
- diffusers/utils/state_dict_utils.py +20 -3
- diffusers/utils/testing_utils.py +195 -17
- diffusers/utils/torch_utils.py +43 -5
- diffusers/video_processor.py +2 -2
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/METADATA +72 -57
- diffusers-0.35.0.dist-info/RECORD +703 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/WHEEL +1 -1
- diffusers-0.33.1.dist-info/RECORD +0 -608
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/LICENSE +0 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/entry_points.txt +0 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,202 @@
|
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
import inspect
|
16
|
+
from typing import Dict, List, Optional, Union
|
17
|
+
|
18
|
+
from ..utils import is_transformers_available, logging
|
19
|
+
from .quantization_config import QuantizationConfigMixin as DiffQuantConfigMixin
|
20
|
+
|
21
|
+
|
22
|
+
try:
|
23
|
+
from transformers.utils.quantization_config import QuantizationConfigMixin as TransformersQuantConfigMixin
|
24
|
+
except ImportError:
|
25
|
+
|
26
|
+
class TransformersQuantConfigMixin:
|
27
|
+
pass
|
28
|
+
|
29
|
+
|
30
|
+
logger = logging.get_logger(__name__)
|
31
|
+
|
32
|
+
|
33
|
+
class PipelineQuantizationConfig:
|
34
|
+
"""
|
35
|
+
Configuration class to be used when applying quantization on-the-fly to [`~DiffusionPipeline.from_pretrained`].
|
36
|
+
|
37
|
+
Args:
|
38
|
+
quant_backend (`str`): Quantization backend to be used. When using this option, we assume that the backend
|
39
|
+
is available to both `diffusers` and `transformers`.
|
40
|
+
quant_kwargs (`dict`): Params to initialize the quantization backend class.
|
41
|
+
components_to_quantize (`list`): Components of a pipeline to be quantized.
|
42
|
+
quant_mapping (`dict`): Mapping defining the quantization specs to be used for the pipeline
|
43
|
+
components. When using this argument, users are not expected to provide `quant_backend`, `quant_kawargs`,
|
44
|
+
and `components_to_quantize`.
|
45
|
+
"""
|
46
|
+
|
47
|
+
def __init__(
|
48
|
+
self,
|
49
|
+
quant_backend: str = None,
|
50
|
+
quant_kwargs: Dict[str, Union[str, float, int, dict]] = None,
|
51
|
+
components_to_quantize: Optional[List[str]] = None,
|
52
|
+
quant_mapping: Dict[str, Union[DiffQuantConfigMixin, "TransformersQuantConfigMixin"]] = None,
|
53
|
+
):
|
54
|
+
self.quant_backend = quant_backend
|
55
|
+
# Initialize kwargs to be {} to set to the defaults.
|
56
|
+
self.quant_kwargs = quant_kwargs or {}
|
57
|
+
self.components_to_quantize = components_to_quantize
|
58
|
+
self.quant_mapping = quant_mapping
|
59
|
+
self.config_mapping = {} # book-keeping Example: `{module_name: quant_config}`
|
60
|
+
self.post_init()
|
61
|
+
|
62
|
+
def post_init(self):
|
63
|
+
quant_mapping = self.quant_mapping
|
64
|
+
self.is_granular = True if quant_mapping is not None else False
|
65
|
+
|
66
|
+
self._validate_init_args()
|
67
|
+
|
68
|
+
def _validate_init_args(self):
|
69
|
+
if self.quant_backend and self.quant_mapping:
|
70
|
+
raise ValueError("Both `quant_backend` and `quant_mapping` cannot be specified at the same time.")
|
71
|
+
|
72
|
+
if not self.quant_mapping and not self.quant_backend:
|
73
|
+
raise ValueError("Must provide a `quant_backend` when not providing a `quant_mapping`.")
|
74
|
+
|
75
|
+
if not self.quant_kwargs and not self.quant_mapping:
|
76
|
+
raise ValueError("Both `quant_kwargs` and `quant_mapping` cannot be None.")
|
77
|
+
|
78
|
+
if self.quant_backend is not None:
|
79
|
+
self._validate_init_kwargs_in_backends()
|
80
|
+
|
81
|
+
if self.quant_mapping is not None:
|
82
|
+
self._validate_quant_mapping_args()
|
83
|
+
|
84
|
+
def _validate_init_kwargs_in_backends(self):
|
85
|
+
quant_backend = self.quant_backend
|
86
|
+
|
87
|
+
self._check_backend_availability(quant_backend)
|
88
|
+
|
89
|
+
quant_config_mapping_transformers, quant_config_mapping_diffusers = self._get_quant_config_list()
|
90
|
+
|
91
|
+
if quant_config_mapping_transformers is not None:
|
92
|
+
init_kwargs_transformers = inspect.signature(quant_config_mapping_transformers[quant_backend].__init__)
|
93
|
+
init_kwargs_transformers = {name for name in init_kwargs_transformers.parameters if name != "self"}
|
94
|
+
else:
|
95
|
+
init_kwargs_transformers = None
|
96
|
+
|
97
|
+
init_kwargs_diffusers = inspect.signature(quant_config_mapping_diffusers[quant_backend].__init__)
|
98
|
+
init_kwargs_diffusers = {name for name in init_kwargs_diffusers.parameters if name != "self"}
|
99
|
+
|
100
|
+
if init_kwargs_transformers != init_kwargs_diffusers:
|
101
|
+
raise ValueError(
|
102
|
+
"The signatures of the __init__ methods of the quantization config classes in `diffusers` and `transformers` don't match. "
|
103
|
+
f"Please provide a `quant_mapping` instead, in the {self.__class__.__name__} class. Refer to [the docs](https://huggingface.co/docs/diffusers/main/en/quantization/overview#pipeline-level-quantization) to learn more about how "
|
104
|
+
"this mapping would look like."
|
105
|
+
)
|
106
|
+
|
107
|
+
def _validate_quant_mapping_args(self):
|
108
|
+
quant_mapping = self.quant_mapping
|
109
|
+
transformers_map, diffusers_map = self._get_quant_config_list()
|
110
|
+
|
111
|
+
available_transformers = list(transformers_map.values()) if transformers_map else None
|
112
|
+
available_diffusers = list(diffusers_map.values())
|
113
|
+
|
114
|
+
for module_name, config in quant_mapping.items():
|
115
|
+
if any(isinstance(config, cfg) for cfg in available_diffusers):
|
116
|
+
continue
|
117
|
+
|
118
|
+
if available_transformers and any(isinstance(config, cfg) for cfg in available_transformers):
|
119
|
+
continue
|
120
|
+
|
121
|
+
if available_transformers:
|
122
|
+
raise ValueError(
|
123
|
+
f"Provided config for module_name={module_name} could not be found. "
|
124
|
+
f"Available diffusers configs: {available_diffusers}; "
|
125
|
+
f"Available transformers configs: {available_transformers}."
|
126
|
+
)
|
127
|
+
else:
|
128
|
+
raise ValueError(
|
129
|
+
f"Provided config for module_name={module_name} could not be found. "
|
130
|
+
f"Available diffusers configs: {available_diffusers}."
|
131
|
+
)
|
132
|
+
|
133
|
+
def _check_backend_availability(self, quant_backend: str):
|
134
|
+
quant_config_mapping_transformers, quant_config_mapping_diffusers = self._get_quant_config_list()
|
135
|
+
|
136
|
+
available_backends_transformers = (
|
137
|
+
list(quant_config_mapping_transformers.keys()) if quant_config_mapping_transformers else None
|
138
|
+
)
|
139
|
+
available_backends_diffusers = list(quant_config_mapping_diffusers.keys())
|
140
|
+
|
141
|
+
if (
|
142
|
+
available_backends_transformers and quant_backend not in available_backends_transformers
|
143
|
+
) or quant_backend not in quant_config_mapping_diffusers:
|
144
|
+
error_message = f"Provided quant_backend={quant_backend} was not found."
|
145
|
+
if available_backends_transformers:
|
146
|
+
error_message += f"\nAvailable ones (transformers): {available_backends_transformers}."
|
147
|
+
error_message += f"\nAvailable ones (diffusers): {available_backends_diffusers}."
|
148
|
+
raise ValueError(error_message)
|
149
|
+
|
150
|
+
def _resolve_quant_config(self, is_diffusers: bool = True, module_name: str = None):
|
151
|
+
quant_config_mapping_transformers, quant_config_mapping_diffusers = self._get_quant_config_list()
|
152
|
+
|
153
|
+
quant_mapping = self.quant_mapping
|
154
|
+
components_to_quantize = self.components_to_quantize
|
155
|
+
|
156
|
+
# Granular case
|
157
|
+
if self.is_granular and module_name in quant_mapping:
|
158
|
+
logger.debug(f"Initializing quantization config class for {module_name}.")
|
159
|
+
config = quant_mapping[module_name]
|
160
|
+
self.config_mapping.update({module_name: config})
|
161
|
+
return config
|
162
|
+
|
163
|
+
# Global config case
|
164
|
+
else:
|
165
|
+
should_quantize = False
|
166
|
+
# Only quantize the modules requested for.
|
167
|
+
if components_to_quantize and module_name in components_to_quantize:
|
168
|
+
should_quantize = True
|
169
|
+
# No specification for `components_to_quantize` means all modules should be quantized.
|
170
|
+
elif not self.is_granular and not components_to_quantize:
|
171
|
+
should_quantize = True
|
172
|
+
|
173
|
+
if should_quantize:
|
174
|
+
logger.debug(f"Initializing quantization config class for {module_name}.")
|
175
|
+
mapping_to_use = quant_config_mapping_diffusers if is_diffusers else quant_config_mapping_transformers
|
176
|
+
quant_config_cls = mapping_to_use[self.quant_backend]
|
177
|
+
quant_kwargs = self.quant_kwargs
|
178
|
+
quant_obj = quant_config_cls(**quant_kwargs)
|
179
|
+
self.config_mapping.update({module_name: quant_obj})
|
180
|
+
return quant_obj
|
181
|
+
|
182
|
+
# Fallback: no applicable configuration found.
|
183
|
+
return None
|
184
|
+
|
185
|
+
def _get_quant_config_list(self):
|
186
|
+
if is_transformers_available():
|
187
|
+
from transformers.quantizers.auto import (
|
188
|
+
AUTO_QUANTIZATION_CONFIG_MAPPING as quant_config_mapping_transformers,
|
189
|
+
)
|
190
|
+
else:
|
191
|
+
quant_config_mapping_transformers = None
|
192
|
+
|
193
|
+
from ..quantizers.auto import AUTO_QUANTIZATION_CONFIG_MAPPING as quant_config_mapping_diffusers
|
194
|
+
|
195
|
+
return quant_config_mapping_transformers, quant_config_mapping_diffusers
|
196
|
+
|
197
|
+
def __repr__(self):
|
198
|
+
out = ""
|
199
|
+
config_mapping = dict(sorted(self.config_mapping.copy().items()))
|
200
|
+
for module_name, config in config_mapping.items():
|
201
|
+
out += f"{module_name} {config}"
|
202
|
+
return out
|
@@ -75,7 +75,7 @@ class QuantizationConfigMixin:
|
|
75
75
|
Args:
|
76
76
|
config_dict (`Dict[str, Any]`):
|
77
77
|
Dictionary that will be used to instantiate the configuration object.
|
78
|
-
return_unused_kwargs (`bool
|
78
|
+
return_unused_kwargs (`bool`, *optional*, defaults to `False`):
|
79
79
|
Whether or not to return a list of unused keyword arguments. Used for `from_pretrained` method in
|
80
80
|
`PreTrainedModel`.
|
81
81
|
kwargs (`Dict[str, Any]`):
|
@@ -179,7 +179,7 @@ class BitsAndBytesConfig(QuantizationConfigMixin):
|
|
179
179
|
This is a wrapper class about all possible attributes and features that you can play with a model that has been
|
180
180
|
loaded using `bitsandbytes`.
|
181
181
|
|
182
|
-
This replaces `load_in_8bit` or `load_in_4bit`therefore both options are mutually exclusive.
|
182
|
+
This replaces `load_in_8bit` or `load_in_4bit` therefore both options are mutually exclusive.
|
183
183
|
|
184
184
|
Currently only supports `LLM.int8()`, `FP4`, and `NF4` quantization. If more methods are added to `bitsandbytes`,
|
185
185
|
then more arguments will be added to this class.
|
@@ -192,10 +192,10 @@ class BitsAndBytesConfig(QuantizationConfigMixin):
|
|
192
192
|
`bitsandbytes`.
|
193
193
|
llm_int8_threshold (`float`, *optional*, defaults to 6.0):
|
194
194
|
This corresponds to the outlier threshold for outlier detection as described in `LLM.int8() : 8-bit Matrix
|
195
|
-
Multiplication for Transformers at Scale` paper: https://
|
196
|
-
that is above this threshold will be considered an outlier and the operation on those values will be
|
197
|
-
in fp16. Values are usually normally distributed, that is, most values are in the range [-3.5, 3.5],
|
198
|
-
there are some exceptional systematic outliers that are very differently distributed for large models.
|
195
|
+
Multiplication for Transformers at Scale` paper: https://huggingface.co/papers/2208.07339 Any hidden states
|
196
|
+
value that is above this threshold will be considered an outlier and the operation on those values will be
|
197
|
+
done in fp16. Values are usually normally distributed, that is, most values are in the range [-3.5, 3.5],
|
198
|
+
but there are some exceptional systematic outliers that are very differently distributed for large models.
|
199
199
|
These outliers are often in the interval [-60, -6] or [6, 60]. Int8 quantization works well for values of
|
200
200
|
magnitude ~5, but beyond that, there is a significant performance penalty. A good default threshold is 6,
|
201
201
|
but a lower threshold might be needed for more unstable models (small models, fine-tuning).
|
@@ -493,7 +493,7 @@ class TorchAoConfig(QuantizationConfigMixin):
|
|
493
493
|
TORCHAO_QUANT_TYPE_METHODS = self._get_torchao_quant_type_to_method()
|
494
494
|
if self.quant_type not in TORCHAO_QUANT_TYPE_METHODS.keys():
|
495
495
|
is_floating_quant_type = self.quant_type.startswith("float") or self.quant_type.startswith("fp")
|
496
|
-
if is_floating_quant_type and not self.
|
496
|
+
if is_floating_quant_type and not self._is_xpu_or_cuda_capability_atleast_8_9():
|
497
497
|
raise ValueError(
|
498
498
|
f"Requested quantization type: {self.quant_type} is not supported on GPUs with CUDA capability <= 8.9. You "
|
499
499
|
f"can check the CUDA capability of your GPU using `torch.cuda.get_device_capability()`."
|
@@ -645,7 +645,7 @@ class TorchAoConfig(QuantizationConfigMixin):
|
|
645
645
|
QUANTIZATION_TYPES.update(INT8_QUANTIZATION_TYPES)
|
646
646
|
QUANTIZATION_TYPES.update(UINTX_QUANTIZATION_DTYPES)
|
647
647
|
|
648
|
-
if cls.
|
648
|
+
if cls._is_xpu_or_cuda_capability_atleast_8_9():
|
649
649
|
QUANTIZATION_TYPES.update(FLOATX_QUANTIZATION_TYPES)
|
650
650
|
|
651
651
|
return QUANTIZATION_TYPES
|
@@ -655,14 +655,16 @@ class TorchAoConfig(QuantizationConfigMixin):
|
|
655
655
|
)
|
656
656
|
|
657
657
|
@staticmethod
|
658
|
-
def
|
659
|
-
if
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
658
|
+
def _is_xpu_or_cuda_capability_atleast_8_9() -> bool:
|
659
|
+
if torch.cuda.is_available():
|
660
|
+
major, minor = torch.cuda.get_device_capability()
|
661
|
+
if major == 8:
|
662
|
+
return minor >= 9
|
663
|
+
return major >= 9
|
664
|
+
elif torch.xpu.is_available():
|
665
|
+
return True
|
666
|
+
else:
|
667
|
+
raise RuntimeError("TorchAO requires a CUDA compatible GPU or Intel XPU and installation of PyTorch.")
|
666
668
|
|
667
669
|
def get_apply_tensor_subclass(self):
|
668
670
|
TORCHAO_QUANT_TYPE_METHODS = self._get_torchao_quant_type_to_method()
|
@@ -19,6 +19,7 @@ https://github.com/huggingface/transformers/blob/3a8eb74668e9c2cc563b2f5c62fac17
|
|
19
19
|
|
20
20
|
import importlib
|
21
21
|
import types
|
22
|
+
from fnmatch import fnmatch
|
22
23
|
from typing import TYPE_CHECKING, Any, Dict, List, Union
|
23
24
|
|
24
25
|
from packaging import version
|
@@ -262,7 +263,7 @@ class TorchAoHfQuantizer(DiffusersQuantizer):
|
|
262
263
|
**kwargs,
|
263
264
|
):
|
264
265
|
r"""
|
265
|
-
Each nn.Linear layer that needs to be quantized is
|
266
|
+
Each nn.Linear layer that needs to be quantized is processed here. First, we set the value the weight tensor,
|
266
267
|
then we move it to the target device. Finally, we quantize the module.
|
267
268
|
"""
|
268
269
|
module, tensor_name = get_module_from_name(model, param_name)
|
@@ -278,6 +279,31 @@ class TorchAoHfQuantizer(DiffusersQuantizer):
|
|
278
279
|
module._parameters[tensor_name] = torch.nn.Parameter(param_value).to(device=target_device)
|
279
280
|
quantize_(module, self.quantization_config.get_apply_tensor_subclass())
|
280
281
|
|
282
|
+
def get_cuda_warm_up_factor(self):
|
283
|
+
"""
|
284
|
+
This factor is used in caching_allocator_warmup to determine how many bytes to pre-allocate for CUDA warmup.
|
285
|
+
- A factor of 2 means we pre-allocate the full memory footprint of the model.
|
286
|
+
- A factor of 4 means we pre-allocate half of that, and so on
|
287
|
+
|
288
|
+
However, when using TorchAO, calculating memory usage with param.numel() * param.element_size() doesn't give
|
289
|
+
the correct size for quantized weights (like int4 or int8) That's because TorchAO internally represents
|
290
|
+
quantized tensors using subtensors and metadata, and the reported element_size() still corresponds to the
|
291
|
+
torch_dtype not the actual bit-width of the quantized data.
|
292
|
+
|
293
|
+
To correct for this:
|
294
|
+
- Use a division factor of 8 for int4 weights
|
295
|
+
- Use a division factor of 4 for int8 weights
|
296
|
+
"""
|
297
|
+
# Original mapping for non-AOBaseConfig types
|
298
|
+
# For the uint types, this is a best guess. Once these types become more used
|
299
|
+
# we can look into their nuances.
|
300
|
+
map_to_target_dtype = {"int4_*": 8, "int8_*": 4, "uint*": 8, "float8*": 4}
|
301
|
+
quant_type = self.quantization_config.quant_type
|
302
|
+
for pattern, target_dtype in map_to_target_dtype.items():
|
303
|
+
if fnmatch(quant_type, pattern):
|
304
|
+
return target_dtype
|
305
|
+
raise ValueError(f"Unsupported quant_type: {quant_type!r}")
|
306
|
+
|
281
307
|
def _process_model_before_weight_loading(
|
282
308
|
self,
|
283
309
|
model: "ModelMixin",
|
@@ -335,3 +361,7 @@ class TorchAoHfQuantizer(DiffusersQuantizer):
|
|
335
361
|
@property
|
336
362
|
def is_trainable(self):
|
337
363
|
return self.quantization_config.quant_type.startswith("int8")
|
364
|
+
|
365
|
+
@property
|
366
|
+
def is_compileable(self) -> bool:
|
367
|
+
return True
|
diffusers/schedulers/__init__.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.
|
@@ -60,6 +60,7 @@ else:
|
|
60
60
|
_import_structure["scheduling_euler_discrete"] = ["EulerDiscreteScheduler"]
|
61
61
|
_import_structure["scheduling_flow_match_euler_discrete"] = ["FlowMatchEulerDiscreteScheduler"]
|
62
62
|
_import_structure["scheduling_flow_match_heun_discrete"] = ["FlowMatchHeunDiscreteScheduler"]
|
63
|
+
_import_structure["scheduling_flow_match_lcm"] = ["FlowMatchLCMScheduler"]
|
63
64
|
_import_structure["scheduling_heun_discrete"] = ["HeunDiscreteScheduler"]
|
64
65
|
_import_structure["scheduling_ipndm"] = ["IPNDMScheduler"]
|
65
66
|
_import_structure["scheduling_k_dpm_2_ancestral_discrete"] = ["KDPM2AncestralDiscreteScheduler"]
|
@@ -161,6 +162,7 @@ if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
|
|
161
162
|
from .scheduling_euler_discrete import EulerDiscreteScheduler
|
162
163
|
from .scheduling_flow_match_euler_discrete import FlowMatchEulerDiscreteScheduler
|
163
164
|
from .scheduling_flow_match_heun_discrete import FlowMatchHeunDiscreteScheduler
|
165
|
+
from .scheduling_flow_match_lcm import FlowMatchLCMScheduler
|
164
166
|
from .scheduling_heun_discrete import HeunDiscreteScheduler
|
165
167
|
from .scheduling_ipndm import IPNDMScheduler
|
166
168
|
from .scheduling_k_dpm_2_ancestral_discrete import KDPM2AncestralDiscreteScheduler
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 NVIDIA and 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.
|
@@ -55,8 +55,9 @@ class KarrasVeScheduler(SchedulerMixin, ConfigMixin):
|
|
55
55
|
|
56
56
|
<Tip>
|
57
57
|
|
58
|
-
For more details on the parameters, see [Appendix E](https://
|
59
|
-
to find the optimal `{s_noise, s_churn, s_min, s_max}` for a specific model are described in Table 5 of
|
58
|
+
For more details on the parameters, see [Appendix E](https://huggingface.co/papers/2206.00364). The grid search
|
59
|
+
values used to find the optimal `{s_noise, s_churn, s_min, s_max}` for a specific model are described in Table 5 of
|
60
|
+
the paper.
|
60
61
|
|
61
62
|
</Tip>
|
62
63
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 Google Brain and 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.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 TSAIL Team and 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.
|
@@ -30,7 +30,7 @@ class CosineDPMSolverMultistepScheduler(SchedulerMixin, ConfigMixin):
|
|
30
30
|
Implements a variant of `DPMSolverMultistepScheduler` with cosine schedule, proposed by Nichol and Dhariwal (2021).
|
31
31
|
This scheduler was used in Stable Audio Open [1].
|
32
32
|
|
33
|
-
[1] Evans, Parker, et al. "Stable Audio Open" https://
|
33
|
+
[1] Evans, Parker, et al. "Stable Audio Open" https://huggingface.co/papers/2407.14358
|
34
34
|
|
35
35
|
This model inherits from [`SchedulerMixin`] and [`ConfigMixin`]. Check the superclass documentation for the generic
|
36
36
|
methods the library implements for all schedulers such as loading and saving.
|
@@ -44,8 +44,8 @@ class CosineDPMSolverMultistepScheduler(SchedulerMixin, ConfigMixin):
|
|
44
44
|
The standard deviation of the data distribution. This is set to 1.0 in Stable Audio Open [1].
|
45
45
|
sigma_schedule (`str`, *optional*, defaults to `exponential`):
|
46
46
|
Sigma schedule to compute the `sigmas`. By default, we the schedule introduced in the EDM paper
|
47
|
-
(https://
|
48
|
-
incorporated in this model: https://huggingface.co/stabilityai/cosxl.
|
47
|
+
(https://huggingface.co/papers/2206.00364). Other acceptable value is "exponential". The exponential
|
48
|
+
schedule was incorporated in this model: https://huggingface.co/stabilityai/cosxl.
|
49
49
|
num_train_timesteps (`int`, defaults to 1000):
|
50
50
|
The number of diffusion steps to train the model.
|
51
51
|
solver_order (`int`, defaults to 2):
|
@@ -144,7 +144,7 @@ class CosineDPMSolverMultistepScheduler(SchedulerMixin, ConfigMixin):
|
|
144
144
|
|
145
145
|
# Copied from diffusers.schedulers.scheduling_edm_euler.EDMEulerScheduler.precondition_inputs
|
146
146
|
def precondition_inputs(self, sample, sigma):
|
147
|
-
c_in =
|
147
|
+
c_in = self._get_conditioning_c_in(sigma)
|
148
148
|
scaled_sample = sample * c_in
|
149
149
|
return scaled_sample
|
150
150
|
|
@@ -568,5 +568,10 @@ class CosineDPMSolverMultistepScheduler(SchedulerMixin, ConfigMixin):
|
|
568
568
|
noisy_samples = original_samples + noise * sigma
|
569
569
|
return noisy_samples
|
570
570
|
|
571
|
+
# Copied from diffusers.schedulers.scheduling_edm_euler.EDMEulerScheduler._get_conditioning_c_in
|
572
|
+
def _get_conditioning_c_in(self, sigma):
|
573
|
+
c_in = 1 / ((sigma**2 + self.config.sigma_data**2) ** 0.5)
|
574
|
+
return c_in
|
575
|
+
|
571
576
|
def __len__(self):
|
572
577
|
return self.config.num_train_timesteps
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 Stanford University Team and 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.
|
@@ -94,7 +94,7 @@ def betas_for_alpha_bar(
|
|
94
94
|
|
95
95
|
def rescale_zero_terminal_snr(betas):
|
96
96
|
"""
|
97
|
-
Rescales betas to have zero terminal SNR Based on https://
|
97
|
+
Rescales betas to have zero terminal SNR Based on https://huggingface.co/papers/2305.08891 (Algorithm 1)
|
98
98
|
|
99
99
|
|
100
100
|
Args:
|
@@ -269,7 +269,7 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
269
269
|
pixels from saturation at each step. We find that dynamic thresholding results in significantly better
|
270
270
|
photorealism as well as better image-text alignment, especially when using very large guidance weights."
|
271
271
|
|
272
|
-
https://
|
272
|
+
https://huggingface.co/papers/2205.11487
|
273
273
|
"""
|
274
274
|
dtype = sample.dtype
|
275
275
|
batch_size, channels, *remaining_dims = sample.shape
|
@@ -312,7 +312,7 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
312
312
|
|
313
313
|
self.num_inference_steps = num_inference_steps
|
314
314
|
|
315
|
-
# "linspace", "leading", "trailing" corresponds to annotation of Table 2. of https://
|
315
|
+
# "linspace", "leading", "trailing" corresponds to annotation of Table 2. of https://huggingface.co/papers/2305.08891
|
316
316
|
if self.config.timestep_spacing == "linspace":
|
317
317
|
timesteps = (
|
318
318
|
np.linspace(0, self.config.num_train_timesteps - 1, num_inference_steps)
|
@@ -387,7 +387,7 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
387
387
|
"Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler"
|
388
388
|
)
|
389
389
|
|
390
|
-
# See formulas (12) and (16) of DDIM paper https://
|
390
|
+
# See formulas (12) and (16) of DDIM paper https://huggingface.co/papers/2010.02502
|
391
391
|
# Ideally, read DDIM paper in-detail understanding
|
392
392
|
|
393
393
|
# Notation (<variable name> -> <name in paper>
|
@@ -408,7 +408,7 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
408
408
|
beta_prod_t = 1 - alpha_prod_t
|
409
409
|
|
410
410
|
# 3. compute predicted original sample from predicted noise also called
|
411
|
-
# "predicted x_0" of formula (12) from https://
|
411
|
+
# "predicted x_0" of formula (12) from https://huggingface.co/papers/2010.02502
|
412
412
|
if self.config.prediction_type == "epsilon":
|
413
413
|
pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5)
|
414
414
|
pred_epsilon = model_output
|
@@ -441,10 +441,10 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
441
441
|
# the pred_epsilon is always re-derived from the clipped x_0 in Glide
|
442
442
|
pred_epsilon = (sample - alpha_prod_t ** (0.5) * pred_original_sample) / beta_prod_t ** (0.5)
|
443
443
|
|
444
|
-
# 6. compute "direction pointing to x_t" of formula (12) from https://
|
444
|
+
# 6. compute "direction pointing to x_t" of formula (12) from https://huggingface.co/papers/2010.02502
|
445
445
|
pred_sample_direction = (1 - alpha_prod_t_prev - std_dev_t**2) ** (0.5) * pred_epsilon
|
446
446
|
|
447
|
-
# 7. compute x_t without "random noise" of formula (12) from https://
|
447
|
+
# 7. compute x_t without "random noise" of formula (12) from https://huggingface.co/papers/2010.02502
|
448
448
|
prev_sample = alpha_prod_t_prev ** (0.5) * pred_original_sample + pred_sample_direction
|
449
449
|
|
450
450
|
if eta > 0:
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The CogVideoX team, Tsinghua University & ZhipuAI and The HuggingFace Team.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -94,7 +94,7 @@ def betas_for_alpha_bar(
|
|
94
94
|
|
95
95
|
def rescale_zero_terminal_snr(alphas_cumprod):
|
96
96
|
"""
|
97
|
-
Rescales betas to have zero terminal SNR Based on https://
|
97
|
+
Rescales betas to have zero terminal SNR Based on https://huggingface.co/papers/2305.08891 (Algorithm 1)
|
98
98
|
|
99
99
|
|
100
100
|
Args:
|
@@ -275,7 +275,7 @@ class CogVideoXDDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
275
275
|
|
276
276
|
self.num_inference_steps = num_inference_steps
|
277
277
|
|
278
|
-
# "linspace", "leading", "trailing" corresponds to annotation of Table 2. of https://
|
278
|
+
# "linspace", "leading", "trailing" corresponds to annotation of Table 2. of https://huggingface.co/papers/2305.08891
|
279
279
|
if self.config.timestep_spacing == "linspace":
|
280
280
|
timesteps = (
|
281
281
|
np.linspace(0, self.config.num_train_timesteps - 1, num_inference_steps)
|
@@ -350,7 +350,7 @@ class CogVideoXDDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
350
350
|
"Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler"
|
351
351
|
)
|
352
352
|
|
353
|
-
# See formulas (12) and (16) of DDIM paper https://
|
353
|
+
# See formulas (12) and (16) of DDIM paper https://huggingface.co/papers/2010.02502
|
354
354
|
# Ideally, read DDIM paper in-detail understanding
|
355
355
|
|
356
356
|
# Notation (<variable name> -> <name in paper>
|
@@ -371,7 +371,7 @@ class CogVideoXDDIMScheduler(SchedulerMixin, ConfigMixin):
|
|
371
371
|
beta_prod_t = 1 - alpha_prod_t
|
372
372
|
|
373
373
|
# 3. compute predicted original sample from predicted noise also called
|
374
|
-
# "predicted x_0" of formula (12) from https://
|
374
|
+
# "predicted x_0" of formula (12) from https://huggingface.co/papers/2010.02502
|
375
375
|
# To make style tests pass, commented out `pred_epsilon` as it is an unused variable
|
376
376
|
if self.config.prediction_type == "epsilon":
|
377
377
|
pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 Stanford University Team and 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.
|
@@ -73,7 +73,7 @@ class FlaxDDIMScheduler(FlaxSchedulerMixin, ConfigMixin):
|
|
73
73
|
[`SchedulerMixin`] provides general loading and saving functionality via the [`SchedulerMixin.save_pretrained`] and
|
74
74
|
[`~SchedulerMixin.from_pretrained`] functions.
|
75
75
|
|
76
|
-
For more details, see the original paper: https://
|
76
|
+
For more details, see the original paper: https://huggingface.co/papers/2010.02502
|
77
77
|
|
78
78
|
Args:
|
79
79
|
num_train_timesteps (`int`): number of diffusion steps used to train the model.
|
@@ -230,7 +230,7 @@ class FlaxDDIMScheduler(FlaxSchedulerMixin, ConfigMixin):
|
|
230
230
|
"Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler"
|
231
231
|
)
|
232
232
|
|
233
|
-
# See formulas (12) and (16) of DDIM paper https://
|
233
|
+
# See formulas (12) and (16) of DDIM paper https://huggingface.co/papers/2010.02502
|
234
234
|
# Ideally, read DDIM paper in-detail understanding
|
235
235
|
|
236
236
|
# Notation (<variable name> -> <name in paper>
|
@@ -254,7 +254,7 @@ class FlaxDDIMScheduler(FlaxSchedulerMixin, ConfigMixin):
|
|
254
254
|
beta_prod_t = 1 - alpha_prod_t
|
255
255
|
|
256
256
|
# 3. compute predicted original sample from predicted noise also called
|
257
|
-
# "predicted x_0" of formula (12) from https://
|
257
|
+
# "predicted x_0" of formula (12) from https://huggingface.co/papers/2010.02502
|
258
258
|
if self.config.prediction_type == "epsilon":
|
259
259
|
pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5)
|
260
260
|
pred_epsilon = model_output
|
@@ -281,10 +281,10 @@ class FlaxDDIMScheduler(FlaxSchedulerMixin, ConfigMixin):
|
|
281
281
|
variance = self._get_variance(state, timestep, prev_timestep)
|
282
282
|
std_dev_t = eta * variance ** (0.5)
|
283
283
|
|
284
|
-
# 5. compute "direction pointing to x_t" of formula (12) from https://
|
284
|
+
# 5. compute "direction pointing to x_t" of formula (12) from https://huggingface.co/papers/2010.02502
|
285
285
|
pred_sample_direction = (1 - alpha_prod_t_prev - std_dev_t**2) ** (0.5) * pred_epsilon
|
286
286
|
|
287
|
-
# 6. compute x_t without "random noise" of formula (12) from https://
|
287
|
+
# 6. compute x_t without "random noise" of formula (12) from https://huggingface.co/papers/2010.02502
|
288
288
|
prev_sample = alpha_prod_t_prev ** (0.5) * pred_original_sample + pred_sample_direction
|
289
289
|
|
290
290
|
if not return_dict:
|
@@ -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.
|
@@ -93,7 +93,7 @@ def betas_for_alpha_bar(
|
|
93
93
|
# Copied from diffusers.schedulers.scheduling_ddim.rescale_zero_terminal_snr
|
94
94
|
def rescale_zero_terminal_snr(betas):
|
95
95
|
"""
|
96
|
-
Rescales betas to have zero terminal SNR Based on https://
|
96
|
+
Rescales betas to have zero terminal SNR Based on https://huggingface.co/papers/2305.08891 (Algorithm 1)
|
97
97
|
|
98
98
|
|
99
99
|
Args:
|
@@ -266,7 +266,7 @@ class DDIMInverseScheduler(SchedulerMixin, ConfigMixin):
|
|
266
266
|
|
267
267
|
self.num_inference_steps = num_inference_steps
|
268
268
|
|
269
|
-
# "leading" and "trailing" corresponds to annotation of Table 2. of https://
|
269
|
+
# "leading" and "trailing" corresponds to annotation of Table 2. of https://huggingface.co/papers/2305.08891
|
270
270
|
if self.config.timestep_spacing == "leading":
|
271
271
|
step_ratio = self.config.num_train_timesteps // self.num_inference_steps
|
272
272
|
# creates integer timesteps by multiplying by ratio
|
@@ -338,7 +338,7 @@ class DDIMInverseScheduler(SchedulerMixin, ConfigMixin):
|
|
338
338
|
beta_prod_t = 1 - alpha_prod_t
|
339
339
|
|
340
340
|
# 3. compute predicted original sample from predicted noise also called
|
341
|
-
# "predicted x_0" of formula (12) from https://
|
341
|
+
# "predicted x_0" of formula (12) from https://huggingface.co/papers/2010.02502
|
342
342
|
if self.config.prediction_type == "epsilon":
|
343
343
|
pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5)
|
344
344
|
pred_epsilon = model_output
|
@@ -360,10 +360,10 @@ class DDIMInverseScheduler(SchedulerMixin, ConfigMixin):
|
|
360
360
|
-self.config.clip_sample_range, self.config.clip_sample_range
|
361
361
|
)
|
362
362
|
|
363
|
-
# 5. compute "direction pointing to x_t" of formula (12) from https://
|
363
|
+
# 5. compute "direction pointing to x_t" of formula (12) from https://huggingface.co/papers/2010.02502
|
364
364
|
pred_sample_direction = (1 - alpha_prod_t_prev) ** (0.5) * pred_epsilon
|
365
365
|
|
366
|
-
# 6. compute x_t without "random noise" of formula (12) from https://
|
366
|
+
# 6. compute x_t without "random noise" of formula (12) from https://huggingface.co/papers/2010.02502
|
367
367
|
prev_sample = alpha_prod_t_prev ** (0.5) * pred_original_sample + pred_sample_direction
|
368
368
|
|
369
369
|
if not return_dict:
|