diff --git a/eval_alchemist.py b/eval_alchemist.py index a2a99220d5d6ad0aa4cc4de7dbbe3d257e072973..842b1062d40d0b0aa8d9aef6815ac38eb911b31c 100644 --- a/eval_alchemist.py +++ b/eval_alchemist.py @@ -6,7 +6,7 @@ from PIL import Image, UnidentifiedImageError from tqdm import tqdm from torch.utils.data import Dataset, DataLoader from torchvision.transforms import Compose, Resize, ToTensor, CenterCrop,ToPILImage -from diffusers import AutoencoderKL, AsymmetricAutoencoderKL +from diffusers import AutoencoderKL, AsymmetricAutoencoderKL, AutoencoderKLWan,AutoencoderKLLTXVideo import random # --------------------------- Параметры --------------------------- @@ -15,24 +15,28 @@ DTYPE = torch.float16 IMAGE_FOLDER = "/workspace/alchemist" #wget https://huggingface.co/datasets/AiArtLab/alchemist/resolve/main/alchemist.zip MIN_SIZE = 1280 CROP_SIZE = 512 -BATCH_SIZE = 10 -MAX_IMAGES = 0 +BATCH_SIZE = 1 +MAX_IMAGES = 100 NUM_WORKERS = 4 -NUM_SAMPLES_TO_SAVE = 10 # Сколько примеров сохранить (0 - не сохранять) +NUM_SAMPLES_TO_SAVE = 2 # Сколько примеров сохранить (0 - не сохранять) SAMPLES_FOLDER = "vaetest" # Список VAE для тестирования VAE_LIST = [ - # ("stable-diffusion-v1-5/stable-diffusion-v1-5", AutoencoderKL, "stable-diffusion-v1-5/stable-diffusion-v1-5", "vae"), # ("cross-attention/asymmetric-autoencoder-kl-x-1-5", AsymmetricAutoencoderKL, "cross-attention/asymmetric-autoencoder-kl-x-1-5", None), - ("madebyollin/sdxl-vae-fp16", AutoencoderKL, "madebyollin/sdxl-vae-fp16-fix", None), -# ("vae", AutoencoderKL, "/workspace/sdxl_vae/vae", None), - ("KBlueLeaf/EQ-SDXL-VAE", AutoencoderKL, "KBlueLeaf/EQ-SDXL-VAE", None), - ("AiArtLab/sdxl_vae", AutoencoderKL, "AiArtLab/sdxl_vae", None), - ("AiArtLab/sdxlvae_nightly", AutoencoderKL, "AiArtLab/sdxl_vae", "vae_nightly"), +# ("madebyollin/sdxl-vae-fp16", AutoencoderKL, "madebyollin/sdxl-vae-fp16-fix", None), +# ("KBlueLeaf/EQ-SDXL-VAE", AutoencoderKL, "KBlueLeaf/EQ-SDXL-VAE", None), +# ("AiArtLab/sdxl_vae", AutoencoderKL, "AiArtLab/sdxl_vae", None), +# ("AiArtLab/sdxlvae_nightly", AutoencoderKL, "AiArtLab/sdxl_vae", "vae_nightly"), +# ("Lightricks/LTX-Video", AutoencoderKLLTXVideo, "Lightricks/LTX-Video", "vae"), +# ("Wan2.2-TI2V-5B-Diffusers", AutoencoderKLWan, "Wan-AI/Wan2.2-TI2V-5B-Diffusers", "vae"), +# ("Wan2.2-T2V-A14B-Diffusers", AutoencoderKLWan, "Wan-AI/Wan2.2-T2V-A14B-Diffusers", "vae"), ("AiArtLab/sdxs", AutoencoderKL, "AiArtLab/sdxs", "vae"), - ("FLUX.1-schnell-vae", AutoencoderKL, "black-forest-labs/FLUX.1-schnell", "vae"), +# ("FLUX.1-schnell-vae", AutoencoderKL, "black-forest-labs/FLUX.1-schnell", "vae"), +# ("simple_vae", AutoencoderKL, "/workspace/sdxl_vae/simple_vae", None), + ("simple_vae_nightly", AutoencoderKL, "/workspace/sdxl_vae/simple_vae_nightly", None), + ] # --------------------------- Sobel Edge Detection --------------------------- @@ -129,6 +133,44 @@ def deprocess(x): def _sanitize_name(name: str) -> str: return name.replace('/', '_').replace('-', '_') +# --------------------------- Анализ VAE --------------------------- +@torch.no_grad() +def tensor_stats(name, x: torch.Tensor): + finite = torch.isfinite(x) + fin_ratio = finite.float().mean().item() + x_f = x[finite] + minv = x_f.min().item() if x_f.numel() else float('nan') + maxv = x_f.max().item() if x_f.numel() else float('nan') + mean = x_f.mean().item() if x_f.numel() else float('nan') + std = x_f.std().item() if x_f.numel() else float('nan') + big = (x_f.abs() > 20).float().mean().item() if x_f.numel() else float('nan') + print(f"[{name}] shape={tuple(x.shape)} dtype={x.dtype} " + f"finite={fin_ratio:.6f} min={minv:.4g} max={maxv:.4g} mean={mean:.4g} std={std:.4g} |x|>20={big:.6f}") + +@torch.no_grad() +def analyze_vae_latents(vae, name, images): + """ + images: [B,3,H,W] в [-1,1] + """ + try: + enc = vae.encode(images) + if hasattr(enc, "latent_dist"): + mu, logvar = enc.latent_dist.mean, enc.latent_dist.logvar + z = enc.latent_dist.sample() + else: + mu, logvar = enc[0], enc[1] + z = mu + tensor_stats(f"{name}.mu", mu) + tensor_stats(f"{name}.logvar", logvar) + tensor_stats(f"{name}.z_raw", z) + + sf = getattr(vae.config, "scaling_factor", 1.0) + z_scaled = z * sf + tensor_stats(f"{name}.z_scaled(x{sf})", z_scaled) + except Exception as e: + print(f"⚠️ Ошибка анализа VAE {name}: {e}") + + # --------------------------- Основной код --------------------------- if __name__ == "__main__": if NUM_SAMPLES_TO_SAVE > 0: @@ -182,13 +224,23 @@ if __name__ == "__main__": for batch in tqdm(dataloader, desc="Обработка батчей"): batch = batch.to(DEVICE) # [B,3,H,W] в [0,1] test_inp = process(batch).to(DTYPE) # [-1,1] для энкодера + # >>> Анализируем латенты каждой VAE на первой итерации + if images_saved == 0: # только для первого батча, чтобы не засорять лог + for vae, name in zip(vaes, names): + analyze_vae_latents(vae, name, test_inp) # 1) считаем реконструкции для всех VAE на весь батч recon_list = [] - for vae in vaes: - latent = vae.encode(test_inp).latent_dist.mode() - dec = vae.decode(latent).sample.float() # [-1,1] (как правило) - recon = deprocess(dec).clamp(0.0, 1.0) # -> [0,1], clamp убирает артефакты + for vae, name in zip(vaes, names): + test_inp_vae = test_inp # локальная копия + #if name == "Wan2.2-T2V-A14B-Diffusers" and test_inp_vae.ndim == 4: + if (isinstance(vae, AutoencoderKLWan) or isinstance(vae, AutoencoderKLLTXVideo)) and test_inp_vae.ndim == 4: + test_inp_vae = test_inp_vae.unsqueeze(2) # только для Wan + latent = vae.encode(test_inp_vae).latent_dist.mode() + dec = vae.decode(latent).sample.float() + if dec.ndim == 5: + dec = dec.squeeze(2) + recon = deprocess(dec).clamp(0.0, 1.0) recon_list.append(recon) # 2) обновляем метрики (по каждой VAE) diff --git a/samples/sample_0.jpg b/samples/sample_0.jpg deleted file mode 100644 index c8965fd6665ddbd1d0dac4f56be02e75f4da4ae2..0000000000000000000000000000000000000000 --- a/samples/sample_0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dce2033b5ea0f9ce2006d9e3b2c8cb123cdfd1a58a72d3562103b8979ebedd0 -size 79093 diff --git a/samples/sample_1.jpg b/samples/sample_1.jpg deleted file mode 100644 index 488db67cada022f6f54c68a9abb66829a28ee602..0000000000000000000000000000000000000000 --- a/samples/sample_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a530cdc04fe70def63768ec9ca898fae8e100ea07bce8536b2d4a1115685e79e -size 157701 diff --git a/samples/sample_2.jpg b/samples/sample_2.jpg deleted file mode 100644 index 48c1cab30b246d77f49012946b7316addb67c8e4..0000000000000000000000000000000000000000 --- a/samples/sample_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162a8e3a2b53bbf1f4e48dc9166c6b7dec6040416c3590383968ac2c89cc133 -size 53857 diff --git a/samples/sample_decoded-Copy1.jpg b/samples/sample_decoded-Copy1.jpg deleted file mode 100644 index f46f9cbf023ec8f16ee4032f09043ea507674af2..0000000000000000000000000000000000000000 --- a/samples/sample_decoded-Copy1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbc45fc2764868844ce3a13e4e297f42ca75aac376e061de4d6b736d981e5e12 -size 79263 diff --git a/samples/sample_decoded.jpg b/samples/sample_decoded.jpg deleted file mode 100644 index c8965fd6665ddbd1d0dac4f56be02e75f4da4ae2..0000000000000000000000000000000000000000 --- a/samples/sample_decoded.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dce2033b5ea0f9ce2006d9e3b2c8cb123cdfd1a58a72d3562103b8979ebedd0 -size 79093 diff --git a/samples/sample_real.jpg b/samples/sample_real.jpg deleted file mode 100644 index afe245341e8efd65c5eb39e70a192b9c6a9e8e45..0000000000000000000000000000000000000000 --- a/samples/sample_real.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0811374ab3bc11e881daa2ccee89144532ebd6ccb101989ac15bb2fa1db504d2 -size 85416 diff --git a/simple_vae/config.json b/simple_vae/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f37317b9d8fed48e0b95c99b141ace10fb812af8 --- /dev/null +++ b/simple_vae/config.json @@ -0,0 +1,38 @@ +{ + "_class_name": "AutoencoderKL", + "_diffusers_version": "0.35.0.dev0", + "_name_or_path": "simple_vae", + "act_fn": "silu", + "block_out_channels": [ + 128, + 256, + 512, + 512 + ], + "down_block_types": [ + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D" + ], + "force_upcast": false, + "in_channels": 3, + "latent_channels": 16, + "latents_mean": null, + "latents_std": null, + "layers_per_block": 2, + "mid_block_add_attention": true, + "norm_num_groups": 32, + "out_channels": 3, + "sample_size": 1024, + "scaling_factor": 1.0, + "shift_factor": 0, + "up_block_types": [ + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D" + ], + "use_post_quant_conv": true, + "use_quant_conv": true +} diff --git a/simple_vae/diffusion_pytorch_model.safetensors b/simple_vae/diffusion_pytorch_model.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..3e72cb818f60dd097f9159a0af36305937793cce --- /dev/null +++ b/simple_vae/diffusion_pytorch_model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:010d2cb8824a347425be4e41d662b22492965ffb61393621eb1253be8b7fa0ce +size 335311892 diff --git a/simple_vae_nightly/config.json b/simple_vae_nightly/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f37317b9d8fed48e0b95c99b141ace10fb812af8 --- /dev/null +++ b/simple_vae_nightly/config.json @@ -0,0 +1,38 @@ +{ + "_class_name": "AutoencoderKL", + "_diffusers_version": "0.35.0.dev0", + "_name_or_path": "simple_vae", + "act_fn": "silu", + "block_out_channels": [ + 128, + 256, + 512, + 512 + ], + "down_block_types": [ + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D", + "DownEncoderBlock2D" + ], + "force_upcast": false, + "in_channels": 3, + "latent_channels": 16, + "latents_mean": null, + "latents_std": null, + "layers_per_block": 2, + "mid_block_add_attention": true, + "norm_num_groups": 32, + "out_channels": 3, + "sample_size": 1024, + "scaling_factor": 1.0, + "shift_factor": 0, + "up_block_types": [ + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D", + "UpDecoderBlock2D" + ], + "use_post_quant_conv": true, + "use_quant_conv": true +} diff --git a/simple_vae_nightly/diffusion_pytorch_model.safetensors b/simple_vae_nightly/diffusion_pytorch_model.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..613b335b5393b9795bb42fdbe03d3d4329142d75 --- /dev/null +++ b/simple_vae_nightly/diffusion_pytorch_model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccd57f2cd9455d6c66ed2fee9396dbb53cbeb675fa0c1fbee87a9b0f94c3de79 +size 335311892 diff --git a/train_sdxl_vae.py b/train_sdxl_vae.py index 04429c2d5b0eee7e1dde700460a1599a03fdb76e..05d9b557d149bbf392ededf9b995eb9aab054bc6 100644 --- a/train_sdxl_vae.py +++ b/train_sdxl_vae.py @@ -24,11 +24,11 @@ from collections import deque # --------------------------- Параметры --------------------------- ds_path = "/workspace/png" -project = "vae" +project = "simple_vae" batch_size = 3 -base_learning_rate = 6e-6 -min_learning_rate = 1e-6 -num_epochs = 8 +base_learning_rate = 5e-5 +min_learning_rate = 9e-7 +num_epochs = 16 sample_interval_share = 10 use_wandb = True save_model = True @@ -50,7 +50,7 @@ clip_grad_norm = 1.0 mixed_precision = "no" # или "fp16"/"bf16" при поддержке gradient_accumulation_steps = 5 generated_folder = "samples" -save_as = "vae_nightly" +save_as = "simple_vae_nightly" num_workers = 0 device = None # accelerator задаст устройство @@ -81,7 +81,7 @@ torch.manual_seed(seed) np.random.seed(seed) random.seed(seed) -torch.backends.cudnn.benchmark = True +torch.backends.cudnn.benchmark = False # --------------------------- WandB --------------------------- if use_wandb and accelerator.is_main_process: diff --git a/train_sdxl_vae_full.py b/train_sdxl_vae_full.py new file mode 100644 index 0000000000000000000000000000000000000000..d58e326fd07f43800b55374dde309c7d3c9a92ae --- /dev/null +++ b/train_sdxl_vae_full.py @@ -0,0 +1,590 @@ +# -*- coding: utf-8 -*- +import os +import math +import re +import torch +import numpy as np +import random +import gc +from datetime import datetime +from pathlib import Path + +import torchvision.transforms as transforms +import torch.nn.functional as F +from torch.utils.data import DataLoader, Dataset +from torch.optim.lr_scheduler import LambdaLR +from diffusers import AutoencoderKL, AsymmetricAutoencoderKL +from accelerate import Accelerator +from PIL import Image, UnidentifiedImageError +from tqdm import tqdm +import bitsandbytes as bnb +import wandb +import lpips # pip install lpips +from collections import deque + +# --------------------------- Параметры --------------------------- +ds_path = "/workspace/png" +project = "simple_vae" +batch_size = 3 +base_learning_rate = 5e-5 +min_learning_rate = 9e-7 +num_epochs = 16 +sample_interval_share = 10 +use_wandb = True +save_model = True +use_decay = True +asymmetric = False +optimizer_type = "adam8bit" +dtype = torch.float32 +# model_resolution — то, что подавается в VAE (низкое разрешение) +model_resolution = 512 # бывший `resolution` +# high_resolution — настоящий «высокий» кроп, на котором считаем метрики и сохраняем сэмплы +high_resolution = 512 +limit = 0 +save_barrier = 1.03 +warmup_percent = 0.01 +percentile_clipping = 95 +beta2 = 0.97 +eps = 1e-6 +clip_grad_norm = 1.0 +mixed_precision = "no" # или "fp16"/"bf16" при поддержке +gradient_accumulation_steps = 5 +generated_folder = "samples" +save_as = "simple_vae_nightly" +num_workers = 0 +device = None # accelerator задаст устройство + +# --------------------------- Тренировочные режимы --------------------------- +# CHANGED: добавлен параметр для полного обучения VAE (а не только декодера). +# Если False — поведение прежнее: учим только decoder.* (up_blocks + mid_block). +# Если True — размораживаем ВСЮ модель и добавляем KL-loss для энкодера. +full_training = False + +# CHANGED: добавлен вес (через долю в нормализаторе) для KL, используется только при full_training=True. +kl_ratio = 0.05 # простая доля для KL в общей смеси (KISS). Игнорируется, если full_training=False. + +# --- Пропорции лоссов и окно медианного нормирования (КОЭФ., не значения) --- +# Итоговые доли в total loss (сумма = 1.0 после нормализации). +loss_ratios = { + "lpips": 0.85, + "edge": 0.05, + "mse": 0.05, + "mae": 0.05, + # CHANGED: заранее добавлен ключ "kl" (по умолчанию 0.0). Если включаем full_training — активируем ниже. + "kl": 0.00, +} +median_coeff_steps = 256 # за сколько шагов считать медианные коэффициенты + +# --------------------------- параметры препроцессинга --------------------------- +resize_long_side = 1280 # если None или 0 — ресайза не будет; рекомендовано 1280 + +Path(generated_folder).mkdir(parents=True, exist_ok=True) + +accelerator = Accelerator( + mixed_precision=mixed_precision, + gradient_accumulation_steps=gradient_accumulation_steps +) +device = accelerator.device + +# reproducibility +seed = int(datetime.now().strftime("%Y%m%d")) +torch.manual_seed(seed) +np.random.seed(seed) +random.seed(seed) + +torch.backends.cudnn.benchmark = False + +# --------------------------- WandB --------------------------- +if use_wandb and accelerator.is_main_process: + wandb.init(project=project, config={ + "batch_size": batch_size, + "base_learning_rate": base_learning_rate, + "num_epochs": num_epochs, + "optimizer_type": optimizer_type, + "model_resolution": model_resolution, + "high_resolution": high_resolution, + "gradient_accumulation_steps": gradient_accumulation_steps, + "full_training": full_training, # CHANGED: логируем режим + "kl_ratio": kl_ratio, # CHANGED: логируем долю KL + }) + +# --------------------------- VAE --------------------------- +if model_resolution==high_resolution and not asymmetric: + vae = AutoencoderKL.from_pretrained(project).to(dtype) +else: + vae = AsymmetricAutoencoderKL.from_pretrained(project).to(dtype) + +# torch.compile (если доступно) — просто и без лишней логики +if hasattr(torch, "compile"): + try: + vae = torch.compile(vae) + except Exception as e: + print(f"[WARN] torch.compile failed: {e}") + +# >>> Стратегия заморозки / разморозки +for p in vae.parameters(): + p.requires_grad = False + +decoder = getattr(vae, "decoder", None) +if decoder is None: + raise RuntimeError("vae.decoder not found — не могу применить стратегию разморозки. Проверь структуру модели.") + +unfrozen_param_names = [] + +if not full_training: + # === Прежнее поведение: обучаем только decoder.up_blocks и decoder.mid_block === + if not hasattr(decoder, "up_blocks"): + raise RuntimeError("decoder.up_blocks не найдены — ожидается список блоков декодера.") + + n_up = len(decoder.up_blocks) + start_idx = 0 + for idx in range(start_idx, n_up): + block = decoder.up_blocks[idx] + for name, p in block.named_parameters(): + p.requires_grad = True + unfrozen_param_names.append(f"decoder.up_blocks.{idx}.{name}") + + if hasattr(decoder, "mid_block"): + for name, p in decoder.mid_block.named_parameters(): + p.requires_grad = True + unfrozen_param_names.append(f"decoder.mid_block.{name}") + else: + print("[WARN] decoder.mid_block не найден — mid_block не разморожен.") + + # Обучаем только декодер + trainable_module = vae.decoder +else: + # === CHANGED: Полное обучение — размораживаем ВСЕ слои VAE (и энкодер, и декодер, и пост-проекцию) === + for name, p in vae.named_parameters(): + p.requires_grad = True + unfrozen_param_names.append(name) + trainable_module = vae # CHANGED: учим всю модель + + # CHANGED: активируем KL-долю в нормализаторе + loss_ratios["kl"] = float(kl_ratio) + +print(f"[INFO] Разморожено параметров: {len(unfrozen_param_names)}. Первые 200 имён:") +for nm in unfrozen_param_names[:200]: + print(" ", nm) + +# --------------------------- Custom PNG Dataset (only .png, skip corrupted) ----------- +class PngFolderDataset(Dataset): + def __init__(self, root_dir, min_exts=('.png',), resolution=1024, limit=0): + self.root_dir = root_dir + self.resolution = resolution + self.paths = [] + # collect png files recursively + for root, _, files in os.walk(root_dir): + for fname in files: + if fname.lower().endswith(tuple(ext.lower() for ext in min_exts)): + self.paths.append(os.path.join(root, fname)) + # optional limit + if limit: + self.paths = self.paths[:limit] + # verify images and keep only valid ones + valid = [] + for p in self.paths: + try: + with Image.open(p) as im: + im.verify() # fast check for truncated/corrupted images + valid.append(p) + except (OSError, UnidentifiedImageError): + # skip corrupted image + continue + self.paths = valid + if len(self.paths) == 0: + raise RuntimeError(f"No valid PNG images found under {root_dir}") + # final shuffle for randomness + random.shuffle(self.paths) + + def __len__(self): + return len(self.paths) + + def __getitem__(self, idx): + p = self.paths[idx % len(self.paths)] + # open and convert to RGB; ensure file is closed promptly + with Image.open(p) as img: + img = img.convert("RGB") + # пережимаем длинную сторону до resize_long_side (Lanczos) + if not resize_long_side or resize_long_side <= 0: + return img + w, h = img.size + long = max(w, h) + if long <= resize_long_side: + return img + scale = resize_long_side / float(long) + new_w = int(round(w * scale)) + new_h = int(round(h * scale)) + return img.resize((new_w, new_h), Image.LANCZOS) + +# --------------------------- Датасет и трансформы --------------------------- + +def random_crop(img, sz): + w, h = img.size + if w < sz or h < sz: + img = img.resize((max(sz, w), max(sz, h)), Image.LANCZOS) + x = random.randint(0, max(1, img.width - sz)) + y = random.randint(0, max(1, img.height - sz)) + return img.crop((x, y, x + sz, y + sz)) + +tfm = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) +]) + +# build dataset using high_resolution crops +dataset = PngFolderDataset(ds_path, min_exts=('.png',), resolution=high_resolution, limit=limit) +if len(dataset) < batch_size: + raise RuntimeError(f"Not enough valid images ({len(dataset)}) to form a batch of size {batch_size}") + +# collate_fn кропит до high_resolution +def collate_fn(batch): + imgs = [] + for img in batch: # img is PIL.Image + img = random_crop(img, high_resolution) # кропим high-res + imgs.append(tfm(img)) + return torch.stack(imgs) + +dataloader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=True, + collate_fn=collate_fn, + num_workers=num_workers, + pin_memory=True, + drop_last=True +) + +# --------------------------- Оптимизатор --------------------------- + +def get_param_groups(module, weight_decay=0.001): + no_decay = ["bias", "LayerNorm.weight", "layer_norm.weight", "ln_1.weight", "ln_f.weight"] + decay_params = [] + no_decay_params = [] + for n, p in module.named_parameters(): + if not p.requires_grad: + continue + if any(nd in n for nd in no_decay): + no_decay_params.append(p) + else: + decay_params.append(p) + return [ + {"params": decay_params, "weight_decay": weight_decay}, + {"params": no_decay_params, "weight_decay": 0.0}, + ] + +def create_optimizer(name, param_groups): + if name == "adam8bit": + return bnb.optim.AdamW8bit( + param_groups, lr=base_learning_rate, betas=(0.9, beta2), eps=eps + ) + raise ValueError(name) + +param_groups = get_param_groups(trainable_module, weight_decay=0.001) +optimizer = create_optimizer(optimizer_type, param_groups) + +# --------------------------- График LR --------------------------- + +batches_per_epoch = len(dataloader) # число микро-батчей (dataloader steps) +steps_per_epoch = int(math.ceil(batches_per_epoch / float(gradient_accumulation_steps))) # число optimizer.step() за эпоху +total_steps = steps_per_epoch * num_epochs + +def lr_lambda(step): + if not use_decay: + return 1.0 + x = float(step) / float(max(1, total_steps)) + warmup = float(warmup_percent) + min_ratio = float(min_learning_rate) / float(base_learning_rate) + if x < warmup: + return min_ratio + (1.0 - min_ratio) * (x / warmup) + decay_ratio = (x - warmup) / (1.0 - warmup) + return min_ratio + 0.5 * (1.0 - min_ratio) * (1.0 + math.cos(math.pi * decay_ratio)) + +scheduler = LambdaLR(optimizer, lr_lambda) + +# Подготовка +dataloader, vae, optimizer, scheduler = accelerator.prepare(dataloader, vae, optimizer, scheduler) + +# CHANGED: формируем список trainable_params исходя из выбранного trainable_module +trainable_params = [p for p in (trainable_module.parameters() if hasattr(trainable_module, "parameters") else []) if p.requires_grad] + +# --------------------------- LPIPS и вспомогательные функции --------------------------- +_lpips_net = None + +def _get_lpips(): + global _lpips_net + if _lpips_net is None: + _lpips_net = lpips.LPIPS(net='vgg', verbose=False).eval().to(accelerator.device).eval() + return _lpips_net + +# Собель для edge loss +_sobel_kx = torch.tensor([[[[-1,0,1],[-2,0,2],[-1,0,1]]]], dtype=torch.float32) +_sobel_ky = torch.tensor([[[[-1,-2,-1],[0,0,0],[1,2,1]]]], dtype=torch.float32) + +def sobel_edges(x: torch.Tensor) -> torch.Tensor: + # x: [B,C,H,W] в [-1,1] + C = x.shape[1] + kx = _sobel_kx.to(x.device, x.dtype).repeat(C, 1, 1, 1) + ky = _sobel_ky.to(x.device, x.dtype).repeat(C, 1, 1, 1) + gx = F.conv2d(x, kx, padding=1, groups=C) + gy = F.conv2d(x, ky, padding=1, groups=C) + return torch.sqrt(gx * gx + gy * gy + 1e-12) + +# Нормализация лоссов по медианам: считаем КОЭФФИЦИЕНТЫ +class MedianLossNormalizer: + def __init__(self, desired_ratios: dict, window_steps: int): + # нормируем доли на случай, если сумма != 1 + s = sum(desired_ratios.values()) + self.ratios = {k: (v / s) if s > 0 else 0.0 for k, v in desired_ratios.items()} + self.buffers = {k: deque(maxlen=window_steps) for k in self.ratios.keys()} + self.window = window_steps + + def update_and_total(self, abs_losses: dict): + # Заполняем буферы фактическими АБСОЛЮТНЫМИ значениями лоссов + for k, v in abs_losses.items(): + if k in self.buffers: + self.buffers[k].append(float(v.detach().abs().cpu())) + # Медианы (устойчивые к выбросам) + meds = {k: (np.median(self.buffers[k]) if len(self.buffers[k]) > 0 else 1.0) for k in self.buffers} + # Вычисляем КОЭФФИЦИЕНТЫ как ratio_k / median_k — т.е. именно коэффициенты, а не значения + coeffs = {k: (self.ratios[k] / max(meds[k], 1e-12)) for k in self.ratios} + # Итоговый total — сумма по ключам, присутствующим в abs_losses + total = sum(coeffs[k] * abs_losses[k] for k in abs_losses if k in coeffs) + return total, coeffs, meds + +# CHANGED: создаём нормализатор ПОСЛЕ возможной активации kl_ratio выше +normalizer = MedianLossNormalizer(loss_ratios, median_coeff_steps) + +# --------------------------- Сэмплы --------------------------- +@torch.no_grad() +def get_fixed_samples(n=3): + idx = random.sample(range(len(dataset)), min(n, len(dataset))) + pil_imgs = [dataset[i] for i in idx] # dataset returns PIL.Image + tensors = [] + for img in pil_imgs: + img = random_crop(img, high_resolution) # high-res fixed samples + tensors.append(tfm(img)) + return torch.stack(tensors).to(accelerator.device, dtype) + +fixed_samples = get_fixed_samples() + +@torch.no_grad() +def _to_pil_uint8(img_tensor: torch.Tensor) -> Image.Image: + # img_tensor: [C,H,W] in [-1,1] + arr = ((img_tensor.float().clamp(-1, 1) + 1.0) * 127.5).clamp(0, 255).byte().cpu().numpy().transpose(1, 2, 0) + return Image.fromarray(arr) + +@torch.no_grad() +def generate_and_save_samples(step=None): + try: + temp_vae = accelerator.unwrap_model(vae).eval() + lpips_net = _get_lpips() + with torch.no_grad(): + # Готовим low-res вход для кодера ВСЕГДА под model_resolution + orig_high = fixed_samples # [B,C,H,W] в [-1,1] + orig_low = F.interpolate(orig_high, size=(model_resolution, model_resolution), mode="bilinear", align_corners=False) + # dtype как у модели + model_dtype = next(temp_vae.parameters()).dtype + orig_low = orig_low.to(dtype=model_dtype) + # encode/decode + # CHANGED: при валидации/сэмплах всегда используем mean (стабильно и детерминированно) + enc = temp_vae.encode(orig_low) + latents_mean = enc.latent_dist.mean + rec = temp_vae.decode(latents_mean).sample + + # Приводим spatial размер рекона к high-res (downsample для асимметричных VAE) + if rec.shape[-2:] != orig_high.shape[-2:]: + rec = F.interpolate(rec, size=orig_high.shape[-2:], mode="bilinear", align_corners=False) + + # Сохраняем ПЕРВЫЙ семпл: real и decoded без номера шага в имени + first_real = _to_pil_uint8(orig_high[0]) + first_dec = _to_pil_uint8(rec[0]) + first_real.save(f"{generated_folder}/sample_real.jpg", quality=95) + first_dec.save(f"{generated_folder}/sample_decoded.jpg", quality=95) + + # Дополнительно сохраняем текущие реконструкции без номера шага (чтобы не плодить файлы — будут перезаписываться) + for i in range(rec.shape[0]): + _to_pil_uint8(rec[i]).save(f"{generated_folder}/sample_{i}.jpg", quality=95) + + # LPIPS на полном изображении (high-res) — для лога + lpips_scores = [] + for i in range(rec.shape[0]): + orig_full = orig_high[i:i+1].to(torch.float32) + rec_full = rec[i:i+1].to(torch.float32) + if rec_full.shape[-2:] != orig_full.shape[-2:]: + rec_full = F.interpolate(rec_full, size=orig_full.shape[-2:], mode="bilinear", align_corners=False) + lpips_val = lpips_net(orig_full, rec_full).item() + lpips_scores.append(lpips_val) + avg_lpips = float(np.mean(lpips_scores)) + + if use_wandb and accelerator.is_main_process: + wandb.log({ + "lpips_mean": avg_lpips, + }, step=step) + finally: + gc.collect() + torch.cuda.empty_cache() + +if accelerator.is_main_process and save_model: + print("Генерация сэмплов до старта обучения...") + generate_and_save_samples(0) + +accelerator.wait_for_everyone() + +# --------------------------- Тренировка --------------------------- + +progress = tqdm(total=total_steps, disable=not accelerator.is_local_main_process) +global_step = 0 +min_loss = float("inf") +sample_interval = max(1, total_steps // max(1, sample_interval_share * num_epochs)) + +for epoch in range(num_epochs): + vae.train() + batch_losses = [] + batch_grads = [] + # Доп. трекинг по отдельным лоссам + track_losses = {k: [] for k in loss_ratios.keys()} + for imgs in dataloader: + with accelerator.accumulate(vae): + # imgs: high-res tensor from dataloader ([-1,1]), move to device + imgs = imgs.to(accelerator.device) + + # ВСЕГДА даунсемплим вход под model_resolution для кодера + if high_resolution != model_resolution: + imgs_low = F.interpolate(imgs, size=(model_resolution, model_resolution), mode="bilinear", align_corners=False) + else: + imgs_low = imgs + + # ensure dtype matches model params to avoid float/half mismatch + model_dtype = next(vae.parameters()).dtype + imgs_low_model = imgs_low.to(dtype=model_dtype) if imgs_low.dtype != model_dtype else imgs_low + + # Encode/decode + enc = vae.encode(imgs_low_model) + + # CHANGED: если тренируем всю модель — используем reparameterization sample() + # это важно для стохастичности и согласованности с KL. + latents = enc.latent_dist.sample() if full_training else enc.latent_dist.mean + + rec = vae.decode(latents).sample # rec может быть увеличенным (асимметричный VAE) + + # Приводим размер к high-res + if rec.shape[-2:] != imgs.shape[-2:]: + rec = F.interpolate(rec, size=imgs.shape[-2:], mode="bilinear", align_corners=False) + + # Лоссы считаем на high-res + rec_f32 = rec.to(torch.float32) + imgs_f32 = imgs.to(torch.float32) + + # Отдельные лоссы (абсолютные значения) + abs_losses = { + "mae": F.l1_loss(rec_f32, imgs_f32), + "mse": F.mse_loss(rec_f32, imgs_f32), + "lpips": _get_lpips()(rec_f32, imgs_f32).mean(), + "edge": F.l1_loss(sobel_edges(rec_f32), sobel_edges(imgs_f32)), + } + + # CHANGED: KL-loss добавляется ТОЛЬКО при полном обучении. + # KL(q(z|x) || N(0,1)) = -0.5 * sum(1 + logσ^2 - μ^2 - σ^2). + if full_training: + mean = enc.latent_dist.mean + logvar = enc.latent_dist.logvar + # стабильное усреднение по батчу и пространству + kl = -0.5 * torch.mean(1 + logvar - mean.pow(2) - logvar.exp()) + abs_losses["kl"] = kl + else: + # ключ присутствует в ratios, но при partial-training его доля = 0 и он не влияет + abs_losses["kl"] = torch.tensor(0.0, device=accelerator.device, dtype=torch.float32) + + # Total с медианными КОЭФФИЦИЕНТАМИ + total_loss, coeffs, meds = normalizer.update_and_total(abs_losses) + + if torch.isnan(total_loss) or torch.isinf(total_loss): + print("NaN/Inf loss – stopping") + raise RuntimeError("NaN/Inf loss") + + accelerator.backward(total_loss) + + grad_norm = torch.tensor(0.0, device=accelerator.device) + if accelerator.sync_gradients: + grad_norm = accelerator.clip_grad_norm_(trainable_params, clip_grad_norm) + optimizer.step() + scheduler.step() + optimizer.zero_grad(set_to_none=True) + + global_step += 1 + progress.update(1) + + # --- Логирование --- + if accelerator.is_main_process: + try: + current_lr = optimizer.param_groups[0]["lr"] + except Exception: + current_lr = scheduler.get_last_lr()[0] + + batch_losses.append(total_loss.detach().item()) + # CHANGED: корректно извлекаем scalar из разн. типов + if isinstance(grad_norm, torch.Tensor): + batch_grads.append(float(grad_norm.detach().cpu().item())) + else: + batch_grads.append(float(grad_norm)) + + for k, v in abs_losses.items(): + track_losses[k].append(float(v.detach().item())) + + if use_wandb and accelerator.sync_gradients: + log_dict = { + "total_loss": float(total_loss.detach().item()), + "learning_rate": current_lr, + "epoch": epoch, + "grad_norm": batch_grads[-1], + "mode/full_training": int(full_training), # CHANGED: для наглядности в логах + } + # добавляем отдельные лоссы + for k, v in abs_losses.items(): + log_dict[f"loss_{k}"] = float(v.detach().item()) + # логи коэффициентов и медиан + for k in coeffs: + log_dict[f"coeff_{k}"] = float(coeffs[k]) + log_dict[f"median_{k}"] = float(meds[k]) + wandb.log(log_dict, step=global_step) + + # периодические сэмплы и чекпоинты + if global_step > 0 and global_step % sample_interval == 0: + if accelerator.is_main_process: + generate_and_save_samples(global_step) + accelerator.wait_for_everyone() + + # Средние по последним итерациям + n_micro = sample_interval * gradient_accumulation_steps + if len(batch_losses) >= n_micro: + avg_loss = float(np.mean(batch_losses[-n_micro:])) + else: + avg_loss = float(np.mean(batch_losses)) if batch_losses else float("nan") + + avg_grad = float(np.mean(batch_grads[-n_micro:])) if len(batch_grads) >= 1 else float(np.mean(batch_grads)) if batch_grads else 0.0 + + if accelerator.is_main_process: + print(f"Epoch {epoch} step {global_step} loss: {avg_loss:.6f}, grad_norm: {avg_grad:.6f}, lr: {current_lr:.9f}") + if save_model and avg_loss < min_loss * save_barrier: + min_loss = avg_loss + accelerator.unwrap_model(vae).save_pretrained(save_as) + if use_wandb: + wandb.log({"interm_loss": avg_loss, "interm_grad": avg_grad}, step=global_step) + + if accelerator.is_main_process: + epoch_avg = float(np.mean(batch_losses)) if batch_losses else float("nan") + print(f"Epoch {epoch} done, avg loss {epoch_avg:.6f}") + if use_wandb: + wandb.log({"epoch_loss": epoch_avg, "epoch": epoch + 1}, step=global_step) + +# --------------------------- Финальное сохранение --------------------------- +if accelerator.is_main_process: + print("Training finished – saving final model") + if save_model: + accelerator.unwrap_model(vae).save_pretrained(save_as) + +accelerator.free_memory() +if torch.distributed.is_initialized(): + torch.distributed.destroy_process_group() +print("Готово!") diff --git a/train_sdxl_vae_simple.py b/train_sdxl_vae_simple.py new file mode 100644 index 0000000000000000000000000000000000000000..bc1379bce53730b3c70e554c281f3ae47db6e1de --- /dev/null +++ b/train_sdxl_vae_simple.py @@ -0,0 +1,547 @@ +# -*- coding: utf-8 -*- +import os +import math +import re +import torch +import numpy as np +import random +import gc +from datetime import datetime +from pathlib import Path + +import torchvision.transforms as transforms +import torch.nn.functional as F +from torch.utils.data import DataLoader, Dataset +from torch.optim.lr_scheduler import LambdaLR +from diffusers import AutoencoderKL, AsymmetricAutoencoderKL +from accelerate import Accelerator +from PIL import Image, UnidentifiedImageError +from tqdm import tqdm +import bitsandbytes as bnb +import wandb +import lpips # pip install lpips +from collections import deque + +# --------------------------- Параметры --------------------------- +ds_path = "/workspace/png" +project = "simple_vae" +batch_size = 3 +base_learning_rate = 5e-5 +min_learning_rate = 9e-7 +num_epochs = 16 +sample_interval_share = 10 +use_wandb = True +save_model = True +use_decay = True +asymmetric = False +optimizer_type = "adam8bit" +dtype = torch.float32 +# model_resolution — то, что подавается в VAE (низкое разрешение) +model_resolution = 512 # бывший `resolution` +# high_resolution — настоящий «высокий» кроп, на котором считаем метрики и сохраняем сэмплы +high_resolution = 512 +limit = 0 +save_barrier = 1.03 +warmup_percent = 0.01 +percentile_clipping = 95 +beta2 = 0.97 +eps = 1e-6 +clip_grad_norm = 1.0 +mixed_precision = "no" # или "fp16"/"bf16" при поддержке +gradient_accumulation_steps = 5 +generated_folder = "samples" +save_as = "simple_vae_nightly" +num_workers = 0 +device = None # accelerator задаст устройство + +# --- Пропорции лоссов и окно медианного нормирования (КОЭФ., не значения) --- +# Итоговые доли в total loss (сумма = 1.0) +loss_ratios = { + "lpips": 0.85, + "edge": 0.05, + "mse": 0.05, + "mae": 0.05, +} +median_coeff_steps = 256 # за сколько шагов считать медианные коэффициенты + +# --------------------------- параметры препроцессинга --------------------------- +resize_long_side = 1280 # если None или 0 — ресайза не будет; рекомендовано 1280 + +Path(generated_folder).mkdir(parents=True, exist_ok=True) + +accelerator = Accelerator( + mixed_precision=mixed_precision, + gradient_accumulation_steps=gradient_accumulation_steps +) +device = accelerator.device + +# reproducibility +seed = int(datetime.now().strftime("%Y%m%d")) +torch.manual_seed(seed) +np.random.seed(seed) +random.seed(seed) + +torch.backends.cudnn.benchmark = True + +# --------------------------- WandB --------------------------- +if use_wandb and accelerator.is_main_process: + wandb.init(project=project, config={ + "batch_size": batch_size, + "base_learning_rate": base_learning_rate, + "num_epochs": num_epochs, + "optimizer_type": optimizer_type, + "model_resolution": model_resolution, + "high_resolution": high_resolution, + "gradient_accumulation_steps": gradient_accumulation_steps, + }) + +# --------------------------- VAE --------------------------- +if model_resolution==high_resolution and not asymmetric: + vae = AutoencoderKL.from_pretrained(project).to(dtype) +else: + vae = AsymmetricAutoencoderKL.from_pretrained(project).to(dtype) + +# torch.compile (если доступно) — просто и без лишней логики +if hasattr(torch, "compile"): + try: + vae = torch.compile(vae) + except Exception as e: + print(f"[WARN] torch.compile failed: {e}") + +# >>> Заморозка всех параметров, затем выборочная разморозка +for p in vae.parameters(): + p.requires_grad = False + +decoder = getattr(vae, "decoder", None) +if decoder is None: + raise RuntimeError("vae.decoder not found — не могу применить стратегию разморозки. Проверь структуру модели.") + +unfrozen_param_names = [] + +if not hasattr(decoder, "up_blocks"): + raise RuntimeError("decoder.up_blocks не найдены — ожидается список блоков декодера.") + +# >>> Размораживаем все up_blocks и mid_block (как было в твоём варианте start_idx=0) +n_up = len(decoder.up_blocks) +start_idx = 0 +for idx in range(start_idx, n_up): + block = decoder.up_blocks[idx] + for name, p in block.named_parameters(): + p.requires_grad = True + unfrozen_param_names.append(f"decoder.up_blocks.{idx}.{name}") + +if hasattr(decoder, "mid_block"): + for name, p in decoder.mid_block.named_parameters(): + p.requires_grad = True + unfrozen_param_names.append(f"decoder.mid_block.{name}") +else: + print("[WARN] decoder.mid_block не найден — mid_block не разморожен.") + +print(f"[INFO] Разморожено параметров: {len(unfrozen_param_names)}. Первые 200 имён:") +for nm in unfrozen_param_names[:200]: + print(" ", nm) + +# сохраняем trainable_module (get_param_groups будет учитывать p.requires_grad) +trainable_module = vae.decoder + +# --------------------------- Custom PNG Dataset (only .png, skip corrupted) ----------- +class PngFolderDataset(Dataset): + def __init__(self, root_dir, min_exts=('.png',), resolution=1024, limit=0): + self.root_dir = root_dir + self.resolution = resolution + self.paths = [] + # collect png files recursively + for root, _, files in os.walk(root_dir): + for fname in files: + if fname.lower().endswith(tuple(ext.lower() for ext in min_exts)): + self.paths.append(os.path.join(root, fname)) + # optional limit + if limit: + self.paths = self.paths[:limit] + # verify images and keep only valid ones + valid = [] + for p in self.paths: + try: + with Image.open(p) as im: + im.verify() # fast check for truncated/corrupted images + valid.append(p) + except (OSError, UnidentifiedImageError): + # skip corrupted image + continue + self.paths = valid + if len(self.paths) == 0: + raise RuntimeError(f"No valid PNG images found under {root_dir}") + # final shuffle for randomness + random.shuffle(self.paths) + + def __len__(self): + return len(self.paths) + + def __getitem__(self, idx): + p = self.paths[idx % len(self.paths)] + # open and convert to RGB; ensure file is closed promptly + with Image.open(p) as img: + img = img.convert("RGB") + # пережимаем длинную сторону до resize_long_side (Lanczos) + if not resize_long_side or resize_long_side <= 0: + return img + w, h = img.size + long = max(w, h) + if long <= resize_long_side: + return img + scale = resize_long_side / float(long) + new_w = int(round(w * scale)) + new_h = int(round(h * scale)) + return img.resize((new_w, new_h), Image.LANCZOS) + +# --------------------------- Датасет и трансформы --------------------------- + +def random_crop(img, sz): + w, h = img.size + if w < sz or h < sz: + img = img.resize((max(sz, w), max(sz, h)), Image.LANCZOS) + x = random.randint(0, max(1, img.width - sz)) + y = random.randint(0, max(1, img.height - sz)) + return img.crop((x, y, x + sz, y + sz)) + +tfm = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) +]) + +# build dataset using high_resolution crops +dataset = PngFolderDataset(ds_path, min_exts=('.png',), resolution=high_resolution, limit=limit) +if len(dataset) < batch_size: + raise RuntimeError(f"Not enough valid images ({len(dataset)}) to form a batch of size {batch_size}") + +# collate_fn кропит до high_resolution + +def collate_fn(batch): + imgs = [] + for img in batch: # img is PIL.Image + img = random_crop(img, high_resolution) # кропим high-res + imgs.append(tfm(img)) + return torch.stack(imgs) + +dataloader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=True, + collate_fn=collate_fn, + num_workers=num_workers, + pin_memory=True, + drop_last=True +) + +# --------------------------- Оптимизатор --------------------------- + +def get_param_groups(module, weight_decay=0.001): + no_decay = ["bias", "LayerNorm.weight", "layer_norm.weight", "ln_1.weight", "ln_f.weight"] + decay_params = [] + no_decay_params = [] + for n, p in module.named_parameters(): + if not p.requires_grad: + continue + if any(nd in n for nd in no_decay): + no_decay_params.append(p) + else: + decay_params.append(p) + return [ + {"params": decay_params, "weight_decay": weight_decay}, + {"params": no_decay_params, "weight_decay": 0.0}, + ] + +def create_optimizer(name, param_groups): + if name == "adam8bit": + return bnb.optim.AdamW8bit( + param_groups, lr=base_learning_rate, betas=(0.9, beta2), eps=eps + ) + raise ValueError(name) + +param_groups = get_param_groups(trainable_module, weight_decay=0.001) +optimizer = create_optimizer(optimizer_type, param_groups) + +# --------------------------- Подготовка Accelerate (вместе) --------------------------- + +batches_per_epoch = len(dataloader) # число микро-батчей (dataloader steps) +steps_per_epoch = int(math.ceil(batches_per_epoch / float(gradient_accumulation_steps))) # число optimizer.step() за эпоху +total_steps = steps_per_epoch * num_epochs + + +def lr_lambda(step): + if not use_decay: + return 1.0 + x = float(step) / float(max(1, total_steps)) + warmup = float(warmup_percent) + min_ratio = float(min_learning_rate) / float(base_learning_rate) + if x < warmup: + return min_ratio + (1.0 - min_ratio) * (x / warmup) + decay_ratio = (x - warmup) / (1.0 - warmup) + return min_ratio + 0.5 * (1.0 - min_ratio) * (1.0 + math.cos(math.pi * decay_ratio)) + +scheduler = LambdaLR(optimizer, lr_lambda) + +# Подготовка +dataloader, vae, optimizer, scheduler = accelerator.prepare(dataloader, vae, optimizer, scheduler) + +trainable_params = [p for p in vae.decoder.parameters() if p.requires_grad] + +# --------------------------- LPIPS и вспомогательные функции --------------------------- +_lpips_net = None + +def _get_lpips(): + global _lpips_net + if _lpips_net is None: + _lpips_net = lpips.LPIPS(net='vgg', verbose=False).eval().to(accelerator.device).eval() + return _lpips_net + +# Собель для edge loss +_sobel_kx = torch.tensor([[[[-1,0,1],[-2,0,2],[-1,0,1]]]], dtype=torch.float32) +_sobel_ky = torch.tensor([[[[-1,-2,-1],[0,0,0],[1,2,1]]]], dtype=torch.float32) + +def sobel_edges(x: torch.Tensor) -> torch.Tensor: + # x: [B,C,H,W] в [-1,1] + C = x.shape[1] + kx = _sobel_kx.to(x.device, x.dtype).repeat(C, 1, 1, 1) + ky = _sobel_ky.to(x.device, x.dtype).repeat(C, 1, 1, 1) + gx = F.conv2d(x, kx, padding=1, groups=C) + gy = F.conv2d(x, ky, padding=1, groups=C) + return torch.sqrt(gx * gx + gy * gy + 1e-12) + +# Нормализация лоссов по медианам: считаем КОЭФФИЦИЕНТЫ +class MedianLossNormalizer: + def __init__(self, desired_ratios: dict, window_steps: int): + # нормируем доли на случай, если сумма != 1 + s = sum(desired_ratios.values()) + self.ratios = {k: (v / s) for k, v in desired_ratios.items()} + self.buffers = {k: deque(maxlen=window_steps) for k in self.ratios.keys()} + self.window = window_steps + + def update_and_total(self, abs_losses: dict): + # Заполняем буферы фактическими АБСОЛЮТНЫМИ значениями лоссов + for k, v in abs_losses.items(): + if k in self.buffers: + self.buffers[k].append(float(v.detach().cpu())) + # Медианы (устойчивые к выбросам) + meds = {k: (np.median(self.buffers[k]) if len(self.buffers[k]) > 0 else 1.0) for k in self.buffers} + # Вычисляем КОЭФФИЦИЕНТЫ как ratio_k / median_k — т.е. именно коэффициенты, а не значения + coeffs = {k: (self.ratios[k] / max(meds[k], 1e-12)) for k in self.ratios} + # Важно: при таких коэффициентах сумма (coeff_k * median_k) = сумма(ratio_k) = 1, т.е. масштаб стабилен + total = sum(coeffs[k] * abs_losses[k] for k in coeffs) + return total, coeffs, meds + +normalizer = MedianLossNormalizer(loss_ratios, median_coeff_steps) + +# --------------------------- Сэмплы --------------------------- +@torch.no_grad() +def get_fixed_samples(n=3): + idx = random.sample(range(len(dataset)), min(n, len(dataset))) + pil_imgs = [dataset[i] for i in idx] # dataset returns PIL.Image + tensors = [] + for img in pil_imgs: + img = random_crop(img, high_resolution) # high-res fixed samples + tensors.append(tfm(img)) + return torch.stack(tensors).to(accelerator.device, dtype) + +fixed_samples = get_fixed_samples() + +@torch.no_grad() +def _to_pil_uint8(img_tensor: torch.Tensor) -> Image.Image: + # img_tensor: [C,H,W] in [-1,1] + arr = ((img_tensor.float().clamp(-1, 1) + 1.0) * 127.5).clamp(0, 255).byte().cpu().numpy().transpose(1, 2, 0) + return Image.fromarray(arr) + +@torch.no_grad() +def generate_and_save_samples(step=None): + try: + temp_vae = accelerator.unwrap_model(vae).eval() + lpips_net = _get_lpips() + with torch.no_grad(): + # Готовим low-res вход для кодера ВСЕГДА под model_resolution + orig_high = fixed_samples # [B,C,H,W] в [-1,1] + orig_low = F.interpolate(orig_high, size=(model_resolution, model_resolution), mode="bilinear", align_corners=False) + # dtype как у модели + model_dtype = next(temp_vae.parameters()).dtype + orig_low = orig_low.to(dtype=model_dtype) + # encode/decode + latents = temp_vae.encode(orig_low).latent_dist.mean + rec = temp_vae.decode(latents).sample + + # Приводим spatial размер рекона к high-res (downsample для асимметричных VAE) + if rec.shape[-2:] != orig_high.shape[-2:]: + rec = F.interpolate(rec, size=orig_high.shape[-2:], mode="bilinear", align_corners=False) + + # Сохраняем ПЕРВЫЙ семпл: real и decoded без номера шага в имени + first_real = _to_pil_uint8(orig_high[0]) + first_dec = _to_pil_uint8(rec[0]) + first_real.save(f"{generated_folder}/sample_real.jpg", quality=95) + first_dec.save(f"{generated_folder}/sample_decoded.jpg", quality=95) + + # Дополнительно сохраняем текущие реконструкции без номера шага (чтобы не плодить файлы — будут перезаписываться) + for i in range(rec.shape[0]): + _to_pil_uint8(rec[i]).save(f"{generated_folder}/sample_{i}.jpg", quality=95) + + # LPIPS на полном изображении (high-res) — для лога + lpips_scores = [] + for i in range(rec.shape[0]): + orig_full = orig_high[i:i+1].to(torch.float32) + rec_full = rec[i:i+1].to(torch.float32) + if rec_full.shape[-2:] != orig_full.shape[-2:]: + rec_full = F.interpolate(rec_full, size=orig_full.shape[-2:], mode="bilinear", align_corners=False) + lpips_val = lpips_net(orig_full, rec_full).item() + lpips_scores.append(lpips_val) + avg_lpips = float(np.mean(lpips_scores)) + + if use_wandb and accelerator.is_main_process: + wandb.log({ + "lpips_mean": avg_lpips, + }, step=step) + finally: + gc.collect() + torch.cuda.empty_cache() + +if accelerator.is_main_process and save_model: + print("Генерация сэмплов до старта обучения...") + generate_and_save_samples(0) + +accelerator.wait_for_everyone() + +# --------------------------- Тренировка --------------------------- + +progress = tqdm(total=total_steps, disable=not accelerator.is_local_main_process) +global_step = 0 +min_loss = float("inf") +sample_interval = max(1, total_steps // max(1, sample_interval_share * num_epochs)) + +for epoch in range(num_epochs): + vae.train() + batch_losses = [] + batch_grads = [] + # Доп. трекинг по отдельным лоссам + track_losses = {k: [] for k in loss_ratios.keys()} + for imgs in dataloader: + with accelerator.accumulate(vae): + # imgs: high-res tensor from dataloader ([-1,1]), move to device + imgs = imgs.to(accelerator.device) + + # ВСЕГДА даунсемплим вход под model_resolution для кодера + # Тупая железяка норовит все по своему сделать + if high_resolution != model_resolution: + imgs_low = F.interpolate(imgs, size=(model_resolution, model_resolution), mode="bilinear", align_corners=False) + else: + imgs_low = imgs + + # ensure dtype matches model params to avoid float/half mismatch + model_dtype = next(vae.parameters()).dtype + if imgs_low.dtype != model_dtype: + imgs_low_model = imgs_low.to(dtype=model_dtype) + else: + imgs_low_model = imgs_low + + # Encode/decode + latents = vae.encode(imgs_low_model).latent_dist.mean + rec = vae.decode(latents).sample # rec может быть увеличенным (асимметричный VAE) + + # Приводим размер к high-res + if rec.shape[-2:] != imgs.shape[-2:]: + rec = F.interpolate(rec, size=imgs.shape[-2:], mode="bilinear", align_corners=False) + + # Лоссы считаем на high-res + rec_f32 = rec.to(torch.float32) + imgs_f32 = imgs.to(torch.float32) + + # Отдельные лоссы + abs_losses = { + "mae": F.l1_loss(rec_f32, imgs_f32), + "mse": F.mse_loss(rec_f32, imgs_f32), + "lpips": _get_lpips()(rec_f32, imgs_f32).mean(), + "edge": F.l1_loss(sobel_edges(rec_f32), sobel_edges(imgs_f32)), + } + + # Total с медианными КОЭФФИЦИЕНТАМИ + # Не надо так орать когда у тебя получилось понять мою идею + total_loss, coeffs, meds = normalizer.update_and_total(abs_losses) + + if torch.isnan(total_loss) or torch.isinf(total_loss): + print("NaN/Inf loss – stopping") + raise RuntimeError("NaN/Inf loss") + + accelerator.backward(total_loss) + + grad_norm = torch.tensor(0.0, device=accelerator.device) + if accelerator.sync_gradients: + grad_norm = accelerator.clip_grad_norm_(trainable_params, clip_grad_norm) + optimizer.step() + scheduler.step() + optimizer.zero_grad(set_to_none=True) + + global_step += 1 + progress.update(1) + + # --- Логирование --- + if accelerator.is_main_process: + try: + current_lr = optimizer.param_groups[0]["lr"] + except Exception: + current_lr = scheduler.get_last_lr()[0] + + batch_losses.append(total_loss.detach().item()) + batch_grads.append(float(grad_norm if isinstance(grad_norm, (float, int)) else grad_norm.cpu().item())) + for k, v in abs_losses.items(): + track_losses[k].append(float(v.detach().item())) + + if use_wandb and accelerator.sync_gradients: + log_dict = { + "total_loss": float(total_loss.detach().item()), + "learning_rate": current_lr, + "epoch": epoch, + "grad_norm": batch_grads[-1], + } + # добавляем отдельные лоссы + for k, v in abs_losses.items(): + log_dict[f"loss_{k}"] = float(v.detach().item()) + # логи коэффициентов и медиан + for k in coeffs: + log_dict[f"coeff_{k}"] = float(coeffs[k]) + log_dict[f"median_{k}"] = float(meds[k]) + wandb.log(log_dict, step=global_step) + + # периодические сэмплы и чекпоинты + if global_step > 0 and global_step % sample_interval == 0: + if accelerator.is_main_process: + generate_and_save_samples(global_step) + accelerator.wait_for_everyone() + + # Средние по последним итерациям + n_micro = sample_interval * gradient_accumulation_steps + if len(batch_losses) >= n_micro: + avg_loss = float(np.mean(batch_losses[-n_micro:])) + else: + avg_loss = float(np.mean(batch_losses)) if batch_losses else float("nan") + + avg_grad = float(np.mean(batch_grads[-n_micro:])) if len(batch_grads) >= 1 else float(np.mean(batch_grads)) if batch_grads else 0.0 + + if accelerator.is_main_process: + print(f"Epoch {epoch} step {global_step} loss: {avg_loss:.6f}, grad_norm: {avg_grad:.6f}, lr: {current_lr:.9f}") + if save_model and avg_loss < min_loss * save_barrier: + min_loss = avg_loss + accelerator.unwrap_model(vae).save_pretrained(save_as) + if use_wandb: + wandb.log({"interm_loss": avg_loss, "interm_grad": avg_grad}, step=global_step) + + if accelerator.is_main_process: + epoch_avg = float(np.mean(batch_losses)) if batch_losses else float("nan") + print(f"Epoch {epoch} done, avg loss {epoch_avg:.6f}") + if use_wandb: + wandb.log({"epoch_loss": epoch_avg, "epoch": epoch + 1}, step=global_step) + +# --------------------------- Финальное сохранение --------------------------- +if accelerator.is_main_process: + print("Training finished – saving final model") + if save_model: + accelerator.unwrap_model(vae).save_pretrained(save_as) + +accelerator.free_memory() +if torch.distributed.is_initialized(): + torch.distributed.destroy_process_group() +print("Готово!") diff --git a/vaetest/001_all.png b/vaetest/001_all.png deleted file mode 100644 index c9c2b1df55444f056f87a63c97677a2fa0d378d1..0000000000000000000000000000000000000000 --- a/vaetest/001_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa55dc8c99cbe4fd4d7495772bab57a962dc53736c75dcbb508d204a1a1ad701 -size 2588711 diff --git a/vaetest/001_decoded_AiArtLab_sdxl_vae.png b/vaetest/001_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index 81a5963982c2078d4f83495337f1ef3cacc03f4f..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b9f93a7b6195bf3d706d61a63355626e975dcf610583c942f997b603c988f87 -size 361170 diff --git a/vaetest/001_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/001_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 4c83184e139964004dd5fda3e98fa15fae7a96fb..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baa7025808724a7715641891e699a343a25968f56c24c36694f81263e9c2c6f9 -size 357243 diff --git a/vaetest/001_decoded_AiArtLab_sdxs.png b/vaetest/001_decoded_AiArtLab_sdxs.png deleted file mode 100644 index a5d9dbbae443cfc94ab9b33eaeb2a2b7dc53a7f6..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed2340eb02c0fe96c6438b905a63da9308c2bd0adf3bddbb053647434ba82fd8 -size 380544 diff --git a/vaetest/001_decoded_FLUX.1_schnell_vae.png b/vaetest/001_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 15dc2ab0c649a16a9a04ead4e8607a752c833355..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16af93e83aa84ab4e477891f4f595666bafb9c44acbbac341db8b576cf713005 -size 389024 diff --git a/vaetest/001_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/001_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index ed655379a7d7d8b72ac79ac8e4d8e2d060ce3b6d..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d3504a3365f8500e8a1068525169c442663da2e324796b49c6c9d5d4a724622 -size 363153 diff --git a/vaetest/001_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/001_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index c08c396a90275f852e97137c68c54b9f85487c51..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09191be6311a3425a720977808fd5f31ee11666ce9c65f6f67650289396c36c3 -size 377162 diff --git a/vaetest/001_decoded_vae.png b/vaetest/001_decoded_vae.png deleted file mode 100644 index 3fd32f06cb9d8785f8fe6ced7a6001493f27504a..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8164f7782d33a14e907464f8b230786cd63be4316f0606abe14aad1d24f6f98 -size 404385 diff --git a/vaetest/001_decoded_vae_nightly.png b/vaetest/001_decoded_vae_nightly.png deleted file mode 100644 index 6b34c441b87b564c181ccbc7def2d05a42f3b78c..0000000000000000000000000000000000000000 --- a/vaetest/001_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba63b12c217c962584607045b5149d339049adbf205ee41d350528c2f3169409 -size 288195 diff --git a/vaetest/001_orig.png b/vaetest/001_orig.png deleted file mode 100644 index 64990a6229397eebca122bd6b4d38243c7011155..0000000000000000000000000000000000000000 --- a/vaetest/001_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0daf118faf2b6f8165f6cf04cd79a0ba1c404856552ea69a59e6aae8dccd884 -size 360912 diff --git a/vaetest/002_all.png b/vaetest/002_all.png deleted file mode 100644 index c1ec9999130795dc73784660bad729142faf25b1..0000000000000000000000000000000000000000 --- a/vaetest/002_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:475e9c73a47540fcb28f91b6a6cf6a0b752e073169b68af50ae4bf543ac83021 -size 4085938 diff --git a/vaetest/002_decoded_AiArtLab_sdxl_vae.png b/vaetest/002_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index bda9f6eecbe0d14050951f01c8e95592aff36644..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:649be9fbb2eb0ab4db67576e5568301835a08f7ae9b0f4898c657e13f180b051 -size 560459 diff --git a/vaetest/002_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/002_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 4b4fcd0a6ea06374b82f8c13b2901e0b9fbebc85..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11fd9c9d672de894863aec20ac0bb23e9c4261414174ee31c06faeefe2696205 -size 542456 diff --git a/vaetest/002_decoded_AiArtLab_sdxs.png b/vaetest/002_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 722d788f7122347524725690eb3f0c150a3219f8..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6cffe13d640816e5b6c49b554f8e61c12f117c6547445e22ce23d996ba14183 -size 591748 diff --git a/vaetest/002_decoded_FLUX.1_schnell_vae.png b/vaetest/002_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index e40ef1118fd5c7330750d5b744c38585861badab..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec01ab749570420d8351ebfeb5d02f608e48e71c2f955050116b9bac8a3f7de6 -size 619287 diff --git a/vaetest/002_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/002_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 4d2213560e075acc77741a2426b6a74b475e563f..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a062c7f9febaf5d7549f74170dc6e73a8f5e200cee20ebb84aee8a5e1410c35e -size 544039 diff --git a/vaetest/002_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/002_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 1b2c52c92a24460d4ec6658ff0dbdeda297a3a6d..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2531c034439e6aabf0b9bc470f3693ae943e17ebad8472db13294fa632f0edb1 -size 585568 diff --git a/vaetest/002_decoded_vae.png b/vaetest/002_decoded_vae.png deleted file mode 100644 index f4e5e258ef993ae6b3201d85f3952116a1778cd8..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e983f62827b886b083b787ffd0fe47a2f5362153590ead7ee6b3cd0bc4fa2bb -size 340432 diff --git a/vaetest/002_decoded_vae_nightly.png b/vaetest/002_decoded_vae_nightly.png deleted file mode 100644 index 653a4886424e8f9b252ff5e325ca0b02bb587b9c..0000000000000000000000000000000000000000 --- a/vaetest/002_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5b39b25ddd4b3bd89a8dac3840533627d39942c78325b914c080ad32f01d592 -size 338254 diff --git a/vaetest/002_orig.png b/vaetest/002_orig.png deleted file mode 100644 index db714a07166b91e4a45c4b5fed63f4ac71eb3b18..0000000000000000000000000000000000000000 --- a/vaetest/002_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6252c9953b41a1f806b23926fe0e50dfc73558455f450a0755fef2a74ef31a8f -size 620402 diff --git a/vaetest/003_all.png b/vaetest/003_all.png deleted file mode 100644 index 5899b44609765fab958e01a203145b2a21dbfa54..0000000000000000000000000000000000000000 --- a/vaetest/003_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:548d2b84bfd5de79de3f1a2fa1f8a38623f5331ed419ba2c851750505c1db3b0 -size 3061512 diff --git a/vaetest/003_decoded_AiArtLab_sdxl_vae.png b/vaetest/003_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index 52e803fb9af0bfb26a69b85705d3b9f04bc5bfff..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a70f345e9676b449bc62dc93db74d977259b23afd2bdd2e4333c5c88c2176e57 -size 421768 diff --git a/vaetest/003_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/003_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 70ea14777b039a3bc292aa50fc1b13d19be476f5..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bac54a74e3fecd15adf84ab7b5817234d48ac492fef8ba77164830b8b1bafad -size 414093 diff --git a/vaetest/003_decoded_AiArtLab_sdxs.png b/vaetest/003_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 1f2dfddde6c18a949fa8e256001001271650b1a5..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:806f6fd01137f27cee2046a5d62c6e0194296e0ba2868fc6040791ad4d36969b -size 447510 diff --git a/vaetest/003_decoded_FLUX.1_schnell_vae.png b/vaetest/003_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 84de6b83aa9489dec3620a1df163378ce40e1b90..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dce20c8229031ff33319f27e0f09acb488a40afe6710016e237c51dc325bd1b -size 462669 diff --git a/vaetest/003_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/003_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index ea61850b0c37fe858509d531ddf3a6dbcb3869da..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae89ef0f536aace93f101b20c0885ffc639bbf10c890aad3936170603517b859 -size 424157 diff --git a/vaetest/003_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/003_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 3dbafd87b4e064ea829257d22656673fef57b4f1..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2657105feae4af7a1d524679fce56f2de3add1d858ca2939480ca1e62f268f40 -size 445734 diff --git a/vaetest/003_decoded_vae.png b/vaetest/003_decoded_vae.png deleted file mode 100644 index 56e3213e0ef1cd11876907d418fc1c913291ac72..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dbd61f1d41e41c8482a0b301fca352406b6744adbb2412a4832be0845cf62b8 -size 517115 diff --git a/vaetest/003_decoded_vae_nightly.png b/vaetest/003_decoded_vae_nightly.png deleted file mode 100644 index 3ddececb8f89949569a85d121462959756d143be..0000000000000000000000000000000000000000 --- a/vaetest/003_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88ed782d6e7b0b27dfa87ad57dc7de2e25404d13c2347569033b6b0f185174a4 -size 337146 diff --git a/vaetest/003_orig.png b/vaetest/003_orig.png deleted file mode 100644 index 42d8fe7991f2a5b53f02d0e31cdc991ac4a579f4..0000000000000000000000000000000000000000 --- a/vaetest/003_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b28bbe7f5fb14e036e58087158aa36abd09b9ea69613ceda0a9951fb2ff4219d -size 442716 diff --git a/vaetest/004_all.png b/vaetest/004_all.png deleted file mode 100644 index 9e40b0afe97ab513388ab0ce36f6bc05871f4ba8..0000000000000000000000000000000000000000 --- a/vaetest/004_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80bba4f7da8537d426fe10805dcbb90e96a5b401d667419ca8c396f8e5dccf7a -size 1500672 diff --git a/vaetest/004_decoded_AiArtLab_sdxl_vae.png b/vaetest/004_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index e3f8949bdf1dfb7012076efcf7f2902f598a928b..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:847a6451529c7437200783b5eddeeec43a5e4d43ef657d3e81e867b9fcee59e2 -size 217834 diff --git a/vaetest/004_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/004_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 93997d1dab495696a716bdb79e45055e8cd81b38..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f9fc4c75fcb6a8a07f0b08c81e9d1f0697b08de8d05302cbbb3da53efdb5b58 -size 217302 diff --git a/vaetest/004_decoded_AiArtLab_sdxs.png b/vaetest/004_decoded_AiArtLab_sdxs.png deleted file mode 100644 index e9ac7d0edf7758e9bfbd045d152ff17241d57f24..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a23c25b945939150e2c3bb2fb2478cea1ac5aa862d134fbc43763e7f77c6b27 -size 225366 diff --git a/vaetest/004_decoded_FLUX.1_schnell_vae.png b/vaetest/004_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 8da1a8d465af639bedf26d94fcfd07d94584eb99..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:124f946ba8c81ab12d2e7c9f93af9101e8dfe94c5ac90c59e4d37e1b4b8299df -size 233297 diff --git a/vaetest/004_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/004_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 4abd89de23c3a7d29677c6cfed06194dd8513b0d..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032ff52fd8ce44df4cb1a51133530d7df7b9248cb904dc0bf0bce437df871076 -size 240288 diff --git a/vaetest/004_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/004_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 7b9e3edd776d303face8339e9b6eb8cdc421ed7c..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:338c1131ef5c3591bd1e6307d041d347bcf03a8f041f41deaf5c3e311920fde8 -size 222608 diff --git a/vaetest/004_decoded_vae.png b/vaetest/004_decoded_vae.png deleted file mode 100644 index c1fa6478202108f735cc66e271c1f91e7df38667..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f49815ab78cb882c2f5e04ab6f3c2f3af691d7b70b6c15425f80c22978d4b34a -size 412551 diff --git a/vaetest/004_decoded_vae_nightly.png b/vaetest/004_decoded_vae_nightly.png deleted file mode 100644 index 48b895dcbc98ebf67b89bb7bc214f2ca1da436fe..0000000000000000000000000000000000000000 --- a/vaetest/004_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54bc125d56c45c80f39af1f616d04d645e7c91ddc188fcb1884f3deba467cab1 -size 395260 diff --git a/vaetest/004_orig.png b/vaetest/004_orig.png deleted file mode 100644 index b25526d3b84d89609d82d8b424f4a5e7c77d88cd..0000000000000000000000000000000000000000 --- a/vaetest/004_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48ff929bdee33dcab1a9ce87c6984e07fbe85793874d3a2ba7abb3f2f0e9c4df -size 146092 diff --git a/vaetest/005_all.png b/vaetest/005_all.png deleted file mode 100644 index 70893e062ede01d02104dd13dc226cccb1154d74..0000000000000000000000000000000000000000 --- a/vaetest/005_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f7035720c588caf6d159cf15a6d03879a28b256663c31a44762f0bd0e074e32 -size 3007997 diff --git a/vaetest/005_decoded_AiArtLab_sdxl_vae.png b/vaetest/005_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index ad97e8d217b29f7684db55143f8f7824e41cf8c5..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:622aa4fe0cc57f08298808e421dd2374c30302ab26748081f6b153e7cb4b8a13 -size 413218 diff --git a/vaetest/005_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/005_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 774774152007d414c292c35291ae310c8b7c44e3..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0308636dcd873812510b5835826c7fc6211b60e3afbd980fa9fbc7cb1628da47 -size 409455 diff --git a/vaetest/005_decoded_AiArtLab_sdxs.png b/vaetest/005_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 58c099ef2c3b0a40386df5a826be1b90d9f4071e..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d5b68ee737b002d1ca3c82b73e83870fd70f96d90ca395e17d8f0530f22a322 -size 435880 diff --git a/vaetest/005_decoded_FLUX.1_schnell_vae.png b/vaetest/005_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index c5fa06193260f28c3dca224dbdf4c74728281e99..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf198b031036f36a01fbfe2072cb97fbe00d23e59bb38d13a14c0308804ac573 -size 450808 diff --git a/vaetest/005_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/005_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 0cb9a4e666f362b52a9c89a90940392b69689c50..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7512d121ef176335018d76ad819605066f3b6fce8fca841e04758b5048a40ea -size 416153 diff --git a/vaetest/005_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/005_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 43326dad7dbe2f4b6700384db20bf58cc857bd8d..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4aacea518d9f476b9d8a8aafc87f0c8977032cec155794cc2323e41f90cd6a8 -size 428437 diff --git a/vaetest/005_decoded_vae.png b/vaetest/005_decoded_vae.png deleted file mode 100644 index e3ae2cd9a45fd1c322482c79da6d6f67ad3161de..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:858d5704a763b37b21326c51bf3bd7fe5ac0035afcec8833554807fcb41ac3e0 -size 328200 diff --git a/vaetest/005_decoded_vae_nightly.png b/vaetest/005_decoded_vae_nightly.png deleted file mode 100644 index 197b5f1dfbe7819adac1c8a87827cd34d434addb..0000000000000000000000000000000000000000 --- a/vaetest/005_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f305455e0ba9aa2a99e9e1532d1d1a499b4dc00b663f9b108b372f16f46f74ac -size 426417 diff --git a/vaetest/005_orig.png b/vaetest/005_orig.png deleted file mode 100644 index 20c73063928dea621a0608758d37554d06762a8d..0000000000000000000000000000000000000000 --- a/vaetest/005_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2103d10da2f5e78abb6f1320446a24481f809103380801c6c8d1301a1ad62d69 -size 448977 diff --git a/vaetest/006_all.png b/vaetest/006_all.png deleted file mode 100644 index f38a6005300184dbdd81132c50dea3fe4acada11..0000000000000000000000000000000000000000 --- a/vaetest/006_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f12c7505e7387c9c0fff87641f11124c0c885617fd3fb9cc6c0e5a27fa01fb4b -size 2467075 diff --git a/vaetest/006_decoded_AiArtLab_sdxl_vae.png b/vaetest/006_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index cb19e7ea62a6878866f9855f6a483ba35a96e29a..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a71f2687406c096df9407c40ad690b924a106683d2ad2e609753dc891b6d6a2 -size 347230 diff --git a/vaetest/006_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/006_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 1e09eaf0f255f9e3d265006307fabf6e6b312769..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e44d8c93d73e6815b0502bfbc8cac232bdce3445335b06008932a8cce92d56e -size 347343 diff --git a/vaetest/006_decoded_AiArtLab_sdxs.png b/vaetest/006_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 26fbd505f67ae9edcfdf5caaad5119895c5b330b..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb1c697d067f48107b436d4755075d8cd46e613ed96b467f035490e05dd0cd57 -size 356422 diff --git a/vaetest/006_decoded_FLUX.1_schnell_vae.png b/vaetest/006_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 09bc524dd09d7e179e8130b4dad1be4836437e6a..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:737dd4bc6c16b2721af138e71f29b1683e286e2f27df58c4f2016358cb571615 -size 355280 diff --git a/vaetest/006_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/006_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index a3f5e6b1b889be7190f5a26255ee10d8eafbdb8f..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c359ad73bf5d87cbbe7515688f2b30cf584563705caf9e011558d83c1798506 -size 365415 diff --git a/vaetest/006_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/006_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index b44aca59e65e6174b35b7f29b8764cc61f84a0f8..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03560fdfbe7d263bfa5a168c9a548ba7b33f393494d4db31a747b68ec4c4fb2e -size 349745 diff --git a/vaetest/006_decoded_vae.png b/vaetest/006_decoded_vae.png deleted file mode 100644 index f2c075cbe5d92fa269a1c981df7d0a2a81b663b4..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3032128779f095f8e1f8e5a00328bf75daf89b28c5e04c2bb704df27931e3cac -size 456622 diff --git a/vaetest/006_decoded_vae_nightly.png b/vaetest/006_decoded_vae_nightly.png deleted file mode 100644 index e8507b24d9fa25dd2a93469d4d5bf87d29c0fff9..0000000000000000000000000000000000000000 --- a/vaetest/006_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92cb7b7925a2a987fe7b2582ac3279ab4c164a6a96fb5d1a48a5e62f256d504e -size 409670 diff --git a/vaetest/006_orig.png b/vaetest/006_orig.png deleted file mode 100644 index 6418e68529070266c5f59246e483a3a1e4646cc2..0000000000000000000000000000000000000000 --- a/vaetest/006_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:622485cf9fad18b8c4d57b3f48cc4c10856799098a91ae06974f02f5d1f376bb -size 347580 diff --git a/vaetest/007_all.png b/vaetest/007_all.png deleted file mode 100644 index 1637ed870fa1b75571ab9a32e85d1cae36f0512b..0000000000000000000000000000000000000000 --- a/vaetest/007_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1ed7f29242f5c6097c02c311ad03f7d41476d7d73a53a357f670f31c89eb3c9 -size 2458945 diff --git a/vaetest/007_decoded_AiArtLab_sdxl_vae.png b/vaetest/007_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index feb68acbd9bf7413e2fbe4d48f02c7fb18086b7f..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdd4e29cb9f93aac9a3a13e610918a315dfaa985b12e71dbbd7eab3aa38bf2cf -size 346569 diff --git a/vaetest/007_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/007_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 026b723fa8564e1fff83d7b0c8eb5d308998a0e5..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b00fc1cf18991bae10772351ca49e28ac1732d7b55a04c2e2336140051bd29a8 -size 345906 diff --git a/vaetest/007_decoded_AiArtLab_sdxs.png b/vaetest/007_decoded_AiArtLab_sdxs.png deleted file mode 100644 index ccc17fa134162665c8ae21ba2f1bedaff0eb90d7..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abc9b900fb506b78d50f55218123c863dd3242109a8768110df888c644c730f7 -size 356818 diff --git a/vaetest/007_decoded_FLUX.1_schnell_vae.png b/vaetest/007_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 070472f36a53e03c4c345e577c886b24de1aac63..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fe779ff37bdae54b5e06ac9eec1a4f531d4ad8929ef10147ca6b8da01ceaaf4 -size 356713 diff --git a/vaetest/007_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/007_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 97dd15bde373aa16148d31bc5b81509b671293e7..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79e2a9f22c9517e598ef09691a2b24e8276778672edcab2aae735b8b450fce59 -size 359775 diff --git a/vaetest/007_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/007_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index fe2b24fe33154bc4e82b9a4ab7620ed9bc557798..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc60c194db634a8f85def0b4904939c20c8fc38845ed3c082a2b710daf0ada6d -size 350511 diff --git a/vaetest/007_decoded_vae.png b/vaetest/007_decoded_vae.png deleted file mode 100644 index ac11decb781b2dd3e1ac24d1d1af66c5b490a3fd..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8751324279f4c393e41a97a1ef4718aaaa91e7e9956a02584e41082e4515631 -size 378260 diff --git a/vaetest/007_decoded_vae_nightly.png b/vaetest/007_decoded_vae_nightly.png deleted file mode 100644 index 07d86f20ffcfc48dc14f81a5820080c0fa301c01..0000000000000000000000000000000000000000 --- a/vaetest/007_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d4e2ded054e6ce69fdac6cd1efa86c8524005e86e8773c6704193e50fe5d93b -size 440213 diff --git a/vaetest/007_orig.png b/vaetest/007_orig.png deleted file mode 100644 index 2c43639df3b9c4810296e536cf31b40b91b55eb1..0000000000000000000000000000000000000000 --- a/vaetest/007_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5758ba6e8b44a345dc26f7c17b0d2403d5d0bb1e91041e99d657c44f4eb44d51 -size 342247 diff --git a/vaetest/008_all.png b/vaetest/008_all.png deleted file mode 100644 index 1fb42faaba2ba050921d5a41a4c92b8d84d7f55d..0000000000000000000000000000000000000000 --- a/vaetest/008_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe977b112986d4edaf1a8cd788e4ccc26fca5ec8df6ee4386e7c2d4e96ff2f0b -size 3167693 diff --git a/vaetest/008_decoded_AiArtLab_sdxl_vae.png b/vaetest/008_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index 5318ecb1768cf788d10a21d693045552329ba607..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c1765d58ea8d6787ee77330497e94242e4070408c35066194ad0549829e3e04 -size 438145 diff --git a/vaetest/008_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/008_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 288addba438eb131a46968adfbe950c82b1bc892..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d294287d79432fc236ad921e97215e3687191607044ec4d4c2092510331a01d -size 436124 diff --git a/vaetest/008_decoded_AiArtLab_sdxs.png b/vaetest/008_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 9a6df54e6badbd261a5925837d594ec5d6b778c6..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:279d7928095a27e2b793aa743648beb7b14eaaa0a5f4626d51dc18f666f2d2a9 -size 463322 diff --git a/vaetest/008_decoded_FLUX.1_schnell_vae.png b/vaetest/008_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 4d27201684e6301779db9906c8a4b88bd1aedeb2..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5cbc72edf1bc7c2bd9e2935aaca45d3834e1a726f0bae987c50d23eb02ec693 -size 474006 diff --git a/vaetest/008_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/008_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 363e13bdb029d515b8d6b60e27faaf6541796452..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e594a344f63063ad8fa5d163214286e8b813509469a8035d27f5def65a9bc027 -size 439217 diff --git a/vaetest/008_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/008_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 691ee642b842c90992d4c4d6f8e7fd13932eacff..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92d5c495e7519a4fe6448185c1e0f1540b9cf3fef0412c61bd3606f969bb361d -size 440356 diff --git a/vaetest/008_decoded_vae.png b/vaetest/008_decoded_vae.png deleted file mode 100644 index 1cac1d2bbafaf30e63cefc971ba143599fbc116e..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3224c32f545219348cd349b0058c12cd43fb84b7df9cfb545c93cde1519a6d40 -size 280439 diff --git a/vaetest/008_decoded_vae_nightly.png b/vaetest/008_decoded_vae_nightly.png deleted file mode 100644 index d70f796cb94c0b806add98fa8d443d15a4b253ff..0000000000000000000000000000000000000000 --- a/vaetest/008_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:957755cb420847864d4b3eafe4b4a8ba6d8ec57f4f9e0c23f2eeccbad685f277 -size 439215 diff --git a/vaetest/008_orig.png b/vaetest/008_orig.png deleted file mode 100644 index d35f7285c6a04e2e24f7cf49608ccf8256266060..0000000000000000000000000000000000000000 --- a/vaetest/008_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34046a851c608e8c5d2b7ac0c878079a7ab98f63343fd3dffdfc89577e89ef6e -size 461953 diff --git a/vaetest/009_all.png b/vaetest/009_all.png deleted file mode 100644 index 91cf0f5d71af5f657a765f8aeae14370b7a76320..0000000000000000000000000000000000000000 --- a/vaetest/009_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:426848aaee08084d7d8d08dd1b6b1177d756149894041cfde23c670663c227fb -size 1914629 diff --git a/vaetest/009_decoded_AiArtLab_sdxl_vae.png b/vaetest/009_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index e00cd91fc103387f7fe0524b817564572c39d149..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c510c3ea8c687cce94f159b63b33ab44673b2884cd7cc6a5b67807ee55b7cb82 -size 274709 diff --git a/vaetest/009_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/009_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 882e62afad215a784e98495650af78a93c0e833a..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e462a02bbadfb557c6b002237463f65e622152b07ccae5862cb8fd087b0f1e2 -size 273376 diff --git a/vaetest/009_decoded_AiArtLab_sdxs.png b/vaetest/009_decoded_AiArtLab_sdxs.png deleted file mode 100644 index 4727d6cebb9c4965172301bd8c9b70b257d9b53d..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20bffd3b2b07d2bafe5f6eab796fa33e7904d8db7a589f8d27526c9d372f0d56 -size 279859 diff --git a/vaetest/009_decoded_FLUX.1_schnell_vae.png b/vaetest/009_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index 0eb79ce9de3e715eef446c49dbd89e59049f4805..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45dd0a3258e6a855b9cefb8dd59508c6edfeaad1057191591fda966ca489af3 -size 278611 diff --git a/vaetest/009_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/009_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 4bf8ed30d426d9fa83ab04b693856521a9f2959a..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9a4af7fca5e165453f4efb7f9fd2e8a018be957fa5ea22195680f8f724489a6 -size 286921 diff --git a/vaetest/009_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/009_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index f0acd0d2ad2ec50ec9f1f160d3b5b93f8cd9f239..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c31e98b26cc09396f78df007b7d1fcf1fb9e15fc286f9db09f3406d5e4bd23cd -size 278619 diff --git a/vaetest/009_decoded_vae.png b/vaetest/009_decoded_vae.png deleted file mode 100644 index 9c5f35c8df1df0ef161e585cf44c8f3b7cc39c90..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02fc7659d3103559bbebf245d654faf66a6d9466f875e35708835a161a3e8fa1 -size 490854 diff --git a/vaetest/009_decoded_vae_nightly.png b/vaetest/009_decoded_vae_nightly.png deleted file mode 100644 index 0074c8a19ce493a42685030463f9e22879c80e5d..0000000000000000000000000000000000000000 --- a/vaetest/009_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1172cdc7b93f9181ea0daedcb220536ca48301345a2cb506b6841cbd1714436a -size 306572 diff --git a/vaetest/009_orig.png b/vaetest/009_orig.png deleted file mode 100644 index b77cdc522796127a1104eb7427d1d5a4f18ddf44..0000000000000000000000000000000000000000 --- a/vaetest/009_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:741ebb79c44a04284d3a299ecc43c36a454c11dc5b4e254640f1e1ab350549bb -size 244073 diff --git a/vaetest/010_all.png b/vaetest/010_all.png deleted file mode 100644 index a6d030df2e0c3becc07d37eaa12e079fd54628a1..0000000000000000000000000000000000000000 --- a/vaetest/010_all.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:922bacd13b055f5bf0cbc957b89c54f694af759fdd891dd0bbbd2afd9094cb8c -size 2401943 diff --git a/vaetest/010_decoded_AiArtLab_sdxl_vae.png b/vaetest/010_decoded_AiArtLab_sdxl_vae.png deleted file mode 100644 index 8c8c7618c33b8a44196992214540968f422f8550..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_AiArtLab_sdxl_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:267b58c529019091cdc63e2d1c9b302870a993d0f933350e717e845567315d8e -size 334544 diff --git a/vaetest/010_decoded_AiArtLab_sdxlvae_nightly.png b/vaetest/010_decoded_AiArtLab_sdxlvae_nightly.png deleted file mode 100644 index 155e0697fb0755ae6fb697de507973283ad0a929..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_AiArtLab_sdxlvae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2041c46e31adfa8a4b0ca70a5a27397bd8d9c057a50a427a277326daddfaaa8 -size 333398 diff --git a/vaetest/010_decoded_AiArtLab_sdxs.png b/vaetest/010_decoded_AiArtLab_sdxs.png deleted file mode 100644 index fe626b27b0395ad099c6a2b0fad4f447e607e07f..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_AiArtLab_sdxs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c0db59211667f60515364f8a7a7fee37214d9c8e1776c31af13a58314bca298 -size 359374 diff --git a/vaetest/010_decoded_FLUX.1_schnell_vae.png b/vaetest/010_decoded_FLUX.1_schnell_vae.png deleted file mode 100644 index bba295e02b06e9325dc4490c6aafe0046506c31a..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_FLUX.1_schnell_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76339fd5c6d7a5035311a53eea337a5a264d1aaa692f7b500c7564ffa283c6b5 -size 356681 diff --git a/vaetest/010_decoded_KBlueLeaf_EQ_SDXL_VAE.png b/vaetest/010_decoded_KBlueLeaf_EQ_SDXL_VAE.png deleted file mode 100644 index 7047cb55bae46b072b5bbced1b37716f3aec7d78..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_KBlueLeaf_EQ_SDXL_VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cbf4dc57d076b156d0322dd32f4608a15192c91f43b4ec96a1440315095ada9 -size 346910 diff --git a/vaetest/010_decoded_madebyollin_sdxl_vae_fp16.png b/vaetest/010_decoded_madebyollin_sdxl_vae_fp16.png deleted file mode 100644 index 286e3b095ae959c89c008d377283bed4740c1c89..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_madebyollin_sdxl_vae_fp16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dc8b2a79cf8f15633d2bba72f05043951a10eb08527bc9adba69b9ff418fdfa -size 347708 diff --git a/vaetest/010_decoded_vae.png b/vaetest/010_decoded_vae.png deleted file mode 100644 index 1aefaba4b9ab91640de9a3e99508f4c9f690dd02..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:510ee06d06dbd08930952af90bad2f9a3bb5f583e99a777ee7b371a753916552 -size 376251 diff --git a/vaetest/010_decoded_vae_nightly.png b/vaetest/010_decoded_vae_nightly.png deleted file mode 100644 index f09295f0b28fdac7cce9da561a18b75df45654a2..0000000000000000000000000000000000000000 --- a/vaetest/010_decoded_vae_nightly.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f2313d66d236f7006ea707c1e5b5d6819619f925868ea30836a4e36f6f78d03 -size 225425 diff --git a/vaetest/010_orig.png b/vaetest/010_orig.png deleted file mode 100644 index 751592cb71833e3ba94f32701089cf28c7628589..0000000000000000000000000000000000000000 --- a/vaetest/010_orig.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdc4f498870789beca3b0da8b875f16554792ad0ae68a7fbd86bc62f9005bdc7 -size 322021 diff --git a/vaetest/decoded_AiArtLab_vae.png b/vaetest/decoded_AiArtLab_vae.png deleted file mode 100644 index 1d677a31375e34bfa5eec3e1ece3117e3884b101..0000000000000000000000000000000000000000 --- a/vaetest/decoded_AiArtLab_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4163b03099fe6e68511274fe930be38bb7677fd7967f38441c37d4b5dbc59e43 -size 881471 diff --git a/vaetest/decoded_EQ-SDXL-VAE.png b/vaetest/decoded_EQ-SDXL-VAE.png deleted file mode 100644 index 00ca2cd2939afd89a874d34972e7164e49ce2773..0000000000000000000000000000000000000000 --- a/vaetest/decoded_EQ-SDXL-VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d957992bbf7d27830ed59db4b7499364018b83a994872604abc7b7f1a387cafe -size 890344 diff --git a/vaetest/decoded_sdxl.png b/vaetest/decoded_sdxl.png deleted file mode 100644 index 31743fac97b74a84814a8c052c49b1ad29a3e857..0000000000000000000000000000000000000000 --- a/vaetest/decoded_sdxl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80298aa543452a7ed513ba3ebba40163bc0eda50bf94c1c92497acfbd4e52781 -size 901513 diff --git a/vaetest/dist_AiArtLab_vae.png b/vaetest/dist_AiArtLab_vae.png deleted file mode 100644 index 8f81de7b1f14f8a5775f81b5d1c546edc1cf922e..0000000000000000000000000000000000000000 --- a/vaetest/dist_AiArtLab_vae.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62b119f71fa0e4a528f4bff7ee571eafb289fe8c2bf2375ab72886d6600426f8 -size 36934 diff --git a/vaetest/dist_EQ-SDXL-VAE.png b/vaetest/dist_EQ-SDXL-VAE.png deleted file mode 100644 index 6e09ecfa95e83ddd297460b8874141ac8033ee3f..0000000000000000000000000000000000000000 --- a/vaetest/dist_EQ-SDXL-VAE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0355cb2d64aeae8a22cc1a6d74eb1e71afa56c1c0b4f9ce12aa4f31e52b9e21 -size 33713 diff --git a/vaetest/dist_sdxl.png b/vaetest/dist_sdxl.png deleted file mode 100644 index adddef5201e626650e34ddf213c53f1df2bffe5a..0000000000000000000000000000000000000000 --- a/vaetest/dist_sdxl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d07f49ade351d6cc5993aced7cf5b5e10275c8c4ddb16a53b914544a80c0cb30 -size 35970 diff --git a/vaetest/original.jpg b/vaetest/original.jpg deleted file mode 100644 index dd90f7d8934b58c5407026e2a04fe8279dc03afe..0000000000000000000000000000000000000000 --- a/vaetest/original.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b040fb1ed4b5fc2b59d5a25390dde19ba9120873f684c88d02cd4fbdf7d2b66b -size 122713