vilarin commited on
Commit
5f4a7e7
1 Parent(s): 1063422

Upload 94 files

Browse files
Files changed (22) hide show
  1. diffsynth/models/__init__.py +81 -1
  2. diffsynth/models/downloader.py +278 -0
  3. diffsynth/prompts/hunyuan_dit_prompter.py +9 -3
  4. diffsynth/prompts/sd_prompter.py +5 -1
  5. diffsynth/prompts/sdxl_prompter.py +9 -3
  6. diffsynth/prompts/utils.py +2 -2
  7. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/special_tokens_map.json +7 -0
  8. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/tokenizer_config.json +16 -0
  9. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/vocab.txt +0 -0
  10. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/vocab_org.txt +0 -0
  11. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/config.json +28 -0
  12. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/special_tokens_map.json +1 -0
  13. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/spiece.model +3 -0
  14. diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/tokenizer_config.json +1 -0
  15. diffsynth/tokenizer_configs/stable_diffusion/tokenizer/merges.txt +0 -0
  16. diffsynth/tokenizer_configs/stable_diffusion/tokenizer/special_tokens_map.json +24 -0
  17. diffsynth/tokenizer_configs/stable_diffusion/tokenizer/tokenizer_config.json +34 -0
  18. diffsynth/tokenizer_configs/stable_diffusion/tokenizer/vocab.json +0 -0
  19. diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/merges.txt +0 -0
  20. diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/special_tokens_map.json +24 -0
  21. diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/tokenizer_config.json +38 -0
  22. diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/vocab.json +0 -0
diffsynth/models/__init__.py CHANGED
@@ -1,5 +1,9 @@
1
  import torch, os
2
  from safetensors import safe_open
 
 
 
 
3
 
4
  from .sd_text_encoder import SDTextEncoder
5
  from .sd_unet import SDUNet
@@ -29,13 +33,89 @@ from .hunyuan_dit_text_encoder import HunyuanDiTCLIPTextEncoder, HunyuanDiTT5Tex
29
  from .hunyuan_dit import HunyuanDiT
30
 
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  class ModelManager:
33
- def __init__(self, torch_dtype=torch.float16, device="cuda"):
 
 
 
 
 
 
 
34
  self.torch_dtype = torch_dtype
35
  self.device = device
36
  self.model = {}
37
  self.model_path = {}
38
  self.textual_inversion_dict = {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  def is_stable_video_diffusion(self, state_dict):
41
  param_name = "model.diffusion_model.output_blocks.9.1.time_stack.0.norm_in.weight"
 
1
  import torch, os
2
  from safetensors import safe_open
3
+ from typing_extensions import Literal, TypeAlias
4
+ from typing import List
5
+
6
+ from .downloader import download_from_huggingface, download_from_modelscope
7
 
8
  from .sd_text_encoder import SDTextEncoder
9
  from .sd_unet import SDUNet
 
33
  from .hunyuan_dit import HunyuanDiT
34
 
35
 
36
+ preset_models_on_huggingface = {
37
+ "HunyuanDiT": [
38
+ ("Tencent-Hunyuan/HunyuanDiT", "t2i/clip_text_encoder/pytorch_model.bin", "models/HunyuanDiT/t2i/clip_text_encoder"),
39
+ ("Tencent-Hunyuan/HunyuanDiT", "t2i/mt5/pytorch_model.bin", "models/HunyuanDiT/t2i/mt5"),
40
+ ("Tencent-Hunyuan/HunyuanDiT", "t2i/model/pytorch_model_ema.pt", "models/HunyuanDiT/t2i/model"),
41
+ ("Tencent-Hunyuan/HunyuanDiT", "t2i/sdxl-vae-fp16-fix/diffusion_pytorch_model.bin", "models/HunyuanDiT/t2i/sdxl-vae-fp16-fix"),
42
+ ],
43
+ "stable-video-diffusion-img2vid-xt": [
44
+ ("stabilityai/stable-video-diffusion-img2vid-xt", "svd_xt.safetensors", "models/stable_video_diffusion"),
45
+ ],
46
+ "ExVideo-SVD-128f-v1": [
47
+ ("ECNU-CILab/ExVideo-SVD-128f-v1", "model.fp16.safetensors", "models/stable_video_diffusion"),
48
+ ],
49
+ }
50
+ preset_models_on_modelscope = {
51
+ "HunyuanDiT": [
52
+ ("modelscope/HunyuanDiT", "t2i/clip_text_encoder/pytorch_model.bin", "models/HunyuanDiT/t2i/clip_text_encoder"),
53
+ ("modelscope/HunyuanDiT", "t2i/mt5/pytorch_model.bin", "models/HunyuanDiT/t2i/mt5"),
54
+ ("modelscope/HunyuanDiT", "t2i/model/pytorch_model_ema.pt", "models/HunyuanDiT/t2i/model"),
55
+ ("modelscope/HunyuanDiT", "t2i/sdxl-vae-fp16-fix/diffusion_pytorch_model.bin", "models/HunyuanDiT/t2i/sdxl-vae-fp16-fix"),
56
+ ],
57
+ "stable-video-diffusion-img2vid-xt": [
58
+ ("AI-ModelScope/stable-video-diffusion-img2vid-xt", "svd_xt.safetensors", "models/stable_video_diffusion"),
59
+ ],
60
+ "ExVideo-SVD-128f-v1": [
61
+ ("ECNU-CILab/ExVideo-SVD-128f-v1", "model.fp16.safetensors", "models/stable_video_diffusion"),
62
+ ],
63
+ }
64
+ Preset_model_id: TypeAlias = Literal[
65
+ "HunyuanDiT",
66
+ "stable-video-diffusion-img2vid-xt",
67
+ "ExVideo-SVD-128f-v1"
68
+ ]
69
+ Preset_model_website: TypeAlias = Literal[
70
+ "HuggingFace",
71
+ "ModelScope",
72
+ ]
73
+ website_to_preset_models = {
74
+ "HuggingFace": preset_models_on_huggingface,
75
+ "ModelScope": preset_models_on_modelscope,
76
+ }
77
+ website_to_download_fn = {
78
+ "HuggingFace": download_from_huggingface,
79
+ "ModelScope": download_from_modelscope,
80
+ }
81
+
82
+
83
  class ModelManager:
84
+ def __init__(
85
+ self,
86
+ torch_dtype=torch.float16,
87
+ device="cuda",
88
+ model_id_list: List[Preset_model_id] = [],
89
+ downloading_priority: List[Preset_model_website] = ["ModelScope", "HuggingFace"],
90
+ file_path_list: List[str] = [],
91
+ ):
92
  self.torch_dtype = torch_dtype
93
  self.device = device
94
  self.model = {}
95
  self.model_path = {}
96
  self.textual_inversion_dict = {}
97
+ downloaded_files = self.download_models(model_id_list, downloading_priority)
98
+ self.load_models(downloaded_files + file_path_list)
99
+
100
+ def download_models(
101
+ self,
102
+ model_id_list: List[Preset_model_id] = [],
103
+ downloading_priority: List[Preset_model_website] = ["ModelScope", "HuggingFace"],
104
+ ):
105
+ downloaded_files = []
106
+ for model_id in model_id_list:
107
+ for website in downloading_priority:
108
+ if model_id in website_to_preset_models[website]:
109
+ for model_id, origin_file_path, local_dir in website_to_preset_models[website][model_id]:
110
+ # Check if the file is downloaded.
111
+ file_to_download = os.path.join(local_dir, os.path.basename(origin_file_path))
112
+ if file_to_download in downloaded_files:
113
+ continue
114
+ # Download
115
+ website_to_download_fn[website](model_id, origin_file_path, local_dir)
116
+ if os.path.basename(origin_file_path) in os.listdir(local_dir):
117
+ downloaded_files.append(file_to_download)
118
+ return downloaded_files
119
 
120
  def is_stable_video_diffusion(self, state_dict):
121
  param_name = "model.diffusion_model.output_blocks.9.1.time_stack.0.norm_in.weight"
diffsynth/models/downloader.py ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import hf_hub_download
2
+ from http.cookiejar import CookieJar
3
+ from pathlib import Path
4
+ from typing import Dict, Optional, List, Union
5
+ import copy, uuid, requests, io, platform, pickle, os, urllib
6
+ from requests.adapters import Retry
7
+ from tqdm import tqdm
8
+
9
+
10
+ def _get_sep(path):
11
+ if isinstance(path, bytes):
12
+ return b'/'
13
+ else:
14
+ return '/'
15
+
16
+
17
+ def expanduser(path):
18
+ """Expand ~ and ~user constructions. If user or $HOME is unknown,
19
+ do nothing."""
20
+ path = os.fspath(path)
21
+ if isinstance(path, bytes):
22
+ tilde = b'~'
23
+ else:
24
+ tilde = '~'
25
+ if not path.startswith(tilde):
26
+ return path
27
+ sep = _get_sep(path)
28
+ i = path.find(sep, 1)
29
+ if i < 0:
30
+ i = len(path)
31
+ if i == 1:
32
+ if 'HOME' not in os.environ:
33
+ import pwd
34
+ try:
35
+ userhome = pwd.getpwuid(os.getuid()).pw_dir
36
+ except KeyError:
37
+ # bpo-10496: if the current user identifier doesn't exist in the
38
+ # password database, return the path unchanged
39
+ return path
40
+ else:
41
+ userhome = os.environ['HOME']
42
+ else:
43
+ import pwd
44
+ name = path[1:i]
45
+ if isinstance(name, bytes):
46
+ name = str(name, 'ASCII')
47
+ try:
48
+ pwent = pwd.getpwnam(name)
49
+ except KeyError:
50
+ # bpo-10496: if the user name from the path doesn't exist in the
51
+ # password database, return the path unchanged
52
+ return path
53
+ userhome = pwent.pw_dir
54
+ if isinstance(path, bytes):
55
+ userhome = os.fsencode(userhome)
56
+ root = b'/'
57
+ else:
58
+ root = '/'
59
+ userhome = userhome.rstrip(root)
60
+ return (userhome + path[i:]) or root
61
+
62
+
63
+
64
+ class ModelScopeConfig:
65
+ DEFAULT_CREDENTIALS_PATH = Path.home().joinpath('.modelscope', 'credentials')
66
+ path_credential = expanduser(DEFAULT_CREDENTIALS_PATH)
67
+ COOKIES_FILE_NAME = 'cookies'
68
+ GIT_TOKEN_FILE_NAME = 'git_token'
69
+ USER_INFO_FILE_NAME = 'user'
70
+ USER_SESSION_ID_FILE_NAME = 'session'
71
+
72
+ @staticmethod
73
+ def make_sure_credential_path_exist():
74
+ os.makedirs(ModelScopeConfig.path_credential, exist_ok=True)
75
+
76
+ @staticmethod
77
+ def get_user_session_id():
78
+ session_path = os.path.join(ModelScopeConfig.path_credential,
79
+ ModelScopeConfig.USER_SESSION_ID_FILE_NAME)
80
+ session_id = ''
81
+ if os.path.exists(session_path):
82
+ with open(session_path, 'rb') as f:
83
+ session_id = str(f.readline().strip(), encoding='utf-8')
84
+ return session_id
85
+ if session_id == '' or len(session_id) != 32:
86
+ session_id = str(uuid.uuid4().hex)
87
+ ModelScopeConfig.make_sure_credential_path_exist()
88
+ with open(session_path, 'w+') as wf:
89
+ wf.write(session_id)
90
+
91
+ return session_id
92
+
93
+ @staticmethod
94
+ def get_user_agent(user_agent: Union[Dict, str, None] = None, ) -> str:
95
+ """Formats a user-agent string with basic info about a request.
96
+
97
+ Args:
98
+ user_agent (`str`, `dict`, *optional*):
99
+ The user agent info in the form of a dictionary or a single string.
100
+
101
+ Returns:
102
+ The formatted user-agent string.
103
+ """
104
+
105
+ # include some more telemetrics when executing in dedicated
106
+ # cloud containers
107
+ MODELSCOPE_CLOUD_ENVIRONMENT = 'MODELSCOPE_ENVIRONMENT'
108
+ MODELSCOPE_CLOUD_USERNAME = 'MODELSCOPE_USERNAME'
109
+ env = 'custom'
110
+ if MODELSCOPE_CLOUD_ENVIRONMENT in os.environ:
111
+ env = os.environ[MODELSCOPE_CLOUD_ENVIRONMENT]
112
+ user_name = 'unknown'
113
+ if MODELSCOPE_CLOUD_USERNAME in os.environ:
114
+ user_name = os.environ[MODELSCOPE_CLOUD_USERNAME]
115
+
116
+ ua = 'modelscope/%s; python/%s; session_id/%s; platform/%s; processor/%s; env/%s; user/%s' % (
117
+ "1.15.0",
118
+ platform.python_version(),
119
+ ModelScopeConfig.get_user_session_id(),
120
+ platform.platform(),
121
+ platform.processor(),
122
+ env,
123
+ user_name,
124
+ )
125
+ if isinstance(user_agent, dict):
126
+ ua += '; ' + '; '.join(f'{k}/{v}' for k, v in user_agent.items())
127
+ elif isinstance(user_agent, str):
128
+ ua += '; ' + user_agent
129
+ return ua
130
+
131
+ @staticmethod
132
+ def get_cookies():
133
+ cookies_path = os.path.join(ModelScopeConfig.path_credential,
134
+ ModelScopeConfig.COOKIES_FILE_NAME)
135
+ if os.path.exists(cookies_path):
136
+ with open(cookies_path, 'rb') as f:
137
+ cookies = pickle.load(f)
138
+ return cookies
139
+ return None
140
+
141
+
142
+
143
+ def modelscope_http_get_model_file(
144
+ url: str,
145
+ local_dir: str,
146
+ file_name: str,
147
+ file_size: int,
148
+ cookies: CookieJar,
149
+ headers: Optional[Dict[str, str]] = None,
150
+ ):
151
+ """Download remote file, will retry 5 times before giving up on errors.
152
+
153
+ Args:
154
+ url(str):
155
+ actual download url of the file
156
+ local_dir(str):
157
+ local directory where the downloaded file stores
158
+ file_name(str):
159
+ name of the file stored in `local_dir`
160
+ file_size(int):
161
+ The file size.
162
+ cookies(CookieJar):
163
+ cookies used to authentication the user, which is used for downloading private repos
164
+ headers(Dict[str, str], optional):
165
+ http headers to carry necessary info when requesting the remote file
166
+
167
+ Raises:
168
+ FileDownloadError: File download failed.
169
+
170
+ """
171
+ get_headers = {} if headers is None else copy.deepcopy(headers)
172
+ get_headers['X-Request-ID'] = str(uuid.uuid4().hex)
173
+ temp_file_path = os.path.join(local_dir, file_name)
174
+ # retry sleep 0.5s, 1s, 2s, 4s
175
+ retry = Retry(
176
+ total=5,
177
+ backoff_factor=1,
178
+ allowed_methods=['GET'])
179
+ while True:
180
+ try:
181
+ progress = tqdm(
182
+ unit='B',
183
+ unit_scale=True,
184
+ unit_divisor=1024,
185
+ total=file_size,
186
+ initial=0,
187
+ desc='Downloading',
188
+ )
189
+ partial_length = 0
190
+ if os.path.exists(
191
+ temp_file_path): # download partial, continue download
192
+ with open(temp_file_path, 'rb') as f:
193
+ partial_length = f.seek(0, io.SEEK_END)
194
+ progress.update(partial_length)
195
+ if partial_length > file_size:
196
+ break
197
+ get_headers['Range'] = 'bytes=%s-%s' % (partial_length,
198
+ file_size - 1)
199
+ with open(temp_file_path, 'ab') as f:
200
+ r = requests.get(
201
+ url,
202
+ stream=True,
203
+ headers=get_headers,
204
+ cookies=cookies,
205
+ timeout=60)
206
+ r.raise_for_status()
207
+ for chunk in r.iter_content(
208
+ chunk_size=1024 * 1024 * 1):
209
+ if chunk: # filter out keep-alive new chunks
210
+ progress.update(len(chunk))
211
+ f.write(chunk)
212
+ progress.close()
213
+ break
214
+ except (Exception) as e: # no matter what happen, we will retry.
215
+ retry = retry.increment('GET', url, error=e)
216
+ retry.sleep()
217
+
218
+
219
+ def get_endpoint():
220
+ MODELSCOPE_URL_SCHEME = 'https://'
221
+ DEFAULT_MODELSCOPE_DOMAIN = 'www.modelscope.cn'
222
+ modelscope_domain = os.getenv('MODELSCOPE_DOMAIN',
223
+ DEFAULT_MODELSCOPE_DOMAIN)
224
+ return MODELSCOPE_URL_SCHEME + modelscope_domain
225
+
226
+
227
+ def get_file_download_url(model_id: str, file_path: str, revision: str):
228
+ """Format file download url according to `model_id`, `revision` and `file_path`.
229
+ e.g., Given `model_id=john/bert`, `revision=master`, `file_path=README.md`,
230
+ the resulted download url is: https://modelscope.cn/api/v1/models/john/bert/repo?Revision=master&FilePath=README.md
231
+
232
+ Args:
233
+ model_id (str): The model_id.
234
+ file_path (str): File path
235
+ revision (str): File revision.
236
+
237
+ Returns:
238
+ str: The file url.
239
+ """
240
+ file_path = urllib.parse.quote_plus(file_path)
241
+ revision = urllib.parse.quote_plus(revision)
242
+ download_url_template = '{endpoint}/api/v1/models/{model_id}/repo?Revision={revision}&FilePath={file_path}'
243
+ return download_url_template.format(
244
+ endpoint=get_endpoint(),
245
+ model_id=model_id,
246
+ revision=revision,
247
+ file_path=file_path,
248
+ )
249
+
250
+
251
+ def download_from_modelscope(model_id, origin_file_path, local_dir):
252
+ os.makedirs(local_dir, exist_ok=True)
253
+ if os.path.basename(origin_file_path) in os.listdir(local_dir):
254
+ print(f"{os.path.basename(origin_file_path)} has been already in {local_dir}.")
255
+ return
256
+ else:
257
+ print(f"Start downloading {os.path.join(local_dir, os.path.basename(origin_file_path))}")
258
+ headers = {'user-agent': ModelScopeConfig.get_user_agent(user_agent=None)}
259
+ cookies = ModelScopeConfig.get_cookies()
260
+ url = get_file_download_url(model_id=model_id, file_path=origin_file_path, revision="master")
261
+ modelscope_http_get_model_file(
262
+ url,
263
+ local_dir,
264
+ os.path.basename(origin_file_path),
265
+ file_size=0,
266
+ headers=headers,
267
+ cookies=cookies
268
+ )
269
+
270
+
271
+ def download_from_huggingface(model_id, origin_file_path, local_dir):
272
+ os.makedirs(local_dir, exist_ok=True)
273
+ if os.path.basename(origin_file_path) in os.listdir(local_dir):
274
+ print(f"{os.path.basename(origin_file_path)} has been already in {local_dir}.")
275
+ return
276
+ else:
277
+ print(f"Start downloading {os.path.join(local_dir, os.path.basename(origin_file_path))}")
278
+ hf_hub_download(model_id, origin_file_path, local_dir=local_dir)
diffsynth/prompts/hunyuan_dit_prompter.py CHANGED
@@ -1,14 +1,20 @@
1
  from .utils import Prompter
2
  from transformers import BertModel, T5EncoderModel, BertTokenizer, AutoTokenizer
3
- import warnings
4
 
5
 
6
  class HunyuanDiTPrompter(Prompter):
7
  def __init__(
8
  self,
9
- tokenizer_path="configs/hunyuan_dit/tokenizer",
10
- tokenizer_t5_path="configs/hunyuan_dit/tokenizer_t5"
11
  ):
 
 
 
 
 
 
12
  super().__init__()
13
  self.tokenizer = BertTokenizer.from_pretrained(tokenizer_path)
14
  with warnings.catch_warnings():
 
1
  from .utils import Prompter
2
  from transformers import BertModel, T5EncoderModel, BertTokenizer, AutoTokenizer
3
+ import warnings, os
4
 
5
 
6
  class HunyuanDiTPrompter(Prompter):
7
  def __init__(
8
  self,
9
+ tokenizer_path=None,
10
+ tokenizer_t5_path=None
11
  ):
12
+ if tokenizer_path is None:
13
+ base_path = os.path.dirname(os.path.dirname(__file__))
14
+ tokenizer_path = os.path.join(base_path, "tokenizer_configs/hunyuan_dit/tokenizer")
15
+ if tokenizer_t5_path is None:
16
+ base_path = os.path.dirname(os.path.dirname(__file__))
17
+ tokenizer_t5_path = os.path.join(base_path, "tokenizer_configs/hunyuan_dit/tokenizer_t5")
18
  super().__init__()
19
  self.tokenizer = BertTokenizer.from_pretrained(tokenizer_path)
20
  with warnings.catch_warnings():
diffsynth/prompts/sd_prompter.py CHANGED
@@ -1,10 +1,14 @@
1
  from .utils import Prompter, tokenize_long_prompt
2
  from transformers import CLIPTokenizer
3
  from ..models import SDTextEncoder
 
4
 
5
 
6
  class SDPrompter(Prompter):
7
- def __init__(self, tokenizer_path="configs/stable_diffusion/tokenizer"):
 
 
 
8
  super().__init__()
9
  self.tokenizer = CLIPTokenizer.from_pretrained(tokenizer_path)
10
 
 
1
  from .utils import Prompter, tokenize_long_prompt
2
  from transformers import CLIPTokenizer
3
  from ..models import SDTextEncoder
4
+ import os
5
 
6
 
7
  class SDPrompter(Prompter):
8
+ def __init__(self, tokenizer_path=None):
9
+ if tokenizer_path is None:
10
+ base_path = os.path.dirname(os.path.dirname(__file__))
11
+ tokenizer_path = os.path.join(base_path, "tokenizer_configs/stable_diffusion/tokenizer")
12
  super().__init__()
13
  self.tokenizer = CLIPTokenizer.from_pretrained(tokenizer_path)
14
 
diffsynth/prompts/sdxl_prompter.py CHANGED
@@ -1,15 +1,21 @@
1
  from .utils import Prompter, tokenize_long_prompt
2
  from transformers import CLIPTokenizer
3
  from ..models import SDXLTextEncoder, SDXLTextEncoder2
4
- import torch
5
 
6
 
7
  class SDXLPrompter(Prompter):
8
  def __init__(
9
  self,
10
- tokenizer_path="configs/stable_diffusion/tokenizer",
11
- tokenizer_2_path="configs/stable_diffusion_xl/tokenizer_2"
12
  ):
 
 
 
 
 
 
13
  super().__init__()
14
  self.tokenizer = CLIPTokenizer.from_pretrained(tokenizer_path)
15
  self.tokenizer_2 = CLIPTokenizer.from_pretrained(tokenizer_2_path)
 
1
  from .utils import Prompter, tokenize_long_prompt
2
  from transformers import CLIPTokenizer
3
  from ..models import SDXLTextEncoder, SDXLTextEncoder2
4
+ import torch, os
5
 
6
 
7
  class SDXLPrompter(Prompter):
8
  def __init__(
9
  self,
10
+ tokenizer_path=None,
11
+ tokenizer_2_path=None
12
  ):
13
+ if tokenizer_path is None:
14
+ base_path = os.path.dirname(os.path.dirname(__file__))
15
+ tokenizer_path = os.path.join(base_path, "tokenizer_configs/stable_diffusion/tokenizer")
16
+ if tokenizer_2_path is None:
17
+ base_path = os.path.dirname(os.path.dirname(__file__))
18
+ tokenizer_2_path = os.path.join(base_path, "tokenizer_configs/stable_diffusion_xl/tokenizer_2")
19
  super().__init__()
20
  self.tokenizer = CLIPTokenizer.from_pretrained(tokenizer_path)
21
  self.tokenizer_2 = CLIPTokenizer.from_pretrained(tokenizer_2_path)
diffsynth/prompts/utils.py CHANGED
@@ -36,7 +36,7 @@ def tokenize_long_prompt(tokenizer, prompt):
36
 
37
 
38
  class BeautifulPrompt:
39
- def __init__(self, tokenizer_path="configs/beautiful_prompt/tokenizer", model=None):
40
  self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
41
  self.model = model
42
  self.template = 'Instruction: Give a simple description of the image to generate a drawing prompt.\nInput: {raw_prompt}\nOutput:'
@@ -62,7 +62,7 @@ class BeautifulPrompt:
62
 
63
 
64
  class Translator:
65
- def __init__(self, tokenizer_path="configs/translator/tokenizer", model=None):
66
  self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
67
  self.model = model
68
 
 
36
 
37
 
38
  class BeautifulPrompt:
39
+ def __init__(self, tokenizer_path=None, model=None):
40
  self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
41
  self.model = model
42
  self.template = 'Instruction: Give a simple description of the image to generate a drawing prompt.\nInput: {raw_prompt}\nOutput:'
 
62
 
63
 
64
  class Translator:
65
+ def __init__(self, tokenizer_path=None, model=None):
66
  self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
67
  self.model = model
68
 
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/special_tokens_map.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": "[CLS]",
3
+ "mask_token": "[MASK]",
4
+ "pad_token": "[PAD]",
5
+ "sep_token": "[SEP]",
6
+ "unk_token": "[UNK]"
7
+ }
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/tokenizer_config.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": "[CLS]",
3
+ "do_basic_tokenize": true,
4
+ "do_lower_case": true,
5
+ "mask_token": "[MASK]",
6
+ "name_or_path": "hfl/chinese-roberta-wwm-ext",
7
+ "never_split": null,
8
+ "pad_token": "[PAD]",
9
+ "sep_token": "[SEP]",
10
+ "special_tokens_map_file": "/home/chenweifeng/.cache/huggingface/hub/models--hfl--chinese-roberta-wwm-ext/snapshots/5c58d0b8ec1d9014354d691c538661bf00bfdb44/special_tokens_map.json",
11
+ "strip_accents": null,
12
+ "tokenize_chinese_chars": true,
13
+ "tokenizer_class": "BertTokenizer",
14
+ "unk_token": "[UNK]",
15
+ "model_max_length": 77
16
+ }
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/vocab.txt ADDED
The diff for this file is too large to render. See raw diff
 
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer/vocab_org.txt ADDED
The diff for this file is too large to render. See raw diff
 
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/config.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "/home/patrick/t5/mt5-xl",
3
+ "architectures": [
4
+ "MT5ForConditionalGeneration"
5
+ ],
6
+ "d_ff": 5120,
7
+ "d_kv": 64,
8
+ "d_model": 2048,
9
+ "decoder_start_token_id": 0,
10
+ "dropout_rate": 0.1,
11
+ "eos_token_id": 1,
12
+ "feed_forward_proj": "gated-gelu",
13
+ "initializer_factor": 1.0,
14
+ "is_encoder_decoder": true,
15
+ "layer_norm_epsilon": 1e-06,
16
+ "model_type": "mt5",
17
+ "num_decoder_layers": 24,
18
+ "num_heads": 32,
19
+ "num_layers": 24,
20
+ "output_past": true,
21
+ "pad_token_id": 0,
22
+ "relative_attention_num_buckets": 32,
23
+ "tie_word_embeddings": false,
24
+ "tokenizer_class": "T5Tokenizer",
25
+ "transformers_version": "4.10.0.dev0",
26
+ "use_cache": true,
27
+ "vocab_size": 250112
28
+ }
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/special_tokens_map.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"eos_token": "</s>", "unk_token": "<unk>", "pad_token": "<pad>"}
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/spiece.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ef78f86560d809067d12bac6c09f19a462cb3af3f54d2b8acbba26e1433125d6
3
+ size 4309802
diffsynth/tokenizer_configs/hunyuan_dit/tokenizer_t5/tokenizer_config.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"eos_token": "</s>", "unk_token": "<unk>", "pad_token": "<pad>", "extra_ids": 0, "additional_special_tokens": null, "special_tokens_map_file": "", "tokenizer_file": null, "name_or_path": "google/mt5-small", "model_max_length": 256, "legacy": true}
diffsynth/tokenizer_configs/stable_diffusion/tokenizer/merges.txt ADDED
The diff for this file is too large to render. See raw diff
 
diffsynth/tokenizer_configs/stable_diffusion/tokenizer/special_tokens_map.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "<|startoftext|>",
4
+ "lstrip": false,
5
+ "normalized": true,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "eos_token": {
10
+ "content": "<|endoftext|>",
11
+ "lstrip": false,
12
+ "normalized": true,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "pad_token": "<|endoftext|>",
17
+ "unk_token": {
18
+ "content": "<|endoftext|>",
19
+ "lstrip": false,
20
+ "normalized": true,
21
+ "rstrip": false,
22
+ "single_word": false
23
+ }
24
+ }
diffsynth/tokenizer_configs/stable_diffusion/tokenizer/tokenizer_config.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "bos_token": {
4
+ "__type": "AddedToken",
5
+ "content": "<|startoftext|>",
6
+ "lstrip": false,
7
+ "normalized": true,
8
+ "rstrip": false,
9
+ "single_word": false
10
+ },
11
+ "do_lower_case": true,
12
+ "eos_token": {
13
+ "__type": "AddedToken",
14
+ "content": "<|endoftext|>",
15
+ "lstrip": false,
16
+ "normalized": true,
17
+ "rstrip": false,
18
+ "single_word": false
19
+ },
20
+ "errors": "replace",
21
+ "model_max_length": 77,
22
+ "name_or_path": "openai/clip-vit-large-patch14",
23
+ "pad_token": "<|endoftext|>",
24
+ "special_tokens_map_file": "./special_tokens_map.json",
25
+ "tokenizer_class": "CLIPTokenizer",
26
+ "unk_token": {
27
+ "__type": "AddedToken",
28
+ "content": "<|endoftext|>",
29
+ "lstrip": false,
30
+ "normalized": true,
31
+ "rstrip": false,
32
+ "single_word": false
33
+ }
34
+ }
diffsynth/tokenizer_configs/stable_diffusion/tokenizer/vocab.json ADDED
The diff for this file is too large to render. See raw diff
 
diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/merges.txt ADDED
The diff for this file is too large to render. See raw diff
 
diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/special_tokens_map.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "<|startoftext|>",
4
+ "lstrip": false,
5
+ "normalized": true,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "eos_token": {
10
+ "content": "<|endoftext|>",
11
+ "lstrip": false,
12
+ "normalized": true,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "pad_token": "!",
17
+ "unk_token": {
18
+ "content": "<|endoftext|>",
19
+ "lstrip": false,
20
+ "normalized": true,
21
+ "rstrip": false,
22
+ "single_word": false
23
+ }
24
+ }
diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/tokenizer_config.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "added_tokens_decoder": {
4
+ "0": {
5
+ "content": "!",
6
+ "lstrip": false,
7
+ "normalized": false,
8
+ "rstrip": false,
9
+ "single_word": false,
10
+ "special": true
11
+ },
12
+ "49406": {
13
+ "content": "<|startoftext|>",
14
+ "lstrip": false,
15
+ "normalized": true,
16
+ "rstrip": false,
17
+ "single_word": false,
18
+ "special": true
19
+ },
20
+ "49407": {
21
+ "content": "<|endoftext|>",
22
+ "lstrip": false,
23
+ "normalized": true,
24
+ "rstrip": false,
25
+ "single_word": false,
26
+ "special": true
27
+ }
28
+ },
29
+ "bos_token": "<|startoftext|>",
30
+ "clean_up_tokenization_spaces": true,
31
+ "do_lower_case": true,
32
+ "eos_token": "<|endoftext|>",
33
+ "errors": "replace",
34
+ "model_max_length": 77,
35
+ "pad_token": "!",
36
+ "tokenizer_class": "CLIPTokenizer",
37
+ "unk_token": "<|endoftext|>"
38
+ }
diffsynth/tokenizer_configs/stable_diffusion_xl/tokenizer_2/vocab.json ADDED
The diff for this file is too large to render. See raw diff