recoilme commited on
Commit
9614bab
·
1 Parent(s): 179efa2
media/result_grid.jpg CHANGED

Git LFS Details

  • SHA256: 00a8319eca409164686f33ada4d8322fd8dc44bc24d5dc57202c119106ebfb55
  • Pointer size: 132 Bytes
  • Size of remote file: 3.97 MB

Git LFS Details

  • SHA256: 1fb1de7bd02a63e30a731b5d66cd081d3937e91a64e29bbf8af6dfa6b2159b00
  • Pointer size: 132 Bytes
  • Size of remote file: 1.31 MB
pipeline_sdxs.py CHANGED
@@ -12,7 +12,7 @@ class SdxsPipelineOutput(BaseOutput):
12
  images: Union[List[Image.Image], np.ndarray]
13
 
14
  class SdxsPipeline(DiffusionPipeline):
15
- def __init__(self, vae, text_encoder, tokenizer, unet, scheduler, max_length: int = 150):
16
  super().__init__()
17
  self.register_modules(
18
  vae=vae, text_encoder=text_encoder, tokenizer=tokenizer,
@@ -33,7 +33,7 @@ class SdxsPipeline(DiffusionPipeline):
33
 
34
  # Если промпты не заданы, используем пустые эмбеддинги
35
  if prompt is None and negative_prompt is None:
36
- hidden_dim = 1024 # Размерность эмбеддинга Qwen3-0.6B
37
  seq_len = self.max_length
38
  batch_size = 1
39
  # ИЗМЕНЕНО: Возвращаем три элемента: embeds, mask, pooled
@@ -42,7 +42,7 @@ class SdxsPipeline(DiffusionPipeline):
42
  empty_pooled = torch.zeros((batch_size, hidden_dim), dtype=dtype, device=device)
43
  return empty_embeds, empty_mask, empty_pooled
44
 
45
- # Токенизация с фиксированным max_length=150 и padding="max_length"
46
  def encode_texts(texts, max_length=self.max_length):
47
  with torch.no_grad():
48
  if isinstance(texts, str):
@@ -70,7 +70,7 @@ class SdxsPipeline(DiffusionPipeline):
70
  outs = self.text_encoder(**toks, output_hidden_states=True, return_dict=True)
71
 
72
  # Токен-эмбеддинги (для Cross-Attention)
73
- hidden = outs.hidden_states[-1] # Используем last hidden state -2???
74
  # Маска внимания (для Cross-Attention)
75
  attention_mask = toks["attention_mask"]
76
 
 
12
  images: Union[List[Image.Image], np.ndarray]
13
 
14
  class SdxsPipeline(DiffusionPipeline):
15
+ def __init__(self, vae, text_encoder, tokenizer, unet, scheduler, max_length: int = 192):
16
  super().__init__()
17
  self.register_modules(
18
  vae=vae, text_encoder=text_encoder, tokenizer=tokenizer,
 
33
 
34
  # Если промпты не заданы, используем пустые эмбеддинги
35
  if prompt is None and negative_prompt is None:
36
+ hidden_dim = 1024 # Размерность эмбеддинга
37
  seq_len = self.max_length
38
  batch_size = 1
39
  # ИЗМЕНЕНО: Возвращаем три элемента: embeds, mask, pooled
 
42
  empty_pooled = torch.zeros((batch_size, hidden_dim), dtype=dtype, device=device)
43
  return empty_embeds, empty_mask, empty_pooled
44
 
45
+ # Токенизация с фиксированным max_length и padding="max_length"
46
  def encode_texts(texts, max_length=self.max_length):
47
  with torch.no_grad():
48
  if isinstance(texts, str):
 
70
  outs = self.text_encoder(**toks, output_hidden_states=True, return_dict=True)
71
 
72
  # Токен-эмбеддинги (для Cross-Attention)
73
+ hidden = outs.hidden_states[-2] # Используем last hidden state -2???
74
  # Маска внимания (для Cross-Attention)
75
  attention_mask = toks["attention_mask"]
76
 
samples/unet_320x640_0.jpg CHANGED

Git LFS Details

  • SHA256: e230607ffbcca17f4034c6e41f3e3a00a81bd37e73552869451581ba26767b48
  • Pointer size: 130 Bytes
  • Size of remote file: 69.5 kB

Git LFS Details

  • SHA256: 1d8c59425b87c7f5aaf17d68bb1d79d62010487505cfac67f170d0bdacd337c9
  • Pointer size: 130 Bytes
  • Size of remote file: 57.5 kB
samples/unet_384x640_0.jpg CHANGED

Git LFS Details

  • SHA256: f1c7072b4c561c3d68b3f3cbf9707e6e4df7f7be33ede544a3a31b4bc515c8db
  • Pointer size: 131 Bytes
  • Size of remote file: 141 kB

Git LFS Details

  • SHA256: eeac8402ead8792a0156bebd09dd6437144d9f1cbc275098a4412df9d15d4372
  • Pointer size: 131 Bytes
  • Size of remote file: 155 kB
samples/unet_448x640_0.jpg CHANGED

Git LFS Details

  • SHA256: 2443c86da5232ca8ebf1f181043166f1b8d23e8089f5738c853694cb6435b7fa
  • Pointer size: 130 Bytes
  • Size of remote file: 55.6 kB

Git LFS Details

  • SHA256: e21e15c7fe2b29858d232b1d2ce7901bec3f3f8acbd519d0c76a7cbe081166ec
  • Pointer size: 130 Bytes
  • Size of remote file: 71.8 kB
samples/unet_512x640_0.jpg CHANGED

Git LFS Details

  • SHA256: df029b194027a859da1098f0c65a00663507e49d66d5c7da3578b7b01286965f
  • Pointer size: 130 Bytes
  • Size of remote file: 93.4 kB

Git LFS Details

  • SHA256: a6ebca3230873f7691d34d615c0e3c0affe4c4e860b4a3fd827661185a3e6d95
  • Pointer size: 131 Bytes
  • Size of remote file: 106 kB
samples/unet_576x640_0.jpg CHANGED

Git LFS Details

  • SHA256: 657835c71e7074ebfb923eafae4363da80df2768680b1709bb717d248a574489
  • Pointer size: 131 Bytes
  • Size of remote file: 103 kB

Git LFS Details

  • SHA256: eae34c04ee05477b8ee57a6528d7669dfcab592c3216fdc9a5dec17d1dd5baa8
  • Pointer size: 131 Bytes
  • Size of remote file: 132 kB
samples/unet_640x320_0.jpg CHANGED

Git LFS Details

  • SHA256: 5e34acbd192ceed3090427d693dc34109d833061a27d9d3d726058f106c4633e
  • Pointer size: 130 Bytes
  • Size of remote file: 72.6 kB

Git LFS Details

  • SHA256: 7a950b931518c8ed58021d559016fc488111931ef7793590390d837fdf25f504
  • Pointer size: 131 Bytes
  • Size of remote file: 103 kB
samples/unet_640x384_0.jpg CHANGED

Git LFS Details

  • SHA256: 930d7c67b04d5b46955f8ea917d4bf932259eb34ed4bfd9f956bde6e24df2c95
  • Pointer size: 130 Bytes
  • Size of remote file: 94.4 kB

Git LFS Details

  • SHA256: eade85e26c87b47c1030195b86ae565181300e30dc9f36e92dd72df5f2ebcaeb
  • Pointer size: 131 Bytes
  • Size of remote file: 172 kB
samples/unet_640x448_0.jpg CHANGED

Git LFS Details

  • SHA256: b74384ca07b507e81e83d76be01720f2f8471e70b177d4d566f263936f189667
  • Pointer size: 130 Bytes
  • Size of remote file: 79.5 kB

Git LFS Details

  • SHA256: 7fc94e04d184b961e460a8b70b222dce4e8d4945fc69a47541f4beff155e2d55
  • Pointer size: 130 Bytes
  • Size of remote file: 78.5 kB
samples/unet_640x512_0.jpg CHANGED

Git LFS Details

  • SHA256: 4b62ea9de3989863a34afc20fc02c40f80ea5dfdc7fc123282ef4178cca29007
  • Pointer size: 130 Bytes
  • Size of remote file: 75.9 kB

Git LFS Details

  • SHA256: 4d354271bbb4ccee5be98837572d24dd44e6adfd23e9527d7e12703bdd3e3987
  • Pointer size: 131 Bytes
  • Size of remote file: 175 kB
samples/unet_640x576_0.jpg CHANGED

Git LFS Details

  • SHA256: 309b0939fe364175bbd47294c43a74b0eb48d3f407e57cb0667a54f12dc4201b
  • Pointer size: 131 Bytes
  • Size of remote file: 142 kB

Git LFS Details

  • SHA256: 5670c9a0a13e664d280309dc966e26c8ef1163fe95f9d750b930eff7cc196b7e
  • Pointer size: 131 Bytes
  • Size of remote file: 100 kB
samples/unet_640x640_0.jpg CHANGED

Git LFS Details

  • SHA256: f679af109e64aa5bf9ba281dd19606c03855cd80b3b375c7b9d7e14fead7537b
  • Pointer size: 131 Bytes
  • Size of remote file: 201 kB

Git LFS Details

  • SHA256: 12157ea62dc45877a8744b5835ba149cfb6eb29a1330f05fcdf98a8bd0bed3e7
  • Pointer size: 131 Bytes
  • Size of remote file: 280 kB
src/conv2048.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from diffusers import UNet2DConditionModel
3
+ import os
4
+ from safetensors.torch import load_file as safe_load
5
+
6
+ # --- КОНСТАНТЫ ---
7
+ OLD_UNET_PATH = "/workspace/sdxs/unet_old"
8
+ NEW_UNET_PATH = "/workspace/sdxs/unet"
9
+
10
+ def transfer_unet_weights_fix(old_path: str, new_path: str):
11
+
12
+ print(f"Загрузка новой UNet (Конфиг 2048D) из: {new_path}")
13
+ new_unet = UNet2DConditionModel.from_pretrained(new_path, low_cpu_mem_usage=False)
14
+
15
+ # 2. Прямая загрузка state dict старой модели (с обработкой формата)
16
+ print(f"Прямая загрузка весов старой UNet из: {old_path}")
17
+
18
+ weights_file = next((f for f in os.listdir(old_path) if f.endswith(('.safetensors', '.bin'))), None)
19
+ if not weights_file:
20
+ print("Ошибка: не найден файл весов (.safetensors или .bin) в старой папке.")
21
+ return None
22
+
23
+ if weights_file.endswith('.safetensors'):
24
+ print(f"Обнаружен файл Safetensors ({weights_file}). Использую safe_load.")
25
+ old_state_dict = safe_load(f"{old_path}/{weights_file}")
26
+ elif weights_file.endswith('.bin'):
27
+ print(f"Обнаружен файл PyTorch (.bin) ({weights_file}). Использую torch.load с weights_only=False.")
28
+ old_state_dict = torch.load(
29
+ f"{old_path}/{weights_file}",
30
+ map_location='cpu',
31
+ weights_only=False
32
+ )
33
+ else:
34
+ print(f"Ошибка: Не удалось загрузить файл {weights_file}. Проверьте формат.")
35
+ return None
36
+
37
+ if "state_dict" in old_state_dict:
38
+ old_state_dict = old_state_dict["state_dict"]
39
+
40
+ # 3. Перенос весов с обработкой RuntimeError
41
+ print("Начало переноса весов с пропуском несовместимых слоев...")
42
+
43
+ # --- НОВОЕ: Предварительный подсчет совпадающих ключей ---
44
+ total_keys = len(old_state_dict)
45
+ matching_keys = 0
46
+ size_mismatch_keys = 0
47
+
48
+ # Используем ключи новой модели для сравнения, чтобы убедиться,
49
+ # что ключи, которые отсутствуют в старой, не учитываются в "перенесенных".
50
+ new_keys = new_unet.state_dict().keys()
51
+
52
+ for name, old_param in old_state_dict.items():
53
+ if name in new_keys:
54
+ new_param = new_unet.state_dict()[name]
55
+ # Считаем только те, где имя и размер совпали
56
+ if old_param.shape == new_param.shape:
57
+ matching_keys += 1
58
+ # Считаем те, где имя совпало, но размер изменился (mismatch)
59
+ else:
60
+ size_mismatch_keys += 1
61
+ # Ключи, которые есть в старой, но нет в новой (unexpected),
62
+ # также будут пропущены. Но нас в первую очередь интересуют size mismatch.
63
+
64
+ # Пытаемся загрузить веса, зная, что это вызовет RuntimeError
65
+ try:
66
+ # Запуск actual переноса. Ключи будут перенесены.
67
+ new_unet.load_state_dict(old_state_dict, strict=False)
68
+
69
+ except RuntimeError as e:
70
+ # Это ожидаемый блок! Он ловит RuntimeError, вызванный mismatch size.
71
+ # Веса, которые совпали, УЖЕ перенесены в new_unet.
72
+
73
+ print("\n--- Отчет о переносе весов ---")
74
+ print("⚠️ Обнаружен ожидаемый **RuntimeError** из-за несовпадения размеров. Это нормально!")
75
+
76
+ print(f"💡 **УСПЕШНО перенесенных ключей (совпадающий размер): {matching_keys} шт.**")
77
+ print(f"❌ **Пропущенных ключей (несовпадение размера): {size_mismatch_keys} шт.**")
78
+
79
+ # Мы всё равно сохраняем UNet, так как большая часть весов перенесена
80
+ new_unet.save_pretrained(new_path)
81
+ print(f"\n✅ Новая UNet (с перенесенными весами) сохранена по пути: {new_path}")
82
+ return new_unet
83
+
84
+ # Блок на случай, если чудом ошибки не возникло (для полноты)
85
+ print("\n--- Отчет о переносе весов ---")
86
+ print(f"✅ Успешно перенесены совпадающие веса (основная часть UNet).")
87
+ print(f"💡 **УСПЕШНО перенесенных ключей (совпадающий размер): {matching_keys} шт.**")
88
+ print(f"❌ **Пропущенных ключей (несовпадение размера): {size_mismatch_keys} шт.**")
89
+ #print(f"❌ Слои, требующие переобучения (измененный размер): {len(incompatible_keys.unexpected_keys)}")
90
+
91
+ new_unet.save_pretrained(new_path)
92
+ print(f"\n✅ Новая UNet сохранена по пути: {new_path}")
93
+
94
+ return new_unet
95
+
96
+ # --- ВЫПОЛНЕНИЕ ---
97
+ transferred_unet = transfer_unet_weights_fix(OLD_UNET_PATH, NEW_UNET_PATH)
src/sdxs_create.ipynb CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:7fc8d44920e51edca4d0ab57c808991908139fb28987fb3bbfcb116068d4dc20
3
- size 7417
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d542ea503b79500cf1ee2bec8f9a82807d0520579664ab363b4611c1971620c9
3
+ size 8018
test.ipynb CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:dcec4623b1c01ec0ea887756e54c2926705d4a18a812870e96612c672af48065
3
- size 5017634
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:70b3ec42fbbada7f67f0477e673da4b15da141fa481ff04f709680ca0eaf773f
3
+ size 4393987
text_encoder/config.json CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:39738c799f70b98f75dace818f14bfffb0b34fad25d41b80b6236e20a731c740
3
- size 1359
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b6026cadca04402d27495be77ff01ca4e1b418ea59047ad7079bf3bfd3517f11
3
+ size 1354
text_encoder/model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:a3184342876e1e64cd98164dc01aaaf69177a9d0ed80725816e3225977ab2982
3
- size 1192134784
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2a86278726ecbda59caff65f49ec07c3ec5672b044ed523780990a8c08a87fd4
3
+ size 1192133232
train.py CHANGED
@@ -26,18 +26,19 @@ from collections import deque
26
  from transformers import AutoTokenizer, AutoModel
27
 
28
  # --------------------------- Параметры ---------------------------
29
- ds_path = "/workspace/sdxs/datasets/ds1234_640"
30
  project = "unet"
31
- batch_size = 48
32
  base_learning_rate = 3e-5
33
  min_learning_rate = 2.5e-5
34
- num_epochs = 5
35
- sample_interval_share = 1
 
36
  use_wandb = True
37
  use_comet_ml = False
38
  save_model = True
39
  use_decay = True
40
- fbp = False
41
  optimizer_type = "adam8bit"
42
  torch_compile = False
43
  unet_gradient = True
@@ -50,14 +51,14 @@ torch.backends.cudnn.allow_tf32 = True
50
  torch.backends.cuda.enable_mem_efficient_sdp(False)
51
  dtype = torch.float32
52
  save_barrier = 1.004
53
- warmup_percent = 0.005
54
  percentile_clipping = 98
55
  betta2 = 0.998
56
  eps = 1e-6
57
  clip_grad_norm = 1.0
58
  limit = 0
59
  checkpoints_folder = ""
60
- mixed_precision = "no"
61
  gradient_accumulation_steps = 1
62
 
63
  accelerator = Accelerator(
@@ -124,7 +125,7 @@ tokenizer = AutoTokenizer.from_pretrained("tokenizer")
124
  text_model = AutoModel.from_pretrained("text_encoder").to(device).eval()
125
 
126
  # --- [UPDATED] Функция кодирования текста (с маской и пулингом) ---
127
- def encode_texts(texts, max_length=150):
128
  # Если тексты пустые (для unconditional), создаем заглушки
129
  if texts is None:
130
  # В случае None возвращаем нули (логика для get_negative_embedding)
@@ -158,9 +159,8 @@ def encode_texts(texts, max_length=150):
158
 
159
  outs = text_model(**toks, output_hidden_states=True, return_dict=True)
160
 
161
- # 1. Токен-эмбеддинги (Last Hidden State - нормализованный)
162
- # Используем last_hidden_state или hidden_states[-1] (если Qwen, лучше last_hidden_state)
163
- hidden = outs.last_hidden_state
164
 
165
  # 2. Маска внимания
166
  attention_mask = toks["attention_mask"]
@@ -398,7 +398,7 @@ fixed_samples = get_fixed_samples_by_resolution(dataset)
398
  def get_negative_embedding(neg_prompt="", batch_size=1):
399
  if not neg_prompt:
400
  hidden_dim = 1024
401
- seq_len = 150
402
  empty_emb = torch.zeros((batch_size, seq_len, hidden_dim), dtype=dtype, device=device)
403
  empty_mask = torch.ones((batch_size, seq_len), dtype=torch.int64, device=device)
404
  empty_pool = torch.zeros((batch_size, hidden_dim), dtype=dtype, device=device)
 
26
  from transformers import AutoTokenizer, AutoModel
27
 
28
  # --------------------------- Параметры ---------------------------
29
+ ds_path = "/workspace/sdxs/datasets/640"
30
  project = "unet"
31
+ batch_size = 256
32
  base_learning_rate = 3e-5
33
  min_learning_rate = 2.5e-5
34
+ num_epochs = 10
35
+ sample_interval_share = 20
36
+ max_length = 192
37
  use_wandb = True
38
  use_comet_ml = False
39
  save_model = True
40
  use_decay = True
41
+ fbp = False
42
  optimizer_type = "adam8bit"
43
  torch_compile = False
44
  unet_gradient = True
 
51
  torch.backends.cuda.enable_mem_efficient_sdp(False)
52
  dtype = torch.float32
53
  save_barrier = 1.004
54
+ warmup_percent = 0.01
55
  percentile_clipping = 98
56
  betta2 = 0.998
57
  eps = 1e-6
58
  clip_grad_norm = 1.0
59
  limit = 0
60
  checkpoints_folder = ""
61
+ mixed_precision = "bf16"
62
  gradient_accumulation_steps = 1
63
 
64
  accelerator = Accelerator(
 
125
  text_model = AutoModel.from_pretrained("text_encoder").to(device).eval()
126
 
127
  # --- [UPDATED] Функция кодирования текста (с маской и пулингом) ---
128
+ def encode_texts(texts, max_length=max_length):
129
  # Если тексты пустые (для unconditional), создаем заглушки
130
  if texts is None:
131
  # В случае None возвращаем нули (логика для get_negative_embedding)
 
159
 
160
  outs = text_model(**toks, output_hidden_states=True, return_dict=True)
161
 
162
+ # Используем last_hidden_state или hidden_states[-1] (если Qwen, лучше last_hidden_state - прим человека: ХУЙ)
163
+ hidden = outs.hidden_states[-2]
 
164
 
165
  # 2. Маска внимания
166
  attention_mask = toks["attention_mask"]
 
398
  def get_negative_embedding(neg_prompt="", batch_size=1):
399
  if not neg_prompt:
400
  hidden_dim = 1024
401
+ seq_len = max_length
402
  empty_emb = torch.zeros((batch_size, seq_len, hidden_dim), dtype=dtype, device=device)
403
  empty_mask = torch.ones((batch_size, seq_len), dtype=torch.int64, device=device)
404
  empty_pool = torch.zeros((batch_size, hidden_dim), dtype=dtype, device=device)
unet/config.json CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9437f6d40639f1ad6d95d6586009d7b1bf0c8e99959d29da5c9c9645cae39ea3
3
- size 1899
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae4272f7e52480762c228a2fbe1db5f361d7a5971c3855b483999fb3df2d722b
3
+ size 1885
unet/diffusion_pytorch_model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:22402fe3c630ab551173c2bd11af4a7ae4ed76c04f001535f3791cd82da93719
3
- size 3103078992
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ccfa16a08b6e507835636c048b8c721186ef6832fec3ca889a7139dcd53676cf
3
+ size 6625750656
text_encoder/generation_config.json → unet_old/config.json RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:d3e057bbca66b92f33a8bdc6a1301014e0e4ab69b3b3fd2e442d9fe0c69f3431
3
- size 214
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9437f6d40639f1ad6d95d6586009d7b1bf0c8e99959d29da5c9c9645cae39ea3
3
+ size 1899
unet_old/diffusion_pytorch_model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:22402fe3c630ab551173c2bd11af4a7ae4ed76c04f001535f3791cd82da93719
3
+ size 3103078992