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