diffusers 0.29.2__py3-none-any.whl → 0.30.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. diffusers/__init__.py +94 -3
  2. diffusers/commands/env.py +1 -5
  3. diffusers/configuration_utils.py +4 -9
  4. diffusers/dependency_versions_table.py +2 -2
  5. diffusers/image_processor.py +1 -2
  6. diffusers/loaders/__init__.py +17 -2
  7. diffusers/loaders/ip_adapter.py +10 -7
  8. diffusers/loaders/lora_base.py +752 -0
  9. diffusers/loaders/lora_pipeline.py +2252 -0
  10. diffusers/loaders/peft.py +213 -5
  11. diffusers/loaders/single_file.py +3 -14
  12. diffusers/loaders/single_file_model.py +31 -10
  13. diffusers/loaders/single_file_utils.py +293 -8
  14. diffusers/loaders/textual_inversion.py +1 -6
  15. diffusers/loaders/unet.py +23 -208
  16. diffusers/models/__init__.py +20 -0
  17. diffusers/models/activations.py +22 -0
  18. diffusers/models/attention.py +386 -7
  19. diffusers/models/attention_processor.py +1937 -629
  20. diffusers/models/autoencoders/__init__.py +2 -0
  21. diffusers/models/autoencoders/autoencoder_kl.py +14 -3
  22. diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +1271 -0
  23. diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +1 -1
  24. diffusers/models/autoencoders/autoencoder_oobleck.py +464 -0
  25. diffusers/models/autoencoders/autoencoder_tiny.py +1 -0
  26. diffusers/models/autoencoders/consistency_decoder_vae.py +1 -1
  27. diffusers/models/autoencoders/vq_model.py +4 -4
  28. diffusers/models/controlnet.py +2 -3
  29. diffusers/models/controlnet_hunyuan.py +401 -0
  30. diffusers/models/controlnet_sd3.py +11 -11
  31. diffusers/models/controlnet_sparsectrl.py +789 -0
  32. diffusers/models/controlnet_xs.py +40 -10
  33. diffusers/models/downsampling.py +68 -0
  34. diffusers/models/embeddings.py +403 -36
  35. diffusers/models/model_loading_utils.py +1 -3
  36. diffusers/models/modeling_flax_utils.py +1 -6
  37. diffusers/models/modeling_utils.py +4 -16
  38. diffusers/models/normalization.py +203 -12
  39. diffusers/models/transformers/__init__.py +6 -0
  40. diffusers/models/transformers/auraflow_transformer_2d.py +543 -0
  41. diffusers/models/transformers/cogvideox_transformer_3d.py +485 -0
  42. diffusers/models/transformers/hunyuan_transformer_2d.py +19 -15
  43. diffusers/models/transformers/latte_transformer_3d.py +327 -0
  44. diffusers/models/transformers/lumina_nextdit2d.py +340 -0
  45. diffusers/models/transformers/pixart_transformer_2d.py +102 -1
  46. diffusers/models/transformers/prior_transformer.py +1 -1
  47. diffusers/models/transformers/stable_audio_transformer.py +458 -0
  48. diffusers/models/transformers/transformer_flux.py +455 -0
  49. diffusers/models/transformers/transformer_sd3.py +18 -4
  50. diffusers/models/unets/unet_1d_blocks.py +1 -1
  51. diffusers/models/unets/unet_2d_condition.py +8 -1
  52. diffusers/models/unets/unet_3d_blocks.py +51 -920
  53. diffusers/models/unets/unet_3d_condition.py +4 -1
  54. diffusers/models/unets/unet_i2vgen_xl.py +4 -1
  55. diffusers/models/unets/unet_kandinsky3.py +1 -1
  56. diffusers/models/unets/unet_motion_model.py +1330 -84
  57. diffusers/models/unets/unet_spatio_temporal_condition.py +1 -1
  58. diffusers/models/unets/unet_stable_cascade.py +1 -3
  59. diffusers/models/unets/uvit_2d.py +1 -1
  60. diffusers/models/upsampling.py +64 -0
  61. diffusers/models/vq_model.py +8 -4
  62. diffusers/optimization.py +1 -1
  63. diffusers/pipelines/__init__.py +100 -3
  64. diffusers/pipelines/animatediff/__init__.py +4 -0
  65. diffusers/pipelines/animatediff/pipeline_animatediff.py +50 -40
  66. diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +1076 -0
  67. diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +17 -27
  68. diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +1008 -0
  69. diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +51 -38
  70. diffusers/pipelines/audioldm2/modeling_audioldm2.py +1 -1
  71. diffusers/pipelines/audioldm2/pipeline_audioldm2.py +1 -0
  72. diffusers/pipelines/aura_flow/__init__.py +48 -0
  73. diffusers/pipelines/aura_flow/pipeline_aura_flow.py +591 -0
  74. diffusers/pipelines/auto_pipeline.py +97 -19
  75. diffusers/pipelines/cogvideo/__init__.py +48 -0
  76. diffusers/pipelines/cogvideo/pipeline_cogvideox.py +746 -0
  77. diffusers/pipelines/consistency_models/pipeline_consistency_models.py +1 -1
  78. diffusers/pipelines/controlnet/pipeline_controlnet.py +24 -30
  79. diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +31 -30
  80. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +24 -153
  81. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +19 -28
  82. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +18 -28
  83. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +29 -32
  84. diffusers/pipelines/controlnet/pipeline_flax_controlnet.py +2 -2
  85. diffusers/pipelines/controlnet_hunyuandit/__init__.py +48 -0
  86. diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +1042 -0
  87. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +35 -0
  88. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs.py +10 -6
  89. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs_sd_xl.py +0 -4
  90. diffusers/pipelines/deepfloyd_if/pipeline_if.py +2 -2
  91. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img.py +2 -2
  92. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py +2 -2
  93. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting.py +2 -2
  94. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py +2 -2
  95. diffusers/pipelines/deepfloyd_if/pipeline_if_superresolution.py +2 -2
  96. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +11 -6
  97. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +11 -6
  98. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py +6 -6
  99. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py +6 -6
  100. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py +10 -10
  101. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py +10 -6
  102. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py +3 -3
  103. diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +1 -1
  104. diffusers/pipelines/flux/__init__.py +47 -0
  105. diffusers/pipelines/flux/pipeline_flux.py +749 -0
  106. diffusers/pipelines/flux/pipeline_output.py +21 -0
  107. diffusers/pipelines/free_init_utils.py +2 -0
  108. diffusers/pipelines/free_noise_utils.py +236 -0
  109. diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py +2 -2
  110. diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py +2 -2
  111. diffusers/pipelines/kolors/__init__.py +54 -0
  112. diffusers/pipelines/kolors/pipeline_kolors.py +1070 -0
  113. diffusers/pipelines/kolors/pipeline_kolors_img2img.py +1247 -0
  114. diffusers/pipelines/kolors/pipeline_output.py +21 -0
  115. diffusers/pipelines/kolors/text_encoder.py +889 -0
  116. diffusers/pipelines/kolors/tokenizer.py +334 -0
  117. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +30 -29
  118. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +23 -29
  119. diffusers/pipelines/latte/__init__.py +48 -0
  120. diffusers/pipelines/latte/pipeline_latte.py +881 -0
  121. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +4 -4
  122. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +0 -4
  123. diffusers/pipelines/lumina/__init__.py +48 -0
  124. diffusers/pipelines/lumina/pipeline_lumina.py +897 -0
  125. diffusers/pipelines/pag/__init__.py +67 -0
  126. diffusers/pipelines/pag/pag_utils.py +237 -0
  127. diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +1329 -0
  128. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +1612 -0
  129. diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +953 -0
  130. diffusers/pipelines/pag/pipeline_pag_kolors.py +1136 -0
  131. diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +872 -0
  132. diffusers/pipelines/pag/pipeline_pag_sd.py +1050 -0
  133. diffusers/pipelines/pag/pipeline_pag_sd_3.py +985 -0
  134. diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +862 -0
  135. diffusers/pipelines/pag/pipeline_pag_sd_xl.py +1333 -0
  136. diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +1529 -0
  137. diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +1753 -0
  138. diffusers/pipelines/pia/pipeline_pia.py +30 -37
  139. diffusers/pipelines/pipeline_flax_utils.py +4 -9
  140. diffusers/pipelines/pipeline_loading_utils.py +0 -3
  141. diffusers/pipelines/pipeline_utils.py +2 -14
  142. diffusers/pipelines/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py +0 -1
  143. diffusers/pipelines/stable_audio/__init__.py +50 -0
  144. diffusers/pipelines/stable_audio/modeling_stable_audio.py +158 -0
  145. diffusers/pipelines/stable_audio/pipeline_stable_audio.py +745 -0
  146. diffusers/pipelines/stable_diffusion/convert_from_ckpt.py +2 -0
  147. diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion.py +1 -1
  148. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +23 -29
  149. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py +15 -8
  150. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +30 -29
  151. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +23 -152
  152. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py +8 -4
  153. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py +11 -11
  154. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip.py +8 -6
  155. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip_img2img.py +6 -6
  156. diffusers/pipelines/stable_diffusion_3/__init__.py +2 -0
  157. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +34 -3
  158. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +33 -7
  159. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +1201 -0
  160. diffusers/pipelines/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py +3 -3
  161. diffusers/pipelines/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py +6 -6
  162. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py +5 -5
  163. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +5 -5
  164. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +6 -6
  165. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_xl_k_diffusion.py +0 -4
  166. diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +23 -29
  167. diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +27 -29
  168. diffusers/pipelines/stable_diffusion_sag/pipeline_stable_diffusion_sag.py +3 -3
  169. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +17 -27
  170. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +26 -29
  171. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +17 -145
  172. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_instruct_pix2pix.py +0 -4
  173. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +6 -6
  174. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +18 -28
  175. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth.py +8 -6
  176. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth_img2img.py +8 -6
  177. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero.py +6 -4
  178. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +0 -4
  179. diffusers/pipelines/unidiffuser/pipeline_unidiffuser.py +3 -3
  180. diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
  181. diffusers/pipelines/wuerstchen/pipeline_wuerstchen_prior.py +5 -4
  182. diffusers/schedulers/__init__.py +8 -0
  183. diffusers/schedulers/scheduling_cosine_dpmsolver_multistep.py +572 -0
  184. diffusers/schedulers/scheduling_ddim.py +1 -1
  185. diffusers/schedulers/scheduling_ddim_cogvideox.py +449 -0
  186. diffusers/schedulers/scheduling_ddpm.py +1 -1
  187. diffusers/schedulers/scheduling_ddpm_parallel.py +1 -1
  188. diffusers/schedulers/scheduling_deis_multistep.py +2 -2
  189. diffusers/schedulers/scheduling_dpm_cogvideox.py +489 -0
  190. diffusers/schedulers/scheduling_dpmsolver_multistep.py +1 -1
  191. diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +1 -1
  192. diffusers/schedulers/scheduling_dpmsolver_singlestep.py +64 -19
  193. diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py +2 -2
  194. diffusers/schedulers/scheduling_flow_match_euler_discrete.py +63 -39
  195. diffusers/schedulers/scheduling_flow_match_heun_discrete.py +321 -0
  196. diffusers/schedulers/scheduling_ipndm.py +1 -1
  197. diffusers/schedulers/scheduling_unipc_multistep.py +1 -1
  198. diffusers/schedulers/scheduling_utils.py +1 -3
  199. diffusers/schedulers/scheduling_utils_flax.py +1 -3
  200. diffusers/training_utils.py +99 -14
  201. diffusers/utils/__init__.py +2 -2
  202. diffusers/utils/dummy_pt_objects.py +210 -0
  203. diffusers/utils/dummy_torch_and_torchsde_objects.py +15 -0
  204. diffusers/utils/dummy_torch_and_transformers_and_sentencepiece_objects.py +47 -0
  205. diffusers/utils/dummy_torch_and_transformers_objects.py +315 -0
  206. diffusers/utils/dynamic_modules_utils.py +1 -11
  207. diffusers/utils/export_utils.py +50 -6
  208. diffusers/utils/hub_utils.py +45 -42
  209. diffusers/utils/import_utils.py +37 -15
  210. diffusers/utils/loading_utils.py +80 -3
  211. diffusers/utils/testing_utils.py +11 -8
  212. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/METADATA +73 -83
  213. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/RECORD +217 -164
  214. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/WHEEL +1 -1
  215. diffusers/loaders/autoencoder.py +0 -146
  216. diffusers/loaders/controlnet.py +0 -136
  217. diffusers/loaders/lora.py +0 -1728
  218. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/LICENSE +0 -0
  219. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/entry_points.txt +0 -0
  220. {diffusers-0.29.2.dist-info → diffusers-0.30.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,334 @@
1
+ # Copyright 2024 ChatGLM3-6B Model Team, Kwai-Kolors Team and 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 json
16
+ import os
17
+ import re
18
+ from typing import Dict, List, Optional, Union
19
+
20
+ from sentencepiece import SentencePieceProcessor
21
+ from transformers import PreTrainedTokenizer
22
+ from transformers.tokenization_utils_base import BatchEncoding, EncodedInput
23
+ from transformers.utils import PaddingStrategy
24
+
25
+
26
+ class SPTokenizer:
27
+ def __init__(self, model_path: str):
28
+ # reload tokenizer
29
+ assert os.path.isfile(model_path), model_path
30
+ self.sp_model = SentencePieceProcessor(model_file=model_path)
31
+
32
+ # BOS / EOS token IDs
33
+ self.n_words: int = self.sp_model.vocab_size()
34
+ self.bos_id: int = self.sp_model.bos_id()
35
+ self.eos_id: int = self.sp_model.eos_id()
36
+ self.pad_id: int = self.sp_model.unk_id()
37
+ assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()
38
+
39
+ role_special_tokens = ["<|system|>", "<|user|>", "<|assistant|>", "<|observation|>"]
40
+ special_tokens = ["[MASK]", "[gMASK]", "[sMASK]", "sop", "eop"] + role_special_tokens
41
+ self.special_tokens = {}
42
+ self.index_special_tokens = {}
43
+ for token in special_tokens:
44
+ self.special_tokens[token] = self.n_words
45
+ self.index_special_tokens[self.n_words] = token
46
+ self.n_words += 1
47
+ self.role_special_token_expression = "|".join([re.escape(token) for token in role_special_tokens])
48
+
49
+ def tokenize(self, s: str, encode_special_tokens=False):
50
+ if encode_special_tokens:
51
+ last_index = 0
52
+ t = []
53
+ for match in re.finditer(self.role_special_token_expression, s):
54
+ if last_index < match.start():
55
+ t.extend(self.sp_model.EncodeAsPieces(s[last_index : match.start()]))
56
+ t.append(s[match.start() : match.end()])
57
+ last_index = match.end()
58
+ if last_index < len(s):
59
+ t.extend(self.sp_model.EncodeAsPieces(s[last_index:]))
60
+ return t
61
+ else:
62
+ return self.sp_model.EncodeAsPieces(s)
63
+
64
+ def encode(self, s: str, bos: bool = False, eos: bool = False) -> List[int]:
65
+ assert isinstance(s, str)
66
+ t = self.sp_model.encode(s)
67
+ if bos:
68
+ t = [self.bos_id] + t
69
+ if eos:
70
+ t = t + [self.eos_id]
71
+ return t
72
+
73
+ def decode(self, t: List[int]) -> str:
74
+ text, buffer = "", []
75
+ for token in t:
76
+ if token in self.index_special_tokens:
77
+ if buffer:
78
+ text += self.sp_model.decode(buffer)
79
+ buffer = []
80
+ text += self.index_special_tokens[token]
81
+ else:
82
+ buffer.append(token)
83
+ if buffer:
84
+ text += self.sp_model.decode(buffer)
85
+ return text
86
+
87
+ def decode_tokens(self, tokens: List[str]) -> str:
88
+ text = self.sp_model.DecodePieces(tokens)
89
+ return text
90
+
91
+ def convert_token_to_id(self, token):
92
+ """Converts a token (str) in an id using the vocab."""
93
+ if token in self.special_tokens:
94
+ return self.special_tokens[token]
95
+ return self.sp_model.PieceToId(token)
96
+
97
+ def convert_id_to_token(self, index):
98
+ """Converts an index (integer) in a token (str) using the vocab."""
99
+ if index in self.index_special_tokens:
100
+ return self.index_special_tokens[index]
101
+ if index in [self.eos_id, self.bos_id, self.pad_id] or index < 0:
102
+ return ""
103
+ return self.sp_model.IdToPiece(index)
104
+
105
+
106
+ class ChatGLMTokenizer(PreTrainedTokenizer):
107
+ vocab_files_names = {"vocab_file": "tokenizer.model"}
108
+
109
+ model_input_names = ["input_ids", "attention_mask", "position_ids"]
110
+
111
+ def __init__(
112
+ self,
113
+ vocab_file,
114
+ padding_side="left",
115
+ clean_up_tokenization_spaces=False,
116
+ encode_special_tokens=False,
117
+ **kwargs,
118
+ ):
119
+ self.name = "GLMTokenizer"
120
+
121
+ self.vocab_file = vocab_file
122
+ self.tokenizer = SPTokenizer(vocab_file)
123
+ self.special_tokens = {
124
+ "<bos>": self.tokenizer.bos_id,
125
+ "<eos>": self.tokenizer.eos_id,
126
+ "<pad>": self.tokenizer.pad_id,
127
+ }
128
+ self.encode_special_tokens = encode_special_tokens
129
+ super().__init__(
130
+ padding_side=padding_side,
131
+ clean_up_tokenization_spaces=clean_up_tokenization_spaces,
132
+ encode_special_tokens=encode_special_tokens,
133
+ **kwargs,
134
+ )
135
+
136
+ def get_command(self, token):
137
+ if token in self.special_tokens:
138
+ return self.special_tokens[token]
139
+ assert token in self.tokenizer.special_tokens, f"{token} is not a special token for {self.name}"
140
+ return self.tokenizer.special_tokens[token]
141
+
142
+ @property
143
+ def unk_token(self) -> str:
144
+ return "<unk>"
145
+
146
+ @unk_token.setter
147
+ def unk_token(self, value: str):
148
+ self._unk_token = value
149
+
150
+ @property
151
+ def pad_token(self) -> str:
152
+ return "<unk>"
153
+
154
+ @pad_token.setter
155
+ def pad_token(self, value: str):
156
+ self._pad_token = value
157
+
158
+ @property
159
+ def pad_token_id(self):
160
+ return self.get_command("<pad>")
161
+
162
+ @property
163
+ def eos_token(self) -> str:
164
+ return "</s>"
165
+
166
+ @eos_token.setter
167
+ def eos_token(self, value: str):
168
+ self._eos_token = value
169
+
170
+ @property
171
+ def eos_token_id(self):
172
+ return self.get_command("<eos>")
173
+
174
+ @property
175
+ def vocab_size(self):
176
+ return self.tokenizer.n_words
177
+
178
+ def get_vocab(self):
179
+ """Returns vocab as a dict"""
180
+ vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
181
+ vocab.update(self.added_tokens_encoder)
182
+ return vocab
183
+
184
+ def _tokenize(self, text, **kwargs):
185
+ return self.tokenizer.tokenize(text, encode_special_tokens=self.encode_special_tokens)
186
+
187
+ def _convert_token_to_id(self, token):
188
+ """Converts a token (str) in an id using the vocab."""
189
+ return self.tokenizer.convert_token_to_id(token)
190
+
191
+ def _convert_id_to_token(self, index):
192
+ """Converts an index (integer) in a token (str) using the vocab."""
193
+ return self.tokenizer.convert_id_to_token(index)
194
+
195
+ def convert_tokens_to_string(self, tokens: List[str]) -> str:
196
+ return self.tokenizer.decode_tokens(tokens)
197
+
198
+ def save_vocabulary(self, save_directory, filename_prefix=None):
199
+ """
200
+ Save the vocabulary and special tokens file to a directory.
201
+
202
+ Args:
203
+ save_directory (`str`):
204
+ The directory in which to save the vocabulary.
205
+ filename_prefix (`str`, *optional*):
206
+ An optional prefix to add to the named of the saved files.
207
+
208
+ Returns:
209
+ `Tuple(str)`: Paths to the files saved.
210
+ """
211
+ if os.path.isdir(save_directory):
212
+ vocab_file = os.path.join(save_directory, self.vocab_files_names["vocab_file"])
213
+ else:
214
+ vocab_file = save_directory
215
+
216
+ with open(self.vocab_file, "rb") as fin:
217
+ proto_str = fin.read()
218
+
219
+ with open(vocab_file, "wb") as writer:
220
+ writer.write(proto_str)
221
+
222
+ return (vocab_file,)
223
+
224
+ def get_prefix_tokens(self):
225
+ prefix_tokens = [self.get_command("[gMASK]"), self.get_command("sop")]
226
+ return prefix_tokens
227
+
228
+ def build_single_message(self, role, metadata, message):
229
+ assert role in ["system", "user", "assistant", "observation"], role
230
+ role_tokens = [self.get_command(f"<|{role}|>")] + self.tokenizer.encode(f"{metadata}\n")
231
+ message_tokens = self.tokenizer.encode(message)
232
+ tokens = role_tokens + message_tokens
233
+ return tokens
234
+
235
+ def build_chat_input(self, query, history=None, role="user"):
236
+ if history is None:
237
+ history = []
238
+ input_ids = []
239
+ for item in history:
240
+ content = item["content"]
241
+ if item["role"] == "system" and "tools" in item:
242
+ content = content + "\n" + json.dumps(item["tools"], indent=4, ensure_ascii=False)
243
+ input_ids.extend(self.build_single_message(item["role"], item.get("metadata", ""), content))
244
+ input_ids.extend(self.build_single_message(role, "", query))
245
+ input_ids.extend([self.get_command("<|assistant|>")])
246
+ return self.batch_encode_plus([input_ids], return_tensors="pt", is_split_into_words=True)
247
+
248
+ def build_inputs_with_special_tokens(
249
+ self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
250
+ ) -> List[int]:
251
+ """
252
+ Build model inputs from a sequence or a pair of sequence for sequence classification tasks by concatenating and
253
+ adding special tokens. A BERT sequence has the following format:
254
+
255
+ - single sequence: `[CLS] X [SEP]`
256
+ - pair of sequences: `[CLS] A [SEP] B [SEP]`
257
+
258
+ Args:
259
+ token_ids_0 (`List[int]`):
260
+ List of IDs to which the special tokens will be added.
261
+ token_ids_1 (`List[int]`, *optional*):
262
+ Optional second list of IDs for sequence pairs.
263
+
264
+ Returns:
265
+ `List[int]`: List of [input IDs](../glossary#input-ids) with the appropriate special tokens.
266
+ """
267
+ prefix_tokens = self.get_prefix_tokens()
268
+ token_ids_0 = prefix_tokens + token_ids_0
269
+ if token_ids_1 is not None:
270
+ token_ids_0 = token_ids_0 + token_ids_1 + [self.get_command("<eos>")]
271
+ return token_ids_0
272
+
273
+ def _pad(
274
+ self,
275
+ encoded_inputs: Union[Dict[str, EncodedInput], BatchEncoding],
276
+ max_length: Optional[int] = None,
277
+ padding_strategy: PaddingStrategy = PaddingStrategy.DO_NOT_PAD,
278
+ pad_to_multiple_of: Optional[int] = None,
279
+ return_attention_mask: Optional[bool] = None,
280
+ ) -> dict:
281
+ """
282
+ Pad encoded inputs (on left/right and up to predefined length or max length in the batch)
283
+
284
+ Args:
285
+ encoded_inputs:
286
+ Dictionary of tokenized inputs (`List[int]`) or batch of tokenized inputs (`List[List[int]]`).
287
+ max_length: maximum length of the returned list and optionally padding length (see below).
288
+ Will truncate by taking into account the special tokens.
289
+ padding_strategy: PaddingStrategy to use for padding.
290
+
291
+ - PaddingStrategy.LONGEST Pad to the longest sequence in the batch
292
+ - PaddingStrategy.MAX_LENGTH: Pad to the max length (default)
293
+ - PaddingStrategy.DO_NOT_PAD: Do not pad
294
+ The tokenizer padding sides are defined in self.padding_side:
295
+
296
+ - 'left': pads on the left of the sequences
297
+ - 'right': pads on the right of the sequences
298
+ pad_to_multiple_of: (optional) Integer if set will pad the sequence to a multiple of the provided value.
299
+ This is especially useful to enable the use of Tensor Core on NVIDIA hardware with compute capability
300
+ `>= 7.5` (Volta).
301
+ return_attention_mask:
302
+ (optional) Set to False to avoid returning attention mask (default: set to model specifics)
303
+ """
304
+ # Load from model defaults
305
+ assert self.padding_side == "left"
306
+
307
+ required_input = encoded_inputs[self.model_input_names[0]]
308
+ seq_length = len(required_input)
309
+
310
+ if padding_strategy == PaddingStrategy.LONGEST:
311
+ max_length = len(required_input)
312
+
313
+ if max_length is not None and pad_to_multiple_of is not None and (max_length % pad_to_multiple_of != 0):
314
+ max_length = ((max_length // pad_to_multiple_of) + 1) * pad_to_multiple_of
315
+
316
+ needs_to_be_padded = padding_strategy != PaddingStrategy.DO_NOT_PAD and len(required_input) != max_length
317
+
318
+ # Initialize attention mask if not present.
319
+ if "attention_mask" not in encoded_inputs:
320
+ encoded_inputs["attention_mask"] = [1] * seq_length
321
+
322
+ if "position_ids" not in encoded_inputs:
323
+ encoded_inputs["position_ids"] = list(range(seq_length))
324
+
325
+ if needs_to_be_padded:
326
+ difference = max_length - len(required_input)
327
+
328
+ if "attention_mask" in encoded_inputs:
329
+ encoded_inputs["attention_mask"] = [0] * difference + encoded_inputs["attention_mask"]
330
+ if "position_ids" in encoded_inputs:
331
+ encoded_inputs["position_ids"] = [0] * difference + encoded_inputs["position_ids"]
332
+ encoded_inputs[self.model_input_names[0]] = [self.pad_token_id] * difference + required_input
333
+
334
+ return encoded_inputs
@@ -23,7 +23,7 @@ import torch
23
23
  from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer, CLIPVisionModelWithProjection
24
24
 
25
25
  from ...image_processor import PipelineImageInput, VaeImageProcessor
26
- from ...loaders import FromSingleFileMixin, IPAdapterMixin, LoraLoaderMixin, TextualInversionLoaderMixin
26
+ from ...loaders import FromSingleFileMixin, IPAdapterMixin, StableDiffusionLoraLoaderMixin, TextualInversionLoaderMixin
27
27
  from ...models import AutoencoderKL, ImageProjection, UNet2DConditionModel
28
28
  from ...models.lora import adjust_lora_scale_text_encoder
29
29
  from ...schedulers import LCMScheduler
@@ -148,7 +148,7 @@ class LatentConsistencyModelImg2ImgPipeline(
148
148
  StableDiffusionMixin,
149
149
  TextualInversionLoaderMixin,
150
150
  IPAdapterMixin,
151
- LoraLoaderMixin,
151
+ StableDiffusionLoraLoaderMixin,
152
152
  FromSingleFileMixin,
153
153
  ):
154
154
  r"""
@@ -159,8 +159,8 @@ class LatentConsistencyModelImg2ImgPipeline(
159
159
 
160
160
  The pipeline also inherits the following loading methods:
161
161
  - [`~loaders.TextualInversionLoaderMixin.load_textual_inversion`] for loading textual inversion embeddings
162
- - [`~loaders.LoraLoaderMixin.load_lora_weights`] for loading LoRA weights
163
- - [`~loaders.LoraLoaderMixin.save_lora_weights`] for saving LoRA weights
162
+ - [`~loaders.StableDiffusionLoraLoaderMixin.load_lora_weights`] for loading LoRA weights
163
+ - [`~loaders.StableDiffusionLoraLoaderMixin.save_lora_weights`] for saving LoRA weights
164
164
  - [`~loaders.FromSingleFileMixin.from_single_file`] for loading `.ckpt` files
165
165
  - [`~loaders.IPAdapterMixin.load_ip_adapter`] for loading IP Adapters
166
166
 
@@ -273,7 +273,7 @@ class LatentConsistencyModelImg2ImgPipeline(
273
273
  """
274
274
  # set lora scale so that monkey patched LoRA
275
275
  # function of text encoder can correctly access it
276
- if lora_scale is not None and isinstance(self, LoraLoaderMixin):
276
+ if lora_scale is not None and isinstance(self, StableDiffusionLoraLoaderMixin):
277
277
  self._lora_scale = lora_scale
278
278
 
279
279
  # dynamically adjust the LoRA scale
@@ -406,7 +406,7 @@ class LatentConsistencyModelImg2ImgPipeline(
406
406
  negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1)
407
407
 
408
408
  if self.text_encoder is not None:
409
- if isinstance(self, LoraLoaderMixin) and USE_PEFT_BACKEND:
409
+ if isinstance(self, StableDiffusionLoraLoaderMixin) and USE_PEFT_BACKEND:
410
410
  # Retrieve the original scale by scaling back the LoRA layers
411
411
  unscale_lora_layers(self.text_encoder, lora_scale)
412
412
 
@@ -441,6 +441,9 @@ class LatentConsistencyModelImg2ImgPipeline(
441
441
  def prepare_ip_adapter_image_embeds(
442
442
  self, ip_adapter_image, ip_adapter_image_embeds, device, num_images_per_prompt, do_classifier_free_guidance
443
443
  ):
444
+ image_embeds = []
445
+ if do_classifier_free_guidance:
446
+ negative_image_embeds = []
444
447
  if ip_adapter_image_embeds is None:
445
448
  if not isinstance(ip_adapter_image, list):
446
449
  ip_adapter_image = [ip_adapter_image]
@@ -450,7 +453,6 @@ class LatentConsistencyModelImg2ImgPipeline(
450
453
  f"`ip_adapter_image` must have same length as the number of IP Adapters. Got {len(ip_adapter_image)} images and {len(self.unet.encoder_hid_proj.image_projection_layers)} IP Adapters."
451
454
  )
452
455
 
453
- image_embeds = []
454
456
  for single_ip_adapter_image, image_proj_layer in zip(
455
457
  ip_adapter_image, self.unet.encoder_hid_proj.image_projection_layers
456
458
  ):
@@ -458,36 +460,28 @@ class LatentConsistencyModelImg2ImgPipeline(
458
460
  single_image_embeds, single_negative_image_embeds = self.encode_image(
459
461
  single_ip_adapter_image, device, 1, output_hidden_state
460
462
  )
461
- single_image_embeds = torch.stack([single_image_embeds] * num_images_per_prompt, dim=0)
462
- single_negative_image_embeds = torch.stack(
463
- [single_negative_image_embeds] * num_images_per_prompt, dim=0
464
- )
465
463
 
464
+ image_embeds.append(single_image_embeds[None, :])
466
465
  if do_classifier_free_guidance:
467
- single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds])
468
- single_image_embeds = single_image_embeds.to(device)
469
-
470
- image_embeds.append(single_image_embeds)
466
+ negative_image_embeds.append(single_negative_image_embeds[None, :])
471
467
  else:
472
- repeat_dims = [1]
473
- image_embeds = []
474
468
  for single_image_embeds in ip_adapter_image_embeds:
475
469
  if do_classifier_free_guidance:
476
470
  single_negative_image_embeds, single_image_embeds = single_image_embeds.chunk(2)
477
- single_image_embeds = single_image_embeds.repeat(
478
- num_images_per_prompt, *(repeat_dims * len(single_image_embeds.shape[1:]))
479
- )
480
- single_negative_image_embeds = single_negative_image_embeds.repeat(
481
- num_images_per_prompt, *(repeat_dims * len(single_negative_image_embeds.shape[1:]))
482
- )
483
- single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds])
484
- else:
485
- single_image_embeds = single_image_embeds.repeat(
486
- num_images_per_prompt, *(repeat_dims * len(single_image_embeds.shape[1:]))
487
- )
471
+ negative_image_embeds.append(single_negative_image_embeds)
488
472
  image_embeds.append(single_image_embeds)
489
473
 
490
- return image_embeds
474
+ ip_adapter_image_embeds = []
475
+ for i, single_image_embeds in enumerate(image_embeds):
476
+ single_image_embeds = torch.cat([single_image_embeds] * num_images_per_prompt, dim=0)
477
+ if do_classifier_free_guidance:
478
+ single_negative_image_embeds = torch.cat([negative_image_embeds[i]] * num_images_per_prompt, dim=0)
479
+ single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds], dim=0)
480
+
481
+ single_image_embeds = single_image_embeds.to(device=device)
482
+ ip_adapter_image_embeds.append(single_image_embeds)
483
+
484
+ return ip_adapter_image_embeds
491
485
 
492
486
  # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker
493
487
  def run_safety_checker(self, image, device, dtype):
@@ -526,6 +520,13 @@ class LatentConsistencyModelImg2ImgPipeline(
526
520
  )
527
521
 
528
522
  elif isinstance(generator, list):
523
+ if image.shape[0] < batch_size and batch_size % image.shape[0] == 0:
524
+ image = torch.cat([image] * (batch_size // image.shape[0]), dim=0)
525
+ elif image.shape[0] < batch_size and batch_size % image.shape[0] != 0:
526
+ raise ValueError(
527
+ f"Cannot duplicate `image` of batch size {image.shape[0]} to effective batch_size {batch_size} "
528
+ )
529
+
529
530
  init_latents = [
530
531
  retrieve_latents(self.vae.encode(image[i : i + 1]), generator=generator[i])
531
532
  for i in range(batch_size)
@@ -22,7 +22,7 @@ import torch
22
22
  from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer, CLIPVisionModelWithProjection
23
23
 
24
24
  from ...image_processor import PipelineImageInput, VaeImageProcessor
25
- from ...loaders import FromSingleFileMixin, IPAdapterMixin, LoraLoaderMixin, TextualInversionLoaderMixin
25
+ from ...loaders import FromSingleFileMixin, IPAdapterMixin, StableDiffusionLoraLoaderMixin, TextualInversionLoaderMixin
26
26
  from ...models import AutoencoderKL, ImageProjection, UNet2DConditionModel
27
27
  from ...models.lora import adjust_lora_scale_text_encoder
28
28
  from ...schedulers import LCMScheduler
@@ -126,7 +126,7 @@ class LatentConsistencyModelPipeline(
126
126
  StableDiffusionMixin,
127
127
  TextualInversionLoaderMixin,
128
128
  IPAdapterMixin,
129
- LoraLoaderMixin,
129
+ StableDiffusionLoraLoaderMixin,
130
130
  FromSingleFileMixin,
131
131
  ):
132
132
  r"""
@@ -137,8 +137,8 @@ class LatentConsistencyModelPipeline(
137
137
 
138
138
  The pipeline also inherits the following loading methods:
139
139
  - [`~loaders.TextualInversionLoaderMixin.load_textual_inversion`] for loading textual inversion embeddings
140
- - [`~loaders.LoraLoaderMixin.load_lora_weights`] for loading LoRA weights
141
- - [`~loaders.LoraLoaderMixin.save_lora_weights`] for saving LoRA weights
140
+ - [`~loaders.StableDiffusionLoraLoaderMixin.load_lora_weights`] for loading LoRA weights
141
+ - [`~loaders.StableDiffusionLoraLoaderMixin.save_lora_weights`] for saving LoRA weights
142
142
  - [`~loaders.FromSingleFileMixin.from_single_file`] for loading `.ckpt` files
143
143
  - [`~loaders.IPAdapterMixin.load_ip_adapter`] for loading IP Adapters
144
144
 
@@ -257,7 +257,7 @@ class LatentConsistencyModelPipeline(
257
257
  """
258
258
  # set lora scale so that monkey patched LoRA
259
259
  # function of text encoder can correctly access it
260
- if lora_scale is not None and isinstance(self, LoraLoaderMixin):
260
+ if lora_scale is not None and isinstance(self, StableDiffusionLoraLoaderMixin):
261
261
  self._lora_scale = lora_scale
262
262
 
263
263
  # dynamically adjust the LoRA scale
@@ -390,7 +390,7 @@ class LatentConsistencyModelPipeline(
390
390
  negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1)
391
391
 
392
392
  if self.text_encoder is not None:
393
- if isinstance(self, LoraLoaderMixin) and USE_PEFT_BACKEND:
393
+ if isinstance(self, StableDiffusionLoraLoaderMixin) and USE_PEFT_BACKEND:
394
394
  # Retrieve the original scale by scaling back the LoRA layers
395
395
  unscale_lora_layers(self.text_encoder, lora_scale)
396
396
 
@@ -425,6 +425,9 @@ class LatentConsistencyModelPipeline(
425
425
  def prepare_ip_adapter_image_embeds(
426
426
  self, ip_adapter_image, ip_adapter_image_embeds, device, num_images_per_prompt, do_classifier_free_guidance
427
427
  ):
428
+ image_embeds = []
429
+ if do_classifier_free_guidance:
430
+ negative_image_embeds = []
428
431
  if ip_adapter_image_embeds is None:
429
432
  if not isinstance(ip_adapter_image, list):
430
433
  ip_adapter_image = [ip_adapter_image]
@@ -434,7 +437,6 @@ class LatentConsistencyModelPipeline(
434
437
  f"`ip_adapter_image` must have same length as the number of IP Adapters. Got {len(ip_adapter_image)} images and {len(self.unet.encoder_hid_proj.image_projection_layers)} IP Adapters."
435
438
  )
436
439
 
437
- image_embeds = []
438
440
  for single_ip_adapter_image, image_proj_layer in zip(
439
441
  ip_adapter_image, self.unet.encoder_hid_proj.image_projection_layers
440
442
  ):
@@ -442,36 +444,28 @@ class LatentConsistencyModelPipeline(
442
444
  single_image_embeds, single_negative_image_embeds = self.encode_image(
443
445
  single_ip_adapter_image, device, 1, output_hidden_state
444
446
  )
445
- single_image_embeds = torch.stack([single_image_embeds] * num_images_per_prompt, dim=0)
446
- single_negative_image_embeds = torch.stack(
447
- [single_negative_image_embeds] * num_images_per_prompt, dim=0
448
- )
449
447
 
448
+ image_embeds.append(single_image_embeds[None, :])
450
449
  if do_classifier_free_guidance:
451
- single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds])
452
- single_image_embeds = single_image_embeds.to(device)
453
-
454
- image_embeds.append(single_image_embeds)
450
+ negative_image_embeds.append(single_negative_image_embeds[None, :])
455
451
  else:
456
- repeat_dims = [1]
457
- image_embeds = []
458
452
  for single_image_embeds in ip_adapter_image_embeds:
459
453
  if do_classifier_free_guidance:
460
454
  single_negative_image_embeds, single_image_embeds = single_image_embeds.chunk(2)
461
- single_image_embeds = single_image_embeds.repeat(
462
- num_images_per_prompt, *(repeat_dims * len(single_image_embeds.shape[1:]))
463
- )
464
- single_negative_image_embeds = single_negative_image_embeds.repeat(
465
- num_images_per_prompt, *(repeat_dims * len(single_negative_image_embeds.shape[1:]))
466
- )
467
- single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds])
468
- else:
469
- single_image_embeds = single_image_embeds.repeat(
470
- num_images_per_prompt, *(repeat_dims * len(single_image_embeds.shape[1:]))
471
- )
455
+ negative_image_embeds.append(single_negative_image_embeds)
472
456
  image_embeds.append(single_image_embeds)
473
457
 
474
- return image_embeds
458
+ ip_adapter_image_embeds = []
459
+ for i, single_image_embeds in enumerate(image_embeds):
460
+ single_image_embeds = torch.cat([single_image_embeds] * num_images_per_prompt, dim=0)
461
+ if do_classifier_free_guidance:
462
+ single_negative_image_embeds = torch.cat([negative_image_embeds[i]] * num_images_per_prompt, dim=0)
463
+ single_image_embeds = torch.cat([single_negative_image_embeds, single_image_embeds], dim=0)
464
+
465
+ single_image_embeds = single_image_embeds.to(device=device)
466
+ ip_adapter_image_embeds.append(single_image_embeds)
467
+
468
+ return ip_adapter_image_embeds
475
469
 
476
470
  # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker
477
471
  def run_safety_checker(self, image, device, dtype):
@@ -0,0 +1,48 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from ...utils import (
4
+ DIFFUSERS_SLOW_IMPORT,
5
+ OptionalDependencyNotAvailable,
6
+ _LazyModule,
7
+ get_objects_from_module,
8
+ is_torch_available,
9
+ is_transformers_available,
10
+ )
11
+
12
+
13
+ _dummy_objects = {}
14
+ _import_structure = {}
15
+
16
+
17
+ try:
18
+ if not (is_transformers_available() and is_torch_available()):
19
+ raise OptionalDependencyNotAvailable()
20
+ except OptionalDependencyNotAvailable:
21
+ from ...utils import dummy_torch_and_transformers_objects # noqa F403
22
+
23
+ _dummy_objects.update(get_objects_from_module(dummy_torch_and_transformers_objects))
24
+ else:
25
+ _import_structure["pipeline_latte"] = ["LattePipeline"]
26
+
27
+ if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
28
+ try:
29
+ if not (is_transformers_available() and is_torch_available()):
30
+ raise OptionalDependencyNotAvailable()
31
+
32
+ except OptionalDependencyNotAvailable:
33
+ from ...utils.dummy_torch_and_transformers_objects import *
34
+ else:
35
+ from .pipeline_latte import LattePipeline
36
+
37
+ else:
38
+ import sys
39
+
40
+ sys.modules[__name__] = _LazyModule(
41
+ __name__,
42
+ globals()["__file__"],
43
+ _import_structure,
44
+ module_spec=__spec__,
45
+ )
46
+
47
+ for name, value in _dummy_objects.items():
48
+ setattr(sys.modules[__name__], name, value)