From 4c03b228870fe170964b133be006c22bbda5a92f Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 16 Sep 2025 10:00:06 -0400 Subject: [PATCH 001/230] turn on debug/api/docs by default Signed-off-by: Vladimir Mandic --- installer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/installer.py b/installer.py index 8609ff953..c0d8c7bad 100644 --- a/installer.py +++ b/installer.py @@ -1634,7 +1634,7 @@ def add_args(parser): group_http.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s") group_http.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy') group_http.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch") - group_http.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") + group_http.add_argument('--docs', default=not os.environ.get("SD_NODOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") group_http.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""') group_http.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s') group_http.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access") @@ -1655,11 +1655,11 @@ def add_args(parser): group_log = parser.add_argument_group('Logging') group_log.add_argument("--log", type=str, default=os.environ.get("SD_LOG", None), help="Set log file, default: %(default)s") - group_log.add_argument('--debug', default=os.environ.get("SD_DEBUG",False), action='store_true', help="Run with debug logging, default: %(default)s") + group_log.add_argument('--debug', default=not os.environ.get("SD_NODEBUG",False), action='store_true', help="Run with debug logging, default: %(default)s") group_log.add_argument("--trace", default=os.environ.get("SD_TRACE", False), action='store_true', help="Run with trace logging, default: %(default)s") group_log.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") group_log.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help="Mount API docs, default: %(default)s") - group_log.add_argument("--api-log", default=os.environ.get("SD_APILOG", False), action='store_true', help="Log all API requests") + group_log.add_argument("--api-log", default=not os.environ.get("SD_NOAPILOG", False), action='store_true', help="Log all API requests") group_nargs = parser.add_argument_group('Other') group_nargs.add_argument('args', type=str, nargs='*', help=argparse.SUPPRESS) From 39027ccfea6003d65b12943db91e10d881b8d3d2 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 16 Sep 2025 17:12:00 +0300 Subject: [PATCH 002/230] SDNQ fix conv matmul --- modules/sdnq/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index a7829d44d..a82038f68 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -75,6 +75,10 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz use_quantized_matmul = group_channel_size >= 32 and output_channel_size >= 32 if use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"]: use_quantized_matmul = output_channel_size % 16 == 0 and group_channel_size % 16 == 0 + if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: + result_shape = layer.weight.shape + layer.weight.data = layer.weight.flatten(1,-1) + reduction_axes = -1 elif layer_class_name in conv_transpose_types: if not quant_conv: return layer @@ -128,7 +132,8 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz num_of_groups = int(num_of_groups) if num_of_groups > 1: - result_shape = layer.weight.shape + if result_shape is None: + result_shape = layer.weight.shape new_shape = list(result_shape) if is_conv_type: # output_channel_size, channel_size, X, X @@ -165,9 +170,6 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz re_quantize_for_matmul = (num_of_groups > 1 or zero_point is not None) if use_quantized_matmul and not re_quantize_for_matmul: - if is_conv_type: - result_shape = layer.weight.shape - layer.weight.data = layer.weight.reshape(output_channel_size, -1) scale.transpose_(0,1) layer.weight.transpose_(0,1) if not dtype_dict[weights_dtype]["is_integer"]: From f8f958244f72e02038c84dbbe65e6dd1ae88fcbb Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 16 Sep 2025 10:17:28 -0400 Subject: [PATCH 003/230] use new pydantic/albumentations/insightface Signed-off-by: Vladimir Mandic --- TODO.md | 5 ----- installer.py | 18 ++++++++++-------- modules/face/insightface.py | 6 ++---- scripts/infiniteyou_ext.py | 6 ++---- scripts/pulid_ext.py | 8 +++----- 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/TODO.md b/TODO.md index dce3ad49e..d20d250ea 100644 --- a/TODO.md +++ b/TODO.md @@ -13,11 +13,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - Video Core: API - Video LTX: TeaCache and others, API, Conditioning preprocess Video: LTX API -### Blocked items - -- Upgrade: `albumentations` - - blocked by `insightface` - ### Under Consideration - [X-Omni](https://github.com/X-Omni-Team/X-Omni/blob/main/README.md) diff --git a/installer.py b/installer.py index c0d8c7bad..ef1d2da95 100644 --- a/installer.py +++ b/installer.py @@ -1256,12 +1256,16 @@ def install_gradio(): def install_pydantic(): - if args.new: - install('pydantic==2.11.7', ignore=True, quiet=True) - reload('pydantic', '2.11.7') - else: - install('pydantic==1.10.21', ignore=True, quiet=True) - reload('pydantic', '1.10.21') + install('pydantic==2.11.7', ignore=True, quiet=True) + reload('pydantic', '2.11.7') + + +def install_insightface(): + install('git+https://github.com/deepinsight/insightface@29b6cd65aa0e9ae3b6602de3c52e9d8949c8ee86#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches + # install('albumentations==1.4.3', ignore=True, quiet=True) + uninstall('albumentations') + install('albumentationsx') + install_pydantic() def install_optional(): @@ -1277,8 +1281,6 @@ def install_optional(): install('nvidia-ml-py', ignore=True, quiet=True) install('ultralytics==8.3.40', ignore=True, quiet=True) install('Cython', ignore=True, quiet=True) - install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches - install('albumentations==1.4.3', ignore=True, quiet=True) install('av', ignore=True, quiet=True) install('gguf', ignore=True) try: diff --git a/modules/face/insightface.py b/modules/face/insightface.py index b69648904..99be2d32e 100644 --- a/modules/face/insightface.py +++ b/modules/face/insightface.py @@ -10,11 +10,9 @@ instightface_mp = None def get_app(mp_name, threshold=0.5, resolution=640): global insightface_app, instightface_mp # pylint: disable=global-statement - from installer import install, installed, install_pydantic + from installer import install, installed, install_insightface if not installed('insightface', reload=False, quiet=True): - install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches - install('albumentations==1.4.3', ignore=False, reinstall=True) - install_pydantic() + install_insightface() if not installed('ip_adapter', reload=False, quiet=True): install('git+https://github.com/tencent-ailab/IP-Adapter.git', 'ip_adapter', ignore=False) diff --git a/scripts/infiniteyou_ext.py b/scripts/infiniteyou_ext.py index e38185aa4..677d56cca 100644 --- a/scripts/infiniteyou_ext.py +++ b/scripts/infiniteyou_ext.py @@ -13,11 +13,9 @@ orig_pipeline, orig_prompt_attention = None, None def verify_insightface(): - from installer import installed, install, install_pydantic + from installer import installed, install_insightface if not installed('insightface', reload=False, quiet=True): - install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches - install('albumentations==1.4.3', ignore=False, reinstall=True) - install_pydantic() + install_insightface() def load_infiniteyou(model: str): diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index a92480824..df9a099e6 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -28,11 +28,9 @@ class Script(scripts_manager.Script): return True def dependencies(self): - from installer import install, installed, install_pydantic - if not installed('insightface==0.7.3', reload=False, quiet=True): - install('git+https://github.com/deepinsight/insightface@554a05561cb71cfebb4e012dfea48807f845a0c2#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches - install('albumentations==1.4.3', ignore=False, reinstall=True) - install_pydantic() + from installer import installed, install_insightface + if not installed('insightface', reload=False, quiet=True): + install_insightface() def register(self): # register xyz grid elements global registered # pylint: disable=global-statement From 352d3c25460f446cd7a91ef73f605733667506fb Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 16 Sep 2025 13:54:52 -0400 Subject: [PATCH 004/230] fix typo Signed-off-by: Vladimir Mandic --- installer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/installer.py b/installer.py index ef1d2da95..f307ba7ba 100644 --- a/installer.py +++ b/installer.py @@ -626,7 +626,7 @@ def check_transformers(): t_start = time.time() if args.skip_all or args.skip_git or args.experimental: return - pkg_transofmers = pkg_resources.working_set.by_key.get('transformers', None) + pkg_transformers = pkg_resources.working_set.by_key.get('transformers', None) pkg_tokenizers = pkg_resources.working_set.by_key.get('tokenizers', None) if args.use_directml: target_transformers = '4.52.4' @@ -634,11 +634,11 @@ def check_transformers(): else: target_transformers = '4.56.1' target_tokenizers = '0.22.0' - if (pkg_transofmers is None) or ((pkg_transofmers.version != target_transformers) or (pkg_tokenizers is None) or ((pkg_tokenizers.version != target_tokenizers) and (not args.experimental))): - if pkg_transofmers is None: + if (pkg_transformers is None) or ((pkg_transformers.version != target_transformers) or (pkg_tokenizers is None) or ((pkg_tokenizers.version != target_tokenizers) and (not args.experimental))): + if pkg_transformers is None: log.info(f'Transformers install: version={target_transformers}') else: - log.info(f'Transformers update: current={pkg_transofmers.version} target={target_transformers}') + log.info(f'Transformers update: current={pkg_transformers.version} target={target_transformers}') pip('uninstall --yes transformers', ignore=True, quiet=True, uv=False) pip(f'install --upgrade tokenizers=={target_tokenizers}', ignore=False, quiet=True, uv=False) pip(f'install --upgrade transformers=={target_transformers}', ignore=False, quiet=True, uv=False) From 6a021e7743559033f5233e353013d8f1add458a7 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 17 Sep 2025 14:44:44 +0300 Subject: [PATCH 005/230] ipex cleanup tensor_to hijack --- modules/intel/ipex/hijacks.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index 9f2c5a542..feb31bec2 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -257,17 +257,15 @@ def torch_tensor(data, *args, dtype=None, device=None, **kwargs): torch.Tensor.original_Tensor_to = torch.Tensor.to @wraps(torch.Tensor.to) def Tensor_to(self, device=None, *args, **kwargs): + global device_supports_fp64 if check_cuda(device): - if not device_supports_fp64 and kwargs.get("dtype", None) == torch.float64: + device = return_xpu(device) + if not device_supports_fp64: + if kwargs.get("dtype", None) == torch.float64 and ((device is None and self.device.type == "xpu") or (device is not None and torch.device(device).type == "xpu")): kwargs["dtype"] = torch.float32 - return self.original_Tensor_to(return_xpu(device), *args, **kwargs) - else: - if not device_supports_fp64: - if kwargs.get("dtype", None) == torch.float64 and ((device is None and self.device.type == "xpu") or (device is not None and torch.device(device).type == "xpu")): - kwargs["dtype"] = torch.float32 - elif device == torch.float64 and self.device.type == "xpu": - device = torch.float32 - return self.original_Tensor_to(device, *args, **kwargs) + elif device == torch.float64 and self.device.type == "xpu": + device = torch.float32 + return self.original_Tensor_to(device, *args, **kwargs) original_Tensor_cuda = torch.Tensor.cuda @wraps(torch.Tensor.cuda) From cc6101ecb2a3cb254c62e4384fc8dd2fbb1976b5 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 17 Sep 2025 12:32:27 -0400 Subject: [PATCH 006/230] jumbo update: add wan22-vace, improve offloading, add offloading-using-streams, change logging-levels, refactor some default packages Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 14 +++++ README.md | 1 + TODO.md | 4 +- extensions-builtin/sdnext-modernui | 2 +- html/previews.json | 9 +-- html/reference.json | 79 +++++++++++++----------- installer.py | 5 +- modules/processing_args.py | 10 +++ modules/processing_diffusers.py | 2 +- modules/processing_helpers.py | 6 +- modules/sd_offload.py | 38 +++++++++--- modules/shared.py | 1 + modules/ui_extra_networks_checkpoints.py | 2 + modules/video_models/models_def.py | 10 ++- modules/video_models/video_overrides.py | 15 +++-- modules/video_models/video_run.py | 10 ++- pipelines/model_wanai.py | 24 ++++--- 17 files changed, 156 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a14c843c2..cc6fe5ecf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log for SD.Next +## Update for 2025-09-17 + +- **Models** + - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) + available for *text-to-image* and *text-to-video* and *image-to-video* workflows +- **Offloading** + - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* + - add timers to measure onload/offload times during generate + - experimental offloading using `torch.streams` + enable in settings -> model offloading +- **Other** + - **logging** enable `debug`, `docs` and `api-docs` by default + - refactor to use new libraries + ## Update for 2025-09-15 ### Highlights for 2025-09-15 diff --git a/README.md b/README.md index e37f77479..f57feb916 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ ![Last update](https://img.shields.io/github/last-commit/vladmandic/sdnext?svg=true) ![License](https://img.shields.io/github/license/vladmandic/sdnext?svg=true) [![Discord](https://img.shields.io/discord/1101998836328697867?logo=Discord&svg=true)](https://discord.gg/VjvR2tabEX) +[![DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/vladmandic/sdnext) [![Sponsors](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86)](https://github.com/sponsors/vladmandic) [Docs](https://vladmandic.github.io/sdnext-docs/) | [Wiki](https://github.com/vladmandic/sdnext/wiki) | [Discord](https://discord.gg/VjvR2tabEX) | [Changelog](CHANGELOG.md) diff --git a/TODO.md b/TODO.md index d20d250ea..26f5fa202 100644 --- a/TODO.md +++ b/TODO.md @@ -15,6 +15,7 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### Under Consideration +- [Inf-DiT](https://github.com/zai-org/Inf-DiT) - [X-Omni](https://github.com/X-Omni-Team/X-Omni/blob/main/README.md) - [DiffSynth Studio](https://github.com/modelscope/DiffSynth-Studio) - [IPAdapter negative guidance](https://github.com/huggingface/diffusers/discussions/7167) @@ -36,13 +37,14 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### New models - [HunyuanImage](https://huggingface.co/tencent/HunyuanImage-2.1) +- [Phantom HuMo](https://github.com/Phantom-video/Phantom) - [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO) -- [Wan2.2 Fun](https://huggingface.co/collections/alibaba-pai/wan22-fun-68958eabec343b948f1225c5) (includes VACE, Control, etc) - [Magi](https://github.com/SandAI-org/MAGI-1)(https://github.com/huggingface/diffusers/pull/11713) - [SEVA](https://github.com/huggingface/diffusers/pull/11440) - [Ming](https://github.com/inclusionAI/Ming) - [Liquid](https://github.com/FoundationVision/Liquid) - [Step1X](https://github.com/stepfun-ai/Step1X-Edit) +- [LucyEdit](https://github.com/huggingface/diffusers/pull/12340) - [SD3 UltraEdit](https://github.com/HaozheZhao/UltraEdit) - [WAN2GP](https://github.com/deepbeepmeep/Wan2GP) - [SelfForcing](https://github.com/guandeh17/Self-Forcing) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 430c8140c..049386fd9 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 430c8140c0cdda5e82a80f44ee6961e0d803e516 +Subproject commit 049386fd9d5c2d9b30cc9136be1e1bcda13d81c6 diff --git a/html/previews.json b/html/previews.json index 6f77db164..4f3354c86 100644 --- a/html/previews.json +++ b/html/previews.json @@ -20,10 +20,11 @@ "HiDream-I1-Full": "models/Reference/HiDream-I1 Full", "lodestones--Chroma1-Base": "models/Reference/lodestones--Chroma-Base.jpg", "lodestones--Chroma1-HD": "models/Reference/lodestones--Chroma-HD.jpg", - "chroma-unlocked-v50": "models/Reference/lodestones Chroma Unlocked HD", - "chroma-unlocked-v50-annealed": "models/Reference/lodestones Chroma Unlocked HD", + "chroma-unlocked-v50": "models/Reference/lodestones--Chroma-detail.jpg", + "chroma-unlocked-v50-annealed": "models/Reference/lodestones--Chroma-annealed.jpg", "vladmandic--Qwen-Lightning": "models/Reference/Qwen-Lightning.jpg", "vladmandic--Qwen-Lightning-Edit": "models/Reference/Qwen-Lightning.jpg", - "Wan-AI--Wan2.2-T2V-A14B-Diffusers": "models/Reference/Wan2.2-T2V-A14B.jpg", - "Wan-AI--Wan2.1-T2V-14B-Diffusers": "models/Reference/Wan-AI--Wan2.1.jpg" + "Wan-AI--Wan2.2-T2V-A14B-Diffusers": "models/Reference/Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg", + "Wan-AI--Wan2.1-T2V-14B-Diffusers": "models/Reference/Wan-AI--Wan2.1-T2V-14B-Diffusers.jpg", + "linoyts--Wan2.2-VACE-Fun-14B-diffusers": "models/Reference/Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg" } diff --git a/html/reference.json b/html/reference.json index ee0ccf103..b21dd95f7 100644 --- a/html/reference.json +++ b/html/reference.json @@ -139,6 +139,42 @@ "extras": "sampler: Default, cfg_scale: 4.5" }, + "Qwen-Image": { + "path": "Qwen/Qwen-Image", + "preview": "Qwen--Qwen-Image.jpg", + "desc": " Qwen-Image, an image generation foundation model in the Qwen series that achieves significant advances in complex text rendering and precise image editing.", + "skip": true, + "extras": "" + }, + "Qwen-Image-Edit": { + "path": "Qwen/Qwen-Image-Edit", + "preview": "Qwen--Qwen-Image-Edit.jpg", + "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", + "skip": true, + "extras": "" + }, + "Qwen-Image-Lightning": { + "path": "vladmandic/Qwen-Lightning", + "preview": "vladmandic--Qwen-Lightning.jpg", + "desc": "Qwen-Lightning is step-distilled from Qwen-Image to allow for generation in 8 steps.", + "skip": true, + "extras": "steps: 8" + }, + "Qwen-Image-Distill": { + "path": "SahilCarterr/Qwen-Image-Distill-Full", + "preview": "SahilCarterr--Qwen-Image-Distill-Full.jpg", + "desc": "Qwen-Image-Distill is a distilled and accelerated version of Qwen-Image by DiffSynth-Studio.", + "skip": true, + "extras": "steps: 15" + }, + "Qwen-Image-Lightning-Edit": { + "path": "vladmandic/Qwen-Lightning-Edit", + "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "desc": " Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.", + "skip": true, + "extras": "steps: 8" + }, + "lodestones Chroma1 HD": { "path": "lodestones/Chroma1-HD", "preview": "lodestones--Chroma-HD.jpg", @@ -182,42 +218,6 @@ "extras": "" }, - "Qwen-Image": { - "path": "Qwen/Qwen-Image", - "preview": "Qwen--Qwen-Image.jpg", - "desc": " Qwen-Image, an image generation foundation model in the Qwen series that achieves significant advances in complex text rendering and precise image editing.", - "skip": true, - "extras": "" - }, - "Qwen-Image-Edit": { - "path": "Qwen/Qwen-Image-Edit", - "preview": "Qwen--Qwen-Image-Edit.jpg", - "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", - "skip": true, - "extras": "" - }, - "Qwen-Image-Lightning": { - "path": "vladmandic/Qwen-Lightning", - "preview": "vladmandic--Qwen-Lightning.jpg", - "desc": "Qwen-Lightning is step-distilled from Qwen-Image to allow for generation in 8 steps.", - "skip": true, - "extras": "steps: 8" - }, - "Qwen-Image-Distill": { - "path": "SahilCarterr/Qwen-Image-Distill-Full", - "preview": "SahilCarterr--Qwen-Image-Distill-Full.jpg", - "desc": "Qwen-Image-Distill is a distilled and accelerated version of Qwen-Image by DiffSynth-Studio.", - "skip": true, - "extras": "steps: 15" - }, - "Qwen-Image-Lightning-Edit": { - "path": "vladmandic/Qwen-Lightning-Edit", - "preview": "vladmandic--Qwen-Lightning-Edit.jpg", - "desc": " Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.", - "skip": true, - "extras": "steps: 8" - }, - "Ostris Flex.2 Preview": { "path": "ostris/Flex.2-preview", "preview": "ostris--Flex.2-preview.jpg", @@ -268,6 +268,13 @@ "skip": true, "extras": "sampler: Default" }, + "Wan-AI Wan2.2 14B VACE": { + "path": "linoyts/Wan2.2-VACE-Fun-14B-diffusers", + "preview": "Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg", + "desc": "Wan2.2, offering more powerful capabilities, better performance, and superior visual quality. With Wan2.2, we have focused on incorporating the following technical innovations: MoE Architecture, Data Scalling, Cinematic Aesthetics, Efficient High-Definition Hybrid", + "skip": true, + "extras": "sampler: Default" + }, "Freepik F-Lite": { "path": "Freepik/F-Lite", diff --git a/installer.py b/installer.py index f307ba7ba..40c56348b 100644 --- a/installer.py +++ b/installer.py @@ -605,7 +605,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = '5e181eddfe7e44c1444a2511b0d8e21d177850a0' # diffusers commit hash + sha = 'efb7a299af46d739dec6a57a5d2814165fba24b5' # diffusers commit hash pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' @@ -1636,7 +1636,6 @@ def add_args(parser): group_http.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s") group_http.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy') group_http.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch") - group_http.add_argument('--docs', default=not os.environ.get("SD_NODOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") group_http.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""') group_http.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s') group_http.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access") @@ -1660,7 +1659,7 @@ def add_args(parser): group_log.add_argument('--debug', default=not os.environ.get("SD_NODEBUG",False), action='store_true', help="Run with debug logging, default: %(default)s") group_log.add_argument("--trace", default=os.environ.get("SD_TRACE", False), action='store_true', help="Run with trace logging, default: %(default)s") group_log.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s") - group_log.add_argument('--docs', default=os.environ.get("SD_DOCS", False), action='store_true', help="Mount API docs, default: %(default)s") + group_log.add_argument('--docs', default=not os.environ.get("SD_NODOCS", False), action='store_true', help = "Mount API docs, default: %(default)s") group_log.add_argument("--api-log", default=not os.environ.get("SD_NOAPILOG", False), action='store_true', help="Log all API requests") group_nargs = parser.add_argument_group('Other') diff --git a/modules/processing_args.py b/modules/processing_args.py index 5d40d8db0..267d779f1 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -128,6 +128,8 @@ def task_specific_kwargs(p, model): } if model.__class__.__name__ == 'WanImageToVideoPipeline' and hasattr(p, 'init_images') and len(p.init_images) > 0: task_args['image'] = p.init_images[0] + if model.__class__.__name__ == 'WanVACEPipeline' and hasattr(p, 'init_images') and len(p.init_images) > 0: + task_args['reference_images'] = p.init_images if debug_enabled: debug_log(f'Process task specific args: {task_args}') @@ -307,6 +309,14 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t args['control_strength'] = p.denoising_strength args['width'] = p.width args['height'] = p.height + if 'WanVACEPipeline' in model.__class__.__name__: + if isinstance(args['prompt'], list): + args['prompt'] = args['prompt'][0] if len(args['prompt']) > 0 else '' + if isinstance(args.get('negative_prompt', None), list): + args['negative_prompt'] = args['negative_prompt'][0] if len(args['negative_prompt']) > 0 else '' + if isinstance(args['generator'], list) and len(args['generator']) > 0: + args['generator'] = args['generator'][0] + # set callbacks if 'prior_callback_steps' in possible: # Wuerstchen / Cascade args['prior_callback_steps'] = 1 diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 8353be172..d29cfc0e5 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -487,7 +487,7 @@ def validate_pipeline(p: processing.StableDiffusionProcessing): if m.repo_cls is not None: models_cls.append(m.repo_cls.__name__) is_video_model = shared.sd_model.__class__.__name__ in models_cls - override_video_pipelines = ['WanPipeline', 'WanImageToVideoPipeline'] + override_video_pipelines = ['WanPipeline', 'WanImageToVideoPipeline', 'WanVACEPipeline'] is_video_pipeline = ('video' in p.__class__.__name__.lower()) or (shared.sd_model.__class__.__name__ in override_video_pipelines) if is_video_model and not is_video_pipeline: shared.log.error(f'Mismatch: type={shared.sd_model_type} cls={shared.sd_model.__class__.__name__} request={p.__class__.__name__} video model with non-video pipeline') diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index 976ab0c32..15ee19822 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -372,7 +372,7 @@ def calculate_base_steps(p, use_denoise_start, use_refiner_start): if len(getattr(p, 'timesteps', [])) > 0: return None cls = shared.sd_model.__class__.__name__ - if 'Flex' in cls or 'Kontext' in cls or 'Edit' in cls: + if 'Flex' in cls or 'Kontext' in cls or 'Edit' in cls or 'Wan' in cls: steps = p.steps elif not is_txt2img(): if cls in sd_models.i2i_pipes: @@ -393,7 +393,7 @@ def calculate_base_steps(p, use_denoise_start, use_refiner_start): def calculate_hires_steps(p): cls = shared.sd_model.__class__.__name__ - if 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: + if 'Flex' in cls or 'Kontext' in cls or 'Edit' in cls or 'Wan' in cls: steps = p.steps elif p.hr_second_pass_steps > 0: steps = (p.hr_second_pass_steps // p.denoising_strength) + 1 @@ -407,7 +407,7 @@ def calculate_hires_steps(p): def calculate_refiner_steps(p): cls = shared.sd_model.__class__.__name__ - if 'Flex' in cls or 'HiDreamImageEditingPipeline' in cls or 'Kontext' in cls: + if 'Flex' in cls or 'Kontext' in cls or 'Edit' in cls or 'Wan' in cls: steps = p.steps elif "StableDiffusionXL" in shared.sd_refiner.__class__.__name__: if p.refiner_start > 0 and p.refiner_start < 1: diff --git a/modules/sd_offload.py b/modules/sd_offload.py index bf951e2c5..be0379f66 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -18,6 +18,7 @@ offload_post = ['h1'] offload_hook_instance = None balanced_offload_exclude = ['CogView4Pipeline', 'MeissonicPipeline'] accelerate_dtype_byte_size = None +move_stream = None def dtype_byte_size(dtype: torch.dtype): @@ -176,7 +177,7 @@ class OffloadHook(accelerate.hooks.ModelHook): self.last_post = None self.last_cls = None gpu = f'{(shared.gpu_memory * shared.opts.diffusers_offload_min_gpu_memory):.2f}-{(shared.gpu_memory * shared.opts.diffusers_offload_max_gpu_memory):.2f}:{shared.gpu_memory:.2f}' - shared.log.info(f'Offload: type=balanced op=init watermark={self.min_watermark}-{self.max_watermark} gpu={gpu} cpu={shared.cpu_memory:.3f} limit={shared.opts.cuda_mem_fraction:.2f} always={self.offload_always} never={self.offload_never} pre={shared.opts.diffusers_offload_pre}') + shared.log.info(f'Offload: type=balanced op=init watermark={self.min_watermark}-{self.max_watermark} gpu={gpu} cpu={shared.cpu_memory:.3f} limit={shared.opts.cuda_mem_fraction:.2f} always={self.offload_always} never={self.offload_never} pre={shared.opts.diffusers_offload_pre} streams={shared.opts.diffusers_offload_streams}') self.validate() super().__init__() @@ -210,8 +211,12 @@ class OffloadHook(accelerate.hooks.ModelHook): def pre_forward(self, module, *args, **kwargs): _id = id(module) - if (self.last_pre != _id) and (module.__class__.__name__ != self.last_cls) and self.offload_allowed(module): # offload every other module first time when new module starts pre-forward + + do_offload = (self.last_pre != _id) or (module.__class__.__name__ != self.last_cls) + + if do_offload and self.offload_allowed(module): # offload every other module first time when new module starts pre-forward if shared.opts.diffusers_offload_pre: + t0 = time.time() debug_move(f'Offload: type=balanced op=pre module={module.__class__.__name__}') for pipe in get_pipe_variants(): for module_name in get_module_names(pipe): @@ -220,15 +225,16 @@ class OffloadHook(accelerate.hooks.ModelHook): if (_id != id(module_instance)) and (module_cls not in self.offload_never) and (not devices.same_device(module_instance.device, devices.cpu)): apply_balanced_offload_to_module(module_instance, op='pre') self.last_cls = module.__class__.__name__ - self.last_pre = _id + process_timer.add('offload', time.time() - t0) if not devices.same_device(module.device, devices.device): # move-to-device + t0 = time.time() device_index = torch.device(devices.device).index if device_index is None: device_index = 0 max_memory = { device_index: self.gpu, "cpu": self.cpu } device_map = getattr(module, "balanced_offload_device_map", None) - if device_map is None or max_memory != getattr(module, "balanced_offload_max_memory", None): + if (device_map is None) or (max_memory != getattr(module, "balanced_offload_max_memory", None)): device_map = accelerate.infer_auto_device_map(module, max_memory=max_memory) offload_dir = getattr(module, "offload_dir", os.path.join(shared.opts.accelerate_offload_path, module.__class__.__name__)) if devices.backend == "directml": @@ -241,13 +247,15 @@ class OffloadHook(accelerate.hooks.ModelHook): module._hf_hook.execution_device = torch.device(devices.device) # pylint: disable=protected-access module.balanced_offload_device_map = device_map module.balanced_offload_max_memory = max_memory + process_timer.add('onload', time.time() - t0) if debug: - for pipe in get_pipe_variants(): + for _i, pipe in enumerate(get_pipe_variants()): for module_name in get_module_names(pipe): module_instance = getattr(pipe, module_name, None) - shared.log.trace(f'Offload: type=balanced op=pre:status module={module_instance.__class__.__name__} device={module_instance.device} dtype={module_instance.dtype}') + shared.log.trace(f'Offload: type=balanced op=pre:status forward={module.__class__.__name__} module={module_name} class={module_instance.__class__.__name__} pipe={_i} device={module_instance.device} dtype={module_instance.dtype}') + self.last_pre = _id return args, kwargs def post_forward(self, module, output): @@ -283,6 +291,7 @@ def get_module_names(pipe=None, exclude=[]): modules_names = get_signature(pipe).keys() modules_names = [m for m in modules_names if m not in exclude and not m.startswith('_')] modules_names = [m for m in modules_names if isinstance(getattr(pipe, m, None), torch.nn.Module)] + modules_names = list(sorted(set(modules_names))) return modules_names @@ -308,6 +317,17 @@ def get_module_sizes(pipe=None, exclude=[]): def move_module_to_cpu(module, op='unk', force:bool=False): + def do_move(module): + if shared.opts.diffusers_offload_streams: + global move_stream # pylint: disable=global-statement + if move_stream is None: + move_stream = torch.cuda.Stream(device=devices.device) + with torch.cuda.stream(move_stream): + module = module.to(devices.cpu) + else: + module = module.to(devices.cpu) + return module + try: module_name = getattr(module, "module_name", module.__class__.__name__) module_size = offload_hook_instance.offload_map.get(module_name, offload_hook_instance.model_size()) @@ -318,17 +338,17 @@ def move_module_to_cpu(module, op='unk', force:bool=False): op = f'{op}:skip' if force: op = f'{op}:force' - module = module.to(devices.cpu) + module = do_move(module) used_gpu -= module_size elif module_cls in offload_hook_instance.offload_never: op = f'{op}:never' elif module_cls in offload_hook_instance.offload_always: op = f'{op}:always' - module = module.to(devices.cpu) + module = do_move(module) used_gpu -= module_size elif perc_gpu > shared.opts.diffusers_offload_min_gpu_memory: op = f'{op}:mem' - module = module.to(devices.cpu) + module = do_move(module) used_gpu -= module_size if debug: quant = getattr(module, "quantization_method", None) diff --git a/modules/shared.py b/modules/shared.py index a969c81b0..25db15490 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -170,6 +170,7 @@ options_templates.update(options_section(('offload', "Model Offloading"), { "diffusers_offload_nonblocking": OptionInfo(False, "Non-blocking move operations"), "offload_balanced_sep": OptionInfo("

Balanced Offload

", "", gr.HTML), "diffusers_offload_pre": OptionInfo(True, "Offload during pre-forward"), + "diffusers_offload_streams": OptionInfo(False, "Offload using streams"), "diffusers_offload_min_gpu_memory": OptionInfo(startup_offload_min_gpu, "Offload low watermark", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01 }), "diffusers_offload_max_gpu_memory": OptionInfo(startup_offload_max_gpu, "Offload GPU high watermark", gr.Slider, {"minimum": 0.1, "maximum": 1, "step": 0.01 }), "diffusers_offload_max_cpu_memory": OptionInfo(0.90, "Offload CPU high watermark", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01, "visible": False }), diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index 1d320f760..fb77c855b 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -14,6 +14,8 @@ version_map = { "SDXL Hyper": "SD XL", "StableDiffusion3": "SD 3", "StableDiffusionXL": "SD XL", + "WanToVideo": "Wan", + "WanVACE": "Wan", } class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index 6d92db375..b9ff5c260 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -169,6 +169,12 @@ models = { te_cls=transformers.T5EncoderModel, dit_cls=diffusers.WanTransformer3DModel, dit_folder=("transformer", "transformer_2")), + Model(name='WAN 2.2 14B VACE', + url='https://huggingface.co/Wan-AI/Wan2.2-14B-VACE-T2V-Diffusers', + repo='linoyts/Wan2.2-VACE-Fun-14B-diffusers', + repo_cls=diffusers.WanVACEPipeline, + te_cls=transformers.T5EncoderModel, + dit_cls=diffusers.WanVACETransformer3DModel), Model(name='WAN 2.1 1.3B T2V', url='https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers', repo='Wan-AI/Wan2.1-T2V-1.3B-Diffusers', @@ -204,13 +210,13 @@ models = { repo='Wan-AI/Wan2.1-VACE-1.3B-diffusers', repo_cls=diffusers.WanVACEPipeline, te_cls=transformers.T5EncoderModel, - dit_cls=diffusers.WanTransformer3DModel), + dit_cls=diffusers.WanVACETransformer3DModel), Model(name='WAN 2.1 VACE 14B', url='https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers', repo='Wan-AI/Wan2.1-VACE-14B-diffusers', repo_cls=diffusers.WanVACEPipeline, te_cls=transformers.T5EncoderModel, - dit_cls=diffusers.WanTransformer3DModel), + dit_cls=diffusers.WanVACETransformer3DModel), ], 'SkyReels V2': [ Model(name='None'), diff --git a/modules/video_models/video_overrides.py b/modules/video_models/video_overrides.py index 5ce02e20a..53c2915ee 100644 --- a/modules/video_models/video_overrides.py +++ b/modules/video_models/video_overrides.py @@ -32,19 +32,22 @@ def set_overrides(p: processing.StableDiffusionProcessingVideo, selected: Model) if selected.name == 'Latte 1 T2V': p.task_args['enable_temporal_attentions'] = True p.task_args['video_length'] = 16 * (max(p.frames // 16, 1)) + # SkyReels + if 'SkyReelsV2DiffusionForcing' in cls: + p.task_args['overlap_history'] = 17 # LTX if cls == 'LTXImageToVideoPipeline' or cls == 'LTXConditionPipeline': p.task_args['generator'] = None if cls == 'LTXConditionPipeline': p.task_args['strength'] = p.denoising_strength + if 'LTX' in cls: + p.task_args['width'] = 32 * (p.width // 32) + p.task_args['height'] = 32 * (p.height // 32) # WAN if 'Wan' in cls: p.task_args['width'] = 16 * (p.width // 16) p.task_args['height'] = 16 * (p.height // 16) p.frames = 4 * (max(p.frames // 4, 1)) + 1 - # LTX - if 'LTX' in cls: - p.task_args['width'] = 32 * (p.width // 32) - p.task_args['height'] = 32 * (p.height // 32) - if 'SkyReelsV2DiffusionForcing' in cls: - p.task_args['overlap_history'] = 17 + # WAN VACE + if 'WanVACEPipeline' in cls: + p.task_args['reference_images'] = 1 diff --git a/modules/video_models/video_run.py b/modules/video_models/video_run.py index 508980bad..33d4f5d13 100644 --- a/modules/video_models/video_run.py +++ b/modules/video_models/video_run.py @@ -53,7 +53,10 @@ def generate(*args, **kwargs): p.do_not_save_grid = True p.do_not_save_samples = not save_frames p.outpath_samples = shared.opts.outdir_samples or shared.opts.outdir_video - if 'I2V' in model: + if 'T2V' in model: + if init_image is not None: + shared.log.warning('Video: op=T2V init image not supported') + elif 'I2V' in model: if init_image is None: return video_utils.queue_err('init image not set') p.task_args['image'] = images.resize_image(resize_mode=2, im=init_image, width=p.width, height=p.height, upscaler_name=None, output_type='pil') @@ -66,9 +69,10 @@ def generate(*args, **kwargs): p.task_args['image'] = images.resize_image(resize_mode=2, im=init_image, width=p.width, height=p.height, upscaler_name=None, output_type='pil') p.task_args['last_image'] = images.resize_image(resize_mode=2, im=last_image, width=p.width, height=p.height, upscaler_name=None, output_type='pil') shared.log.debug(f'Video: op=FLF2V init={init_image} last={last_image} resized={p.task_args["image"]}') - elif 'T2V' in model: + elif 'VACE' in model: if init_image is not None: - shared.log.warning('Video: op=T2V init image not supported') + p.task_args['reference_images'] = [images.resize_image(resize_mode=2, im=init_image, width=p.width, height=p.height, upscaler_name=None, output_type='pil')] + shared.log.debug(f'Video: op=VACE reference={init_image} resized={p.task_args["reference_images"]}') else: shared.log.warning(f'Video: unknown model type "{model}"') diff --git a/pipelines/model_wanai.py b/pipelines/model_wanai.py index b0a7d8d85..e44d1eb78 100644 --- a/pipelines/model_wanai.py +++ b/pipelines/model_wanai.py @@ -8,6 +8,11 @@ def load_transformer(repo_id, diffusers_load_config={}, subfolder='transformer') load_args, quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model', device_map=True) fn = None + if 'VACE' in repo_id: + transformer_cls = diffusers.WanVACETransformer3DModel + else: + transformer_cls = diffusers.WanTransformer3DModel + if shared.opts.sd_unet is not None and shared.opts.sd_unet != 'Default': from modules import sd_unet if shared.opts.sd_unet not in list(sd_unet.unet_dict): @@ -20,7 +25,7 @@ def load_transformer(repo_id, diffusers_load_config={}, subfolder='transformer') transformer = None elif fn is not None and 'safetensors' in fn.lower(): shared.log.debug(f'Load model: type=WanAI {subfolder}="{fn}" quant="{model_quant.get_quant(repo_id)}" args={load_args}') - transformer = diffusers.WanTransformer3DModel.from_single_file( + transformer = transformer_cls.from_single_file( fn, cache_dir=shared.opts.hfcache_dir, **load_args, @@ -28,7 +33,7 @@ def load_transformer(repo_id, diffusers_load_config={}, subfolder='transformer') ) else: shared.log.debug(f'Load model: type=WanAI {subfolder}="{repo_id}" quant="{model_quant.get_quant_type(quant_args)}" args={load_args}') - transformer = diffusers.WanTransformer3DModel.from_pretrained( + transformer = transformer_cls.from_pretrained( repo_id, subfolder=subfolder, cache_dir=shared.opts.hfcache_dir, @@ -60,7 +65,7 @@ def load_wan(checkpoint_info, diffusers_load_config={}): repo_id = sd_models.path_to_repo(checkpoint_info) sd_models.hf_auth_check(checkpoint_info) - if 'a14b' in repo_id.lower(): + if 'a14b' in repo_id.lower() or 'fun-14b' in repo_id.lower(): if shared.opts.model_wan_stage == 'high noise' or shared.opts.model_wan_stage == 'first': transformer = load_transformer(repo_id, diffusers_load_config, 'transformer') transformer_2 = None @@ -83,13 +88,18 @@ def load_wan(checkpoint_info, diffusers_load_config={}): boundary_ratio = shared.opts.model_wan_boundary if transformer_2 is not None else None if 'Wan2.2-I2V' in repo_id: - cls = diffusers.WanImageToVideoPipeline + pipe_cls = diffusers.WanImageToVideoPipeline diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanImageToVideoPipeline + elif 'Wan2.2-VACE' in repo_id: + pipe_cls = diffusers.WanVACEPipeline + diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanVACEPipeline + diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanVACEPipeline + diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["wanai"] = diffusers.WanVACEPipeline else: - cls = diffusers.WanPipeline + pipe_cls = diffusers.WanPipeline diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanPipeline - shared.log.debug(f'Load model: type=WanAI model="{checkpoint_info.name}" repo="{repo_id}" cls={cls.__name__} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args} stage="{shared.opts.model_wan_stage}" boundary={boundary_ratio}') - pipe = cls.from_pretrained( + shared.log.debug(f'Load model: type=WanAI model="{checkpoint_info.name}" repo="{repo_id}" cls={pipe_cls.__name__} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args} stage="{shared.opts.model_wan_stage}" boundary={boundary_ratio}') + pipe = pipe_cls.from_pretrained( repo_id, transformer=transformer, transformer_2=transformer_2, From e83df5071719ff223497590b44ae4bb5ca5af2b9 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 17 Sep 2025 19:40:25 +0300 Subject: [PATCH 007/230] IPEX fix missing dtype from randn --- modules/intel/ipex/hijacks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index feb31bec2..e617eed3a 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -322,9 +322,9 @@ def torch_randn(*args, device=None, dtype=None, **kwargs): if dtype is bytes: dtype = None if check_cuda(device): - return original_torch_randn(*args, device=return_xpu(device), **kwargs) + return original_torch_randn(*args, device=return_xpu(device), dtype=dtype, **kwargs) else: - return original_torch_randn(*args, device=device, **kwargs) + return original_torch_randn(*args, device=device, dtype=dtype, **kwargs) original_torch_ones = torch.ones @wraps(torch.ones) From cc51f79508fa831a15918074e4670b4302eb062d Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 17 Sep 2025 19:53:05 +0300 Subject: [PATCH 008/230] IPEX remove outdated hijacks --- modules/intel/ipex/hijacks.py | 168 ++++++++-------------------------- 1 file changed, 37 insertions(+), 131 deletions(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index e617eed3a..e52327971 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -16,14 +16,6 @@ torch_version[0], torch_version[1] = int(torch_version[0]), int(torch_version[1] device_supports_fp64 = torch.xpu.has_fp64_dtype() if hasattr(torch.xpu, "has_fp64_dtype") else torch.xpu.get_device_properties(devices.device).has_fp64 -if os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '0': - if torch_version[0] > 2 or (torch_version[0] == 2 and torch_version[1] >= 7): - use_dynamic_attention = False # torch 2.7 has flash atten support - else: - use_dynamic_attention = True -else: - use_dynamic_attention = bool(os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '1') - # pylint: disable=protected-access, missing-function-docstring, line-too-long, unnecessary-lambda, no-else-return class DummyDataParallel(torch.nn.Module): # pylint: disable=missing-class-docstring, unused-argument, too-few-public-methods @@ -106,6 +98,30 @@ def interpolate(tensor, size=None, scale_factor=None, mode='nearest', align_corn align_corners=align_corners, recompute_scale_factor=recompute_scale_factor, antialias=antialias) +# SwinIR BF16: +original_functional_pad = torch.nn.functional.pad +@wraps(torch.nn.functional.pad) +def functional_pad(input, pad, mode='constant', value=None): + if mode == 'reflect' and input.dtype == torch.bfloat16: + return original_functional_pad(input.to(torch.float32), pad, mode=mode, value=value).to(dtype=torch.bfloat16) + else: + return original_functional_pad(input, pad, mode=mode, value=value) + +# Diffusers FreeU +original_fft_fftn = torch.fft.fftn +@wraps(torch.fft.fftn) +def fft_fftn(input, s=None, dim=None, norm=None, *, out=None): + return_dtype = input.dtype + return original_fft_fftn(input.to(dtype=torch.float32), s=s, dim=dim, norm=norm, out=out).to(dtype=return_dtype) + +# Diffusers FreeU +original_fft_ifftn = torch.fft.ifftn +@wraps(torch.fft.ifftn) +def fft_ifftn(input, s=None, dim=None, norm=None, *, out=None): + return_dtype = input.dtype + return original_fft_ifftn(input.to(dtype=torch.float32), s=s, dim=dim, norm=norm, out=out).to(dtype=return_dtype) + + # Diffusers Float64 (Alchemist GPUs doesn't support 64 bit): original_from_numpy = torch.from_numpy @wraps(torch.from_numpy) @@ -126,120 +142,6 @@ def as_tensor(data, dtype=None, device=None): return original_as_tensor(data, dtype=dtype, device=device) -if not use_dynamic_attention: - original_scaled_dot_product_attention = torch.nn.functional.scaled_dot_product_attention -else: - # 32 bit attention workarounds for Alchemist: - try: - from .attention import dynamic_scaled_dot_product_attention as original_scaled_dot_product_attention - except ImportError: - original_scaled_dot_product_attention = torch.nn.functional.scaled_dot_product_attention - -@wraps(torch.nn.functional.scaled_dot_product_attention) -def scaled_dot_product_attention(query: torch.FloatTensor, key: torch.FloatTensor, value: torch.FloatTensor, attn_mask: Optional[torch.FloatTensor] = None, dropout_p: float = 0.0, is_causal: bool = False, scale: Optional[float] = None, enable_gqa: bool = False, **kwargs) -> torch.FloatTensor: - if query.dtype != key.dtype: - key = key.to(dtype=query.dtype) - if query.dtype != value.dtype: - value = value.to(dtype=query.dtype) - if attn_mask is not None and query.dtype != attn_mask.dtype: - attn_mask = attn_mask.to(dtype=query.dtype) - if enable_gqa: - kwargs["enable_gqa"] = enable_gqa - result = original_scaled_dot_product_attention(query, key, value, attn_mask=attn_mask, dropout_p=dropout_p, is_causal=is_causal, scale=scale, **kwargs) - if result.dtype != query.dtype: - result = result.to(dtype=query.dtype) - return result - -# Data Type Errors: -original_torch_bmm = torch.bmm -@wraps(torch.bmm) -def torch_bmm(input, mat2, *, out=None): - if input.dtype != mat2.dtype: - mat2 = mat2.to(dtype=input.dtype) - return original_torch_bmm(input, mat2, out=out) - -# Diffusers FreeU -original_fft_fftn = torch.fft.fftn -@wraps(torch.fft.fftn) -def fft_fftn(input, s=None, dim=None, norm=None, *, out=None): - return_dtype = input.dtype - return original_fft_fftn(input.to(dtype=torch.float32), s=s, dim=dim, norm=norm, out=out).to(dtype=return_dtype) - -# Diffusers FreeU -original_fft_ifftn = torch.fft.ifftn -@wraps(torch.fft.ifftn) -def fft_ifftn(input, s=None, dim=None, norm=None, *, out=None): - return_dtype = input.dtype - return original_fft_ifftn(input.to(dtype=torch.float32), s=s, dim=dim, norm=norm, out=out).to(dtype=return_dtype) - -# A1111 FP16 -original_functional_group_norm = torch.nn.functional.group_norm -@wraps(torch.nn.functional.group_norm) -def functional_group_norm(input, num_groups, weight=None, bias=None, eps=1e-05): - if weight is not None and input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and weight is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_group_norm(input, num_groups, weight=weight, bias=bias, eps=eps) - -# A1111 BF16 -original_functional_layer_norm = torch.nn.functional.layer_norm -@wraps(torch.nn.functional.layer_norm) -def functional_layer_norm(input, normalized_shape, weight=None, bias=None, eps=1e-05): - if weight is not None and input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and weight is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_layer_norm(input, normalized_shape, weight=weight, bias=bias, eps=eps) - -# Training -original_functional_linear = torch.nn.functional.linear -@wraps(torch.nn.functional.linear) -def functional_linear(input, weight, bias=None): - if input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_linear(input, weight, bias=bias) - -original_functional_conv1d = torch.nn.functional.conv1d -@wraps(torch.nn.functional.conv1d) -def functional_conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1): - if input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_conv1d(input, weight, bias=bias, stride=stride, padding=padding, dilation=dilation, groups=groups) - -original_functional_conv2d = torch.nn.functional.conv2d -@wraps(torch.nn.functional.conv2d) -def functional_conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1): - if input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_conv2d(input, weight, bias=bias, stride=stride, padding=padding, dilation=dilation, groups=groups) - -# LTX Video -original_functional_conv3d = torch.nn.functional.conv3d -@wraps(torch.nn.functional.conv3d) -def functional_conv3d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1): - if input.dtype != weight.data.dtype: - input = input.to(dtype=weight.data.dtype) - if bias is not None and bias.data.dtype != weight.data.dtype: - bias.data = bias.data.to(dtype=weight.data.dtype) - return original_functional_conv3d(input, weight, bias=bias, stride=stride, padding=padding, dilation=dilation, groups=groups) - -# SwinIR BF16: -original_functional_pad = torch.nn.functional.pad -@wraps(torch.nn.functional.pad) -def functional_pad(input, pad, mode='constant', value=None): - if mode == 'reflect' and input.dtype == torch.bfloat16: - return original_functional_pad(input.to(torch.float32), pad, mode=mode, value=value).to(dtype=torch.bfloat16) - else: - return original_functional_pad(input, pad, mode=mode, value=value) - - original_torch_tensor = torch.tensor @wraps(torch.tensor) def torch_tensor(data, *args, dtype=None, device=None, **kwargs): @@ -438,18 +340,10 @@ def ipex_hijacks(): torch.amp.autocast_mode.autocast.__init__ = autocast_init torch.nn.functional.interpolate = interpolate - torch.nn.functional.scaled_dot_product_attention = scaled_dot_product_attention - torch.nn.functional.group_norm = functional_group_norm - torch.nn.functional.layer_norm = functional_layer_norm - torch.nn.functional.linear = functional_linear - torch.nn.functional.conv1d = functional_conv1d - torch.nn.functional.conv2d = functional_conv2d - torch.nn.functional.conv3d = functional_conv3d torch.nn.functional.pad = functional_pad - - torch.bmm = torch_bmm torch.fft.fftn = fft_fftn torch.fft.ifftn = fft_ifftn + if not device_supports_fp64: torch.from_numpy = from_numpy torch.as_tensor = as_tensor @@ -460,6 +354,18 @@ def ipex_hijacks(): except Exception: pass + if os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '0': + if torch_version[0] > 2 or (torch_version[0] == 2 and torch_version[1] >= 7): + use_dynamic_attention = False # torch 2.7 has flash atten support + else: + use_dynamic_attention = True + else: + use_dynamic_attention = bool(os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '1') + + if use_dynamic_attention: + from .attention import dynamic_scaled_dot_product_attention + torch.nn.functional.scaled_dot_product_attention = dynamic_scaled_dot_product_attention + # AMP: torch.amp.grad_scaler.GradScaler.__init__ = GradScaler_init torch.is_autocast_enabled = torch_is_autocast_enabled From 2842f5e3aa60ff3a5daad33eccd7f43015617c06 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 17 Sep 2025 19:58:21 +0300 Subject: [PATCH 009/230] cleanup --- modules/intel/ipex/hijacks.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index e52327971..da24dcbcb 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -1,5 +1,3 @@ -from typing import Optional - import os from functools import wraps from contextlib import nullcontext @@ -18,28 +16,27 @@ device_supports_fp64 = torch.xpu.has_fp64_dtype() if hasattr(torch.xpu, "has_fp6 # pylint: disable=protected-access, missing-function-docstring, line-too-long, unnecessary-lambda, no-else-return -class DummyDataParallel(torch.nn.Module): # pylint: disable=missing-class-docstring, unused-argument, too-few-public-methods - def __new__(cls, module, device_ids=None, output_device=None, dim=0): # pylint: disable=unused-argument - if isinstance(device_ids, list) and len(device_ids) > 1: - errors.log.error("IPEX backend doesn't support DataParallel on multiple XPU devices") - return module.to(devices.device) def return_null_context(*args, **kwargs): # pylint: disable=unused-argument return nullcontext() + @property def is_cuda(self): return self.device.type == "xpu" or self.device.type == "cuda" + def check_device_type(device, device_type: str) -> bool: if device is None or type(device) not in {str, int, torch.device}: return False else: return bool(torch.device(device).type == device_type) + def check_cuda(device) -> bool: return bool(isinstance(device, int) or check_device_type(device, "cuda")) + def return_xpu(device): # keep the device instance type, aka return string if the input is string return devices.device if device is None else f"xpu:{device.split(':')[-1]}" if isinstance(device, str) and ":" in device else f"xpu:{device}" if isinstance(device, int) else torch.device(f"xpu:{device.index}" if device.index is not None else "xpu") if isinstance(device, torch.device) else "xpu" @@ -107,6 +104,7 @@ def functional_pad(input, pad, mode='constant', value=None): else: return original_functional_pad(input, pad, mode=mode, value=value) + # Diffusers FreeU original_fft_fftn = torch.fft.fftn @wraps(torch.fft.fftn) @@ -114,6 +112,7 @@ def fft_fftn(input, s=None, dim=None, norm=None, *, out=None): return_dtype = input.dtype return original_fft_fftn(input.to(dtype=torch.float32), s=s, dim=dim, norm=norm, out=out).to(dtype=return_dtype) + # Diffusers FreeU original_fft_ifftn = torch.fft.ifftn @wraps(torch.fft.ifftn) @@ -131,6 +130,7 @@ def from_numpy(ndarray): else: return original_from_numpy(ndarray) + original_as_tensor = torch.as_tensor @wraps(torch.as_tensor) def as_tensor(data, dtype=None, device=None): @@ -156,6 +156,7 @@ def torch_tensor(data, *args, dtype=None, device=None, **kwargs): dtype = torch.float32 return original_torch_tensor(data, *args, dtype=dtype, device=device, **kwargs) + torch.Tensor.original_Tensor_to = torch.Tensor.to @wraps(torch.Tensor.to) def Tensor_to(self, device=None, *args, **kwargs): @@ -169,6 +170,7 @@ def Tensor_to(self, device=None, *args, **kwargs): device = torch.float32 return self.original_Tensor_to(device, *args, **kwargs) + original_Tensor_cuda = torch.Tensor.cuda @wraps(torch.Tensor.cuda) def Tensor_cuda(self, device=None, *args, **kwargs): @@ -177,6 +179,7 @@ def Tensor_cuda(self, device=None, *args, **kwargs): else: return original_Tensor_cuda(self, device, *args, **kwargs) + original_Tensor_pin_memory = torch.Tensor.pin_memory @wraps(torch.Tensor.pin_memory) def Tensor_pin_memory(self, device=None, *args, **kwargs): @@ -185,6 +188,7 @@ def Tensor_pin_memory(self, device=None, *args, **kwargs): else: return original_Tensor_pin_memory(self, device, *args, **kwargs) + original_UntypedStorage_init = torch.UntypedStorage.__init__ @wraps(torch.UntypedStorage.__init__) def UntypedStorage_init(*args, device=None, **kwargs): @@ -193,6 +197,7 @@ def UntypedStorage_init(*args, device=None, **kwargs): else: return original_UntypedStorage_init(*args, device=device, **kwargs) + if torch_version[0] > 2 or (torch_version[0] == 2 and torch_version[1] >= 4): original_UntypedStorage_to = torch.UntypedStorage.to @wraps(torch.UntypedStorage.to) @@ -210,6 +215,7 @@ if torch_version[0] > 2 or (torch_version[0] == 2 and torch_version[1] >= 4): else: return original_UntypedStorage_cuda(self, device=device, non_blocking=non_blocking, **kwargs) + original_torch_empty = torch.empty @wraps(torch.empty) def torch_empty(*args, device=None, **kwargs): @@ -218,6 +224,7 @@ def torch_empty(*args, device=None, **kwargs): else: return original_torch_empty(*args, device=device, **kwargs) + original_torch_randn = torch.randn @wraps(torch.randn) def torch_randn(*args, device=None, dtype=None, **kwargs): @@ -228,6 +235,7 @@ def torch_randn(*args, device=None, dtype=None, **kwargs): else: return original_torch_randn(*args, device=device, dtype=dtype, **kwargs) + original_torch_ones = torch.ones @wraps(torch.ones) def torch_ones(*args, device=None, **kwargs): @@ -236,6 +244,7 @@ def torch_ones(*args, device=None, **kwargs): else: return original_torch_ones(*args, device=device, **kwargs) + original_torch_zeros = torch.zeros @wraps(torch.zeros) def torch_zeros(*args, device=None, **kwargs): @@ -244,6 +253,7 @@ def torch_zeros(*args, device=None, **kwargs): else: return original_torch_zeros(*args, device=device, **kwargs) + original_torch_full = torch.full @wraps(torch.full) def torch_full(*args, device=None, **kwargs): @@ -252,6 +262,7 @@ def torch_full(*args, device=None, **kwargs): else: return original_torch_full(*args, device=device, **kwargs) + original_torch_linspace = torch.linspace @wraps(torch.linspace) def torch_linspace(*args, device=None, **kwargs): @@ -260,6 +271,7 @@ def torch_linspace(*args, device=None, **kwargs): else: return original_torch_linspace(*args, device=device, **kwargs) + original_torch_eye = torch.eye @wraps(torch.eye) def torch_eye(*args, device=None, **kwargs): @@ -268,6 +280,7 @@ def torch_eye(*args, device=None, **kwargs): else: return original_torch_eye(*args, device=device, **kwargs) + original_torch_load = torch.load @wraps(torch.load) def torch_load(f, map_location=None, *args, **kwargs): @@ -276,6 +289,7 @@ def torch_load(f, map_location=None, *args, **kwargs): else: return original_torch_load(f, *args, map_location=map_location, **kwargs) + @wraps(torch.cuda.synchronize) def torch_cuda_synchronize(device=None): if check_cuda(device): @@ -283,6 +297,7 @@ def torch_cuda_synchronize(device=None): else: return torch.xpu.synchronize(device) + @wraps(torch.cuda.device) def torch_cuda_device(device): if check_cuda(device): @@ -290,6 +305,7 @@ def torch_cuda_device(device): else: return torch.xpu.device(device) + @wraps(torch.cuda.set_device) def torch_cuda_set_device(device): if check_cuda(device): @@ -297,6 +313,7 @@ def torch_cuda_set_device(device): else: torch.xpu.set_device(device) + # torch.Generator has to be a class for isinstance checks original_torch_Generator = torch.Generator class torch_Generator(original_torch_Generator): @@ -335,7 +352,6 @@ def ipex_hijacks(): torch._C.Generator = torch_Generator torch.backends.cuda.sdp_kernel = return_null_context - torch.nn.DataParallel = DummyDataParallel torch.UntypedStorage.is_cuda = is_cuda torch.amp.autocast_mode.autocast.__init__ = autocast_init From 6f969958aec01ed9a9736f677e25c6c39d89ed9b Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 17 Sep 2025 20:15:00 +0300 Subject: [PATCH 010/230] remove sdp_kernel hijack --- modules/intel/ipex/hijacks.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index da24dcbcb..c9be1f789 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -3,7 +3,7 @@ from functools import wraps from contextlib import nullcontext import torch import numpy as np -from modules import devices, errors +from modules import devices torch_version = torch.__version__[:4] @@ -17,10 +17,6 @@ device_supports_fp64 = torch.xpu.has_fp64_dtype() if hasattr(torch.xpu, "has_fp6 # pylint: disable=protected-access, missing-function-docstring, line-too-long, unnecessary-lambda, no-else-return -def return_null_context(*args, **kwargs): # pylint: disable=unused-argument - return nullcontext() - - @property def is_cuda(self): return self.device.type == "xpu" or self.device.type == "cuda" @@ -351,7 +347,6 @@ def ipex_hijacks(): torch.Generator = torch_Generator torch._C.Generator = torch_Generator - torch.backends.cuda.sdp_kernel = return_null_context torch.UntypedStorage.is_cuda = is_cuda torch.amp.autocast_mode.autocast.__init__ = autocast_init From e43956460fa1118a75f55583aef62dd539210a13 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 09:08:08 -0400 Subject: [PATCH 011/230] revert force new pydantic Signed-off-by: Vladimir Mandic --- installer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/installer.py b/installer.py index 40c56348b..28590d142 100644 --- a/installer.py +++ b/installer.py @@ -1256,8 +1256,12 @@ def install_gradio(): def install_pydantic(): - install('pydantic==2.11.7', ignore=True, quiet=True) - reload('pydantic', '2.11.7') + if args.new: + install('pydantic==2.11.7', ignore=True, quiet=True) + reload('pydantic', '2.11.7') + else: + install('pydantic==1.10.21', ignore=True, quiet=True) + reload('pydantic', '1.10.21') def install_insightface(): From daa193be374302435850d3c3e54f3c253d332af4 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 09:28:58 -0400 Subject: [PATCH 012/230] delete agent-scheduler Signed-off-by: Vladimir Mandic --- extensions-builtin/sd-webui-agent-scheduler | 1 - 1 file changed, 1 deletion(-) delete mode 160000 extensions-builtin/sd-webui-agent-scheduler diff --git a/extensions-builtin/sd-webui-agent-scheduler b/extensions-builtin/sd-webui-agent-scheduler deleted file mode 160000 index a33753321..000000000 --- a/extensions-builtin/sd-webui-agent-scheduler +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a33753321b914c6122df96d1dc0b5117d38af680 From 14804259d37208bac3fd710d5bf40eb77d3e3993 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 09:29:04 -0400 Subject: [PATCH 013/230] delete agent-scheduler Signed-off-by: Vladimir Mandic --- .gitmodules | 4 ---- CHANGELOG.md | 6 +++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitmodules b/.gitmodules index 0ead18186..41ed87300 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,10 +14,6 @@ path = extensions-builtin/stable-diffusion-webui-rembg url = https://github.com/vladmandic/sd-extension-rembg ignore = dirty -[submodule "extensions-builtin/sd-webui-agent-scheduler"] - path = extensions-builtin/sd-webui-agent-scheduler - url = https://github.com/ArtVentureX/sd-webui-agent-scheduler - ignore = dirty [submodule "extensions-builtin/sdnext-modernui"] path = extensions-builtin/sdnext-modernui url = https://github.com/BinaryQuantumSoul/sdnext-modernui diff --git a/CHANGELOG.md b/CHANGELOG.md index cc6fe5ecf..d5613d2b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,14 @@ # Change Log for SD.Next -## Update for 2025-09-17 +## Update for 2025-09-18 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows +- **Extensions** + - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years + it also does not work with control and video tabs which are the core of sdnext nowadays + so it has been removed from built-in extensions: manual installation is still possible - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate From 94cb993e99969e253299433d2ea5c98f0e37ba10 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 10:22:06 -0400 Subject: [PATCH 014/230] framepack add hf auth check Signed-off-by: Vladimir Mandic --- modules/framepack/framepack_load.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/framepack/framepack_load.py b/modules/framepack/framepack_load.py index 0e80e8485..ed9fdde43 100644 --- a/modules/framepack/framepack_load.py +++ b/modules/framepack/framepack_load.py @@ -124,6 +124,10 @@ def load_model(variant:str=None, pipeline:str=None, text_encoder:str=None, text_ sd_models.unload_model_weights() t0 = time.time() + sd_models.hf_auth_check(model["transformer"]["repo"]) + sd_models.hf_auth_check(model["text_encoder"]["repo"]) + sd_models.hf_auth_check(model["text_encoder_2"]["repo"]) + shared.log.debug(f'FramePack load: module=llm {model["text_encoder"]}') load_args, quant_args = model_quant.get_dit_args({}, module='TE', device_map=True) text_encoder = LlamaModel.from_pretrained(model["text_encoder"]["repo"], subfolder=model["text_encoder"]["subfolder"], cache_dir=shared.opts.hfcache_dir, **load_args, **quant_args) From d2b9930d560a93fc7315b4546eeea10254c9636e Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 10:28:02 -0400 Subject: [PATCH 015/230] update system-info extension Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 12 ++++++++---- extensions-builtin/sd-extension-system-info | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5613d2b1..b9c657cc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,18 +5,22 @@ - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows -- **Extensions** - - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years - it also does not work with control and video tabs which are the core of sdnext nowadays - so it has been removed from built-in extensions: manual installation is still possible - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate - experimental offloading using `torch.streams` enable in settings -> model offloading +- **Extensions** + - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years + it also does not work with control and video tabs which are the core of sdnext nowadays + so it has been removed from built-in extensions: manual installation is still possible - **Other** - **logging** enable `debug`, `docs` and `api-docs` by default + - **ipex** simplify internal implementation - refactor to use new libraries +- **Fixes** + - add explicit hf-login before framepack load + - remove forced sampler from system info benchmark ## Update for 2025-09-15 diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index 615d2f810..19a1b1b72 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit 615d2f8103fb61779037bd81523906457fbf7277 +Subproject commit 19a1b1b722b768b821f67831a6d3ba83847bcb61 From 5606519085b40c81cca771ecbdde9af92ca56f8d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 11:40:01 -0400 Subject: [PATCH 016/230] wan init image fix Signed-off-by: Vladimir Mandic --- modules/processing_args.py | 4 ++-- modules/video_models/video_overrides.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/processing_args.py b/modules/processing_args.py index 267d779f1..98a295ca1 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -126,9 +126,9 @@ def task_specific_kwargs(p, model): 'target_subject_category': getattr(p, 'prompt', '').split()[-1], 'output_type': 'pil', } - if model.__class__.__name__ == 'WanImageToVideoPipeline' and hasattr(p, 'init_images') and len(p.init_images) > 0: + if (model.__class__.__name__ == 'WanImageToVideoPipeline') and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): task_args['image'] = p.init_images[0] - if model.__class__.__name__ == 'WanVACEPipeline' and hasattr(p, 'init_images') and len(p.init_images) > 0: + if (model.__class__.__name__ == 'WanVACEPipeline') and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): task_args['reference_images'] = p.init_images if debug_enabled: diff --git a/modules/video_models/video_overrides.py b/modules/video_models/video_overrides.py index 53c2915ee..057ae3f8a 100644 --- a/modules/video_models/video_overrides.py +++ b/modules/video_models/video_overrides.py @@ -50,4 +50,5 @@ def set_overrides(p: processing.StableDiffusionProcessingVideo, selected: Model) p.frames = 4 * (max(p.frames // 4, 1)) + 1 # WAN VACE if 'WanVACEPipeline' in cls: - p.task_args['reference_images'] = 1 + if (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): + p.task_args['reference_images'] = p.init_images From f971550bfbc97b128f75dacc6d9b348888788328 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 12:05:56 -0400 Subject: [PATCH 017/230] server recommend restart on package updates Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + installer.py | 3 +++ launch.py | 3 +++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9c657cc7..7640a9655 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ it also does not work with control and video tabs which are the core of sdnext nowadays so it has been removed from built-in extensions: manual installation is still possible - **Other** + - server will note when restart is recommended due to package updates - **logging** enable `debug`, `docs` and `api-docs` by default - **ipex** simplify internal implementation - refactor to use new libraries diff --git a/installer.py b/installer.py index 28590d142..618e9958d 100644 --- a/installer.py +++ b/installer.py @@ -56,6 +56,7 @@ args = Dot({ }) git_commit = "unknown" diffusers_commit = "unknown" +restart_required = False extensions_commit = { # force specific commit for extensions 'sd-webui-controlnet': 'ecd33eb', 'adetailer': 'a89c01d' @@ -345,6 +346,8 @@ def installed(package, friendly: str = None, reload = False, quiet = False): # p log.warning(f'Install: package="{p[0]}" installed={pkg_version} required={p[1]} allowing experimental') else: log.warning(f'Install: package="{p[0]}" installed={pkg_version} required={p[1]} version mismatch') + global restart_required # pylint: disable=global-statement + restart_required = True ok = ok and (exact or args.experimental) else: if not quiet: diff --git a/launch.py b/launch.py index 8201b8275..1f55a848d 100755 --- a/launch.py +++ b/launch.py @@ -297,6 +297,9 @@ def main(): installer.log.info(f'Installer time: {init_summary()}') get_custom_args() + if installer.restart_required: + installer.log.warning('Restart is recommended due to packages updates...') + uv, instance = start_server(immediate=True, server=None) t_server = time.time() t_monitor = time.time() From 710983d0988b3ee19aabd9a0909ab9e85346dcb5 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 13:36:29 -0400 Subject: [PATCH 018/230] add flux.1-dev-srpo Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ html/reference.json | 7 +++++++ pipelines/flux/flux_nunchaku.py | 4 +++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7640a9655..0ab6a5880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows + - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) + SRPO is trained by with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate diff --git a/html/reference.json b/html/reference.json index b21dd95f7..fc070b320 100644 --- a/html/reference.json +++ b/html/reference.json @@ -138,6 +138,13 @@ "skip": true, "extras": "sampler: Default, cfg_scale: 4.5" }, + "Tencent FLUX.1 Dev SRPO": { + "path": "vladmandic/flux.1-dev-SRPO", + "preview": "vladmandic--flux.1-dev-SRPO.jpg", + "desc": "FLUX.1 Dev SRPO is Tencent trained with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference", + "skip": true, + "extras": "sampler: Default, cfg_scale: 4.5" + }, "Qwen-Image": { "path": "Qwen/Qwen-Image", diff --git a/pipelines/flux/flux_nunchaku.py b/pipelines/flux/flux_nunchaku.py index 1aba177aa..49fd77b3d 100644 --- a/pipelines/flux/flux_nunchaku.py +++ b/pipelines/flux/flux_nunchaku.py @@ -6,7 +6,9 @@ def load_flux_nunchaku(repo_id): nunchaku_precision = nunchaku.utils.get_precision() nunchaku_repo = None transformer = None - if 'flux.1-dev' in repo_id.lower(): + if 'srpo' in repo_id.lower(): + pass + elif 'flux.1-dev' in repo_id.lower(): nunchaku_repo = f"nunchaku-tech/nunchaku-flux.1-dev/svdq-{nunchaku_precision}_r32-flux.1-dev.safetensors" elif 'flux.1-schnell' in repo_id.lower(): nunchaku_repo = f"nunchaku-tech/nunchaku-flux.1-schnell/svdq-{nunchaku_precision}_r32-flux.1-schnell.safetensors" From c8dd137b22b091a9f7db8ed7c596f6361e9d6fd9 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 18 Sep 2025 13:45:14 -0400 Subject: [PATCH 019/230] add srpo reference model Signed-off-by: Vladimir Mandic --- .../Reference/vladmandic--flux.1-dev-SRPO.jpg | Bin 0 -> 41057 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/Reference/vladmandic--flux.1-dev-SRPO.jpg diff --git a/models/Reference/vladmandic--flux.1-dev-SRPO.jpg b/models/Reference/vladmandic--flux.1-dev-SRPO.jpg new file mode 100644 index 0000000000000000000000000000000000000000..436efbba25c7150baaedfea85f75d86a32045dbe GIT binary patch literal 41057 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 F|Jei3-*^B3 literal 0 HcmV?d00001 From 47cba6b0a728f3f7358c5d8eb25543485ecb47a2 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 19 Sep 2025 09:24:49 -0400 Subject: [PATCH 020/230] fix xyz with random seed Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 7 ++++--- scripts/xyz_grid.py | 10 +++++----- scripts/xyz_grid_on.py | 5 +++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ab6a5880..622d64498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-18 +## Update for 2025-09-19 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -22,8 +22,9 @@ - **ipex** simplify internal implementation - refactor to use new libraries - **Fixes** - - add explicit hf-login before framepack load - - remove forced sampler from system info benchmark + - framepack: add explicit hf-login before framepack load + - benchmark: remove forced sampler from system info benchmark + - xyz-grid: fix xyz grid with random seeds ## Update for 2025-09-15 diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index 2ec2452da..3874deb5e 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -54,9 +54,9 @@ class Script(scripts_manager.Script): with gr.Row(): with gr.Column(): - csv_mode = gr.Checkbox(label='Text inputs', value=False, elem_id=self.elem_id("csv_mode"), container=False) - draw_legend = gr.Checkbox(label='Legend', value=True, elem_id=self.elem_id("draw_legend"), container=False) - no_fixed_seeds = gr.Checkbox(label='Random seeds', value=False, elem_id=self.elem_id("no_fixed_seeds"), container=False) + draw_legend = gr.Checkbox(label='Draw legend', value=True, elem_id=self.elem_id("draw_legend"), container=False) + csv_mode = gr.Checkbox(label='Use text inputs', value=False, elem_id=self.elem_id("csv_mode"), container=False) + no_fixed_seeds = gr.Checkbox(label='Use random seeds', value=False, elem_id=self.elem_id("no_fixed_seeds"), container=False) include_time = gr.Checkbox(label='Add time info', value=False, elem_id=self.elem_id("include_time"), container=False) include_text = gr.Checkbox(label='Add text info', value=False, elem_id=self.elem_id("include_text"), container=False) with gr.Column(): @@ -168,8 +168,6 @@ class Script(scripts_manager.Script): create_video, video_type, video_duration, video_loop, video_pad, video_interpolate, ): # pylint: disable=W0221 jobid = shared.state.begin('XYZ Grid') - if not no_fixed_seeds: - processing.fix_seed(p) if not shared.opts.return_grid: p.batch_size = 1 @@ -251,6 +249,8 @@ class Script(scripts_manager.Script): xs = fix_axis_seeds(x_opt, xs) ys = fix_axis_seeds(y_opt, ys) zs = fix_axis_seeds(z_opt, zs) + else: + processing.fix_seed(p) total_jobs = len(xs) * len(ys) * len(zs) if x_opt.label == 'Steps': diff --git a/scripts/xyz_grid_on.py b/scripts/xyz_grid_on.py index f5a910f93..f79be6636 100644 --- a/scripts/xyz_grid_on.py +++ b/scripts/xyz_grid_on.py @@ -329,6 +329,11 @@ class Script(scripts_manager.Script): pc = copy(p) pc.override_settings_restore_afterwards = False pc.styles = pc.styles[:] + if no_fixed_seeds: + pc.seed = -1 + processing.fix_seed(pc) + pc.all_seeds = None + pc.all_subseeds = None x_opt.apply(pc, x, xs) y_opt.apply(pc, y, ys) z_opt.apply(pc, z, zs) From cd79f92dff3d65464d3348b9975bf7202a1fba55 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 19 Sep 2025 11:21:54 -0400 Subject: [PATCH 021/230] add opts models_not_to_offload Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ TODO.md | 1 + modules/sd_offload.py | 2 ++ modules/shared.py | 3 ++- modules/ui.py | 4 ++- modules/ui_caption.py | 1 + modules/ui_control_helpers.py | 2 +- modules/ui_docs.py | 1 + modules/ui_extensions.py | 1 + modules/ui_gallery.py | 1 + modules/ui_img2img.py | 2 +- modules/ui_loadsave.py | 48 +++++++++++++++++++++++++++-------- modules/ui_models.py | 1 + modules/ui_postprocessing.py | 1 + modules/ui_settings.py | 1 + modules/ui_txt2img.py | 2 +- modules/ui_video.py | 2 +- 17 files changed, 59 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 622d64498..569e5c194 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ - add timers to measure onload/offload times during generate - experimental offloading using `torch.streams` enable in settings -> model offloading + - new feature to specify which models types not to offload + in *settings -> model offloading -> model types not to offload* - **Extensions** - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years it also does not work with control and video tabs which are the core of sdnext nowadays diff --git a/TODO.md b/TODO.md index 26f5fa202..e796a3740 100644 --- a/TODO.md +++ b/TODO.md @@ -39,6 +39,7 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - [HunyuanImage](https://huggingface.co/tencent/HunyuanImage-2.1) - [Phantom HuMo](https://github.com/Phantom-video/Phantom) - [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO) +- [Wan2.2-Animate-14B](https://huggingface.co/Wan-AI/Wan2.2-Animate-14B) - [Magi](https://github.com/SandAI-org/MAGI-1)(https://github.com/huggingface/diffusers/pull/11713) - [SEVA](https://github.com/huggingface/diffusers/pull/11440) - [Ming](https://github.com/inclusionAI/Ming) diff --git a/modules/sd_offload.py b/modules/sd_offload.py index be0379f66..cf7a92a36 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -207,6 +207,8 @@ class OffloadHook(accelerate.hooks.ModelHook): return False if hasattr(module, 'nets') and any(hasattr(n, "offload_never") for n in module.nets): return False + if shared.sd_model_type.lower() in [m.lower().strip() for m in re.split(r'[ ,]+', shared.opts.models_not_to_offload)]: + return False return True def pre_forward(self, module, *args, **kwargs): diff --git a/modules/shared.py b/modules/shared.py index 25db15490..9577535c0 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -174,6 +174,7 @@ options_templates.update(options_section(('offload', "Model Offloading"), { "diffusers_offload_min_gpu_memory": OptionInfo(startup_offload_min_gpu, "Offload low watermark", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01 }), "diffusers_offload_max_gpu_memory": OptionInfo(startup_offload_max_gpu, "Offload GPU high watermark", gr.Slider, {"minimum": 0.1, "maximum": 1, "step": 0.01 }), "diffusers_offload_max_cpu_memory": OptionInfo(0.90, "Offload CPU high watermark", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01, "visible": False }), + "models_not_to_offload": OptionInfo("", "Model types not to offload"), "diffusers_offload_always": OptionInfo(startup_offload_always, "Modules to always offload"), "diffusers_offload_never": OptionInfo(startup_offload_never, "Modules to never offload"), "offload_group_sep": OptionInfo("

Group Offload

", "", gr.HTML), @@ -184,7 +185,7 @@ options_templates.update(options_section(('offload', "Model Offloading"), { })) options_templates.update(options_section(("quantization", "Model Quantization"), { - "models_not_to_quant": OptionInfo("", "List of model types not to quantize"), + "models_not_to_quant": OptionInfo("", "Model types not to quantize"), "sdnq_quantize_sep": OptionInfo("

SDNQ: SD.Next Quantization

", "", gr.HTML), "sdnq_quantize_weights": OptionInfo([], "Quantization enabled", gr.CheckboxGroup, {"choices": ["Model", "TE", "LLM", "Control", "VAE"]}), diff --git a/modules/ui.py b/modules/ui.py index d87f02c70..f9daddb35 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -28,6 +28,7 @@ plaintext_to_html = ui_common.plaintext_to_html # compatibility item infotext_to_html = ui_common.infotext_to_html # compatibility item create_sampler_and_steps_selection = ui_sections.create_sampler_and_steps_selection # compatibility item ui_system_tabs = None # required for system-info +interfaces = [] if not shared.cmd_opts.share and not shared.cmd_opts.listen: @@ -132,7 +133,8 @@ def create_ui(startup_timer = None): ui_extensions.create_ui() timer.startup.record("ui-extensions") - interfaces = [] + global interfaces # pylint: disable=global-statement + interfaces.clear() interfaces += [(txt2img_interface, "Text", "txt2img")] interfaces += [(img2img_interface, "Image", "img2img")] if control_interface is not None: diff --git a/modules/ui_caption.py b/modules/ui_caption.py index 85d3ca0bc..290ec74f8 100644 --- a/modules/ui_caption.py +++ b/modules/ui_caption.py @@ -28,6 +28,7 @@ def update_clip_params(*args): def create_ui(): + shared.log.debug('UI initialize: tab=caption') with gr.Row(equal_height=False, variant='compact', elem_classes="caption", elem_id="caption_tab"): with gr.Column(variant='compact', elem_id='interrogate_input'): with gr.Row(): diff --git a/modules/ui_control_helpers.py b/modules/ui_control_helpers.py index a04512863..c5757c56f 100644 --- a/modules/ui_control_helpers.py +++ b/modules/ui_control_helpers.py @@ -24,7 +24,7 @@ def initialize(): from modules.control.units import xs # vislearn ControlNet-XS from modules.control.units import lite # vislearn ControlNet-XS from modules.control.units import t2iadapter # TencentARC T2I-Adapter - shared.log.debug(f'UI initialize: control models="{shared.opts.control_dir}"') + shared.log.debug(f'UI initialize: tab=control models="{shared.opts.control_dir}"') controlnet.cache_dir = os.path.join(shared.opts.control_dir, 'controlnet') xs.cache_dir = os.path.join(shared.opts.control_dir, 'xs') lite.cache_dir = os.path.join(shared.opts.control_dir, 'lite') diff --git a/modules/ui_docs.py b/modules/ui_docs.py index d8b4e3dce..8b1381ce8 100644 --- a/modules/ui_docs.py +++ b/modules/ui_docs.py @@ -275,6 +275,7 @@ def create_ui_docs(): def create_ui(): + log.debug('UI initialize: tab=info') with gr.Tabs(elem_id="tabs_info"): with gr.TabItem("Docs", id="docs", elem_id="system_tab_docs"): create_ui_docs() diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 28d792393..43158211a 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -430,6 +430,7 @@ def create_html(search_text, sort_column): def create_ui(): + shared.log.debug('UI initialize: tab=extensions') extensions_disable_all = gr.Radio(label="Disable all extensions", choices=["none", "user", "all"], value=shared.opts.disable_all_extensions, elem_id="extensions_disable_all", visible=False) extensions_disabled_list = gr.Textbox(elem_id="extensions_disabled_list", visible=False, container=False) extensions_update_list = gr.Textbox(elem_id="extensions_update_list", visible=False, container=False) diff --git a/modules/ui_gallery.py b/modules/ui_gallery.py index e6cb3f297..283b720a8 100644 --- a/modules/ui_gallery.py +++ b/modules/ui_gallery.py @@ -54,6 +54,7 @@ def read_media(fn): def create_ui(): + shared.log.debug('UI initialize: tab=gallery') with gr.Blocks() as tab: with gr.Row(elem_id='tab-gallery-sort-buttons'): sort_buttons = [] diff --git a/modules/ui_img2img.py b/modules/ui_img2img.py index c1597321d..d08999c8c 100644 --- a/modules/ui_img2img.py +++ b/modules/ui_img2img.py @@ -33,7 +33,7 @@ def process_interrogate(mode, ii_input_files, ii_input_dir, ii_output_dir, *ii_s def create_ui(): - shared.log.debug('UI initialize: img2img') + shared.log.debug('UI initialize: tab=img2img') import modules.img2img # pylint: disable=redefined-outer-name modules.scripts_manager.scripts_current = modules.scripts_manager.scripts_img2img modules.scripts_manager.scripts_img2img.initialize_scripts(is_img2img=True, is_control=False) diff --git a/modules/ui_loadsave.py b/modules/ui_loadsave.py index a8e3dce9b..3b6484e06 100644 --- a/modules/ui_loadsave.py +++ b/modules/ui_loadsave.py @@ -35,7 +35,6 @@ class UiLoadsave: saved_value = self.ui_settings.get(key, None) self.ui_defaults[key] = getattr(obj, field) if saved_value is None: - # self.ui_settings[key] = getattr(obj, field) pass elif condition and not condition(saved_value): pass @@ -126,15 +125,37 @@ class UiLoadsave: writefile(current_ui_settings, self.filename) def dump_defaults(self): - """saves default values to a file unless the file is present and there was an error loading default values at start""" if os.path.exists(self.filename): return self.write_to_file(self.ui_settings) + def iter_all(self, values): + updates = [] + for i, name in enumerate(self.component_mapping): + component = self.component_mapping[name] + choices = getattr(component, 'choices', None) + if type(choices) is list and len(choices) > 0: # fix gradio radio button choices being tuples + if type(choices[0]) is tuple: + choices = [c[0] for c in choices] + new_value = values[i] + if isinstance(new_value, int) and choices: + if new_value >= len(choices): + updates.append(None) + new_value = choices[new_value] + old_value = self.ui_settings.get(name, None) + default_value = self.ui_defaults.get(name, '') + if old_value == new_value: + updates.append(None) + elif old_value is None and (new_value == '' or new_value == []): + updates.append(None) + elif (new_value == default_value) and (old_value is None): + updates.append(None) + else: + updates.append((name, old_value, new_value, default_value)) + return updates + def iter_changes(self, values): for i, name in enumerate(self.component_mapping): - # if '__init__' in name: - # continue component = self.component_mapping[name] choices = getattr(component, 'choices', None) if type(choices) is list and len(choices) > 0: # fix gradio radio button choices being tuples @@ -201,16 +222,23 @@ class UiLoadsave: def ui_apply(self, *values): num_changed = 0 + num_unchanged = 0 current_ui_settings = self.read_from_file() - for name, old_value, new_value, default_value in self.iter_changes(values): - component = self.component_mapping[name] - errors.log.debug(f'Settings: name={name} component={component} old={old_value} default={default_value} new={new_value}') - num_changed += 1 - current_ui_settings[name] = new_value + for x in self.iter_all(values): + if x is None: + num_unchanged += 1 + else: + name, old_value, new_value, default_value = x + component = self.component_mapping[name] + errors.log.debug(f'Settings: name={name} component={component} old={old_value} default={default_value} new={new_value}') + num_changed += 1 + current_ui_settings[name] = new_value + # what = name.split('/')[-1] + # setattr(component, what, new_value) if num_changed == 0: return "No changes" self.write_to_file(current_ui_settings) - errors.log.info(f'UI defaults saved: {self.filename}') + errors.log.info(f'UI defaults saved: {self.filename} changes={num_changed} unchanged={num_unchanged}') return f"Wrote {num_changed} changes" def ui_submenu_apply(self, items): diff --git a/modules/ui_models.py b/modules/ui_models.py index bfb876372..34563e891 100644 --- a/modules/ui_models.py +++ b/modules/ui_models.py @@ -12,6 +12,7 @@ extra_ui = [] def create_ui(): + log.debug('UI initialize: tab=models') dummy_component = gr.Label(visible=False) with gr.Row(elem_id="models_tab"): with gr.Column(elem_id='models_output_container', scale=1): diff --git a/modules/ui_postprocessing.py b/modules/ui_postprocessing.py index b575fa67a..5ed90446a 100644 --- a/modules/ui_postprocessing.py +++ b/modules/ui_postprocessing.py @@ -16,6 +16,7 @@ def submit_process(tab_index, extras_image, image_batch, extras_batch_input_dir, def create_ui(): + shared.log.debug('UI initialize: tab=process') tab_index = gr.State(value=0) # pylint: disable=abstract-class-instantiated with gr.Row(equal_height=False, variant='compact', elem_classes="extras", elem_id="extras_tab"): with gr.Column(variant='compact'): diff --git a/modules/ui_settings.py b/modules/ui_settings.py index 9b24464cc..4cee32959 100644 --- a/modules/ui_settings.py +++ b/modules/ui_settings.py @@ -172,6 +172,7 @@ def run_settings_single(value, key, progress=False): def create_ui(): + shared.log.debug('UI initialize: tab=settings') global text_settings # pylint: disable=global-statement text_settings = gr.Textbox(elem_id="settings_json", elem_classes=["settings_json"], value=lambda: shared.opts.dumpjson(), visible=False) with gr.Row(elem_id="system_row"): diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index fe9a19c50..a7efadba1 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -5,7 +5,7 @@ from modules.ui_components import ToolButton # pylint: disable=unused-import def create_ui(): - shared.log.debug('UI initialize: txt2img') + shared.log.debug('UI initialize: tab=txt2img') import modules.txt2img # pylint: disable=redefined-outer-name modules.scripts_manager.scripts_current = modules.scripts_manager.scripts_txt2img modules.scripts_manager.scripts_txt2img.initialize_scripts(is_img2img=False, is_control=False) diff --git a/modules/ui_video.py b/modules/ui_video.py index bb9cace94..02c787c6e 100644 --- a/modules/ui_video.py +++ b/modules/ui_video.py @@ -7,7 +7,7 @@ debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None e def create_ui(): - shared.log.debug('UI initialize: video') + shared.log.debug('UI initialize: tab=video') with gr.Blocks(analytics_enabled=False) as _video_interface: prompt, styles, negative, generate_btn, _reprocess, paste, networks_button, _token_counter, _token_button, _token_counter_negative, _token_button_negative = ui_sections.create_toprow( is_img2img=False, From e6715ba8d363dc278b02081b00b8fdfea3e1c433 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 19 Sep 2025 19:29:36 +0300 Subject: [PATCH 022/230] Cleanup SDNQ compile --- extensions-builtin/sd-webui-agent-scheduler | 1 + modules/sdnq/common.py | 6 ++++ modules/sdnq/dequantizer.py | 28 ++++++------------- modules/sdnq/layers/conv/conv_fp8.py | 5 ++-- .../sdnq/layers/conv/conv_fp8_tensorwise.py | 5 ++-- modules/sdnq/layers/conv/conv_int8.py | 5 ++-- modules/sdnq/layers/linear/linear_fp8.py | 5 ++-- .../layers/linear/linear_fp8_tensorwise.py | 5 ++-- modules/sdnq/layers/linear/linear_int8.py | 5 ++-- 9 files changed, 28 insertions(+), 37 deletions(-) create mode 160000 extensions-builtin/sd-webui-agent-scheduler diff --git a/extensions-builtin/sd-webui-agent-scheduler b/extensions-builtin/sd-webui-agent-scheduler new file mode 160000 index 000000000..a33753321 --- /dev/null +++ b/extensions-builtin/sd-webui-agent-scheduler @@ -0,0 +1 @@ +Subproject commit a33753321b914c6122df96d1dc0b5117d38af680 diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index fab48c4b9..8ea1d76ca 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -2,6 +2,8 @@ import os import torch +from functools import partial + from modules import shared torch_version = float(torch.__version__[:3]) @@ -42,3 +44,7 @@ allowed_types = linear_types + conv_types + conv_transpose_types if use_torch_compile: torch._dynamo.config.cache_size_limit = max(8192, torch._dynamo.config.cache_size_limit) torch._dynamo.config.accumulated_recompile_limit = max(8192, torch._dynamo.config.accumulated_recompile_limit) + compile_func = partial(torch.compile, fullgraph=True, dynamic=False) +else: + def compile_func(fn, **kwargs): + return fn diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 9ac902c57..be68ab96d 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from .common import dtype_dict, use_torch_compile +from .common import dtype_dict, compile_func from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric @@ -226,21 +226,11 @@ dequantizer_dict = { } -if use_torch_compile: - dequantize_asymmetric_compiled = torch.compile(dequantize_asymmetric, fullgraph=True, dynamic=False) - dequantize_symmetric_compiled = torch.compile(dequantize_symmetric, fullgraph=True, dynamic=False) - dequantize_packed_int_asymmetric_compiled = torch.compile(dequantize_packed_int_asymmetric, fullgraph=True, dynamic=False) - dequantize_packed_int_symmetric_compiled = torch.compile(dequantize_packed_int_symmetric, fullgraph=True, dynamic=False) - re_quantize_matmul_asymmetric_compiled = torch.compile(re_quantize_matmul_asymmetric, fullgraph=True, dynamic=False) - re_quantize_matmul_symmetric_compiled = torch.compile(re_quantize_matmul_symmetric, fullgraph=True, dynamic=False) - re_quantize_matmul_packed_int_asymmetric_compiled = torch.compile(re_quantize_matmul_packed_int_asymmetric, fullgraph=True, dynamic=False) - re_quantize_matmul_packed_int_symmetric_compiled = torch.compile(re_quantize_matmul_packed_int_symmetric, fullgraph=True, dynamic=False) -else: - dequantize_asymmetric_compiled = dequantize_asymmetric - dequantize_symmetric_compiled = dequantize_symmetric - dequantize_packed_int_asymmetric_compiled = dequantize_packed_int_asymmetric - dequantize_packed_int_symmetric_compiled = dequantize_packed_int_symmetric - re_quantize_matmul_asymmetric_compiled = re_quantize_matmul_asymmetric - re_quantize_matmul_symmetric_compiled = re_quantize_matmul_symmetric - re_quantize_matmul_packed_int_asymmetric_compiled = re_quantize_matmul_packed_int_asymmetric - re_quantize_matmul_packed_int_symmetric_compiled = re_quantize_matmul_packed_int_symmetric +dequantize_asymmetric_compiled = compile_func(dequantize_asymmetric) +dequantize_symmetric_compiled = compile_func(dequantize_symmetric) +dequantize_packed_int_asymmetric_compiled = compile_func(dequantize_packed_int_asymmetric) +dequantize_packed_int_symmetric_compiled = compile_func(dequantize_packed_int_symmetric) +re_quantize_matmul_asymmetric_compiled = compile_func(re_quantize_matmul_asymmetric) +re_quantize_matmul_symmetric_compiled = compile_func(re_quantize_matmul_symmetric) +re_quantize_matmul_packed_int_asymmetric_compiled = compile_func(re_quantize_matmul_packed_int_asymmetric) +re_quantize_matmul_packed_int_symmetric_compiled = compile_func(re_quantize_matmul_packed_int_symmetric) diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index cfce8994a..2d1407a47 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -4,7 +4,7 @@ from typing import List import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ..linear.linear_fp8 import quantize_fp8_matmul_input # noqa: TID252 from .forward import get_conv_args, process_conv_input @@ -68,5 +68,4 @@ def quantized_conv_forward_fp8_matmul(self, input) -> torch.FloatTensor: ) -if use_torch_compile: - conv_fp8_matmul = torch.compile(conv_fp8_matmul, fullgraph=True, dynamic=False) +conv_fp8_matmul = compile_func(conv_fp8_matmul) diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index a21699855..bc968e519 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -4,7 +4,7 @@ from typing import List import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ...dequantizer import dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from ..linear.linear_fp8_tensorwise import quantize_fp8_matmul_input_tensorwise # noqa: TID252 from .forward import get_conv_args, process_conv_input @@ -63,5 +63,4 @@ def quantized_conv_forward_fp8_matmul_tensorwise(self, input) -> torch.FloatTens ) -if use_torch_compile: - conv_fp8_matmul_tensorwise = torch.compile(conv_fp8_matmul_tensorwise, fullgraph=True, dynamic=False) +conv_fp8_matmul_tensorwise = compile_func(conv_fp8_matmul_tensorwise) diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index cd18b1db6..6c59f6d60 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -4,7 +4,7 @@ from typing import List import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from ..linear.linear_int8 import quantize_int8_matmul_input # noqa: TID252 @@ -75,5 +75,4 @@ def quantized_conv_forward_int8_matmul(self, input) -> torch.FloatTensor: ) -if use_torch_compile: - conv_int8_matmul = torch.compile(conv_int8_matmul, fullgraph=True, dynamic=False) +conv_int8_matmul = compile_func(conv_int8_matmul) diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index 5707ad225..63eee40b4 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ...dequantizer import quantize_fp8 # noqa: TID252 @@ -34,5 +34,4 @@ def quantized_linear_forward_fp8_matmul(self, input: torch.FloatTensor) -> torch return fp8_matmul(input, self.weight, self.bias, self.sdnq_dequantizer.scale) -if use_torch_compile: - fp8_matmul = torch.compile(fp8_matmul, fullgraph=True, dynamic=False) +fp8_matmul = compile_func(fp8_matmul) diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index aa80251ae..0343087c5 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ...dequantizer import quantize_fp8, dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 @@ -39,5 +39,4 @@ def quantized_linear_forward_fp8_matmul_tensorwise(self, input: torch.FloatTenso return fp8_matmul_tensorwise(input, self.weight, self.bias, self.sdnq_dequantizer.scale) -if use_torch_compile: - fp8_matmul_tensorwise = torch.compile(fp8_matmul_tensorwise, fullgraph=True, dynamic=False) +fp8_matmul_tensorwise = compile_func(fp8_matmul_tensorwise) diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index 3a1b82c1f..bcc4d775c 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from ...common import use_torch_compile # noqa: TID252 +from ...common import compile_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import quantize_int8, dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 @@ -50,5 +50,4 @@ def quantized_linear_forward_int8_matmul(self, input: torch.FloatTensor) -> torc return int8_matmul(input, weight, self.bias, scale, quantized_weight_shape, self.sdnq_dequantizer.weights_dtype) -if use_torch_compile: - int8_matmul = torch.compile(int8_matmul, fullgraph=True, dynamic=False) +int8_matmul = compile_func(int8_matmul) From a9fb09852c9f4432b85e17eaf75f2ea2f229dc8a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 19 Sep 2025 19:38:52 +0300 Subject: [PATCH 023/230] re-remove agent scheduler --- extensions-builtin/sd-webui-agent-scheduler | 1 - 1 file changed, 1 deletion(-) delete mode 160000 extensions-builtin/sd-webui-agent-scheduler diff --git a/extensions-builtin/sd-webui-agent-scheduler b/extensions-builtin/sd-webui-agent-scheduler deleted file mode 160000 index a33753321..000000000 --- a/extensions-builtin/sd-webui-agent-scheduler +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a33753321b914c6122df96d1dc0b5117d38af680 From 9667fffd3a1e440cfbdce9cde607272043325fa4 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 20 Sep 2025 19:39:41 -0400 Subject: [PATCH 024/230] fix download for sd15/sdxl reference models Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/civitai/download_civitai.py | 9 +++++---- modules/lora/lora_overrides.py | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 569e5c194..df9219de2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-19 +## Update for 2025-09-20 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -27,6 +27,7 @@ - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark - xyz-grid: fix xyz grid with random seeds + - fix download for sd15/sdxl reference models ## Update for 2025-09-15 diff --git a/modules/civitai/download_civitai.py b/modules/civitai/download_civitai.py index 508bd0a8f..2c6c47412 100644 --- a/modules/civitai/download_civitai.py +++ b/modules/civitai/download_civitai.py @@ -103,10 +103,11 @@ def download_civit_model_thread(model_name: str, model_url: str, model_path: str if os.path.isfile(temp_file): starting_pos = os.path.getsize(temp_file) headers['Range'] = f'bytes={starting_pos}-' - if token is None or len(token) == 0: - token = shared.opts.civitai_token - if token is not None and len(token) > 0: - headers['Authorization'] = f'Bearer {token}' + if ('civit' in model_url.lower()): + if token is None or len(token) == 0: + token = shared.opts.civitai_token + if (token is not None) and (len(token) > 0): + headers['Authorization'] = f'Bearer {token}' r = shared.req(model_url, headers=headers, stream=True) total_size = int(r.headers.get('content-length', 0)) diff --git a/modules/lora/lora_overrides.py b/modules/lora/lora_overrides.py index 61f2dad46..5889e1dec 100644 --- a/modules/lora/lora_overrides.py +++ b/modules/lora/lora_overrides.py @@ -61,7 +61,9 @@ def get_method(shorthash=''): use_diffusers = use_diffusers or any(x.startswith(shorthash) for x in maybe_diffusers) if shared.opts.lora_force_diffusers and len(shorthash) > 4: use_diffusers = use_diffusers or any(x.startswith(shorthash) for x in force_diffusers) - use_nunchaku = hasattr(shared.sd_model, 'transformer') and 'Nunchaku' in shared.sd_model.transformer.__class__.__name__ + nunchaku_dit = hasattr(shared.sd_model, 'transformer') and 'Nunchaku' in shared.sd_model.transformer.__class__.__name__ + nunchaku_unet = hasattr(shared.sd_model, 'unet') and 'Nunchaku' in shared.sd_model.unet.__class__.__name__ + use_nunchaku = nunchaku_dit or nunchaku_unet if use_nunchaku: return 'nunchaku' elif use_diffusers: From 5b43c66a92fe20ff6a9b72a95ee244ded8efccb2 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 20 Sep 2025 21:01:21 -0400 Subject: [PATCH 025/230] nunchaku sdxl and sdxl-turbo support Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 5 ++ html/reference.json | 16 +++- modules/civitai/download_civitai.py | 2 +- modules/sd_detect.py | 2 + modules/sd_models.py | 123 +++++++++++++++------------ modules/sd_offload.py | 2 +- modules/sd_unet.py | 39 ++++++++- modules/sdnq/common.py | 4 +- pipelines/flux/flux_legacy_loader.py | 4 +- pipelines/flux/flux_nunchaku.py | 7 +- pipelines/model_qwen.py | 2 - pipelines/model_sana.py | 3 +- pipelines/qwen/qwen_nunchaku.py | 7 +- 13 files changed, 142 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df9219de2..07adf4e96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ available for *text-to-image* and *text-to-video* and *image-to-video* workflows - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) SRPO is trained by with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference + - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) + impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline + note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes + *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models + *note*: sdxl support for nunchaku is not in released version of `nunchaku==1.0.0`, so you need to build [nunchaku](https://nunchaku.tech/docs/nunchaku/installation/installation.html) from source - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate diff --git a/html/reference.json b/html/reference.json index fc070b320..79a0980fe 100644 --- a/html/reference.json +++ b/html/reference.json @@ -55,11 +55,21 @@ "desc": "This stable-diffusion-2 model is resumed from stable-diffusion-2-base (512-base-ema.ckpt) and trained for 150k steps using a v-objective on the same dataset. Resumed for another 140k steps on 768x768 images", "extras": "width: 768, height: 768, sampler: DEIS, steps: 20, cfg_scale: 6.0" }, - "StabilityAI StableDiffusion XL 1.0 Base": { - "path": "sd_xl_base_1.0.safetensors@https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors?download=true", + "StabilityAI StableDiffusion XL": { + "path": "stabilityai/stable-diffusion-xl-base-1.0", "preview": "sd_xl_base_1.0.jpg", "desc": "Stable Diffusion XL (SDXL) is the latest AI image generation model that is tailored towards more photorealistic outputs with more detailed imagery and composition compared to previous SD models, including SD 2.1. It can make realistic faces, legible text within the images, and better image composition, all while using shorter and simpler prompts at a greatly increased base resolution of 1024x1024. Just like its predecessors, SDXL has the ability to generate image variations using image-to-image prompting, inpainting (reimagining of the selected parts of an image), and outpainting (creating new parts that lie outside the image borders).", - "extras": "sampler: DEIS, steps: 20, cfg_scale: 6.0" + "skip": true, + "variant": "fp16", + "extras": "" + }, + "StabilityAI StableDiffusion XL Turbo": { + "path": "stabilityai/sdxl-turbo", + "preview": "sd_xl_base_1.0.jpg", + "desc": "SDXL-Turbo is a fast generative text-to-image model that can synthesize photorealistic images from a text prompt in a single network evaluation.", + "skip": true, + "variant": "fp16", + "extras": "" }, "StabilityAI Stable Cascade": { "path": "huggingface/stabilityai/stable-cascade", diff --git a/modules/civitai/download_civitai.py b/modules/civitai/download_civitai.py index 2c6c47412..d12a00830 100644 --- a/modules/civitai/download_civitai.py +++ b/modules/civitai/download_civitai.py @@ -103,7 +103,7 @@ def download_civit_model_thread(model_name: str, model_url: str, model_path: str if os.path.isfile(temp_file): starting_pos = os.path.getsize(temp_file) headers['Range'] = f'bytes={starting_pos}-' - if ('civit' in model_url.lower()): + if 'civit' in model_url.lower(): # downloader can be used for other urls too if token is None or len(token) == 0: token = shared.opts.civitai_token if (token is not None) and (len(token) > 0): diff --git a/modules/sd_detect.py b/modules/sd_detect.py index b945a6457..838c68770 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -115,6 +115,8 @@ def guess_by_name(fn, current_guess): return 'Kandinsky 3.0' elif 'hunyuanimage' in fn.lower(): return 'HunyuanImage' + elif 'sdxl-turbo' in fn.lower() or 'stable-diffusion-xl' in fn.lower(): + return 'Stable Diffusion XL' return current_guess diff --git a/modules/sd_models.py b/modules/sd_models.py index a251495c3..4423c780d 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -411,65 +411,70 @@ def load_diffuser_folder(model_type, pipeline, checkpoint_info, diffusers_load_c files = shared.walk_files(checkpoint_info.path, ['.safetensors', '.bin', '.ckpt']) if 'variant' not in diffusers_load_config and any('diffusion_pytorch_model.fp16' in f for f in files): # deal with diffusers lack of variant fallback when loading diffusers_load_config['variant'] = 'fp16' - if (model_type is not None) and (pipeline is not None) and ('ONNX' in model_type): # forced pipeline - try: - sd_model = pipeline.from_pretrained(checkpoint_info.path) - except Exception as e: - shared.log.error(f'Load {op}: type=ONNX path="{checkpoint_info.path}" {e}') - if debug_load: - errors.display(e, 'Load') - return None - else: - err1, err2, err3 = None, None, None - if os.path.exists(checkpoint_info.path) and os.path.isdir(checkpoint_info.path): - if os.path.exists(os.path.join(checkpoint_info.path, 'unet', 'diffusion_pytorch_model.bin')): - shared.log.debug(f'Load {op}: type=pickle') - diffusers_load_config['use_safetensors'] = False + + err0, err1, err2, err3 = None, None, None, None + if os.path.exists(checkpoint_info.path) and os.path.isdir(checkpoint_info.path): + if os.path.exists(os.path.join(checkpoint_info.path, 'unet', 'diffusion_pytorch_model.bin')): + shared.log.debug(f'Load {op}: type=pickle') + diffusers_load_config['use_safetensors'] = False + if debug_load: + shared.log.debug(f'Load {op}: args={diffusers_load_config}') + + try: #0 - using detected model type and pipeline + if (model_type is not None) and (pipeline is not None): + sd_model = pipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + sd_model.model_type = sd_model.__class__.__name__ + except Exception as e: + err0 = e if debug_load: - shared.log.debug(f'Load {op}: args={diffusers_load_config}') - try: # 1 - autopipeline, best choice but not all pipelines are available - try: + errors.display(e, 'Load Detected') + + try: # 1 - autopipeline, best choice but not all pipelines are available + try: + if err0 is not None: sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) sd_model.model_type = sd_model.__class__.__name__ - except ValueError as e: - if 'no variant default' in str(e): - shared.log.warning(f'Load {op}: variant={diffusers_load_config["variant"]} model="{checkpoint_info.path}" using default variant') - diffusers_load_config.pop('variant', None) - sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) - sd_model.model_type = sd_model.__class__.__name__ - elif 'safetensors found in directory' in str(err1): - shared.log.warning(f'Load {op}: type=pickle') - diffusers_load_config['use_safetensors'] = False - sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) - sd_model.model_type = sd_model.__class__.__name__ - else: - raise ValueError from e # reraise - except Exception as e: - err1 = e - if debug_load: - errors.display(e, 'Load AutoPipeline') - # shared.log.error(f'AutoPipeline: {e}') - try: # 2 - diffusion pipeline, works for most non-linked pipelines - if err1 is not None: - sd_model = diffusers.DiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + except ValueError as e: + if 'no variant default' in str(e): + shared.log.warning(f'Load {op}: variant={diffusers_load_config["variant"]} model="{checkpoint_info.path}" using default variant') + diffusers_load_config.pop('variant', None) + sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) sd_model.model_type = sd_model.__class__.__name__ - except Exception as e: - err2 = e - if debug_load: - errors.display(e, "Load DiffusionPipeline") - # shared.log.error(f'DiffusionPipeline: {e}') - try: # 3 - try basic pipeline just in case - if err2 is not None: - sd_model = diffusers.StableDiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + elif 'safetensors found in directory' in str(err1): + shared.log.warning(f'Load {op}: type=pickle') + diffusers_load_config['use_safetensors'] = False + sd_model = diffusers.AutoPipelineForText2Image.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) sd_model.model_type = sd_model.__class__.__name__ - except Exception as e: - err3 = e # ignore last error - shared.log.error(f"StableDiffusionPipeline: {e}") - if debug_load: - errors.display(e, "Load StableDiffusionPipeline") - if err3 is not None: - shared.log.error(f'Load {op}: {checkpoint_info.path} auto={err1} diffusion={err2}') - return None + else: + raise ValueError from e # reraise + except Exception as e: + err1 = e + if debug_load: + errors.display(e, 'Load AutoPipeline') + + try: # 2 - diffusion pipeline, works for most non-linked pipelines + if err1 is not None: + sd_model = diffusers.DiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + sd_model.model_type = sd_model.__class__.__name__ + except Exception as e: + err2 = e + if debug_load: + errors.display(e, "Load DiffusionPipeline") + + try: # 3 - try basic pipeline just in case + if err2 is not None: + sd_model = diffusers.StableDiffusionPipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) + sd_model.model_type = sd_model.__class__.__name__ + except Exception as e: + err3 = e # ignore last error + shared.log.error(f"StableDiffusionPipeline: {e}") + if debug_load: + errors.display(e, "Load StableDiffusionPipeline") + + if err3 is not None: + shared.log.error(f'Load {op}: {checkpoint_info.path} detected={err0} auto={err1} diffusion={err2} base={err3}') + return None + return sd_model @@ -667,7 +672,7 @@ def load_diffuser(checkpoint_info=None, op='model', revision=None): # pylint: di sd_model.scheduler.name = 'DDIM' if hasattr(sd_model, "unet") and model_type not in ['Stable Cascade']: # others calls load_diffuser again - sd_unet.load_unet(sd_model) + sd_unet.load_unet(sd_model, checkpoint_info.path) add_noise_pred_to_diffusers_callback(sd_model) @@ -1029,7 +1034,13 @@ def set_diffusers_attention(pipe, quiet:bool=False): return # other models uses their own attention processor if pipe.__class__.__name__.startswith("StableDiffusion") and hasattr(pipe, "unet"): - pipe.unet.set_attn_processor(attention) + try: + pipe.unet.set_attn_processor(attention) + except Exception as e: + if 'Nunchaku' in pipe.unet.__class__.__name__: + pass + else: + shared.log.error(f"Attention: {name if name is not None else attention.__class__.__name__} pipe={pipe.__class__.__name__} {e}") elif not quiet: shared.log.warning(f"Attention: {name if name is not None else attention.__class__.__name__} is not compatible with {pipe.__class__.__name__}") diff --git a/modules/sd_offload.py b/modules/sd_offload.py index cf7a92a36..19e59de3d 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -293,7 +293,7 @@ def get_module_names(pipe=None, exclude=[]): modules_names = get_signature(pipe).keys() modules_names = [m for m in modules_names if m not in exclude and not m.startswith('_')] modules_names = [m for m in modules_names if isinstance(getattr(pipe, m, None), torch.nn.Module)] - modules_names = list(sorted(set(modules_names))) + modules_names = sorted(set(modules_names)) return modules_names diff --git a/modules/sd_unet.py b/modules/sd_unet.py index 2bd1741f4..6d3d6c936 100644 --- a/modules/sd_unet.py +++ b/modules/sd_unet.py @@ -1,5 +1,5 @@ import os -from modules import shared, devices, files_cache, sd_models +from modules import shared, devices, files_cache, sd_models, model_quant unet_dict = {} @@ -8,22 +8,55 @@ failed_unet = [] debug = os.environ.get('SD_LOAD_DEBUG', None) is not None -dit_models = ['Flux', 'StableDiffusion3', 'HiDream', 'Lumina2', 'Chroma', 'Wan'] +dit_models = ['Flux', 'StableDiffusion3', 'HiDream', 'Lumina2', 'Chroma', 'Wan', 'Qwen'] -def load_unet(model): +def load_unet_sdxl_nunchaku(repo_id): + try: + from nunchaku.models.unets.unet_sdxl import NunchakuSDXLUNet2DConditionModel + except Exception: + shared.log.error(f'Load module: quant=Nunchaku module=unet repo="{repo_id}" low nunchaku version') + return None + if 'turbo' in repo_id.lower(): + nunchaku_repo = 'nunchaku-tech/nunchaku-sdxl-turbo/svdq-int4_r32-sdxl-turbo.safetensors' + else: + nunchaku_repo = 'nunchaku-tech/nunchaku-sdxl/svdq-int4_r32-sdxl.safetensors' + + shared.log.debug(f'Load module: quant=Nunchaku module=unet repo="{nunchaku_repo}" offload={shared.opts.nunchaku_offload}') + unet = NunchakuSDXLUNet2DConditionModel.from_pretrained( + nunchaku_repo, + offload=shared.opts.nunchaku_offload, + torch_dtype=devices.dtype, + cache_dir=shared.opts.hfcache_dir, + ) + unet.quantization_method = 'SVDQuant' + return unet + + +def load_unet(model, repo_id:str=None): global loaded_unet # pylint: disable=global-statement + + if ("StableDiffusionXLPipeline" in model.__class__.__name__) and (('stable-diffusion-xl-base' in repo_id) or ('sdxl-turbo' in repo_id)): + if model_quant.check_nunchaku('Model'): + unet = load_unet_sdxl_nunchaku(repo_id) + if unet is not None: + model.unet = unet + return + if shared.opts.sd_unet == 'Default' or shared.opts.sd_unet == 'None': return + if shared.opts.sd_unet not in list(unet_dict): shared.log.error(f'Load module: type=UNet not found: {shared.opts.sd_unet}') return + config_file = os.path.splitext(unet_dict[shared.opts.sd_unet])[0] + '.json' if os.path.exists(config_file): config = shared.readfile(config_file) else: config = None config_file = 'default' + try: if shared.opts.sd_unet == loaded_unet or shared.opts.sd_unet in failed_unet: pass diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 8ea1d76ca..e6ed21d4d 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -1,8 +1,8 @@ # pylint: disable=redefined-builtin,no-member,protected-access import os -import torch from functools import partial +import torch from modules import shared @@ -46,5 +46,5 @@ if use_torch_compile: torch._dynamo.config.accumulated_recompile_limit = max(8192, torch._dynamo.config.accumulated_recompile_limit) compile_func = partial(torch.compile, fullgraph=True, dynamic=False) else: - def compile_func(fn, **kwargs): + def compile_func(fn, **kwargs): # pylint: disable=unused-argument return fn diff --git a/pipelines/flux/flux_legacy_loader.py b/pipelines/flux/flux_legacy_loader.py index 6b6f9d294..cb3dad3c1 100644 --- a/pipelines/flux/flux_legacy_loader.py +++ b/pipelines/flux/flux_legacy_loader.py @@ -130,7 +130,7 @@ def load_quants(kwargs, repo_id, cache_dir, allow_quant): # pylint: disable=unus shared.log.error(f'Load module: quant=Nunchaku module=transformer repo="{repo_id}" unsupported') if nunchaku_repo is not None: shared.log.debug(f'Load module: quant=Nunchaku module=transformer repo="{nunchaku_repo}" precision={nunchaku_precision} offload={shared.opts.nunchaku_offload} attention={shared.opts.nunchaku_attention}') - kwargs['transformer'] = nunchaku.NunchakuFluxTransformer2dModel.from_pretrained(nunchaku_repo, offload=shared.opts.nunchaku_offload, torch_dtype=devices.dtype) + kwargs['transformer'] = nunchaku.NunchakuFluxTransformer2dModel.from_pretrained(nunchaku_repo, offload=shared.opts.nunchaku_offload, torch_dtype=devices.dtype, cache_dir=cache_dir) kwargs['transformer'].quantization_method = 'SVDQuant' if shared.opts.nunchaku_attention: kwargs['transformer'].set_attention_impl("nunchaku-fp16") @@ -142,7 +142,7 @@ def load_quants(kwargs, repo_id, cache_dir, allow_quant): # pylint: disable=unus nunchaku_precision = nunchaku.utils.get_precision() nunchaku_repo = 'mit-han-lab/nunchaku-t5/awq-int4-flux.1-t5xxl.safetensors' shared.log.debug(f'Load module: quant=Nunchaku module=t5 repo="{nunchaku_repo}" precision={nunchaku_precision}') - kwargs['text_encoder_2'] = nunchaku.NunchakuT5EncoderModel.from_pretrained(nunchaku_repo, torch_dtype=devices.dtype) + kwargs['text_encoder_2'] = nunchaku.NunchakuT5EncoderModel.from_pretrained(nunchaku_repo, torch_dtype=devices.dtype, cache_dir=cache_dir) kwargs['text_encoder_2'].quantization_method = 'SVDQuant' if 'text_encoder_2' not in kwargs and model_quant.check_quant('TE'): load_args, quant_args = model_quant.get_dit_args(diffusers_load_config, module='TE', device_map=True) diff --git a/pipelines/flux/flux_nunchaku.py b/pipelines/flux/flux_nunchaku.py index 49fd77b3d..9a737d103 100644 --- a/pipelines/flux/flux_nunchaku.py +++ b/pipelines/flux/flux_nunchaku.py @@ -26,7 +26,12 @@ def load_flux_nunchaku(repo_id): shared.log.error(f'Load module: quant=Nunchaku module=transformer repo="{repo_id}" unsupported') if nunchaku_repo is not None: shared.log.debug(f'Load module: quant=Nunchaku module=transformer repo="{nunchaku_repo}" precision={nunchaku_precision} offload={shared.opts.nunchaku_offload} attention={shared.opts.nunchaku_attention}') - transformer = nunchaku.NunchakuFluxTransformer2dModel.from_pretrained(nunchaku_repo, offload=shared.opts.nunchaku_offload, torch_dtype=devices.dtype) + transformer = nunchaku.NunchakuFluxTransformer2dModel.from_pretrained( + nunchaku_repo, + offload=shared.opts.nunchaku_offload, + torch_dtype=devices.dtype, + cache_dir=shared.opts.hfcache_dir, + ) transformer.quantization_method = 'SVDQuant' if shared.opts.nunchaku_attention: transformer.set_attention_impl("nunchaku-fp16") diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index bb65df53e..a89c272a1 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -26,8 +26,6 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): if model_quant.check_nunchaku('Model'): from pipelines.qwen.qwen_nunchaku import load_qwen_nunchaku transformer = load_qwen_nunchaku(repo_id) - # if transformer is not None: - # cls_name = nunchaku.pipeline.pipeline_qwenimage.NunchakuQwenImagePipeline # we dont need this if 'Qwen-Image-Distill-Full' in repo_id: repo_transformer = repo_id diff --git a/pipelines/model_sana.py b/pipelines/model_sana.py index d4ec574f6..9584263a3 100644 --- a/pipelines/model_sana.py +++ b/pipelines/model_sana.py @@ -10,9 +10,8 @@ def load_quants(kwargs, repo_id, cache_dir): import nunchaku nunchaku_precision = nunchaku.utils.get_precision() nunchaku_repo = "nunchaku-tech/nunchaku-sana/svdq-int4_r32-sana1.6b.safetensors" - # https://huggingface.co/nunchaku-tech/nunchaku-sana/blob/main/svdq-int4_r32-sana1.6b.safetensors shared.log.debug(f'Load module: quant=Nunchaku module=transformer repo="{nunchaku_repo}" precision={nunchaku_precision} attention={shared.opts.nunchaku_attention}') - kwargs['transformer'] = nunchaku.NunchakuSanaTransformer2DModel.from_pretrained(nunchaku_repo, torch_dtype=devices.dtype) + kwargs['transformer'] = nunchaku.NunchakuSanaTransformer2DModel.from_pretrained(nunchaku_repo, torch_dtype=devices.dtype, cache_dir=cache_dir) elif model_quant.check_quant('Model'): load_args, quant_args = model_quant.get_dit_args(kwargs_copy, module='Model') kwargs['transformer'] = diffusers.SanaTransformer2DModel.from_pretrained(repo_id, subfolder="transformer", cache_dir=cache_dir, **load_args, **quant_args) diff --git a/pipelines/qwen/qwen_nunchaku.py b/pipelines/qwen/qwen_nunchaku.py index 084b24a1e..2fa723565 100644 --- a/pipelines/qwen/qwen_nunchaku.py +++ b/pipelines/qwen/qwen_nunchaku.py @@ -23,6 +23,11 @@ def load_qwen_nunchaku(repo_id): shared.log.error(f'Load module: quant=Nunchaku module=transformer repo="{repo_id}" unsupported') if nunchaku_repo is not None: shared.log.debug(f'Load module: quant=Nunchaku module=transformer repo="{nunchaku_repo}" precision={nunchaku_precision} offload={shared.opts.nunchaku_offload} attention={shared.opts.nunchaku_attention}') - transformer = NunchakuQwenImageTransformer2DModel.from_pretrained(nunchaku_repo, offload=shared.opts.nunchaku_offload, torch_dtype=devices.dtype) # pylint: disable=no-member + transformer = NunchakuQwenImageTransformer2DModel.from_pretrained( + nunchaku_repo, + offload=shared.opts.nunchaku_offload, + torch_dtype=devices.dtype, + cache_dir=shared.opts.hfcache_dir, + ) # pylint: disable=no-member transformer.quantization_method = 'SVDQuant' return transformer From 2d14a6412d06f3d9ce5e08ebfa6e76f089dcc7ec Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 20 Sep 2025 21:01:47 -0400 Subject: [PATCH 026/230] update changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07adf4e96..b3bea1252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) - SRPO is trained by with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference + SRPO is trained by Tencent with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes From aaf26673f85663f72715d16ed4c1dacaa1808858 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Sun, 21 Sep 2025 14:08:27 +0300 Subject: [PATCH 027/230] Cover images: embed prompts to BRIA, Kandinsky. Rename juggernautXL. Generate Wan 2.2 VACE. --- html/previews.json | 2 +- html/reference.json | 6 +++--- models/Reference/briaai--BRIA-3.2.jpg | Bin 31678 -> 48630 bytes ... => juggernautXL_juggXIByRundiffusion.jpg} | Bin ...g => juggernautXL_juggXILightningByRD.jpg} | Bin .../kandinsky-community--kandinsky-2-1.jpg | Bin 83911 -> 134110 bytes ...insky-community--kandinsky-2-2-decoder.jpg | Bin 64475 -> 40047 bytes .../kandinsky-community--kandinsky-3.jpg | Bin 53882 -> 68205 bytes ...linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg | Bin 0 -> 69556 bytes 9 files changed, 4 insertions(+), 4 deletions(-) rename models/Reference/{juggernautXL_v9Rundiffusionphoto2.jpg => juggernautXL_juggXIByRundiffusion.jpg} (100%) rename models/Reference/{juggernautXL_v9Rdphoto2Lightning.jpg => juggernautXL_juggXILightningByRD.jpg} (100%) create mode 100644 models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg diff --git a/html/previews.json b/html/previews.json index 4f3354c86..e27e2513f 100644 --- a/html/previews.json +++ b/html/previews.json @@ -26,5 +26,5 @@ "vladmandic--Qwen-Lightning-Edit": "models/Reference/Qwen-Lightning.jpg", "Wan-AI--Wan2.2-T2V-A14B-Diffusers": "models/Reference/Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg", "Wan-AI--Wan2.1-T2V-14B-Diffusers": "models/Reference/Wan-AI--Wan2.1-T2V-14B-Diffusers.jpg", - "linoyts--Wan2.2-VACE-Fun-14B-diffusers": "models/Reference/Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg" + "linoyts--Wan2.2-VACE-Fun-14B-diffusers": "models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg" } diff --git a/html/reference.json b/html/reference.json index 79a0980fe..e2615f0e4 100644 --- a/html/reference.json +++ b/html/reference.json @@ -14,13 +14,13 @@ "Juggernaut XL XI": { "path": "juggernautXL_juggXIByRundiffusion.safetensors@https://civitai.com/api/download/models/782002", - "preview": "juggernautXL_v9Rundiffusionphoto2.jpg", + "preview": "juggernautXL_juggXIByRundiffusion.jpg", "desc": "Showcase finetuned model based on Stable diffusion XL", "extras": "sampler: DEIS, steps: 20, cfg_scale: 6.0" }, "Juggernaut XL XI Lightning": { "path": "juggernautXL_juggXILightningByRD.safetensors@https://civitai.com/api/download/models/920957", - "preview": "juggernautXL_v9Rdphoto2Lightning.jpg", + "preview": "juggernautXL_juggXILightningByRD.jpg", "desc": "Showcase finetuned model based on Stable diffusion XL", "extras": "sampler: DPM SDE, steps: 6, cfg_scale: 2.0" }, @@ -287,7 +287,7 @@ }, "Wan-AI Wan2.2 14B VACE": { "path": "linoyts/Wan2.2-VACE-Fun-14B-diffusers", - "preview": "Wan-AI--Wan2.2-T2V-A14B-Diffusers.jpg", + "preview": "linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg", "desc": "Wan2.2, offering more powerful capabilities, better performance, and superior visual quality. With Wan2.2, we have focused on incorporating the following technical innovations: MoE Architecture, Data Scalling, Cinematic Aesthetics, Efficient High-Definition Hybrid", "skip": true, "extras": "sampler: Default" diff --git a/models/Reference/briaai--BRIA-3.2.jpg b/models/Reference/briaai--BRIA-3.2.jpg index dc7067ec55b3e74d6099abbf5e78d3791a87fb95..91476ba26fb7c2af87484288ab182c9301064d4b 100644 GIT binary patch literal 48630 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%0Ao4k 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 XrL7b-t(C5KjA8iYo`nQmI2HfdXuE?t literal 31678 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 diff --git a/models/Reference/juggernautXL_v9Rundiffusionphoto2.jpg b/models/Reference/juggernautXL_juggXIByRundiffusion.jpg similarity index 100% rename from models/Reference/juggernautXL_v9Rundiffusionphoto2.jpg rename to models/Reference/juggernautXL_juggXIByRundiffusion.jpg diff --git a/models/Reference/juggernautXL_v9Rdphoto2Lightning.jpg b/models/Reference/juggernautXL_juggXILightningByRD.jpg similarity index 100% rename from models/Reference/juggernautXL_v9Rdphoto2Lightning.jpg rename to models/Reference/juggernautXL_juggXILightningByRD.jpg diff --git a/models/Reference/kandinsky-community--kandinsky-2-1.jpg b/models/Reference/kandinsky-community--kandinsky-2-1.jpg index 2fb28d1a44780b07b26fbf77e87420f1b9122d80..bebbd63797332c348ef1fe09fcb4d8a06200d292 100644 GIT binary patch literal 134110 zcmb5VbyQSe)HgnKNSA_i2m=g)ba%|q!_Xz2gS3*;CEXy+3=K*QEh61HfKt+35-K77 z@cTULx8Akhzur6d-m}lH&)#R9b?-eff4}}+$JkST<75v2Xlequ0RR9#03+H7fc-#W zJX~}S*8`Or1;BeKS|4aGeJ!w}wvsXcU<0rMcmtRLP5`%uyVnD41@L_M`90L!9=Hww z$N%I85Bz@`s(@Gj@%~5G58w*01MmR|0a_2G!+*Y<0KN}2Gr;}9%PRo zTk!`^|8#U7r0x%Tt`DW#|9V#cFMr$rI9>pkhxSqYFFWi1)v^7*tp0h@{?Cu+|F+9N z#Q(|N`@eWzJlMh?TJ4{v=7Tre|1kgM;qrf>fgaig1Q7VU^niA0Dr%~KPB5?@ zY_M?%aBv8yh#wJC{XZXny8-0*m;g)w76vN-lN zHVzgp1|}W=|3Ruq4tRjU!NL0njsGvYhbjP@9EXBM-~rJiGzFKEwYdJv8P)Xq3xywS zP-^QiJQ~5&l7^lcc26a}jq|^Y0HOyoOmZx8fGps=+S27XP~vcU@7B^8k`FOg^mrMj zH&$BJ_2w{v9C{QBmBUGwd3?6XqPo3XvFt%iSTisTHZFO|&t4F2W~2G+&6}u2>1u3@ zv1plNn*%?l{fesmre#seuPET}!41Qg(IQMGZ3i^=ra`aCZ0wrL`ZX|Ij>*Q6DiBy% zjD>g}3p`m`q0N~9&CJtUg1Cuipx04Sz!ylebm?#;G@vR<*->e%B5cm!7|4{S5xjL_ zL6Jw;7pc?<|7>CH{S{5|%}62LJ%12TSg84Gtf@+8`RkUUPB9uNk*;2`P4}3Bm>@6dI|1j z_*k%hODj`B6Z9#h&SKD3g`qAvdtouFZaPw6#w4iCqY?Gu343$t76D*)DnS`L;boIN zLW2swBC%EC7SDVpzA#!MrBrvpqyVjwxy0A%o*}cQAh_Ln&SVbBB#d}jL8PI|@#%XE zX+cMf8<@EF5_8I*(Zq=hR1c0gbXS|`{tDzR(83cBs4!W z(^DhcFqmXaujWg8e}{kMcNwYXU;hHau6}v-2%`3<$t%?gX|AtCvb`iv5HM|z-=6ESx;*sE3`GSHfO&7a(t4`?5=O;-^ z`WLLUu?kYOV9g`&?h5$YSr8hWBKy1>-%h-%*z9klbit;h6m-wmM67@?(3lP zN*T@}m+Z5GOcX~Mx*<^a;&%e>ZJ2VNj=;W%4lRF_wMOpUS|9vzr-s<-!C4kpqyW`fA>c81|!*t zN0fX=!YDV8j3NGc#2S_Q?1pM+UL`)^pF;Bb&6~QkPyqd;SoSMi&Qc$O~@U)8kGM}E$zK^1>&?J_0c;=g%jDxn=18g;mg#RhBd97Z zLBm+Okyz<)h+G%`*}|f*a=8dxys}0wjaxF@_jjU|4Sk|sTKKIqg))e^+RE5&>@R@O zRnveBE2(WV4 zy8RBznk#25k(2i7B-y7;MTi=r%{~7l#RcQ1rBnL2q+b)7odt+mADyKM# z9?YVnT+cCZ;4_lXarVL*4X+#TJ!h$5`hHmE?b4n#U{qEJEnj@>GcaN58S39h^Jjqc zjxatb0c^-;Iz!{1zVG74m#=zU5m&pqESetPa`Y6XQjEbl+%h9h3jKP$Fa3_0W2a8c zQFN*R5rEP4tT0z^97g1KcNNmE&sS{}bDNp(Tj(t@#p9dsjM>?K8jVB&45Z0QlR$iW zVCPys^;AqJBje*o@Jh`WA2`Z$rvx{{6Udig5-3_Uj9wAC1eYIh5mJ>0vSk}=(PP~* zxXeE{tfPzfPaht#Z}w}oaQmlz{ z-hJT6M*#ywSsJq-TZ0Z8R~o_Eg%&Bl{9nM-jf;t}=A&m{?8jiHYF3q3$?) zc;!r7Fk->Cv$-#8SW`X<)X`)7EcZ_2tL<`1vb`Ynoj7AXQGCXWK!e0qJPuB_Vl)a< zn(wq&oJ2|@f-e6#-zUxZQ|EIdrl(^ZX3LPblz}ny*B9t*l1AmC?x?PLbIYiP)#nP? z-z5?{IIEI9CIJO6J#~80(BUXA_eF)B!48mVl+=7_JEQeFLb9O0+Yi{6c;PU{MM|GU zOc#X}5<$l!w7@E2z%wznY;In=QmWV)xDuh<)&oSfL#l*SU#`HS+&8#k`q*lTAAXN} zav5gpXiu6_jXF#FucWbpgmWXI@0Y8m^BLZ)cmA>!9R=d`#UmJt9CBRr7p3Ne%{!d* zgCARP8K5mQ0|?DuINeP)eDBsy93PgtEiL4&7_^DcGaHK?+psmsjq#UF zcb=rmOpz~t1Em9_!W2!TpmLWJHM_J&6^8Nh#*G%9d(jN(x9f5883b=*q{%`KohJO& z!Hk3h)p{u-FOrKFiVrI-;e5J|!i+DE_~&)|X}XPy6XW~*6g{C0f@n@QRVkUGnd*b& zey#Q5X$0mY&G~PB#GiJfO~LrG(5LW>+Pzu+wEJoDx1?j<_w6hC1I>&6Jg$vK zaZTsK_@yY>at{iJ&^g1?6|NY0^mftpJh!zgtOLe~O#G6#)fH0R2 z4O%acDpD+q9DO<9=TbZQ^SBMa3f04NG$jlGHN)?eX0yy$W5c)ErHNbG~H()EwZQ71NvwXHXS71BWyQ5w$!?xPsy@0 z4RQ>U8Or6-w6If~Ei;xv&n4ymT+vsMvLM-Qq*yJ9 zEe+SYLv7M?`>Td+Iz=F<_by$`C*lONN>HWcVx^#|tnXHZV`|x7fVS&wtPkgP+9euf z@x4@MEZh6qP?X3#BXKdyz2Bq4t)TSuDGu_6$63hA^_!vou=cC(PU+Pp0F?pmFk{8o z?k&^I#YFtOYFSO9cXV3%y)xzd_eE0aJOnFEmOiZJTp!phn8UTj@ZP!66eMaC ztTx6CE9xhOeA8-%S8OJpwQ;pR{c44jQNP%xCmpkZ7ir{INuUaoDA^v8h-O-m4rX;3 zz*HRl8#>ZAV-bT>?E#nQBVoqX9|C<7Phk<#v%J`IPqCv8M2_V>n81VYxS#4@8dSa_ z=Q@Zq4Z^AH0Qcw#N>{nN%i~E)I8VXqmP|;fC5F3Pm2q(ASQlHVxu2;*(|MbNJkqLK z`XHVD$g#@`H*^4IDe5Ndmzt&Es-;YO?m%)*a*C;5_69JN5s?^`JU1M*W8d@ji5|T? zBkY2Vxnk(d9c!yTypC2)F}gh(FU3F>Zl8Ml?g?KsUJm`$bY}7?s3WOJVkB4dfL(7_ z%uY|kW_L6opazKaJ01E909ixaJ!>}au9ihoi*SS6*OHNMj_C$pS0-UGeDw+ll=033L~-)6Ie;;CL^Z_QNvOo{s_-ujIc=F*><2MRM-=_2RW1uCgb~P)& zdyWRsUWKL~I$@`UBu?!OxW4r(wV*%J{F|ilk}_zkWvyk~pA4Xe7t~0$cPZ z>4ul6fpD2TTCJXsVsi}Jx~a=x;4}KO(o5${gM^MUZbt{5ZJLo{KMYe-3!fN53Cf^)*Cm)m~!wf(u>YL-*MD$K-Xk<@&n^EWxS)l9#d=UMPm#PL&yqqqcugU z1KD0jB}5-SDr*sTdJ6P0ZcSF*Int>eW*SeBpZe;ypThBMwOB*R``2b)RZJ?3V8E25 zA~IzQWBw67L<)jee2K}wyyn&SRcI-zGUUR}kZbtG{v-&V81zYct25p|bNIegm)c}@ z)|jhec2kmt^G|(LuNKn|!PbY0$-1PfW_=NwUtjGj75&6n1UG8a&ef0I6uOEfoI57+K~y=p3d+Kf2z`@F;W@I76G#J071bC5y&%qN%Wak`MgDG?h* z09F3}az^+tij(=q8Cop<``j1(jc?eIWP&?!ei7RNhi!i}s}AKfla9`x-psP6pcvGr z;*pAB3sd5kfo4@4jJj(^jI?wm<%-6+g#Jstuc|14mtnuu&zakjpUNiM-381hF z1VU00Xwo^h=d+31g2r%Rh{IpoMNh{RUSyiNi$cnyQu0eQCO`S8PP4U>7UAudX}opF zU80)jd7J?$w1wtt{oFD;55Tj~eyfCqVq}?fI;}|3y=*lLHsx!f!=Pr%pzoN#qo7M^NcDa~tb+6jKDtEBU z+$60a+mn;SFODfE&DmQ#nK5)@NlKp-oNvucl~8WH77p`s+$e^AzBO1_nyBlY3=(R` ze2FRhz5(yXr755+bM}^9@$(*3O2ZGXt|nuLg3C@FbZzf+vtXDB-1;jDku}~_4q)3D zHGhJ4SJ_#l=JfpqU`lO&3F1D-PbM!+)}7Cvwlf6nq{eDX9r7^DyXdwc6))Qo-wNeF zo!`)NBlMb(HY?G8x|Ck;t(%7&F+A@|N8(uO6+_HFy~v&^)jbiZ^rQl7vck5igbMFo zbT+JCazi?!vXIL9KraxL^!_pKOB||#mpubW+SU=~hHU`{S@7Er0g>iwjCs}P?1^t_(m$-az*q%pxgzaJ3AkSIo)h z_|T96{yH0tL%mo7hA-H1)oLkVV>$V9^Z2S-Ed%i&bXkv`vaB-V&6XqQQoE{uZbDJu zZ6A=Z-RsCVCkq6zV35g&}A8?P+Nnp-|u|A z|Ji8W8mlEDE11$i6TXwd!Ko*L`XMt`Gg7)#8R=o-){*84+a^dE5*tqZtp*KL17cmV zA9PQ@0ol)&R&6`yc1W12fqingJtgbY>-;n-ej7-ot4MY4BY)Q1&Qo9nv5V9s9eik& zw()y5D^-%26z`NZQEyfm$bdlU@-B*Ih-|_yP>0SXnlb_5{ao;~l*J?>hXWx^<&Q4S zkrEB?b}uuz#+d+h-|h%X{Ghi@`ZE)- z`|(7c0h+f9**dSD2rZWi=kTe3};H#lM#-;3A~70Agx9RGpbi<6wCSlTJM)b z%)|FFKn6~aXfe>9%$3Y3otU$+k}wJnR6c2F`pupG57N-b&g|Ly$L#oAz0-s5^sIQ; zIlH%jc-<*TQ7UJOR|G`nI;-(V^La=8-<1rg6-@GR|8a zgav|)wzMnJ87tiLX7Q%gbqX#$!lpL)g+(T$0*9f+B}ZAQI$3%woV|d;1HrPy){Lqf zFIiDWRQMCO4S+=8`coZF7}q1y`UO6kzkos7We&xKFN)?Ib2tXz3|8yhtYpHOZn^EL zUjp|gqhM13$WjKkxwz7~9{g1GcUsEB7o~j$K#DM@Qjary_ZQEfbljri4mrO-wi(U} z-0~XL&%z5cIxW`2lgub~oZ#Pdvt~Zbc4|yQ)el2J6__#(sCmiYL^XBhtxfIpr=RC9 z2a^k_`z_{zzsYXbQY33WF0?esUTyJ=$;^dP5%9ppzW{ejNRLvt8yL&bEOV6TrrBcB zr1vggWHk=NK~1p)M>JawFZiQF4(~0y%AAw!@YlWeh?C`5VX(}`!%;3-4QKBb`E_b0 z5o-x07YjC~LeV}hMAw?62}$~$W}+77j*wqZFpH>-RtgQAF~bt6(Ve04fdlN+BLQql zRmibCz+-&5?^&*{&OsuzN(%aZvsbcQ0sJ{ro~2O%Hxxr*eXB^C>9X9d%{^HbC1DbO zlCb7x%`M~k?wyqf>leKvXwgc`FB}dvwIe5#Fv_$yV8sJH&kR0)e?qS$P{?vGK zwTLW(P3oR<&u5(CtawH~!SRRrtw&0J)6<^p7S^QMNRIizOEgVnOyBGyxE8%i(^Z+& zP~5FxB8s0X>Mua+AbjQrqldSfKcYgYv1_r7e&}QvIS{GO#7_?a&pf;6q|Q*O&=*Ui zU=1aVrJ0U}eBZNBA-$RzLG`~cQ@|EdDPG{0Y~XDl%eKjidk^pV`WKMyC>*F$`j~!BKQ_%MElpQH>LVrEw!b@KME}w|3M|g@ zwiNbRf@sQQ{S4w2p?g#{M9EFc!IlPRCt^b*IT^X>s(ulb9a1wcDprNFdEiP#Fz(7q zc}@4`cfgB>=kk$i~X;1peac}a4^o_y`HGx3An7pkvU zn%|XL)yWj-2p#l0{KAFo1-jwhKNV46^?bj;(M~kJMEEr8*Og=NW!` zxuC-ow&z7i2p%#anIlc1OZD7I6R%C3Wkd-41q8ezNlFXHyE$n8nCjTHd9hP(|2TSo zgpE^{qd#KU#9W6yPm4fScflw*Q+n8$kDSdH%Z@%S@XKF7Su24Pn0Y%(aEQ^ytT^FR zji1d2QCkrouK^)4wOg%dBc;<|DM5Zu#gh8y(RBfE@GS?c#FaNi!57dK>n(LT_} zGYevoeD_FyE;t>1+3okmPFj<|djyUmQ^^v_1ln~IZVoc_=bpZwc)9t7U_ye}NENPL z7$w5azkQcvWPfb6kr5(tWb!fc}1iaQo{^KX1Ot+HA9fU>_(D zqXNxpTFvXns#tYDc^ouRO&-Y|Mw_U=Vh@a+i&(c4S+1Go5;};KdFcM*a1|-8nE*gY zTG++OIz+M)6ABimb5{NtSTvHkIaT!w{wx48OvRI`D4)a(gF&^V_&xpz%eQpAVzFwq zvxLhlf>h~=tuj(YQ)=- zl3)jU(J_-bKI@X@%b3&F!q^=){275AD1Sy^_wMco-GjX6W%K)%_RA=tm9y2`rjp-L zy>ZYx3QqorN)%%#WRL(f_eSOqa7Ce(ELvloI41S;;XDJ1o*N#}^+ zIZ4QLA0KDIdDYWAOkAadmp7aa>D(q*Hl8Q=CSu#{SZ8RpwDb#`2yS@WUrVGXeR7y~ zJixoWLO&gLEnhY5o@7lGoE*Aw{CU>s?5jM;LVPUQw~qrC#@(fbAhRHv{4%vxo<@cQuwEo6Z8b%F z70CsbnvCU4^_uLabU80pDpAmnbspCkRf*fMs9V^K59*MzwZr}ka1U=IDlZci^Q%t5 z0ZhB*5{t%&ZsEFQIDz0zywOyOIEYm2HaRa1+X{xtt#UM}bWuKTG#_fUQY>wq@kd9M zu72OeZO~7-1j)!G)|CYJl}GnOrqED+7L0Zu4H9Hi9!1K=#>de0g51oarB^H7`v;{` z<48M2HBE);MVef-GxeEt%zWcBr>4B$>{knKc+JdgyXdNydC_h+$NFd#V-ERK^St6= zBBAv77d9|74AS0soY_yo5sYxWIoIjaqs&1CTV9GL!#x=y;c1GIM{ zLVf=5iXknUkL3RLj{T&$#)4PP;B8{uJ6A-IX!YGC7s}iRyZv3K@^`)Cr?07u@byn@ z@0n$U^R;4$nH)UqsElttO`Uy|L5LfimZSq8B*)Tx_AK@f>$z5&PsxisKxfF~#G=Z9 zo>cD(=e}BwGKNZUSFsS3z|F=ndz1YQ1$Ejbo&-Z%ZF?kGg*~8aven4)FCg`_ilV6P zoYd7d{7M4($6s=WaHhB`dg8Rx7}^tu(XKkd->9!}RiXf^Y@R{R=>HgRbPltX%`K5J zf3?4i<{5pM;QOX6=~iMV>r00v;dt= z^)_oMG#*oYM5tjSnv48+*s{O;U=S`Z6-Cat<$B>Nf)NHwYT(qAX5MaG3>~Ikud&2~ zPIphuln6_G;mA?_X`^vNN*DbKk3)h;OxMVW+%}eGOYq(XI;H8R2BVNM@QPNqL=8Fr zfRUqxoLYLNWF(o9$BtA?!M>D{m^x-}7%9mB{;uFKj}?b#$1+-8P0tbL(7|cJ(G6SW z9FhfPlwZ-s^smzw%=hojyMH4&3kr+U-z5g#-gL*E{f@Gf@K;GV)b0Rg;BJ`JKa9X< zTc~j*#h(UZrmJk*p!0=4hf_f9|^P0w$8A&fd~wAssei;l4cZ-w6HUR z8CDs1gLxJFQ^!BQRZa8%3Q8Q#EoJ))aGjEhqtY@6-Iy5$)2Hf9?QUo{&QcKuawF*a zxcdtY4DUzVN-J^$8}E{pxGExwj?w%40b3B?96 ze;l2tDJl%902u=|b1Ag&WNg$vJ7kL@4T317Ej(SwN;^(sE2O{YFmx&Nf&y<1+K-pD z#3NE>4Q_nuHjF>0A)2-bOO_x{I512xJd|y*MmY&+2SM2jEXNvK{iPD)aYzJru`nlw zo`%a#@Z-!k_G20TbL}v|vv5IqGi2|@?4QoC5@!HXS1>t?P0ajI;Exa^` zK%Qzh~qc~QBE10?x;9FbW$Hiy~5)k8+_a08RDA!9_N11*5{y^D%mtLD zZkeRpZJx_;@_jbzDAmy&7e*}qw8gEr3|_!3!s#=tIq89A|J-o&ge6WdX|2Dh z*vwjm9>9NDzA9vwAi!GZnVpPl8hQWt4>aRdi+asxE^IWfWXKMKRsHmymaWwq!A>N{ z^eBr>4g?s}q{p4&Xz&L0p{wj37elI78o}Ifjsu1&7qIXfkO@+xWkLv1DNZi9lbc4t70G zC?gP{j+9|n2tYS?9zX0ixz7!0or$iRef`CnuD5E1xB=nIDK#aUs>UFm8l+Wf(;gEG zHOYBKpnJ-OXLY?BQ0fq zn}IEMyXXm>Ra7gE$8x-SifSDcIAqoRz1M{3(=%Ocosf}sqU8Am&9Z^(-bbE# zkoRX0&VXe!G;zaBO^h=@iz+b~kIuM^7pEHMeBqu|_Hv@(#Vk3)YNSf4EbB;!>~_VB zeZWXf+0K`{TNS={tp-0A1FsU=S6Fh1HNOhluxPa;Ovq(MFYO2pgNI}lYx&28`%d8d z#9VJXU6OAQ2NptA0egUHhAaNKQGi#n!1 z+O^m&tK^Zy4+|0eqL>nlnR#O|XWIO+Za^-}VyXJdu5sN4n{HpO14E5UH`SwuO+?Z* zt+I{JKSs_vQ`4SMzkZ*g2@k`&VCl!Yb;j=rQ|s9hz8kxoFPgoay7pg~mp1)|_PJBJ z`?wjYC1(44Y{-%8kJ@}%6y4Gti-jbW>ZQa;AMAy8hk?$tY-B)6VS$S9`{mtM@h54~ zxxQ(C_DatF{$S*a59?^`>nYj z@v^3~s_wp}+H`kD9+Xt^`XV9c++P0ul4kQtNmt=%CB)2HMsD}+s+@I0V?!zKk00Lf zRTka}b-tD6!V7YBSo;c?H!Wlg`7q}i%VvVY(#vePMEQn`uhMCe&au&5owqMn?gas9 zi9>HHWL$;gC+5t`EBSirK0U`<^Uz}d3$Xm-?E>y%L0gs3-&CVp)P6hHr|Cv~Ht+VW z{UhqguM2g8kLfx31I5fL5Vau6-)7pd!i%$s@_m|%smehce(oRa1xHSJZWlYfo5_az z>`XJ>igpKYsG|;U3_cMl9GI~632fi_#6ON?)_d>ti&@W*VM9@GPcOWNH}O*s7<_3! zS{6349C2=;&{jB+cfWSv@mruo|MAJFXBrT7o}jCR&(@vy@{dQ|9HPqF^w_G5H@`1G z?l#NonpFOLqS!>eXjLqs5HF8xF^mh>QpSq>WFmnh)go;5^jE!pOJS9k>T!ZqSURh- z_8#Yri@65JBOP5{330eVtNIBZS#2AXRB+8(0#-J+Iq(cvQS$PhI>R^|u2*LV-42Qt zfIzr`j+J3e9|+}*h9FTgl;O3;y6MN$Mq65YC%kVJE0&yV`O#?_Woqv=+{&6hUJy<2 zqS!bwcsM)40%7=cBGs8(6qYZ()=XE!RZL~}jiRF8`>?~IibIR4d=aILT@qf;g@Z)t zY3cg|57T-48ZuUCQ$BEQ^tbYU^*O*2?eOuQqQn_6&rn&k?F&)`bv?E8K_fOj323p` z!f;!vQb503#)qoyH}B_W=CqGQ`s`7sEm=0#*l)O zvBoUD4eF~}siJYJOr+rvBn?7nZ6}3Y-PAJnC z-<{=t`dT!<8%TJi1$zTd=K{?wI2lm63Of|N?*FTD%&J%UC_01^bUrZ1b$T zNchPVJ@`8YdeT|B_wDlYQ7Nd?>0dx~n|@hWdjwfpO7x=9F*JNbArsHcb11*_K=+x> zDxxwH&872kDPdT;CPsIKzWKxLj`%jWI3bvMEyTOMLV$Xcr6I3;-GoLwbhEG^n_kRX znKHTwoR)n|tyOR(-PA6dq-pu$+XdwHOFvtG=RZp_1K-T^oM=!5e2==R76|v0{og)p zDmR34-YRX>d_({4u5~(Keg9)1FTDb~Ez#cDPG9JeVD7|T;*G<`i|jA3o9`kjuwxPb z?PGf2o!Wb~7YD}SQeX39jJ~_tW1{8#O|{5L#j2uXF5OyRASb)hzEp?Jv)i;OBQ_^i ztD6E#^Mj>5WB1*^oX1=WT8nJojDskcYHu3qg{}$KMZYw0HTmi2!HG@A?bDfilkIv) zYJ8!L3_fz7i6cYg&F@XewO1x<`Q!_KgMB0PBn(&AlR3&rNli})Q%xC6s%!c1L?v_U zP3x&hucO!n8>bFQQI(p)+YYb<%Vi~!D*i0$D7`(TG^K{dWZ}K19V00Yd1jYyfw zcabXtQY~<6d)mc|j0Bo_|0d1St9&FfR$=iN#J7k0(MFQ0aM6S z)g&|R@g32w#aHCzlPrgn$EvYEDWTA5^A2?*waM4Vv{ke^j3J(vY8M9CndX>MTas_T zbD4k9&pl_=g=Z2RSEYWWm}Mc@iF*3ftEJbOa_pSxlP+elN4;DN^=b1ler}MkW<0^< zUqBGs77A1Tu2|xWd`Cg!_lgPRsrguQ{1aimuC+*8sap%JWMAf_2(FaXFT~5PQ2~9s z<&)Vq_+g`E$4+KHXRS7K_FhCs;PHLC%E=R1KdhH+L8;8Y>pF@;G>i*J#J6e39R$>< z+Isq-Q`(H>B;~m?))QhemlJ`@%yw;FsgZOoRNP|`EyRH25AF)lE8%N5p(c&XYQIq^ zSEKy~S4T5Jjh`TI13IO{jjdGQXF@ud)7a0?5oBgqxyw2a)2RVxpUO_&)H5KV)Qao1 z{4{&8Ser)AvZm070qWI&c*H$Gj$zw#bH28z40GibdCRMFPqkS}njB-k^Fs%W#@%sj zti?>q`S`~SO$JBeGcPRL57hY3_CQOzQlv50!@KTHgLZ|)_k`|t^G06nc9&PPoa46> z{qe(96PyL^FV^qvsLIh-v%zV)`CdaA&{*jzVN7viNplT%JBXoX%52zEMl46}y%)kA z&ssF=D^d@=5A^wBi5q|YGGF2J6b+0PHRCLyY`r;ncYmgx^$1P}G@i*=(+Z4cX8G1& zR~K0WGjb!xjcxc=ETv~-RRuCD|ghrB%EF`*|PucfsYtm zzaXXznX`~;jra>l>cm4ktK=BARaMB{cYlG|otrC6*EZ_BBo+Qx`;KidSXF)Mc3<-vL8P?qZ}CiH&7JQ90J z!m;woJL*6^O1zk~Cm|X1jLrm*XuZ%$?U5{!9j)|DcTUMyT7=6{rFI_XoL|0bM~bHH z#4}}Sg6d3Ff+UoNVcBEimN6mQ2H)U>v8M@$&6fBK%5P%g$vQ|jPCPe=hNTHjRYOPB zSI_;TukvA2t5il6OVoTD&9=}36n=U;%z(*A5B2Dob$UeuzvQI6@hOX(7ZA_=k4pJEe2oHcVH*qp?_;fP;*ATlxbkJI*b$XwxP4!r|>gl2{C&x|(E*)rYN+gR^k zU+y2>b3wJAPX$iN;RmzL(j%8aXs3SV?bbE;f(gOsu$WJ|?vz8x^lX7DtB+q}In6qO zyUsPt>4LmdAvTjDH~oo%W7)S>N=+;NDzb>LBn(5e_&yE(ne*}woyZt(>SC&0M?VkK zV}XvlxF>I$Mkzb8GKCI%I1zy-Nq&t^is8H}PyR9RVWzM6btr<_9p_nufhZHQH~j{o zV^1w6{*zE;P_FHcN0v6*IOCk4oqC6?!z8QZ+G!8ycJq*7X1{yOGO1MuSj^IV`1{Rvd>@dw$Dz4u ziMlD4+(KUL^hLm}*PjCw9ghsolqo$Bvyj316ZqZX)L^D#jZEMU%gWJ2WhNYKao^|f z$&egvnniv2nZS5UjXAHmIH7m6lK?n(U8bt6OdRPOuWpM|%?=#+!k`^CRcAKH7o8$L zhhJ}_w@;XZIae&MT~*K$@zMOiLn2{)}@_K2V;wI|fTVP!fm0BRU4Vx)CUqHk2%oiYMiE zG2c|cfzmA#I-*T3>rX~9qq|wK3VYVTw=Hic(e#mcR44DtLgv6X*1;=Pl?^t&2~?u^ zHXHDw(oYuBW#BIZ6`9Ie&Ze_5c5|sJjI5rcMvk`)zUqV?Kmw+1fXxU+pmnRA+J;i4 z$nB-#3pIno;Ps=`viZ%l(!|h1p-rQ9=~T}JJsQ_v#f$_&Po8BM zlryK|+Gtp?^81PZ?b{|u zVWnuSNHghKtwK5gCPwX3oRUPy<00t${o;pFXEzl&_cVcJ(b}+Zz4*BDMZPqa?#xc08eP-mS>i}D zi$aBm%69T72vG6vlWoi)=M!9NTmcR?21&EDQQ*vL`^79~&i+=SAXa7Bx7bO#R8OPx zs5BByTxS-1nU2|plLgUjds=J@gm>owGRYL1O^H0CH5*63wuQTT5M>-$G=^iG9HUVA~Xi1-E~-iF)=84qCdDWE|(-$rz5Pe9rDK z6c%4tP|enqhA|Vppg6n0#3eL>`F?Mpb8r#p9iXsZI%5iB6sXgHF(kyvlIDWW&qu`v z>x5arEvLC1TA)DF%7tcFwH^J5 zk28Y6X!xv?IhrdHHh2mN^NN&kyj;vRD1-qBZoFo50^H1JS1PG>7nuGiu?B0w8QJT? z?a=+kh^fU^6FB+r!rsx!ZBG~^qga!q`i`6EgG{*T0%>C;YdMialnAlEb#$O0WAQ7Q z(w)Wk9`lo9#6r%?N~P1T8TKB@}=+Jc2<2*=kkX6{I|V~S}wxNfS# zwOOaApOv^*#oIyL@MTkbykC4^lb1`j&n2>nEbYS&1%J5_ca{>xbc3-^CH2eqlg-C; zMJ#hQx9_4;8H^NVT{?M$vIzE4&ncFU!mmHd{TPTmeQs}*Spv21&})EoIp)2F0ZFl@ z&8sLsH5CeTC|)^_EV(<+9R?h~r_FwBPA{f3qKw&eL+fsnYgRt49@?11n)il5d79hc zio!I7>vip`usPtPQ=RAdp$F{IUgOMdivznmRMT^VT_;O*-n&|Ui9uHCUS5xUvno5z zz*5~(ta*m5IIp|Qa!aXhf@YQI@8?Qeb9im8#D*nFOS)(7HHi<@NV%mB6sX)8wajb_ zvlogDIf=@rxohY6_?|xTDx|f)T>B%hV=Eym5QF;p$}f2-TE+zTgK>+Gulkh*g9WU5 zHAt2xpWwh6h+0dcQja(gk-ac=kS#Q6KGY_q@R+^6ec~E>o)#CX)vlK~d4)kux0GaB zGD;nX9n-K1fiNhlk%-)o_C@FF^rQxQ%6^b0Lv}!p`Ep&q--@-FF}(#>R6-D=hIgWg z>c)48VJQXbvl76MtywTnYUfbSD8o^uzkp*GXYM~M5C)AnU-g8`oz@W}1_)p(n(U3A zWy?#}Apd-lv*r~s`@NQY_3;lohlHAEMJ}n z4iJ2~M&xU?(eY6A<5QFC6=P*6rKQ(NB*ozUc0j+@PAp<9duHRz`+PN}{{i~iWOy83r+?>jRuh}&@iZx($`|GdmY$SX2=N#|o8;i%XHljW zrp_P=St?DW6Bs{eJ;uQ;+te*-mEPWgd^$)c==RuR`}FNEpkIz{5-&5-uAjsD54XtS zB-cf6HN3{p*&bko&x9VOjeTd}ak3wi#-qxLM?Hx*Xpio;tQkdFl7Y=iVy zwH8PLnJ+>)Ghd^<7aORFJrM1g%PCK4GBdxjzv9w`s?m1?rG&^Nbn~d!5oebIfJ9Ss*r{hF*$7q>~JxleL1=@1ECr9 z7>F~oXf%cCM?%~hE)3p_xeF1s`YyAtQOl!VTC9uD_@?nvq1K??K9)Qj=nX~Fj%=ZNPB z-%E)XkxFu**-GF>)S3~Yi&5;Se7SO4_39nIhUI;l@TfCxRv*PelIb{+6+~lu3j=d< z6UZx)z$EG8Ot@oIC597Clz{Te9GHd&YZb(fO-n%L6`bvJ1RQnprLh>ZFIu!Ztt#x1 z8tjBeVOFNA+^W&l(`(EqrAqQ8IUae_=FH+mhMZzO&t64Fs~I~{I;9lFlZ<{R8av1A zM!s$Bmt94=8B)k?KU1u;79+SCAKWvy{70^i_)Ts!mW@_u31OhQ zM4!mm>-ASHI74P?Xal^ToM6|UOq8wdm;P`@)d`=c!u+lj#xa!;QZl}xc%S?m+02O{(644<*EgNw8 zunKv`8mnmT*PqXNo&q_O8k1yMbvuTN;-6hsW486EqMR*J+rX7O9tA+93GyzV%cB1P zXHE&fR=aKL#Z{e@#@{N2(z?retSL$W^+E|wPfbi&{4$Hg-Y`R;Qr%3uV$fw4?J;RM zM3-ARl=$>p%URv|Nb=Kay;C#i&vx8O$J%b2M%ZP6g3UF9{<$e5!EZQ9LGxef)gs>Q z0?>s>OP}g2Vz2E73^(R?0k#gaH|hzQ zRc6_?Vl^t0MjeZb3hdZ*)Q<8u{uYt_0Z5HVi zX8!;zSlJ+)ekFI6)bi1VW`yhTn6YfON+BsojQrEdPn`YY)~>rpGmffJ3HcjZ?%TE% zvg`_TeYH9|%SGH0XS@#8tl(szE4!b>c@9|6OuU&UikcoZYpph(J37G*HmBACzetYp zE#^WJ)L2q(CmQ5mdBGkU2>n1~9*76$t@o!G40a;9MWsFg%QVzZVk>hXHcM5GVqN;|{$&}|N*MygcO^hH_~nGKwmAjXqJoR6M) zeF)R$fo4|V%qx2RtkuwzkYdhEM-k7VCANZwxSv7ydWeuIboo-%$gMbGZYRWN8&rK2 zjWG*kHc?9N7<&&`94U9J^VS2ERrjBFVnd2;^=Gq-S|FDPlX6j%tLvXs=u+^32I5hR zEpj2uftQj|lK6$j>C<775z+W1UX z-Y45Kt?AQD>U4U98G%Zz(xQ!`KuUKP*z#7-y+QCPaR-*F?ZRD5tD=iin&m~mbVW{? zJy`7=Lwu03d1XmLuuoEuLFhGgxVXfs4L*-kg0)K!Ns$P+Hx)9T`Cy;K0(SwQ0-$;w zR6aORqFdJ!RSI|BQPPtxDo^95$OJ8~nh9EQ>8pQd=8KeVd6Ay+@|-w8)9q0=lNI92 zhY?c}^+HnVvDB@IoLVn3h5lDkIqf6=0MV!9E(XAp0wrDQf-MC+tU$bJuNhP~T>OtZ zjH)p?$9!OTkTj3stx0tHlgUh&sA=F3*m4W*iN;G*BTYo*;D*v$C@d zs`zY_?FSxXKO+<&5U12z9gFFll=B1}tv~+&Hm0q+!n11J)cTsLQ|R?bZUslJKygjW zjCy1!5LPkN9;45utUbrTtC%$9i1z{=H#Zuh zUU2DX;{ClYJFe|^ox~ea9hiATkbO)7me#O(t(7+CF7ip`rwsywTjB)*Jk}QnjF2Lr zDmCfD>4GKCPxAMuODI#M3}-1yk3RCXQ0;yxR_wVFQEs}`GLtn~m2TEsMM9Mz`lY~A z_2i-Xv_~R!pE68J%}0l|t14<-N}Q@#RWS5bjPodE!b@k-F5r1-B+P?|SM*avjny0} znBkOe3KW_z1ICBv0}rHeYl)T}!u)e@#J*z!5EWR0^*W@q{#S9eNz}$8D7WM2Zz<=;}%Q$tr6fO-S39WrKN9L>hM(IQUs{yet3n$c{v5bfl${sg%5_Vuvf5LV)Q?2#LpM z($Q?V7M=O?HHEcriFJZZY6|Ze30cBvcT@;bS~VoQR=sKTN}e(HMXMRQ^<5sDk_#*!)VBsS_N)6XIZl9!hQ0PZ zxY`Cq&&4X4tj``fZaT_iwyz|m4r;?vFG=(wihQAM@SZcN-yV-0Nts!382FTske2h; zk_aAp=9NjbXU=-5TT^nMNdXlq``xSO)Nc3(_=n3>nY(Iu{{UIU_(s8Ant$C5lG7_) zz`qgY*I!7i6v@!xR2(*y!Ng7}+)uaI8jKdS?vnu3%DaWDxR^N+P`g^bozIxL8k=m^9d?Ut%CAavmZ#SrTA7XqLOtowTzrmw){+yb8<&IJI;RC! zY7|Re-(hPwsnwWm1xoTkB&oybIr?i}qheI-ctTA+s;X=9JFB|ysSZq(eIdYFibtVZ zPx5GHi)zr9SXEx5Dyer?$H!W@oZj&CZKKJg{*V*=x;9EtZ@OlX@jvFrA3A)>7S2qy zF4xnkx>qFSPk))i2GGChb|p2(Xz$dk)X+klbx2~F1%!0nz0!fSdXcWRZ)-b7U0tRv zn&ruN$U)lWGRU{ulE!>csgEHjBg~~|=ct)B;%_80gj#ZHNo*3Cl{U68f!83sQh+@| zbOCc;_OB1*?3cvu8`{!a7*l3j)rl>9nTi4ueGYUx_AQ?K#phIS>y|ue>?;MzS~JOP zG}Bd1nc?${9@Qe;+(Sy;i|o%va+>+VrQ8LzNg(*C3@aZ%tp?n_%XGL8qDr`F0*57I zdR(DZ>eQtq`2&@tAD=BJ?;bsH(%`GdlQW8xE5d*9%hecF+FM9ZqN6Jb{{WXvz8-OY z<$%L(@b%MkFxck;+TuGkrpWR%`ip(A`6Wp{y2_byOa!nJM$AX42g(is$CFisAngEq z4|tQK+Je%U%M!S?#SR=a>HDW@l|W{*+qBLmaP{zHHF4Q-+J{kXv&~NyTR!h4IL1qRe8|)@3!T1| zw%EKsY5xGlLY}9DVU#vdTbNxz$ytsEKWJV^dcxubRVjr;dfmT4+}#4W`Jz=GQ2zkj z=QMj4&zCTx;x#Qxsm8o2YqVL~`{ifpfei z2@L_A@FpC%00d*2fXL`M>9m!sCeTu)mfTK?9*0rT!kODKxpP%Dc_;f$TfjLVC;_c- zj-kRQr#WR-tK2!~+Df8KVO1&{oCs*%r()76;3K!kJcs98o6rr@Ji}* z`V6g=>Pu(%bqYkx?voW=dk0BUNKyjvjZM(_k8$upD{?$~#plDwODt8ayMfN$uR>06 zrNWX<aRGtiho1tALdzmo6&?qYw>|!q){&#oA#}3!`Lx-hJNkk z1AxU|J_=t!>D%otBdOjw3o|zIwC^Sb`))uK+6COmYV)+@Cn!syMWr_kc#%zY3`_@-*aS51%_rgc9$I`&6|NIq=&`P+g+47Y*C9ch zR%kpa1!uh)LP-1AE)$ZTVL9y)f(TOn_qCq4FPV`eQrxv}Xik0g3HLix^v+|ravo(s z2069 zkc@LvNIacS=5LyZl7~$il@_6FRiM<`b<1w1_$!T4r>#hhBf&u=b3(I_q#uz3QVOD5 z*Ti%^7DIOZ!;lqDeOnOggYh!6$RE;3J_9Enhm$g@v+oGCr>v*#M1XfL z8;a>EJwiIHXB)A!l;c+cQ=k-W`|LaYV01lGL=qGnjrPRtFG+B}q;9!kjSlc_o%5@*uw$L+ebAGRrNtx_qVxLT7-kWNWu%n}<> z_}V?w@eQixVarje(^nE|7cLUcaLEDY$>`%pp+0HoeLCoY*6EJG4OL{7wyscaNUaiu zV1EireL)>F@edH8&qKJ_E4sRc1DN^qST>@S38+6l4E90AxmAgCF!blN+$4ZwC^Xf62 z1#TRLRYWSCvn`6GXO_w6-9ietrAhG~N=fkt>NMWrP5%HM+GcaI;MP6bYDZ}{)RNkp z&yQ^h(XoFbMm#jd)V(s4g_0DUK^pw{VGFFLUh>)(l60*<9{aV1ZM!NT7wP`vZ&xkO zASjF?fqORGD}pco0OQO`k|Y7)-dBcFI%;l`&Edi~{n_f&Ix}To{sqLy4lXyzsUV%B z)h;LHs`Gi#sMjq)_i29TEe@+Ki4^6)k<-N^D9_0JwLQbT?x|$New#Y^uh3di8)8bQ z3f(nH@+~>Ip!%e0H>ICS4d51o$d8<$OO3b(cA}MRARj7u-RBnefqYDz6;mZ}>xcCo zSyY&OKy49EuGbQ^B!7tMN5vj0+K)W(u1dFxnFK_#cyP7KLymYVWc6VsApR5+{JuI~ ziuES3Q*CY9JUikS;!%Z7mqnH8RFVQeVW^w3<+|u6?K)KkjbYOnP}+!5gr`%_mwm*X z{RWgt*vv5Erdml!-LIV>hhK5PC7mGdtvskzEnQiOGDc|?poCr8dRw0aYUC~J$8=)o@eE)%H`1gZe-`?NtZ3@j&_qO zbJSHPMn4Wu!k6=Lc$eB)Fg!qI@uoz<)NGE#Hn>lPC^Cj!*Vxkg9bhAo4{* zLR4Ilj}-;DR6mg(T3ELYD}zIMLbk2#pqsMKbt&>Vfhj@F>}@l>4r zOAB>ehdd;CXwE~C?8}O`9-BP|b-w~V0+-nh-Ga(DzV>=&aZ>(+Np2QSYNchOvowUV z?QU&iLe@SMwo(#F^xvl64HC^txkh?pN8akqJ#y4izlpfpzUe2(uWAxK4!E_kCYGO? zo>4Ru6y5;xpgm&6BQm81Wk|%O6FXi;xe7znMgsv z{cBOvJBE?uqTN+?qOH@a0m-vgo{4F*hS^W1{11>mdQIK6`O#~&=rnI1iklhTMJWG?@)kg4Ft2EUDxS6uPsA3QvgvMF~CxsOZX@Z?{V{*vz30$!Bk5 z7Bbpa20KDLLIy$;^FC)#)F`6gp$KfN{bYo;2|p3&3HhDMK7?q(G<8C80ShaiAv+S` z{_V8&dLrb(3ImSk))R@&a-hBpjQD<>+@4R%8_|#7%f#K!Q4yRkL z%}lkF#|}D#t7_j$Kt_KkaeaTl3Dzn)662C2_CQmb`=*jd-b!=DN$o#P;nt^wA06qgko?0m{- zj25K#@;tNGQ%u4sAtM`z&eZ-9=1#MSZzL#%6^#5O0!P$;*F+__9JxaP$#BC;qr4rF z5Mc>Q`|dNlmc?hPPk}s-L(izS!DzyAnf4nI#CUk^A$BCE-P}psg5Tu{UNAfYi0P&+ z!9z^I90bRb&^sP%b5EK`=%k+%pQeXq70QhA97sh%5le>|Az2)VJ}Dz3{PebIx(msJ z7;>>(Z;B(V(JPQv*>P~nDzOGRBomhq2a!9uc`WLvaXOh21BHj9`^6cC4943$^9js$ zi1`fX>Z8|JvhRqMR_SYTIc9WuP*!uul#S^9(lt@9>QgQl5S;|Lie%_cBRDEZZQ`H* z0OkgTvmY%zj~|^6Saz}AH53}e_k`3`T4{+5x%X?2EjelI^Vm;;@*wBSRu_lRYLrAQ zS~F1>wFlnptEoM-IU~oiS-|-zJ61Vry;yH8H6=94qd4=}N4d`a1d;g($l9+Xk@Fg{ zd^x&i(JE#H7Ly_1lH7|b>mWF^k^ca4mT}%4Qk7u(D_>pN!KKQCsWm))QaF{Y9ttI* z2OPQX-%K`$eQ-C3Hyx8AT^`4x1tD9dRQOACNK#6G#Y$0u#7a%WYE;s8I=hyNwJEduq{m9zUOzIB zgXgLpx!JiHsii6Al$y}rNB%%!c+#;opKHxF%5D^^YDvU!u75Fx?28Y9zR*_-ufVIu zfq6#cVhImXtMOIj0{b_J^gD-<(sznnEuqlsa;Vez@gfYy6|>y9nLrcTBhpLE9m(|$ zYXnXO)2^y}Pug|bHydoogCdJinje!5Km07j67+Qs1gvfI1Fo2~=j?l8jMW*-!l!Da zr@2Yu5PYIJ{H@F(ZIC=L;RncRWV<5Ca0X^nwCts6)K|-#9^=MsC;D_&{67_h^$XbU zMd0I78G*vPx|Hg(+>&iM`!*>pMPi@; zILIFG-aI;yokUNMb6U?Dg%-VF-Vi3Z6&$Xc5_?S$J`}qd)|~$Um?-Fylf^G+IVnUs zG!7q95UxpistncR*9vlm9{&Jg3J~p{+m~jq1#IzCpcFoEZ&~(8 znRimv3ghAh?|H@BkFvheW|slOL{?TSL_G$@FtMo2wM-Dssi4_7{U)=C!-ctpFM z>vfBUn)PyGPrgzuH`gXxi2Ppi`y{O>^X(i7^Ujf%tr;eih0KC~%8+UE;f8l*X4aJ< zvq7|wBTnJ6IDf+#<=1a8o55$lRH!@sp}8D5_*iEv4Jh;nU<1=o(ki#(u>I25rpe*; zHc=tVqUUr}E@|27S!ixc1dkKAr}X1Ym=~`JcvU^iYRpZ!3bv4YR-lB)EPkmkH{5Id zYutRayS*-Gcb!=(*<9iTw2!=vOePg3I)CCwaG|}wAfcmdw9HK`E%wx;jB25Y;4l>8 zX#m;|wJZu5PzyLv9J!opz*aKa7VVwGD3Sy9+C>VdIa{Pu>aztxw=HL?)PcEMkCEN< z(dDm86s#)Uwb{9yD(%g7>z2L1tEmkovy6Ea52lteIElmhEkQ6XOL?o>>1zRW%Soo* zi4}kRMDmcx$Bs9jO*85DhY`_9Y_nz4tJU|_mg4=Q<21T*amXz}1#hp+grs?6QreC@ z>IfSD0C50v8PkcT$R5sREvPBX4(v}nGv!!pQ6<)=$5LvKB6^kZ#iPV5wx2A~iZm;*T4hLWGHGbrYMTr^GGb0}KTCw8B77<8X8} zCgtPB*F&mGnEm}Wv2s4=Xz$q%?1<95l<*mJk0f`0QPr`uwA{CJS9E9-fc)_=wK8jd zW4}^sw5vWqWfqR(;=c;`l$VhQ+5Z5FmuwX{r=6bVMdl2(o~7Ie08fzJf#sx4Jw*5wwRRZ?1wa!2I-7FKZE${*e^N!scU;qMF-^EKkP4&?CW z@2Jx5SkKUI+B>Ony44tvhf$v7gzX^U@;j1pHETkZX{BFGtE(8@SBWQqIF6%?B5|b2 zIFy=-GCweb7pS~a;Y;q*o2*tTRhUWlcj%S3{?MgV8XZ!W-rSVu@~C*_Bxvh} zJZYa|P~}|qJ5AE4F{C!#>%)4Yopud1OIFm>p%IrFWlA_DJBk!`s4XQYSSg;>Robni z_6HR$mEU#NAPKY!rk?T}lR1R`85@#P_y8QJVax&!Pd#o|X|d@J+dNz0lWkSuRAM@p zsIxhya{(BeOpu=ww|B1~q09rV%$rlp6gtm#;M4Z1pWCqP`BkQI=~wQ!pr+N5wjGMx zcIbFP{LUwT`n+*9>&}-=YN5k>sfLkt+U$niYqD`9H!?EQ-FdYoN>Ushd+n=f7)+`o zQK;3rb%?6NlK4G!$ZlPoaI)#`ZEAyx{{U5bJH1fC*Y|60I7*L(NGf`qD0Y>#Z#zbL zRjv+Pt}Xj|T-9%Sh_@Aq6xj#;-u$IQ@Tdm|#B&iy6}le}c!|TL$Z-_9W3A6=3qVti zLV3WK(2{-~t_IhU(BzJ~A*&&|$#lHm>LP^i87q#4ybJ*Cpt)DOwVV=i+LAycib))? z%R5M#yL%~WV zAd%z0&l)VF)a6qyjvvms07YWesQ&!4Rd$B3c+Vnr7H60KK@QlPdCmwd$gUYoRk1yUQsjUUvNpaMM7 ztx2jJiJUm0UQIXe6`NK{;mu=iM5u~MZT6HrcOf~)ng)icbXtcDY@Q<6)b|wp%MPk* z^b{;)suQa!TSN4R5=Snbq0!}|ay0c``JqEf9-v&d^LMqqAP#D6XYblR2eVR?G3s># zuegbDh2ljyjE_{GD2X!3Gi!aEjeRil5To{krQ28KJ^3~M)^)E;b-FW`ECxGC_WOmf zwms#s&QvEGQciz}*$Uc78+4ki*bbUqzhH4Kap%(>Z7tZmNTt2oFk2_?;<)hmn#sZn zyUi1{jlT_$wByBr#n_aEB?61Y`%zF@ZG77mNMNm@^X{!5T?C?!MxaEgP-yh|bsJx5 zZni1Ux6OsLpd}@sI$)3Ip+tie6Y$5KVHqFGsI>#jN-h_ z;U#*O{JIUxPi5JGIE_(pyfIKnJeqk!;CHUaM^XqR_=;3v)Z$W}q`H$)g%IU2Dj=eL zF<|5rIysbsj2>h8b$l;Z(PZ4RRWlV{8{G}Irll!6{moARre6oaD#!{RV4W%NYb_To zYwVhQ2+O?UIhaR8ZmRgjN>sZY0_@_?LT+6-%hY_je>zA*E64k%8Kz$;jCwrqZ+C$ON6k zI>4*W*_$S6p*d6GWlCWl^#(H6B9{3dr<#&8%moGGJ#}W|+tMi9I+Y^aqo(=cMOkZI zLd&VFw>pVXNWy}MvOHC5sme$3`c^|}q zH9cE#83Q@Wauf=Xu1FG=`_Bi2*9}3ZLI~FyjuCKbVKXT;7>x8IaTtyngQNu3sBQ$Z z^;6yE(w$c--60*LV0ozt#t88P2h&>4TNSHWh1Ka3V%8|n0GB03B1Crwf*x#*$XD~E z5#V*mWfs);8;3qssZl?~i7;=D==tEKN%ACPUE;Whs;oOTF(^xQSXE*ImSZoMM-YtQ z9)}!;dTFZDe1g3-{N_21aWV>!nkOz9^2`2GctnjI_zlz3F%C~mkDN5*E$S0qfc#4MwA*~`8bIar z*CHEjAd@m%WPS&eyC1PSfyNf2iNkmwVFsX~7^HOmOhCUOm$ri?HkUX7+Q+Ln$ybO31CQ&X zhT#a8UDV=J{>4G<8uZ<@IUn=sT^{bKL9}W%xN19;_aup%)`QwM;O_TTo|x(g(Ojyn zR=GNjEiR@L)ix7Ll$J6Q@)A>ktmm#0Pp+CvOeIJO0M#H@l}EfMdQo7i`4mx691Ruh zL~_;NTTPVBwHl!7G^ILL{B!^}q^Tr=ahwv6anqKp^&Y8Qr^37I)H;lqGX&Ul^gA6u zE8SzVT-Y)XcPK|KR(m=UAE?iY@<338_#3(M^En038B16`vyGV|t$Ev>U=Q6NN$x(6SjLCn0cXlz$IOV374J%VGRv^1qTTaV!N+LQ>e#LQ;VJMO_S6px|YxWP=9?jS#d5*s7xRP zqy}3aO{F`J?oN^xgjW|S>Ns!VxP#><@|2YW{{S%4cG#%BP`4pFHIy?mu`S4H2PqCD z?N$$w7(ZQer`zt*0(SbvlJ)H3dY0&NEjBuV4k?tZ`Y5C<{{WcLJOn3tQH&+De_ZHB z-FZ*E;++HTrl|?^LYhX;>7tmgb`rx%C%o9&qvO{f`e@_|VF9exC7Vg?)s9P2hE?U0 zkLWcj(i>zHB|CrXsD@rcsN4=xuA^IKNeJZO1IriR860@{qa|b{Y zn;!WuI0!>zpBcJA0gy*)R+o5=EZ;Y%HfZJo2Kd1e4 zrgVZ0AlY<~VNJxQ+=m9j#Q9rkZ)4dD*1$Le*Y;kh2a3Xh38`l?kE z1(2qO0Q}1zUJ=Nrl+siJ)k1dueTXn+Yea)SdraFGQ?M#gPFl5igxQTPr4Pcy#N&26 z3RDkH?wS+$(Q;Ab7}s4zx&)Arfe(muRaB{Na{lV86bGA0{{V^(JoOcC@uAD!D&p27 zQTV{Z0S>=Tii&l}$Q^rnd%IHkADN;LsnNBTyHf6LblV>6jJacy?P|bNG8$Lq_jj=1 z$NVy(^V79G^(_R<8WEADeE$FfDNi=!tIBbEX8uF#=M2>}Rwydc+>Id(s z1Y7kw%kCOyvt6%V+urTy)u-cu>xDPVTl08-#4C!FxJ%$Q0)b5vr&A#fNYl<9uL-Eq0TDKw8h>F0^ zz=%dXyz(D!?3!Dr^ElcS+P(+tP#-NC)A(H$ z*Qu81d?brrswG|Lq{wa!IkkL|z158Vr2Mq*gZ8bdL1peG*RA_vE5I0(3Pd7=s{@c} zfw}oB@C8F2gH7IfsU+ONK;?iP0IH9a2!*>ggWV}r-mJL_By}frK+$+>OSc+rv`VJE z9zQgQ>?SQem3W5I2i_=ojGr}V%A>-{9q&VGWzO7W+VL>r9Z(t_WHvVQHrzmUCD|gdU1BCP|LaN-(C|=KBH+slY5nO#z zUu|7NSc1@5M~(nWK6?=JAf^cizJptdZOF-Mdyo<5}eRwSI_y#m^&qLIP- z5m(ff#uHPJ-`SKH*!)9~Q^0ps)`YN5YA6+(?kxgLE$vrv@{P$<;g0tzFt zl?Nns8C#0*7#Qk%#f~H0cEz%~g(};pTDI$By<5Fiv6gT-DKz#8D_56p;UxYIQTv
    9D>mGcm35l)Fp>B2v{`mh7yOzsFN_-Tj+yX>d8EhDVn7n$d#6u{ z+L^4@3jw%lPl<}k3xpCgwn^Dzkt}iN=B>uty8eMh8*;8wM{A+B6-2oUf6IEa;Qs&_ z-!&C8e}X-VCdfCvrrfA5!g@QSgCN@I-6U8Rf{t8jF`gr{r zKBc079p(IzmaC)ze=69uJudh1r2Sh;$;K1a*or&oX#R9)E;`pyO;G&Z#HX!sf(i=` z!6$TOH`uiaL$E`;rkm07QrR3jftMtxsaOWX|K zoD}wOa?;(pm8$Dakj)ZJ&{-1-e?X#(40Xb>6|AZ;)>dP6*B@b%(P}PL$WPYFly2c# zjn?jf(8MMYiS_{Bg?brKsN}V~t1->koCFCB#zB~-u=iHkQ*I53K$%gGbs(uJchJOG zURu4_10OY6@?Ra*MoL`oTkyLtxv~tF!>J?5e9DaRhXPfnI{f!5otHV~MI*A3Xc0Xw z@0Tciv>UE%guwWLE03~^-q-93JVd4m)AVC3t+2r>N6@-w_$_wQhG;rilBJ^87h6V; z({|H=*<-f=tIQg|Bil3HMliFWontP6Yj@8#{L<5&iyC3k z`eq3SKRj{}T~9`WzAcYnAdW)6En{17PA|>us|wb-;`Tp2QdV5GqS~sv*ppMyt*4#N zV8!u-Uro~mF=;Ip9)TRFER~lWw;>JtXlOU&V#_;vT)H(l)-@i>GS>=N$R1n!rEPCk zFDJ}?s%=wJ+#P;WrF~g0!BDQSmfrmyRaX)Sx))JXh0N1l_9%62Plm#q2a`8FHGF5UwY1$6&5gvn52<*ejIGO39AKCAxU7&=Ja7a2N>+mX}Io zcs9ad@OCf@Db}{Y-1M}HC6|A?Wa;QE_TdSqrtu{JXDPEsp)r=5Ci!SXk0d>G?I?R% z4tQF(N>T=F7Rt@KX9a+M3tH)DgPaq!&!WC{_GlU5OT?Y3%R=HEA z2Lt6mwH+uBe5t5gp$lzZRvRwZcmNZO5AkXV(k z&au%c*Zi0qD1UOHU@_-&$yF++uqs-KgBxTrX$y+RTQhk@WD>h`iBeO#;Iyb;h0HPr z$UV|h?G~|GFF@-&h2=wT)7^5@wm?+#i?pR5QW{;v4Kq1atglozDw!EfrU>bx!Fcmv zy8{Y074gzCFu5G5Hry!G(ZP?W<+!pu)Tg1%;m!dmv6%sM8ureB%9W0?;4i}ka4w6H zy1`nF_zHw?BFcE=_grU7?T`f{X5-aU55QlHmO_#Uq+T@}aHWn?a!!6|Y(%){D)lHb zJbESEb}Bce>z8 zNg2hLe+l>I39;eE-LKEL?5QDj-YzfLq3n{_Cq0zoP>v7@hmMzX8(A4~ z00KEHe$c8ZWz!oIWN902eRy9dL)5=#Ahg=u(d{eZjZG7P5<6(@pU2An-)mbJ$?-ql zCAX~_*HUSXkj&e8gRVYbyQIoanUL1*b=nEI3JPzE!lVxq%y=ZK_5T16!<+84rn0YH8YEi4aJJ#;?iDKP{gPZb`LL9r)yu7C=jOYr)cjZjufbK)t?ah0 z)vk-R)rHqLx&u=&E;lONvlp}GhsrKbbvPsGPh>B4E`(J$)J_;UMJj)X5jOl4eKMDP zo5=2_&PDx~sHuby@tZ80;|*@u9^3X?9K*we@GKY4pBOa{5~1t`b}LLBuV~2*UVdt5 z*=u1!!E&uJsuE=DM{%~~B9v6c#9>vWhjWG#Mu(^Pvo{zCc`>Adx;~e-Fm~A4SgV7= z2hlQVx^M7?6&-4q!_ASZdKJ1mTPbKX-Ze-CKT_$NV+PqtJt{!17tU6xO$c-V+p_w} z>7P{%#E(XQfj9)MlcAg>b32ubym%E2ce>U79o2_P9sQG4S6_>sz zpLiTuMuo_)Q89a!doIAcmy#PSyL&egTJ%?y)=)J0f%jcVZdV{#Kw%>P03oGZaNQ04 zl?dIsFo>{TpXijBcmirhRZ`rmbv)TZ2h|xe1a8ArBxEV2^ij39Do4kJSSSxF%!bV> zv0aJ6#T332?J3fZK`bqG(i=^PDXT)O4~#UGG7qP)+UNzy%IF2ar=to;-DMbEwMCy6 z8t-)@Mbt6o-sV#yuCENlt4RTXSz@l~JHf(o0_N#U3+=zX=U))T93ZP%0Pd@w54d%_hG~tZm1N z`+V0Q;WaX0?|X-#H&fdBCm6kr6ZI@Hn;BX@sC>O!0Vdnu{{Sfd=yW|ib5b&_;P{R0IoBvgZYX}9@}z{%kbt}Xk&BP_nsSXo)y|2fj4O^9k5hfQ~C~} zH~wOn>chJb$_H#K)O}>Z_k@f$?$WhwBjJ@TL)zJ31e=SF*a!Nf6MPw@1lg9cHWu`C zzo|gtHyLZ6{tVkk_<~?_c1}V0*=b!l@tR6d#=cNTsVa?6z~M9885knoih=(C z!``7I$Aag^524`_6;3bWA(J>sYI*w|%UAQUt#c;i#O3$-(CLM5w>; z*&V_J?4&u$(L|h%TE-N#S3nryBt7rF21!P(hOybvW&{s>K8X zHU-UFd|IHcGswa6QVP8kHL8J6Ng?zL<-dtKhuU>Fi{C4L>+NN&IQ)5q|}LEZhI_(3&l_!?zB#ttR<~!Dt7~+^e|RKxLjpD{5)|I$KQmcBk@`5 zgx}D%WbJ9>6gb(%Y%8mq(e#f;Rrqnn3G`Zin^FT>L0I=rNoZJmfV3SaQ@mgk^H0Kj z`xKRK9WnYEkXi^|rmGe?OO)EM+hXn)H5#zbn#k%6fs~RiS66MmQnszC27{Hxr>p=S z=E6$Wb*wlCD;lfWQIUSVAIPmnvGudL?mUz>Z+=y`0M?&WKBh~Oxon)C*uFdzQc?6q zUt|4La~~@39Nl#`SPE5^OW9D2uN-W;D}r*O7`F%cVHIfGOP@qGowj2_CsF)5QSwU9 z*jV}l&-a%BwgqH*);ZV7%n6o@~`7d{>>^1rq7z=PQ&{w1}UP4JNF? zGjoJFcE@dSE92(2XcY2^BMt`lQ&|DfwGifpIHT>cUmr#9rg{SC1^5NfQ6@_e$V4fC z1rLu3?L3yUgGa%5-WtHXeNNVp4iz7?SbC@=pWO+>l4R8qc!Zu+M?@XjdL_ADhv(S= zp@@(=k*+*1TSnWAVOnjRFuN_V{)$PmT#;N-fGp52>a5eVXajE?S$7)^g|a;rs90}s zG3ccBGgYyR>>;GTWc$l-MZQV5O08>lg2v=+Ac1ZGN_4_Nc);Nij;-;4OHIEu$jWj0 zELF5m+e2=$*y|`<7{O+^I9PlC0J4$@nIl-x&v}YHF@L#r95cWQb+~e za+rkY`w3rl9`-)bGMT<&*5BA7@U{@qwlELLEKxYH3!lXsq^SS_dn3Gw#c0jlTrQT; zen?tbfDj#9O^#-pv=nXC0mBG=TZ67|bfdab_DU2+K7=a$4mhMP4YqhyU|?jSzKNex zXt5`_OQOP3Y=y6|-hz-g28%8$CECN440Bi%)MMin%C3RO++IU>zZD6C0 zK)^{!J$KbCp{096?e$+ig6~MrzAAM-{{Rv;yPtKCGVggOH$*y*Saz*m_Y-!5g;JIx z_W*}CrK9TB-pjO*7Z8u>+IyXBVSdrHr%SgOPIMYLjjc9S)=ajpzJ?x?(gigeTw9VZ zifR&w8R)OjLf9!<0N^G5p{Ur`Sf$|kF^d-%mg%)E(E)TPS8Z@V zhFpa0O(}LEZ^}Iie`PLsO`SN`G0arorg&0|gl9^GM<7zjWO0_qY6$nolw(G#{{RiH zW685g${VLU_)SvQ8#Iu3OGD+;9G}OueF@UqvuC7@%^=)*rdV~61IL>S=iYGUN;mI1qdWZ*KcRuTij-v&)-TADQy;r%vdp|Y$PNyZm zd-Ga~s@mC*$jRW^9<@H8xFYE{Sl2fb=0K}@guec7%`aE##n;c~tgEX=cKn`RkLTS) zmTj)6KP62o%bcQd4Q^E=p4q6XJW&&fV*K-X?xK6Q9#>@l00f~iq(Jj!%Nx1iFC1=E z^vuo5g9=}zk93W1qMuZMhQQUX8T$wJR-d82rP&$cxOCM!3WWAL@9b!nNmbwU^Jw`4+` zUn(Anv`rH(ZV?(-jy+U#u-yJ=y)7xW22mp;#RGwM4UctVC>&f)%Y7F*3-Up2CQl8`{e8dDr>(k#nteOm&_iyIQc^e@ z5pP3eoaM2~>t&|QZT%OLyK_!0-A@$@+-@vD^j1v)484+^yBz#|3fhZK!+a&z##-`I zhN%!{;cF$zh`@17N6@U6nM@l6Myg!$t<*{*Z#GJr_fSPa8{Fp%Depv*KXnGb9+yhu zTsK<+>*s#G>i6mu4~dVszH*3l{{UXPrbovc?oG!lH1Srh{^7fwt7X4743#JT@*zdNp4a900FVJqXQ~>Xd4`2 z+=Udf11R)Wd)qElc%Z{4{{YjE#VK_Z_YTT89E8KlS=Zfmxf-R|z3-xzOijB}*iS2D z(e$A;ILBp%^z^R3oKph@_~y{-rq&M#1!j7n_Io9Y3d;a4t;tz$kwl^!XV=;B z2kKh8^qS8djv!ws#SdM5rH%e4=99XW=13lUBw8J5^tEM$*ar&AbfqOCo)@;9PoZe~ zkjMv`{{U1$y4Bla?EKbEqw7V?Zc_|8ua}jm#!1B(ocTD-j#FyHj&g=o>X*Nn0FzX` z{K|z+q)&BVmWmlmXUUj1C0CkF#>=^1wYF8etdl(|DD`^xS(aadjqbToVNv5n+!g2} zy@#r=11^eDMV-W93Qt7QWyDg_`=C#8l3V(#x}8?zv?{cb?~r;07_BX{=Jw0+FhvE* z6+5>`d!jXy2;rViXj0$k(s_4gKT*X?7Qo?YejBRpbtD(3! zL8qlLxSJtPEd`9WPeoMdTnH(jPt;pGLtJd@B?$0By9A~(2sTRcaSz91iQsxJ3LinK z5(8h5iGbNaEjI|UnvusAh)bhZ8e%W(j8Zn_ z6cU~GBh?tAkYlk4X2xS3j1(|}M}I`aMNZp{0GDVd$jW2W<_5<2_d({<8jVSYDJU5w zv3u~3QE0I~!)P7usA<-59llAYPGAHZAD3{CT$_46l~Ib>KA+OG^A?v!d*cGbgnEXB=$s*K^XPjfT_UBfIB@`SJyn{LOR~At?DPkR;hiuIEd&#RZZG?~ zD+j};MsFAnXdiciKY!Id=+HK(HrBm{(`#IQ{{Vax(LtpG8+Ma%-z0pGbQ^7oT_Sbj z%YB*FpV3Z;G=|^P2>e|n;0Kq=do2zPEw=lE*nq6NPisd29{2rKO_ST`wT3#1Gf~s# zo!M?X1r2==iKhwfzMX)RY?PPORSbqV+}RE%;DQOk$_=R0c(+D}Phc&3Kx!gl)FN=;Iei`Q`a@AgAAT~v zdZwdvlI{b#`ZwV1C)z0*NWHyOG8)#-V<*c)7f?_-N(YU-mLsaL)6~3smGs`RrU%fx zTeA7ztSI~n`Gu{VF3~6}CenCKbk#eU5wNV+#fkYkd3=z_>e523HC6ket*In(xsq%5SDP|!J)b%~_bblJ zo=>Xu@nw)bK_l=sYVobP3#(u$ppS97gJg-RqPZT5)YAweATAn2O!rhOXEHk7kXOl) zeGxszSug6Z(=<>M%c5N||q zu}onnHsN+6vz54_+|&mrRMQK`^1-5)hqx%Dg5!ih#jx1$xiR0e+Ed3Sr6gyh5=IjAl-b-7trlz9q^gUt-BbPsV`^x-Ehh286I-V44#H|=JHS!PL>xH$ zP$dnZkhhC7>8T7v;|ug$j3&D6C^#G?>Y6t|@@-(M?ybkN)~ghb;B~k~XzE=Zvt%MJ zLcIauSH6ehh8QJfK(nxYSLvu+1;E0g1FS+ZM^bD9vfo0d8=CfVRHx_>BqVaU+FDa2 zlnkkE=34%UWk#O(iMUKDsjh%H$`7)%QV@t!Pv+$gF&6TriN&P~Q5b}VT1vZE-sC1- zF05c*-67J>T5?kcomg()M6-zOCTV(2M(Z2r=A3lumb3yzvG@g<=@p<5Z*ZF6)PRp| z&68BeU4gpI^f@P=uMVA^fa1$7I=K(ahCMr@+77Y=?7OdgBG~!~LP+{M zrDqOnHk)4rU$^Y76Hk$j2IriYcMA~dU2tp--RMDYwd}NgD_GvfUBFm+s>#bwqTagG zTOTQ;YfmEN_FUH0GzSrDSpaUb-KOpW+}#e;I)SmoOP!8#g0{}jQ0IjK5O!x&8f=$jhumxiJwz*TQOkXp}7yGwE-z%Qt=Mv(3l^H3${>5^J z`;cQpJESc=lS66uGlZ9<)e3sH7aKI-r+8-$j1W>cZ8Fy%PC6E~>Q4#9z*z(W$+ueq zXiutDE%PZ>_JG*6AdZs#l?*BOPpl##m7h?8C2ytEo}F^mpjw7$V-*bEB}cFcvXO(q zA0(lt#zdf=>B^8^5r0I4-({6+VC_xCj3g8Vvu>MdN403l2b8qnSvWrEu=FoyOmWb( z!8X%nx%?!1XyTG1*xh9v9}t!XIX>vM$4RK%4VvMUjgsWtN9&4$Q#M^jx<9eF5;)4h z`syJ1xgI#a6P-s@8kU9!VEd&0qW=KYmlR632iXg?YUs(eXLuC_cR^Wj1=sGWfX4FR zfzVYJybG(^9<wAdLQhY`wy-qvszbNcd_>uC4>M-AO)>ZSY!(RUY6~eLp4EOAq zwCat_2pwE@al)HTsn~2vL;ls9EZ(l9WHQ?;mrZc133oMfxn9CsMo!3TS}?G^Xt`gQ z-Nj1KvaOzoehj;nsKAYvI9x{DT}3?If)jk1KSz}ll57+#X5(_bYj-;3cY6yd`XWiV zF}P3@z1Lrhw;Kgwo}9RhE~G|HBgkU*M5$uEm*{BEaIVurSmAJrki4XyqB&^|uDgJ6 zJEKjfY_M^ZE?B%N52A)mO~;ZAi*L(|J(dp{_siZi< zk`6+1)pRcrjv=X1qJ{KwkVlngvay|guSTmECN`}WY0n6iILaAJQA%z?rIXQh1+bkl zBE%aaQL;Lg?UY#m0I3hBZwQQ0;XzvB`U>h&U6kuI7c_2Q+}}`z$)~-K4 zF!n0&qNUUYz}Vy1r>nV3*qrFo_=rt_w5#-Pa|piyGF0@#m8L|UO51{yY8E{3Y_DlLsg7ol<8XKh zP4kjTy0b@CV|X{h`gQUrR#zWp^U^&>X0#VrV>en}m(;#Md`p5XzH89>hrru+SYbC) z^~6-r-O^Zh$^*sZIUgjVZxi)cjfKVbA2pVIPWaDB)0%v*lAttzY%lo*k#*n4xU|}N zBBXGhYa0ff1Ma?W>VB`(I;OeP*34g@D?0@!(F*%ww`W;@#vOkluD|$^U)LIpl1n3* zOMfJH=iH?$-9pm4x|E*4!nFm_=_}34l2<#jh8IMD*xfN{TA6equ0CerEnQ7XF^*yA zaECbZMB^tHv@%rG_>DI=2s4>^2=`axjnV;b>zSz?6Pofoq}Y@Q=>?YGWz92Abk1#t z6V8XExfL}=&NgBsPs2R#=JM~l*LJ=kr=p5 zaCG}!7`t!VDoC`k6D&uWro|xa*<`EJ5OsYxwTB5puA5}u*ILH6r-Ku*m7Z!;)_FeZ znx(WSbaclbht2V60OX7&`uGcCxa^cZ8M^aH5&3|$8tQ$}ACgAL#?r#2%AqcoQ7o)1 zamYk!<`T#A8AQ<<}O$Gbh|4vnb*dvdkxT3U4eC01K3d78Fttr4|e#~?i{u8W?RVCq?F#SX#l;Wx?zHn;9)t9@_}EQs91dX z#_bvB)pr=&R|Mn$r2*y{8Rjk#M|GHN+$4UMK*4V6yG6~{CB^Sule8|SqvP>**8G%3 z>&YZsN9K4^OJ~ob{T(@x!wB^joNNu1eIA@Vgx^U(3qi7W73`?G{x3lIwEH&p%JOPG znE^4!LU!?$1w|1ci)9_vq$M1V!1Qh;>^NT5>Guw>zjfS@7$mq?X~){E&_F6N(@qi_ z=F?M%zYsA&bnrT6xE=4L&Z_P8_fq;yUW9g{ALTY%Ra6e*Gi zjDJM6YY-13K(Y(1YE#J*nq(oqfm@Zv$Tq6);gG)PDSKzi zxX02n-k^J&_a(E36v?dlq;g)Jn_NnAG5Bmz$#c=u9dNr)FxaV@P}ssh9u#~PA>nbt zi#mG017mgK^>FC(p;I=tnmGWy$L5$N&|6bSBxG2Tk7AboA65s6sho1dy}u*R@7+I% zTGn!^tdoTFi&|qD!?9DR>&+y_88G%cYk~G#7es1o`&0$a8&8z|RuR;5iamG4W*Z>S z%{KIZQJCD;ms|Ux-(M*5Uu5yE<1P>A`kI`_;RQ;#wkbodEbJeeT+sTZmD+n9y6*zc z9_#gXt|bI+wfOcbp(dW0c_}8gi&~iujlm%5RDsgTZ(F8QstMbiJAyqBiR}5#Z*ZEc zp*wXXchD#7y6YHteZtnHrrik^?6L|8MFy)+HSM+H{{SVn(gx2@8-_!GC^;+Um|SP^ zaWJ2VkUE1@4;Te6GgLb*b*KDX>Gw}VtpiWm_=g-U(v7aCb?tzhG(Awb zh7-zmnW*&2Jer)lLv1rdvGiZ2pe`oaUeiM(njX+gQ5ts=Y(^kJ)vf^Ommn{ z+@ZAlsU{$c4%kms5VifVd!@Zri(`psHs^>*cA4z%i&C|Zw+Jm=8>y;;Z{>0& zM@2CJwbx#=T=_1R&oa41$9oJm0?R##i$$)zfx$qiA0$?6t;edpx4?LjoD{ZBGHdcc zrJVHmvqaOj%)p2{PYxUV9QL~JCHzFKQG}nos|1Mm->JDju|OcbL`5gDGY#N5{E#RVTK>UHfa3` zTTNctdEjt2ur|S8Ky;tMAGK+%mC)q2`3uY}z2e!%YfSZJj<1H}==n+1FQs{8jj_?%Cnq`fHU*W!VRms(Yq+QI6-x@Xxyf~kbZ=U_V1O*MO8W2 zaE-{_(z!uBHQI2lDbtRMYqq7aXkpeWXxFun_)-$QjNF8+k>bZ|mnE~Z7X&GGht zrfqE?M^j2>dmrdmIzFUek*9TtD$h_+xs-+EaF=11!+$DKN>I=?+$XbU>7J-{Id7lH z>=fr7qGxX4ZVJP6ZA91&)*)#fGpYFT>?Zc%R$E^l%Ze@K(;DWebZs*<$;%a2CP2s|DVab*mfhR^iiB z-YhJ_!n$$(9dkZw=njh_N_f}aH})asx@t$mZg%XiTf*c8+ZtX#vdpA<1L*u3UThWW zZ6--lS~ zL}(bvMYtsyR}}OkJEtYIEL7;bZ?(2jQ83Zei|`6;nvBgQhDGdb6@5ddpAPrUrSR;1Fd^{qfeoO#Rk|s6_U`@%csqP?YCMlPjwV^&G4RD4Xg>} zIbG3`QGUwH@uddkA4TZ}FrUN5$i?@h~0_qmO*R5W-QJy(TMi+ZgI&u*d}9IduUDOXz4Bh%(G zF~H~5Cw&S_lnY!uw+V2!*#@JdvM@|11GrTwYGsHzH=k?S5g*2;4r}d1yr7-j8~h$cou748F~oP%N)R7*H_IeWMzgz4HXdv>~)GGO8MbC zTsIG8yji|||)Ck|eD?O7$ zvFFKpU?!FD{!zW@#kC9wlPE``PU&4~voV8kzs+cLJ7A4L1w)+^#a{7mT4)Iw_G z9(bK|Z$iBL3fD#MiJOeNUD*Esm3v3a)sDF#3Z2mTMQWXAVe`1EC4AdvHw2{~QJ za-s(+TOg6$t`J>p9}J_d7YH`E%doD+_CiQYxAD)-UHdNfUdpSRX~)eSql3hZVOdoz z6?R8rcCSHZmsta0+Up)d(6voBbZ){%)TvE8?(8m)YE(W0I(}N$Pw9RxnM(3GiKp^eDCKXxIRjgy(zJ|-+CLzX%a<6T{7CYX z6*|975oq%|+zYJ8V6Bg@Y~2c{xU*$7H)lPP_PsXdhl7@z{S?%d-Zdm|zab9QB;3b-3bqSU zEp3-57PQ)(?HRZ|mFK?M9g@b8SGC2Y@NA8`pg3}mtua`>Q8X@_*Ue2ZYu$IZ%H&3{ z{iTNaS(cHinkv?k>qhJxtrm`9Q5#4%xXK)(!dpQjE^CVvbv+ovTeuG^m*J)o%h@~B z>4K^fZIO_o8c^ALa*z2vFh7TTLTv>fg<8-?3BuWWMvbPGmkT|v(>w>ZR*$+?iP4o! zbvrCa3sK{;6t%Mv^rLM8gu8+i#S{1SJAcfe7^-T znZclPm?-*sNW)}%F5i-eMAM%wLt5sRdR%g!=xLweOBywMq2W%lY@`>B@_Q=pIEPJRMPAKGXXx(lKnu=$!?PTq92iQ>UGg62jjV&71F9{M}8~T{lOoQ@XAVjcNPNI2*kJURCXGKG4i< z;?!l@V4WAMA+LpkRs!a>!#&fMl?l}-iEGScj%=|xpp!(b*y2Tv?aI>nOR8S@T-H6i z14ibNWO^>!)Wq`f^&VA*8PmQiwzpSE1cl-;kzDX zda{O<&`D7vTz7eaJ=KI`39S_qos`K*nDePCA~tX#r?E|xv{Y3(UfBy;`&iufM0HAN zwFpe`MQ1aJ&!R)uX*CLo!(nlPCuPIBP8hV}+xe!Gi|exM`^=9cLdK>}Gf#bf!MX}) zAgPi#>U^Ha-9ybzoccn>x_0@PMFlkNBnTdxtJYsOsgTsSbbK99&|`t0EHd z*DTCu@%@+4qM<)4M6mMW)R)^@-oDT}gqn{ni(W8Vc?A+|Q^0R+!C2O#rjB^)sd#y` zfxf<~M%FRWgK$@|c&zIDo-}WdPw)Lt9P+r9`22@V(Ip*2C9_^Ol^&_2ZfA=hAxlpz zGCIxz{;2IOBW8}xb;Ysg*93*DvYo=V6Kpvjf`Of-u1Ba- zMni?{nr(4#ozj}xGY!hAX@+!-RrD1Nk&fGCt91VWUU-l-vO31zs}S)EbAA=dJz3DW z4c7Ek`55uFc8xcS^4DQcaD5veQT20OO5)e{UoCuR>Tk5eJP-bGMV6OYtGc2BH)7ta z9r%}{zfpV6t9v!zruf8!cqR$C#3$*o~xbwM+81ZM^u6I)h}d# zwZNhB3@qD>p!msYqgxkc?Vw2BaNrj#fEu~A`BW-)Mv>oMLV-4%dbDw?EMh?VkW zX1Wljk8IiXOnN&vHK;XITV_6&NAw~0Q}wdC#iH$Io#H}H-pL24bdm#{0@)&>6%bn8 zlCM$dWzBvSjC)!u=DXT4cHNG$k)*qoZ&{%zfrMZN01jSiY4W`uK0acJIR}@*PaFFfNkFk3AvWY4F=D_5PwA zq`8~2@&e2cDTAstGgmVrz1rNA0IAg;5zs4T&P|+?Wp_=SvE*OfP;!!)`(+5tZ30hB z(sWwg)M2FDj?22q_b`t{2Slo~NV>aIQFawxtHY^wc{fJmtllzmluXvB zx-UsR?UYGJ>GJGZ&c1S-BJ_Hsy9QkSE$xoH7OV5dZZm}3FIfAWnQ0NGDJMz zJg?8F6Fs?Ge0#qlTRht@8}P}r4y)5Q!blyEjV5zJs9S+_?#fXuIk>t;*P%3Zp~D$X z*&aHYD{7xT*1%L$)DlL(05@-!t-rFXEj48>({l@)+mmY&FOTSN?uaqf zlU2(4YG{O^ga;PedjaCt7C5?{)efqBMx+?!d}G1znq2ldqo0-zJrzur%@h|G`;bXZ z{{W|BoaRk4NZ!(RkUev3A5__+);ms$I<~$x)A+6c8wW60c|(W%Sjo@TE6qVz+OM-x z7?|^U810rW1Q!r-jxTGAU0%}bUfP<7s-ca7qzFsEyVy4|$8(Uel!8@C@hg)=GZSDyr!^@sWy0HGAmtN9jqjYgQTcX|i{H@O!c$#RxywAkbn)^#nzDrtj3l0D>-(Cg<77B|JwI5g=rn43J5rTSx}X^x-( z@&R$$cJc_$eF(xLlV}@)OrCnWnn}D0?+x^`mbZCf1+1`jgO3i)t?aDDpw2WI<$Q6& z9Y664Nw|A6Vl&Py#~~7>mO8;a(^>R2&JGhycFPOyTG9Zv?Dhj9-j`g@PbAYxPgM67 z*Ef7q#~#;U8#kNe5O6;p#Mb?SZ}u}zuIZPU8zg(4_W>u65-df~Zj7$*Ys69k=s{Xp z(JGAf6w_3BofVqaw1zy60C%mk>%z@-ewwS(YW!w4#`h!xoY^ZlIJGo`!fH`<$(sFT zB|NlHOJG_6$nLI5twPE+(LSERpc9X~=#ly#sogu-NmvHcU;*!B*-@Z3P^o)cQua7B zxMvO*!&Sv|FRY@UmKW9jsVD2*nTG1 z%F1lhi#3^kdYdS&_;on{0P7xfAxO%YCy*K92Wc0_&dQfpQV4ZI{XRE+mHfA}Pxe*m zG)+%Mr155j!V6v7c?pxHD{11?OQvI{j#g|fc5tb%v$8xUN}_3{zy8xK^Kfyz?mNt) zTb94_E74L^$lybT(*+T%qOo%eo9Y+6MWo50);3r{6w_scoxa6e(Y3a|%$cLo<$G== zu*t1kTj`!1p9^YkGLG~ZrKyWifVIN+83iQkR1eX00$M+U<94kHntW9a@t`5D9*AF4 z=|fP{9xeP zlCzT8o~g9UOsXVUl}l5kWo#~Mh4I3N#UaGqSdLxowa}v;$G;@A*9=`d|8; z)ndcSe;4Wg!c@(+Rb$G%P|IJsr0!RjPC9yLxk0A3i*%y)Ue`muBD|zLE6s*-5r8h-fFy(5!0|b}k@cRMHN~fcH+)`zx+p8cv46ByAk2wS5!Dh2CDu4x5tY zso>EG>91?yUD016j_Y_M=8nD4OkwX0wT;$#Fl@ey>+J`8a(RCxfa>&Sin;6}!uLnc z#o+~F67l(}+a+J@R&OdmE~04{Qwu5rE||D-9|$2745>2)JE{UVY7iI$#h0O#wc>oy?xt}f)|wL>@_7zXdq9q?U}X#c^#MPjNwMwGGi^-7D(Vm)tLP zYI>_i;ePxj%|@V-P1IV`Cf?C@i%~eaOjI>H?0HCZl@@XNrkx(6dw^HCHa=Q29!{j- v*`#S~@hSdkJFRGJ3xMG`Xb;^^-;$x#ltO46ZHsnVxh_@c^V;O$cF+IWe?jLX literal 64475 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 CM*w;N diff --git a/models/Reference/kandinsky-community--kandinsky-3.jpg b/models/Reference/kandinsky-community--kandinsky-3.jpg index f54af2b8c2cf702b1fe0d0fc039541c599e2b6c5..933463d44269a4a3437d0935cc009e99ed7c87c4 100644 GIT binary patch literal 68205 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 Zuv+wR0qI48=-q3-rE})<-irm#|Jh=v!WRGl diff --git a/models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg b/models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bf9f26b981cda1e3a62558b3719f580562a5424 GIT binary patch literal 69556 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 literal 0 HcmV?d00001 From 2ac299a5a40310cfe8da2f4a535dc108b5017590 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 21 Sep 2025 12:33:54 -0400 Subject: [PATCH 028/230] nunchaku flux.1-pulid Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 +++- installer.py | 9 ++++++--- scripts/pulid/__init__.py | 1 + scripts/pulid/pulid_flux.py | 35 +++++++++++++++++++++++++++++++++++ scripts/pulid_ext.py | 22 ++++++++++++++++++---- 5 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 scripts/pulid/pulid_flux.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b3bea1252..1f890337f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-20 +## Update for 2025-09-21 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -12,6 +12,8 @@ note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models *note*: sdxl support for nunchaku is not in released version of `nunchaku==1.0.0`, so you need to build [nunchaku](https://nunchaku.tech/docs/nunchaku/installation/installation.html) from source + - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) + automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate diff --git a/installer.py b/installer.py index 618e9958d..b31ef0e7e 100644 --- a/installer.py +++ b/installer.py @@ -1269,9 +1269,12 @@ def install_pydantic(): def install_insightface(): install('git+https://github.com/deepinsight/insightface@29b6cd65aa0e9ae3b6602de3c52e9d8949c8ee86#subdirectory=python-package', 'insightface') # insightface==0.7.3 with patches - # install('albumentations==1.4.3', ignore=True, quiet=True) - uninstall('albumentations') - install('albumentationsx') + if args.new: + uninstall('albumentations') + install('albumentationsx') + else: + uninstall('albumentationsx') + install('albumentations==1.4.3', ignore=True, quiet=True) install_pydantic() diff --git a/scripts/pulid/__init__.py b/scripts/pulid/__init__.py index 958ee9c1e..864b758d1 100644 --- a/scripts/pulid/__init__.py +++ b/scripts/pulid/__init__.py @@ -8,6 +8,7 @@ from modules.errors import log sys.path.append(os.path.dirname(__file__)) try: from pulid_sdxl import StableDiffusionXLPuLIDPipeline, StableDiffusionXLPuLIDPipelineImage, StableDiffusionXLPuLIDPipelineInpaint + from pulid_flux import apply_flux, unapply_flux from pulid_utils import resize_numpy_image_long as resize import attention_processor as attention import pulid_sampling as sampling diff --git a/scripts/pulid/pulid_flux.py b/scripts/pulid/pulid_flux.py new file mode 100644 index 000000000..a419ca9c0 --- /dev/null +++ b/scripts/pulid/pulid_flux.py @@ -0,0 +1,35 @@ +from types import MethodType +import accelerate +from diffusers import FluxPipeline +from modules import shared, sd_models + + +def apply_flux(pipe: FluxPipeline): + if not hasattr(pipe, 'transformer') or not 'Nunchaku' in pipe.transformer.__class__.__name__: + shared.log.error('PuLID: flux support requires nunchaku') + return pipe + + from nunchaku.pipeline.pipeline_flux_pulid import PuLIDFluxPipeline + if not isinstance(pipe, PuLIDFluxPipeline): + from nunchaku.models.pulid.pulid_forward import pulid_forward + sd_models.clear_caches(full=True) + accelerate.hooks.remove_hook_from_module(pipe.transformer, recurse=True) + pipe = sd_models.switch_pipe(PuLIDFluxPipeline, pipe) + pipe.transformer.orig_forward = pipe.transformer.forward + pipe.transformer.forward = MethodType(pulid_forward, pipe.transformer) + pipe = sd_models.apply_balanced_offload(pipe) + pipe.pulid_model = sd_models.apply_balanced_offload(pipe.pulid_model) + shared.log.info(f'PuLID: flux applied cls={pipe.__class__.__name__} pipe={pipe.pulid_model.__class__.__name__}') + return pipe + + +def unapply_flux(pipe: FluxPipeline): + from nunchaku.pipeline.pipeline_flux_pulid import PuLIDFluxPipeline + if isinstance(pipe, PuLIDFluxPipeline) and hasattr(pipe.transformer, 'orig_forward'): + sd_models.clear_caches(full=True) + accelerate.hooks.remove_hook_from_module(pipe.transformer, recurse=True) + pipe.transformer.forward = MethodType(pipe.transformer.orig_forward, pipe.transformer) + del pipe.transformer.orig_forward + pipe = sd_models.switch_pipe(FluxPipeline, pipe) + pipe = sd_models.apply_balanced_offload(pipe) + return pipe diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index df9a099e6..ede691902 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -200,14 +200,12 @@ class Script(scripts_manager.Script): errors.display(e, 'PuLID') return None elif shared.sd_model_type == 'f1': - # TODO nunchaku: pulid-f1 - shared.log.error('PuLID: f1 not supported') - return None + shared.sd_model = self.pulid.apply_flux(shared.sd_model) if shared.sd_model_type == 'sdxl': processed = self.run_sdxl(p, images, strength, zero, sampler, ortho, restore, offload, version) elif shared.sd_model_type == 'f1': - processed = None + processed = self.run_flux(p, images, strength) else: shared.log.error(f'PuLID: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') processed = None @@ -227,6 +225,12 @@ class Script(scripts_manager.Script): shared.sd_model = shared.sd_model.pipe devices.torch_gc(force=True, reason='pulid') shared.log.debug(f'PuLID complete: class={shared.sd_model.__class__.__name__} preprocess={self.preprocess:.2f} pipe={"restore" if restore else "cache"}') + if shared.sd_model_type == "f1": + restore = getattr(p, 'pulid_restore', restore) + if restore: + shared.sd_model = self.pulid.unapply_flux(shared.sd_model) + devices.torch_gc(force=True, reason='pulid') + shared.log.debug(f'PuLID complete: class={shared.sd_model.__class__.__name__} pipe={"restore" if restore else "cache"}') return processed def run_sdxl(self, p: processing.StableDiffusionProcessing, images: list, strength: float, zero: int, sampler: str, ortho: str, restore: bool, offload: bool, version: str): @@ -285,3 +289,13 @@ class Script(scripts_manager.Script): # interim = [Image.fromarray(img) for img in shared.sd_model.debug_img_list] # shared.log.debug(f'PuLID: time={t1-t0:.2f}') return processed + + def run_flux(self, p: processing.StableDiffusionProcessing, images: list, strength: float): + image = Image.fromarray(images[0]) # takes single pil image + p.task_args['id_image'] = image + p.task_args['id_weight'] = strength + shared.log.info(f'PuLID: class={shared.sd_model.__class__.__name__} strength={strength} image={image}') + p.extra_generation_params["PuLID"] = f'Strength={strength}' + + processed: processing.Processed = processing.process_images(p) # runs processing using main loop + return processed From 82504e96d042361beaa56331d5b9552bc4da46e2 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 21 Sep 2025 13:26:18 -0400 Subject: [PATCH 029/230] nunchaku flux.1-ipadapter Signed-off-by: Vladimir Mandic --- modules/ipadapter.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/ipadapter.py b/modules/ipadapter.py index 676045d1f..88a01e2cd 100644 --- a/modules/ipadapter.py +++ b/modules/ipadapter.py @@ -354,6 +354,18 @@ def apply(pipe, p: processing.StableDiffusionProcessing, adapter_names=[], adapt adapter_scales[i] = 0.00 pipe.set_ip_adapter_scale(adapter_scales if len(adapter_scales) > 1 else adapter_scales[0]) ip_str = [f'{os.path.splitext(adapter)[0]}:{scale}:{start}:{end}:{crop}' for adapter, scale, start, end, crop in zip(adapter_names, adapter_scales, adapter_starts, adapter_ends, adapter_crops)] + if hasattr(pipe, 'transformer') and 'Nunchaku' in pipe.transformer.__class__.__name__: + if isinstance(repos, str): + sd_models.clear_caches(full=True) + import accelerate + accelerate.hooks.remove_hook_from_module(pipe.transformer, recurse=True) + pipe.transformer = pipe.transformer.to(devices.device) + from nunchaku.models.ip_adapter.diffusers_adapters import apply_IPA_on_pipe + apply_IPA_on_pipe(pipe, ip_adapter_scale=adapter_scales[0], repo_id=repos) + pipe = sd_models.apply_balanced_offload(pipe) + shared.log.debug(f'IP adapter load: engine=nunchaku scale={adapter_scales[0]} repo="{repos}"') + else: + shared.log.error('IP adapter: Nunchaku only supports single adapter') p.task_args['ip_adapter_image'] = crop_images(adapter_images, adapter_crops) if len(adapter_masks) > 0: p.cross_attention_kwargs = { 'ip_adapter_masks': adapter_masks } From 27846fe97d3a83e679c01779e9bea8b048039f8d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 21 Sep 2025 19:43:55 -0400 Subject: [PATCH 030/230] styles and wildcards use main seed Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + modules/styles.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f890337f..7dea21326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ - **logging** enable `debug`, `docs` and `api-docs` by default - **ipex** simplify internal implementation - refactor to use new libraries + - styles and wildcards now use same seed as main generate for reproducible results - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/styles.py b/modules/styles.py index ec3ca71e9..4ea4509a6 100644 --- a/modules/styles.py +++ b/modules/styles.py @@ -123,7 +123,7 @@ def apply_wildcards_to_prompt(prompt, all_wildcards, seed=-1, silent=False): if replaced and not silent: shared.log.debug(f'Apply wildcards: {replaced} path="{shared.opts.wildcards_dir}" type=style time={t1-t0:.2f}') if (len(replaced_file) > 0 or len(not_found) > 0) and not silent: - shared.log.debug(f'Apply wildcards: found={replaced_file} missing={not_found} path="{shared.opts.wildcards_dir}" type=file time={t2-t2:.2f} ') + shared.log.debug(f'Apply wildcards: found={replaced_file} missing={not_found} path="{shared.opts.wildcards_dir}" type=file seed={seed} time={t2-t2:.2f}') if old_state is not None: random.setstate(old_state) return prompt @@ -168,6 +168,7 @@ def apply_styles_to_extra(p, style: Style): params = [] settings = [] skipped = [] + for k, v in extra.items(): k = k.lower().replace(' ', '_') if k in name_map: # rename some fields @@ -322,16 +323,24 @@ class StyleDatabase: jobid = shared.state.begin('Styles') parsed_positive = [] parsed_negative = [] + random_state = random.getstate() + for i in range(len(prompts)): + if seeds[i]> 0: + random.seed(seeds[i]) prompt = prompts[i] prompt = apply_styles_to_prompt(prompt, [self.find_style(x).prompt for x in styles]) prompt = apply_wildcards_to_prompt(prompt, [self.find_style(x).wildcards for x in styles], seeds[i]) parsed_positive.append(prompt) for i in range(len(negatives)): + if seeds[i]> 0: + random.seed(seeds[i]) prompt = negatives[i] prompt = apply_styles_to_prompt(prompt, [self.find_style(x).negative_prompt for x in styles]) prompt = apply_wildcards_to_prompt(prompt, [self.find_style(x).wildcards for x in styles], seeds[i]) parsed_negative.append(prompt) + + random.setstate(random_state) shared.state.end(jobid) return parsed_positive, parsed_negative From d41bf3d6733ea0901a27df6a34de1d460956f97c Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 21 Sep 2025 20:06:45 -0400 Subject: [PATCH 031/230] add api to trigger civitai metadata update Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/civitai/api_civitai.py | 9 +++++++++ modules/civitai/metadata_civitai.py | 14 +++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dea21326..2f490ed68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ - **ipex** simplify internal implementation - refactor to use new libraries - styles and wildcards now use same seed as main generate for reproducible results + - **api** new endpoint POST `/sdapi/v1/civitai` to trigger civitai models metadata update + accepts optional `page` parameter to search specific networks page - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/civitai/api_civitai.py b/modules/civitai/api_civitai.py index 92add902f..4041f3f36 100644 --- a/modules/civitai/api_civitai.py +++ b/modules/civitai/api_civitai.py @@ -54,6 +54,15 @@ def get_civitai( return JSONResponse(content=[], status_code=200) +def post_civitai(page:str=None): + from modules.civitai import metadata_civitai + result = [] + for r in metadata_civitai.civit_search_metadata(title=page, raw=True): + result = r # get the last yielded result + return result + + def register_api(): from modules.shared import api api.add_api_route("/sdapi/v1/civitai", get_civitai, methods=["GET"], response_model=list) + api.add_api_route("/sdapi/v1/civitai", post_civitai, methods=["POST"], response_model=list) diff --git a/modules/civitai/metadata_civitai.py b/modules/civitai/metadata_civitai.py index 6d4315860..fab22e78f 100644 --- a/modules/civitai/metadata_civitai.py +++ b/modules/civitai/metadata_civitai.py @@ -26,7 +26,7 @@ class CivitModel: self.status = 'Not found' -def civit_update_metadata(): +def civit_update_metadata(raw:bool=False): def create_update_metadata_table(rows: list[CivitModel]): html = """ @@ -102,8 +102,8 @@ def civit_update_metadata(): model.status = 'Update available' break results.append(model) - yield create_update_metadata_table(results) - return create_update_metadata_table(results) + yield results if raw else create_update_metadata_table(results) + yield results if raw else create_update_metadata_table(results) def civit_search_model(name, tag, model_type): @@ -224,7 +224,7 @@ def atomic_civit_search_metadata(item, results): results.append(result) -def civit_search_metadata(title: str = None): +def civit_search_metadata(title: str = None, raw: bool = False): def create_search_metadata_table(rows): html = """
    @@ -258,7 +258,7 @@ def civit_search_metadata(title: str = None): re_skip = [r.strip() for r in opts.extra_networks_scan_skip.split(',') if len(r.strip()) > 0] for page in get_pages(): if type(title) == str: - if page.title != title: + if page.title.lower() != title.lower(): continue if page.name == 'style' or page.name == 'wildcards': continue @@ -278,8 +278,8 @@ def civit_search_metadata(title: str = None): future_items[executor.submit(atomic_civit_search_metadata, fn, results)] = fn for future in concurrent.futures.as_completed(future_items): future.result() - yield create_search_metadata_table(results) + yield results if raw else create_search_metadata_table(results) t1 = time.time() log.debug(f'CivitAI search metadata: scanned={scanned} skipped={skipped} time={t1-t0:.2f}') - yield create_search_metadata_table(results) + yield results if raw else create_search_metadata_table(results) From 2731b91a55df11c30997e65367bd36e3808b944c Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Mon, 22 Sep 2025 09:42:18 +0300 Subject: [PATCH 032/230] move 14B to the left for Vace, SRPO CFG6 image --- ...linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg | Bin 69556 -> 81552 bytes .../Reference/vladmandic--flux.1-dev-SRPO.jpg | Bin 41057 -> 54365 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg b/models/Reference/linoyts--Wan2.2-VACE-Fun-14B-diffusers.jpg index 0bf9f26b981cda1e3a62558b3719f580562a5424..dbde7389be192318559763f022ddd9e4a96449d9 100644 GIT binary patch delta 79859 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 z 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 AiU0rr delta 67769 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 diff --git a/models/Reference/vladmandic--flux.1-dev-SRPO.jpg b/models/Reference/vladmandic--flux.1-dev-SRPO.jpg index 436efbba25c7150baaedfea85f75d86a32045dbe..986483517146ffbda71896d52397a01f2cd71bac 100644 GIT binary patch literal 54365 zcmb5VbzD@@*DpMTq*4wl4GuLRAV_ye4KTn^(jp)X-Car}oifrebV;`&4I<*v>n4?lFfC&H&umPB%%0{Te z?q8iLDrXD$h&nr=%Ex-{)XNIDr1-t~P0bl?XfHEq_jw*8kxB!x<6po^KKs7>9 znV{r2plX~@U(ipkwoKSoZQvX}Z1Fq~pT}=LqUlxV?fJKYa z{{h(qrOkize9-B?`9Gkji~*LYwg=6f|7pSwzym;0v}XSh-~g9@e0KjRtWg#_0R&M9 zcqpqL@a<4KJd}9=uK}-6sTxX_2de&|juTbK1>gp_{eQXtP#6IoaI8>N4*%%hqP(Mo zqGUyV9}wOGq*191isHflO8@jQMp^tHZc`MW$v-|WfB@hP3ZEZ^&x1O@2Jrr)kwWpx zq7WQWwi*4C^PtUt+9Xht?f!8;$YK9ysT<0Y2W-uM8a?>*!TS$9{3xv+EaOJC2>hc_ zLABbUN>-@!p-&#D9yE1ES^58Od%#rwNA2)mzI?#_kH4Hy^iC*rILa4h|B#hXQXhKH z>L2FE|H5QP*~a#--UXHZcO?CvetfXj4kg9-pI&DFFdjVo5RLzd*#A4vLzG&hs2=Qi zkon;8hq4n2>AyYxKl|$;0v-P8^Pj%s{HMDbisOIx=|gY(WZ(4moQ8}Ry|I>pHk#2(W?}IfDc>lXsP3~t<*C+-$`ojzEIMowPMoI_sz$(e;6L@hDshGypnE?EjDpcmRHc zg^g+yA_kzNVW4ATVql|u_UJ*chel#L&POB?s!v~X8QEtJ0pEOz`QCbn1zIANgmHg3 zdPXnhkaa%|c#MI9CdMEJhyhyY_<2&YhokzU?#u;Ti=1em$7?!-@k<*i0iJ_^+zetm z1Zt@T;l1G2?Dy;CcmNKLUVp5J746g`ISD++HSHc*Cem+%XabztJwGI5i!(5+?#y`ZuG10kTr(sDyz)8ymDo%>pWwIE zw{#UaTW9s~p~=uE3%FqnCJy7pioVxUmfI=eX@9}4IKp@Be8=iWAYdDvq~N2sMSUz* z^++1ZcDw=eidFbVPL)onvK*Y`!N+d#7IV{lHkDO?QyjD3Oo!yPInK+kKi5vP;#Y@u zxWE9Y@@4Zv9PFn!ii7Xn@wB2*~9*ETQX}4!{y<`;+V`pXnd^>OCW%0 z{7Wxb5<#H9E%%xphE@#zi6mI}PfR9$W%73j;s}Xf@n9!_&ZvmAcV`_RC=kB|Szx|Y z+j^ z97ktomVK3f2iLI=Mu3(jKViC$7PQ?GQb@p0C2SL>BA0p`p5B7eq|Vg_y_F*v%G}(o zCk`yo+vjOwpO;n*_jl4ZvhD%ObxutNwnAGYiyj

    Cache-DiT

    ", "", gr.HTML), + "cache_dit_enabled": OptionInfo(False, "Cache-DiT enabled"), + "cache_dit_calibrator": OptionInfo("None", "Cache-DiT calibrator", gr.Radio, {"choices": ["None", "TaylorSeer", "FoCa"]}), + "faster_cache__sep": OptionInfo("

    Faster Cache

    ", "", gr.HTML), "faster_cache_enabled": OptionInfo(False, "FasterCache cache enabled"), "fc_spacial_skip_range": OptionInfo(2, "FasterCache spacial skip range", gr.Slider, {"minimum": 1, "maximum": 4, "step": 1}), From 41e297ba2cc293c2d3e7875c4abcbbf65fe643ae Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 23 Sep 2025 16:17:09 +0300 Subject: [PATCH 035/230] SDNQ fix new transformers --- modules/sdnq/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index a82038f68..d8394cde7 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -422,6 +422,12 @@ class SDNQQuantizer(DiffusersQuantizer): """ return config + def update_ep_plan(self, config): + """ + needed for transformers compatibilty, no-op function + """ + return config + def update_unexpected_keys(self, model, unexpected_keys: List[str], prefix: str) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function From 93659dff4d5083dd084fdab92549ee62462f0165 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 23 Sep 2025 09:58:02 -0400 Subject: [PATCH 036/230] add qwen-image-edit-2509 and update requirements Signed-off-by: Vladimir Mandic --- .gitignore | 8 -------- CHANGELOG.md | 4 +++- html/reference.json | 7 +++++++ installer.py | 10 +++++----- modules/cachedit.py | 8 ++++++-- modules/processing_args.py | 10 +++++----- pipelines/model_qwen.py | 15 +++++++++++++-- requirements.txt | 2 +- wiki | 2 +- 9 files changed, 41 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 9a3415c86..9bc6d5a24 100644 --- a/.gitignore +++ b/.gitignore @@ -46,14 +46,6 @@ tunableop_results*.csv !package.json !requirements.txt -# pyinstaller -*.spec -build/ -dist/ - -# dynamically generated -/repositories/deepseek-vl2/ - # all dynamic stuff /extensions/**/* /outputs/**/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c089574..769688808 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,12 @@ # Change Log for SD.Next -## Update for 2025-09-22 +## Update for 2025-09-23 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows + - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) + improved version of Qwen Image Edit with improved image consistency - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) SRPO is trained by Tencent with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) diff --git a/html/reference.json b/html/reference.json index e2615f0e4..530570913 100644 --- a/html/reference.json +++ b/html/reference.json @@ -170,6 +170,13 @@ "skip": true, "extras": "" }, + "Qwen-Image-Edit-2509": { + "path": "Qwen/Qwen-Image-Edit-2509", + "preview": "Qwen--Qwen-Image-Edit.jpg", + "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", + "skip": true, + "extras": "" + }, "Qwen-Image-Lightning": { "path": "vladmandic/Qwen-Lightning", "preview": "vladmandic--Qwen-Lightning.jpg", diff --git a/installer.py b/installer.py index b31ef0e7e..97a502d40 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = 'efb7a299af46d739dec6a57a5d2814165fba24b5' # diffusers commit hash + sha = '1448b035859dd57bbb565239dcdd79a025a85422' # diffusers commit hash pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' @@ -635,8 +635,8 @@ def check_transformers(): target_transformers = '4.52.4' target_tokenizers = '0.21.4' else: - target_transformers = '4.56.1' - target_tokenizers = '0.22.0' + target_transformers = '4.56.2' + target_tokenizers = '0.22.1' if (pkg_transformers is None) or ((pkg_transformers.version != target_transformers) or (pkg_tokenizers is None) or ((pkg_tokenizers.version != target_tokenizers) and (not args.experimental))): if pkg_transformers is None: log.info(f'Transformers install: version={target_transformers}') @@ -1273,8 +1273,8 @@ def install_insightface(): uninstall('albumentations') install('albumentationsx') else: - uninstall('albumentationsx') - install('albumentations==1.4.3', ignore=True, quiet=True) + uninstall('albumentationsx') + install('albumentations==1.4.3', ignore=True, quiet=True) install_pydantic() diff --git a/modules/cachedit.py b/modules/cachedit.py index 1b698ff3b..62575ca1b 100644 --- a/modules/cachedit.py +++ b/modules/cachedit.py @@ -5,7 +5,7 @@ from modules import shared def apply_cache_dit(pipe): if not shared.opts.cache_dit_enabled: return - install('cache_dit') + install('git+https://github.com/vipshop/cache-dit', 'cache_dit') try: import cache_dit except Exception as e: @@ -20,7 +20,9 @@ def apply_cache_dit(pipe): if getattr(pipe, 'has_cache_dit', False): unapply_cache_dir(pipe) - cache_config = cache_dit.BasicCacheConfig() + config_args = {} + + cache_config = cache_dit.BasicCacheConfig(**config_args) if shared.opts.cache_dit_calibrator == "TaylorSeer": calibrator_config = cache_dit.TaylorSeerCalibratorConfig(taylorseer_order=1) elif shared.opts.cache_dit_calibrator == "FoCa": @@ -52,6 +54,8 @@ def unapply_cache_dir(pipe): return try: import cache_dit + stats = cache_dit.summary(pipe) + shared.log.critical(f'Unapply Cache-DiT: {stats}') cache_dit.disable_cache(pipe) pipe.has_cache_dit = False except Exception: diff --git a/modules/processing_args.py b/modules/processing_args.py index 98a295ca1..971adad44 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -103,9 +103,9 @@ def task_specific_kwargs(p, model): } # model specific args - if model_cls == 'QwenImageEditPipeline' and len(getattr(p, 'init_images', [])) == 0: + if 'QwenImageEdit' in model_cls and len(getattr(p, 'init_images', [])) == 0: task_args['image'] = [Image.new('RGB', (p.width, p.height), (0, 0, 0))] # monkey-patch so qwen-image-edit pipeline does not error-out on t2i - if model_cls == 'LatentConsistencyModelPipeline' and hasattr(p, 'init_images') and len(p.init_images) > 0: + if 'LatentConsistencyModelPipeline' in model_cls and hasattr(p, 'init_images') and len(p.init_images) > 0: p.ops.append('lcm') init_latents = [processing_vae.vae_encode(image, model=shared.sd_model, vae_type=p.vae_type).squeeze(dim=0) for image in p.init_images] init_latent = torch.stack(init_latents, dim=0).to(shared.device) @@ -116,7 +116,7 @@ def task_specific_kwargs(p, model): 'width': p.width if hasattr(p, 'width') else None, 'height': p.height if hasattr(p, 'height') else None, } - if model_cls == 'BlipDiffusionPipeline': + if 'BlipDiffusionPipeline' in model_cls: if len(getattr(p, 'init_images', [])) == 0: shared.log.error('BLiP diffusion requires init image') return task_args @@ -126,9 +126,9 @@ def task_specific_kwargs(p, model): 'target_subject_category': getattr(p, 'prompt', '').split()[-1], 'output_type': 'pil', } - if (model.__class__.__name__ == 'WanImageToVideoPipeline') and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): + if ('WanImageToVideoPipeline' in model_cls) and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): task_args['image'] = p.init_images[0] - if (model.__class__.__name__ == 'WanVACEPipeline') and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): + if ('WanVACEPipeline' in model_cls) and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): task_args['reference_images'] = p.init_images if debug_enabled: diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index a89c272a1..cf18e2143 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -12,7 +12,12 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model') shared.log.debug(f'Load model: type=Qwen model="{checkpoint_info.name}" repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}') - if 'Edit' in repo_id: + if '2509' in repo_id : + cls_name = diffusers.QwenImageEditPlusPipeline + diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPlusPipeline + diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPlusPipeline + diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPlusPipeline + elif 'Edit' in repo_id: cls_name = diffusers.QwenImageEditPipeline diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPipeline diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPipeline @@ -36,7 +41,13 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): transformer_subfolder = "transformer" if transformer is None: - transformer = generic.load_transformer(repo_transformer, subfolder=transformer_subfolder, cls_name=diffusers.QwenImageTransformer2DModel, load_config=diffusers_load_config, modules_dtype_dict={"minimum_6bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "transformer_blocks.0.img_mod.1.weight"]}) + transformer = generic.load_transformer( + repo_transformer, + subfolder=transformer_subfolder, + cls_name=diffusers.QwenImageTransformer2DModel, + load_config=diffusers_load_config, + modules_dtype_dict={"minimum_6bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "transformer_blocks.0.img_mod.1.weight"]}, + ) repo_te = 'Qwen/Qwen-Image' text_encoder = generic.load_text_encoder(repo_te, cls_name=transformers.Qwen2_5_VLForConditionalGeneration, load_config=diffusers_load_config) diff --git a/requirements.txt b/requirements.txt index 25fb3c837..cec622cb1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,7 +44,7 @@ tqdm==4.67.1 accelerate==1.10.1 opencv-contrib-python-headless==4.11.0.86 einops==0.8.1 -huggingface_hub==0.34.4 +huggingface_hub==0.35.0 numexpr==2.11.0 numpy==2.1.2 pandas==2.3.1 diff --git a/wiki b/wiki index 76be4e54b..0172d5d26 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 76be4e54b2c40bac1502cf97caa4a04bec0a033f +Subproject commit 0172d5d268497e52300423837be3c53c3fc2ec83 From a502cc2ae1020128f50664bf76cfc026b3f4c8a1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 23 Sep 2025 10:13:30 -0400 Subject: [PATCH 037/230] cache-dit support Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 7 +++++-- modules/cachedit.py | 26 ++++++++++++-------------- modules/shared.py | 4 ++++ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 769688808..21b69aa3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models *note*: sdxl support for nunchaku is not in released version of `nunchaku==1.0.0`, so you need to build [nunchaku](https://nunchaku.tech/docs/nunchaku/installation/installation.html) from source +- **Features** + - [Cache-DiT](https://github.com/vipshop/cache-dit) + cache-dit is a unified, flexible and training-free cache acceleration framework + compatible with many dit-based models such as FLUX.1, Qwen, HunyuanImage, Wan2.2, Chroma, etc. + enable in *settings -> pipeline modifers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled - **Offloading** @@ -37,8 +42,6 @@ accepts optional `page` parameter to search specific networks page - **reference models** additional example images, thanks @liutyi - **video** support for configurable multi-stage models such as WAN-2.2-14B - - [cache-dit](https://github.com/vipshop/cache-dit) - *experimental support*, enable in *settings -> pipeline modifers -> cache-dit* - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/cachedit.py b/modules/cachedit.py index 62575ca1b..f31dcc225 100644 --- a/modules/cachedit.py +++ b/modules/cachedit.py @@ -1,3 +1,4 @@ +import os from installer import install from modules import shared @@ -6,6 +7,7 @@ def apply_cache_dit(pipe): if not shared.opts.cache_dit_enabled: return install('git+https://github.com/vipshop/cache-dit', 'cache_dit') + os.environ.setdefault("CACHE_DIT_LOG_LEVEL", "error") try: import cache_dit except Exception as e: @@ -21,7 +23,14 @@ def apply_cache_dit(pipe): unapply_cache_dir(pipe) config_args = {} - + if shared.opts.cache_dit_fcompute >= 0: + config_args['Fn_compute_blocks'] = int(shared.opts.cache_dit_fcompute) + if shared.opts.cache_dit_bcompute >= 0: + config_args['Bn_compute_blocks'] = int(shared.opts.cache_dit_bcompute) + if shared.opts.cache_dit_threshold >= 0: + config_args['residual_diff_threshold'] = float(shared.opts.cache_dit_threshold) + if shared.opts.cache_dit_warmup >= 0: + config_args['max_warmup_steps'] = int(shared.opts.cache_dit_warmup) cache_config = cache_dit.BasicCacheConfig(**config_args) if shared.opts.cache_dit_calibrator == "TaylorSeer": calibrator_config = cache_dit.TaylorSeerCalibratorConfig(taylorseer_order=1) @@ -29,17 +38,6 @@ def apply_cache_dit(pipe): calibrator_config = cache_dit.FoCaCalibratorConfig() else: calibrator_config = None - """ - Fn_compute_blocks=shared.opts.cache_dit_Fn_compute_blocks, # 8 - Bn_compute_blocks=shared.opts.cache_dit_Bn_compute_blocks, # 0 - residual_diff_threshold=shared.opts.cache_dit_residual_diff_threshold, # 0.08 - max_warmup_steps=shared.opts.cache_dit_max_warmup_steps, # 8 - max_cached_steps=shared.opts.cache_dit_max_cached_steps, # -1 - max_continuous_cached_steps=shared.opts.cache_dit_max_continuous_cached_steps, # -1 - enable_separate_cfg=shared.opts.cache_dit_enable_separate_cfg, # False - cfg_compute_first=shared.opts.cache_dit_cfg_compute_first, # False - ) - """ shared.log.info(f'Apply Cache-DiT: config="{cache_config.strify()}" calibrator="{calibrator_config.strify() if calibrator_config else "None"}"') cache_dit.enable_cache( pipe, @@ -54,8 +52,8 @@ def unapply_cache_dir(pipe): return try: import cache_dit - stats = cache_dit.summary(pipe) - shared.log.critical(f'Unapply Cache-DiT: {stats}') + # stats = cache_dit.summary(pipe) + # shared.log.critical(f'Unapply Cache-DiT: {stats}') cache_dit.disable_cache(pipe) pipe.has_cache_dit = False except Exception: diff --git a/modules/shared.py b/modules/shared.py index 0cc33fbc3..a16d80571 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -359,6 +359,10 @@ options_templates.update(options_section(('advanced', "Pipeline Modifiers"), { "cache_dit_sep": OptionInfo("

    Cache-DiT

    ", "", gr.HTML), "cache_dit_enabled": OptionInfo(False, "Cache-DiT enabled"), "cache_dit_calibrator": OptionInfo("None", "Cache-DiT calibrator", gr.Radio, {"choices": ["None", "TaylorSeer", "FoCa"]}), + "cache_dit_fcompute": OptionInfo(-1, "Cache-DiT F-compute blocks", gr.Slider, {"minimum": -1, "maximum": 32, "step": 1}), + "cache_dit_bcompute": OptionInfo(-1, "Cache-DiT B-compute blocks", gr.Slider, {"minimum": -1, "maximum": 32, "step": 1}), + "cache_dit_threshold": OptionInfo(-1, "Cache-DiT residual diff threshold", gr.Slider, {"minimum": -1.0, "maximum": 1.0, "step": 0.01}), + "cache_dit_warmup": OptionInfo(-1, "Cache-DiT warmup steps", gr.Slider, {"minimum": -1, "maximum": 50, "step": 1}), "faster_cache__sep": OptionInfo("

    Faster Cache

    ", "", gr.HTML), "faster_cache_enabled": OptionInfo(False, "FasterCache cache enabled"), From 81037a6ff956ea35b4dcef76511112549d67a165 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 23 Sep 2025 10:19:19 -0400 Subject: [PATCH 038/230] update changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21b69aa3f..a4de5cd96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,9 @@ - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) - improved version of Qwen Image Edit with improved image consistency + updated version of Qwen Image Edit with improved image consistency - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) - SRPO is trained by Tencent with specific technique: Directly Aligning the Full Diffusion Trajectory with Fine-Grained Human Preference + SRPO is trained by Tencent with specific technique: directly aligning the full diffusion trajectory with fine-grained human preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes @@ -21,6 +21,10 @@ enable in *settings -> pipeline modifers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled +- **Extensions** + - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years + it also does not work with control and video tabs which are the core of sdnext nowadays + so it has been removed from built-in extensions: manual installation is still possible - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate @@ -28,10 +32,6 @@ enable in settings -> model offloading - new feature to specify which models types not to offload in *settings -> model offloading -> model types not to offload* -- **Extensions** - - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years - it also does not work with control and video tabs which are the core of sdnext nowadays - so it has been removed from built-in extensions: manual installation is still possible - **Other** - server will note when restart is recommended due to package updates - **logging** enable `debug`, `docs` and `api-docs` by default From d71d540a62823f086d83e358dc5233b482919d08 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 23 Sep 2025 15:25:13 -0400 Subject: [PATCH 039/230] allow lora specifier to select model component. see changelog/wiki for docs on how to. Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 ++- modules/cachedit.py | 16 +++-- modules/lora/extra_networks_lora.py | 37 ++++++++---- modules/lora/lora_diffusers.py | 92 +++++++++++++++++++++++++++++ modules/lora/lora_load.py | 61 ++++--------------- pipelines/model_wanai.py | 9 ++- wiki | 2 +- 7 files changed, 155 insertions(+), 71 deletions(-) create mode 100644 modules/lora/lora_diffusers.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a4de5cd96..6104c9043 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -130,6 +130,13 @@ And check out new **history** tab in the right panel, it now shows visualization *experimental*: requires new pydantic package which *may* break other things, to enable start sdnext with `--new` flag *note*: this is model quantization only, no support for tensorRT inference yet - **Other** + - **LoRA** allow specifying module to apply lora on + *example*: `` would apply lora *only* on unet regardless of lora content + this is particularly useful when you have multiple loras and you want to apply them on different parts of the model + *example*: `` and `` + *note*: `low` is shorthand for `module=transformer_2` and `high` is shortcut for `module=transformer` + - **Detailer** allow manually setting processing resolution + *note*: this does not impact the actual image resolution, only the resolution at which detailer internally operates - refactor reuse-seed and add functionality to all tabs - refactor modernui js codebase - move zluda flash attenion to *Triton Flash attention* option @@ -144,8 +151,6 @@ And check out new **history** tab in the right panel, it now shows visualization - add deprecation warning for `python==3.9` - allow setting denoise strength to 0 in control/img2img this allows to run workflows which only refine or detail existing image without changing it - - **Detailer** allow manually setting processing resolution - *note*: this does not impact the actual image resolution, only the resolution at which detailer internally operates - **Fixes** - normalize path hanlding when deleting images - unified compile upscalers diff --git a/modules/cachedit.py b/modules/cachedit.py index f31dcc225..057b23804 100644 --- a/modules/cachedit.py +++ b/modules/cachedit.py @@ -39,12 +39,16 @@ def apply_cache_dit(pipe): else: calibrator_config = None shared.log.info(f'Apply Cache-DiT: config="{cache_config.strify()}" calibrator="{calibrator_config.strify() if calibrator_config else "None"}"') - cache_dit.enable_cache( - pipe, - cache_config=cache_config, - calibrator_config=calibrator_config, - ) - shared.sd_model.has_cache_dit = True + try: + cache_dit.enable_cache( + pipe, + cache_config=cache_config, + calibrator_config=calibrator_config, + ) + shared.sd_model.has_cache_dit = True + except Exception as e: + shared.log.error(f'Cache-DiT: {e}') + return def unapply_cache_dir(pipe): diff --git a/modules/lora/extra_networks_lora.py b/modules/lora/extra_networks_lora.py index d18444ea0..6370ef7df 100644 --- a/modules/lora/extra_networks_lora.py +++ b/modules/lora/extra_networks_lora.py @@ -2,7 +2,7 @@ from typing import List import os import re import numpy as np -from modules.lora import networks, lora_overrides, lora_load +from modules.lora import networks, lora_overrides, lora_load, lora_diffusers from modules.lora import lora_common as l from modules import extra_networks, shared, sd_models @@ -88,16 +88,21 @@ def parse(p, params_list, step=0): te_multipliers = [] unet_multipliers = [] dyn_dims = [] + lora_modules = [] for params in params_list: - assert params.items names.append(params.positional[0]) - te_multiplier = params.named.get("te", params.positional[1] if len(params.positional) > 1 else shared.opts.extra_networks_default_multiplier) + + default_multiplier = params.positional[1] if len(params.positional) > 1 else shared.opts.extra_networks_default_multiplier + if isinstance(default_multiplier, str) and "@" not in default_multiplier: + default_multiplier = shared.opts.extra_networks_default_multiplier + + te_multiplier = params.named.get("te", default_multiplier) if isinstance(te_multiplier, str) and "@" in te_multiplier: te_multiplier = get_stepwise(te_multiplier, step, p.steps) else: te_multiplier = float(te_multiplier) - unet_multiplier = [params.positional[2] if len(params.positional) > 2 else te_multiplier] * 3 - unet_multiplier = [params.named.get("unet", unet_multiplier[0])] * 3 + + unet_multiplier = 3 * [params.named.get("unet", te_multiplier)] # fill all 3 with same value unet_multiplier[0] = params.named.get("in", unet_multiplier[0]) unet_multiplier[1] = params.named.get("mid", unet_multiplier[1]) unet_multiplier[2] = params.named.get("out", unet_multiplier[2]) @@ -106,12 +111,22 @@ def parse(p, params_list, step=0): unet_multiplier[i] = get_stepwise(unet_multiplier[i], step, p.steps) else: unet_multiplier[i] = float(unet_multiplier[i]) - dyn_dim = int(params.positional[3]) if len(params.positional) > 3 else None - dyn_dim = int(params.named["dyn"]) if "dyn" in params.named else dyn_dim + + dyn_dim = int(params.named["dyn"]) if "dyn" in params.named else None te_multipliers.append(te_multiplier) unet_multipliers.append(unet_multiplier) dyn_dims.append(dyn_dim) - return names, te_multipliers, unet_multipliers, dyn_dims + + lora_module = [] + if 'high' in params.positional or 'HIGH 14B' in params.positional[0]: + lora_module.append('transformer') + if 'low' in params.positional or 'LOW 14B' in params.positional[0]: + lora_module.append('transformer_2') + if params.named.get('module', None) is not None: + lora_module.append(params.named['module'].lower()) + lora_modules.append(lora_module) + + return names, te_multipliers, unet_multipliers, dyn_dims, lora_modules def unload_diffusers(): @@ -168,7 +183,7 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): if len(params_list) > 0 and not self.active: # activate patches once self.active = True self.model = shared.opts.sd_model_checkpoint - names, te_multipliers, unet_multipliers, dyn_dims = parse(p, params_list, step) + names, te_multipliers, unet_multipliers, dyn_dims, lora_modules = parse(p, params_list, step) requested = self.signature(names, te_multipliers, unet_multipliers) load_method = lora_overrides.get_method() @@ -181,7 +196,7 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): has_changed = False # diffusers handles its own loading if len(exclude) == 0: jobid = shared.state.begin('LoRA') - lora_load.network_load(names, te_multipliers, unet_multipliers, dyn_dims) # load only on first call + lora_load.network_load(names, te_multipliers, unet_multipliers, dyn_dims, lora_modules) # load only on first call sd_models.set_diffuser_offload(shared.sd_model, op="model") shared.state.end(jobid) elif load_method == 'nunchaku': @@ -208,7 +223,7 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): shared.log.info(f'Network load: type=LoRA apply={[n.name for n in l.loaded_networks]} method={load_method} mode={"fuse" if shared.opts.lora_fuse_diffusers else "backup"} te={te_multipliers} unet={unet_multipliers} time={l.timer.summary}') def deactivate(self, p): - if len(lora_load.diffuser_loaded) > 0: + if len(lora_diffusers.diffuser_loaded) > 0: if not (shared.compiled_model_state is not None and shared.compiled_model_state.is_compiled is True): unload_diffusers() if self.active and l.debug: diff --git a/modules/lora/lora_diffusers.py b/modules/lora/lora_diffusers.py new file mode 100644 index 000000000..29402febe --- /dev/null +++ b/modules/lora/lora_diffusers.py @@ -0,0 +1,92 @@ +from typing import Union +import os +import time +import diffusers +from modules import shared, errors +from modules.lora import network +from modules.lora import lora_common as l + + +diffuser_loaded = [] +diffuser_scales = [] + + +def load_per_module(sd_model: diffusers.DiffusionPipeline, filename: str, adapter_name: str, lora_modules: list[str]): + shared.log.debug(f'LoRA load: modules={lora_modules}') + try: + state_dict = sd_model.lora_state_dict(filename) + if isinstance(state_dict, tuple) and len(state_dict) == 2: + state_dict, network_alphas = state_dict + else: + network_alphas = {} + except Exception as e: + shared.log.error(f'LoRA load: {e}') + if l.debug: + errors.display(e, "LoRA") + return None + for lora_module in lora_modules: + if lora_module == 'transformer': + if hasattr(sd_model, 'transformer') and sd_model.transformer is not None: + sd_model.load_lora_into_transformer(state_dict, transformer=sd_model.transformer, adapter_name=adapter_name) + else: + shared.log.warning(f'LoRA load: requested={lora_module} missing') + elif lora_module == 'transformer_2': + if hasattr(sd_model, 'transformer_2') and sd_model.transformer_2 is not None: + sd_model.load_lora_into_transformer(state_dict, transformer=sd_model.transformer_2, adapter_name=adapter_name) + else: + shared.log.warning(f'LoRA load: requested={lora_module} missing') + elif lora_module == 'unet': + if hasattr(sd_model, 'unet') and sd_model.unet is not None: + sd_model.load_lora_into_unet(state_dict, network_alphas, unet=sd_model.unet, adapter_name=adapter_name) + else: + shared.log.warning(f'LoRA load: requested={lora_module} missing') + elif lora_module == 'text_encoder' or lora_module == 'te': + if hasattr(sd_model, 'text_encoder') and sd_model.text_encoder is not None: + sd_model.load_lora_into_text_encoder(state_dict, network_alphas, text_encoder=sd_model.text_encoder, adapter_name=adapter_name) + else: + shared.log.warning(f'LoRA load: requested={lora_module} missing') + else: + shared.log.warning(f'LoRA load: requested={lora_module} unknown') + return adapter_name + + +def load_diffusers(name: str, network_on_disk: network.NetworkOnDisk, lora_scale:float=shared.opts.extra_networks_default_multiplier, lora_module=None) -> Union[network.Network, None]: + t0 = time.time() + name = name.replace(".", "_") + sd_model: diffusers.DiffusionPipeline = getattr(shared.sd_model, "pipe", shared.sd_model) + shared.log.debug(f'Network load: type=LoRA name="{name}" file="{network_on_disk.filename}" detected={network_on_disk.sd_version} method=diffusers scale={lora_scale} fuse={shared.opts.lora_fuse_diffusers}') + if not hasattr(sd_model, 'load_lora_weights'): + shared.log.error(f'Network load: type=LoRA class={sd_model.__class__} does not implement load lora') + return None + try: + if lora_module is not None and isinstance(lora_module, list) and len(lora_module) > 0: + name = load_per_module(sd_model, network_on_disk.filename, adapter_name=name, lora_modules=lora_module) + else: + sd_model.load_lora_weights(network_on_disk.filename, adapter_name=name) + except Exception as e: + if 'already in use' in str(e): + pass + else: + if 'following keys have not been correctly renamed' in str(e): + shared.log.error(f'Network load: type=LoRA name="{name}" diffusers unsupported format') + elif 'object has no attribute' in str(e): + shared.log.error(f'Network load: type=LoRA name="{name}" diffusers empty module') + else: + shared.log.error(f'Network load: type=LoRA name="{name}" {e}') + if l.debug: + errors.display(e, "LoRA") + return None + if name is None: + return None + if name not in diffuser_loaded: + list_adapters = sd_model.get_list_adapters() + list_adapters = [adapter for adapters in list_adapters.values() for adapter in adapters] + if name not in list_adapters: + shared.log.error(f'Network load: type=LoRA name="{name}" adapters={list_adapters} not loaded') + else: + diffuser_loaded.append(name) + diffuser_scales.append(lora_scale) + net = network.Network(name, network_on_disk) + net.mtime = os.path.getmtime(network_on_disk.filename) + l.timer.activate += time.time() - t0 + return net diff --git a/modules/lora/lora_load.py b/modules/lora/lora_load.py index 0b74c6c6d..f629c2772 100644 --- a/modules/lora/lora_load.py +++ b/modules/lora/lora_load.py @@ -3,12 +3,10 @@ import os import time import concurrent from modules import shared, errors, sd_models, sd_models_compile, files_cache -from modules.lora import network, lora_overrides, lora_convert +from modules.lora import network, lora_overrides, lora_convert, lora_diffusers from modules.lora import lora_common as l -diffuser_loaded = [] -diffuser_scales = [] lora_cache = {} available_networks = {} available_network_aliases = {} @@ -17,41 +15,6 @@ available_network_hash_lookup = {} dump_lora_keys = os.environ.get('SD_LORA_DUMP', None) is not None -def load_diffusers(name, network_on_disk, lora_scale=shared.opts.extra_networks_default_multiplier) -> Union[network.Network, None]: - t0 = time.time() - name = name.replace(".", "_") - sd_model = getattr(shared.sd_model, "pipe", shared.sd_model) - shared.log.debug(f'Network load: type=LoRA name="{name}" file="{network_on_disk.filename}" detected={network_on_disk.sd_version} method=diffusers scale={lora_scale} fuse={shared.opts.lora_fuse_diffusers}') - if not hasattr(sd_model, 'load_lora_weights'): - shared.log.error(f'Network load: type=LoRA class={sd_model.__class__} does not implement load lora') - return None - try: - sd_model.load_lora_weights(network_on_disk.filename, adapter_name=name) - except Exception as e: - if 'already in use' in str(e): - pass - else: - if 'The following keys have not been correctly renamed' in str(e): - shared.log.error(f'Network load: type=LoRA name="{name}" diffusers unsupported format') - else: - shared.log.error(f'Network load: type=LoRA name="{name}" {e}') - if l.debug: - errors.display(e, "LoRA") - return None - if name not in diffuser_loaded: - list_adapters = sd_model.get_list_adapters() - list_adapters = [adapter for adapters in list_adapters.values() for adapter in adapters] - if name not in list_adapters: - shared.log.error(f'Network load: type=LoRA name="{name}" adapters={list_adapters} not loaded') - else: - diffuser_loaded.append(name) - diffuser_scales.append(lora_scale) - net = network.Network(name, network_on_disk) - net.mtime = os.path.getmtime(network_on_disk.filename) - l.timer.activate += time.time() - t0 - return net - - def lora_dump(lora, dct): import tempfile sd_model = getattr(shared.sd_model, "pipe", shared.sd_model) @@ -73,7 +36,7 @@ def lora_dump(lora, dct): f.write(line + "\n") -def load_safetensors(name, network_on_disk) -> Union[network.Network, None]: +def load_safetensors(name, network_on_disk: network.NetworkOnDisk) -> Union[network.Network, None]: if not shared.sd_loaded: return None @@ -261,15 +224,15 @@ def gather_networks(names): return networks_on_disk -def network_load(names, te_multipliers=None, unet_multipliers=None, dyn_dims=None): +def network_load(names, te_multipliers=None, unet_multipliers=None, dyn_dims=None, lora_modules=None): networks_on_disk = gather_networks(names) failed_to_load_networks = [] recompile_model, skip_lora_load = maybe_recompile_model(names, te_multipliers) sd_model = getattr(shared.sd_model, "pipe", shared.sd_model) l.loaded_networks.clear() - diffuser_loaded.clear() - diffuser_scales.clear() + lora_diffusers.diffuser_loaded.clear() + lora_diffusers.diffuser_scales.clear() t0 = time.time() for i, (network_on_disk, name) in enumerate(zip(networks_on_disk, names)): @@ -279,11 +242,13 @@ def network_load(names, te_multipliers=None, unet_multipliers=None, dyn_dims=Non if l.debug: shared.log.debug(f'Network load: type=LoRA name="{name}" file="{network_on_disk.filename}" hash="{shorthash}"') try: + lora_scale = te_multipliers[i] if te_multipliers else shared.opts.extra_networks_default_multiplier + lora_module = lora_modules[i] if lora_modules and len(lora_modules) > i else None if recompile_model: - shared.compiled_model_state.lora_model.append(f"{name}:{te_multipliers[i] if te_multipliers else shared.opts.extra_networks_default_multiplier}") + shared.compiled_model_state.lora_model.append(f"{name}:{lora_scale}") lora_method = lora_overrides.get_method(shorthash) if lora_method == 'diffusers': - net = load_diffusers(name, network_on_disk, lora_scale=te_multipliers[i] if te_multipliers else shared.opts.extra_networks_default_multiplier) + net = lora_diffusers.load_diffusers(name, network_on_disk, lora_scale, lora_module) elif lora_method == 'nunchaku': pass # handled directly from extra_networks_lora.load_nunchaku else: @@ -311,21 +276,21 @@ def network_load(names, te_multipliers=None, unet_multipliers=None, dyn_dims=Non name = next(iter(lora_cache)) lora_cache.pop(name, None) - if not skip_lora_load and len(diffuser_loaded) > 0: - shared.log.debug(f'Network load: type=LoRA loaded={diffuser_loaded} available={sd_model.get_list_adapters()} active={sd_model.get_active_adapters()} scales={diffuser_scales}') + if not skip_lora_load and len(lora_diffusers.diffuser_loaded) > 0: + shared.log.debug(f'Network load: type=LoRA loaded={lora_diffusers.diffuser_loaded} available={sd_model.get_list_adapters()} active={sd_model.get_active_adapters()} scales={lora_diffusers.diffuser_scales}') try: t1 = time.time() if l.debug: shared.log.trace(f'Network load: type=LoRA list={sd_model.get_list_adapters()}') shared.log.trace(f'Network load: type=LoRA active={sd_model.get_active_adapters()}') - sd_model.set_adapters(adapter_names=diffuser_loaded, adapter_weights=diffuser_scales) + sd_model.set_adapters(adapter_names=lora_diffusers.diffuser_loaded, adapter_weights=lora_diffusers.diffuser_scales) except Exception as e: shared.log.error(f'Network load: type=LoRA action=set {e}') if l.debug: errors.display(e, 'LoRA') try: if shared.opts.lora_fuse_diffusers and not lora_overrides.disable_fuse(): - sd_model.fuse_lora(adapter_names=diffuser_loaded, lora_scale=1.0, fuse_unet=True, fuse_text_encoder=True) # diffusers with fuse uses fixed scale since later apply does the scaling + sd_model.fuse_lora(adapter_names=lora_diffusers.diffuser_loaded, lora_scale=1.0, fuse_unet=True, fuse_text_encoder=True) # diffusers with fuse uses fixed scale since later apply does the scaling sd_model.unload_lora_weights() l.timer.activate += time.time() - t1 except Exception as e: diff --git a/pipelines/model_wanai.py b/pipelines/model_wanai.py index 718ec63c6..6a9f844d5 100644 --- a/pipelines/model_wanai.py +++ b/pipelines/model_wanai.py @@ -65,16 +65,20 @@ def load_wan(checkpoint_info, diffusers_load_config={}): repo_id = sd_models.path_to_repo(checkpoint_info) sd_models.hf_auth_check(checkpoint_info) + boundary_ratio = None if 'a14b' in repo_id.lower() or 'fun-14b' in repo_id.lower(): if shared.opts.model_wan_stage == 'high noise' or shared.opts.model_wan_stage == 'first': transformer = load_transformer(repo_id, diffusers_load_config, 'transformer') transformer_2 = None + boundary_ratio = 0.0 elif shared.opts.model_wan_stage == 'low noise' or shared.opts.model_wan_stage == 'second': - transformer = load_transformer(repo_id, diffusers_load_config, 'transformer_2') - transformer_2 = None + transformer = None + transformer_2 = load_transformer(repo_id, diffusers_load_config, 'transformer_2') + boundary_ratio = 1.0 elif shared.opts.model_wan_stage == 'combined' or shared.opts.model_wan_stage == 'both': transformer = load_transformer(repo_id, diffusers_load_config, 'transformer') transformer_2 = load_transformer(repo_id, diffusers_load_config, 'transformer_2') + boundary_ratio = shared.opts.model_wan_boundary else: shared.log.error(f'Load model: type=WanAI stage="{shared.opts.model_wan_stage}" unsupported') return None @@ -85,7 +89,6 @@ def load_wan(checkpoint_info, diffusers_load_config={}): text_encoder = load_text_encoder(repo_id, diffusers_load_config) load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model') - boundary_ratio = shared.opts.model_wan_boundary if transformer_2 is not None else None if 'Wan2.2-I2V' in repo_id: pipe_cls = diffusers.WanImageToVideoPipeline diff --git a/wiki b/wiki index 0172d5d26..d86043969 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 0172d5d268497e52300423837be3c53c3fc2ec83 +Subproject commit d86043969fb2ab19c68229a7227e0af8aa4f6c0d From 696a41fd428cc6ff2da688077e102a5dcda08140 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 23 Sep 2025 15:33:52 -0400 Subject: [PATCH 040/230] fix prompts-from-file state check Signed-off-by: Vladimir Mandic --- scripts/prompts_from_file.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py index 460b39ecf..ae2e8038f 100644 --- a/scripts/prompts_from_file.py +++ b/scripts/prompts_from_file.py @@ -147,4 +147,6 @@ class Script(scripts_manager.Script): all_negative += proc.all_negative_prompts images += proc.images infotexts += proc.infotexts + if state.interrupted: + break return get_processed(p, images, p.seed, "", all_prompts=all_prompts, all_seeds=all_seeds, all_negative_prompts=all_negative, infotexts=infotexts) From 0bbc2e4f5e0de40441dc996f7c2e5b68a1277f22 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Wed, 24 Sep 2025 10:30:57 +0300 Subject: [PATCH 041/230] improve AuraFlow 0.3 cover image --- models/Reference/fal--AuraFlow-v0.3.jpg | Bin 89486 -> 104702 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/models/Reference/fal--AuraFlow-v0.3.jpg b/models/Reference/fal--AuraFlow-v0.3.jpg index 1ce8fe728de7bea77d9896f037564d6c082933c6..beff71e97598d444a02499fb35e026e0060bc758 100644 GIT binary patch delta 104090 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ℑd=qI3 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Μ<0$ckOJAMEfK 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 a!N}{G*#0ltGi|l(dNw^E3W}l+D*xF+ZbKyi delta 88754 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 P9xvhJ7$ZfTz%T#Vj@+-r From a9a39cb64bce7c6dd80076a0b8a3f01b5bf19e92 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 09:31:36 -0400 Subject: [PATCH 042/230] ltx model selector Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/ltx/ltx_ui.py | 17 +++++++++++++++++ wiki | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6104c9043..6a9831dfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-23 +## Update for 2025-09-24 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -42,6 +42,7 @@ accepts optional `page` parameter to search specific networks page - **reference models** additional example images, thanks @liutyi - **video** support for configurable multi-stage models such as WAN-2.2-14B + - **video** new LTX model selection - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/ltx/ltx_ui.py b/modules/ltx/ltx_ui.py index 27b033af5..e0626bbe4 100644 --- a/modules/ltx/ltx_ui.py +++ b/modules/ltx/ltx_ui.py @@ -3,17 +3,34 @@ import gradio as gr from modules import shared, ui_sections, ui_symbols, ui_common from modules.ui_components import ToolButton from modules.video_models.video_utils import get_codecs +from modules.video_models.models_def import models from modules.ltx import ltx_process debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None else lambda *args, **kwargs: None +def load_model(model_name): + if model_name is None or model_name == 'None': + shared.log.info('LTX model unload') + from modules import sd_models + sd_models.unload_model_weights() + return + else: + model_instance = [m for m in models['LTX Video'] if m.name == model_name][0] + from modules.video_models import video_load + video_load.load_model(model_instance) + + def create_ui(prompt, negative, styles, overrides): with gr.Row(): with gr.Column(variant='compact', elem_id="ltx_settings", elem_classes=['settings-column'], scale=1): with gr.Row(): generate = gr.Button('Generate', elem_id="ltx_generate_btn", variant='primary', visible=False) + with gr.Row(): + ltx_models = [m.name for m in models['LTX Video']] + model = gr.Dropdown(label='LTX model', choices=ltx_models, value=ltx_models[0]) + model.change(fn=load_model, inputs=[model], outputs=[], show_progress=True) with gr.Accordion(open=True, label="LTX size", elem_id='ltx_generate_accordion'): with gr.Row(): width, height = ui_sections.create_resolution_inputs('ltx', default_width=832, default_height=480) diff --git a/wiki b/wiki index d86043969..3df7dbfc9 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit d86043969fb2ab19c68229a7227e0af8aa4f6c0d +Subproject commit 3df7dbfc9c3e2f39c825f8d76541e13d3c3f097d From 35c319578d46b595c57c7eaef3f2d8e35e6f96d7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 09:38:35 -0400 Subject: [PATCH 043/230] auto uninstall pynvml Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + installer.py | 1 + modules/processing_diffusers.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a9831dfb..7bc2a5401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ - **reference models** additional example images, thanks @liutyi - **video** support for configurable multi-stage models such as WAN-2.2-14B - **video** new LTX model selection + - replace `pynvml` with `nvidia-ml-py` for gpu monitoring - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/installer.py b/installer.py index 97a502d40..f5e3bad73 100644 --- a/installer.py +++ b/installer.py @@ -877,6 +877,7 @@ def install_torch_addons(): install('pillow-jxl-plugin==1.3.4', 'pillow-jxl-plugin') if not args.experimental: uninstall('wandb', quiet=True) + uninstall('pynvml', quiet=True) ts('addons', t_start) diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 1d88ab2a0..4de4e0a47 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -80,13 +80,13 @@ def process_pre(p: processing.StableDiffusionProcessing): pag.apply(p) cfgzero.apply(p) linfusion.apply(shared.sd_model) + cachedit.apply_cache_dit(shared.sd_model) # apply-only sd_hijack_freeu.apply_freeu(p) transformer_cache.set_cache() para_attention.apply_first_block_cache() teacache.apply_teacache(p) - cachedit.apply_cache_dit(shared.sd_model) except Exception as e: shared.log.error(f'Processing apply: {e}') errors.display(e, 'apply') From 91dab5703aceb135ef0e239ad19d9fa62a672c8b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 11:40:20 -0400 Subject: [PATCH 044/230] modular pipeline prototype Signed-off-by: Vladimir Mandic --- modules/modular.py | 55 +++++++++++++++++++++++++++++++++ modules/processing_args.py | 45 ++++++++++++++++++++++++--- modules/processing_diffusers.py | 7 +++++ modules/processing_helpers.py | 22 +++++++++++-- modules/sd_models.py | 6 ++++ 5 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 modules/modular.py diff --git a/modules/modular.py b/modules/modular.py new file mode 100644 index 000000000..bdcd1c470 --- /dev/null +++ b/modules/modular.py @@ -0,0 +1,55 @@ +import time +import diffusers +from modules import shared + + +modular_map= { + 'StableDiffusionXLPipeline': 'StableDiffusionXLAutoBlocks', + 'StableDiffusionXLImg2ImgPipeline': 'StableDiffusionXLAutoBlocks', + 'FluxPipeline': 'FluxAutoBlocks', + 'WanPipeline': 'WanAutoBlocks', + 'QwenImagePipeline': 'QwenImageAutoBlocks', + 'QwenImageEditPipeline': 'QwenImageEditAutoBlocks', +} + + +def is_compatible(diffusion_pipeline: diffusers.DiffusionPipeline) -> bool: + return diffusion_pipeline.__class__.__name__ in modular_map + + +def convert_to_modular(diffusion_pipeline: diffusers.DiffusionPipeline) -> diffusers.ModularPipeline: + modular_pipe = None + try: + t0 = time.time() + modular_cls = modular_map.get(diffusion_pipeline.__class__.__name__, None) + if modular_cls is None: + raise ValueError(f'unknown: cls={diffusion_pipeline.__class__.__name__}') + modular_cls = getattr(diffusers, modular_cls, None) + if modular_cls is None: + raise ValueError(f'invalid: cls={diffusion_pipeline.__class__.__name__}') + modular_blocks = modular_cls() + modular_pipe = modular_blocks.init_pipeline() + components_dct = {k: v for k, v in diffusion_pipeline.components.items() if v is not None} + modular_pipe.update_components(**components_dct, **diffusion_pipeline.parameters) + modular_pipe.original_pipe = diffusion_pipeline + t1 = time.time() + shared.log.debug(f'Modular: from={diffusion_pipeline.__class__.__name__} to={modular_pipe.__class__.__name__} time={t1 - t0:.2f}') + + """ + for expected_input_param in modular_pipe.blocks.inputs: + name = expected_input_param.name + default = expected_input_param.default + kwargs_type = expected_input_param.kwargs_type + shared.log.trace(f'Modular input: name={name} type={kwargs_type} default={default}') + """ + + except Exception as e: + shared.log.error(f'Modular: {e}') + raise e + return modular_pipe + + +def restore_standard(modular_pipe): + if hasattr(modular_pipe, 'original_pipe'): + shared.log.debug(f'Modular: from={modular_pipe.__class__.__name__} to={modular_pipe.original_pipe.__class__.__name__}') + return modular_pipe.original_pipe diff --git a/modules/processing_args.py b/modules/processing_args.py index 971adad44..7770f210d 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -18,6 +18,26 @@ debug_log = shared.log.trace if debug_enabled else lambda *args, **kwargs: None disable_pbar = os.environ.get('SD_DISABLE_PBAR', None) is not None +def task_modular_kwargs(p, model): + model_cls = model.__class__.__name__ # pylint: disable=unused-variable + task_args = {} + p.ops.append('modular') + + processing_helpers.resize_init_images(p) + task_args['width'] = p.width + task_args['height'] = p.height + if len(getattr(p, 'init_images', [])) > 0: + task_args['image'] = p.init_images + task_args['strength'] = p.denoising_strength + mask_image = p.task_args.get('image_mask', None) or getattr(p, 'image_mask', None) or getattr(p, 'mask', None) + if mask_image is not None: + task_args['mask_image'] = mask_image + + if debug_enabled: + debug_log(f'Process task specific args: {task_args}') + return task_args + + def task_specific_kwargs(p, model): model_cls = model.__class__.__name__ vae_scale_factor = sd_vae.get_vae_scale_factor(model) @@ -136,6 +156,16 @@ def task_specific_kwargs(p, model): return task_args +def get_params(model): + if hasattr(model, 'blocks') and hasattr(model.blocks, 'inputs'): # modular pipeline + possible = [input_param.name for input_param in model.blocks.inputs] + return possible + else: + signature = inspect.signature(type(model).__call__, follow_wrapped=True) + possible = list(signature.parameters) + return possible + + def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:typing.Optional[list]=None, negative_prompts_2:typing.Optional[list]=None, prompt_attention:typing.Optional[str]=None, desc:typing.Optional[str]='', **kwargs): t0 = time.time() shared.sd_model = sd_models.apply_balanced_offload(shared.sd_model) @@ -151,8 +181,8 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t model.set_progress_bar_config(bar_format='Progress {rate_fmt}{postfix} {bar} {percentage:3.0f}% {n_fmt}/{total_fmt} {elapsed} {remaining} ' + '\x1b[38;5;71m' + desc, ncols=80, colour='#327fba', disable=disable_pbar) else: model.set_progress_bar_config(bar_format='Progress {rate_fmt}{postfix} {bar} {percentage:3.0f}% {n_fmt}/{total_fmt} {elapsed} {remaining} ' + '\x1b[38;5;71m' + desc, ncols=80, colour='#327fba') - signature = inspect.signature(type(model).__call__, follow_wrapped=True) - possible = list(signature.parameters) + + possible = get_params(model) if debug_enabled: debug_log(f'Process pipeline possible: {possible}') @@ -357,7 +387,11 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t args[arg] = kwargs[arg] # handle task specific args - task_kwargs = task_specific_kwargs(p, model) + if sd_models.get_diffusers_task(model) == sd_models.DiffusersTaskType.MODULAR: + task_kwargs = task_modular_kwargs(p, model) + else: + task_kwargs = task_specific_kwargs(p, model) + pipe_args = getattr(p, 'task_args', {}) model_args = getattr(model, 'task_args', {}) task_kwargs.update(pipe_args or {}) @@ -407,8 +441,9 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:t # handle implicit controlnet if 'control_image' in possible and 'control_image' not in args and 'image' in args: - debug_log('Process: set control image') - args['control_image'] = args['image'] + if sd_models.get_diffusers_task(model) != sd_models.DiffusersTaskType.MODULAR: + debug_log('Process: set control image') + args['control_image'] = args['image'] sd_hijack_hypertile.hypertile_set(p, hr=len(getattr(p, 'init_images', [])) > 0) diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 4de4e0a47..75f74a11b 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -96,6 +96,13 @@ def process_pre(p: processing.StableDiffusionProcessing): # sd_models.move_model(shared.sd_model.unet, devices.device) # if hasattr(shared.sd_model, 'transformer'): # sd_models.move_model(shared.sd_model.transformer, devices.device) + + from modules import modular + if modular.is_compatible(shared.sd_model): + modular_pipe = modular.convert_to_modular(shared.sd_model) + if modular_pipe is not None: + shared.sd_model = modular_pipe + timer.process.record('pre') diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index 15ee19822..7906261b9 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -9,6 +9,7 @@ import cv2 from PIL import Image from blendmodes.blend import blendLayers, BlendType from modules import shared, devices, images, sd_models, sd_samplers, sd_vae, sd_hijack_hypertile, processing_vae, timer +from modules.api import helpers debug = shared.log.trace if os.environ.get('SD_PROCESS_DEBUG', None) is not None else lambda *args, **kwargs: None @@ -16,6 +17,10 @@ debug_steps = shared.log.trace if os.environ.get('SD_STEPS_DEBUG', None) is not debug_steps('Trace: STEPS') +def is_modular(): + return sd_models.get_diffusers_task(shared.sd_model) == sd_models.DiffusersTaskType.MODULAR + + def is_txt2img(): return sd_models.get_diffusers_task(shared.sd_model) == sd_models.DiffusersTaskType.TEXT_2_IMAGE @@ -278,7 +283,10 @@ def validate_sample(tensor): def resize_init_images(p): if getattr(p, 'image', None) is not None and getattr(p, 'init_images', None) is None: p.init_images = [p.image] + if getattr(p, 'init_images', None) is not None and len(p.init_images) > 0: + if isinstance(p.init_images[0], str): + p.init_images = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_images] vae_scale_factor = sd_vae.get_vae_scale_factor() tgt_width, tgt_height = vae_scale_factor * math.ceil(p.init_images[0].width / vae_scale_factor), vae_scale_factor * math.ceil(p.init_images[0].height / vae_scale_factor) if p.init_images[0].size != (tgt_width, tgt_height): @@ -287,11 +295,17 @@ def resize_init_images(p): p.height = tgt_height p.width = tgt_width sd_hijack_hypertile.hypertile_set(p) - if getattr(p, 'mask', None) is not None and p.mask.size != (tgt_width, tgt_height): + if getattr(p, 'mask', None) is not None and p.mask is not None and p.mask.size != (tgt_width, tgt_height): + if isinstance(p.mask[0], str): + p.mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.mask] p.mask = images.resize_image(1, p.mask, tgt_width, tgt_height, upscaler_name=None) - if getattr(p, 'init_mask', None) is not None and p.init_mask.size != (tgt_width, tgt_height): + if getattr(p, 'init_mask', None) is not None and p.init_mask is not None and p.init_mask.size != (tgt_width, tgt_height): + if isinstance(p.init_mask[0], str): + p.init_mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_mask] p.init_mask = images.resize_image(1, p.init_mask, tgt_width, tgt_height, upscaler_name=None) - if getattr(p, 'mask_for_overlay', None) is not None and p.mask_for_overlay.size != (tgt_width, tgt_height): + if getattr(p, 'mask_for_overlay', None) is not None and p.mask_for_overlay is not None and p.mask_for_overlay.size != (tgt_width, tgt_height): + if isinstance(p.mask_for_overlay, str): + p.mask_for_overlay = helpers.decode_base64_to_image(p.mask_for_overlay, quiet=True) p.mask_for_overlay = images.resize_image(1, p.mask_for_overlay, tgt_width, tgt_height, upscaler_name=None) return tgt_width, tgt_height return p.width, p.height @@ -374,6 +388,8 @@ def calculate_base_steps(p, use_denoise_start, use_refiner_start): cls = shared.sd_model.__class__.__name__ if 'Flex' in cls or 'Kontext' in cls or 'Edit' in cls or 'Wan' in cls: steps = p.steps + elif is_modular(): + steps = p.steps elif not is_txt2img(): if cls in sd_models.i2i_pipes: steps = p.steps diff --git a/modules/sd_models.py b/modules/sd_models.py index 4423c780d..9b9ec7d68 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -743,6 +743,7 @@ class DiffusersTaskType(Enum): IMAGE_2_IMAGE = 2 INPAINTING = 3 INSTRUCT = 4 + MODULAR = 5 def get_diffusers_task(pipe: diffusers.DiffusionPipeline) -> DiffusersTaskType: @@ -753,6 +754,8 @@ def get_diffusers_task(pipe: diffusers.DiffusionPipeline) -> DiffusersTaskType: return DiffusersTaskType.IMAGE_2_IMAGE elif 'Instruct' in cls: return DiffusersTaskType.INSTRUCT + elif 'Modular' in cls: + return DiffusersTaskType.MODULAR elif pipe.__class__ in diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING.values(): return DiffusersTaskType.IMAGE_2_IMAGE elif pipe.__class__ in diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING.values(): @@ -950,6 +953,9 @@ def set_diffuser_pipe(pipe, new_pipe_type): if get_diffusers_task(pipe) == new_pipe_type: return pipe + if get_diffusers_task(pipe) == DiffusersTaskType.MODULAR: + return pipe + # skip specific pipelines cls = pipe.__class__.__name__ if cls in pipe_switch_task_exclude: From 6f409deedfdbe5c9903a1707480e08462c60e3e0 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 12:33:57 -0400 Subject: [PATCH 045/230] ui separate guidance and detail sections Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- modules/control/run.py | 4 ++-- modules/processing_class.py | 16 ++++++++-------- modules/processing_diffusers.py | 4 ++-- modules/ui_control.py | 3 ++- modules/ui_img2img.py | 5 +++-- modules/ui_sections.py | 26 ++++++++++++-------------- modules/ui_txt2img.py | 4 ++-- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 049386fd9..a445b6b09 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 049386fd9d5c2d9b30cc9136be1e1bcda13d81c6 +Subproject commit a445b6b09f3974f95d410f19575200109e1a8b83 diff --git a/modules/control/run.py b/modules/control/run.py index 6d1b885b7..586958a49 100644 --- a/modules/control/run.py +++ b/modules/control/run.py @@ -396,9 +396,9 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg # hires/refine defined outside of main init vae_scale_factor = sd_vae.get_vae_scale_factor() if p.enable_hr and (p.hr_resize_x == 0 or p.hr_resize_y == 0): - p.hr_upscale_to_x, p.hr_upscale_to_y = vae_scale_factor * int(p.width_before * p.hr_scale / vae_scale_factor), vae_scale_factor * int(p.height_before * p.hr_scale / vae_scale_factor) + p.hr_upscale_to_x, p.hr_upscale_to_y = int(vae_scale_factor * int(p.width_before * p.hr_scale / vae_scale_factor)), int(vae_scale_factor * int(p.height_before * p.hr_scale / vae_scale_factor)) elif p.enable_hr and (p.hr_upscale_to_x == 0 or p.hr_upscale_to_y == 0): - p.hr_upscale_to_x, p.hr_upscale_to_y = 8 * int(p.hr_resize_x / vae_scale_factor), vae_scale_factor * int(p.hr_resize_y / vae_scale_factor) + p.hr_upscale_to_x, p.hr_upscale_to_y = 8 * int(p.hr_resize_x / vae_scale_factor), int(vae_scale_factor * int(p.hr_resize_y / vae_scale_factor)) global p_extra_args # pylint: disable=global-statement for k, v in p_extra_args.items(): diff --git a/modules/processing_class.py b/modules/processing_class.py index 7ea9c2eab..d0d634cfa 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -445,14 +445,14 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing): self.hr_upscale_to_y = int(self.height * scale) else: if self.hr_resize_y == 0: - self.hr_upscale_to_x = self.hr_resize_x - self.hr_upscale_to_y = self.hr_resize_x * self.height // self.width + self.hr_upscale_to_x = int(self.hr_resize_x) + self.hr_upscale_to_y = int(self.hr_resize_x * self.height // self.width) elif self.hr_resize_x == 0: - self.hr_upscale_to_x = self.hr_resize_y * self.width // self.height - self.hr_upscale_to_y = self.hr_resize_y + self.hr_upscale_to_x = int(self.hr_resize_y * self.width // self.height) + self.hr_upscale_to_y = int(self.hr_resize_y) elif self.hr_resize_x > 0 and self.hr_resize_y > 0: - self.hr_upscale_to_x = self.hr_resize_x - self.hr_upscale_to_y = self.hr_resize_y + self.hr_upscale_to_x = int(self.hr_resize_x) + self.hr_upscale_to_y = int(self.hr_resize_y) shared.log.debug(f'Init hires: upscaler="{self.hr_upscaler}" sampler="{self.hr_sampler_name}" resize={self.hr_resize_x}x{self.hr_resize_y} upscale={self.hr_upscale_to_x}x{self.hr_upscale_to_y}') @@ -572,9 +572,9 @@ class StableDiffusionProcessingControl(StableDiffusionProcessingImg2Img): self.hr_force = force if use_scale: vae_scale_factor = sd_vae.get_vae_scale_factor() - self.hr_upscale_to_x, self.hr_upscale_to_y = vae_scale_factor * int(self.width * scale / vae_scale_factor), vae_scale_factor * int(self.height * scale / vae_scale_factor) + self.hr_upscale_to_x, self.hr_upscale_to_y = int(vae_scale_factor * int(self.width * scale / vae_scale_factor)), int(vae_scale_factor * int(self.height * scale / vae_scale_factor)) else: - self.hr_upscale_to_x, self.hr_upscale_to_y = self.hr_resize_x, self.hr_resize_y + self.hr_upscale_to_x, self.hr_upscale_to_y = int(self.hr_resize_x), int(self.hr_resize_y) def switch_class(p: StableDiffusionProcessing, new_class: type, dct: dict = None): diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 75f74a11b..6453516c0 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -238,8 +238,8 @@ def process_hires(p: processing.StableDiffusionProcessing, output): p.hr_upscaler = p.resize_name p.hr_resize_mode = p.resize_mode p.hr_resize_context = p.resize_context - p.hr_upscale_to_x = p.width * p.hr_scale if p.hr_resize_x == 0 else p.hr_resize_x - p.hr_upscale_to_y = p.height * p.hr_scale if p.hr_resize_y == 0 else p.hr_resize_y + p.hr_upscale_to_x = int(p.width * p.hr_scale) if p.hr_resize_x == 0 else p.hr_resize_x + p.hr_upscale_to_y = int(p.height * p.hr_scale) if p.hr_resize_y == 0 else p.hr_resize_y # hires runs on original pipeline if hasattr(shared.sd_model, 'restore_pipeline') and (shared.sd_model.restore_pipeline is not None) and (not shared.opts.control_hires): diff --git a/modules/ui_control.py b/modules/ui_control.py index b75842aee..0fe361aa2 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -163,7 +163,8 @@ def create_ui(_blocks: gr.Blocks=None): mask_controls = masking.create_segment_ui() - vae_type, tiling, hidiffusion, cfg_scale, clip_skip, image_cfg_scale, guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_advanced_inputs('control') + cfg_scale, image_cfg_scale, guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('control') + vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('control') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('control') with gr.Accordion(open=False, label="Video", elem_id="control_video", elem_classes=["small-accordion"]): diff --git a/modules/ui_img2img.py b/modules/ui_img2img.py index d08999c8c..7e7db44cb 100644 --- a/modules/ui_img2img.py +++ b/modules/ui_img2img.py @@ -132,9 +132,10 @@ def create_ui(): denoising_strength = gr.Slider(minimum=0.00, maximum=0.99, step=0.01, label='Denoising strength', value=0.30, elem_id="img2img_denoising_strength") refiner_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Denoise start', value=0.0, elem_id="img2img_refiner_start") - vae_type, tiling, hidiffusion, cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_advanced_inputs('img2img') + cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('img2img') + vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('img2img') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('img2img') - enable_hr, hr_sampler_index, hr_denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, hr_refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('txt2img') + enable_hr, hr_sampler_index, hr_denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, hr_refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('img2img') detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution = shared.yolo.ui('img2img') # with gr.Group(elem_id="inpaint_controls", visible=False) as inpaint_controls: diff --git a/modules/ui_sections.py b/modules/ui_sections.py index 07ce95b3c..829c502bd 100644 --- a/modules/ui_sections.py +++ b/modules/ui_sections.py @@ -146,26 +146,24 @@ def create_video_inputs(tab:str, show_always:bool=False): return video_type, video_duration, video_loop, video_pad, video_interpolate -def create_cfg_inputs(tab): - with gr.Row(elem_id=f"{tab}_cfg_row", elem_classes=['flexbox']): - cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_cfg_scale") - cfg_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance end', value=1.0, elem_id=f"{tab}_cfg_end") - return cfg_scale, cfg_end - - -def create_advanced_inputs(tab, base=True): - with gr.Accordion(open=False, label="Advanced", elem_id=f"{tab}_advanced", elem_classes=["small-accordion"]): +def create_guidance_inputs(tab): + with gr.Accordion(open=False, label="Guidance", elem_id=f"{tab}_guidance", elem_classes=["small-accordion"]): with gr.Group(): - if base: - cfg_scale, cfg_end = create_cfg_inputs(tab) - else: - cfg_scale, cfg_end = None, None + with gr.Row(elem_id=f"{tab}_cfg_row", elem_classes=['flexbox']): + cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_cfg_scale") + cfg_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance end', value=1.0, elem_id=f"{tab}_cfg_end") with gr.Row(): image_cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Refine guidance', value=6.0, elem_id=f"{tab}_image_cfg_scale") diffusers_guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Rescale guidance', value=0.0, elem_id=f"{tab}_image_cfg_rescale") with gr.Row(): diffusers_pag_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.05, label='Attention guidance', value=0.0, elem_id=f"{tab}_pag_scale") diffusers_pag_adaptive = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Adaptive scaling', value=0.5, elem_id=f"{tab}_pag_adaptive") + return cfg_scale, image_cfg_scale, diffusers_guidance_rescale, diffusers_pag_scale, diffusers_pag_adaptive, cfg_end + + +def create_advanced_inputs(tab): + with gr.Accordion(open=False, label="Advanced", elem_id=f"{tab}_advanced", elem_classes=["small-accordion"]): + with gr.Group(): with gr.Row(): clip_skip = gr.Slider(label='CLiP skip', value=1, minimum=0, maximum=12, step=0.1, elem_id=f"{tab}_clip_skip", interactive=shared.opts.clip_skip_enabled) with gr.Row(elem_id=f"{tab}_vae_options"): @@ -173,7 +171,7 @@ def create_advanced_inputs(tab, base=True): with gr.Row(elem_id=f"{tab}_advanced_options"): tiling = gr.Checkbox(label='Texture tiling', value=False, elem_id=f"{tab}_tiling") hidiffusion = gr.Checkbox(label='HiDiffusion', value=False, elem_id=f"{tab}_hidiffusion") - return vae_type, tiling, hidiffusion, cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, diffusers_pag_scale, diffusers_pag_adaptive, cfg_end + return vae_type, tiling, hidiffusion, clip_skip def create_correction_inputs(tab): diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index a7efadba1..0fae0c606 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -27,14 +27,14 @@ def create_ui(): width, height = ui_sections.create_resolution_inputs('txt2img') batch_count, batch_size = ui_sections.create_batch_inputs('txt2img', accordion=False) - cfg_scale, cfg_end = ui_sections.create_cfg_inputs('txt2img') steps, sampler_index = ui_sections.create_sampler_and_steps_selection(None, "txt2img") with gr.Group(elem_classes="settings-accordion"): with gr.Accordion(open=False, label="Samplers", elem_classes=["small-accordion"], elem_id="txt2img_sampler_group"): ui_sections.create_sampler_options('txt2img') seed, reuse_seed, subseed, reuse_subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w = ui_sections.create_seed_inputs('txt2img') - vae_type, tiling, hidiffusion, _cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, _cfg_end = ui_sections.create_advanced_inputs('txt2img', base=False) + cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('txt2img') + vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('txt2img') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('txt2img') enable_hr, hr_sampler_index, denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('txt2img') detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution = shared.yolo.ui('txt2img') From c96af0d428b7759bc3a8ea865c86fe4648ed2e89 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 12:55:11 -0400 Subject: [PATCH 046/230] fix lora filter by model type Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 +++ javascript/extraNetworks.js | 5 +++-- modules/ui_extra_networks_checkpoints.py | 1 + modules/ui_extra_networks_lora.py | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc2a5401..7138182b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,9 @@ enable in settings -> model offloading - new feature to specify which models types not to offload in *settings -> model offloading -> model types not to offload* +- **UI** + - separate guidance and detail sections + - networks ability to filter lora by base model version - **Other** - server will note when restart is recommended due to package updates - **logging** enable `debug`, `docs` and `api-docs` by default diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 3508ac572..95b5aca10 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -293,10 +293,11 @@ function extraNetworksSearchButton(event) { } function extraNetworksFilterVersion(event) { - // log('extraNetworksFilterVersion', event); + log('extraNetworksFilterVersion', event); const version = event.target.textContent.trim(); const activeTab = getENActiveTab(); - const cardContainer = gradioApp().querySelector(`#${activeTab}_model_cards`); + const activePage = getENActivePage().toLowerCase(); + const cardContainer = gradioApp().querySelector(`#${activeTab}_${activePage}_cards`); if (!cardContainer) return; if (cardContainer.dataset.activeVersion === version) { cardContainer.dataset.activeVersion = ''; diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index fb77c855b..427de5f34 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -7,6 +7,7 @@ from modules import shared, ui_extra_networks, sd_models, modelstats, paths version_map = { "QwenEdit": "Qwen", + "QwenEditPlus": "Qwen", "Flux.1 D": "Flux", "Flux.1 S": "Flux", "FluxKontext": "Flux", diff --git a/modules/ui_extra_networks_lora.py b/modules/ui_extra_networks_lora.py index d390fe914..6b9705674 100644 --- a/modules/ui_extra_networks_lora.py +++ b/modules/ui_extra_networks_lora.py @@ -85,7 +85,7 @@ class ExtraNetworksPageLora(ui_extra_networks.ExtraNetworksPage): "metadata": json.dumps(l.metadata, indent=4) if l.metadata else None, "mtime": mtime, "size": size, - "version": version.get("baseModel", l.sd_version) if info else l.sd_version, + "version": version.get("baseModel", l.sd_version), "info": info, "description": self.find_description(l.filename, info), "tags": self.get_tags(l, info, version), From 0d2579302ecfdc259c4f7c43130564747efe482e Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 13:03:18 -0400 Subject: [PATCH 047/230] cleanup modular init Signed-off-by: Vladimir Mandic --- modules/modular.py | 12 ++++++++---- modules/shared.py | 2 ++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/modular.py b/modules/modular.py index bdcd1c470..b2b6a8124 100644 --- a/modules/modular.py +++ b/modules/modular.py @@ -14,7 +14,12 @@ modular_map= { def is_compatible(diffusion_pipeline: diffusers.DiffusionPipeline) -> bool: - return diffusion_pipeline.__class__.__name__ in modular_map + if not shared.opts.model_modular_enable: + return False + compatible = diffusion_pipeline.__class__.__name__ in modular_map + if not compatible: + shared.log.debug(f'Modular: source={diffusion_pipeline.__class__.__name__} incompatible pipeline') + return compatible def convert_to_modular(diffusion_pipeline: diffusers.DiffusionPipeline) -> diffusers.ModularPipeline: @@ -33,8 +38,7 @@ def convert_to_modular(diffusion_pipeline: diffusers.DiffusionPipeline) -> diffu modular_pipe.update_components(**components_dct, **diffusion_pipeline.parameters) modular_pipe.original_pipe = diffusion_pipeline t1 = time.time() - shared.log.debug(f'Modular: from={diffusion_pipeline.__class__.__name__} to={modular_pipe.__class__.__name__} time={t1 - t0:.2f}') - + shared.log.debug(f'Modular: source={diffusion_pipeline.__class__.__name__} target={modular_pipe.__class__.__name__} time={t1 - t0:.2f}') """ for expected_input_param in modular_pipe.blocks.inputs: name = expected_input_param.name @@ -51,5 +55,5 @@ def convert_to_modular(diffusion_pipeline: diffusers.DiffusionPipeline) -> diffu def restore_standard(modular_pipe): if hasattr(modular_pipe, 'original_pipe'): - shared.log.debug(f'Modular: from={modular_pipe.__class__.__name__} to={modular_pipe.original_pipe.__class__.__name__}') + shared.log.debug(f'Modular: source={modular_pipe.__class__.__name__} target={modular_pipe.original_pipe.__class__.__name__}') return modular_pipe.original_pipe diff --git a/modules/shared.py b/modules/shared.py index a16d80571..c8a645128 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -155,6 +155,8 @@ options_templates.update(options_section(('sd', "Model Loading"), { })) options_templates.update(options_section(('model_options', "Model Options"), { + "model_modular_sep": OptionInfo("

    Modular Pipelines

    ", "", gr.HTML), + "model_modular_enable": OptionInfo(False, "Enable modular pipelines (experimental)"), "model_sd3_sep": OptionInfo("

    Stable Diffusion 3.x

    ", "", gr.HTML), "model_sd3_disable_te5": OptionInfo(False, "Disable T5 text encoder"), "model_h1_sep": OptionInfo("

    HiDream

    ", "", gr.HTML), From a776c7c61534bb8f240a5dd13d135d2eef284ab3 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 24 Sep 2025 21:32:26 +0300 Subject: [PATCH 048/230] SDNQ fix new transformers --- modules/sdnq/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index d8394cde7..71db2127f 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -440,6 +440,12 @@ class SDNQQuantizer(DiffusersQuantizer): """ return missing_keys + def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: + """ + needed for transformers compatibilty, no-op function + """ + return state_dict + def update_expected_keys(self, model, expected_keys: List[str], loaded_keys: List[str]) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function From faa18321267daaa883f3e9d9f94e941d9fe5ff4b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 18:27:02 -0400 Subject: [PATCH 049/230] nunchaku-qwen-image-edit-2509 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 +- pipelines/qwen/qwen_nunchaku.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7138182b0..05680394d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows - - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) + - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) and [Nunchaku Qwen Image Edit 2509](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit-2509) updated version of Qwen Image Edit with improved image consistency - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) SRPO is trained by Tencent with specific technique: directly aligning the full diffusion trajectory with fine-grained human preference diff --git a/pipelines/qwen/qwen_nunchaku.py b/pipelines/qwen/qwen_nunchaku.py index 2fa723565..7c689c7a3 100644 --- a/pipelines/qwen/qwen_nunchaku.py +++ b/pipelines/qwen/qwen_nunchaku.py @@ -15,6 +15,8 @@ def load_qwen_nunchaku(repo_id): nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image/svdq-{nunchaku_precision}_r128-qwen-image.safetensors" # r32 vs r128 elif repo_id.lower().endswith('qwen-lightning'): nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image/svdq-{nunchaku_precision}_r128-qwen-image-lightningv1.1-8steps.safetensors" # 8-step variant + elif repo_id.lower().endswith('qwen-image-edit-2509'): + nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image-edit-2509/svdq-{nunchaku_precision}_r128-qwen-image-edit-2509.safetensors" # 8-step variant elif repo_id.lower().endswith('qwen-image-edit'): nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image-edit/svdq-{nunchaku_precision}_r128-qwen-image-edit.safetensors" # 8-step variant elif repo_id.lower().endswith('qwen-lightning-edit'): From 7a3001170b8e4fe0239141d05ccb96a76df68f0d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 24 Sep 2025 20:16:07 -0400 Subject: [PATCH 050/230] add daam script Signed-off-by: Vladimir Mandic --- .pylintrc | 1 + .ruff.toml | 1 + CHANGELOG.md | 8 +- modules/modular.py | 1 + modules/processing_args.py | 4 +- scripts/daam/__init__.py | 5 + scripts/daam/evaluate.py | 122 +++++++++++++ scripts/daam/experiment.py | 344 +++++++++++++++++++++++++++++++++++++ scripts/daam/heatmap.py | 185 ++++++++++++++++++++ scripts/daam/hook.py | 127 ++++++++++++++ scripts/daam/trace.py | 323 ++++++++++++++++++++++++++++++++++ scripts/daam/utils.py | 109 ++++++++++++ scripts/daam_ext.py | 57 ++++++ 13 files changed, 1283 insertions(+), 4 deletions(-) create mode 100644 scripts/daam/__init__.py create mode 100644 scripts/daam/evaluate.py create mode 100644 scripts/daam/experiment.py create mode 100644 scripts/daam/heatmap.py create mode 100644 scripts/daam/hook.py create mode 100644 scripts/daam/trace.py create mode 100644 scripts/daam/utils.py create mode 100644 scripts/daam_ext.py diff --git a/.pylintrc b/.pylintrc index 5bd9493dd..7b6cdb7cb 100644 --- a/.pylintrc +++ b/.pylintrc @@ -44,6 +44,7 @@ ignore-paths=/usr/lib/.*$, pipelines/segmoe, scripts/consistory, scripts/ctrlx, + scripts/daam, scripts/demofusion, scripts/freescale, scripts/infiniteyou, diff --git a/.ruff.toml b/.ruff.toml index 74b734878..297515402 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -24,6 +24,7 @@ exclude = [ "pipelines/segmoe", "scripts/lbm", + "scripts/daam", "scripts/xadapter", "scripts/pulid", "scripts/instantir", diff --git a/CHANGELOG.md b/CHANGELOG.md index 05680394d..bcfa7def8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,10 +21,14 @@ enable in *settings -> pipeline modifers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled -- **Extensions** - - **agent-scheduler** was a high-value built-in extension, but it has not been maintained for 1.5 years +- **Extensions** + - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) + was a high-value built-in extension, but it has not been maintained for 1.5 years it also does not work with control and video tabs which are the core of sdnext nowadays so it has been removed from built-in extensions: manual installation is still possible + - [DAAM: Diffusion Attentive Attribution Maps](https://github.com/castorini/daam) + create heatmap visualizations of which parts of the prompt influenced which parts of the image + available in scripts for sdxl text-to-image workflows - **Offloading** - improve offloading for pipelines with multiple stages such as *wan-2.2-14b* - add timers to measure onload/offload times during generate diff --git a/modules/modular.py b/modules/modular.py index b2b6a8124..595b860f7 100644 --- a/modules/modular.py +++ b/modules/modular.py @@ -57,3 +57,4 @@ def restore_standard(modular_pipe): if hasattr(modular_pipe, 'original_pipe'): shared.log.debug(f'Modular: source={modular_pipe.__class__.__name__} target={modular_pipe.original_pipe.__class__.__name__}') return modular_pipe.original_pipe + return modular_pipe diff --git a/modules/processing_args.py b/modules/processing_args.py index 7770f210d..c1f0b9cdb 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -18,8 +18,8 @@ debug_log = shared.log.trace if debug_enabled else lambda *args, **kwargs: None disable_pbar = os.environ.get('SD_DISABLE_PBAR', None) is not None -def task_modular_kwargs(p, model): - model_cls = model.__class__.__name__ # pylint: disable=unused-variable +def task_modular_kwargs(p, model): # pylint: disable=unused-argument + # model_cls = model.__class__.__name__ task_args = {} p.ops.append('modular') diff --git a/scripts/daam/__init__.py b/scripts/daam/__init__.py new file mode 100644 index 000000000..a407cfd4d --- /dev/null +++ b/scripts/daam/__init__.py @@ -0,0 +1,5 @@ +from .experiment import * +from .heatmap import * +from .hook import * +from .utils import * +from .trace import * diff --git a/scripts/daam/evaluate.py b/scripts/daam/evaluate.py new file mode 100644 index 000000000..ec9e1567b --- /dev/null +++ b/scripts/daam/evaluate.py @@ -0,0 +1,122 @@ +from collections import defaultdict +from typing import List, Union + +from scipy.optimize import linear_sum_assignment +import PIL.Image as Image +import numpy as np +import torch +import torch.nn.functional as F + + +__all__ = ['compute_iou', 'MeanEvaluator', 'load_mask', 'compute_ioa'] + + +def compute_iou(a: torch.Tensor, b: torch.Tensor) -> float: + if a.shape[0] != b.shape[0]: + a = F.interpolate(a.unsqueeze(0).unsqueeze(0).float(), size=b.shape, mode='bicubic').squeeze() + a[a < 1] = 0 + a[a >= 1] = 1 + + intersection = (a * b).sum() + union = a.sum() + b.sum() - intersection + + return (intersection / (union + 1e-8)).item() + + +def compute_ioa(a: torch.Tensor, b: torch.Tensor) -> float: + if a.shape[0] != b.shape[0]: + a = F.interpolate(a.unsqueeze(0).unsqueeze(0).float(), size=b.shape, mode='bicubic').squeeze() + a[a < 1] = 0 + a[a >= 1] = 1 + + intersection = (a * b).sum() + area = a.sum() + + return (intersection / (area + 1e-8)).item() + + +def load_mask(path: str) -> torch.Tensor: + mask = np.array(Image.open(path)) + mask = torch.from_numpy(mask).float()[:, :, 3] # use alpha channel + mask = (mask > 0).float() + + return mask + + +class UnsupervisedEvaluator: + def __init__(self, name: str = 'UnsupervisedEvaluator'): + self.name = name + self.ious = defaultdict(list) + self.num_samples = 0 + + def log_iou(self, preds: Union[torch.Tensor, List[torch.Tensor]], truth: torch.Tensor, gt_idx: int = 0, pred_idx: int = 0): + if not isinstance(preds, list): + preds = [preds] + + iou = max(compute_iou(pred, truth) for pred in preds) + self.ious[gt_idx].append((pred_idx, iou)) + + @property + def mean_iou(self) -> float: + n = max(max(self.ious), max([y[0] for x in self.ious.values() for y in x])) + 1 + iou_matrix = np.zeros((n, n)) + count_matrix = np.zeros((n, n)) + + for gt_idx, ious in self.ious.items(): + for pred_idx, iou in ious: + iou_matrix[gt_idx, pred_idx] += iou + count_matrix[gt_idx, pred_idx] += 1 + + row_ind, col_ind = linear_sum_assignment(iou_matrix, maximize=True) + return iou_matrix[row_ind, col_ind].sum() / count_matrix[row_ind, col_ind].sum() + + def increment(self): + self.num_samples += 1 + + def __len__(self) -> int: + return self.num_samples + + def __str__(self): + return f'{self.name}<{self.mean_iou:.4f} (mIoU) {len(self)} samples>' + + +class MeanEvaluator: + def __init__(self, name: str = 'MeanEvaluator'): + self.ious: List[float] = [] + self.intensities: List[float] = [] + self.name = name + + def log_iou(self, preds: Union[torch.Tensor, List[torch.Tensor]], truth: torch.Tensor): + if not isinstance(preds, list): + preds = [preds] + + self.ious.append(max(compute_iou(pred, truth) for pred in preds)) + return self + + def log_intensity(self, pred: torch.Tensor): + self.intensities.append(pred.mean().item()) + return self + + @property + def mean_iou(self) -> float: + return np.mean(self.ious) + + @property + def mean_intensity(self) -> float: + return np.mean(self.intensities) + + @property + def ci95_miou(self) -> float: + return 1.96 * np.std(self.ious) / np.sqrt(len(self.ious)) + + def __len__(self) -> int: + return max(len(self.ious), len(self.intensities)) + + def __str__(self): + return f'{self.name}<{self.mean_iou:.4f} (±{self.ci95_miou:.3f} mIoU) {self.mean_intensity:.4f} (mInt) {len(self)} samples>' + + +if __name__ == '__main__': + mask = load_mask('truth/output/452/sink.gt.png') + + print(MeanEvaluator().log_iou(mask, mask)) diff --git a/scripts/daam/experiment.py b/scripts/daam/experiment.py new file mode 100644 index 000000000..4465a3054 --- /dev/null +++ b/scripts/daam/experiment.py @@ -0,0 +1,344 @@ +from pathlib import Path +from typing import List, Optional, Dict, Any, Union +from dataclasses import dataclass +import json + +from transformers import PreTrainedTokenizer, AutoTokenizer +import PIL.Image +import numpy as np +import torch + +from .utils import auto_autocast +from .evaluate import load_mask + + +__all__ = ['GenerationExperiment', 'COCO80_LABELS', 'COCOSTUFF27_LABELS', 'COCO80_INDICES', 'build_word_list_coco80'] + + +COCO80_LABELS: List[str] = [ + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', + 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', + 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', + 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', + 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', + 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', + 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', + 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', + 'hair drier', 'toothbrush' +] + +COCO80_INDICES: Dict[str, int] = {x: i for i, x in enumerate(COCO80_LABELS)} + +UNUSED_LABELS: List[str] = [f'__unused_{i}__' for i in range(1, 200)] + +COCOSTUFF27_LABELS: List[str] = [ + 'electronic', 'appliance', 'food', 'furniture', 'indoor', 'kitchen', 'accessory', 'animal', 'outdoor', 'person', + 'sports', 'vehicle', 'ceiling', 'floor', 'food', 'furniture', 'rawmaterial', 'textile', 'wall', 'window', + 'building', 'ground', 'plant', 'sky', 'solid', 'structural', 'water' +] + +COCO80_ONTOLOGY = { + 'two-wheeled vehicle': ['bicycle', 'motorcycle'], + 'vehicle': ['two-wheeled vehicle', 'four-wheeled vehicle'], + 'four-wheeled vehicle': ['bus', 'truck', 'car'], + 'four-legged animals': ['livestock', 'pets', 'wild animals'], + 'livestock': ['cow', 'horse', 'sheep'], + 'pets': ['cat', 'dog'], + 'wild animals': ['elephant', 'bear', 'zebra', 'giraffe'], + 'bags': ['backpack', 'handbag', 'suitcase'], + 'sports boards': ['snowboard', 'surfboard', 'skateboard'], + 'utensils': ['fork', 'knife', 'spoon'], + 'receptacles': ['bowl', 'cup'], + 'fruits': ['banana', 'apple', 'orange'], + 'foods': ['fruits', 'meals', 'desserts'], + 'meals': ['sandwich', 'hot dog', 'pizza'], + 'desserts': ['cake', 'donut'], + 'furniture': ['chair', 'couch', 'bench'], + 'electronics': ['monitors', 'appliances'], + 'monitors': ['tv', 'cell phone', 'laptop'], + 'appliances': ['oven', 'toaster', 'refrigerator'] +} + +COCO80_TO_27 = { + 'bicycle': 'vehicle', 'car': 'vehicle', 'motorcycle': 'vehicle', 'airplane': 'vehicle', 'bus': 'vehicle', + 'train': 'vehicle', 'truck': 'vehicle', 'boat': 'vehicle', 'traffic light': 'accessory', 'fire hydrant': 'accessory', + 'stop sign': 'accessory', 'parking meter': 'accessory', 'bench': 'furniture', 'bird': 'animal', 'cat': 'animal', + 'dog': 'animal', 'horse': 'animal', 'sheep': 'animal', 'cow': 'animal', 'elephant': 'animal', 'bear': 'animal', + 'zebra': 'animal', 'giraffe': 'animal', 'backpack': 'accessory', 'umbrella': 'accessory', 'handbag': 'accessory', + 'tie': 'accessory', 'suitcase': 'accessory', 'frisbee': 'sports', 'skis': 'sports', 'snowboard': 'sports', + 'sports ball': 'sports', 'kite': 'sports', 'baseball bat': 'sports', 'baseball glove': 'sports', + 'skateboard': 'sports', 'surfboard': 'sports', 'tennis racket': 'sports', 'bottle': 'food', 'wine glass': 'food', + 'cup': 'food', 'fork': 'food', 'knife': 'food', 'spoon': 'food', 'bowl': 'food', 'banana': 'food', 'apple': 'food', + 'sandwich': 'food', 'orange': 'food', 'broccoli': 'food', 'carrot': 'food', 'hot dog': 'food', 'pizza': 'food', + 'donut': 'food', 'cake': 'food', 'chair': 'furniture', 'couch': 'furniture', 'potted plant': 'plant', + 'bed': 'furniture', 'dining table': 'furniture', 'toilet': 'furniture', 'tv': 'electronic', 'laptop': 'electronic', + 'mouse': 'electronic', 'remote': 'electronic', 'keyboard': 'electronic', 'cell phone': 'electronic', + 'microwave': 'appliance', 'oven': 'appliance', 'toaster': 'appliance', 'sink': 'appliance', + 'refrigerator': 'appliance', 'book': 'indoor', 'clock': 'indoor', 'vase': 'indoor', 'scissors': 'indoor', + 'teddy bear': 'indoor', 'hair drier': 'indoor', 'toothbrush': 'indoor' +} + + +def build_word_list_coco80() -> Dict[str, List[str]]: + words_map = COCO80_ONTOLOGY.copy() + words_map = {k: v for k, v in words_map.items() if not any(item in COCO80_ONTOLOGY for item in v)} + + return words_map + + +def _add_mask(masks: Dict[str, torch.Tensor], word: str, mask: torch.Tensor, simplify80: bool = False) -> Dict[str, torch.Tensor]: + if simplify80: + word = COCO80_TO_27.get(word, word) + + if word in masks: + masks[word] = masks[word.lower()] + mask + masks[word].clamp_(0, 1) + else: + masks[word] = mask + + return masks + + +@dataclass +class GenerationExperiment: + """Class to hold experiment parameters. Pickleable.""" + image: PIL.Image.Image + global_heat_map: torch.Tensor + prompt: str + + seed: int = None + id: str = '.' + path: Optional[Path] = None + + truth_masks: Optional[Dict[str, torch.Tensor]] = None + prediction_masks: Optional[Dict[str, torch.Tensor]] = None + annotations: Optional[Dict[str, Any]] = None + subtype: Optional[str] = '.' + tokenizer: AutoTokenizer = None + + def __post_init__(self): + if isinstance(self.path, str): + self.path = Path(self.path) + + self.path = None if self.path is None else self.path / self.id + + def nsfw(self) -> bool: + return np.sum(np.array(self.image)) == 0 + + def heat_map(self, tokenizer: AutoTokenizer = None): + if tokenizer is None: + tokenizer = self.tokenizer + + from daam import GlobalHeatMap + return GlobalHeatMap(tokenizer, self.prompt, self.global_heat_map) + + def clear_checkpoint(self): + path = self if isinstance(self, Path) else self.path + + (path / 'generation.pt').unlink(missing_ok=True) + + def save(self, path: str = None, heat_maps: bool = True, tokenizer: AutoTokenizer = None): + if path is None: + path = self.path + else: + path = Path(path) / self.id + + if tokenizer is None: + tokenizer = self.tokenizer + + (path / self.subtype).mkdir(parents=True, exist_ok=True) + torch.save(self, path / self.subtype / 'generation.pt') + self.image.save(path / self.subtype / 'output.png') + + with (path / 'prompt.txt').open('w') as f: + f.write(self.prompt) + + with (path / 'seed.txt').open('w') as f: + f.write(str(self.seed)) + + if self.truth_masks is not None: + for name, mask in self.truth_masks.items(): + im = PIL.Image.fromarray((mask * 255).unsqueeze(-1).expand(-1, -1, 4).byte().numpy()) + im.save(path / f'{name.lower()}.gt.png') + + if heat_maps and tokenizer is not None: + self.save_all_heat_maps(tokenizer) + + self.save_annotations() + + def save_annotations(self, path: Path = None): + if path is None: + path = self.path + + if self.annotations is not None: + with (path / 'annotations.json').open('w') as f: + json.dump(self.annotations, f) + + def _load_truth_masks(self, simplify80: bool = False) -> Dict[str, torch.Tensor]: + masks = {} + + for mask_path in self.path.glob('*.gt.png'): + word = mask_path.name.split('.gt.png')[0].lower() + mask = load_mask(str(mask_path)) + _add_mask(masks, word, mask, simplify80) + + return masks + + def _load_pred_masks(self, pred_prefix, composite=False, simplify80=False, vocab=None): + # type: (str, bool, bool, List[str] | None) -> Dict[str, torch.Tensor] + masks = {} + + if vocab is None: + vocab = UNUSED_LABELS + + if composite: + try: + im = PIL.Image.open(self.path / self.subtype / f'composite.{pred_prefix}.pred.png') + im = np.array(im) + + for mask_idx in np.unique(im): + mask = torch.from_numpy((im == mask_idx).astype(np.float32)) + _add_mask(masks, vocab[mask_idx], mask, simplify80) + except FileNotFoundError: + pass + else: + for mask_path in (self.path / self.subtype).glob(f'*.{pred_prefix}.pred.png'): + mask = load_mask(str(mask_path)) + word = mask_path.name.split(f'.{pred_prefix}.pred')[0].lower() + _add_mask(masks, word, mask, simplify80) + + return masks + + def clear_prediction_masks(self, name: str): + path = self if isinstance(self, Path) else self.path + path = path / self.subtype + + for mask_path in path.glob(f'*.{name}.pred.png'): + mask_path.unlink() + + def save_prediction_mask(self, mask: torch.Tensor, word: str, name: str): + path = self if isinstance(self, Path) else self.path + im = PIL.Image.fromarray((mask * 255).unsqueeze(-1).expand(-1, -1, 4).cpu().byte().numpy()) + im.save(path / self.subtype / f'{word.lower()}.{name}.pred.png') + + def save_heat_map( + self, + word: str, + tokenizer: PreTrainedTokenizer = None, + crop: int = None, + output_prefix: str = '', + absolute: bool = False + ) -> Path: + from .trace import GlobalHeatMap # because of cyclical import + + if tokenizer is None: + tokenizer = self.tokenizer + + with auto_autocast(dtype=torch.float32): + path = self.path / self.subtype / f'{output_prefix}{word.lower()}.heat_map.png' + heat_map = GlobalHeatMap(tokenizer, self.prompt, self.global_heat_map) + heat_map.compute_word_heat_map(word).expand_as(self.image, color_normalize=not absolute, out_file=path, plot=True) + + return path + + def save_all_heat_maps(self, tokenizer: PreTrainedTokenizer = None, crop: int = None) -> Dict[str, Path]: + path_map = {} + + if tokenizer is None: + tokenizer = self.tokenizer + + for word in self.prompt.split(' '): + try: + path = self.save_heat_map(word, tokenizer, crop=crop) + path_map[word] = path + except: + pass + + return path_map + + @staticmethod + def contains_truth_mask(path: Union[str, Path], prompt_id: str = None) -> bool: + if prompt_id is None: + return any(Path(path).glob('*.gt.png')) + else: + return any((Path(path) / prompt_id).glob('*.gt.png')) + + @staticmethod + def read_seed(path: Union[str, Path], prompt_id: str = None) -> int: + if prompt_id is None: + return int(Path(path).joinpath('seed.txt').read_text()) + else: + return int(Path(path).joinpath(prompt_id).joinpath('seed.txt').read_text()) + + @staticmethod + def has_annotations(path: Union[str, Path]) -> bool: + return Path(path).joinpath('annotations.json').exists() + + @staticmethod + def has_experiment(path: Union[str, Path], prompt_id: str) -> bool: + return (Path(path) / prompt_id / 'generation.pt').exists() + + @staticmethod + def read_prompt(path: Union[str, Path], prompt_id: str = None) -> str: + if prompt_id is None: + prompt_id = '.' + + with (Path(path) / prompt_id / 'prompt.txt').open('r') as f: + return f.read().strip() + + def _try_load_annotations(self): + if not (self.path / 'annotations.json').exists(): + return None + + return json.load((self.path / 'annotations.json').open()) + + def annotate(self, key: str, value: Any) -> 'GenerationExperiment': + if self.annotations is None: + self.annotations = {} + + self.annotations[key] = value + + return self + + @classmethod + def load( + cls, + path, + pred_prefix='daam', + composite=False, + simplify80=False, + vocab=None, + subtype='.', + all_subtypes=False + ): + # type: (str, str, bool, bool, List[str] | None, str, bool) -> GenerationExperiment | List[GenerationExperiment] + if all_subtypes: + experiments = [] + + for directory in Path(path).iterdir(): + if not directory.is_dir(): + continue + + try: + experiments.append(cls.load( + path, + pred_prefix=pred_prefix, + composite=composite, + simplify80=simplify80, + vocab=vocab, + subtype=directory.name + )) + except: + pass + + return experiments + + path = Path(path) + exp = torch.load(path / subtype / 'generation.pt') + exp.subtype = subtype + exp.path = path + exp.truth_masks = exp._load_truth_masks(simplify80=simplify80) + exp.prediction_masks = exp._load_pred_masks(pred_prefix, composite=composite, simplify80=simplify80, vocab=vocab) + exp.annotations = exp._try_load_annotations() + + return exp diff --git a/scripts/daam/heatmap.py b/scripts/daam/heatmap.py new file mode 100644 index 000000000..0f7a311f0 --- /dev/null +++ b/scripts/daam/heatmap.py @@ -0,0 +1,185 @@ +import io +from collections import defaultdict +from dataclasses import dataclass +from functools import lru_cache +from pathlib import Path +from typing import Any, Dict, Tuple, Set, Iterable + +from matplotlib import pyplot as plt +import numpy as np +import PIL.Image +import spacy.tokens +import torch +import torch.nn.functional as F + +from .evaluate import compute_ioa +from .utils import compute_token_merge_indices, cached_nlp, auto_autocast + +__all__ = ['GlobalHeatMap', 'RawHeatMapCollection', 'WordHeatMap', 'ParsedHeatMap', 'SyntacticHeatMapPair'] + + +def plot_overlay_heat_map(im, heat_map, word=None, out_file=None, crop=None, color_normalize=True, ax=None, cmap='jet'): + # type: (PIL.Image.Image | np.ndarray, torch.Tensor, str, Path, int, bool, plt.Axes) -> None + if ax is None: + plt.rcParams['font.size'] = 16 + plt.rcParams['figure.facecolor'] = 'black' + plt.rcParams['text.color'] = 'white' + plt.rcParams['axes.labelcolor'] = 'white' + plt.rcParams['xtick.color'] = 'black' + plt.rcParams['ytick.color'] = 'black' + plt.clf() + plt_ = plt + else: + plt_ = ax + + with auto_autocast(dtype=torch.float32): + im = np.array(im) + + if crop is not None: + heat_map = heat_map.squeeze()[crop:-crop, crop:-crop] + im = im[crop:-crop, crop:-crop] + + if color_normalize: + plt_.imshow(heat_map.squeeze().cpu().numpy(), cmap=cmap) + else: + heat_map = heat_map.clamp_(min=0, max=1) + plt_.imshow(heat_map.squeeze().cpu().numpy(), cmap=cmap, vmin=0.0, vmax=1.0) + + im = torch.from_numpy(im).float() / 255 + im = torch.cat((im, (1 - heat_map.unsqueeze(-1))), dim=-1) + plt_.imshow(im) + + if word is not None: + if ax is None: + plt.title(word) + else: + ax.set_title(word) + + if out_file is not None: + plt.savefig(out_file) + + buf = io.BytesIO() + plt.savefig(buf, format='png', bbox_inches='tight') + buf.seek(0) + image = PIL.Image.open(buf) + return image + + +class WordHeatMap: + def __init__(self, heatmap: torch.Tensor, word: str = None, word_idx: int = None): + self.word = word + self.word_idx = word_idx + self.heatmap = heatmap + + @property + def value(self): + return self.heatmap + + def plot_overlay(self, image, out_file=None, color_normalize=True, ax=None, cmap='jet', **expand_kwargs): + # type: (PIL.Image.Image | np.ndarray, Path, bool, plt.Axes, Dict[str, Any]) -> None + return plot_overlay_heat_map( + image, + self.expand_as(image, **expand_kwargs), + word=self.word, + out_file=out_file, + color_normalize=color_normalize, + ax=ax, + cmap=cmap, + ) + + def expand_as(self, image, absolute=False, threshold=None, plot=False, **plot_kwargs): + # type: (PIL.Image.Image, bool, float, bool, Dict[str, Any]) -> torch.Tensor + im = self.heatmap.unsqueeze(0).unsqueeze(0) + im = F.interpolate(im.float().detach(), size=(image.size[0], image.size[1]), mode='bicubic') + + if not absolute: + im = (im - im.min()) / (im.max() - im.min() + 1e-8) + + if threshold: + im = (im > threshold).float() + + im = im.cpu().detach().squeeze() + + if plot: + self.plot_overlay(image, **plot_kwargs) + + return im + + def compute_ioa(self, other: 'WordHeatMap'): + return compute_ioa(self.heatmap, other.heatmap) + + +@dataclass +class SyntacticHeatMapPair: + head_heat_map: WordHeatMap + dep_heat_map: WordHeatMap + head_text: str + dep_text: str + relation: str + + +@dataclass +class ParsedHeatMap: + word_heat_map: WordHeatMap + token: spacy.tokens.Token + + +class GlobalHeatMap: + def __init__(self, tokenizer: Any, prompt: str, heat_maps: torch.Tensor): + self.tokenizer = tokenizer + self.heat_maps = heat_maps + self.prompt = prompt + self.compute_word_heat_map = lru_cache(maxsize=50)(self.compute_word_heat_map) + + def compute_word_heat_map(self, word: str, word_idx: int = None, offset_idx: int = 0) -> WordHeatMap: + merge_idxs, word_idx = compute_token_merge_indices(self.tokenizer, self.prompt, word, word_idx, offset_idx) + return WordHeatMap(self.heat_maps[merge_idxs].mean(0), word, word_idx) + + def parsed_heat_maps(self) -> Iterable[ParsedHeatMap]: + for token in cached_nlp(self.prompt): + try: + heat_map = self.compute_word_heat_map(token.text) + yield ParsedHeatMap(heat_map, token) + except ValueError: + pass + + def dependency_relations(self) -> Iterable[SyntacticHeatMapPair]: + for token in cached_nlp(self.prompt): + if token.dep_ != 'ROOT': + try: + dep_heat_map = self.compute_word_heat_map(token.text) + head_heat_map = self.compute_word_heat_map(token.head.text) + + yield SyntacticHeatMapPair(head_heat_map, dep_heat_map, token.head.text, token.text, token.dep_) + except ValueError: + pass + + +RawHeatMapKey = Tuple[int, int, int] # factor, layer, head + + +class RawHeatMapCollection: + def __init__(self): + self.ids_to_heatmaps: Dict[RawHeatMapKey, torch.Tensor] = defaultdict(lambda: 0.0) + self.ids_to_num_maps: Dict[RawHeatMapKey, int] = defaultdict(lambda: 0) + + def update(self, factor: int, layer_idx: int, head_idx: int, heatmap: torch.Tensor): + with auto_autocast(dtype=torch.float32): + key = (factor, layer_idx, head_idx) + self.ids_to_heatmaps[key] = self.ids_to_heatmaps[key] + heatmap + + def factors(self) -> Set[int]: + return set(key[0] for key in self.ids_to_heatmaps.keys()) + + def layers(self) -> Set[int]: + return set(key[1] for key in self.ids_to_heatmaps.keys()) + + def heads(self) -> Set[int]: + return set(key[2] for key in self.ids_to_heatmaps.keys()) + + def __iter__(self): + return iter(self.ids_to_heatmaps.items()) + + def clear(self): + self.ids_to_heatmaps.clear() + self.ids_to_num_maps.clear() diff --git a/scripts/daam/hook.py b/scripts/daam/hook.py new file mode 100644 index 000000000..f82762c4e --- /dev/null +++ b/scripts/daam/hook.py @@ -0,0 +1,127 @@ +from typing import List, Generic, TypeVar, Callable, Union, Any +import functools +import itertools + +from diffusers import UNet2DConditionModel +from diffusers.models.attention_processor import Attention +import torch.nn as nn + + +__all__ = ['ObjectHooker', 'ModuleLocator', 'AggregateHooker', 'UNetCrossAttentionLocator'] + + +ModuleType = TypeVar('ModuleType') +ModuleListType = TypeVar('ModuleListType', bound=List) + + +class ModuleLocator(Generic[ModuleType]): + def locate(self, model: nn.Module) -> List[ModuleType]: + raise NotImplementedError + + +class ObjectHooker(Generic[ModuleType]): + def __init__(self, module: ModuleType): + self.module: ModuleType = module + self.hooked = False + self.old_state = dict() + + def __enter__(self): + self.hook() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.unhook() + + def hook(self): + if self.hooked: + raise RuntimeError('Already hooked module') + + self.old_state = dict() + self.hooked = True + self._hook_impl() + + return self + + def unhook(self): + if not self.hooked: + raise RuntimeError('Module is not hooked') + + for k, v in self.old_state.items(): + if k.startswith('old_fn_'): + setattr(self.module, k[7:], v) + + self.hooked = False + self._unhook_impl() + + return self + + def monkey_patch(self, fn_name, fn, strict: bool = True): + try: + self.old_state[f'old_fn_{fn_name}'] = getattr(self.module, fn_name) + setattr(self.module, fn_name, functools.partial(fn, self.module)) + except AttributeError: + if strict: + raise + + def monkey_super(self, fn_name, *args, **kwargs): + return self.old_state[f'old_fn_{fn_name}'](*args, **kwargs) + + def _hook_impl(self): + raise NotImplementedError + + def _unhook_impl(self): + pass + + +class AggregateHooker(ObjectHooker[ModuleListType]): + def _hook_impl(self): + for h in self.module: + h.hook() + + def _unhook_impl(self): + for h in self.module: + h.unhook() + + def register_hook(self, hook: ObjectHooker): + self.module.append(hook) + + +class UNetCrossAttentionLocator(ModuleLocator[Attention]): + def __init__(self, restrict: bool = None, locate_middle_block: bool = False): + self.restrict = restrict + self.layer_names = [] + self.locate_middle_block = locate_middle_block + + def locate(self, model: UNet2DConditionModel) -> List[Attention]: + """ + Locate all cross-attention modules in a UNet2DConditionModel. + + Args: + model (`UNet2DConditionModel`): The model to locate the cross-attention modules in. + + Returns: + `List[Attention]`: The list of cross-attention modules. + """ + self.layer_names.clear() + blocks_list = [] + up_names = ['up'] * len(model.up_blocks) + down_names = ['down'] * len(model.down_blocks) + + for unet_block, name in itertools.chain( + zip(model.up_blocks, up_names), + zip(model.down_blocks, down_names), + zip([model.mid_block], ['mid']) if self.locate_middle_block else [], + ): + if 'CrossAttn' in unet_block.__class__.__name__: + blocks = [] + + for spatial_transformer in unet_block.attentions: + for transformer_block in spatial_transformer.transformer_blocks: + blocks.append(transformer_block.attn2) + + blocks = [b for idx, b in enumerate(blocks) if self.restrict is None or idx in self.restrict] + names = [f'{name}-attn-{i}' for i in range(len(blocks)) if self.restrict is None or i in self.restrict] + blocks_list.extend(blocks) + self.layer_names.extend(names) + + return blocks_list diff --git a/scripts/daam/trace.py b/scripts/daam/trace.py new file mode 100644 index 000000000..1b6a6cd3f --- /dev/null +++ b/scripts/daam/trace.py @@ -0,0 +1,323 @@ +from pathlib import Path +from typing import List, Type, Any, Dict, Tuple, Union +import math + +from diffusers import StableDiffusionPipeline, StableDiffusionXLPipeline +from diffusers.image_processor import VaeImageProcessor +from diffusers.models.attention_processor import Attention +import numpy as np +import PIL.Image as Image +import torch +import torch.nn.functional as F + +from .utils import cache_dir, auto_autocast +from .experiment import GenerationExperiment +from .heatmap import RawHeatMapCollection, GlobalHeatMap +from .hook import ObjectHooker, AggregateHooker, UNetCrossAttentionLocator + + +__all__ = ['trace', 'DiffusionHeatMapHooker', 'GlobalHeatMap'] + + +class DiffusionHeatMapHooker(AggregateHooker): + def __init__( + self, + pipeline: Union[StableDiffusionPipeline, StableDiffusionXLPipeline], + low_memory: bool = False, + load_heads: bool = False, + save_heads: bool = False, + data_dir: str = None + ): + self.all_heat_maps = RawHeatMapCollection() + h = (pipeline.unet.config.sample_size * pipeline.vae_scale_factor) + self.latent_hw = 4096 if h == 512 or h == 1024 else 9216 # 64x64 or 96x96 depending on if it's 2.0-v or 2.0 + locate_middle = load_heads or save_heads + self.locator = UNetCrossAttentionLocator(restrict={0} if low_memory else None, locate_middle_block=locate_middle) + self.last_prompt: str = '' + self.last_image: Image = None + self.time_idx = 0 + self._gen_idx = 0 + + modules = [ + UNetCrossAttentionHooker( + x, + self, + layer_idx=idx, + latent_hw=self.latent_hw, + load_heads=load_heads, + save_heads=save_heads, + data_dir=data_dir + ) for idx, x in enumerate(self.locator.locate(pipeline.unet)) + ] + + modules.append(PipelineHooker(pipeline, self)) + + if type(pipeline) == StableDiffusionXLPipeline: + modules.append(ImageProcessorHooker(pipeline.image_processor, self)) + + super().__init__(modules) + self.pipe = pipeline + + def time_callback(self, *args, **kwargs): + self.time_idx += 1 + + @property + def layer_names(self): + return self.locator.layer_names + + def to_experiment(self, path, seed=None, id='.', subtype='.', **compute_kwargs): + # type: (Union[Path, str], int, str, str, Dict[str, Any]) -> GenerationExperiment + """Exports the last generation call to a serializable generation experiment.""" + + return GenerationExperiment( + self.last_image, + self.compute_global_heat_map(**compute_kwargs).heat_maps, + self.last_prompt, + seed=seed, + id=id, + subtype=subtype, + path=path, + tokenizer=self.pipe.tokenizer, + ) + + def compute_global_heat_map(self, prompt=None, factors=None, head_idx=None, layer_idx=None, normalize=False): + # type: (str, List[float], int, int, bool) -> GlobalHeatMap + """ + Compute the global heat map for the given prompt, aggregating across time (inference steps) and space (different + spatial transformer block heat maps). + + Args: + prompt: The prompt to compute the heat map for. If none, uses the last prompt that was used for generation. + factors: Restrict the application to heat maps with spatial factors in this set. If `None`, use all sizes. + head_idx: Restrict the application to heat maps with this head index. If `None`, use all heads. + layer_idx: Restrict the application to heat maps with this layer index. If `None`, use all layers. + + Returns: + A heat map object for computing word-level heat maps. + """ + heat_maps = self.all_heat_maps + + if prompt is None: + prompt = self.last_prompt + + if factors is None: + factors = {0, 1, 2, 4, 8, 16, 32, 64} + else: + factors = set(factors) + + all_merges = [] + x = int(np.sqrt(self.latent_hw)) + + with auto_autocast(dtype=torch.float32): + for (factor, layer, head), heat_map in heat_maps: + if factor in factors and (head_idx is None or head_idx == head) and (layer_idx is None or layer_idx == layer): + heat_map = heat_map.unsqueeze(1) + # The clamping fixes undershoot. + all_merges.append(F.interpolate(heat_map, size=(x, x), mode='bicubic').clamp_(min=0)) + + try: + maps = torch.stack(all_merges, dim=0) + except RuntimeError: + if head_idx is not None or layer_idx is not None: + raise RuntimeError('No heat maps found for the given parameters.') + else: + raise RuntimeError('No heat maps found. Did you forget to call `with trace(...)` during generation?') + + maps = maps.mean(0)[:, 0] + maps = maps[:len(self.pipe.tokenizer.tokenize(prompt)) + 2] # 1 for SOS and 1 for padding + + if normalize: + maps = maps / (maps[1:-1].sum(0, keepdim=True) + 1e-6) # drop out [SOS] and [PAD] for proper probabilities + + return GlobalHeatMap(self.pipe.tokenizer, prompt, maps) + + +class ImageProcessorHooker(ObjectHooker[VaeImageProcessor]): + def __init__(self, processor: VaeImageProcessor, parent_trace: 'trace'): + super().__init__(processor) + self.parent_trace = parent_trace + + def _hooked_postprocess(hk_self, _: VaeImageProcessor, *args, **kwargs): + images = hk_self.monkey_super('postprocess', *args, **kwargs) + hk_self.parent_trace.last_image = images[0] + + return images + + def _hook_impl(self): + self.monkey_patch('postprocess', self._hooked_postprocess) + + +class PipelineHooker(ObjectHooker[StableDiffusionPipeline]): + def __init__(self, pipeline: StableDiffusionPipeline, parent_trace: 'trace'): + super().__init__(pipeline) + self.heat_maps = parent_trace.all_heat_maps + self.parent_trace = parent_trace + + def _hooked_run_safety_checker(hk_self, self: StableDiffusionPipeline, image, *args, **kwargs): + image, has_nsfw = hk_self.monkey_super('run_safety_checker', image, *args, **kwargs) + + if self.image_processor: + if torch.is_tensor(image): + images = self.image_processor.postprocess(image, output_type='pil') + else: + images = self.image_processor.numpy_to_pil(image) + else: + images = self.numpy_to_pil(image) + + hk_self.parent_trace.last_image = images[len(images)-1] + + return image, has_nsfw + + def _hooked_check_inputs(hk_self, _: StableDiffusionPipeline, prompt: Union[str, List[str]], *args, **kwargs): + if not isinstance(prompt, str) and len(prompt) > 1: + raise ValueError('Only single prompt generation is supported for heat map computation.') + elif not isinstance(prompt, str): + last_prompt = prompt[0] + else: + last_prompt = prompt + + hk_self.heat_maps.clear() + hk_self.parent_trace.last_prompt = last_prompt + + return hk_self.monkey_super('check_inputs', prompt, *args, **kwargs) + + def _hook_impl(self): + self.monkey_patch('run_safety_checker', self._hooked_run_safety_checker, strict=False) # not present in SDXL + self.monkey_patch('check_inputs', self._hooked_check_inputs) + + +class UNetCrossAttentionHooker(ObjectHooker[Attention]): + def __init__( + self, + module: Attention, + parent_trace: 'trace', + context_size: int = 77, + layer_idx: int = 0, + latent_hw: int = 9216, + load_heads: bool = False, + save_heads: bool = False, + data_dir: Union[str, Path] = None, + ): + super().__init__(module) + self.heat_maps = parent_trace.all_heat_maps + self.context_size = context_size + self.layer_idx = layer_idx + self.latent_hw = latent_hw + + self.load_heads = load_heads + self.save_heads = save_heads + self.trace = parent_trace + + if data_dir is not None: + data_dir = Path(data_dir) + else: + data_dir = cache_dir() / 'heads' + + self.data_dir = data_dir + self.data_dir.mkdir(parents=True, exist_ok=True) + + @torch.no_grad() + def _unravel_attn(self, x): + # type: (torch.Tensor) -> torch.Tensor + # x shape: (heads, height * width, tokens) + """ + Unravels the attention, returning it as a collection of heat maps. + + Args: + x (`torch.Tensor`): cross attention slice/map between the words and the tokens. + value (`torch.Tensor`): the value tensor. + + Returns: + `List[Tuple[int, torch.Tensor]]`: the list of heat maps across heads. + """ + h = w = int(math.sqrt(x.size(1))) + maps = [] + x = x.permute(2, 0, 1) + + with auto_autocast(dtype=torch.float32): + for map_ in x: + map_ = map_.view(map_.size(0), h, w) + # For Instruct Pix2Pix, divide the map into three parts: text condition, image condition and unconditional, + # and only keep the text condition part, which is first of the three parts(as per diffusers implementation). + if map_.size(0) == 24: + map_ = map_[:((map_.size(0) // 3)+1)] # Filter out unconditional and image condition + else: + map_ = map_[map_.size(0) // 2:] # # Filter out unconditional + maps.append(map_) + + maps = torch.stack(maps, 0) # shape: (tokens, heads, height, width) + return maps.permute(1, 0, 2, 3).contiguous() # shape: (heads, tokens, height, width) + + def _save_attn(self, attn_slice: torch.Tensor): + torch.save(attn_slice, self.data_dir / f'{self.trace._gen_idx}.pt') + + def _load_attn(self) -> torch.Tensor: + return torch.load(self.data_dir / f'{self.trace._gen_idx}.pt') + + def __call__( + self, + attn: Attention, + hidden_states, + encoder_hidden_states=None, + attention_mask=None, + ): + """Capture attentions and aggregate them.""" + batch_size, sequence_length, _ = hidden_states.shape + attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size) + query = attn.to_q(hidden_states) + + if encoder_hidden_states is None: + encoder_hidden_states = hidden_states + elif attn.norm_cross is not None: + encoder_hidden_states = attn.norm_cross(encoder_hidden_states) + + key = attn.to_k(encoder_hidden_states) + value = attn.to_v(encoder_hidden_states) + + query = attn.head_to_batch_dim(query) + key = attn.head_to_batch_dim(key) + value = attn.head_to_batch_dim(value) + + attention_probs = attn.get_attention_scores(query, key, attention_mask) + + # DAAM save heads + if self.save_heads: + self._save_attn(attention_probs) + elif self.load_heads: + attention_probs = self._load_attn() + + # compute shape factor + factor = int(math.sqrt(self.latent_hw // attention_probs.shape[1])) + self.trace._gen_idx += 1 + + # skip if too large + if attention_probs.shape[-1] == self.context_size and factor != 8: + # shape: (batch_size, 64 // factor, 64 // factor, 77) + maps = self._unravel_attn(attention_probs) + + for head_idx, heatmap in enumerate(maps): + self.heat_maps.update(factor, self.layer_idx, head_idx, heatmap) + + hidden_states = torch.bmm(attention_probs, value) + hidden_states = attn.batch_to_head_dim(hidden_states) + + # linear proj + hidden_states = attn.to_out[0](hidden_states) + # dropout + hidden_states = attn.to_out[1](hidden_states) + + return hidden_states + + def _hook_impl(self): + self.original_processor = self.module.processor + self.module.set_processor(self) + + def _unhook_impl(self): + self.module.set_processor(self.original_processor) + + @property + def num_heat_maps(self): + return len(next(iter(self.heat_maps.values()))) + + +trace: Type[DiffusionHeatMapHooker] = DiffusionHeatMapHooker diff --git a/scripts/daam/utils.py b/scripts/daam/utils.py new file mode 100644 index 000000000..8cfde13f2 --- /dev/null +++ b/scripts/daam/utils.py @@ -0,0 +1,109 @@ +from functools import lru_cache +from pathlib import Path +import os +import sys +import random +from typing import TypeVar + +import PIL.Image +import matplotlib.pyplot as plt +import numpy as np +import spacy +import torch +import torch.nn.functional as F + + +__all__ = ['set_seed', 'compute_token_merge_indices', 'plot_mask_heat_map', 'cached_nlp', 'cache_dir', 'auto_device', 'auto_autocast'] + + +T = TypeVar('T') + + +def auto_device(obj: T = torch.device('cpu')) -> T: + if isinstance(obj, torch.device): + return torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + if torch.cuda.is_available(): + return obj.to('cuda') + + return obj + + +def auto_autocast(*args, **kwargs): + if not torch.cuda.is_available(): + kwargs['enabled'] = False + + return torch.cuda.amp.autocast(*args, **kwargs) + + +def plot_mask_heat_map(im: PIL.Image.Image, heat_map: torch.Tensor, threshold: float = 0.4): + im = torch.from_numpy(np.array(im)).float() / 255 + mask = (heat_map.squeeze() > threshold).float() + im = im * mask.unsqueeze(-1) + plt.imshow(im) + + +def set_seed(seed: int) -> torch.Generator: + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + + gen = torch.Generator(device=auto_device()) + gen.manual_seed(seed) + + return gen + + +def cache_dir() -> Path: + # *nix + if os.name == 'posix' and sys.platform != 'darwin': + xdg = os.environ.get('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + return Path(xdg, 'daam') + elif sys.platform == 'darwin': + # Mac OS + return Path(os.path.expanduser('~'), 'Library/Caches/daam') + else: + # Windows + local = os.environ.get('LOCALAPPDATA', None) \ + or os.path.expanduser('~\\AppData\\Local') + return Path(local, 'daam') + + +def compute_token_merge_indices(tokenizer, prompt: str, word: str, word_idx: int = None, offset_idx: int = 0): + merge_idxs = [] + tokens = tokenizer.tokenize(prompt.lower()) + tokens = [x.replace('', '') for x in tokens] # New tokenizer uses wordpiece markers. + + if word_idx is None: + word = word.lower() + search_tokens = [x.replace('', '') for x in tokenizer.tokenize(word)] # New tokenizer uses wordpiece markers. + start_indices = [x + offset_idx for x in range(len(tokens)) if tokens[x:x + len(search_tokens)] == search_tokens] + + for indice in start_indices: + merge_idxs += [i + indice for i in range(0, len(search_tokens))] + + if not merge_idxs: + raise ValueError(f'Search word {word} not found in prompt!') + else: + merge_idxs.append(word_idx) + + return [x + 1 for x in merge_idxs], word_idx # Offset by 1. + + +nlp = None + + +@lru_cache(maxsize=100000) +def cached_nlp(prompt: str, type='en_core_web_md'): + global nlp + + if nlp is None: + try: + nlp = spacy.load(type) + except OSError: + import os + os.system(f'python -m spacy download {type}') + nlp = spacy.load(type) + + return nlp(prompt) diff --git a/scripts/daam_ext.py b/scripts/daam_ext.py new file mode 100644 index 000000000..5ae16a855 --- /dev/null +++ b/scripts/daam_ext.py @@ -0,0 +1,57 @@ +# https://github.com/genforce/ctrl-x + +import gradio as gr +from installer import install +from modules import shared, scripts_manager, processing + + +COLORMAP = ['autumn', 'bone', 'jet', 'winter', 'rainbow', 'ocean', 'summer', 'spring', 'cool', 'hsv', 'pink', 'hot', 'parula', 'magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'shifted', 'turbo', 'deepgreen'] + + +class Script(scripts_manager.Script): + def title(self): + return 'DAAM: Diffusion Attentive Attribution Maps' + + def show(self, is_img2img): + return not is_img2img + + def ui(self, _is_img2img): + with gr.Row(): + gr.HTML('
      DAAM: Diffusion Attentive Attribution Maps
    ') + with gr.Row(): + append_images = gr.Checkbox(label='Append heatmaps to results', value=True, elem_id='daam_append_images') + colormap = gr.Dropdown(label='Colormap', choices=COLORMAP, value='jet', type='value', elem_id='daam_colormap') + return append_images, colormap + + def run(self, p: processing.StableDiffusionProcessing, append_images, colormap): # pylint: disable=arguments-differ + c = shared.sd_model.__class__.__name__ if shared.sd_loaded else '' + if shared.sd_model_type != 'sdxl': + shared.log.warning(f'DAAM: pipeline={c} required=StableDiffusionXLPipeline') + return None + + install('thinc==8.3.4') + install('spacy==3.8.4') + + from scripts import daam # pylint: disable=no-name-in-module + orig_prompt_attention = shared.opts.prompt_attention + shared.opts.data['prompt_attention'] = 'fixed' + + # process + with daam.trace(shared.sd_model) as tc: + processed: processing.Processed = processing.process_images(p) + global_heat_map = tc.compute_global_heat_map() + shared.log.info(f'DAAM: prompt="{global_heat_map.prompt}" heatmaps={global_heat_map.heat_maps.shape}') + + # word_heat_map = global_heat_map.compute_word_heat_map('woman') + parsed_heat_maps = global_heat_map.parsed_heat_maps() + if append_images: + image = processed.images[0] + for parsed_heat_map in parsed_heat_maps: + if len(parsed_heat_map.token.text) > 1: + shared.log.debug(f'DAAM: token="{parsed_heat_map.token.text}"') + overlay = parsed_heat_map.word_heat_map.plot_overlay(image=image, color_normalize=True, cmap=colormap) + processed.images.append(overlay) + + # restore and return + shared.opts.data['prompt_attention'] = orig_prompt_attention + return processed From c010111c236f71f6b799571a6d9bb10e057e684e Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Thu, 25 Sep 2025 14:06:57 +0900 Subject: [PATCH 051/230] install AMD's preview pytorch on Windows if user wants --- installer.py | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/installer.py b/installer.py index f5e3bad73..f05a5bb32 100644 --- a/installer.py +++ b/installer.py @@ -717,36 +717,39 @@ def install_rocm_zluda(): msg += f', using agent {device.name}' log.info(msg) - if sys.platform == "win32": # TODO install: enable ROCm for windows when available + if sys.platform == "win32": #check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13') - if args.device_id is not None: - if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None: - log.warning('Setting HIP_VISIBLE_DEVICES and --device-id at the same time may be mistake.') - os.environ['HIP_VISIBLE_DEVICES'] = args.device_id - del args.device_id + if args.use_rocm and args.experimental and (sys.version_info.major, sys.version_info.minor) == (3, 12): # TODO install: switch to pytorch source when it becomes available + torch_command = os.environ.get('TORCH_COMMAND', '--no-cache-dir https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torch-2.8.0a0%2Bgitfc14c65-cp312-cp312-win_amd64.whl https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torchvision-0.24.0a0%2Bc85f008-cp312-cp312-win_amd64.whl') + else: + if args.device_id is not None: + if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None: + log.warning('Setting HIP_VISIBLE_DEVICES and --device-id at the same time may be mistake.') + os.environ['HIP_VISIBLE_DEVICES'] = args.device_id + del args.device_id - error = None - from modules import zluda_installer - try: - if args.reinstall or zluda_installer.is_reinstall_needed(): - zluda_installer.uninstall() - zluda_installer.install() - zluda_installer.set_default_agent(device) - except Exception as e: - error = e - log.warning(f'Failed to install ZLUDA: {e}') - - if error is None: + error = None + from modules import zluda_installer try: - zluda_installer.load() - torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+cu118 torchvision==0.22.1+cu118 --index-url https://download.pytorch.org/whl/cu118') + if args.reinstall or zluda_installer.is_reinstall_needed(): + zluda_installer.uninstall() + zluda_installer.install() + zluda_installer.set_default_agent(device) except Exception as e: error = e - log.warning(f'Failed to load ZLUDA: {e}') - if error is not None: - log.info('Using CPU-only torch') - torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') + log.warning(f'Failed to install ZLUDA: {e}') + + if error is None: + try: + zluda_installer.load() + torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+cu118 torchvision==0.22.1+cu118 --index-url https://download.pytorch.org/whl/cu118') + except Exception as e: + error = e + log.warning(f'Failed to load ZLUDA: {e}') + if error is not None: + log.info('Using CPU-only torch') + torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') else: #check_python(supported_minors=[10, 11, 12, 13], reason='ROCm backend requires a Python version between 3.10 and 3.13') From 27c3476da79707131ca0791c406ff86993f2f706 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Thu, 25 Sep 2025 14:32:25 +0300 Subject: [PATCH 052/230] new SDXL Turbo cover, Qwen Edit 2509, some renaming --- html/previews.json | 2 +- html/reference.json | 14 +++++++------- models/Reference/Qwen--Qwen-Image-Edit-2509.jpg | Bin 0 -> 87125 bytes models/Reference/Qwen-Image-Distill.jpg | Bin 76711 -> 0 bytes ...undai--playground-v2.5-1024px-aesthetic.jpg} | Bin models/Reference/stabilityai--sdxl-turbo.jpg | Bin 0 -> 36684 bytes ...abilityai--stable-diffusion-xl-base-1.0.jpg} | Bin 7 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 models/Reference/Qwen--Qwen-Image-Edit-2509.jpg delete mode 100644 models/Reference/Qwen-Image-Distill.jpg rename models/Reference/{playgroundai--playground-v2_5-1024px-aesthetic.jpg => playgroundai--playground-v2.5-1024px-aesthetic.jpg} (100%) create mode 100644 models/Reference/stabilityai--sdxl-turbo.jpg rename models/Reference/{sd_xl_base_1.0.jpg => stabilityai--stable-diffusion-xl-base-1.0.jpg} (100%) diff --git a/html/previews.json b/html/previews.json index e27e2513f..07af08547 100644 --- a/html/previews.json +++ b/html/previews.json @@ -1,6 +1,6 @@ { "sd-v21-512-ema": "models/Reference/stabilityai--stable-diffusion-2-1-base.jpg", - "stabilityai--stable-diffusion-xl-base-1.0": "models/Reference/sd_xl_base_1.0.jpg", + "stabilityai--stable-diffusion-xl-base-1.0": "models/Reference/stabilityai--stable-diffusion-xl-base-1.0.jpg", "stabilityai--stable-diffusion-3-medium-diffusers": "models/Reference/stabilityai--stable-diffusion-3.jpg", "stabilityai--stable-diffusion-3.5-medium": "models/Reference/stabilityai--stable-diffusion-3_5-medium.jpg", "stabilityai--stable-diffusion-3.5-large": "models/Reference/stabilityai--stable-diffusion-3_5-large.jpg", diff --git a/html/reference.json b/html/reference.json index 530570913..c8886af6b 100644 --- a/html/reference.json +++ b/html/reference.json @@ -57,19 +57,19 @@ }, "StabilityAI StableDiffusion XL": { "path": "stabilityai/stable-diffusion-xl-base-1.0", - "preview": "sd_xl_base_1.0.jpg", - "desc": "Stable Diffusion XL (SDXL) is the latest AI image generation model that is tailored towards more photorealistic outputs with more detailed imagery and composition compared to previous SD models, including SD 2.1. It can make realistic faces, legible text within the images, and better image composition, all while using shorter and simpler prompts at a greatly increased base resolution of 1024x1024. Just like its predecessors, SDXL has the ability to generate image variations using image-to-image prompting, inpainting (reimagining of the selected parts of an image), and outpainting (creating new parts that lie outside the image borders).", + "preview": "stabilityai--stable-diffusion-xl-base-1.0.jpg", + "desc": "Stable Diffusion XL (SDXL) is AI image generation model that is tailored towards more photorealistic outputs with more detailed imagery and composition compared to previous SD models, including SD 2.1. It can make realistic faces and better image composition, all while using shorter and simpler prompts at a greatly increased base resolution of 1024x1024. Just like its predecessors, SDXL has the ability to generate image variations using image-to-image prompting, inpainting (reimagining of the selected parts of an image), and outpainting (creating new parts that lie outside the image borders).", "skip": true, "variant": "fp16", "extras": "" }, "StabilityAI StableDiffusion XL Turbo": { "path": "stabilityai/sdxl-turbo", - "preview": "sd_xl_base_1.0.jpg", - "desc": "SDXL-Turbo is a fast generative text-to-image model that can synthesize photorealistic images from a text prompt in a single network evaluation.", + "preview": "stabilityai--sdxl-turbo.jpg", + "desc": "SDXL-Turbo is a fast generative text-to-image model that can synthesize photorealistic images from a text prompt in a 1-4 steps.", "skip": true, "variant": "fp16", - "extras": "" + "extras": "steps: 4, cfg_scale: 0.0" }, "StabilityAI Stable Cascade": { "path": "huggingface/stabilityai/stable-cascade", @@ -172,7 +172,7 @@ }, "Qwen-Image-Edit-2509": { "path": "Qwen/Qwen-Image-Edit-2509", - "preview": "Qwen--Qwen-Image-Edit.jpg", + "preview": "Qwen--Qwen-Image-Edit-2509.jpg", "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", "skip": true, "extras": "" @@ -609,7 +609,7 @@ "Playground v2.5": { "path": "playgroundai/playground-v2.5-1024px-aesthetic", "desc": "Playground v2.5 is a diffusion-based text-to-image generative model, and a successor to Playground v2. Playground v2.5 is the state-of-the-art open-source model in aesthetic quality.", - "preview": "playgroundai--playground-v2_5-1024px-aesthetic.jpg", + "preview": "playgroundai--playground-v2.5-1024px-aesthetic.jpg", "variant": "fp16", "extras": "sampler: DPM++ 2M EDM" }, diff --git a/models/Reference/Qwen--Qwen-Image-Edit-2509.jpg b/models/Reference/Qwen--Qwen-Image-Edit-2509.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6209b7ba075f8b2f5d95992c1f64e9ff74cf8546 GIT binary patch literal 87125 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 X?dyO_>~F3|dmE@WWdnV$fP(+o4XUXL literal 0 HcmV?d00001 diff --git a/models/Reference/Qwen-Image-Distill.jpg b/models/Reference/Qwen-Image-Distill.jpg deleted file mode 100644 index ac05ebcee2dbad0580135f7fbbc4c27259128646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76711 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 literal 0 HcmV?d00001 diff --git a/models/Reference/sd_xl_base_1.0.jpg b/models/Reference/stabilityai--stable-diffusion-xl-base-1.0.jpg similarity index 100% rename from models/Reference/sd_xl_base_1.0.jpg rename to models/Reference/stabilityai--stable-diffusion-xl-base-1.0.jpg From 9cee2cd1ed1b1360fed2416e6da99b18561427aa Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 25 Sep 2025 13:44:56 -0400 Subject: [PATCH 053/230] fix metadata on batched images Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 +- modules/processing_info.py | 8 +- modules/ui_common.py | 20 +- modules/ui_control.py | 318 +------------------------------- modules/ui_control_elements.py | 321 +++++++++++++++++++++++++++++++++ 5 files changed, 343 insertions(+), 327 deletions(-) create mode 100644 modules/ui_control_elements.py diff --git a/CHANGELOG.md b/CHANGELOG.md index bcfa7def8..45ac06a67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-24 +## Update for 2025-09-25 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -52,6 +52,7 @@ - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring - **Fixes** + - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark - xyz-grid: fix xyz grid with random seeds diff --git a/modules/processing_info.py b/modules/processing_info.py index 694fd52b3..e1d4d6379 100644 --- a/modules/processing_info.py +++ b/modules/processing_info.py @@ -31,13 +31,13 @@ def create_infotext(p: StableDiffusionProcessing, all_prompts=None, all_seeds=No if all_subseeds is None: all_subseeds = p.all_subseeds or [p.subseed] while len(all_prompts) <= index: - all_prompts.append(all_prompts[-1]) + all_prompts.insert(0, p.prompt) while len(all_seeds) <= index: - all_seeds.append(all_seeds[-1]) + all_seeds.insert(0, int(p.seed)) while len(all_subseeds) <= index: - all_subseeds.append(all_subseeds[-1]) + all_subseeds.insert(0, int(p.subseed)) while len(all_negative_prompts) <= index: - all_negative_prompts.append(all_negative_prompts[-1]) + all_negative_prompts.insert(0, p.negative_prompt) comment = ', '.join(comments) if comments is not None and type(comments) is list else None ops = list(set(p.ops)) args = { diff --git a/modules/ui_common.py b/modules/ui_common.py index 1c5499cf7..fa0d1322f 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -5,7 +5,7 @@ import shutil import platform import subprocess import gradio as gr -from modules import call_queue, shared, errors, ui_sections, ui_symbols, ui_components, generation_parameters_copypaste, images, scripts_manager, script_callbacks, infotext +from modules import call_queue, shared, errors, ui_sections, ui_symbols, ui_components, generation_parameters_copypaste, images, scripts_manager, script_callbacks, infotext, processing folder_symbol = ui_symbols.folder @@ -19,6 +19,8 @@ def gr_show(visible=True): def update_generation_info(generation_info, html_info, img_index): try: + if len(generation_info) == 0 and processing.processed is not None: + generation_info = processing.processed.js() or {} generation_json = json.loads(generation_info) if len(generation_json["infotexts"]) == 0: return html_info, 'no infotexts found' @@ -29,8 +31,8 @@ def update_generation_info(generation_info, html_info, img_index): info = generation_json["infotexts"][img_index] html_info_formatted = infotext_to_html(info) return html_info, html_info_formatted - except Exception: - pass + except Exception as e: + shared.log.warning(f'Update info: info="{generation_info}" {e}') return html_info, html_info @@ -238,7 +240,7 @@ def open_folder(result_gallery, gallery_index = 0): subprocess.Popen(["xdg-open", path]) # pylint: disable=consider-using-with -def create_output_panel(tabname, preview=True, prompt=None, height=None, transfer=True, scale=1): +def create_output_panel(tabname, preview=True, prompt=None, height=None, transfer=True, scale=1, result_info=None): with gr.Column(variant='panel', elem_id=f"{tabname}_results", scale=scale): with gr.Group(elem_id=f"{tabname}_gallery_container"): if tabname == "txt2img": @@ -286,10 +288,11 @@ def create_output_panel(tabname, preview=True, prompt=None, height=None, transfe generation_info = gr.Textbox(visible=False, elem_id=f'generation_info_{tabname}') generation_info_button = gr.Button(visible=False, elem_id=f"{tabname}_generation_info_button") + result_field = result_info or html_info_formatted generation_info_button.click(fn=update_generation_info, show_progress=False, _js="(x, y, z) => [x, y, selected_gallery_index()]", # triggered on gallery change from js inputs=[generation_info, html_info, html_info], - outputs=[html_info, html_info_formatted], + outputs=[html_info, result_field], ) save.click(fn=call_queue.wrap_gradio_call(save_files), show_progress=False, _js="(x, y, z, i) => [x, y, z, selected_gallery_index()]", @@ -354,11 +357,12 @@ def create_override_inputs(tab): # pylint: disable=unused-argument def reuse_seed(seed_component: gr.Number, reuse_button: gr.Button, subseed:bool=False): def reuse_click(selected_gallery_index): selected_gallery_index = int(selected_gallery_index) - from modules import processing if processing.processed is None: seed = -1 - elif selected_gallery_index >= len(processing.processed.all_seeds): - selected_gallery_index -= len(processing.processed.images) - len(processing.processed.all_seeds) # if we have more images than seeds it is likely the grid image + elif len(processing.processed.images) > len(processing.processed.all_seeds): # if we have more images than seeds it is likely the grid image + selected_gallery_index -= (len(processing.processed.images) - len(processing.processed.all_seeds)) + seed = processing.processed.all_seeds[selected_gallery_index] if not subseed else processing.processed.all_subseeds[selected_gallery_index] + elif selected_gallery_index <= len(processing.processed.all_seeds): seed = processing.processed.all_seeds[selected_gallery_index] if not subseed else processing.processed.all_subseeds[selected_gallery_index] elif len(processing.processed.all_seeds) > 0: seed = processing.processed.all_seeds[0] if not subseed else processing.processed.all_subseeds[0] diff --git a/modules/ui_control.py b/modules/ui_control.py index 0fe361aa2..ecfe1fa01 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -1,15 +1,8 @@ import os import time import gradio as gr -import matplotlib.pyplot as plt from modules.control import unit -from modules.control import processors # patrickvonplaten controlnet_aux -from modules.control.units import controlnet # lllyasviel ControlNet -from modules.control.units import xs # vislearn ControlNet-XS -from modules.control.units import lite # vislearn ControlNet-XS -from modules.control.units import t2iadapter # TencentARC T2I-Adapter -from modules.control.units import reference # reference pipeline -from modules import errors, shared, progress, ui_components, ui_symbols, ui_common, ui_sections, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports +from modules import errors, shared, progress, ui_common, ui_sections, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports from modules import ui_control_helpers as helpers @@ -218,7 +211,7 @@ def create_ui(_blocks: gr.Blocks=None): gr.HTML('Output

    ') with gr.Tabs(elem_classes=['control-tabs'], elem_id='control-tab-output') as output_tabs: with gr.Tab('Gallery', id='out-gallery'): - output_gallery, _output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height) + output_gallery, output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height, result_info=result_txt) with gr.Tab('Image', id='out-image'): output_image = gr.Image(label="Output", show_label=False, type="pil", interactive=False, tool="editor", height=gr_height, elem_id='control_output_image', elem_classes=['control-image']) with gr.Tab('Video', id='out-video'): @@ -229,312 +222,9 @@ def create_ui(_blocks: gr.Blocks=None): with gr.Tab('Preview', id='preview-image') as _tab_preview: preview_process = gr.Image(label="Preview", show_label=False, type="pil", interactive=False, height=gr_height, visible=True, elem_id='control_preview', elem_classes=['control-image']) - with gr.Accordion('Control elements', open=False, elem_id="control_elements"): - with gr.Tabs(elem_id='control-tabs') as _tabs_control_type: - with gr.Tab('ControlNet') as _tab_controlnet: - gr.HTML('
    ControlNet') - with gr.Row(): - extra_controls = [ - gr.Checkbox(label="Guess mode", value=False, scale=3), - ] - num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) - controlnet_ui_units = [] # list of hidable accordions - for i in range(max_units): - enabled = True if i==0 else False - with gr.Accordion(f'ControlNet unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui: - with gr.Row(): - enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') - process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') - model_id = gr.Dropdown(label="ControlNet", choices=controlnet.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') - ui_common.create_refresh_button(model_id, controlnet.list_models, lambda: {"choices": controlnet.list_models(refresh=True)}, f'controlnet_models_{i}_refresh') - control_mode = gr.Dropdown(label="CN Mode", choices=['default'], value='default', visible=False, elem_id=f'control_unit-{i}-mode') - model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=2.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') - control_start = gr.Slider(label="CN Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start') - control_end = gr.Slider(label="CN End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end') - control_tile = gr.Dropdown(label="CN Tiles", choices=[x.strip() for x in shared.opts.control_tiles.split(',') if 'x' in x], value='1x1', visible=False, elem_id=f'control_unit-{i}-tile') - reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnet_unit-{i}-reset') - image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnet_unit-{i}-upload') - image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnet_unit-{i}-reuse') - btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnet_unit-{i}-preview') - image_preview = gr.Image(label="Input", type="pil", height=128, width=128, visible=False, interactive=True, show_label=False, show_download_button=False, container=False, elem_id=f'controlnet_unit-{i}-override') - controlnet_ui_units.append(unit_ui) - units.append(unit.Unit( - unit_type = 'controlnet', - index = i, - enabled = enabled, - result_txt = result_txt, - enabled_cb = enabled_cb, - reset_btn = reset_btn, - process_id = process_id, - model_id = model_id, - model_strength = model_strength, - preview_process = preview_process, - preview_btn = btn_preview, - image_upload = image_upload, - image_reuse = image_reuse, - image_preview = image_preview, - control_start = control_start, - control_end = control_end, - control_mode = control_mode, - control_tile = control_tile, - extra_controls = extra_controls, - ) - ) - if i == 0: - units[-1].enabled = True # enable first unit in group - num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnet_ui_units) - - with gr.Tab('T2I Adapter') as _tab_t2iadapter: - gr.HTML('T2I-Adapter') - with gr.Row(): - extra_controls = [ - gr.Slider(label="Control factor", minimum=0.0, maximum=1.0, step=0.05, value=1.0, scale=3), - ] - num_adapter_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) - adapter_ui_units = [] # list of hidable accordions - for i in range(max_units): - enabled = True if i==0 else False - with gr.Accordion(f'T2I-Adapter unit {i+1}', visible= i < num_adapter_units.value, elem_classes='control-unit') as unit_ui: - with gr.Row(): - enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') - process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') - model_id = gr.Dropdown(label="Adapter", choices=t2iadapter.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') - ui_common.create_refresh_button(model_id, t2iadapter.list_models, lambda: {"choices": t2iadapter.list_models(refresh=True)}, f'adapter_models_{i}_refresh') - model_strength = gr.Slider(label="T2I Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') - reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'adapter_unit-{i}-reset') - image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'adapter_unit-{i}-upload') - image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'adapter_unit-{i}-reuse') - btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'adapter_unit-{i}-preview') - image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'adapter_unit-{i}-override') - adapter_ui_units.append(unit_ui) - units.append(unit.Unit( - unit_type = 't2i adapter', - index = i, - enabled = enabled, - result_txt = result_txt, - enabled_cb = enabled_cb, - reset_btn = reset_btn, - process_id = process_id, - model_id = model_id, - model_strength = model_strength, - preview_process = preview_process, - preview_btn = btn_preview, - image_upload = image_upload, - image_reuse = image_reuse, - image_preview = image_preview, - extra_controls = extra_controls, - ) - ) - if i == 0: - units[-1].enabled = True # enable first unit in group - num_adapter_units.change(fn=helpers.display_units, inputs=[num_adapter_units], outputs=adapter_ui_units) - - with gr.Tab('XS') as _tab_controlnetxs: - gr.HTML('ControlNet XS') - with gr.Row(): - extra_controls = [ - gr.Slider(label="Time embedding mix", minimum=0.0, maximum=1.0, step=0.05, value=0.0, scale=3) - ] - num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) - controlnetxs_ui_units = [] # list of hidable accordions - for i in range(max_units): - enabled = True if i==0 else False - with gr.Accordion(f'ControlNet-XS unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui: - with gr.Row(): - enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') - process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') - model_id = gr.Dropdown(label="ControlNet-XS", choices=xs.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') - ui_common.create_refresh_button(model_id, xs.list_models, lambda: {"choices": xs.list_models(refresh=True)}, f'xs_models_{i}_refresh') - model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') - control_start = gr.Slider(label="Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start') - control_end = gr.Slider(label="End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end') - reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnetxs_unit-{i}-reset') - image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnetxs_unit-{i}-upload') - image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnetxs_unit-{i}-reuse') - btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnetxs_unit-{i}-preview') - image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'controlnetxs_unit-{i}-override') - controlnetxs_ui_units.append(unit_ui) - units.append(unit.Unit( - unit_type = 'xs', - index = i, - enabled = enabled, - result_txt = result_txt, - enabled_cb = enabled_cb, - reset_btn = reset_btn, - process_id = process_id, - model_id = model_id, - model_strength = model_strength, - preview_process = preview_process, - preview_btn = btn_preview, - image_upload = image_upload, - image_reuse = image_reuse, - image_preview = image_preview, - control_start = control_start, - control_end = control_end, - extra_controls = extra_controls, - ) - ) - if i == 0: - units[-1].enabled = True # enable first unit in group - num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnetxs_ui_units) - - with gr.Tab('Lite') as _tab_lite: - gr.HTML('Control LLLite') - with gr.Row(): - extra_controls = [ - ] - num_lite_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) - lite_ui_units = [] # list of hidable accordions - for i in range(max_units): - enabled = True if i==0 else False - with gr.Accordion(f'Control-LLLite unit {i+1}', visible= i < num_lite_units.value, elem_classes='control-unit') as unit_ui: - with gr.Row(): - enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') - process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') - model_id = gr.Dropdown(label="Model", choices=lite.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') - ui_common.create_refresh_button(model_id, lite.list_models, lambda: {"choices": lite.list_models(refresh=True)}, f'lite_models_{i}_refresh') - model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') - reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'lite_unit-{i}-reset') - image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'lite_unit-{i}-upload') - image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'lite_unit-{i}-reuse') - image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'lite_unit-{i}-override') - btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'lite_unit-{i}-preview') - lite_ui_units.append(unit_ui) - units.append(unit.Unit( - unit_type = 'lite', - index = i, - enabled = enabled, - result_txt = result_txt, - enabled_cb = enabled_cb, - reset_btn = reset_btn, - process_id = process_id, - model_id = model_id, - model_strength = model_strength, - preview_process = preview_process, - preview_btn = btn_preview, - image_upload = image_upload, - image_reuse = image_reuse, - image_preview = image_preview, - extra_controls = extra_controls, - ) - ) - if i == 0: - units[-1].enabled = True # enable first unit in group - num_lite_units.change(fn=helpers.display_units, inputs=[num_lite_units], outputs=lite_ui_units) - - with gr.Tab('Reference') as _tab_reference: - gr.HTML('ControlNet reference-only control') - with gr.Row(): - extra_controls = [ - gr.Radio(label="Reference context", choices=['Attention', 'Adain', 'Attention Adain'], value='Attention', interactive=True), - gr.Slider(label="Style fidelity", minimum=0.0, maximum=1.0, step=0.05, value=0.5, interactive=True), # prompt vs control importance - gr.Slider(label="Reference query weight", minimum=0.0, maximum=1.0, step=0.05, value=1.0, interactive=True), - gr.Slider(label="Reference adain weight", minimum=0.0, maximum=2.0, step=0.05, value=1.0, interactive=True), - ] - for i in range(1): # can only have one reference unit - enabled = True if i==0 else False - with gr.Accordion(f'Reference unit {i+1}', visible=True, elem_classes='control-unit') as unit_ui: - with gr.Row(): - enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') - model_id = gr.Dropdown(label="Reference", choices=reference.list_models(), value='Reference', visible=False, elem_id=f'control_unit-{i}-model_name') - model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, visible=False, elem_id=f'control_unit-{i}-strength') - reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'reference_unit-{i}-reset') - image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'reference_unit-{i}-upload') - image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'reference_unit-{i}-reuse') - image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'reference_unit-{i}-override') - btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'reference_unit-{i}-preview') - units.append(unit.Unit( - unit_type = 'reference', - index = i, - enabled = enabled, - result_txt = result_txt, - enabled_cb = enabled_cb, - reset_btn = reset_btn, - process_id = process_id, - model_id = model_id, - model_strength = model_strength, - preview_process = preview_process, - preview_btn = btn_preview, - image_upload = image_upload, - image_reuse = image_reuse, - image_preview = image_preview, - extra_controls = extra_controls, - ) - ) - if i == 0: - units[-1].enabled = True # enable first unit in group - - with gr.Accordion('Control settings', open=False, elem_classes=['control-settings']) as _tab_settings: - with gr.Group(elem_classes=['processor-group']): - settings = [] - with gr.Accordion('Global', open=True, elem_classes=['processor-settings']): - control_hires = gr.Checkbox(label="Use control during hires", value=shared.opts.control_hires, elem_id='control_hires') - def set_control_hires(value): - shared.opts.control_active = value - control_hires.change(fn=set_control_hires, inputs=[control_hires], outputs=[]) - control_max_units = gr.Slider(label="Maximum units", minimum=1, maximum=10, step=1, value=shared.opts.control_max_units, elem_id='control_max_units') - def set_control_max_units(value): - shared.opts.control_max_units = value - control_max_units.change(fn=set_control_max_units, inputs=[control_max_units], outputs=[]) - control_tiles = gr.Textbox(label="Tiling options", value=shared.opts.control_tiles, elem_id='control_tiles') - def set_control_tiles(value): - shared.opts.control_tiles = value - control_tiles.change(fn=set_control_tiles, inputs=[control_tiles], outputs=[]) - control_move_processor = gr.Checkbox(label="Move processor to CPU after use", value=shared.opts.control_move_processor, elem_id='control_move_processor') - def set_control_move_processor(value): - shared.opts.control_move_processor = value - control_move_processor.change(fn=set_control_move_processor, inputs=[control_move_processor], outputs=[]) - control_unload_processor = gr.Checkbox(label="Unload processor after use", value=shared.opts.control_unload_processor, elem_id='control_unload_processor') - def set_control_unload_processor(value): - shared.opts.control_unload_processor = value - control_unload_processor.change(fn=set_control_unload_processor, inputs=[control_unload_processor], outputs=[]) - - with gr.Accordion('HED', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Scribble", value=False)) - with gr.Accordion('Midas depth', open=True, elem_classes=['processor-settings']): - settings.append(gr.Slider(label="Background threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) - settings.append(gr.Checkbox(label="Depth and normal", value=False)) - with gr.Accordion('MLSD', open=True, elem_classes=['processor-settings']): - settings.append(gr.Slider(label="Score threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) - settings.append(gr.Slider(label="Distance threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) - with gr.Accordion('OpenBody', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Body", value=True)) - settings.append(gr.Checkbox(label="Hands", value=False)) - settings.append(gr.Checkbox(label="Face", value=False)) - with gr.Accordion('PidiNet', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Scribble", value=False)) - settings.append(gr.Checkbox(label="Apply filter", value=False)) - with gr.Accordion('LineArt', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Coarse", value=False)) - with gr.Accordion('Leres Depth', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Boost", value=False)) - settings.append(gr.Slider(label="Near threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0)) - settings.append(gr.Slider(label="Depth threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0)) - with gr.Accordion('MediaPipe Face', open=True, elem_classes=['processor-settings']): - settings.append(gr.Slider(label="Max faces", minimum=1, maximum=10, step=1, value=1)) - settings.append(gr.Slider(label="Face confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.5)) - with gr.Accordion('Canny', open=True, elem_classes=['processor-settings']): - settings.append(gr.Slider(label="Low threshold", minimum=0, maximum=1000, step=1, value=100)) - settings.append(gr.Slider(label="High threshold", minimum=0, maximum=1000, step=1, value=200)) - with gr.Accordion('DWPose', open=True, elem_classes=['processor-settings']): - settings.append(gr.Radio(label="Pose Model", choices=['Tiny', 'Medium', 'Large'], value='Tiny')) - settings.append(gr.Slider(label="Pose confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.3)) - with gr.Accordion('SegmentAnything', open=True, elem_classes=['processor-settings']): - settings.append(gr.Radio(label="Segment Model", choices=['Base', 'Large'], value='Base')) - with gr.Accordion('Edge', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Parameter free", value=True)) - settings.append(gr.Radio(label="Edge mode", choices=['edge', 'gradient'], value='edge')) - with gr.Accordion('Zoe Depth', open=True, elem_classes=['processor-settings']): - settings.append(gr.Checkbox(label="Gamma corrected", value=False)) - with gr.Accordion('Marigold Depth', open=True, elem_classes=['processor-settings']): - settings.append(gr.Dropdown(label="Color map", choices=['None'] + plt.colormaps(), value='None')) - settings.append(gr.Slider(label="Denoising steps", minimum=1, maximum=99, step=1, value=10)) - settings.append(gr.Slider(label="Ensemble size", minimum=1, maximum=99, step=1, value=10)) - with gr.Accordion('Depth Anything', open=True, elem_classes=['processor-settings']): - settings.append(gr.Dropdown(label="Depth map", choices=['none'] + masking.COLORMAP, value='inferno')) - for setting in settings: - setting.change(fn=processors.update_settings, inputs=settings, outputs=[]) + from modules.ui_control_elements import create_ui_elements + create_ui_elements(units, result_txt, preview_process) with gr.Row(elem_id="control_script_container"): input_script_args = scripts_manager.scripts_current.setup_ui(parent='control', accordion=True) diff --git a/modules/ui_control_elements.py b/modules/ui_control_elements.py new file mode 100644 index 000000000..21f7b4ca5 --- /dev/null +++ b/modules/ui_control_elements.py @@ -0,0 +1,321 @@ +import gradio as gr +import matplotlib.pyplot as plt +from modules.control import unit +from modules.control import processors # patrickvonplaten controlnet_aux +from modules.control.units import controlnet # lllyasviel ControlNet +from modules.control.units import xs # vislearn ControlNet-XS +from modules.control.units import lite # vislearn ControlNet-XS +from modules.control.units import t2iadapter # TencentARC T2I-Adapter +from modules.control.units import reference # reference pipeline +from modules import shared, ui_components, ui_symbols, ui_common, masking # pylint: disable=ungrouped-imports +from modules import ui_control_helpers as helpers + + +def create_ui_elements(units, result_txt, preview_process): + max_units = shared.opts.control_max_units + with gr.Accordion('Control elements', open=False, elem_id="control_elements"): + with gr.Tabs(elem_id='control-tabs') as _tabs_control_type: + + with gr.Tab('ControlNet') as _tab_controlnet: + gr.HTML('ControlNet') + with gr.Row(): + extra_controls = [ + gr.Checkbox(label="Guess mode", value=False, scale=3), + ] + num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) + controlnet_ui_units = [] # list of hidable accordions + for i in range(max_units): + enabled = True if i==0 else False + with gr.Accordion(f'ControlNet unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui: + with gr.Row(): + enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') + process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') + model_id = gr.Dropdown(label="ControlNet", choices=controlnet.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') + ui_common.create_refresh_button(model_id, controlnet.list_models, lambda: {"choices": controlnet.list_models(refresh=True)}, f'controlnet_models_{i}_refresh') + control_mode = gr.Dropdown(label="CN Mode", choices=['default'], value='default', visible=False, elem_id=f'control_unit-{i}-mode') + model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=2.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') + control_start = gr.Slider(label="CN Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start') + control_end = gr.Slider(label="CN End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end') + control_tile = gr.Dropdown(label="CN Tiles", choices=[x.strip() for x in shared.opts.control_tiles.split(',') if 'x' in x], value='1x1', visible=False, elem_id=f'control_unit-{i}-tile') + reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnet_unit-{i}-reset') + image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnet_unit-{i}-upload') + image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnet_unit-{i}-reuse') + btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnet_unit-{i}-preview') + image_preview = gr.Image(label="Input", type="pil", height=128, width=128, visible=False, interactive=True, show_label=False, show_download_button=False, container=False, elem_id=f'controlnet_unit-{i}-override') + controlnet_ui_units.append(unit_ui) + units.append(unit.Unit( + unit_type = 'controlnet', + index = i, + enabled = enabled, + result_txt = result_txt, + enabled_cb = enabled_cb, + reset_btn = reset_btn, + process_id = process_id, + model_id = model_id, + model_strength = model_strength, + preview_process = preview_process, + preview_btn = btn_preview, + image_upload = image_upload, + image_reuse = image_reuse, + image_preview = image_preview, + control_start = control_start, + control_end = control_end, + control_mode = control_mode, + control_tile = control_tile, + extra_controls = extra_controls, + ) + ) + if i == 0: + units[-1].enabled = True # enable first unit in group + num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnet_ui_units) + + with gr.Tab('T2I Adapter') as _tab_t2iadapter: + gr.HTML('T2I-Adapter') + with gr.Row(): + extra_controls = [ + gr.Slider(label="Control factor", minimum=0.0, maximum=1.0, step=0.05, value=1.0, scale=3), + ] + num_adapter_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) + adapter_ui_units = [] # list of hidable accordions + for i in range(max_units): + enabled = True if i==0 else False + with gr.Accordion(f'T2I-Adapter unit {i+1}', visible= i < num_adapter_units.value, elem_classes='control-unit') as unit_ui: + with gr.Row(): + enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') + process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') + model_id = gr.Dropdown(label="Adapter", choices=t2iadapter.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') + ui_common.create_refresh_button(model_id, t2iadapter.list_models, lambda: {"choices": t2iadapter.list_models(refresh=True)}, f'adapter_models_{i}_refresh') + model_strength = gr.Slider(label="T2I Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') + reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'adapter_unit-{i}-reset') + image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'adapter_unit-{i}-upload') + image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'adapter_unit-{i}-reuse') + btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'adapter_unit-{i}-preview') + image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'adapter_unit-{i}-override') + adapter_ui_units.append(unit_ui) + units.append(unit.Unit( + unit_type = 't2i adapter', + index = i, + enabled = enabled, + result_txt = result_txt, + enabled_cb = enabled_cb, + reset_btn = reset_btn, + process_id = process_id, + model_id = model_id, + model_strength = model_strength, + preview_process = preview_process, + preview_btn = btn_preview, + image_upload = image_upload, + image_reuse = image_reuse, + image_preview = image_preview, + extra_controls = extra_controls, + ) + ) + if i == 0: + units[-1].enabled = True # enable first unit in group + num_adapter_units.change(fn=helpers.display_units, inputs=[num_adapter_units], outputs=adapter_ui_units) + + with gr.Tab('XS') as _tab_controlnetxs: + gr.HTML('ControlNet XS') + with gr.Row(): + extra_controls = [ + gr.Slider(label="Time embedding mix", minimum=0.0, maximum=1.0, step=0.05, value=0.0, scale=3) + ] + num_controlnet_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) + controlnetxs_ui_units = [] # list of hidable accordions + for i in range(max_units): + enabled = True if i==0 else False + with gr.Accordion(f'ControlNet-XS unit {i+1}', visible= i < num_controlnet_units.value, elem_classes='control-unit') as unit_ui: + with gr.Row(): + enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') + process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') + model_id = gr.Dropdown(label="ControlNet-XS", choices=xs.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') + ui_common.create_refresh_button(model_id, xs.list_models, lambda: {"choices": xs.list_models(refresh=True)}, f'xs_models_{i}_refresh') + model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') + control_start = gr.Slider(label="Start", minimum=0.0, maximum=1.0, step=0.05, value=0, elem_id=f'control_unit-{i}-start') + control_end = gr.Slider(label="End", minimum=0.0, maximum=1.0, step=0.05, value=1.0, elem_id=f'control_unit-{i}-end') + reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'controlnetxs_unit-{i}-reset') + image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'controlnetxs_unit-{i}-upload') + image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'controlnetxs_unit-{i}-reuse') + btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'controlnetxs_unit-{i}-preview') + image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'controlnetxs_unit-{i}-override') + controlnetxs_ui_units.append(unit_ui) + units.append(unit.Unit( + unit_type = 'xs', + index = i, + enabled = enabled, + result_txt = result_txt, + enabled_cb = enabled_cb, + reset_btn = reset_btn, + process_id = process_id, + model_id = model_id, + model_strength = model_strength, + preview_process = preview_process, + preview_btn = btn_preview, + image_upload = image_upload, + image_reuse = image_reuse, + image_preview = image_preview, + control_start = control_start, + control_end = control_end, + extra_controls = extra_controls, + ) + ) + if i == 0: + units[-1].enabled = True # enable first unit in group + num_controlnet_units.change(fn=helpers.display_units, inputs=[num_controlnet_units], outputs=controlnetxs_ui_units) + + with gr.Tab('Lite') as _tab_lite: + gr.HTML('Control LLLite') + with gr.Row(): + extra_controls = [ + ] + num_lite_units = gr.Slider(label="Units", minimum=1, maximum=max_units, step=1, value=1, scale=1) + lite_ui_units = [] # list of hidable accordions + for i in range(max_units): + enabled = True if i==0 else False + with gr.Accordion(f'Control-LLLite unit {i+1}', visible= i < num_lite_units.value, elem_classes='control-unit') as unit_ui: + with gr.Row(): + enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') + process_id = gr.Dropdown(label="Processor", choices=processors.list_models(), value='None', elem_id=f'control_unit-{i}-process_name') + model_id = gr.Dropdown(label="Model", choices=lite.list_models(), value='None', elem_id=f'control_unit-{i}-model_name') + ui_common.create_refresh_button(model_id, lite.list_models, lambda: {"choices": lite.list_models(refresh=True)}, f'lite_models_{i}_refresh') + model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, elem_id=f'control_unit-{i}-strength') + reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'lite_unit-{i}-reset') + image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'lite_unit-{i}-upload') + image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'lite_unit-{i}-reuse') + image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'lite_unit-{i}-override') + btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'lite_unit-{i}-preview') + lite_ui_units.append(unit_ui) + units.append(unit.Unit( + unit_type = 'lite', + index = i, + enabled = enabled, + result_txt = result_txt, + enabled_cb = enabled_cb, + reset_btn = reset_btn, + process_id = process_id, + model_id = model_id, + model_strength = model_strength, + preview_process = preview_process, + preview_btn = btn_preview, + image_upload = image_upload, + image_reuse = image_reuse, + image_preview = image_preview, + extra_controls = extra_controls, + ) + ) + if i == 0: + units[-1].enabled = True # enable first unit in group + num_lite_units.change(fn=helpers.display_units, inputs=[num_lite_units], outputs=lite_ui_units) + + with gr.Tab('Reference') as _tab_reference: + gr.HTML('ControlNet reference-only control') + with gr.Row(): + extra_controls = [ + gr.Radio(label="Reference context", choices=['Attention', 'Adain', 'Attention Adain'], value='Attention', interactive=True), + gr.Slider(label="Style fidelity", minimum=0.0, maximum=1.0, step=0.05, value=0.5, interactive=True), # prompt vs control importance + gr.Slider(label="Reference query weight", minimum=0.0, maximum=1.0, step=0.05, value=1.0, interactive=True), + gr.Slider(label="Reference adain weight", minimum=0.0, maximum=2.0, step=0.05, value=1.0, interactive=True), + ] + for i in range(1): # can only have one reference unit + enabled = True if i==0 else False + with gr.Accordion(f'Reference unit {i+1}', visible=True, elem_classes='control-unit') as unit_ui: + with gr.Row(): + enabled_cb = gr.Checkbox(enabled, label='Active', container=False, show_label=True, elem_id=f'control_unit-{i}-enabled') + model_id = gr.Dropdown(label="Reference", choices=reference.list_models(), value='Reference', visible=False, elem_id=f'control_unit-{i}-model_name') + model_strength = gr.Slider(label="CN Strength", minimum=0.01, maximum=1.0, step=0.01, value=1.0, visible=False, elem_id=f'control_unit-{i}-strength') + reset_btn = ui_components.ToolButton(value=ui_symbols.reset, elem_id=f'reference_unit-{i}-reset') + image_upload = gr.UploadButton(label=ui_symbols.upload, file_types=['image'], elem_classes=['form', 'gradio-button', 'tool'], elem_id=f'reference_unit-{i}-upload') + image_reuse= ui_components.ToolButton(value=ui_symbols.reuse, elem_id=f'reference_unit-{i}-reuse') + image_preview = gr.Image(label="Input", show_label=False, type="pil", interactive=False, height=128, width=128, visible=False, elem_id=f'reference_unit-{i}-override') + btn_preview= ui_components.ToolButton(value=ui_symbols.preview, elem_id=f'reference_unit-{i}-preview') + units.append(unit.Unit( + unit_type = 'reference', + index = i, + enabled = enabled, + result_txt = result_txt, + enabled_cb = enabled_cb, + reset_btn = reset_btn, + process_id = process_id, + model_id = model_id, + model_strength = model_strength, + preview_process = preview_process, + preview_btn = btn_preview, + image_upload = image_upload, + image_reuse = image_reuse, + image_preview = image_preview, + extra_controls = extra_controls, + ) + ) + if i == 0: + units[-1].enabled = True # enable first unit in group + + with gr.Accordion('Control settings', open=False, elem_classes=['control-settings']) as _tab_settings: + with gr.Group(elem_classes=['processor-group']): + settings = [] + with gr.Accordion('Global', open=True, elem_classes=['processor-settings']): + control_hires = gr.Checkbox(label="Use control during hires", value=shared.opts.control_hires, elem_id='control_hires') + def set_control_hires(value): + shared.opts.control_active = value + control_hires.change(fn=set_control_hires, inputs=[control_hires], outputs=[]) + control_max_units = gr.Slider(label="Maximum units", minimum=1, maximum=10, step=1, value=shared.opts.control_max_units, elem_id='control_max_units') + def set_control_max_units(value): + shared.opts.control_max_units = value + control_max_units.change(fn=set_control_max_units, inputs=[control_max_units], outputs=[]) + control_tiles = gr.Textbox(label="Tiling options", value=shared.opts.control_tiles, elem_id='control_tiles') + def set_control_tiles(value): + shared.opts.control_tiles = value + control_tiles.change(fn=set_control_tiles, inputs=[control_tiles], outputs=[]) + control_move_processor = gr.Checkbox(label="Move processor to CPU after use", value=shared.opts.control_move_processor, elem_id='control_move_processor') + def set_control_move_processor(value): + shared.opts.control_move_processor = value + control_move_processor.change(fn=set_control_move_processor, inputs=[control_move_processor], outputs=[]) + control_unload_processor = gr.Checkbox(label="Unload processor after use", value=shared.opts.control_unload_processor, elem_id='control_unload_processor') + def set_control_unload_processor(value): + shared.opts.control_unload_processor = value + control_unload_processor.change(fn=set_control_unload_processor, inputs=[control_unload_processor], outputs=[]) + + with gr.Accordion('HED', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Scribble", value=False)) + with gr.Accordion('Midas depth', open=True, elem_classes=['processor-settings']): + settings.append(gr.Slider(label="Background threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) + settings.append(gr.Checkbox(label="Depth and normal", value=False)) + with gr.Accordion('MLSD', open=True, elem_classes=['processor-settings']): + settings.append(gr.Slider(label="Score threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) + settings.append(gr.Slider(label="Distance threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.1)) + with gr.Accordion('OpenBody', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Body", value=True)) + settings.append(gr.Checkbox(label="Hands", value=False)) + settings.append(gr.Checkbox(label="Face", value=False)) + with gr.Accordion('PidiNet', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Scribble", value=False)) + settings.append(gr.Checkbox(label="Apply filter", value=False)) + with gr.Accordion('LineArt', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Coarse", value=False)) + with gr.Accordion('Leres Depth', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Boost", value=False)) + settings.append(gr.Slider(label="Near threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0)) + settings.append(gr.Slider(label="Depth threshold", minimum=0.0, maximum=1.0, step=0.01, value=0.0)) + with gr.Accordion('MediaPipe Face', open=True, elem_classes=['processor-settings']): + settings.append(gr.Slider(label="Max faces", minimum=1, maximum=10, step=1, value=1)) + settings.append(gr.Slider(label="Face confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.5)) + with gr.Accordion('Canny', open=True, elem_classes=['processor-settings']): + settings.append(gr.Slider(label="Low threshold", minimum=0, maximum=1000, step=1, value=100)) + settings.append(gr.Slider(label="High threshold", minimum=0, maximum=1000, step=1, value=200)) + with gr.Accordion('DWPose', open=True, elem_classes=['processor-settings']): + settings.append(gr.Radio(label="Pose Model", choices=['Tiny', 'Medium', 'Large'], value='Tiny')) + settings.append(gr.Slider(label="Pose confidence", minimum=0.0, maximum=1.0, step=0.01, value=0.3)) + with gr.Accordion('SegmentAnything', open=True, elem_classes=['processor-settings']): + settings.append(gr.Radio(label="Segment Model", choices=['Base', 'Large'], value='Base')) + with gr.Accordion('Edge', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Parameter free", value=True)) + settings.append(gr.Radio(label="Edge mode", choices=['edge', 'gradient'], value='edge')) + with gr.Accordion('Zoe Depth', open=True, elem_classes=['processor-settings']): + settings.append(gr.Checkbox(label="Gamma corrected", value=False)) + with gr.Accordion('Marigold Depth', open=True, elem_classes=['processor-settings']): + settings.append(gr.Dropdown(label="Color map", choices=['None'] + plt.colormaps(), value='None')) + settings.append(gr.Slider(label="Denoising steps", minimum=1, maximum=99, step=1, value=10)) + settings.append(gr.Slider(label="Ensemble size", minimum=1, maximum=99, step=1, value=10)) + with gr.Accordion('Depth Anything', open=True, elem_classes=['processor-settings']): + settings.append(gr.Dropdown(label="Depth map", choices=['none'] + masking.COLORMAP, value='inferno')) + for setting in settings: + setting.change(fn=processors.update_settings, inputs=settings, outputs=[]) From ab82c172d5f1d6d1c190133c4981978726da912a Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 25 Sep 2025 14:02:21 -0400 Subject: [PATCH 054/230] handle nunchaku lora with unsupported models Signed-off-by: Vladimir Mandic --- modules/lora/lora_nunchaku.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lora/lora_nunchaku.py b/modules/lora/lora_nunchaku.py index 63a71b46f..d01238449 100644 --- a/modules/lora/lora_nunchaku.py +++ b/modules/lora/lora_nunchaku.py @@ -8,6 +8,9 @@ previously_loaded = [] # we maintain private state here def load_nunchaku(names, strengths): global previously_loaded # pylint: disable=global-statement + if not hasattr(shared.sd_model, 'transformer') or not hasattr(shared.sd_model.transformer, 'update_lora_params'): + shared.log.error(f'Network load: type=LoRA method=nunchaku model={shared.sd_model.__class__.__name__} unsupported') + return False strengths = [s[0] if isinstance(s, list) else s for s in strengths] networks = lora_load.gather_networks(names) networks = [(network, strength) for network, strength in zip(networks, strengths) if network is not None and strength > 0] @@ -27,7 +30,7 @@ def load_nunchaku(names, strengths): lora_common.timer.load = t1 - t0 shared.log.debug(f"Network load: type=LoRA method=nunchaku loras={names} strength={strengths} time={t1-t0:.3f}") except Exception as e: - shared.log.errors(f'Network load: type=LoRA method=nunchaku {e}') + shared.log.error(f'Network load: type=LoRA method=nunchaku {e}') if lora_common.debug: errors.display(e, 'LoRA') return is_changed From 01e8211d4b2d181ff09e31afd704623d72643f79 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 25 Sep 2025 14:17:40 -0400 Subject: [PATCH 055/230] cleanup Signed-off-by: Vladimir Mandic --- modules/ui_common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui_common.py b/modules/ui_common.py index fa0d1322f..f328351f5 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -22,7 +22,7 @@ def update_generation_info(generation_info, html_info, img_index): if len(generation_info) == 0 and processing.processed is not None: generation_info = processing.processed.js() or {} generation_json = json.loads(generation_info) - if len(generation_json["infotexts"]) == 0: + if len(generation_json.get("infotexts", [])) == 0: return html_info, 'no infotexts found' if img_index == -1: img_index = 0 @@ -32,7 +32,7 @@ def update_generation_info(generation_info, html_info, img_index): html_info_formatted = infotext_to_html(info) return html_info, html_info_formatted except Exception as e: - shared.log.warning(f'Update info: info="{generation_info}" {e}') + shared.log.trace(f'Update info: info="{generation_info}" {e}') return html_info, html_info From ae25cb88805d0046733b698ca5681e6bff6e23b1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 25 Sep 2025 14:33:21 -0400 Subject: [PATCH 056/230] linting Signed-off-by: Vladimir Mandic --- cli/localize.js | 7 ++++--- modules/sdnq/__init__.py | 2 +- modules/ui_control.py | 2 +- scripts/daam/hook.py | 6 +++--- scripts/daam/trace.py | 2 +- scripts/daam/utils.py | 2 -- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/cli/localize.js b/cli/localize.js index da870d455..12d289867 100755 --- a/cli/localize.js +++ b/cli/localize.js @@ -7,9 +7,10 @@ const { GoogleGenerativeAI } = require('@google/generative-ai'); const api_key = process.env.GOOGLE_AI_API_KEY; const model = 'gemini-2.5-flash'; -const prompt = ` -// eslint-disable-next-line max-len -Translate attached JSON from English to {language} using following rules: fields id, label and reload should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place. if field is less than 3 characters, do not translate it and keep it as is. Every JSON entry should have id, label, localized, reload and hint fields. Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`; +const prompt = `Translate attached JSON from English to {language} using following rules: fields id, label and reload should be preserved from original, field localized should be a translated version of field label and field hint should be translated in-place. +if field is less than 3 characters, do not translate it and keep it as is. +Every JSON entry should have id, label, localized, reload and hint fields. +Output should be pure JSON without any additional text. To better match translation, context of the text is related to Stable Diffusion and topic of Generative AI.`; const languages = { hr: 'Croatian', de: 'German', diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 71db2127f..6ba49cbb1 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -440,7 +440,7 @@ class SDNQQuantizer(DiffusersQuantizer): """ return missing_keys - def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: + def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ diff --git a/modules/ui_control.py b/modules/ui_control.py index ecfe1fa01..a1c77848d 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -211,7 +211,7 @@ def create_ui(_blocks: gr.Blocks=None): gr.HTML('Output

    ') with gr.Tabs(elem_classes=['control-tabs'], elem_id='control-tab-output') as output_tabs: with gr.Tab('Gallery', id='out-gallery'): - output_gallery, output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height, result_info=result_txt) + output_gallery, _output_gen_info, _output_html_info, _output_html_info_formatted, output_html_log = ui_common.create_output_panel("control", preview=False, prompt=prompt, height=gr_height, result_info=result_txt) with gr.Tab('Image', id='out-image'): output_image = gr.Image(label="Output", show_label=False, type="pil", interactive=False, tool="editor", height=gr_height, elem_id='control_output_image', elem_classes=['control-image']) with gr.Tab('Video', id='out-video'): diff --git a/scripts/daam/hook.py b/scripts/daam/hook.py index f82762c4e..7c2866b63 100644 --- a/scripts/daam/hook.py +++ b/scripts/daam/hook.py @@ -1,4 +1,4 @@ -from typing import List, Generic, TypeVar, Callable, Union, Any +from typing import List, Generic, TypeVar import functools import itertools @@ -23,7 +23,7 @@ class ObjectHooker(Generic[ModuleType]): def __init__(self, module: ModuleType): self.module: ModuleType = module self.hooked = False - self.old_state = dict() + self.old_state = {} def __enter__(self): self.hook() @@ -36,7 +36,7 @@ class ObjectHooker(Generic[ModuleType]): if self.hooked: raise RuntimeError('Already hooked module') - self.old_state = dict() + self.old_state = {} self.hooked = True self._hook_impl() diff --git a/scripts/daam/trace.py b/scripts/daam/trace.py index 1b6a6cd3f..625e3d402 100644 --- a/scripts/daam/trace.py +++ b/scripts/daam/trace.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import List, Type, Any, Dict, Tuple, Union +from typing import List, Type, Any, Dict, Union import math from diffusers import StableDiffusionPipeline, StableDiffusionXLPipeline diff --git a/scripts/daam/utils.py b/scripts/daam/utils.py index 8cfde13f2..15e2c1b5e 100644 --- a/scripts/daam/utils.py +++ b/scripts/daam/utils.py @@ -10,7 +10,6 @@ import matplotlib.pyplot as plt import numpy as np import spacy import torch -import torch.nn.functional as F __all__ = ['set_seed', 'compute_token_merge_indices', 'plot_mask_heat_map', 'cached_nlp', 'cache_dir', 'auto_device', 'auto_autocast'] @@ -102,7 +101,6 @@ def cached_nlp(prompt: str, type='en_core_web_md'): try: nlp = spacy.load(type) except OSError: - import os os.system(f'python -m spacy download {type}') nlp = spacy.load(type) From c2548353513de9ac1c3af1cddf6f5aa322d71e50 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 26 Sep 2025 10:14:02 -0400 Subject: [PATCH 057/230] fix lora strength Signed-off-by: Vladimir Mandic --- configs/Dockerfile.cuda | 4 ++-- modules/loader.py | 21 +++++++++++++-------- modules/lora/extra_networks_lora.py | 12 ++++++++++-- modules/ui_common.py | 2 ++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/configs/Dockerfile.cuda b/configs/Dockerfile.cuda index 4e5a496e1..b53a8872f 100644 --- a/configs/Dockerfile.cuda +++ b/configs/Dockerfile.cuda @@ -41,11 +41,11 @@ ENV SD_DOCKER=true # tcmalloc is not required but it is highly recommended ENV LD_PRELOAD=libtcmalloc.so.4 # sdnext will run all necessary pip install ops and then exit -RUN ["python", "/app/launch.py", "--debug", "--uv", "--use-cuda", "--log", "sdnext.log", "--test", "--optional"] +RUN ["python", "/app/launch.py", "--uv", "--use-cuda", "--log", "sdnext.log", "--test", "--optional"] # preinstall additional packages to avoid installation during runtime # actually run sdnext -CMD ["python", "launch.py", "--debug", "--skip-all", "--listen", "--quick", "--api-log", "--log", "sdnext.log"] +CMD ["python", "launch.py", "--listen", "--quick", "--log", "sdnext.log"] # expose port EXPOSE 7860 diff --git a/modules/loader.py b/modules/loader.py index efd58ff11..7ee969962 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -123,15 +123,20 @@ timer.startup.record("pydantic") import tqdm as tqdm_lib # pylint: disable=C0411 from tqdm.rich import tqdm # pylint: disable=W0611,C0411 -import diffusers.utils.import_utils # pylint: disable=W0611,C0411 -diffusers.utils.import_utils._k_diffusion_available = True # pylint: disable=protected-access # monkey-patch since we use k-diffusion from git -diffusers.utils.import_utils._k_diffusion_version = '0.0.12' # pylint: disable=protected-access +try: + import diffusers.utils.import_utils # pylint: disable=W0611,C0411 + diffusers.utils.import_utils._k_diffusion_available = True # pylint: disable=protected-access # monkey-patch since we use k-diffusion from git + diffusers.utils.import_utils._k_diffusion_version = '0.0.12' # pylint: disable=protected-access -import diffusers # pylint: disable=W0611,C0411 -import diffusers.loaders.single_file # pylint: disable=W0611,C0411 -diffusers.loaders.single_file.logging.tqdm = partial(tqdm, unit='C') -logging.getLogger("diffusers.loaders.single_file").setLevel(logging.ERROR) -timer.startup.record("diffusers") + import diffusers # pylint: disable=W0611,C0411 + import diffusers.loaders.single_file # pylint: disable=W0611,C0411 + diffusers.loaders.single_file.logging.tqdm = partial(tqdm, unit='C') + logging.getLogger("diffusers.loaders.single_file").setLevel(logging.ERROR) + timer.startup.record("diffusers") +except Exception as e: + errors.log.error(f'Loader: diffusers=={diffusers.__version__ if "diffusers" in sys.modules else None} {e}') + errors.log.error('Please restart re-run the installer') + sys.exit(1) import huggingface_hub # pylint: disable=W0611,C0411 timer.startup.record("hfhub") diff --git a/modules/lora/extra_networks_lora.py b/modules/lora/extra_networks_lora.py index 6370ef7df..ee657d2d1 100644 --- a/modules/lora/extra_networks_lora.py +++ b/modules/lora/extra_networks_lora.py @@ -83,6 +83,13 @@ def infotext(p): p.extra_generation_params["LoRA hashes"] = ", ".join(network_hashes) +def to_float(value): + try: + return float(value) + except (ValueError, TypeError): + return value + + def parse(p, params_list, step=0): names = [] te_multipliers = [] @@ -93,6 +100,7 @@ def parse(p, params_list, step=0): names.append(params.positional[0]) default_multiplier = params.positional[1] if len(params.positional) > 1 else shared.opts.extra_networks_default_multiplier + default_multiplier = to_float(default_multiplier) if isinstance(default_multiplier, str) and "@" not in default_multiplier: default_multiplier = shared.opts.extra_networks_default_multiplier @@ -100,7 +108,7 @@ def parse(p, params_list, step=0): if isinstance(te_multiplier, str) and "@" in te_multiplier: te_multiplier = get_stepwise(te_multiplier, step, p.steps) else: - te_multiplier = float(te_multiplier) + te_multiplier = to_float(te_multiplier) unet_multiplier = 3 * [params.named.get("unet", te_multiplier)] # fill all 3 with same value unet_multiplier[0] = params.named.get("in", unet_multiplier[0]) @@ -110,7 +118,7 @@ def parse(p, params_list, step=0): if isinstance(unet_multiplier[i], str) and "@" in unet_multiplier[i]: unet_multiplier[i] = get_stepwise(unet_multiplier[i], step, p.steps) else: - unet_multiplier[i] = float(unet_multiplier[i]) + unet_multiplier[i] = to_float(unet_multiplier[i]) dyn_dim = int(params.named["dyn"]) if "dyn" in params.named else None te_multipliers.append(te_multiplier) diff --git a/modules/ui_common.py b/modules/ui_common.py index f328351f5..7fa684190 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -21,6 +21,8 @@ def update_generation_info(generation_info, html_info, img_index): try: if len(generation_info) == 0 and processing.processed is not None: generation_info = processing.processed.js() or {} + if len(generation_info) == 0: + return html_info, html_info generation_json = json.loads(generation_info) if len(generation_json.get("infotexts", [])) == 0: return html_info, 'no infotexts found' From bd048e8efc9b5180c2b339ce65e82664f9f8ebf4 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 26 Sep 2025 12:28:52 -0400 Subject: [PATCH 058/230] framepack: patch solver for unsupported gpus Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 5 ++-- modules/framepack/framepack_worker.py | 4 +-- modules/framepack/pipeline/uni_pc_fm.py | 36 ++++++++++++++++++++++--- wiki | 2 +- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45ac06a67..05964ddde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,10 +54,11 @@ - **Fixes** - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load + - framepack: patch solver for unsupported gpus - benchmark: remove forced sampler from system info benchmark - xyz-grid: fix xyz grid with random seeds - - fix download for sd15/sdxl reference models - + - reference: fix download for sd15/sdxl reference models + ## Update for 2025-09-15 ### Highlights for 2025-09-15 diff --git a/modules/framepack/framepack_worker.py b/modules/framepack/framepack_worker.py index 1b87334ec..eedbad13b 100644 --- a/modules/framepack/framepack_worker.py +++ b/modules/framepack/framepack_worker.py @@ -54,7 +54,7 @@ def worker( from modules.framepack.pipeline import hunyuan from modules.framepack.pipeline import utils - from modules.framepack.pipeline.k_diffusion_hunyuan import sample_hunyuan + from modules.framepack.pipeline import k_diffusion_hunyuan is_f1 = variant == 'forward-only' total_generated_frames = 0 @@ -244,7 +244,7 @@ def worker( transformer.initialize_teacache(enable_teacache=use_teacache, num_steps=steps, rel_l1_thresh=shared.opts.teacache_thresh) t_sample = time.time() - generated_latents = sample_hunyuan( + generated_latents = k_diffusion_hunyuan.sample_hunyuan( transformer=transformer, sampler='unipc', width=width, diff --git a/modules/framepack/pipeline/uni_pc_fm.py b/modules/framepack/pipeline/uni_pc_fm.py index 6ce7c15ce..2066cd8e3 100644 --- a/modules/framepack/pipeline/uni_pc_fm.py +++ b/modules/framepack/pipeline/uni_pc_fm.py @@ -5,7 +5,7 @@ import torch - +import numpy as np from tqdm.auto import trange @@ -13,6 +13,36 @@ def expand_dims(v, dims): return v[(...,) + (None,) * (dims - 1)] +torch_linalg_solve = None + + +def test_solver(): + from modules import devices, shared + try: + a = torch.randn(50, 50).to(device=devices.device, dtype=torch.float32) + b = torch.randn(50, 2).to(device=devices.device, dtype=torch.float32) + _x = torch.linalg.solve(a, b) + return True + except Exception as e: + shared.log.debug(f'FramePack: solver=cpu {e}') + return False + + +def linalg_solve(A, B, device): + global torch_linalg_solve # pylint: disable=global-statement + if torch_linalg_solve is None: + torch_linalg_solve = test_solver() + if torch_linalg_solve: + X = torch.linalg.solve(A, B) + return X + else: + A_np = A.float().cpu().numpy() + B_np = B.float().cpu().numpy() + X_np = np.linalg.solve(A_np, B_np) + X = torch.from_numpy(X_np).to(device=device, dtype=A.dtype) + return X + + class FlowMatchUniPC: def __init__(self, model, extra_args, variant='bh1'): self.model = model @@ -78,7 +108,7 @@ class FlowMatchUniPC: if order == 2: rhos_p = torch.tensor([0.5], device=b.device) else: - rhos_p = torch.linalg.solve(R[:-1, :-1], b[:-1]) + rhos_p = linalg_solve(R[:-1, :-1], b[:-1], x.device) else: D1s = None rhos_p = None @@ -86,7 +116,7 @@ class FlowMatchUniPC: if order == 1: rhos_c = torch.tensor([0.5], device=b.device) else: - rhos_c = torch.linalg.solve(R, b) + rhos_c = linalg_solve(R, b, x.device) x_t_ = expand_dims(t / t_prev_0, dims) * x - expand_dims(h_phi_1, dims) * model_prev_0 diff --git a/wiki b/wiki index 3df7dbfc9..bd9905932 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 3df7dbfc9c3e2f39c825f8d76541e13d3c3f097d +Subproject commit bd990593287f36d4c76828a2db0eaa019ca0630f From 7bc6edf4832cd6c536e13393695b56ed444244a0 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 26 Sep 2025 13:17:52 -0400 Subject: [PATCH 059/230] ui add connection monitor Signed-off-by: Vladimir Mandic --- .eslintrc.json | 3 ++- extensions-builtin/sdnext-modernui | 2 +- html/locale_en.json | 1 - javascript/monitor.js | 33 ++++++++++++++++++++++++++++++ javascript/ui.js | 1 + 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 javascript/monitor.js diff --git a/.eslintrc.json b/.eslintrc.json index 32283e620..81c196021 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -116,7 +116,8 @@ "idbDel": "readonly", "idbAdd": "readonly", "initChangelog": "readonly", - "sendNotification": "readonly" + "sendNotification": "readonly", + "monitorConnection": "readonly" }, "ignorePatterns": [ "node_modules", diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index a445b6b09..b189fac67 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit a445b6b09f3974f95d410f19575200109e1a8b83 +Subproject commit b189fac67d24bf21c9b65cf45add5b8c29f7456f diff --git a/html/locale_en.json b/html/locale_en.json index 8113a811b..056637d2b 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -32,7 +32,6 @@ {"id":"","label":"","localized":"","reload":"","hint":"Sort by time, descending"} ], "main": [ - {"id":"","label":"SD.Next","localized":"","reload":"","hint":"SD.Next
    All-in-one WebUI for AI generative image and video creation"}, {"id":"","label":"Prompt","localized":"","reload":"","hint":"Describe image you want to generate"}, {"id":"","label":"Start","localized":"","reload":"","hint":"Start"}, {"id":"","label":"End","localized":"","reload":"","hint":"End"}, diff --git a/javascript/monitor.js b/javascript/monitor.js new file mode 100644 index 000000000..1c194af08 --- /dev/null +++ b/javascript/monitor.js @@ -0,0 +1,33 @@ +async function updateIndicator(online, data, msg) { + const el = document.getElementById('logo_nav'); + if (!el || !data) return; + const status = online ? 'online' : 'offline'; + const template = ` + Version: ${data.updated}
    + Commit: ${data.hash}
    + Branch: ${data.branch}
    + Status: ${status}
    + `; + if (online) { + el.dataset.hint = template; + el.style.backgroundColor = 'var(--sd-main-accent-color)'; + log('monitorConnection: online', data); + } else { + el.dataset.hint = template; + el.style.backgroundColor = 'var(--color-error)'; + log('monitorConnection: offline', msg); + } +} + +async function monitorConnection() { + try { + const res = await fetch(`${window.api}/version`); + const data = await res.json(); + const url = res.url.split('/sdapi')[0].replace('http', 'ws'); // update global url as ws need fqdn + const ws = new WebSocket(`${url}/queue/join`); + ws.onopen = () => updateIndicator(true, data, ''); + ws.onclose = () => updateIndicator(false, data, ''); + ws.onerror = (e) => updateIndicator(false, data, e.message); + ws.onmessage = (evt) => log('monitorConnection: message', evt.data); + } catch { /**/ } +} diff --git a/javascript/ui.js b/javascript/ui.js index a61297a54..8c5cd6630 100644 --- a/javascript/ui.js +++ b/javascript/ui.js @@ -601,4 +601,5 @@ async function reconnectUI() { const sd_model_observer = new MutationObserver(sd_model_callback); sd_model_observer.observe(sd_model, { attributes: true, childList: true, subtree: true }); log('reconnectUI'); + monitorConnection(); } From 07a66b48154c653545a2605a0a8dc839e960074c Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 26 Sep 2025 13:25:17 -0400 Subject: [PATCH 060/230] ui add server connection status indicators Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ javascript/logMonitor.js | 1 + 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05964ddde..12627f6bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ - new feature to specify which models types not to offload in *settings -> model offloading -> model types not to offload* - **UI** + - **connection monitor** + main logo in top-left corner now indicates server connection status and hovering over it shows connection details - separate guidance and detail sections - networks ability to filter lora by base model version - **Other** diff --git a/javascript/logMonitor.js b/javascript/logMonitor.js index 08f104b55..21c03e88d 100644 --- a/javascript/logMonitor.js +++ b/javascript/logMonitor.js @@ -78,6 +78,7 @@ async function logMonitor() { for (const line of lines) addLogLine(line); if (!logConnected) { logConnected = true; + monitorConnection(); xhrPost(`${window.api}/log`, { debug: 'connected' }); } } else { From d63bc05b6ccc2b7ca2d22a6846599f4c121317a4 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 11:12:13 +0900 Subject: [PATCH 061/230] update rocm.py to detect rocm-sdk packages --- installer.py | 8 ++- modules/rocm.py | 112 ++++++++++++++++++++++++++++--------- modules/zluda_installer.py | 11 ++-- 3 files changed, 98 insertions(+), 33 deletions(-) diff --git a/installer.py b/installer.py index f05a5bb32..bc0612393 100644 --- a/installer.py +++ b/installer.py @@ -677,6 +677,10 @@ def install_rocm_zluda(): if args.skip_all or args.skip_requirements: return torch_command from modules import rocm + if rocm.err is not None: + log.warning(f'ROCm: error checking ROCm toolkit: {rocm.err}') + log.info('Using CPU-only torch') + return os.environ.get('TORCH_COMMAND', 'torch torchvision') if not rocm.is_installed: log.warning('ROCm: could not find ROCm toolkit installed') log.info('Using CPU-only torch') @@ -720,8 +724,8 @@ def install_rocm_zluda(): if sys.platform == "win32": #check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13') - if args.use_rocm and args.experimental and (sys.version_info.major, sys.version_info.minor) == (3, 12): # TODO install: switch to pytorch source when it becomes available - torch_command = os.environ.get('TORCH_COMMAND', '--no-cache-dir https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torch-2.8.0a0%2Bgitfc14c65-cp312-cp312-win_amd64.whl https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torchvision-0.24.0a0%2Bc85f008-cp312-cp312-win_amd64.whl') + if args.use_rocm: # TODO install: switch to pytorch source when it becomes available + torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{rocm.get_distribution(device)}') else: if args.device_id is not None: if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None: diff --git a/modules/rocm.py b/modules/rocm.py index 554c3af55..bf06ba3b9 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -6,6 +6,7 @@ import subprocess import importlib.metadata from typing import Union, List from enum import Enum +from installer import installed def resolve_link(path_: str) -> str: @@ -40,6 +41,33 @@ def conceal(): os.environ["PATH"] = ";".join(paths_no_rocm) +class Environment: + hip: ctypes.CDLL + + def __init__(self, path: str): + self.hip = ctypes.CDLL(path) + + +# rocm is installed system-wide +class ROCmEnvironment(Environment): + path: str + + def __init__(self, path: str): + for v in (6, 7): + lib = os.path.join(path, "bin", f"amdhip64_{v}.dll") + if os.path.exists(lib): + super().__init__(lib) + break + self.path = path + + +# rocm-sdk package is installed +class PythonPackageEnvironment(Environment): + def __init__(self): + import _rocm_sdk_core + super().__init__(os.path.join(_rocm_sdk_core.__path__[0], "bin", "amdhip64_7.dll")) + + class MicroArchitecture(Enum): GCN = "gcn" RDNA = "rdna" @@ -81,7 +109,7 @@ class Agent: self.blaslt_supported = os.path.exists(os.path.join(blaslt_tensile_libpath, f"Kernels.so-000-{name}.hsaco" if sys.platform == "win32" else f"extop_{name}.co")) def get_gfx_version(self) -> Union[str, None]: - if self.gfx_version >= 0x1101 and self.gfx_version < 0x1200: + if self.gfx_version >= 0x1100 and self.gfx_version < 0x1200: return "11.0.0" elif self.gfx_version != 0x1030 and self.gfx_version >= 0x1000 and self.gfx_version < 0x1100: # gfx1010 users had to override gfx version to 10.3.0 in Linux @@ -101,15 +129,23 @@ def get_version_torch() -> Union[str, None]: return version_.split("+rocm")[1] -if sys.platform == "win32": - def find() -> Union[str, None]: - hip_path = shutil.which("hipconfig") - if hip_path is not None: - return dirname(resolve_link(hip_path), 2) +def find() -> Union[Environment, None]: + hip_path = shutil.which("hipconfig") + if hip_path is not None: + py_path = os.path.dirname(sys.executable) + if hip_path.startswith(py_path): + try: + import _rocm_sdk_core # pylint: disable=unused-import + return PythonPackageEnvironment() + except ImportError: + pass + else: + return ROCmEnvironment(dirname(resolve_link(hip_path), 2)) + if sys.platform == "win32": hip_path = os.environ.get("HIP_PATH", None) if hip_path is not None: - return hip_path + return ROCmEnvironment(hip_path) program_files = os.environ.get('ProgramFiles', r'C:\Program Files') hip_path = rf'{program_files}\AMD\ROCm' @@ -146,29 +182,47 @@ if sys.platform == "win32": if latest is None: return None - return os.path.join(hip_path, str(latest)) + return ROCmEnvironment(os.path.join(hip_path, str(latest))) + else: + if not os.path.exists("/opt/rocm"): + return None + return ROCmEnvironment(resolve_link("/opt/rocm")) - def get_version() -> str: # cannot just run hipconfig as it requires Perl installed on Windows. - return os.path.basename(path) or os.path.basename(os.path.dirname(path)) +def get_version() -> str: + version = ctypes.c_int() + environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) + major = version.value // 10000000 + minor = (version.value // 100000) % 100 + patch = version.value % 100000 + return f"{major}.{minor}.{patch}" + + +if sys.platform == "win32": def get_agents() -> List[Agent]: - return [Agent(x.split(' ')[-1].strip()) for x in spawn("hipinfo", cwd=os.path.join(path, 'bin')).split("\n") if x.startswith('gcnArchName:')] + if isinstance(environment, ROCmEnvironment): + out = spawn("amdgpu-arch", cwd=os.path.join(environment.path, 'bin')) + else: + out = spawn("amdgpu-arch") + out = out.strip() + return [Agent(x.split(' ')[-1].strip()) for x in out.split("\n")] + + def get_distribution(agent: Agent) -> str: + if agent.gfx_version >= 0x1100 and agent.gfx_version < 0x1110: + return "gfx110X-dgpu" + if agent.gfx_version == 0x1151: + return "gfx1151" + if agent.gfx_version >= 0x1200 and agent.gfx_version < 0x1210: + return "gfx120X-all" + if agent.gfx_version >= 0x940 and agent.gfx_version < 0x950: + return "gfx94X-dcgpu" + if agent.gfx_version == 0x950: + return "gfx950-dcgpu" + raise Exception(f"Unsupported GPU architecture: {agent.name}") is_wsl: bool = False version_torch = None else: - def find() -> Union[str, None]: - rocm_path = shutil.which("hipconfig") - if rocm_path is not None: - return dirname(resolve_link(rocm_path), 2) - if not os.path.exists("/opt/rocm"): - return None - return resolve_link("/opt/rocm") - - def get_version() -> str: - arr = spawn("hipconfig --version", cwd=os.path.join(path, 'bin')).split(".") - return f'{arr[0]}.{arr[1]}' if len(arr) >= 2 else None - def get_agents() -> List[Agent]: try: agents = spawn("rocm_agent_enumerator").split("\n") @@ -208,11 +262,17 @@ else: is_wsl: bool = os.environ.get('WSL_DISTRO_NAME', 'unknown' if spawn('wslpath -w /') else None) is not None version_torch = get_version_torch() -path = find() +environment = None +err = None +try: + environment = find() +except Exception as e: + err = e blaslt_tensile_libpath = "" is_installed = False version = None -if path is not None: - blaslt_tensile_libpath = os.environ.get("HIPBLASLT_TENSILE_LIBPATH", os.path.join(path, "bin" if sys.platform == "win32" else "lib", "hipblaslt", "library")) +if environment is not None: + if isinstance(environment, ROCmEnvironment): + blaslt_tensile_libpath = os.environ.get("HIPBLASLT_TENSILE_LIBPATH", os.path.join(environment.path, "bin" if sys.platform == "win32" else "lib", "hipblaslt", "library")) is_installed = True version = get_version() diff --git a/modules/zluda_installer.py b/modules/zluda_installer.py index da0ee290f..2922f196f 100644 --- a/modules/zluda_installer.py +++ b/modules/zluda_installer.py @@ -119,12 +119,13 @@ def link_or_copy(src: os.PathLike, dst: os.PathLike): def load(): + assert isinstance(rocm.environment, rocm.ROCmEnvironment) global core, ml, hipBLASLt_enabled, MIOpen_enabled # pylint: disable=global-statement core = Core(ctypes.windll.LoadLibrary(os.path.join(path, 'nvcuda.dll'))) ml = ZLUDALibrary(ctypes.windll.LoadLibrary(os.path.join(path, 'nvml.dll'))) is_nightly = core.get_nightly_flag() == 1 - hipBLASLt_enabled = is_nightly and os.path.exists(rocm.blaslt_tensile_libpath) and os.path.exists(os.path.join(rocm.path, "bin", "hipblaslt.dll")) and default_agent is not None - MIOpen_enabled = is_nightly and os.path.exists(os.path.join(rocm.path, "bin", "MIOpen.dll")) + hipBLASLt_enabled = is_nightly and os.path.exists(rocm.blaslt_tensile_libpath) and os.path.exists(os.path.join(rocm.environment.path, "bin", "hipblaslt.dll")) and default_agent is not None + MIOpen_enabled = is_nightly and os.path.exists(os.path.join(rocm.environment.path, "bin", "MIOpen.dll")) if hipBLASLt_enabled: if not default_agent.blaslt_supported: @@ -147,19 +148,19 @@ def load(): os.environ["ZLUDA_NVRTC_LIB"] = os.path.join([v for v in site.getsitepackages() if v.endswith("site-packages")][0], "torch", "lib", "nvrtc64_112_0.dll") for v in HIPSDK_TARGETS: - ctypes.windll.LoadLibrary(os.path.join(rocm.path, 'bin', v)) + ctypes.windll.LoadLibrary(os.path.join(rocm.environment.path, 'bin', v)) for v in DLL_MAPPING.values(): ctypes.windll.LoadLibrary(os.path.join(path, v)) if hipBLASLt_enabled: os.environ.setdefault("DISABLE_ADDMM_CUDA_LT", "0") - ctypes.windll.LoadLibrary(os.path.join(rocm.path, 'bin', 'hipblaslt.dll')) + ctypes.windll.LoadLibrary(os.path.join(rocm.environment.path, 'bin', 'hipblaslt.dll')) ctypes.windll.LoadLibrary(os.path.join(path, 'cublasLt64_11.dll')) else: os.environ["DISABLE_ADDMM_CUDA_LT"] = "1" if MIOpen_enabled: - ctypes.windll.LoadLibrary(os.path.join(rocm.path, 'bin', 'MIOpen.dll')) + ctypes.windll.LoadLibrary(os.path.join(rocm.environment.path, 'bin', 'MIOpen.dll')) ctypes.windll.LoadLibrary(os.path.join(path, 'cudnn64_9.dll')) def conceal(): From 8d2aedd924f85c684cc4a159f5008a665f8542d9 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 11:17:15 +0900 Subject: [PATCH 062/230] hotfix --- modules/rocm.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/rocm.py b/modules/rocm.py index bf06ba3b9..754540f36 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -53,11 +53,14 @@ class ROCmEnvironment(Environment): path: str def __init__(self, path: str): - for v in (6, 7): - lib = os.path.join(path, "bin", f"amdhip64_{v}.dll") - if os.path.exists(lib): - super().__init__(lib) - break + if sys.platform == "win32": + for v in (6, 7): + lib = os.path.join(path, "bin", f"amdhip64_{v}.dll") + if os.path.exists(lib): + super().__init__(lib) + break + else: + super().__init__(os.path.join(path, "lib", "libamdhip64.so")) self.path = path @@ -194,8 +197,8 @@ def get_version() -> str: environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) major = version.value // 10000000 minor = (version.value // 100000) % 100 - patch = version.value % 100000 - return f"{major}.{minor}.{patch}" + #patch = version.value % 100000 + return f"{major}.{minor}" if sys.platform == "win32": From 4c590993e423fb924e048e69163a6e8901d49c70 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 11:24:38 +0900 Subject: [PATCH 063/230] install preview pytorch if rocm-sdk package not found --- installer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/installer.py b/installer.py index bc0612393..98ffef561 100644 --- a/installer.py +++ b/installer.py @@ -725,7 +725,11 @@ def install_rocm_zluda(): #check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13') if args.use_rocm: # TODO install: switch to pytorch source when it becomes available - torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{rocm.get_distribution(device)}') + if isinstance(rocm.environment, rocm.PythonPackageEnvironment): # TheRock + torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{rocm.get_distribution(device)}') + else: + check_python(supported_minors=[12], reason='AMD Windows preview requires a Python version 3.12') + torch_command = os.environ.get('TORCH_COMMAND', '--no-cache-dir https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torch-2.8.0a0%2Bgitfc14c65-cp312-cp312-win_amd64.whl https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torchvision-0.24.0a0%2Bc85f008-cp312-cp312-win_amd64.whl') else: if args.device_id is not None: if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None: From e3e41298d902162fa77d6bb2b40d72bf02481f80 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 11:29:55 +0900 Subject: [PATCH 064/230] remove unused import --- modules/rocm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/rocm.py b/modules/rocm.py index 754540f36..3af8eb577 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -6,7 +6,6 @@ import subprocess import importlib.metadata from typing import Union, List from enum import Enum -from installer import installed def resolve_link(path_: str) -> str: From f00486c8f39731c494b53b7f2c13a77c0d4fcbb2 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Sat, 27 Sep 2025 09:23:32 +0200 Subject: [PATCH 065/230] Fix HIP library detection The code unconditionally checked `lib`, but on modern Linux distributions, 64-bit binaries are under `lib64` instead. Note that this might be slightly different on Debian-based distributions, but as I don't have one I can't test it. --- modules/rocm.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/rocm.py b/modules/rocm.py index 3af8eb577..0222218c8 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -59,7 +59,13 @@ class ROCmEnvironment(Environment): super().__init__(lib) break else: - super().__init__(os.path.join(path, "lib", "libamdhip64.so")) + # Check 64bit path first, then fall back if it doesn't exist + # FIXME: This may be brittle on Debian-based distributions + joined_path = os.path.join(path, "lib64", "libamdhip64.so") + if not os.path.exists(joined_path): + joined_path = os.path.join(path, "lib", "libamdhip64.so") + + super().__init__(joined_path) self.path = path From d52d84eda59351c4a7ae0c9bfd09a54d9966f819 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 16:49:29 +0900 Subject: [PATCH 066/230] clean up --- installer.py | 7 ++----- modules/rocm.py | 21 +++++++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/installer.py b/installer.py index 98ffef561..1bbb03719 100644 --- a/installer.py +++ b/installer.py @@ -1015,11 +1015,8 @@ def check_torch(): if rocm.is_installed: if sys.platform == "win32": # CPU, DirectML, ZLUDA rocm.conceal() - elif rocm.is_wsl: # WSL ROCm - try: - rocm.load_hsa_runtime() - except OSError: - log.error("ROCm: failed to preload HSA runtime") + else: # ROCm + rocm.load_libraries() if args.version: return if not args.skip_all: diff --git a/modules/rocm.py b/modules/rocm.py index 0222218c8..365502413 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -73,7 +73,11 @@ class ROCmEnvironment(Environment): class PythonPackageEnvironment(Environment): def __init__(self): import _rocm_sdk_core - super().__init__(os.path.join(_rocm_sdk_core.__path__[0], "bin", "amdhip64_7.dll")) + if sys.platform == "win32": + path = os.path.join(_rocm_sdk_core.__path__[0], "bin", "amdhip64_7.dll") + else: + raise NotImplementedError + super().__init__(path) class MicroArchitecture(Enum): @@ -216,13 +220,13 @@ if sys.platform == "win32": return [Agent(x.split(' ')[-1].strip()) for x in out.split("\n")] def get_distribution(agent: Agent) -> str: - if agent.gfx_version >= 0x1100 and agent.gfx_version < 0x1110: + if (agent.gfx_version & 0xFFF0) == 0x1100: return "gfx110X-dgpu" if agent.gfx_version == 0x1151: return "gfx1151" - if agent.gfx_version >= 0x1200 and agent.gfx_version < 0x1210: + if (agent.gfx_version & 0xFFF0) == 0x1200: return "gfx120X-all" - if agent.gfx_version >= 0x940 and agent.gfx_version < 0x950: + if (agent.gfx_version & 0xFFF0) == 0x940: return "gfx94X-dcgpu" if agent.gfx_version == 0x950: return "gfx950-dcgpu" @@ -240,16 +244,17 @@ else: agents = [x.strip().split(" ")[-1] for x in agents if x.startswith(' Name:') and "CPU" not in x] return [Agent(x) for x in agents] - def load_hsa_runtime() -> None: + def load_libraries() -> None: try: - # Preload stdc++ library. This will ignore Anaconda stdc++ library. + # Preload stdc++ library. This will bypass Anaconda stdc++ library. load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") # Use tcmalloc if possible. load_library_global("/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4") + if is_wsl: + # Preload rocr4wsl. + load_library_global("/opt/rocm/lib/libhsa-runtime64.so") except OSError: pass - # Preload HSA Runtime library. - load_library_global("/opt/rocm/lib/libhsa-runtime64.so") def set_blaslt_enabled(enabled: bool) -> None: if enabled: From 579b1f3175a2fe9ea7be049f3e1a19f2db274975 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 17:01:14 +0900 Subject: [PATCH 067/230] do not load global amdhip64, let pytorch load it --- modules/rocm.py | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/modules/rocm.py b/modules/rocm.py index 365502413..26b8f9f3a 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -41,10 +41,7 @@ def conceal(): class Environment: - hip: ctypes.CDLL - - def __init__(self, path: str): - self.hip = ctypes.CDLL(path) + pass # rocm is installed system-wide @@ -52,32 +49,21 @@ class ROCmEnvironment(Environment): path: str def __init__(self, path: str): - if sys.platform == "win32": - for v in (6, 7): - lib = os.path.join(path, "bin", f"amdhip64_{v}.dll") - if os.path.exists(lib): - super().__init__(lib) - break - else: - # Check 64bit path first, then fall back if it doesn't exist - # FIXME: This may be brittle on Debian-based distributions - joined_path = os.path.join(path, "lib64", "libamdhip64.so") - if not os.path.exists(joined_path): - joined_path = os.path.join(path, "lib", "libamdhip64.so") - - super().__init__(joined_path) self.path = path # rocm-sdk package is installed class PythonPackageEnvironment(Environment): + hip: ctypes.CDLL + def __init__(self): import _rocm_sdk_core if sys.platform == "win32": path = os.path.join(_rocm_sdk_core.__path__[0], "bin", "amdhip64_7.dll") else: raise NotImplementedError - super().__init__(path) + # This library will be loaded/used by PyTorch. So it won't make conflicts. + self.hip = ctypes.CDLL(path) class MicroArchitecture(Enum): @@ -202,12 +188,21 @@ def find() -> Union[Environment, None]: def get_version() -> str: - version = ctypes.c_int() - environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) - major = version.value // 10000000 - minor = (version.value // 100000) % 100 - #patch = version.value % 100000 - return f"{major}.{minor}" + if isinstance(environment, ROCmEnvironment): + if sys.platform == "win32": + # ROCm is system-wide installed. Assume the version is the folder name. (e.g. C:\Program Files\AMD\ROCm\6.4) + # hipconfig requires Perl + return os.path.basename(environment.path) or os.path.basename(os.path.dirname(environment.path)) + else: + arr = spawn("hipconfig --version", cwd=os.path.join(environment.path, 'bin')).split(".") + return f'{arr[0]}.{arr[1]}' if len(arr) >= 2 else None + else: + version = ctypes.c_int() + environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) + major = version.value // 10000000 + minor = (version.value // 100000) % 100 + #patch = version.value % 100000 + return f"{major}.{minor}" if sys.platform == "win32": From 71fde8a897ec6b9e4663c2ca89759f581f2b3296 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 27 Sep 2025 11:32:46 +0300 Subject: [PATCH 068/230] ROCm and Zluda don't fallback to CPU and clenup strings --- installer.py | 47 ++++++++++----------------------- modules/intel/ipex/__init__.py | 2 +- modules/intel/ipex/attention.py | 4 +-- modules/intel/ipex/hijacks.py | 12 ++++----- modules/sdnq/__init__.py | 4 +-- modules/sdnq/common.py | 2 +- 6 files changed, 26 insertions(+), 45 deletions(-) diff --git a/installer.py b/installer.py index 1bbb03719..22172970b 100644 --- a/installer.py +++ b/installer.py @@ -677,18 +677,9 @@ def install_rocm_zluda(): if args.skip_all or args.skip_requirements: return torch_command from modules import rocm - if rocm.err is not None: - log.warning(f'ROCm: error checking ROCm toolkit: {rocm.err}') - log.info('Using CPU-only torch') - return os.environ.get('TORCH_COMMAND', 'torch torchvision') - if not rocm.is_installed: - log.warning('ROCm: could not find ROCm toolkit installed') - log.info('Using CPU-only torch') - return os.environ.get('TORCH_COMMAND', 'torch torchvision') log.info('ROCm: AMD toolkit detected') - # if not is_windows: - # os.environ.setdefault('TENSORFLOW_PACKAGE', 'tensorflow-rocm') + #os.environ.setdefault('TENSORFLOW_PACKAGE', 'tensorflow') device = None try: @@ -701,8 +692,6 @@ def install_rocm_zluda(): index = 0 for idx, gpu in enumerate(amd_gpus): index = idx - # if gpu.name.startswith('gfx11') and os.environ.get('TENSORFLOW_PACKAGE') == 'tensorflow-rocm': # do not use tensorflow-rocm for navi 3x - # os.environ['TENSORFLOW_PACKAGE'] = 'tensorflow==2.13.0' if not gpu.is_apu: # although apu was found, there can be a dedicated card. do not break loop. # if no dedicated card was found, apu will be used. @@ -722,22 +711,23 @@ def install_rocm_zluda(): log.info(msg) if sys.platform == "win32": - #check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13') - if args.use_rocm: # TODO install: switch to pytorch source when it becomes available - if isinstance(rocm.environment, rocm.PythonPackageEnvironment): # TheRock + if device is not None and isinstance(rocm.environment, rocm.PythonPackageEnvironment): # TheRock + check_python(supported_minors=[11, 12, 13], reason='ROCm backend requires a Python version between 3.11 and 3.13') torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{rocm.get_distribution(device)}') else: - check_python(supported_minors=[12], reason='AMD Windows preview requires a Python version 3.12') + check_python(supported_minors=[12], reason='ROCm Windows preview requires Python version 3.12') torch_command = os.environ.get('TORCH_COMMAND', '--no-cache-dir https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torch-2.8.0a0%2Bgitfc14c65-cp312-cp312-win_amd64.whl https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torchvision-0.24.0a0%2Bc85f008-cp312-cp312-win_amd64.whl') else: + #check_python(supported_minors=[10, 11, 12, 13], reason='ZLUDA backend requires a Python version between 3.10 and 3.13') + torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+cu118 torchvision==0.22.1+cu118 --index-url https://download.pytorch.org/whl/cu118') + if args.device_id is not None: if os.environ.get('HIP_VISIBLE_DEVICES', None) is not None: log.warning('Setting HIP_VISIBLE_DEVICES and --device-id at the same time may be mistake.') os.environ['HIP_VISIBLE_DEVICES'] = args.device_id del args.device_id - error = None from modules import zluda_installer try: if args.reinstall or zluda_installer.is_reinstall_needed(): @@ -745,19 +735,12 @@ def install_rocm_zluda(): zluda_installer.install() zluda_installer.set_default_agent(device) except Exception as e: - error = e log.warning(f'Failed to install ZLUDA: {e}') - if error is None: - try: - zluda_installer.load() - torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.7.1+cu118 torchvision==0.22.1+cu118 --index-url https://download.pytorch.org/whl/cu118') - except Exception as e: - error = e - log.warning(f'Failed to load ZLUDA: {e}') - if error is not None: - log.info('Using CPU-only torch') - torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') + try: + zluda_installer.load() + except Exception as e: + log.warning(f'Failed to load ZLUDA: {e}') else: #check_python(supported_minors=[10, 11, 12, 13], reason='ROCm backend requires a Python version between 3.10 and 3.13') @@ -793,7 +776,7 @@ def install_rocm_zluda(): log.info(f'ROCm: HSA_OVERRIDE_GFX_VERSION auto config skipped: device={device.name if device is not None else None} version={os.environ.get("HSA_OVERRIDE_GFX_VERSION", None)}') else: gfx_ver = device.get_gfx_version() - if gfx_ver is not None: + if gfx_ver is not None and device.name.removeprefix("gfx") != gfx_ver.replace(".", ""): os.environ.setdefault('HSA_OVERRIDE_GFX_VERSION', gfx_ver) log.info(f'ROCm: HSA_OVERRIDE_GFX_VERSION config overridden: device={device.name} version={os.environ.get("HSA_OVERRIDE_GFX_VERSION", None)}') @@ -936,8 +919,8 @@ def check_torch(): if torch_command != '': pass else: - is_cuda_available = allow_cuda and (shutil.which('nvidia-smi') is not None or args.use_xformers or os.path.exists(os.path.join(os.environ.get('SystemRoot') or r'C:\Windows', 'System32', 'nvidia-smi.exe'))) - is_rocm_available = allow_rocm and rocm.is_installed + is_cuda_available = allow_cuda and (args.use_cuda or shutil.which('nvidia-smi') is not None or args.use_xformers or os.path.exists(os.path.join(os.environ.get('SystemRoot') or r'C:\Windows', 'System32', 'nvidia-smi.exe'))) + is_rocm_available = allow_rocm and (args.use_rocm or args.use_zluda or rocm.is_installed) is_ipex_available = allow_ipex and (args.use_ipex or shutil.which('sycl-ls') is not None or shutil.which('sycl-ls.exe') is not None or os.environ.get('ONEAPI_ROOT') is not None or os.path.exists('/opt/intel/oneapi') or os.path.exists("C:/Program Files (x86)/Intel/oneAPI") or os.path.exists("C:/oneAPI")) if is_cuda_available and args.use_cuda: # prioritize cuda @@ -965,8 +948,6 @@ def check_torch(): install(torch_command, 'torch torchvision') install('onnxruntime-directml', 'onnxruntime-directml', ignore=True) else: - if args.use_zluda: - log.warning("ZLUDA failed to initialize: no HIP SDK found") log.warning('Torch: CPU-only version installed') torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') if 'torch' in torch_command and not args.version: diff --git a/modules/intel/ipex/__init__.py b/modules/intel/ipex/__init__.py index 93f94d280..3d49beca7 100644 --- a/modules/intel/ipex/__init__.py +++ b/modules/intel/ipex/__init__.py @@ -165,7 +165,7 @@ def ipex_init(): # pylint: disable=too-many-statements pass # Memory: - if 'linux' in sys.platform and "WSL2" in os.popen("uname -a").read(): + if "linux" in sys.platform and "WSL2" in os.popen("uname -a").read(): torch.xpu.empty_cache = lambda: None torch.cuda.empty_cache = torch.xpu.empty_cache diff --git a/modules/intel/ipex/attention.py b/modules/intel/ipex/attention.py index c3e8ef8ed..aacccca75 100644 --- a/modules/intel/ipex/attention.py +++ b/modules/intel/ipex/attention.py @@ -8,8 +8,8 @@ from functools import cache, wraps # ARC GPUs can't allocate more than 4GB to a single block so we slice the attention layers -dynamic_attention_slice_rate = float(os.environ.get('IPEX_SDPA_SLICE_TRIGGER_RATE', 1)) -dynamic_attention_trigger_rate = float(os.environ.get('IPEX_ATTENTION_SLICE_RATE', 0.5)) +dynamic_attention_slice_rate = float(os.environ.get("IPEX_SDPA_SLICE_TRIGGER_RATE", "1")) +dynamic_attention_trigger_rate = float(os.environ.get("IPEX_ATTENTION_SLICE_RATE", "0.5")) # Find something divisible with the input_tokens @cache diff --git a/modules/intel/ipex/hijacks.py b/modules/intel/ipex/hijacks.py index c9be1f789..8e8961476 100644 --- a/modules/intel/ipex/hijacks.py +++ b/modules/intel/ipex/hijacks.py @@ -80,8 +80,8 @@ def torch_get_autocast_dtype(device_type=None): # IPEX 2.5 and above has partial support but doesn't really work most of the time. original_interpolate = torch.nn.functional.interpolate @wraps(torch.nn.functional.interpolate) -def interpolate(tensor, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False): # pylint: disable=too-many-arguments - if mode in {'bicubic', 'bilinear'}: +def interpolate(tensor, size=None, scale_factor=None, mode="nearest", align_corners=None, recompute_scale_factor=None, antialias=False): # pylint: disable=too-many-arguments + if mode in {"bicubic", "bilinear"}: return_device = tensor.device return_dtype = tensor.dtype return original_interpolate(tensor.to("cpu", dtype=torch.float32), size=size, scale_factor=scale_factor, mode=mode, @@ -94,8 +94,8 @@ def interpolate(tensor, size=None, scale_factor=None, mode='nearest', align_corn # SwinIR BF16: original_functional_pad = torch.nn.functional.pad @wraps(torch.nn.functional.pad) -def functional_pad(input, pad, mode='constant', value=None): - if mode == 'reflect' and input.dtype == torch.bfloat16: +def functional_pad(input, pad, mode="constant", value=None): + if mode == "reflect" and input.dtype == torch.bfloat16: return original_functional_pad(input.to(torch.float32), pad, mode=mode, value=value).to(dtype=torch.bfloat16) else: return original_functional_pad(input, pad, mode=mode, value=value) @@ -365,13 +365,13 @@ def ipex_hijacks(): except Exception: pass - if os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '0': + if os.environ.get("IPEX_FORCE_ATTENTION_SLICE", "0") == "0": if torch_version[0] > 2 or (torch_version[0] == 2 and torch_version[1] >= 7): use_dynamic_attention = False # torch 2.7 has flash atten support else: use_dynamic_attention = True else: - use_dynamic_attention = bool(os.environ.get('IPEX_FORCE_ATTENTION_SLICE', '0') == '1') + use_dynamic_attention = bool(os.environ.get("IPEX_FORCE_ATTENTION_SLICE", "0") == "1") if use_dynamic_attention: from .attention import dynamic_scaled_dot_product_attention diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 6ba49cbb1..6b8e7c409 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -404,7 +404,7 @@ class SDNQQuantizer(DiffusersQuantizer): def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument if shared.opts.diffusers_offload_mode != "none": model = model.to(devices.cpu) - devices.torch_gc(force=True, reason='sdnq') + devices.torch_gc(force=True, reason="sdnq") return model def get_accelerator_warm_up_factor(self): @@ -440,7 +440,7 @@ class SDNQQuantizer(DiffusersQuantizer): """ return missing_keys - def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: # pylint: disable=unused-argument + def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: """ needed for transformers compatibilty, no-op function """ diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index e6ed21d4d..ecd06a653 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -34,7 +34,7 @@ if hasattr(torch, "float8_e5m2fnuz"): dtype_dict["float8_e5m2fnuz"] = {"min": -57344, "max": 57344, "num_bits": 8, "target_dtype": "fp8", "torch_dtype": torch.float8_e5m2fnuz, "storage_dtype": torch.float8_e5m2fnuz, "is_unsigned": False, "is_integer": False} use_torch_compile = shared.opts.sdnq_dequantize_compile # this setting requires a full restart of the webui to apply -use_tensorwise_fp8_matmul = os.environ.get('SDNQ_USE_TENSORWISE_FP8_MATMUL', "1").lower() not in {"0", "false", "no"} # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting +use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", "1").lower() not in {"0", "false", "no"} # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting linear_types = ("Linear",) conv_types = ("Conv1d", "Conv2d", "Conv3d") From 503a1787944070f2d34f0ec62b04120c8c6d0670 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 27 Sep 2025 11:39:24 +0300 Subject: [PATCH 069/230] Don't load rocm hsa on non wsl envs and remove unused lib hijacks --- modules/rocm.py | 80 +++++++++++++++------------------------- modules/sdnq/__init__.py | 2 +- 2 files changed, 30 insertions(+), 52 deletions(-) diff --git a/modules/rocm.py b/modules/rocm.py index 26b8f9f3a..c5fe24d37 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -116,17 +116,6 @@ class Agent: return None -def get_version_torch() -> Union[str, None]: - version_ = None - try: - version_ = importlib.metadata.version("torch") - except importlib.metadata.PackageNotFoundError: - return None - if "+rocm" not in version_: # unofficial build, non-rocm torch. - return None - return version_.split("+rocm")[1] - - def find() -> Union[Environment, None]: hip_path = shutil.which("hipconfig") if hip_path is not None: @@ -205,6 +194,29 @@ def get_version() -> str: return f"{major}.{minor}" +def get_flash_attention_command(agent: Agent): + default = "git+https://github.com/ROCm/flash-attention" + if agent.gfx_version >= 0x1100 and agent.gfx_version < 0x1200 and os.environ.get("FLASH_ATTENTION_USE_TRITON_ROCM", "false").lower() != "true": + # use the navi_rotary_fix fork because the original doesn't support rotary_emb for transformers + # original: "git+https://github.com/ROCm/flash-attention@howiejay/navi_support" + default = "git+https://github.com/Disty0/flash-attention@navi_rotary_fix" + return "--no-build-isolation " + os.environ.get("FLASH_ATTENTION_PACKAGE", default) + + +def get_distribution(agent: Agent) -> str: + if (agent.gfx_version & 0xFFF0) == 0x1100: + return "gfx110X-dgpu" + if agent.gfx_version == 0x1151: + return "gfx1151" + if (agent.gfx_version & 0xFFF0) == 0x1200: + return "gfx120X-all" + if (agent.gfx_version & 0xFFF0) == 0x940: + return "gfx94X-dcgpu" + if agent.gfx_version == 0x950: + return "gfx950-dcgpu" + raise Exception(f"Unsupported GPU architecture: {agent.name}") + + if sys.platform == "win32": def get_agents() -> List[Agent]: if isinstance(environment, ROCmEnvironment): @@ -214,21 +226,7 @@ if sys.platform == "win32": out = out.strip() return [Agent(x.split(' ')[-1].strip()) for x in out.split("\n")] - def get_distribution(agent: Agent) -> str: - if (agent.gfx_version & 0xFFF0) == 0x1100: - return "gfx110X-dgpu" - if agent.gfx_version == 0x1151: - return "gfx1151" - if (agent.gfx_version & 0xFFF0) == 0x1200: - return "gfx120X-all" - if (agent.gfx_version & 0xFFF0) == 0x940: - return "gfx94X-dcgpu" - if agent.gfx_version == 0x950: - return "gfx950-dcgpu" - raise Exception(f"Unsupported GPU architecture: {agent.name}") - is_wsl: bool = False - version_torch = None else: def get_agents() -> List[Agent]: try: @@ -240,36 +238,16 @@ else: return [Agent(x) for x in agents] def load_libraries() -> None: - try: - # Preload stdc++ library. This will bypass Anaconda stdc++ library. - load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") - # Use tcmalloc if possible. - load_library_global("/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4") - if is_wsl: + if is_wsl: + try: + # Preload stdc++ library. This will bypass Anaconda stdc++ library. + load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") # Preload rocr4wsl. load_library_global("/opt/rocm/lib/libhsa-runtime64.so") - except OSError: - pass - - def set_blaslt_enabled(enabled: bool) -> None: - if enabled: - os.environ["HIPBLASLT_TENSILE_LIBPATH"] = blaslt_tensile_libpath - else: - os.environ["TORCH_BLAS_PREFER_HIPBLASLT"] = "0" - - def get_blaslt_enabled() -> bool: - return version == version_torch and bool(int(os.environ.get("TORCH_BLAS_PREFER_HIPBLASLT", "1"))) - - def get_flash_attention_command(agent: Agent): - default = "git+https://github.com/ROCm/flash-attention" - if agent.gfx_version >= 0x1100 and agent.gfx_version < 0x1200 and os.environ.get("FLASH_ATTENTION_USE_TRITON_ROCM", "false").lower() != "true": - # use the navi_rotary_fix fork because the original doesn't support rotary_emb for transformers - # original: "git+https://github.com/ROCm/flash-attention@howiejay/navi_support" - default = "git+https://github.com/Disty0/flash-attention@navi_rotary_fix" - return "--no-build-isolation " + os.environ.get("FLASH_ATTENTION_PACKAGE", default) + except OSError: + pass is_wsl: bool = os.environ.get('WSL_DISTRO_NAME', 'unknown' if spawn('wslpath -w /') else None) is not None - version_torch = get_version_torch() environment = None err = None try: diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 6b8e7c409..82689efca 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -440,7 +440,7 @@ class SDNQQuantizer(DiffusersQuantizer): """ return missing_keys - def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: + def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ From 059392afc7f3136d74fe75e9867900147cce58d9 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sat, 27 Sep 2025 17:51:59 +0900 Subject: [PATCH 070/230] clean up --- installer.py | 4 ++-- modules/rocm.py | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/installer.py b/installer.py index 22172970b..b5ddca5b7 100644 --- a/installer.py +++ b/installer.py @@ -996,8 +996,8 @@ def check_torch(): if rocm.is_installed: if sys.platform == "win32": # CPU, DirectML, ZLUDA rocm.conceal() - else: # ROCm - rocm.load_libraries() + elif rocm.is_wsl: # ROCm WSL + rocm.preload_hsa_runtime() if args.version: return if not args.skip_all: diff --git a/modules/rocm.py b/modules/rocm.py index c5fe24d37..5188409d4 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -3,7 +3,6 @@ import sys import ctypes import shutil import subprocess -import importlib.metadata from typing import Union, List from enum import Enum @@ -178,6 +177,7 @@ def find() -> Union[Environment, None]: def get_version() -> str: if isinstance(environment, ROCmEnvironment): + # We don't load the hip library that will not be used by PyTorch. if sys.platform == "win32": # ROCm is system-wide installed. Assume the version is the folder name. (e.g. C:\Program Files\AMD\ROCm\6.4) # hipconfig requires Perl @@ -186,6 +186,7 @@ def get_version() -> str: arr = spawn("hipconfig --version", cwd=os.path.join(environment.path, 'bin')).split(".") return f'{arr[0]}.{arr[1]}' if len(arr) >= 2 else None else: + # If rocm-sdk package is installed, the hip library may be used by PyTorch. version = ctypes.c_int() environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) major = version.value // 10000000 @@ -194,7 +195,7 @@ def get_version() -> str: return f"{major}.{minor}" -def get_flash_attention_command(agent: Agent): +def get_flash_attention_command(agent: Agent) -> str: default = "git+https://github.com/ROCm/flash-attention" if agent.gfx_version >= 0x1100 and agent.gfx_version < 0x1200 and os.environ.get("FLASH_ATTENTION_USE_TRITON_ROCM", "false").lower() != "true": # use the navi_rotary_fix fork because the original doesn't support rotary_emb for transformers @@ -237,15 +238,15 @@ else: agents = [x.strip().split(" ")[-1] for x in agents if x.startswith(' Name:') and "CPU" not in x] return [Agent(x) for x in agents] - def load_libraries() -> None: - if is_wsl: - try: + def preload_hsa_runtime(): + try: + if shutil.which("conda") is not None: # Preload stdc++ library. This will bypass Anaconda stdc++ library. load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") - # Preload rocr4wsl. - load_library_global("/opt/rocm/lib/libhsa-runtime64.so") - except OSError: - pass + # Preload rocr4wsl. The user don't have to replace the library file. + load_library_global("/opt/rocm/lib/libhsa-runtime64.so") + except OSError: + pass is_wsl: bool = os.environ.get('WSL_DISTRO_NAME', 'unknown' if spawn('wslpath -w /') else None) is not None environment = None From 384c2037a2b98ddd923ad0693a7680b587e2306c Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Sat, 27 Sep 2025 14:38:29 +0300 Subject: [PATCH 071/230] new segmind (5) model covers --- models/Reference/segmind--SSD-1B.jpg | Bin 50008 -> 85815 bytes models/Reference/segmind--SegMoE-4x2-v0.jpg | Bin 35297 -> 60715 bytes .../Reference/segmind--SegMoE-SD-4x2-v0.jpg | Bin 21996 -> 52031 bytes models/Reference/segmind--Segmind-Vega.jpg | Bin 75379 -> 77679 bytes models/Reference/segmind--tiny-sd.jpg | Bin 90089 -> 82205 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/models/Reference/segmind--SSD-1B.jpg b/models/Reference/segmind--SSD-1B.jpg index 51907db27369a369215e1cca5054e0355c76f0fe..11a96eedb2971787b726028b8b08597d2de25798 100644 GIT binary patch literal 85815 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 Xk9fsX+WTR6PICMBPyNCf6UYDAs#jkf diff --git a/models/Reference/segmind--SegMoE-4x2-v0.jpg b/models/Reference/segmind--SegMoE-4x2-v0.jpg index 93903538ca970700729ea025634781c8d1cb2792..3e9ba4ea3350548091ca0b72a216868dce66f1ad 100644 GIT binary patch literal 60715 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 delta 34978 zcmYg$1yEeU((dB!?jBr&ySux)yGsZx?u%Qn;10oM3GNVF7uaBd009!*;c@T(zgKTg z)%2Y1uV<#}oUw1ZZUb&N0~YaZ{cRWaM;am%ENnp<7fqT4by^Awk~_c(;13AOD1sqM zJEjM60H^`F06Rb+!1ujG3lIQs0QdmX?w9khUvJ-ci|4z>=3RQfW9;7Z|DgT%a3kVMX(8d!T6u*d^Q4vF(@ASL4=(&8u=d`i z{}^$BLMT&8#K6m^lTIva6WRJ+71@70VgCP?U|<12ICum^q<1R|4gmIl5)8usf?!~A z;An8U;iV9?-kZVa@d{6qrq_Pk0HFV;6F6`<013cDI|sEaG*<|FvU?`m zL8mWq8$-halYolNdi}wWAAYz!uNgtCU6>WNa~M)4EwPb{pZvTs2*#ty%`b|)>?n0T zny&a7AWQZFWg5g+E&ucuF(~zcszU4e=lhK$k1G`sx`5TUM# z3gI>zxxQDXra!F+FSAJh0|&bu6TSEqO0gUz%q=1xYKkjV&NKc&3N=8)vU&O3LzvcUaF7lxDHe+3l%+XsD>{z- zaypLSCE1!%GC%i2=X+Y<=NUSWVr{Kor^(r>BqbqMBq-{zgISbg&0N~9`X*+r!8w!K=k;?X}?%vWkSO0Q%{WZR6By6h}KMeCgwaOru?i}UpKe(mMfuPtQkvZ zk$ROT!w&;?baDf7-GjX7X7 zmy3;L^(>7i-Mll~S><)s(cw^n{AH!JQ7Dh#n%He+fXtFZ(>SMzA5ydD>wZ)^{&t~$MJOx>EU`vkO2X@3yu`%Q5vAdl*j~cNne(pVxiP>Z` z@krT7jVQtH#-@#<%4MoM;vtj8q3J9MVe{k;iIkLF1mVmRdbhv8uZZLlqx*`bKjSvC6VmJ?A|cit*MH3D9)PrU`~UfKcy0?VqTL zINZhtk`ub?oIc>nKz?lhG$Rky`DBk?#AC7HJ(Z{RLxD5M<4~B9!Q*IbM8{x!6|TgR*IQX!7~clOa5`2tfb3yC9OVgy zF@Mq*i2?h7g?iK!ULzRpW0oRfbaL zLRRL~f|JjH#8SFC%#4vR6p9=32CyQSmu*k)6i`M0S9IKJ!oE){b`I5uHT z4G{KlD4sF0YAV?yUacnQ0(*U87G-#o%*XuFgAVO*TS<7pAgeGN6x+jB8vqpTn^gDA zp~z+|)eO&J3R6rTW?&^8p{{q7O?Ah1WSh2V(b_`DmYr7`iZj8xXJ}>~8=ol(7sE$1 zFaq_1LzQq?`G(cL*1VZSo7YJsa#%l*p95C+{z}{`Jk8}46gu46E}dgrwC}pVkln0v+9Sk4`pjV8 zu@Mm3&@WjMX)1Yx6I%6c=(GGfsak&xt4QIka}w?`VFCwRP4ZUh@HVP!V45hutF7|+ z%zB6({KRjx@0TAB*9_OLtPj%eDD>^S{Vhm5kB*Wq&Ne`)&6QSvlqH{ zq~BPfLEhBWX4*-3UcKNlrYQBh8;M9r`@*HXyBNGDzbW=qsZ`pn)gVS@N`5q6ReiEz zw0iA5Z@#)kG1{bicl@fS6ZiCu1ct4({WPu7kzE9~(|T&}hY-+3#MtgYD^It}VC9 zsNrPn=Pkn!LGP$GGf9k%UlmQtQpyNJnou~~s7(}QX>8Jg7EQLq>|K~gI@wloPT%Cy zI9s;%c>+h+O<$lwLyyH@8lg&)8tgAfaX zC2@@C5WcuXH4rKzOquISS>C9;oW}7_BM;HTWm!6NX#-6zRM}hEaA2Z9+hDE|00j<4 zHX%%l<`xr-fcntpHU%p29;YA?s)1q&XJ$H#$A#XkGRyi!Vn#UvM}e)2O4Dp)jW*V0 zwTUIiIjAMHQc8}bJ*ja3$+9#kDcPscdpF};eS5~o+unOoIQP3BMU%60d1{y7pE*wiGD)qT9e>xhz8kCZ+3DX;bA z!>3!Sshn#<66P-z;0+*q>e>@`08{2`7jf6S`2>9fK={#WIS-N*AIX5{DiD^K6LSYI zP&NkQuNyG2(=a)w_xW$&tp>8mov~WjOn*F6qPqxpH?^M_P7CaDB&oZs>tC1jeA1pW zAb)gYK!Ew6lb)(wYRs!hr7KDL-eqvrUT?y$zj85=76qb6BA7!R3(lcF)I_w~$$#>t zW)9nu^MO1Kq-HKbxr?4$sAcqirO!USJllLmFAQOyQ#(ntjsidI@Mid-Gg|pr{1B_x z`C1v;utVuU@WrT9Mdm}Oes8Q-`yN^-jkxEq*=tTwGT*60M!6ERt!7??IaoD7!ap#>Xv8N;`=c z-J#U1Oa@4dj%1bzNzISQi-bg1z>E*^ctBBzbc*9pamCUu_fML5uVo4Or4+@1K>A~+ zlUO@m9&0~ooop~JhimrGz*8ABa&NL0cGO>wovM5M`7W>~ZfaKNc?}=8{G@-&plwO- z5~?M!{3gAl$_fIuKlaqDtQxT_zxD`#kIXo>Aq}G`Z^-TxRCyG{kqL{Vh)<*|eIzNS zh4mf37|rg>X(odRwWMn>et5S$P@Z4L70N|i(t#YNxZoX!9_6S7kekXht)g}Kc-AbY z$!I^r_p!pqm%8&{9aET%fJoLisB6HXRO$LC#6lHLKtjKI3b&N0 z(TSsf)XdfBY&^t?TZlq(6L(Yz8zl?k$2@_odkpEq)EeIbeAFmX4Je4a9liV_;uU#rc>t%2IX3xVNGPmn7!V!rW zx6UWPJ-oQHUts!c|LLUN8QA9Tud6DFIc?LwBOwy1WWqo`x*VIfC{!NVp&wV~`al7cc}3ge23sWw z58nWG=}S43`r*?qh8XYT#l*!oM_hp$M5$|Y^L4`JiB)RD$5aIl*pS~(!q_=PIJ81A zK2H=&)W6UyG0De;C2m40BQFxlSXxjNf9{euIPoK~%lHkT9_|DN75jK+psAe)1oZaM zMmyn@BH^xwVK`35jWZeNMGes$G(n&~YcH8U26VK0XMS87wwbtZZx4l6)1=Vl{ep#Q zpJW-SZs3CC&T!?#KrKb&ETx%Icqx*OnxTOwTgtUXlu z>$h3LfM&(!N&l?@maIQ|>({pgm8buPxd0aZ6zZfk>T9UrPBVVfzl)tO=0B$lY1+fKaUVQ;Kjs@XS}Nx_=@d(;k>aKKARovUCp+Fm6qD;#>ls4eZ)N zst*kzn3I>nm0QSD;7t}XekK*2FP*Yc<`eouV`u5D*+&K9b#NZ@DYf|UV{t751wNYV z%reyafGkTOg?F7JFU`bjoPexct8HW{x2)u;wlDH&SR&K>DkIDL=W_kMOBaTU!z1`B z$_+x7#%rbPXx+&ajw}yL%^9T`@weqe2Sge6!zm~g2TYqi=@wOt&Br-pmJQG;<__{~ zLa(5%xR(PAx0suh!yXNQ>9OG}tbR^(yJmtS5LSUOnKGBku?(I`2kNRN{g)#3rGNd?pcGGOWNYq}n=Cv+ckCzo38`F)1 zohIYq70v8+f0x~E-T;1I z4&+DU3vNF-aJA3)t?zLNTkL}uFWHX|038PrP~lJn--IHZOr4%0vDn}Pg~fk0HCZ6y ztjbloznBxEaT0Nr(_}xA0$Ae!`7iwUMh8Hl=H~KG@r=OYS2=%DD)jH`B!Oo({we#u zOV6B{f?ZAfsQo`;o-vd8Z5%H*NRgcm1^PB&9zvB!kWLPLC4IWbM$YE8o;mXMc7LUb zZqO=;jz2Id_u*xKAdE?~lzVy1{6lN!fuWj4$(Cou;RP#Jzz74HDX zOq@MliPVS>-#@dKZ=lf>@z5P!jt9}?GKJMMVmH6p~DVr*s^RD-_KVeyx)*gxG zPEgi}z=U6)64YdM@sw0g+0xWo+KvOyx7Is@d-gjAH2)^alJ5+=Uy`RWC3T;$&Vm8f*3BMgsnS5$xPzw1Pu*12pP{^A$F6My~N z4>P&mV;)l+r+<_CM_r|~t#VBtl{#0r-WPsZvUQ`X<4lZ@N!sU;R|Ern9$&+Jui(T8 zF6p3#zBTd528mZj4cp?~E>=rJLkrvW!=0(i@!a9{-@*^7(@7R5<+hHV=k343u+`lS zOvsm$#SM8Cx=bPbrwARlWcdO>lvpmPOCpbm3Z4t<%D`qgioYiXGV$FUkxp|3_LGWl73O$!=65wtJ?q{8Bqj6xJh;n(~Rrzu&Dl=pBa zy=X&yR0?`{6bHP#Nsyjb7J(rR3{sky#ujmxg9d*C;1ch|ZhQke95GDbGo-T&Vl$G? zk{1xWeEp-VdydigU9mdkDWN_o#qo1d{OFYd^HgMsQC&FX^1c^70bUS8-#A9j7Gs=0s>G4+X< zXSQ{8aXGbI4A4dXEVK!6Sl^LeK=TshsRO&RQ& z2WeAG6`ibtNG9m)Ff^xs7mXA)yb#oBJ7V0x{xLNz%nJ2y`Q;zdQc0^;~ zWK-|>ibHlGQH3J}(;sWEdFIgl$jWcPNu4lzovOt6-^6I%hs?C~f~`t&w$4hs(ZQ*e zV7K+g?+lLnwt6(N=$Y__j19q25Y%%yWYhs-P|>QIZ85Ffyqd;v;Utm&3Pxn3(d~M^@`8j+6}~?mHTT#pbpJ zQlyiHz;DqyOQqSWk;q3QqtUsv+GY=#7(!X}F-O}MV6wtY8DLMSQCxPh36;s*vMCm1 zxqxVxiGcMA@Z9uPnJ!HZcp5f)RauxRcbVZ|j>|3+p-R*cl=$aF1eqBzRRo&}HoP0M ztF%{7WH5CHu7^~VlJ4}U21_LH^?2BKf>+k+aZ%8r+XLt^IdQgtf#{2tPjFI7Mp*Cu z4i*-FWb9rwduw?U@e%CRR|aumF@Z7Z6<}di?Dg2vAekfp#>&;m#EH3ytF$dQ9LAWb zWD{-DBtuL>YEY?VJ0TVGi^d>ApZ=0H+#@>(-YIDu7Tbxjt_A^YV?Pve-yJS{A5|H;X131kK2_*EYuHZnu zW>OMC=FVTdmBW{7@^(DM734ls@Kn|xfM<(tV|ydN#QH$A+xb&b`0p6|!6$h?_<#Fo z)HQ$`eZI+({uV0Tj96+p+H(+La|D*1aJI%b9|$%9Lw5f?e)R+Lj1E zDNS{d+I`dqRq;Ahv+6q{Py64RsCx!>jSpFCn_O&h^pO|~c9*s4Er2(zcn=}sPX#}B zd3V7OJoqe()YJk-WN96Lc;Gvs)|+~xj-5}V43i&)w5XLFPyX>d)&H7TEkPQ|R-Gzg zWWa<>P#V>503X^{?Nl-XMMztRAQM4l$#@a{p~QsJ3)XS4dWcbx?PEAFz98gN>G+H? z#7X6W(|VRAzFSjoy=#vr`l)tk!eFT0S>;21-mDQOrEWz_Yumxtnq zncm}mon3ZK5>;bl9xHA6!O>UyL&o;Y7ku~*w-wHh62ooJ znVP(=#7MusdrVCMFSX7>IS7(^9M7(!ol4qQY*Y{$+}Y}v-KniS=^z^u*Q%q_R+-0v zQ_JypqYGjOt_otwN{p3%%q}gCqW{u+bWB$DWa6*l$2e0&t}Q!8~!{UM#Yy;^Ht4?`7o0yanWCn<-(0L@|+0fDK)Wime$qhsVe zu{h|^cKw|2R3lO7OIDd-5@j56m%1YIhf&xQy7b$TqkJEo zjv?1yG`Iqih4Wo>GxJ@H)=<#KNClJ~G=EW*E+8a4lT!FW%E;^e;kXT;tKCarlK--diH zI1XR|*FAKt`UbeSyDy|H`jBG0`^EXe{e&B+$EqmS{o`|m0(}o^>x8~CF^ZYMNJ=X( z?iH{5@18h8eN~0qWJ4uYxz5Ip>BMvxk3h@e^Y`*Z!$@lpd>vgR%hQ%y6!lTmEb9b> zORX3PGO=7RO&vn6D{ehJ{Y&|=5j>3u;KlL`><-mQOJ52$pO~tXp{uxOU=sDKIibc2WD%_z_kPyS2qfz-B)z?$RKck=PEqLebF23N6 z%Oxb!3Nt_A_*ZWjB8-BT+XaekH^F;D7;c3@J@S9VXrZa9PneUP>TpuvmGo+|!)XP1 z+xn2jFknPI02bQ!@j!*6&s)zKLa3|$cTzd5WMMUD5jsK`hDQ{m5L2Jftoq3 zN-NM#bs3UlW#K0n8BVcc-U0ePl8*b)Tu8em(F8{%r8Z*O&=_U&(!fkvFn8~#C6;w9 zxZaZY7rtZ97x|TngF~`s7XJz@m*1$HjcwyIt}KYH63pJ4$qaa*6KdLZpKF0J4UDYztk_`s)P|yh}8CKl)vn;H1dwgc7!w4mCsCF>JcbfA8($^-7|>1B6?U&*j= zrodyyr_*-lpPa#4h3TWAgBc5{pNJ1Zr{&d3{G;EZi4fJ2IlL>F^AFP8dJsHXI<8fR z#2CMUy&{28%kYN>+l!qtLrkK}ARh^khpzJa$-@Q{B;b@d%1wKN!V_Sr31OlvtzRdj z#be(9yBfvw%SV*-&OjddwN>HDgpB;#d~BQTqRMbwLS2g~*e;y^7uRkiPHFcF7a!cUi1 z4lu!5{k1PTO_(NUZsSY$Mlu(Ki5fM7S_rbz%AdN-;AdVA1qr)Cq@;N&5mOS)>Fy0i z%n46?uZ>@D!gR+zR90IZCitJKm~D|o2q67p3F{zQI{Ahkn^=T&@}1Fq!hVl~yrH@z zLb>Cry&VVJkP5imB44n6`cJCM9Q}fEh@{Iy(E-D~Y-XA8aw&LLv;dG^i4-Q#dDpMjU4byVcNX1f2-$k%u;H?l#$nCl@DfEoWlB{!@&%27y}<u;=d;{R&CdQ)Qvi^<%jpn@pkeqSGwIRhY1Gqbq<~9Gmjp$#9 z7p(S~Ol@I%yq+?&$M=Z05YEMFCZMRwZa@cG~0|8$CfRbs@#@WR${#nB2FL*#lNEEx>z`~+xH%{{p(zad zCj|TIoqs6*&Uts9WO2&2GIHSO#+Fe`hmss>Gyj=c`6yPX%Q&J)+yksJb;Rhvp0tNYQ@rn$2J2`p6 znMpkOV7@W|V_eaxr@u>LS#^nlit`GOy0U%jiRx^%w%b%;r}^ZWStZ_bgBLc(= zUM=nrb&6Dfll>L)V-d^L=%X#q=%Hia2p~V@Rwk*Gju~^p2wq6iGbwX38MhczkjXzG z?}=TQmE!0dB@$dBbd=LFS6XtM943;<(Z0}?m>NC~mCUm=EF}RCrpGt5G_Y`@RFFz? zC83wBqqj%U^uDBrHDSi55;q(bkkPnn`KvRZ^*^%*_Oa8AgmNsfklzm1I5h*+$+0Su z6HI(?Hg7umReqC&@D#z$dwTYXg@oT%6mZ^_?jp|aY=r2}RVY&2nf;dCnGZ>fR9Fd# zO~_haKpynjftx3HKg5FGQGlZ(S!#@2`KzP9Rl=|PQWc0V~hua?$C4Y`Q8Agye}fPhA&5rA~NNRCx1?A_FcW##4=`0 zp1k?O!?#}>93MHE1Fy<8@9p-=Kdppd*X_9Tr#uUom(!l&@%4RiTNsVZ+ZO;q70rj1 zW4Y?Zr>DJiIMzccSqP!jTOq#TXahNXoXR|AcR_DrV#T^5R*s;2<+sT?I>{HPGR z$`wdL0x%77lq#L6O%WA)7=hUxsJTI(YrfY6k=Y}WWh-u9Dk5>62IW7o>hb^& zvZg2(X2ljGQpp)w<~xA;mK15|VNtLWr#z&4R-O6o|9lto$hg%OZa zzWVIz8-TjKbMgD2-aCajzB~oewh8dNZgaTknB34HH?bfyF#(Q!=6{%p-1VVP%-HIo z-5&I&LK1~@AYYp?Xj~C*|B;b1v<-A!H6JlrLlH6@*e<%@Li6^Ptsn-i_fF9oF4+>~?Eb zHW=dE5o;JJldb+KUaiDaFg4s8`N-|_jnVh7SQmAPyn#i)!_W5Bcj5&YYIOAOBkpzN z`gd}8k2c`Wdo8kdF`?xZugf{&_HjM3z0mXxV!QT^^Da@Kv4itR)9TBdxU89v54k+rzEHTnAiC-VMDmJaW2s!Hr1|Upm&VWxY`vFsgSUCx$9y}x8A*30E(#4 zIxz-u)V%?K*@E7V`QP-XR-H-HsQDT3;_^S6_2*38Sj0%!hLFVuhPIUHgYvSw4bTQ_ z3QKmAec1gY@9&H+tP`CfvzI>Ky}+V>8}F;i7GveqMjMJGB{8`%O)Q9-C{Gfr@7qPp z|2XTmUu+#jHIE;8J=9<155H3Xu3C_dNG_Ad)d`IT(#g8{nC=8^?1)LNA_?4{bh}a# zon+a{s4merN7!dYT?+hq;;8>lEbv(1__;{7!{T87&VZ}Ck^aVMi^;g}L%IP@aC(jU z{0#<2bHkPFxjPnX=j_x%ndggs=^>HyZPBPzw&1>l1*MUliLS?j5`)d)RGZVI&DKxr zEd+*P;4}XH`r=_I%e=4u(x{8cuGWkgA(Moi)H2~{mQOshQdla7bidvZ9p-3#?Z&dy zjOSnA-}~aCq5WDR!Wv1m$-ejaxMX~W*=E>HnBJ9st;t>-6ZR# zz;1+!oPUZ=hS|a&>pcDr`KC@+*KVhzEAzW!zZIuqQZtS^y5>o;>3)RC{j}X-k#oX1 zvH*E10d;=YC3(~5vjz3VjsZX!v(4cg^jtc((u%N8$qc`tz-W>^U#-d6|1}jcxWt76 zs4zqq)+wc*?5+gxpMvXep>@|5bZw_!$Y??y!Z`)eP#$OC08UFhyW|5pWn)p%VaO`C z*nJQFx}1h@-b!I(#H>lHy`=ed%0}ZZ^9LCDN}++DS)Qz#FrP{&aFfieph`zfD~>3i zN}Q<)6ubsUN3^so5^t};LFec#vEKmOR!@zO zry+w{S6|s1{YM)ZJXTwz;YyrBfU-oN-N+_pwy9RvDEFVIwM%|fSMrSP+?S_(X(Ypz z$E}o4p%2NgNr4MI+p|E#IT)CnkrNHZV(a;l6#g1-Lv>vzumK!aR%e|Dj#8;Ra19-? zb3r zEr!brv!U)^k7BIB!nFOOeMsyV1&Lb0f?$5hqnGZ8%L6suWdfe1IlPi0#%ysRgo3sA z7?v(pbD>L6Re++7c8?W9dvcT+NK`^1haOK zM~5EEcKQ;SM8$Sb>^lZCH4|Z8CA%cp(}r+VPS2lJh14~Ut{NoJU5dyq@V2W=rZ^bW zrH<)dz#N4Nd#vqZlx8BP3v~4rMdC_jxDjiKewb+A{%pai)wgwDJOX=af0<)`%#BsQ zoP(l;V=wR7(9=bPu8jARMarPs&g?NmHl#9tC3(`-^hvL^~pH)q=<+XM>}4a zAZN}q+e&IsnF3Cfjkfe3fA@WmXPG1Yw;fB67j2mBXzK2f+9QD(=)4j5We%H=BFCrV z-(_|Z?7H!0Fhj#)X_-~4WYfLwoQPd>!nJo^A6Y^&D`H}_-l~lffStF3D5LXGYM-9uP!!t%23 z6@pM8vF8EO&uQl($)FVQ&w94%#k@uD{b;v^yyO6Mo<+Sx+>hYnXF8$62B$ZGckOR= z*C<>bf~APIeZ1%2omn8FZpa4%$AuVCBclt1_rw0PSncJb8SfrWa!&Vi#4q24oC(A~ zm4V&n^Gv|%@t;|LYXVO($(~nG6H@u^o*x@?;t89-{n~qgaI(H)JSwuyvz71IfhHi_ z$gOfQgj;S0MC%;ise_&~u7#|8TBJR^psb2;wK8cfOT>^ERa}m!&Ru39u*reNA~V@h z*f|J_{nd_T0h>`k+8bwM8(E_Y851G3pp*ge2mwfKik$}bEcPF{lRwI75)Y>Foceez zXSli>Z3tV zWlyxI>?si=0GbA!Wp#oQ9UgZwrZ2D$X5#UiWk`Bp(YK*(f}LG%1M;NCU&~$IeHyBK zAYeL|nfm@h#;AQ-k&?C5@mIaH4PMhk2=GUJSGSR~6E8Z*ut{ zx*&!DTLsoFi30@Fm6Foi5X+osUUl9OPCTv9jIuu*4ou6A6UoIe-#>P;r@}?7MTp=; zlruya(z<-eYE?w4Idx$2`sQvv)>l>}H;|;Xp7isQm}5T2b=jOL1s- z_Hf>g6s9}*B9^3vX@jG{%(&cK@9DxbHlG^1=ov$!Qx{!u^_PMv;nX2Gr`oN3Y%(4b zvx_IVyYUy9(l7Od{a2bdZ3`#7EsK+k=?u-bt8ah|Y5|+^!R__56~tWq89Hpc$rE7N zpRgh!o0r2hk5b6e9||LM(3c`LI}s>>tU*6LXzQ~dQZ)^?=AuW)X$6GoqH06^!@o5$ zPb@s4pJwc;OO6EJh+j-QxVzo}6+5X03{Q%I-Y&ce=Axxh{04+eE;vn=Dxq4OD>Lj8 z*H4WXw;S^mW;HBSuhT z*BzDs>H!BI^%~QXC|omBo@-U$QzYxN$UeJ8%ngn6jBv?(_i9sGPxC%xhWbSpqn-nd z^7DtrQD}j=J(efYngmAP#C?EjlIwvgxDCK$gqB6w zU5{&o-{MZYQAK?kiqH6Iys+tTr{S{n!bR(RCBKynoWTs@5^pAN6dQfI2%&{!fz9w;=CNW}oj2 zLgDum|2UHo2~@jdo{WXR^C9d4`S1Z0!mOWt&wOoDQBYF`z2mKtFzSh<5`LOBySPUg zMbbOv;X0l9vk_+L7m|5+*>UrNY&`tTR&H?c%uOwFX2&KPwO)(4b)N7VA6m=Smx=4}Yu`gteQGLbwYW>hr$80a$MU?OXqs?UN|l%Sk!HIeO2*$;@Pi z)j6CC3_ZvG?BCuaSn}vtf1x4@BrcL7cUq4jTtX6hLK?)5gyuOwLUCsLz|#k}4hcLJ zg}cn7xqpfXFH2z->jaAlO62kUqp*XPP$JuW+Jtp@_q0vg-c@W=TRmTXxgm;-LhK&f zRqS`3-3)J%ibzsvNsn}&5-n0ZlaVveA z>1xZbnUNlMo|*)VDx)*3BD+&|-HCFYs>q{~0%e4SB1_88CoGsq!T7pK$kLF>Ygt;g zF)*SLqQ3#)`$qBo9<&QsM@drsU6E@k0j*{aK-q7@|aGJvP~9sIul_(qhUZ? zlu#)krA72te%Hpst4nM^5Bk9vBwku4v;5(z&i4{X3YmKYtVa)Bs7fqvhPVr}Jlgcu zv53?Dn=KpzQ}}~w#yi4W4@WDz>4PC22xKuUG6q2 zk!j!!-gYi;-}Vtr;Fk`%;3rVd%Hu8G?viaM_fjogH4Wq%39|kMP$~G1cboUm;|&li zs{Nv)8k-}zZ0BWZdA&4!mjr~j>(^Rv8czR8LgFp`9=GllY!rg_M12vs`pmLK6Fgj5 z>{CMz|9U+BOZwqx&3tHCXgb(2sDuQxai!Ip0ChmDlY77 zwc|^*78nkH5plAc@xD5{`LV*#;}q(ZLLitQFNl|PP+GS{|5dK`M$5S^fTr`OkO^=; zGBKq#u=9gD+EYlONJ?N)tXgIE5^pNEd);Io&BYeqinbhiIHWy0HvZY8rh{1&Vut7D ztzq}O_LYB`u{Nlp{Lt={zHscf$U6JKk%K0IVb$|b?5wPYw!!t7a;xp)U4j+~O!l~; zl}fT2fPE1TtKnA~XW1Z~C1gdaPyryce?_S756_>hYhK^kt6HcCxd}->6FgbI>(`4( z70b;1v4v}w;Tc&K8MNVWcsOq`9Uo#0EHYYLpqdf&LQPcE6ib`Uyiak>ZNI+JjKlX4OJUX(}(e&>Yx?X`Ejy{YS_&B-fzlS!1=9SFyRECPwOHqmE zC`kG1qz~#hwxAJ5VTYw&s^OqOzZ;)>r*A#7$;=wZ-&q^lSAh6lN-M>1hte9-i#zgi zqgk8k)yvLIQY%Nt)phdZQ^Fad>US=Q#-ULbP^o|4@c+%Fh%#4Qd__Oe(bVtbCOTd& zN6j-x%4M`)1OV-zJc}?U+9!F9*~64Qa^xV#H^6zGi|IY3NS|omJ7asg?Kk_aRTBp)k{48T-Jtom2i!2LvN1iz+PaxRLm|hrd;=OpZ|f8xO}w{{~ETm;ykVK2pn?z{PRdIqf|$I$;6~wSF;Ot zD%S$%4N#Lz^t{Hn?~Ye?ffi0x?#%XGZ@J+n{3KaFNi;a3hcNjKz~MM&z2xFx4a_U) z;4q}1Qgmhj^(&EM-&rdBFsGeoxi_%*w#fQr(m;W=Bz+SX6Zw{QB$$AC_YSW=vTIst zW!;teH_!>#gGnv{+rzlY8A(!k!Jj{Ze{spvT$x=Q9&vjRd$O7GXi#W)_QVn8LNC~F z?-F=e-bRoN0~eAr`#nhm(@5%3yky_rs9Ayb7U)ZX%8hQd-KIa*Ub*xK|BxkjlUfL7 z=vHi5KC4JDBsNW&`P#f((j;POhPt$FlI)dsZM#Yv6ZIGz(x3Y~r~A}IU!$!P9R z9?*2D>jnbw=Qvc_R(C$c&!`}^$1H=K=kR!W zHxdA-Jn<_se7!7_FmMxUe*?hg)~&@d{yc`-c{MNnoK$l$VraYxMJu?#Y;|}iT1@gf zT4$F|bSVO~ISxgq)`w!eX$2$oISy|)fFX6OIXQ+kGuq|fdjuY98{D=oJEXL7=;Jtxl* zAiVSf;a`Z7fg#07HbMU8O9w+d6p_2U!{0lPmJ%gHpUCVgHQ=6F4#Pz99wR*bdg2pt zUull9r!1zId9gZ*m+0(RNtDotglS|Ic(T@(c26;&8GN2;#1l|rB9<-){FoRz^SAs$ zXYiyZFlSiJ8c}cAY0*ddh*s#bmXt>ZW8;Inu@vSXpz6KMZPqR)Y1{p5mOk%`BQHtY zry4+EY>m~1{8OjcfGN@&0P`E!2!UQ7$;k>~viBpDWKP2G_WL~64VEFr!&Bqh-tYCb z@cYZ|$FbDOK+d?J=k297peMWr@UJjgc<_yt(}SUd(h~3JMr*l-hT>x+cUA1H!1wSl z!RNHhrJtK`{|BK!UcUe`xW^25dE*}hRKrhS#~No6X%V;&_?eRh!@M3HJ#z+5&ruv$Vt zcKpEG*=dBDRwR;rmXERb6@P?r-Cm6=?GB|4+R}gZ8Ik!Cy{g)e(b#`o?R+nuyi=i7 z_#xtrEcC_iriND5QA_^-Eo|#RLmp>huD0TX|M3wkBnvV ztD5sqdyvN#lkIVks@i{_fSex=sP>&M7~;4VE$1WN=H+no*3V(%#xj+AIlTwkS=99s zN2cqck`37$*1FKwymGCrJoTEHyM{d3e)q-7>(&1NWeyA0Vh@U*07Ej@4qU4JU)Z~b zrmM7(Fu9Grogr}mc2_PROy8=w$$!I;)A-?CrOW11YE5%@EpvbF3b9cArA13x%D}?w zWzn1~hY|gfI7dRGYu?Io(kx3_a7yFa=Yl*dOwjmCqYiW1=)Li=0bdo4TB9~tN^$0z zXumtgJuc!#0L?dlUv5W{s+)TRI& zInG8~*&-q?5Gxc)uFONx5nKbUP&?*ZD$zs!MoWXL>`rCH?3JXc% zcIu7{cAu!}^IGMVwB!%}0ANc`;->WdLP~!M$Z8^aYvXWpUD$$@2&{1KxgNQq)7CU* zMu7Gm+U}r_V|6n|(D{KT-zq1JC?nxcG&Pj05$K#n%~=auhQm}p=SDuHI1bMCQhI#B zz#EK&5Lr~?t2MC$w>$6g%1ZE$*>KiJ#MSb$10?}*=Xe~zJXnU2?$YabvFaDJJY;{@ zS)p+Dr(GcpZ5<6wL9qSU&A&S@D1D2esixztM@^n5nt5rPJDlIT?YT|%AcOsou7^TD z?PpQ@U3hr?SBA8Dx>%d~T`}itpCE5ICeCOl7qJeuFKc9|f3gpWVrpr)M!G}hL=8@! z=iGUbAH30i#N2xm*>sP!T}wamLmGeCoC_y~xpm0>XDI&qE+xdAF z9I$6Cr130J{;Bd=!xkqXqMyZ<$2pkF3AZiFmcJW#M*UUJd`;z(qnmJ7Gp_JAR}XdF zJBL7Ac2`E8ncM!p4SvwJPI2#yBT<9P6Y`4-+=H^@mE2V|bk?VgyzR{8Z$1d>5gWP} zpK`ZpJT#Vy-0@o8%Sz&oZhwC&Sr-_pMOQ+OrfFLF++ElmmEJ1j1U493F>uG|jk#s5 z-DuasV+Ffo3SG0BMQU1$q$ed;E9Wo2^-^`>#GlPqYv&Co*;y1MnWa%K`C1htBD0?1-wjeWnb~We#Gqj1f698Oeznc(%up~~-?H^sRmC&LWq-3nqXg_xb9G1t0Vug_ zR=cjuEsN6#9dYuPWR5oo)c`|`EV@T+bb#O}12!oyZmS$n5~pPBQf_dC*y)s^3(!a) zINc&sl2Q?L&4eE3;R}C`Q4wH-Cq-Kd0Pa$CD9BAX+W!D3pp1>lM$fu?Ci?bHGwzj9sg4biG>ah_{1E^-LW@Oh zga|0wdLRP97#UVrp@KP4w_<|A=zz)s@d$2DbXGzz07{M06$yWIT@V~xtZvC()scm5 z`lEtrX=aXiWOOq`;P~ZXvzXv+2qR(+Zh$K%2k<>t8Aqu;mEeAZ5Si^emXl(BfD)n# zJ-PO2`&rTP?w?J=+*dqwoKF)(an(J+jIID+i{qZ#i~EdVdLizom;ysRSpa8k!O&fpVk*++h$Tw-V!S*3_?+iZHd`ZAhWhSp1xRXr-lnEv=)HB>aA>Z`^ zeb#K4FZPM58GT6lGc7Z1>Es^)X-OZJPpa$BygByY@c#f(iLI@JSJI`nM6}{iKCCL) zOZJ=a+f(K8xT2b!&e&B&Bt-r#x8}0Eb6ukKD6_Cs=|g{wxK6)^!-I7OxK?ShyY?zs zdp7-^F4OWAH-$B0s8O-*2057TE?C`%G2qyP@KlEiadi%;V$?K^MxMSVxDhoxfz7|s zJI8utS{EA9>okny()f};G0kop9b*UU8~*@M^?oXcrZrkPFWTav=YVxuW=|b6s-cFD z&6UJ7d6IvN?fzD~1N|DoTd7&Xz1ZTyz}7;^%eJc%z4@c$tra zu7(Qc8Cw4UE~YT{0^hpg4h^!VxNy@_QP+xMOcYmZpUY;K4B5RoM#9R~Dn)HtIDd|M ze4JTVr)e?9`C*#6IHh!dvc@x=B(KcBrTP;fg7jxxt^fU{LlYqRt#F`Gd#@s*2Qv;>cE44>e z37+Qw))rX2gVUfM*!Hs?ov~%LMyJ_R#n1j8@tM*q<>b*dceXc|A51fB$NK~KPt&sc zF`<8QRYDF3A$-l^e-7!mXMyUq8m9>AXRHF80g})$Z=99tf3io8gNyiJXu73E_02V* zj&sgui)O#vjgQ6pt}n`X+}HIO{{Y$PelN+d{&_#}dbSNVl(z0@C*5SabrVKoW&RWp z;wFX*IY(FVKyB{-0OY*%T^@txH)1kPXyrZm%_Cjj|MMjspD7x%OHTqbs&8Rb!=g7MXt} z?omD0_Csu4TA5P>i=OGmc1Ro56L%<;Gh!@-v@#0Uh+%BAWB^y|Tgy==$xXGkA1iNC zXDw6x^0nKWFID4y*wZ{$lltV6{zMxi{gs3O5^URDYwW=GA>AhTvR43*V<_E_M}5>k zDM`J;%OZ%K0!L&xM0P+;f`M$#i7tOg%FE#;u#g>tWDYh)O^HpsizY>a6L5!{2}%++ zO5!~jNH;*^j3qb90&R|}MfxD24Z1ACOq90lZ$P^UM#zp(IGZC@L}Q8qNJVpP(38Fr z)ebT@PB#D&nqkRLbX3`U3AYD3A_XStLC8-+husnYj2ofQfn7KXYWcb=;Q)Vz9h6tO zDX?;s6LimIY$TbwLQ)qSrdUqh5Sy}cruEv9WHi7B|&feL)*^yz`v!S-~)T@(MZYT z&l}9xqLW*BYh9j5SPREvVPdP}B&jmw*R*;INc%bPhX=>auj|xRvkaJ-d-TPD7wf-# ztFI66#|F~4vrW)rs29Y~ga-Wo0C(AQ4-QVZ#F}&(fT+`*Pa(0IdR~87cfMPHPA}i0 zx9OY-#Jc99=T&ioe1HgLHkT8u95=o|w&Uci^1p1*tLW`~KTib%qHQpzrfA8Dpfr8~ zbqTb8{Nutknkz{CAlj;d30BTnQK$Yp*q+w*;W*Jk0ET}KN9 za^K6bXeZRwnrOK*pJ{*3ZFCUM<`%i*mPp;WaKULE!Md0K01IU=56c}p8XZ$1Zzv=K zZOKynN2RiZiXTx6M08rXH4P0IWW)Yo9jm5Oxa#}e3<zxse)(E^)JlYzZ08+b$`?oJFZ{FB4Phnq@(Pww6nW4V*f(j-Z9y__mWu z;7%8(qNtiyRfc~!Ij}R-WH#F7!oY9->(6sD&#dH#Ipxl?LCH5b`mL~xTwGs7O~y&b zv)sHJ;|)&}@TE4iX(o!EOR`5;mbK$?e%+Im-X^v|aV7o=x_Ae{&Ea1UwAvXM((fc0 z8b%9_P5b2jN?(Y)GU1(3&ysx}owB*K8b24Tv~tS2cqS81Ut!xRr(m7*(l$mA9@BAgaH)SpNWAa|gt~_sS3}MnO-NnqmDm7xx!5kQ%0CHwIh)C? z)T7pQ7~N+@rN_?JyK8eCE;GemCThC=mq~x7Lo29s=wc0$2t6Ki?PBMVzp&UO@Xtcf zb!|#mwW^oWlVc0o-e3>7>+xhHuSl{ot)9K%9yZ~2f2)m;nIH) z0O|)X$6{6O`i7OIAJOSzi}Z_M^}nz!Vd-vupO{#hcGEQ{dnELoa=xT7&V`zM4IY+@ za~$<5^`YxRi$5Z`HT_l}dTzuA^aL#MX9uTMEfV zuW6Li!%+mEqsJN)3S*BJFCiI-(>?+ zkM!!o*s0=?kdtX;U^YEYRbPp9$n-fo#j@hgdF0nY~ExW~Gk*1REq5pf)ChK8b*rPp+}EodK7bMU<@;g=lPjaw%{&IiA2ag-uI=&}?%3Sg-BckZEqMnVBv{*D*9dNsLTkt{| z6Lz}NuGr%1#rDrfbW*j*!RGF$I?XpRa_G9vh;|htRA?lv5MxBddgl`6|M}+kr03G9HPMiy~5g( zBmIQmmFnuWCUfKiS#;xDViJboD8UJe#~24h`*sP21+d%;l*BakL3&$`nNYyxPgk>= zmE+s0uk&?YhvVgV+B~Pp#pux#04#-1_Qt$4|s&Wh$&dF|v?M4* zicOTT(4dqXEG|My0b+j=keg*-9a21~KwNvFKM7855TUV=hdr*4tiDP|BhY9Pa)jFH zTu|?1t^E+dEK(JOi}hK|m!b$xN&+wZ5fXszrP#(BgYL5F3KB>55uwn)DM7wc5|y{I zpuBOP$vEAxo4tq85Wolu_8&yI>`;Mz>1+{;B?i|J5nlaMLD_#qP8F0ZLzl5c)3Hr+ zA_Xf#u*p4A17sxSA;D1qb)_xAOosrAo84H!L!DPb@VAPpG<`}MS~?1P%DLXy;^t?l z5`TDQbGzMb>H57^lw^G*rU_o&Q!9S;j^G}i_DOZnYR^XTzuF*ZRc+C9Z}_<&0y>)5 zpUMoMwAk=Pfw+Iax5-y83=X4TNlmEK)6~Nrp(u@kgZ?IGo|h)W887H9U`Y$l-Usj` zd`+wh?Latb^pXvQ%#Ru6A5X(_y&<9aiKb1(G@3mHOjTN^IEFZBoLvM>4U54N0$XO2h{hFE=hkofw?ER8=P!#O-`k%Qkf*X z=CgdsIe`X4_pR*E2)}>J%$#B32Afyn-FB~CUmao zok_e|!!>`jp}+BZa5YrM-+7k(V?p@O(RurYxRKmPLhVv{9Xw`27)$>7AGPuPmEVK- z^_(%O(`vO6flCv?a}VvX;lkaBy5~-OT{FFh$8(1wUcX#~MU%`ei<<>a)+D5_aSvz! z^=P`?@ga@jzALTMnCsGl*=eK(;z%TDd`|kc!|;DmxI|%Np2r*W0=kBeKqCP4w(Cnk(Ek8MV{SfGo(gdh7_eS{CP$J@wsc)Z zQVjZ7dW8|FzQIdWI0l}I2T^#jRi#B;m5pKc4pi+yz>qyZ!bj1!CMt3#>tr5%vH%5-iIR?PmRzu zfj9tC$=KYj=840&RjCIn$UPOPvh6CnsYHKbsdg}Oy8i$lJ~MIqIDaRO;HC6xHy1=s z5EEp9*iXjufM*u!c4BX>$licn~ zW5Uia{{YE8AZXgm-l}*i8tK2%cRx+lRe;Fw8ViZVhDx8(cne?G9MMOl)k+S|^2{%?;O z-L!OYcp2pFszoor%~yzc%R$rh9TQ2Yt7|Xk)U|{~5H2_`IN5q--)Gw0dV#T5SGJYE zxeGbZ*7ggl@Lvn*{4=G)M@xTC6*Nr)(HlcY;1#j8H1RVo9rs>qH;}T<){j?)GQo{U zvy$rG3Nv2QGzwbXLZ(UdnlVD!kN|wq2Ny6urQ6I}4{LT?T3>|h(IabMo=5Walmb^q zI^7_Xl*rrr6|yy2H?qa;`MSwEmf4~?GDTOTn(CsjhiS~ujyc%f+Ae?6eiSx^;%1Gm zR+<4f=$e5xY!w*iJ(_kW+jU^^KCGQR?x#G~=ogiEpGuZ$lQ_Fydx9`W)huyFdPvdS zZJwvAp2FVUR2_7j*Ic{9&lcn+Js*f>yqIJa&;72=dGFcZk9E>&UL+V?5obWIaq(|u5+wQ%OTt=F_y__(w=T>sJf?&^-eyZ5_5&GB!S=dTIi*b zb#e3G8Bp_4bGv0@e0=vn+8el7CQPoam6z$3ZS1Ss#W$1Y%AMML7I2t(Dd zZL*0ZiVa~NX$v4`$+-!Vpxe5Tf*(jLe0nfV>}!yTAoM7t z*dQ*tB6=Wp$y9&7#z+@h_*s$=-u75d6mMZ@%an%W;UPI#P7rM%RS1ULB`&rC6NLus z5`GdB>=GT;Z|tmYhM{)_BFu$@3Y#H>f!zT)O5%d|Q6P+$C20WJG#zy4$y8B$92ogV zG823CD4J}FLWD4WQ>@zwrv2ci_*aH?9x&GFw5=|k)ir;Uy3J_Vdy~)(=t@co*wKrV zrP-%NMLm4+Q`5rwiR3)2jy9J$$FKo+Zx4RSd_%-yDxGpq@QPc&*f@{ol0O2tN?bs8;aNBvF z;L8@9o7S@}suu2&&IwLPHJ73(zUKR-T1V?Fn5us@XqMt^jr?*x@ z2l9VbstRgW02vz_Zh%=%Y4o((j6%R0psL|lw389B=(4<$eX{kA5$RC<1PzhxWO0|g z;5DM;m1mPmW`m=@Rn+AW@)5~Q*Jk(qqx^!WX?l*O!nLNMwEla8OLwss>JN3zd{N`h zEYvC85utg5n3lF858_l!y&~LLevi8fFkE`S69?LKhk4$zeJAQfw+H+ zY&HY6mp|fP12mmkj*=)JO)b4Lz~a|i_!K2bnEZ@V?j}da6YFEkGIIm&wDnCOR71>1 zMMj^4_=CgB;WRIPt*5m5<0!Ypzwql6g*dMYZAg8$O+^&^33PeacFQpTajE;C_joH>dL6 z{{X7P_})2DdXkbVLa6g6*zRF*x`mE!){%8NLlJ$Jr*vm-nX?5se@)btCYpa_aKhNr z^!|HX6=~Bna&75Uw?XWz*6Br*r_y#@Uyr5oT=wmi>8)=}5NUF}w!k%cQ^YE-J5rIL z-_*5W{fyZ(RH)+fCB3&QavFO!#WSMNInB8RPP&Y+3|Vwh&XEr2Y%CK^Z!7Gj-Ai?+ zG#ru(gcBlKv0{qgCx1uu+Sz|j)5px!xX3OxNHQxrwvs9%ccoJ6Xx~R6Yr(fdy3?rn zffi7@zYn&mHv-G8em9cvI`m-j{59l8*Jm~c$sAOMrKHQJ$U}iFz8s^@#d>UcW07)+ z`1#0Ci4-W9+GA@?*C~+}Sn`5is7!2#2Eu!~h8= zpxt}x?5E(YTph!aYPEl`gRIxIK1UIA6AnWM^Il5u1A@mJ_>-p7%Fi;Anct;O4#YQL zeodFto)w{NFvP};006LFXXX5d8p9v|I?aW!i45TAWyRG2MSFR6JyJ4j`cp=eS(s zThoAZv9jzM)i7{&7eCi1?{j3)W|VW+L&|#uvD?$6zTNo|_A~`AxL!E5cUc>WU9$_2UK>&~9xu1x- z^Ehf~K8HB_yw@e>a8*2j-vNA z9*6$`sDCxt-!m#(zWap-sZfWs;Y|w(IGm!1v&iq!wHjwr&9HeK%zwCW{%b3^H_iu? z2Lqe6bclZ_{Hxu*_HuSb$T^tWy@Yu~8y&R`|g;doiuBWFI8lBxU zM=Uib{{T>QYroC>SEXxd;F>d=g~>chprv&L&5$<&;Pt<Vw18Zm!m9X&!GZCj8&L+uG}{@Wlno1BHLoljEjGQrav!9*$(?^!`fmr|5zh z!<;Shmxpx5hP2!9R!N`@Xlr^ZWXkQ`9RC2sQq4byr*_AbuN>-hGHQCXj^!j5FJ1Vn z6q<|zju1~a3gvNleBC{!N3e4qwpU@Ai`esrD4g3*(Z5EF0^Ihp*`A2lV#@D6mdM@8 z)?R0X zCspBwRWZP_;PhPIU*ReA*SYa9zANq2FGGJFJ+E%pQCf!&vStui4gHpk9!#*k89a{; z9zv(t=BEoBge$1=H-^GzK3Z?p$-S+DxyGlaROxdV>S8Q+LUun3(_r#pm1*qqS^P|x z9@dRhlo#r-p6E-7TJFp=VR8cNtR~3~!WJ?Rl9KjHZJQt=6w4?g>lE9LLL!H%oUebN zP=^RXB@!29PFtanq2Jw-6MgowLa|8`u?fiOg@mj-goG4>QH0$9+@&`iQe8qMX|$(W znICwk8dWUN(BNs?@IsqL!9>U&J%3Mk-$ zozk_BXtjy!)ihe|h~qE(hs1wg4)CWEH~u?Aqi z6%fV_D78D!AHa4TKQ-8Bb%-k1Eb#1abs=^UxGh>PGDT}HNIjfxhgsq+4o1VSXwx;f zx9L=WuZaEv#_oVR~OAk)K!TV)xk zX-y1rn5)#IhT+E8>Z$xy#jsJ+y{1933qz#uM?T|DBYzB43(5MY8+;YT{6p~sS3>qN z`L{&xi~MXW8zfDA?XkMyHG0gICB@DzHpW)$c<*9lnueKe@UC-T$L(P^5=AJtzyyB< z={**Y$dQ=Yd4s_DZ{mMml-D1==d(WSa`ojMC;_Ado=jSj1_>saZP6qQiM`abopzTU z`zQ@D{#$d7!AZWZ?YBjXW3{~zReD=$svRtX=iO9zqM5C`TG3^9p0G8gQ#JXUBZ()f zn;s6zB-D*#$slD5DVp2yuU`0H5$KbHXDH#nbN~eh-X(YG- z-BY-q#%()84~l=E{x+-&d2ydhPx*?!9x3E?6lcks9wl;R%C;6ZH$G=a8vwa;umaiOv8)l2<9m1NP;cx`37fp*z0wz5Y58w+i>_OJ znvs#p*)BP)-0YK*`x#?5u7cv}fmGHzmDUH@IvyX8K}1&;yA+%t0TDSUY%g^7C_>2` zP~RKnVRC;D>?l%i{{Un+vRm)nB9B24*+72qPCFqte4%7DLHZ*G;WM#LH!7`{vDTY} z<9AGh*R7L)rWE!M*=o2qfna6w+KEU0MglFRdZ2`2MHOXETifa_qwfW z5L)B=3hiG8^jC_m9Mg3e17@Rv?K=Y)!sYxi#L?-| z@;$(FyL0fmMwPBdQ5ds<3fy$9Gag<`Xp4WFfK4g$G^*KY2saVG*B|GR_^p~l#1tj5 z)KSM$&;I}{5`pz0)+)f-=AYWP)iW-k<^I+?rs9^+pOQ^&2J-&^C)I=01rw^14J+gh z^$34l zSt;7sDv{z(A4#fLOUouXj>U7SHMtzZ2`9EzxZ%~2=Hm2jYx?xH^$+KD!By^Z4`h`R znLSy(&;m`p*2u<;StrY7$HFRsOX6ODXL0lG;X6LsIaxxl|@*#>lGU4+pW}(Db0nI zM_ANuUDZEdTx@KA6<5?MONq*{MKN1TNYt#X^%6?d71s9oT9uRfj&7r-sWvx1MS6)- zkv4T;!GnK$ty#71OWpVO3cXQUS`DtD>nmSv{)yB|oanOE@in$~-2#QJ;_-hFH-396 zo~2tgjfweGO>>IkrgNItiRJ9ma6YSEJPv&r@_9-fohG}E$PTmYJCdpT$BGQ6C9%EJ z$$JK~x}eKdsOsg}c#nJoZ^1J?Aft7;$3200?d^5b#o|WNk;}{G&8-spry1&+mBiAR zSnLR*Ir^0WEk~9d8V9-uyj*_^+*|v))qA|b+nYB7qU=K)ajHn;%5uo=OgMmby|PM2 zyntBHIf=nYUFEcaaom(pG`-y95?i0DYWgd0+Z|&+M}%Vk0L-CdT=&}t87Q3BH}4V5 zeZP`%tr3d>zIm0jS8Q%V#({BWj=jp;pwr(`BW%*=pSs`O37SfF)J%U#{{WL2wTD+L zZ6&lyFENp}S>*kx0qf9NW63w@)r%eWM}CJD8=Vmslzr!0Z)>etsarN1YaPm+sHbEw zws~W4sF&1Cg8=*#8hjLfT$5A@e9nxqA>Fb*t2ZrKtz%sfV?&I@ULz*gweU$=H9BF5 zt#n)3<&8J8u+}~&vC)5ijc#LRn~~RV&dIGt`h2a8;hv$JHpG8a@yQ@d915_R@g7+L zzfgBi2esF+y4k3Xo^nZ*jyAC^$KawQCJ9JsKE(A};Vwow;;xP3gY2+wnTDWBF<^Rx z_3)m|jWweQSTYc}(BzL8DiwM$>&zfQ4nw!>eKxS_IC@{{-uWb9hc931J*yl__Iu_ z=H+W<4R`uZ5Aj~$;T=x#v(<2ImF0d<9c1P9df$o3%M*vu-ZUD{W;EX7%HyY1a{-mh z_;SANXuj(8rPhCPv@bgJcI32NVV|1TPC54qCYEtwVz-$s+qx;)m8xc~V7>dOD(3Ta z`l;#2Ad9G)sO&CO9Wt+|#e%CEjCQ^i!o8Qhm1k0B{ZK}TyG0*aiWzmi>QK?6gT6nCyeND~foP;T2U>(pG68Ov7^OYuU~J08er3u7y1?M~hq}diz7; z>OEqXDe3APD;_Qj4ek`fwdOwe%X_a0_!-0+#|&|kw0f4-3VGupusk@3oZRzUptdiz z%hMG+Qfa9Pk=&-&3g-h9iluGB;=tJLaw#dQn}>cvezV>9EFD%=&)>8MJh)oPuPyj zQa1+aP@dfrbOdctPx>`%6JFk1+VS)t{{SWK)>iqEwnm$Wv^XD;b>N3M{{R~=XYi)0 z`geZ|X!RV|GEu~D{{TP>50tGVe~+fiB-NH-%8RS4!Ol}v6+m4^)Kv4kC1OdNTL!kL z2Ko6=RdRFx0J_|%n&kDejH!N3ZmmmYOpl$nB%G}YW4+XrpEp##EAb~r;d1Dtl-5-P z%j8qp#5=J&1+Ea3-9=fGCP=|tof4B$mji!sWl`cTC(^VzjWm%8)ZdS_;eyioth-soRG#k22fo?5et8&yA zFoTBPt<0xmy~H zH9AEbYU$YMStNX|ZLMaUU)%oO)pJa$V5(!EmPPBckKQ2T`}R|1+K(1g^Lm{X&+8w7 z7`4s5e?Mfh#^WvY6_b+JWJ`bMn!A;>&;s@}G!rGrKVPa!ttv_o*VmS|SzT+miw^m| z-_>sM7L^`~%27`=ZIrYd5`4|R@#r$Dx`w9bKg@i_X{~1$eb)SU=$bL)u00CnT4C#k zkiO8y0~wBREpVY_cQb9w9qiG%St=Ok^BFnZMer~_si&9n`Hg2bPqBYm;*=FxL%BN{ z4lzF97WK;CjzJ>>g|<=CO4p2!P{+b@ihDf9P5Oe3l+HG+-y?LFAo z@PWrY5nl)iB&e>y*{BV-MBa!2xhRGWk{TH6aELfrH*l1DDPl3^II+RQ?*oPF{{RVi zm;6_UwEB|kxzT{^{?LEHUOop4xBZ^@h=x_^Z+>HNnlbEfe?Q{6KO>KxE=$qZ_{_hL zHy7;oR}EKTxw`0jO<64&Tw{gx3$eF$%cf}6w++r$i^!>-$?Y8ql7C3el$>*1d#c41 zPoyb$C%6d~iW)a$em~u5RUT%P@sjPm*0lKvtQAB>V{go>I+TBTD%n!of~(q$SGtI@ zETn4j;oX-w;%0hXb=0+Z53AvG&LyS098;PWjw7#CKStDHu8$sDxn%cY!Tv|+ySEJM z4AnSCNs*)<)HSE+kL0+o7Ey^j#ynlF1Q4fu7}sAWhIHwieA+o35d`$U59XgFZZ`Rt%IQ#5dx-07xpXguz@zrSTdbK%j(>H;e?{gC77PuzG1qJo~&Pgs?wIY?ag%=S*b+>IpvX&vi9bC ztS|CbP9}f8TCzrZ!OU}IA3mWQ8t1v~4QM2|n*aw=S2^)VkDsCGvD4}9WVJOeEOEX0 z8El*!9>sCJL&P0UvxlklQ7{yc3q9=znrxHmJ-wGp4~0CbOQV^a&5k)Z_H@q>yk3RW z($Q#jStK@E=*8?0?8Xn?JdKrMz>pA=zV0*gC3X2Y;A#j_F6Jao=CDz z=fCt!xrS-A%HCJtB-EHu!5y>3Y4%zN4&+UI_0Yy}fN;w^IhVHFg9BHA_!E>ADM$mZ( z+~rZ3wG@l6tCh2FSEzLyZKgFIbf8(_ebx@Z6$Nq$0D8Lr07T_QW9uqiE6+QLBH&yT z+$Z$fcTX^6Lzs=oI}Z0(<4Y7RgCw3wQY3T@99Gmf&JGm!$!Pok0Ok1q0J65~8r**x zGi7WoV32xR!ME3-zhJA<*3Y7}iC+t2wVK%OU2EfhxWH8U{Y=(M^K!< z^Or^3mMHO$W7_Vn`s#^l1;d}|c6YZy?d+oIso7s6U~`zum9asm%c|7|HP!&w+Q#GI zT{wS%Dkx_TnkcGZCimEcb7qDl;}L(b;+98jXH4KeNElsb4Z*f@vZsR~jJShq?gq;K z_BIGZKn(z31p%ndbA`ixMBD7^#|%>F=DbJ4qLvdRL+V=6<)nU6& z#_EH_RJUV?=DK#L1|5Y+*D0>oCPswp;XGMIXFlOmxKB_z4;z3_ELDH3&u(`A08mHZ zx{nsoef%yx#Zbve)>X%UGL}IuJ8XXirES!yT3;u1&UKn$cP@p*lZMLRx%RVA4>Ihg za55&DO|FCoo~k}l0a8`+0^^ktBe{uIA!(V-l#eJal&%DusqC;t(tIG)#1iThZZ_v@ zWoY=p{D@rG;1Zvr*Q$7aV_QdWJ~leR+Z&4;ge4a(A)_ukJ6C@c@xGnIP#4xzwl|!z zAboE53xx5%9m&Q#hM>L*M!fkn?0yLSuV={O-zJyx!<&J)3CM_ zWVIf1oo2Ow9hw(g$MIu}Z*1iG9#pdavC=kbYoxoQZP*FTk2g-Kpy$2etQ^kXz%5{G zEx9{?y4a9526BJmM>u+~uv=X&j7eFw3nQWeXTQvy-*hyK1*+*>=NGx$$FfOSV`EG1 z*SjDc?3gYNy~zG3M2(L5jTi^;KwbdYXLQ@-9^&1C0{;MO-?>&=D`qw<*4+x00nPKjvU)N>>Fr^HL`vbe?OaC0Q;@U%H5Je$c>G_ z7P^kp0Ft&t&;%sv3QFYRpP5K=>Sm$#PH(T`D zR2pPQ%Z;&^~33(S#wG!l{ zNU?vq(lj+GxnYsS-~v}IF6VJ|y4`dRB&hOq*@!kJwp{tQ5)Pv4t>P+8oR2B~$rBVr z7=aEauflle@lo`1x)*Xd65IX?L>sQOUXCo2VX}auslBqLVw9fBB9?z| z7hG?2#H|D(Yp>ZWo6O&3VP8ZpqZQasMNrl$`Izi0)pU1lkJVN+Xl}4o82eZTWu%-}nx+)x{opt^!Q) z-IElx#rir;1u=b&>v~#j5_el#T_vg7NZc*A(%fFw0Z^CNWi6FT+I$>kK~=|gI~G?O z>Tn4*3b$VmE!C(?vygG@FQb{xu_40uT(4BFCC(QM(Of}IPg|$DI)*jeqXomF;(SGa z!?6k6X}~SNK)QIcUYXC!i9M7mhnEtx-GgAPGw8El3^-cnMv!EUmenL-lqiJcAncXR zBHa|UnroTSYD-R9dZL|(X*^#Eve4i`*x-e<==WOEHpc$|ikIwq*2*5KPH8J;h?@qV zPq^v-0Cl42IhkQ#J9buHEu*_4sc64{FQxwg$yM)X4x{obxq~M-CUCODgxVg4E^+}j zX&ElS1Kh2UW2LjXgPhygd#!ltn;Q#x1CLU3`6eWkq+ahV^|*U250 zoNeW9eIsLZ=q14O64v*=;W1NI1!MUlH#v4m9aDNB1@CpePB=E(x(!ZC50EmQ(#VdG zy56UK+xJ!7$rdd^nIjult3wrk$sE96rMs!wX5@R@vl=Yt17LsIK~b|P=y)V~0`y+!*maam}JiB4bf|p6tWv!O^ zb_Qv^GZatP9-d$-M@p#=fSNJD`UnNUrm4&hl6KptqF2kpP>2T@M4=y&e z+n`$%8e~+g1+3e;I+;USb_E0fvT$BHppM0TM!D^E{lRMhHCo!w1pH5a<7>T_QG z(k-&rq9U?Wa#T#x6}MF-$x+g};Gg2OBxYr6i)u??jv-^r?EBeOBh1bBa+%_}`Sk`y zKlI!Al@8ze(Ver=c5p_2pm8(1n2wb5>n93>W8?Ht6!vO)#^iFttk0J1}rEH=$v zTm(r_?yIu?g(YKqAtL1{DU$#|p2)$<5uK6?gSHgA14hI%J{egf4=dV3nnCI|Ubf&3 zcxyT(1z>f|v9!BAdj4z3px`d&;6Auy)2cN0JJ(L|_KW_*zu)+Ou1CpZ<%vytI^P$Q zhF%|Mru1672Inf{r&QdxE1PK5LzSgmw92q~bB~qeWVU-KzeVGQ+6K=w1zK{{W@a)B3sv1Fln;<#8>?;`&n)lm}!+y zXr$EeoNl<}AA*Fg;V{rhXW$oGc9YI_K`#ymwB4&qk%6l?CZWTQW&Jo+`rR0^Rc+>8c&yhpM^u>4jb}0iDi|MorvIZ+PX6tI8k#qlo7JH>ok0hb}Xv(apd7%oq-}6 zvYEAX(n9T?2)DmQ&Z;AP5}?{k~%Q!d40jXU8z8@WygGrM+7G~XEaDfqx+ZMo`Ii()bM17XdU{^(D(;FFE) zZneD5VB2)qcTPIsmp$RYY~G2{TiK(jNzV5hf(f=3?LDKS1dqBdPh}fXXS@Sp)o(jA z;1ghf?fwQ;DcqTBT1Y0!*eS$&zwcVzPV0L@(dE=?n$Xg2R*f4Ss8zNwF5{1KyT68< z3K+=ck%s4~3!UX<(mROs(5qBI6zRPe4Mlnt zQ3Mo3-0=Oq`#!txv;XWQnS0MY=X_3^+|1mW{QLB89YBRtL8t)m@Bjcj+zaq;13yFg zIob{Y(9i(z0RRAE0Nx8U0EFw|xBy1n2iHrB0T2NI_%^scuf8TiQAZP?=^*#N${z4L#2ZyaTXs{_a3+2gR;aI`JXYfBvM4DkAoCkjvlkODMu!|NnGu^K_euTW@Z;-Z(rrTzl)o|76<^XXF1Zx@zL zJKXEGPXB}Re`?%X()thM|5?TViP`%+Rzh!_T03Qgved9I|?oB{UKmY;}kP;CQ5|fdVk=-G^bBCOQhKihm zn&QqKDtanvS}+|Q9U0}_d-ULYG+;XLEeIYyP6tFlLO?(QCci@t{{OxG>j6*`0|7t) zJ{|`ENR5Y2jrXq~z>J#{2=H**f78S54g|y}ASA*g29V&`%2WV6oZCPUJ^>Ms03RPG z3dE-dfY=FWga{RgXmu<(Ji@`ksl`pibeyn{Gv85G^birx4aKw{C2xA~a*63ic;R4} za5L1cmH%x70K~;ZKnNfr#&I801Asu>0L}^#&ibts&I*Y7)(EWvhp>(%A=rac1QwoJ zJOlZ-@tv-TOA%%D4+|i}$pWcy{>TAN-BSW5Byz*AmQeW~ni#;kVL@9UpXzY#UYqLQk%<<5SQ)UebjEcC7PnqVrD$|X8yhdiJYWBI1fj7 za|@MeY|Qs}A%ipbDUhtEHf#@YKA0 zNGyYB*Ih+EgWv%VJ_Gc8k*3#?Xl0nSoTOP?aWmhgt_}R;Sg9>Mmu~14G=k8n%{S~B zV)@W2dQ_hwUdR!st1j`nSB0F>-T{_eb~R^dpQl5^+4`6{n#Rf@B!uPclTJF@(#R(9 zl<1q+L#&Cu{nKR;fD^HSYYy}_H{cjNw?#!^_g2uGorHgQ6IxSttioO3B0-xoA?67w z*vz(Q2@Ct3kYG4=ags0>ubylkV2_56&wOQ>xkD%<_FZ~P^pH@P!ow5=%13?GAp3Z^ z9&2m?hGP~W3)alL zv?(HMX((Y%uvy6#}$BmKGiMO?su;qd`Ysk z7;7t7Oq7SDk&z>XlBMyS783_|u<4E{>Q zP_?X2e`AYF;w{PjmAB!XItV3DGTASLRd3!G8fq-bw=%FmA$?gSM7zk@9!G?6^E#yY zSMi`o5#JnyXVMuku*fPA*2UCzIljlk5D#pwKuT%6Zt^QlcN^XEU=4wC1x=`B)i%mm zgRBHuWIr4C3B?UnZ{O}>_-+!GNu~P7YG^pkBU-ooCn->uwq!VH#v%QghQW23x?-K{I7(cTBVL_P>j-}O9tsForoSd$5GZrbtv?L!s#FV$)WAPHN z>1ukC$JhU&;tMi9K?Bkbw8q8(Nz0~0KPyOEFb1R9@-|Jz8R9v^FETdYHe($yj|-se z`3MYk0<`$_yiA~0zVwcYMETeh4CvQts<5N`3#Irt0xoJ))d{nTe43jl^Knv0L9&wj zNd=W8zJK$$c8z?Vj65&JJl|XabiT(fj5gU7?NT<#U!}gSTP1(2U)!WQjDTo4nu6`~ zmryAp%m-?4jwi(u%xcmebUhoQC#i+61?c|)z=JY1(M-0GG9A2ozsjd`;+S*~SUwlq zv$u-Fd*WfapGZnbE%r|9CDMwN*_50%^{i6D37@butK3J`tBUs3W~s*wP*vRl5{njl zqSyka|4cQ6%r^+QBkrA*5eu}sj^C?L{3E9bE1rl0ikK@HS9}nHKa2yJ;>)&dKBJvb zWupd7qAwH*&K^J_dq3XWgdTS=Pqh+fdYoBetx3g@1W5!9TGNKi;{hjCyFY%O3xgJ11DGts(@Z_tJq+wgdCll`UuD;YR>E zy$w)*DKuPa;y^(Cd%~wb8L2es%usF<2fmr8N)j<6vQm*bs8({=7HWaXV@H$(Vf=>Tc^y3u{B@$#a}~A64ZST}u;rV!P28T7k@Q(;5OGL^dXPXJoCE*h5?cNfhIPU>+}Y zuh4swD#EgspvklS8*mFoX4@*)1siv6B0)}Z_phSa`_-NsCY z@&*1B2&Dc?a4ti!y7;oTEi5JtGfv(U7J0grcl8fYs@;~+rJ6BTedA37nzH#(SZ9|< zi4r%6Q){GL@lmpVM;$+Z<$L_9B$H~hOaZQQKa@13;!ajsIMPRUUxx0yxdx47ab3Rf z9Wm0%XdVKr&tYA=?5lZ;E5tjA`e*y0a>#dwR|IVpb}9Hy?(W-Ku0K!L;w=OBh_$83=@UB_>AzRk+vOTxUtZSQw}{rsyz;;>3RRaO2{=aXF(GuKj$ zi}R<$NgyVOw?m@Pmg0-#43MS;Qcf)PVtBAXy2~zEsehv8A@g~o7Uw-+*0M$aPpxCx zHX*SA9`t4jJ-(Bh>}Hw?faGd6z9@yX0cRfZFl7%Vs%`Sud^`q@kYI*M26SAFdkp+gHGx{@{2k>PBQX|4tobQG_$ z?ZF-AP7zL=5Te%?_j_E^zr<8!R!D<>dqgPSL(o_hOtRHp=gkujH=J5~ji8d%e>PHy zQld8J?Ku;T?x4zJ9*Yzb<%lK#HaPn50q}LAHzQ@Hy8Vt#?ZKUQmGTTo-+LRAB}r6v zsXk84y_~Osrk)jBy~M|7nvHxuv}Fdfo}Vk0{US-o%U_oOVOoh)-{SjDIwy`7!QtMmegCz^^znLcabJ8voKFU9)ZaUfBaEU%u`!pZqt6 zrw)I{!ov##bkS^)g_%-~{C}24oCyM^ze1uh!b;mZ>W`mrKr=W(Tfx&<`|tzB<~$|= z_!eDH?6DbtI$(C1XUD8jRJ8o#FH!8Pf=_29@Qbo4YFwch73JmQ4W{wp-Elvgowbl3 zrfibaz={vu+O`j!wQj!#IlCx_~=vC3zw0KT4t7-~V z5LLI&rdlw+3yI2~%!vEWH6N;KiJl#5C|0>;{5{%P(CSSI0Vm5#p(I~E>o_FWSnf)f zYRs6Vks@`HpIfT@Qrwa%Oh!xB+1D3MZR+X&Lg$cnBpq?hm0W)1-R=5vAezUi3UNVg zw$!?V*5F=9-bnpk1s~l1=D1W{S6?^>V}hkD*OC1LU`!WnLuTHpWxLYoc5-+b($3ST zDw9v8+;!DEdNmrK{2mQ84xL6^V8kn>6fIH@xyu9|0^HqP*nU9pbcQ}M`arJXY^N5e(UV-x0|uJL>_p%_SqA5ncV#-GiT|y_7s(p zIZ0zHRbzT!Lga!(l3Mh0Jx8hEfDHU*^1O~$Fb^N^Nakd%BD6WL43>*N5v2k$I#a-L zhJtd)*XqH8&e@H@6K`DW-g9S#$3erq{yIH4tl@ttC#I%V5Xa-~V#JU>;AnW&?3^sH zC~s`@by;fekaEvx&&V7TxZ={E&Pv7O8S?t$%>thbM8w!7r>)&}r+0BnsRoUQFv{fF z_7`*dzE?NV+AI3<7cxa%@F*u)DKBb?(MiVxk<5OU@|bocpEaQF3v^S@L7G-507+0+Ys@ZgBzgU7TH=OL9`^zGYC9(|&@KY$Pd(%)+T%c{QOOD~OHjY@4*ARg9?b)!Ii%wi5z)g+ zpyl|TnuMXE2R|+^vBg703h1au0-n1ID^aZk z7eahljkUGvxwG%ZUQH7fzsTiN04S?=jv!BYuw|ng@+?rKEx#7iEU1HHw&&^aL{OIH zQw|E=1rsWDT|NY2fP08WBFaMPC-Rf(Y(^aJ5|&QpK%8n>J|V>0iVB`IA7zqKmB7eO z3cx#oyGMztZx#@fXo1(^hPZh?>||&%g;2C?Qc8R2p}#fw=$pTnDE>G9_zMiJs^T^a z8rhjoN@M+QR!^W0WG4{oRb`4XYiqA0tyL^7%PzwigS_X4<}n401Nu`VQ#d z-6rx7q@1jmWiiG~n6*OLtvn;FR9p2vwLj()RM6}96DvBijdxjvEk1#zo_ zK@$co1qmL=<;E(dUD^F|PnQJqG!-u4wC{GL?ZK_?>a(vrG<=^jZN+~o{64b!rabe# zJ0HidKEt^Ve_M9My(cLnMQJRNoy1MTSddfuY7DT zbO6Z#6<@r&C-WLJ#T(Aadw!q-2&U27?H;^t-sHXV7gddUA;eyh&ooX{Ta<^<_P-}A zF#Y$~0$4-NON@+O@+;9r)iw2nSx~R|T`q>skYT!PB*&t8m!n(iMx;F{nX7+YRD5bi zrGXwv8Ex2!uzk0xKQbrLfAUy>uDKX^z1%ijN1Q|oa zg<1h!J}QlcVuQ1&G=-IDOYT7H^V)RNd3cbk=3?0~2_&NseWmvxE=yE3M8VaSe7vp9 z#h9#Ij`Bc#RXkDQgTQRos)Atgc);}I$6Zr7=^(NK%E{c2qbUcf(p}0 zr1(^3`tk#z3>o8z5U$xvac`8kQ#lUOhHOSeSKCyW?L&M;WG1P(@K zfmiS+$aIK2O63_T<_^RL9(PcwKv#>dk2X`KJ+zIu*zUxTf}#dUc3f#uldZdKJ;w_4 zNH9tWnFFV^@#?`qEc`06M%yjmnER-VaYJWOb^wE@34B0!*=ASh3)rQUV1SIF*jezU z=s71D9J9LH{)u6fAow214^Ob z?x5j2FUbtB^V0c-&-0{8?fiHJZ$O1#gaKc)5<+(Ru1OFf0q`qca$)eK*AwXqKLsQE zSD1QWk4etu_V(l*mqKkVDua-zt#XGtn`H)VXR+C8@UbBK#oRZ|PFgPHFY@&=L2)Fk zkBkS2o#WUrUI${HKagL$=8?$NpK4a%;Gf*p2I4n?uQH0TgnG??WsZWQjq5X#c@GV` zJRx5i%`kb!hB-_W)F24iO_2U_dEG-XqFL<}no0r$gP7Ue1C>(mWis)gw|_?e4E+P- zowY|lV`4KA-Nb(51RFi!%lWZQrmh;)c1;~DwDB|9-_pS#(65e1N1}C4s z16B^+WHXE>T=FDgA!171r9G`A4&_dXu@iW2Ak%E3PgRHJh#7i8EJfeeyXa0O2>1t( zGY;75EqA4#CUZqV7`9jnUpvx^vp*!pQ}Qqflwr6_441=?8?|2gqwDTw`5BzL{jK3U zOrX$R7~{|5y4sB2ZSmK9V=K>OQaWZBi4eKR*}h|5VYvFp&BK*+8A-1+n$8(37XLea zgYzz#W>}>pdS`HbUOTagU7npEzr=F;iJ_aqrb3IB}ds?PyFQifVe}WZ3pxZ zz@$X|OZNovyn|x>vHCp&_)P|XGANTO46^MjhX2u~V7kd$x4Ze5UI-n_&>y|5?2x~i zf9@vMI4vHLaz-fq14I6QHeHR7k$HYkK?sTG=hx`g^JT2 zL~B0~i=c<>77~-BQm>(F47QFgb!�rbO9TB?>rMTE_BOCkt{J#%GxoVwskR0qg84 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 J>Qs(D|JljWzU%-1 literal 21996 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Ξ{61I_n8m;>hk^X`7lP%3`y-dNsoB`cE_o76FgqxTw&eqD-0VgOc^OygW16+O zU%~lQin8da<_+~)QSNuJ@4<<3lq?tQ3y(-$iOJb`f2;b_20ZWqxOVmu2FKt`Wi!@; zn`h?LDCH1g4`8)f%2DIFE0=l_ot^a;>_xKKOq>9yqql{`r}q$)ukI^Cc9CZtrB~ZL zryOL26fqE_AdH5u)#58{2NgU62>taqs&L7-fZ?D{M|X_68br+@`C@+|S+lF756HL+|H# zutr0iunngA9g4azxm>tln=<<3~4ylyob!4iX^qVtdqGj zg)buAI|4CU`b~$M9wZFgsXz9{TMna}*|eXCZF(?G21GwBo@Dv03?|{@7_=W+_ClnYABMUA?5L2{9(|+;_ z-2V+B25CxhXiK#hxNgK<#^E$M9wfI=tr-~Mt`;UBh;d_Np65`&HRAUga-I~McZ7Lc zwp-YSaXHyB3OS(nC0qnq=_K2fLxSg6d6WjmY?pxW3c!MzoJTnq&yy8o3Rfzp)bFk- zz4!qb0R8##{lzoCDAt)l7`laeus)-pdu+BstYRpLoFWJ63tJ|Dvdk-{X7FNIp+-^8 zPv&WW*fD7b@y2(_RNL}f-_0A}uGmT>?M>G;tK`zRT`LX=<= zBVVZR0)a=+rcDh!O(5y?*2ue^QE@Umg!MU1VPh|}P0ba|-yvNv`i@B)OIPe@w++a> zzEO`vMTVTB_;y|D64mxlq;b11?bpbH+NQ3bJfzmoBk0edoh-nUxcv+w=Z~5H0Qn&t A1ONa4 diff --git a/models/Reference/segmind--Segmind-Vega.jpg b/models/Reference/segmind--Segmind-Vega.jpg index 98a5ec811c05e87f130a833cf4823b7eb10b1aec..5204f171245469d0ecd3c1619ee88e20cec7fc18 100644 GIT binary patch literal 77679 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 Gg8$i;t0j&A literal 75379 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 F|Jei3-*^B3 From 41bb446697fe2be2c3ba9424f13b0ec808986fbd Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 22 Sep 2025 13:18:29 -0400 Subject: [PATCH 033/230] support configurable multi-stage models in video tab Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 +- modules/video_models/models_def.py | 5 +- modules/video_models/video_load.py | 41 ++++---- modules/video_models/video_overrides.py | 9 ++ pipelines/model_wanai.py | 2 + pipelines/wan/wan_image.py | 119 ++++++++++++++++++++++++ webui.py | 6 +- 7 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 pipelines/wan/wan_image.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f490ed68..22b3ac43b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-21 +## Update for 2025-09-22 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -33,6 +33,8 @@ - styles and wildcards now use same seed as main generate for reproducible results - **api** new endpoint POST `/sdapi/v1/civitai` to trigger civitai models metadata update accepts optional `page` parameter to search specific networks page + - **reference models** additional example images, thanks @liutyi + - **video** support for configurable multi-stage models such as WAN-2.2-14B - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index b9ff5c260..e2605ae50 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -170,11 +170,12 @@ models = { dit_cls=diffusers.WanTransformer3DModel, dit_folder=("transformer", "transformer_2")), Model(name='WAN 2.2 14B VACE', - url='https://huggingface.co/Wan-AI/Wan2.2-14B-VACE-T2V-Diffusers', + url='https://huggingface.co/linoyts/Wan2.2-VACE-Fun-14B-diffusers', repo='linoyts/Wan2.2-VACE-Fun-14B-diffusers', repo_cls=diffusers.WanVACEPipeline, te_cls=transformers.T5EncoderModel, - dit_cls=diffusers.WanVACETransformer3DModel), + dit_cls=diffusers.WanVACETransformer3DModel, + dit_folder=("transformer", "transformer_2")), Model(name='WAN 2.1 1.3B T2V', url='https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers', repo='Wan-AI/Wan2.1-T2V-1.3B-Diffusers', diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index 72c411166..874df0231 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -40,31 +40,24 @@ def load_model(selected: models_def.Model): # transformer try: + if selected.dit_folder is None: + selected.dit_folder = ['transformer'] if isinstance(selected.dit_folder, list) or isinstance(selected.dit_folder, tuple): - # wan a14b has transformer and transformer_2 - for dit_folder in selected.dit_folder: - # get a new quant arg on every loop to prevent the quant config classes getting entangled - load_args, quant_args = model_quant.get_dit_args({}, module='Model', device_map=True) - shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" folder="{dit_folder}" cls={selected.dit_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') - kwargs[dit_folder] = selected.dit_cls.from_pretrained( - pretrained_model_name_or_path=selected.dit or selected.repo, - subfolder=dit_folder, - revision=selected.dit_revision or selected.repo_revision, - cache_dir=shared.opts.hfcache_dir, - **load_args, - **quant_args - ) - else: - load_args, quant_args = model_quant.get_dit_args({}, module='Model', device_map=True) - shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" folder="{selected.dit_folder}" cls={selected.dit_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') - kwargs["transformer"] = selected.dit_cls.from_pretrained( - pretrained_model_name_or_path=selected.dit or selected.repo, - subfolder=selected.dit_folder, - revision=selected.dit_revision or selected.repo_revision, - cache_dir=shared.opts.hfcache_dir, - **load_args, - **quant_args - ) + for dit_folder in selected.dit_folder: # wan a14b has transformer and transformer_2 + if dit_folder is not None and dit_folder not in kwargs: + # get a new quant arg on every loop to prevent the quant config classes getting entangled + load_args, quant_args = model_quant.get_dit_args({}, module='Model', device_map=True) + shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') + kwargs[dit_folder] = selected.dit_cls.from_pretrained( + pretrained_model_name_or_path=selected.dit or selected.repo, + subfolder=dit_folder, + revision=selected.dit_revision or selected.repo_revision, + cache_dir=shared.opts.hfcache_dir, + **load_args, + **quant_args + ) + else: + shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} skip') except Exception as e: shared.log.error(f'video load: module=transformer cls={selected.dit_cls.__name__} {e}') errors.display(e, 'video') diff --git a/modules/video_models/video_overrides.py b/modules/video_models/video_overrides.py index 057ae3f8a..856da62e6 100644 --- a/modules/video_models/video_overrides.py +++ b/modules/video_models/video_overrides.py @@ -19,6 +19,15 @@ def load_override(selected: Model): # WAN if 'WAN 2.1 14B' in selected.name: kwargs['vae'] = diffusers.AutoencoderKLWan.from_pretrained(selected.repo, subfolder="vae", torch_dtype=torch.float32, cache_dir=shared.opts.hfcache_dir) + if 'A14B' in selected.name or '14B VACE' in selected.name: + if shared.opts.model_wan_stage == 'combined': + kwargs['boundary_ratio'] = shared.opts.model_wan_boundary + elif shared.opts.model_wan_stage == 'high noise': + kwargs['transformer_2'] = None + kwargs['boundary_ratio'] = 0.0 + elif shared.opts.model_wan_stage == 'low noise': + kwargs['boundary_ratio'] = 1.0 + kwargs['transformer'] = None debug(f'Video overrides: model="{selected.name}" kwargs={list(kwargs)}') return kwargs diff --git a/pipelines/model_wanai.py b/pipelines/model_wanai.py index e44d1eb78..718ec63c6 100644 --- a/pipelines/model_wanai.py +++ b/pipelines/model_wanai.py @@ -96,8 +96,10 @@ def load_wan(checkpoint_info, diffusers_load_config={}): diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanVACEPipeline diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["wanai"] = diffusers.WanVACEPipeline else: + from pipelines.wan.wan_image import WanImagePipeline pipe_cls = diffusers.WanPipeline diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["wanai"] = diffusers.WanPipeline + diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["wanai"] = WanImagePipeline shared.log.debug(f'Load model: type=WanAI model="{checkpoint_info.name}" repo="{repo_id}" cls={pipe_cls.__name__} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args} stage="{shared.opts.model_wan_stage}" boundary={boundary_ratio}') pipe = pipe_cls.from_pretrained( repo_id, diff --git a/pipelines/wan/wan_image.py b/pipelines/wan/wan_image.py new file mode 100644 index 000000000..bd9923e5b --- /dev/null +++ b/pipelines/wan/wan_image.py @@ -0,0 +1,119 @@ +from typing import Any, Callable, Dict, List, Optional, Union +import torch +import diffusers +from diffusers.callbacks import MultiPipelineCallbacks, PipelineCallback +from diffusers.image_processor import PipelineImageInput + +from modules import devices + + +class WanImagePipeline(diffusers.WanPipeline): + def __call__( + self, + prompt: Union[str, List[str]] = None, + negative_prompt: Union[str, List[str]] = None, + height: int = 480, + width: int = 832, + num_frames: int = 81, + num_inference_steps: int = 50, + guidance_scale: float = 5.0, + guidance_scale_2: Optional[float] = None, + num_videos_per_prompt: Optional[int] = 1, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + latents: Optional[torch.Tensor] = None, + prompt_embeds: Optional[torch.Tensor] = None, + negative_prompt_embeds: Optional[torch.Tensor] = None, + output_type: Optional[str] = "np", + return_dict: bool = True, + attention_kwargs: Optional[Dict[str, Any]] = None, + callback_on_step_end: Optional[Union[Callable[[int, int, Dict], None], PipelineCallback, MultiPipelineCallbacks]] = None, + callback_on_step_end_tensor_inputs: List[str] = ["latents"], + max_sequence_length: int = 512, + strength: float = 0.3, # new + image: PipelineImageInput = None, # new + ): + # get img2img timesteps + self.scheduler.set_timesteps(num_inference_steps, device=devices.device) + timesteps, num_inference_steps = self.get_timesteps(num_inference_steps, strength) + # monkey patch original pipeline + self.scheduler.timesteps = timesteps + # self.scheduler._step_index = 0 + self.scheduler.orig_set_timesteps = self.scheduler.set_timesteps + self.scheduler.set_timesteps = lambda *args, **kwargs: None + + # prepare latents + latents = self.img2img_prepare_latents( + image=image, + timesteps=timesteps, + dtype=devices.dtype, + device=devices.device, + generator=generator, + ) + + # call original pipeline + result = super().__call__( # pylint: disable=no-member + prompt=prompt, + negative_prompt=negative_prompt, + height=height, + width=width, + num_frames=num_frames, + num_inference_steps=num_inference_steps, + guidance_scale=guidance_scale, + guidance_scale_2=guidance_scale_2, + num_videos_per_prompt=num_videos_per_prompt, + generator=generator, + latents=latents, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + output_type=output_type, + return_dict=return_dict, + attention_kwargs=attention_kwargs, + callback_on_step_end=callback_on_step_end, + callback_on_step_end_tensor_inputs=callback_on_step_end_tensor_inputs, + max_sequence_length=max_sequence_length, + ) + + # un-monkey patch original pipeline + self.scheduler.set_timesteps = self.scheduler.orig_set_timesteps + return result + + def get_timesteps(self, num_inference_steps, strength): + init_timestep = min(int(num_inference_steps * strength), num_inference_steps) + t_start = max(num_inference_steps - init_timestep, 0) + timesteps = self.scheduler.timesteps[t_start * self.scheduler.order :] + if hasattr(self.scheduler, "set_begin_index"): + # self.scheduler.set_begin_index(t_start * self.scheduler.order) + self.scheduler.set_begin_index(0) + return timesteps, num_inference_steps - t_start + + def img2img_prepare_latents( + self, + image: torch.Tensor = None, + timesteps: torch.Tensor = None, + dtype: Optional[torch.dtype] = None, + device: Optional[torch.device] = None, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + ) -> torch.Tensor: + from diffusers.utils.torch_utils import randn_tensor + from diffusers.video_processor import VideoProcessor + + if isinstance(image, list): + image = image[0] # ignore batch for now + + video_processor = VideoProcessor(vae_scale_factor=self.vae_scale_factor_spatial) + image_tensor = video_processor.preprocess(image, None, None) # convert PIL to [B, C, H, W] # channels may need rearrange + image_tensor = image_tensor.squeeze(0).to(device=device, dtype=dtype) + image_tensor = image_tensor[None, :, None, :, :] # expand before encode to [B, C, N, H, W] + encoder_output = self.vae.encode(image_tensor) + # init_latents = encoder_output.latent_dist.mode() # argmax or sample? + init_latents = encoder_output.latent_dist.sample(generator) + + latents_mean = torch.tensor(self.vae.config.latents_mean, device=device, dtype=torch.float32).view(1, self.vae.config.z_dim, 1, 1, 1) + latents_std = 1.0 / torch.tensor(self.vae.config.latents_std, device=device, dtype=torch.float32).view(1, self.vae.config.z_dim, 1, 1, 1) + init_latents = ((init_latents.float() - latents_mean) * latents_std).to(dtype) # normalized to standard distribution range + + init_noise = randn_tensor(init_latents.shape, generator=generator, device=device, dtype=dtype) + init_timestep = timesteps[:1] + noised_latents = self.scheduler.add_noise(init_latents, init_noise, init_timestep) + + return noised_latents diff --git a/webui.py b/webui.py index ec33c908e..8dc29d5bc 100644 --- a/webui.py +++ b/webui.py @@ -152,9 +152,9 @@ def initialize(): def load_model(): modeldata.model_data.locked = False - if not shared.opts.sd_checkpoint_autoload and shared.cmd_opts.ckpt is None: - log.info('Model: autoload=False') - else: + autoload = shared.opts.sd_checkpoint_autoload or shared.cmd_opts.ckpt is not None + log.info(f'Model: autoload={autoload} selected="{shared.opts.sd_model_checkpoint}"') + if autoload: jobid = shared.state.begin('Load model') thread_model = Thread(target=lambda: shared.sd_model) thread_model.start() From 4130c6cc8b21207a3ef4556230722f8226588e97 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 22 Sep 2025 15:55:26 -0400 Subject: [PATCH 034/230] experimental cache-dit Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/cachedit.py | 58 +++++++++++++++++++++++++++++++++ modules/processing.py | 2 +- modules/processing_diffusers.py | 6 ++-- modules/shared.py | 4 +++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 modules/cachedit.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b3ac43b..61c089574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ accepts optional `page` parameter to search specific networks page - **reference models** additional example images, thanks @liutyi - **video** support for configurable multi-stage models such as WAN-2.2-14B + - [cache-dit](https://github.com/vipshop/cache-dit) + *experimental support*, enable in *settings -> pipeline modifers -> cache-dit* - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/cachedit.py b/modules/cachedit.py new file mode 100644 index 000000000..1b698ff3b --- /dev/null +++ b/modules/cachedit.py @@ -0,0 +1,58 @@ +from installer import install +from modules import shared + + +def apply_cache_dit(pipe): + if not shared.opts.cache_dit_enabled: + return + install('cache_dit') + try: + import cache_dit + except Exception as e: + shared.log.error(f'Cache-DIT: {e}') + return + _, supported = cache_dit.supported_pipelines() + supported = [s.replace('*', '') for s in supported] + if not any(pipe.__class__.__name__.startswith(s) for s in supported): + shared.log.error(f'Cache-DiT: pipeline={pipe.__class__.__name__} unsupported') + return + + if getattr(pipe, 'has_cache_dit', False): + unapply_cache_dir(pipe) + + cache_config = cache_dit.BasicCacheConfig() + if shared.opts.cache_dit_calibrator == "TaylorSeer": + calibrator_config = cache_dit.TaylorSeerCalibratorConfig(taylorseer_order=1) + elif shared.opts.cache_dit_calibrator == "FoCa": + calibrator_config = cache_dit.FoCaCalibratorConfig() + else: + calibrator_config = None + """ + Fn_compute_blocks=shared.opts.cache_dit_Fn_compute_blocks, # 8 + Bn_compute_blocks=shared.opts.cache_dit_Bn_compute_blocks, # 0 + residual_diff_threshold=shared.opts.cache_dit_residual_diff_threshold, # 0.08 + max_warmup_steps=shared.opts.cache_dit_max_warmup_steps, # 8 + max_cached_steps=shared.opts.cache_dit_max_cached_steps, # -1 + max_continuous_cached_steps=shared.opts.cache_dit_max_continuous_cached_steps, # -1 + enable_separate_cfg=shared.opts.cache_dit_enable_separate_cfg, # False + cfg_compute_first=shared.opts.cache_dit_cfg_compute_first, # False + ) + """ + shared.log.info(f'Apply Cache-DiT: config="{cache_config.strify()}" calibrator="{calibrator_config.strify() if calibrator_config else "None"}"') + cache_dit.enable_cache( + pipe, + cache_config=cache_config, + calibrator_config=calibrator_config, + ) + shared.sd_model.has_cache_dit = True + + +def unapply_cache_dir(pipe): + if not shared.opts.cache_dit_enabled or not getattr(pipe, 'has_cache_dit', False): + return + try: + import cache_dit + cache_dit.disable_cache(pipe) + pipe.has_cache_dit = False + except Exception: + return diff --git a/modules/processing.py b/modules/processing.py index 31378fa4a..e01f88bdc 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -130,7 +130,7 @@ def get_processed(*args, **kwargs): def process_images(p: StableDiffusionProcessing) -> Processed: timer.process.reset() - debug(f'Process images: {vars(p)}') + debug(f'Process images: class={p.__class__.__name__} {vars(p)}') if not hasattr(p.sd_model, 'sd_checkpoint_info'): shared.log.error('Processing: incomplete model') return None diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index d29cfc0e5..1d88ab2a0 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -67,7 +67,7 @@ def restore_state(p: processing.StableDiffusionProcessing): def process_pre(p: processing.StableDiffusionProcessing): - from modules import ipadapter, sd_hijack_freeu, para_attention, teacache, hidiffusion, ras, pag, cfgzero, transformer_cache, token_merge, linfusion + from modules import ipadapter, sd_hijack_freeu, para_attention, teacache, hidiffusion, ras, pag, cfgzero, transformer_cache, token_merge, linfusion, cachedit shared.log.info('Processing modifiers: apply') try: @@ -86,6 +86,7 @@ def process_pre(p: processing.StableDiffusionProcessing): transformer_cache.set_cache() para_attention.apply_first_block_cache() teacache.apply_teacache(p) + cachedit.apply_cache_dit(shared.sd_model) except Exception as e: shared.log.error(f'Processing apply: {e}') errors.display(e, 'apply') @@ -99,7 +100,7 @@ def process_pre(p: processing.StableDiffusionProcessing): def process_post(p: processing.StableDiffusionProcessing): - from modules import ipadapter, hidiffusion, ras, pag, cfgzero, token_merge, linfusion + from modules import ipadapter, hidiffusion, ras, pag, cfgzero, token_merge, linfusion, cachedit shared.log.info('Processing modifiers: unapply') try: @@ -111,6 +112,7 @@ def process_post(p: processing.StableDiffusionProcessing): pag.unapply() cfgzero.unapply() linfusion.unapply(shared.sd_model) + cachedit.unapply_cache_dir(shared.sd_model) except Exception as e: shared.log.error(f'Processing unapply: {e}') errors.display(e, 'unapply') diff --git a/modules/shared.py b/modules/shared.py index 9577535c0..0cc33fbc3 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -356,6 +356,10 @@ options_templates.update(options_section(('advanced', "Pipeline Modifiers"), { "pab_spacial_skip_start": OptionInfo(100, "PAB spacial skip start", gr.Slider, {"minimum": 0, "maximum": 1000, "step": 1}), "pab_spacial_skip_end": OptionInfo(800, "PAB spacial skip end", gr.Slider, {"minimum": 0, "maximum": 1000, "step": 1}), + "cache_dit_sep": OptionInfo("

    H`#gI^TR6kZQErq@b=q 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 diff --git a/models/Reference/segmind--tiny-sd.jpg b/models/Reference/segmind--tiny-sd.jpg index 375f697aababf0410f6388268fe0550358498767..953407d567e2980316bce560884f16758464a8f3 100644 GIT binary patch literal 82205 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⋒|8k0SrOPrEi#iyVZUlig+QpNTxV3#9tvZw%F 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

    P7+GY8ILS)P7WS_cXwNWr)u&ZxmNn~iZ4WWRz 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 La_4T>{n!85k%B=C literal 90089 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�H!c)K9n0U3IMebt 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 Date: Sun, 28 Sep 2025 05:39:23 +0900 Subject: [PATCH 072/230] windows install rocm if not installed --- installer.py | 56 ++++++++++++++++++++-------------- modules/rocm.py | 62 +++++++++++++++++++++++--------------- modules/windows_hip_ffi.py | 44 +++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 47 deletions(-) create mode 100644 modules/windows_hip_ffi.py diff --git a/installer.py b/installer.py index b5ddca5b7..b5e9ba1ad 100644 --- a/installer.py +++ b/installer.py @@ -678,32 +678,42 @@ def install_rocm_zluda(): return torch_command from modules import rocm - log.info('ROCm: AMD toolkit detected') + amd_gpus = [] + try: + if sys.platform == "win32" and not rocm.is_installed: + amd_gpus = rocm.driver_get_agents() + else: + amd_gpus = rocm.get_agents() + log.info('ROCm: AMD toolkit detected') + except Exception as e: + log.warning(f'ROCm agent enumerator failed: {e}') + #os.environ.setdefault('TENSORFLOW_PACKAGE', 'tensorflow') device = None - try: - amd_gpus = rocm.get_agents() - if len(amd_gpus) == 0: - log.warning('ROCm: no agent was found') + if len(amd_gpus) == 0: + log.warning('ROCm: no agent was found') + else: + log.info(f'ROCm: agents={[gpu.name for gpu in amd_gpus]}') + if args.device_id is None: + index = 0 + for idx, gpu in enumerate(amd_gpus): + index = idx + if not gpu.is_apu: + # although apu was found, there can be a dedicated card. do not break loop. + # if no dedicated card was found, apu will be used. + break + os.environ.setdefault('HIP_VISIBLE_DEVICES', str(index)) + device = amd_gpus[index] else: - log.info(f'ROCm: agents={[gpu.name for gpu in amd_gpus]}') - if args.device_id is None: - index = 0 - for idx, gpu in enumerate(amd_gpus): - index = idx - if not gpu.is_apu: - # although apu was found, there can be a dedicated card. do not break loop. - # if no dedicated card was found, apu will be used. - break - os.environ.setdefault('HIP_VISIBLE_DEVICES', str(index)) - device = amd_gpus[index] - else: - device_id = int(args.device_id) - if device_id < len(amd_gpus): - device = amd_gpus[device_id] - except Exception as e: - log.warning(f'ROCm agent enumerator failed: {e}') + device_id = int(args.device_id) + if device_id < len(amd_gpus): + device = amd_gpus[device_id] + + if sys.platform == "win32" and args.use_rocm and not rocm.is_installed: + check_python(supported_minors=[11, 12, 13], reason='ROCm backend requires a Python version between 3.11 and 3.13') + install(f"rocm rocm-sdk-core --index-url https://rocm.nightlies.amd.com/v2-staging/{device.therock}") + rocm.refresh() msg = f'ROCm: version={rocm.version}' if device is not None: @@ -714,7 +724,7 @@ def install_rocm_zluda(): if args.use_rocm: # TODO install: switch to pytorch source when it becomes available if device is not None and isinstance(rocm.environment, rocm.PythonPackageEnvironment): # TheRock check_python(supported_minors=[11, 12, 13], reason='ROCm backend requires a Python version between 3.11 and 3.13') - torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{rocm.get_distribution(device)}') + torch_command = os.environ.get('TORCH_COMMAND', f'torch torchvision --index-url https://rocm.nightlies.amd.com/v2-staging/{device.therock}') else: check_python(supported_minors=[12], reason='ROCm Windows preview requires Python version 3.12') torch_command = os.environ.get('TORCH_COMMAND', '--no-cache-dir https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torch-2.8.0a0%2Bgitfc14c65-cp312-cp312-win_amd64.whl https://repo.radeon.com/rocm/windows/rocm-rel-6.4.4/torchvision-0.24.0a0%2Bc85f008-cp312-cp312-win_amd64.whl') diff --git a/modules/rocm.py b/modules/rocm.py index 5188409d4..8dfcd9ec8 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -105,6 +105,20 @@ class Agent: self.is_apu = (self.gfx_version & 0xFFF0 == 0x1150) or self.gfx_version in (0x801, 0x902, 0x90c, 0x1013, 0x1033, 0x1035, 0x1036, 0x1103,) self.blaslt_supported = os.path.exists(os.path.join(blaslt_tensile_libpath, f"Kernels.so-000-{name}.hsaco" if sys.platform == "win32" else f"extop_{name}.co")) + @property + def therock(self) -> str: + if (self.gfx_version & 0xFFF0) == 0x1100: + return "gfx110X-dgpu" + if self.gfx_version == 0x1151: + return "gfx1151" + if (self.gfx_version & 0xFFF0) == 0x1200: + return "gfx120X-all" + if (self.gfx_version & 0xFFF0) == 0x940: + return "gfx94X-dcgpu" + if self.gfx_version == 0x950: + return "gfx950-dcgpu" + raise Exception(f"Unsupported GPU architecture: {self.name}") + def get_gfx_version(self) -> Union[str, None]: if self.gfx_version >= 0x1100 and self.gfx_version < 0x1200: return "11.0.0" @@ -204,29 +218,29 @@ def get_flash_attention_command(agent: Agent) -> str: return "--no-build-isolation " + os.environ.get("FLASH_ATTENTION_PACKAGE", default) -def get_distribution(agent: Agent) -> str: - if (agent.gfx_version & 0xFFF0) == 0x1100: - return "gfx110X-dgpu" - if agent.gfx_version == 0x1151: - return "gfx1151" - if (agent.gfx_version & 0xFFF0) == 0x1200: - return "gfx120X-all" - if (agent.gfx_version & 0xFFF0) == 0x940: - return "gfx94X-dcgpu" - if agent.gfx_version == 0x950: - return "gfx950-dcgpu" - raise Exception(f"Unsupported GPU architecture: {agent.name}") - - if sys.platform == "win32": def get_agents() -> List[Agent]: if isinstance(environment, ROCmEnvironment): out = spawn("amdgpu-arch", cwd=os.path.join(environment.path, 'bin')) else: + # Assume that amdgpu-arch is in PATH (venv/Scripts/amdgpu-arch.exe) out = spawn("amdgpu-arch") out = out.strip() return [Agent(x.split(' ')[-1].strip()) for x in out.split("\n")] + def driver_get_agents() -> List[Agent]: + # unsafe and experimental feature + from modules import windows_hip_ffi + hip = windows_hip_ffi.HIP() + count = hip.get_device_count() + agents = [None] * count + for i in range(count): + prop = hip.get_device_properties(i) + name = prop.gcnArchName.decode('utf-8').strip('\x00') + agents[i] = Agent(name) + del hip + return agents + is_wsl: bool = False else: def get_agents() -> List[Agent]: @@ -250,16 +264,16 @@ else: is_wsl: bool = os.environ.get('WSL_DISTRO_NAME', 'unknown' if spawn('wslpath -w /') else None) is not None environment = None -err = None -try: - environment = find() -except Exception as e: - err = e blaslt_tensile_libpath = "" is_installed = False version = None -if environment is not None: - if isinstance(environment, ROCmEnvironment): - blaslt_tensile_libpath = os.environ.get("HIPBLASLT_TENSILE_LIBPATH", os.path.join(environment.path, "bin" if sys.platform == "win32" else "lib", "hipblaslt", "library")) - is_installed = True - version = get_version() + +def refresh(): + global environment, blaslt_tensile_libpath, is_installed, version + environment = find() + if environment is not None: + if isinstance(environment, ROCmEnvironment): + blaslt_tensile_libpath = os.environ.get("HIPBLASLT_TENSILE_LIBPATH", os.path.join(environment.path, "bin" if sys.platform == "win32" else "lib", "hipblaslt", "library")) + is_installed = True + version = get_version() +refresh() diff --git a/modules/windows_hip_ffi.py b/modules/windows_hip_ffi.py new file mode 100644 index 000000000..cc9e4a1e4 --- /dev/null +++ b/modules/windows_hip_ffi.py @@ -0,0 +1,44 @@ +import sys + +if sys.platform == "win32": + import ctypes + import ctypes.wintypes + + class hipDeviceProp(ctypes.Structure): + _fields_ = [ + ('__front__', ctypes.c_byte * 396), + ('gcnArchName', ctypes.c_char * 256), + ('__rear__', ctypes.c_byte * 820) + ] + + class HIP: + def __init__(self): + ctypes.windll.kernel32.LoadLibraryA.restype = ctypes.wintypes.HMODULE + ctypes.windll.kernel32.LoadLibraryA.argtypes = [ctypes.c_char_p] + # amdhip64.dll is a part of AMDGPU drivers + self.handle = ctypes.windll.kernel32.LoadLibraryA(b"amdhip64.dll") + ctypes.windll.kernel32.GetLastError.restype = ctypes.wintypes.DWORD + ctypes.windll.kernel32.GetLastError.argtypes = [] + assert ctypes.windll.kernel32.GetLastError() == 0 + ctypes.windll.kernel32.GetProcAddress.restype = ctypes.c_void_p + ctypes.windll.kernel32.GetProcAddress.argtypes = [ctypes.wintypes.HMODULE, ctypes.c_char_p] + self.hipGetDeviceCount = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(ctypes.c_int))( + ctypes.windll.kernel32.GetProcAddress(self.handle, b"hipGetDeviceCount")) + self.hipGetDeviceProperties = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(hipDeviceProp), ctypes.c_int)( + ctypes.windll.kernel32.GetProcAddress(self.handle, b"hipGetDeviceProperties")) + + def __del__(self): + #ctypes.windll.kernel32.FreeLibrary.argtypes = [ctypes.wintypes.HMODULE] + #ctypes.windll.kernel32.FreeLibrary(self.handle) + # Hopefully it does not make conflicts with amdhip64_7.dll + pass + + def get_device_count(self): + count = ctypes.c_int() + assert self.hipGetDeviceCount(ctypes.byref(count)) == 0 + return count.value + + def get_device_properties(self, device_id): + prop = hipDeviceProp() + assert self.hipGetDeviceProperties(ctypes.byref(prop), device_id) == 0 + return prop From 587db51e9e0a03d556daab27ff5eb8b096028497 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 00:22:00 +0300 Subject: [PATCH 073/230] Cleanup env vars and set TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL to 1 --- installer.py | 58 +++++++++++----------------------- modules/intel/ipex/__init__.py | 2 +- modules/shared.py | 3 +- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/installer.py b/installer.py index b5e9ba1ad..ea7f5b496 100644 --- a/installer.py +++ b/installer.py @@ -754,9 +754,6 @@ def install_rocm_zluda(): else: #check_python(supported_minors=[10, 11, 12, 13], reason='ROCm backend requires a Python version between 3.10 and 3.13') - if os.environ.get("TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL", None) is None: - os.environ.setdefault('TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL', '1') - if args.use_nightly: if rocm.version is None or float(rocm.version) >= 6.4: # assume the latest if version check fails torch_command = os.environ.get('TORCH_COMMAND', '--upgrade --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/rocm6.4') @@ -800,27 +797,6 @@ def install_ipex(): args.use_ipex = True # pylint: disable=attribute-defined-outside-init log.info('IPEX: Intel OneAPI toolkit detected') - if os.environ.get("NEOReadDebugKeys", None) is None: - os.environ.setdefault('NEOReadDebugKeys', '1') - - if os.environ.get("ClDeviceGlobalMemSizeAvailablePercent", None) is None: - os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100') - - if os.environ.get("SYCL_CACHE_PERSISTENT", None) is None: - os.environ.setdefault('SYCL_CACHE_PERSISTENT', '1') # Jit cache - - if os.environ.get("PYTORCH_ENABLE_XPU_FALLBACK", None) is None: - os.environ.setdefault('PYTORCH_ENABLE_XPU_FALLBACK', '1') # CPU fallback for unsupported ops - - if os.environ.get("UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS", None) is None: - os.environ.setdefault('UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS', '1') # Work around the 4G alloc limit on Alchemist - - # FP64 emulation causes random UR Errors - #if os.environ.get("OverrideDefaultFP64Settings", None) is None: - # os.environ.setdefault('OverrideDefaultFP64Settings', '1') - #if os.environ.get("IGC_EnableDPEmulation", None) is None: - # os.environ.setdefault('IGC_EnableDPEmulation', '1') # FP64 Emulation - if args.use_nightly: torch_command = os.environ.get('TORCH_COMMAND', '--upgrade --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/xpu') else: @@ -834,20 +810,17 @@ def install_ipex(): def install_openvino(): t_start = time.time() log.info('OpenVINO: selected') - #check_python(supported_minors=[10, 11, 12, 13], reason='OpenVINO backend requires a Python version between 3.10 and 3.13') + os.environ.setdefault('PYTORCH_TRACING_MODE', 'TORCHFX') + #check_python(supported_minors=[10, 11, 12, 13], reason='OpenVINO backend requires a Python version between 3.10 and 3.13') if sys.platform == 'darwin': torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0 torchvision==0.23.0') else: torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.8.0+cpu torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cpu') - install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.3.0'), 'openvino') - install(os.environ.get('NNCF_COMMAND', 'nncf==2.18.0'), 'nncf') - os.environ.setdefault('PYTORCH_TRACING_MODE', 'TORCHFX') - if os.environ.get("NEOReadDebugKeys", None) is None: - os.environ.setdefault('NEOReadDebugKeys', '1') - if os.environ.get("ClDeviceGlobalMemSizeAvailablePercent", None) is None: - os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100') + if not (args.skip_all or args.skip_requirements): + install(os.environ.get('OPENVINO_COMMAND', 'openvino==2025.3.0'), 'openvino') + install(os.environ.get('NNCF_COMMAND', 'nncf==2.18.0'), 'nncf') ts('openvino', t_start) return torch_command @@ -969,12 +942,12 @@ def check_torch(): try: import torch log.info(f'Torch {torch.__version__}') - if args.use_ipex and allow_ipex: - try: - import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import - log.info(f'Torch backend: Intel IPEX {ipex.__version__}') - except Exception: - log.warning('IPEX: not found') + try: + import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + log.info(f'Torch backend: Intel IPEX {ipex.__version__}') + except Exception: + pass + if hasattr(torch, "xpu") and torch.xpu.is_available() and allow_ipex: if shutil.which('icpx') is not None: log.info(f'{os.popen("icpx --version").read().rstrip()}') for device in range(torch.xpu.device_count()): @@ -1370,8 +1343,13 @@ def set_environment(): os.environ.setdefault('PYTORCH_CUDA_ALLOC_CONF', allocator) os.environ.setdefault('PYTORCH_HIP_ALLOC_CONF', allocator) log.debug(f'Torch allocator: "{allocator}"') - if sys.platform == 'darwin': - os.environ.setdefault('PYTORCH_ENABLE_MPS_FALLBACK', '1') + os.environ.setdefault('TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL', '1') + os.environ.setdefault('NEOReadDebugKeys', '1') + os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100') + os.environ.setdefault('SYCL_CACHE_PERSISTENT', '1') + os.environ.setdefault('UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS', '1') + os.environ.setdefault('PYTORCH_ENABLE_XPU_FALLBACK', '1') + os.environ.setdefault('PYTORCH_ENABLE_MPS_FALLBACK', '1') def check_extensions(): diff --git a/modules/intel/ipex/__init__.py b/modules/intel/ipex/__init__.py index 3d49beca7..0a4e19389 100644 --- a/modules/intel/ipex/__init__.py +++ b/modules/intel/ipex/__init__.py @@ -152,7 +152,7 @@ def ipex_init(): # pylint: disable=too-many-statements # torch._int_mm directly uses onednn quantized matmul # onednn qlinear is a wrapper around onednn quantized matmul if hasattr(torch.ops, "onednn") and hasattr(torch.ops.onednn, "qlinear_pointwise"): - def onednn_mm(x: torch.Tensor, y: torch.Tensor): + def onednn_mm(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: # supports int8, fp32, fp16, and bf16 matmul with accumulation using a different dtype # int8 matmul with onednn is slower than 16 bit with dim_size < 4096 return torch.ops.onednn.qlinear_pointwise.default(x, 1.0, 0, y, torch.ones(1, device=y.device), torch.zeros(1, device=y.device), None, 1.0, 0, torch.float32, "none", [], "none") diff --git a/modules/shared.py b/modules/shared.py index c8a645128..78ff5ac0c 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -70,9 +70,8 @@ state = shared_state.State() # early select backend backend = Backend.DIFFUSERS -if not hasattr(cmd_opts, "use_openvino"): - cmd_opts.use_openvino = False if cmd_opts.use_openvino: # override for openvino + os.environ.setdefault('PYTORCH_TRACING_MODE', 'TORCHFX') from modules.intel.openvino import get_device_list as get_openvino_device_list # pylint: disable=ungrouped-imports elif cmd_opts.use_ipex or devices.has_xpu(): from modules.intel.ipex import ipex_init From a1214bfe30b39534ed07e9ca4c3b3826226b1eff Mon Sep 17 00:00:00 2001 From: Raphael Stoeckli Date: Sun, 28 Sep 2025 02:32:08 +0200 Subject: [PATCH 074/230] Added option to randomize loopback iterations --- scripts/loopback.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/loopback.py b/scripts/loopback.py index a22b153a2..571f67665 100644 --- a/scripts/loopback.py +++ b/scripts/loopback.py @@ -1,4 +1,5 @@ import math +import random import gradio as gr from modules import images, processing, scripts_manager @@ -21,10 +22,12 @@ class Script(scripts_manager.Script): final_denoising_strength = gr.Slider(minimum=0, maximum=1, step=0.01, label='Final strength', value=0.5, elem_id=self.elem_id("final_denoising_strength")) with gr.Row(): denoising_curve = gr.Dropdown(label="Strength curve", choices=["Aggressive", "Linear", "Lazy"], value="Linear") + with gr.Row(): + randomize_seed = gr.Checkbox(label="Randomize seed after each loop iteration", value=False) - return [loops, final_denoising_strength, denoising_curve] + return [loops, final_denoising_strength, denoising_curve, randomize_seed] - def run(self, p, loops, final_denoising_strength, denoising_curve): # pylint: disable=arguments-differ + def run(self, p, loops, final_denoising_strength, denoising_curve, randomize_seed): # pylint: disable=arguments-differ processing.fix_seed(p) initial_batch_count = p.n_iter p.extra_generation_params['Loopback'] = final_denoising_strength @@ -76,6 +79,10 @@ class Script(scripts_manager.Script): if initial_seed is None: initial_seed = processed.seed initial_info = processed.info + if randomize_seed: + p.seed = random.randrange(4294967294) + p.all_seeds = [p.seed] + log.info(f'Setting random seed {p.seed} for loopback iteration {i}') p.seed = processed.seed + 1 # why? p.denoising_strength = calculate_denoising_strength(i + 1) last_image = processed.images[0] From 0de373288472d7085e85d24a15e2c2a85d986175 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 11:31:43 +0900 Subject: [PATCH 075/230] prioritize python pacakage check over PATH --- modules/rocm.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/rocm.py b/modules/rocm.py index 8dfcd9ec8..3ffff069a 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -130,17 +130,16 @@ class Agent: def find() -> Union[Environment, None]: + try: # TheRock + import _rocm_sdk_core # pylint: disable=unused-import + return PythonPackageEnvironment() + except ImportError: + pass + + # system-wide installation hip_path = shutil.which("hipconfig") if hip_path is not None: - py_path = os.path.dirname(sys.executable) - if hip_path.startswith(py_path): - try: - import _rocm_sdk_core # pylint: disable=unused-import - return PythonPackageEnvironment() - except ImportError: - pass - else: - return ROCmEnvironment(dirname(resolve_link(hip_path), 2)) + return ROCmEnvironment(dirname(resolve_link(hip_path), 2)) if sys.platform == "win32": hip_path = os.environ.get("HIP_PATH", None) From 95ee0ed29c6d02e581611d72b24d798b6c5c9acf Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 17:15:12 +0900 Subject: [PATCH 076/230] load amdhip64_6.dll instead of amdhip64.dll --- modules/windows_hip_ffi.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/windows_hip_ffi.py b/modules/windows_hip_ffi.py index cc9e4a1e4..c612aa43d 100644 --- a/modules/windows_hip_ffi.py +++ b/modules/windows_hip_ffi.py @@ -1,6 +1,7 @@ import sys if sys.platform == "win32": + import os import ctypes import ctypes.wintypes @@ -15,8 +16,11 @@ if sys.platform == "win32": def __init__(self): ctypes.windll.kernel32.LoadLibraryA.restype = ctypes.wintypes.HMODULE ctypes.windll.kernel32.LoadLibraryA.argtypes = [ctypes.c_char_p] - # amdhip64.dll is a part of AMDGPU drivers - self.handle = ctypes.windll.kernel32.LoadLibraryA(b"amdhip64.dll") + path = os.environ.get("windir", "C:\\Windows") + "\\System32\\amdhip64_6.dll" + if not os.path.isfile(path): + path = os.environ.get("windir", "C:\\Windows") + "\\System32\\amdhip64_7.dll" + assert os.path.isfile(path) + self.handle = ctypes.windll.kernel32.LoadLibraryA(path.encode('utf-8')) ctypes.windll.kernel32.GetLastError.restype = ctypes.wintypes.DWORD ctypes.windll.kernel32.GetLastError.argtypes = [] assert ctypes.windll.kernel32.GetLastError() == 0 @@ -28,10 +32,9 @@ if sys.platform == "win32": ctypes.windll.kernel32.GetProcAddress(self.handle, b"hipGetDeviceProperties")) def __del__(self): - #ctypes.windll.kernel32.FreeLibrary.argtypes = [ctypes.wintypes.HMODULE] - #ctypes.windll.kernel32.FreeLibrary(self.handle) - # Hopefully it does not make conflicts with amdhip64_7.dll - pass + # Hopefully this will prevent conflicts with amdhip64_7.dll from ROCm Python packages or HIP SDK + ctypes.windll.kernel32.FreeLibrary.argtypes = [ctypes.wintypes.HMODULE] + ctypes.windll.kernel32.FreeLibrary(self.handle) def get_device_count(self): count = ctypes.c_int() From e8a507fe2a19ce984f961bd182089fadc57354fd Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 17:34:47 +0900 Subject: [PATCH 077/230] skip rocm.conceal if rocm torch is installed --- installer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/installer.py b/installer.py index ea7f5b496..48f0588c9 100644 --- a/installer.py +++ b/installer.py @@ -977,8 +977,10 @@ def check_torch(): if not args.ignore: sys.exit(1) if rocm.is_installed: - if sys.platform == "win32": # CPU, DirectML, ZLUDA - rocm.conceal() + if sys.platform == "win32": + import torch + if torch.version.hip is None: # CPU, DirectML, ZLUDA + rocm.conceal() elif rocm.is_wsl: # ROCm WSL rocm.preload_hsa_runtime() if args.version: From 6e8abf8dc38a6ec2362bd572bd08f4aca641dbc0 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 18:03:02 +0900 Subject: [PATCH 078/230] hijack cholesky decomposition for therock pytorch --- installer.py | 7 +---- modules/rocm.py | 53 +++++++++++++++++++++++++++++--------- modules/zluda_installer.py | 4 +-- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/installer.py b/installer.py index 48f0588c9..1932a20af 100644 --- a/installer.py +++ b/installer.py @@ -977,12 +977,7 @@ def check_torch(): if not args.ignore: sys.exit(1) if rocm.is_installed: - if sys.platform == "win32": - import torch - if torch.version.hip is None: # CPU, DirectML, ZLUDA - rocm.conceal() - elif rocm.is_wsl: # ROCm WSL - rocm.preload_hsa_runtime() + rocm.postinstall() if args.version: return if not args.skip_all: diff --git a/modules/rocm.py b/modules/rocm.py index 3ffff069a..c7aa6771b 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -5,6 +5,7 @@ import shutil import subprocess from typing import Union, List from enum import Enum +from functools import wraps def resolve_link(path_: str) -> str: @@ -28,17 +29,6 @@ def load_library_global(path_: str): ctypes.CDLL(path_, mode=ctypes.RTLD_GLOBAL) -def conceal(): - os.environ.pop("ROCM_HOME", None) - os.environ.pop("ROCM_PATH", None) - paths = os.environ["PATH"].split(";") - paths_no_rocm = [] - for path_ in paths: - if "rocm" not in path_.lower(): - paths_no_rocm.append(path_) - os.environ["PATH"] = ";".join(paths_no_rocm) - - class Environment: pass @@ -240,6 +230,43 @@ if sys.platform == "win32": del hip return agents + def postinstall(): + import torch + if torch.version.hip is None: + os.environ.pop("ROCM_HOME", None) + os.environ.pop("ROCM_PATH", None) + paths = os.environ["PATH"].split(";") + paths_no_rocm = [] + for path_ in paths: + if "rocm" not in path_.lower(): + paths_no_rocm.append(path_) + os.environ["PATH"] = ";".join(paths_no_rocm) + return + + cholesky_ex_gpu = torch.linalg.cholesky_ex + @wraps(cholesky_ex_gpu) + def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.Tensor: + if A.device.type != 'cpu': + return cholesky_ex_gpu(A, upper=upper, check_errors=check_errors, out=out) + + assert not upper + assert not check_errors + assert out is None + + n = A.size(0) + L = torch.zeros_like(A) + + for i in range(n): + for j in range(i + 1): + s = torch.dot(L[i, :j], L[j, :j].conj()) + if i == j: + val = A[i, i] - s + L[i, j] = torch.sqrt(val.real) + else: + L[i, j] = (A[i, j] - s) / L[j, j] + return L, torch.tensor(0, dtype=torch.int32, device=A.device) + torch.linalg.cholesky_ex = cholesky_ex + is_wsl: bool = False else: def get_agents() -> List[Agent]: @@ -251,7 +278,9 @@ else: agents = [x.strip().split(" ")[-1] for x in agents if x.startswith(' Name:') and "CPU" not in x] return [Agent(x) for x in agents] - def preload_hsa_runtime(): + def postinstall(): + if not is_wsl: + return try: if shutil.which("conda") is not None: # Preload stdc++ library. This will bypass Anaconda stdc++ library. diff --git a/modules/zluda_installer.py b/modules/zluda_installer.py index 2922f196f..c6fb55c23 100644 --- a/modules/zluda_installer.py +++ b/modules/zluda_installer.py @@ -163,7 +163,7 @@ def load(): ctypes.windll.LoadLibrary(os.path.join(rocm.environment.path, 'bin', 'MIOpen.dll')) ctypes.windll.LoadLibrary(os.path.join(path, 'cudnn64_9.dll')) - def conceal(): + def postinstall(): import torch torch.version.hip = rocm.version platform = sys.platform @@ -176,4 +176,4 @@ def load(): def _join_rocm_home(*paths) -> str: return os.path.join(cpp_extension.ROCM_HOME, *paths) cpp_extension._join_rocm_home = _join_rocm_home # pylint: disable=protected-access - rocm.conceal = conceal + rocm.postinstall = postinstall From 9c19e8a9b8c9196be5cf361f6841ecbcf6fbedf9 Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 18:34:10 +0900 Subject: [PATCH 079/230] return correct item --- modules/rocm.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/rocm.py b/modules/rocm.py index c7aa6771b..9728313e0 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -261,10 +261,12 @@ if sys.platform == "win32": s = torch.dot(L[i, :j], L[j, :j].conj()) if i == j: val = A[i, i] - s + if val.real <= 0 or (A.dtype.is_complex and val.imag != 0): + return torch.return_types.linalg_cholesky_ex((L, torch.tensor(i + 1, dtype=torch.int32, device='cpu')), {}) L[i, j] = torch.sqrt(val.real) else: L[i, j] = (A[i, j] - s) / L[j, j] - return L, torch.tensor(0, dtype=torch.int32, device=A.device) + return torch.return_types.linalg_cholesky_ex((L, torch.tensor(0, dtype=torch.int32, device='cpu')), {}) torch.linalg.cholesky_ex = cholesky_ex is_wsl: bool = False From 06b14b070b136d8ae36335aedd57b42c8cfa426e Mon Sep 17 00:00:00 2001 From: Seunghoon Lee Date: Sun, 28 Sep 2025 18:43:37 +0900 Subject: [PATCH 080/230] hijack torch.linalg.cholesky() --- modules/rocm.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/rocm.py b/modules/rocm.py index 9728313e0..0d489b72a 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -245,7 +245,7 @@ if sys.platform == "win32": cholesky_ex_gpu = torch.linalg.cholesky_ex @wraps(cholesky_ex_gpu) - def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.Tensor: + def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.return_types.linalg_cholesky_ex: if A.device.type != 'cpu': return cholesky_ex_gpu(A, upper=upper, check_errors=check_errors, out=out) @@ -269,6 +269,15 @@ if sys.platform == "win32": return torch.return_types.linalg_cholesky_ex((L, torch.tensor(0, dtype=torch.int32, device='cpu')), {}) torch.linalg.cholesky_ex = cholesky_ex + cholesky_gpu = torch.linalg.cholesky + @wraps(cholesky_gpu) + def cholesky(A: torch.Tensor, upper=False, out=None) -> torch.Tensor: + if A.device.type != 'cpu': + return cholesky_gpu(A, upper=upper, out=out) + L, _ = torch.linalg.cholesky_ex(A, upper=upper, out=out) + return L + torch.linalg.cholesky = cholesky + is_wsl: bool = False else: def get_agents() -> List[Agent]: From a47959b114b68ea8eb1f22e49183af9f70478c53 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 13:33:15 +0300 Subject: [PATCH 081/230] move ROCm Windows hijacks outside of torch install --- modules/devices.py | 2 ++ modules/rocm.py | 83 +++++++++++++++++++++++----------------------- modules/shared.py | 5 +++ 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/modules/devices.py b/modules/devices.py index abe979c17..804fdaa9b 100644 --- a/modules/devices.py +++ b/modules/devices.py @@ -48,6 +48,8 @@ def has_mps() -> bool: def has_xpu() -> bool: return bool(hasattr(torch, 'xpu') and torch.xpu.is_available()) +def has_rocm() -> bool: + return bool(torch.version.hip is not None and torch.cuda.is_available()) def has_zluda() -> bool: if not cuda_ok: diff --git a/modules/rocm.py b/modules/rocm.py index 0d489b72a..643e02692 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -243,40 +243,39 @@ if sys.platform == "win32": os.environ["PATH"] = ";".join(paths_no_rocm) return - cholesky_ex_gpu = torch.linalg.cholesky_ex - @wraps(cholesky_ex_gpu) - def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.return_types.linalg_cholesky_ex: - if A.device.type != 'cpu': - return cholesky_ex_gpu(A, upper=upper, check_errors=check_errors, out=out) + def rocm_init(): + try: + import torch + import numpy as np - assert not upper - assert not check_errors - assert out is None + cholesky_ex_gpu = torch.linalg.cholesky_ex + @wraps(cholesky_ex_gpu) + def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.return_types.linalg_cholesky_ex: + if A.device.type != 'cpu': + return cholesky_ex_gpu(A, upper=upper, check_errors=check_errors, out=out) - n = A.size(0) - L = torch.zeros_like(A) + assert not check_errors + L = torch.from_numpy(np.linalg.cholesky(A.numpy(), upper=upper)) + info = torch.tensor(0, dtype=torch.int32, device='cpu') + if out is not None: + out[0].copy_(L) + out[1].copy_(info) + return torch.return_types.linalg_cholesky_ex((L, info), {}) + torch.linalg.cholesky_ex = cholesky_ex - for i in range(n): - for j in range(i + 1): - s = torch.dot(L[i, :j], L[j, :j].conj()) - if i == j: - val = A[i, i] - s - if val.real <= 0 or (A.dtype.is_complex and val.imag != 0): - return torch.return_types.linalg_cholesky_ex((L, torch.tensor(i + 1, dtype=torch.int32, device='cpu')), {}) - L[i, j] = torch.sqrt(val.real) - else: - L[i, j] = (A[i, j] - s) / L[j, j] - return torch.return_types.linalg_cholesky_ex((L, torch.tensor(0, dtype=torch.int32, device='cpu')), {}) - torch.linalg.cholesky_ex = cholesky_ex - - cholesky_gpu = torch.linalg.cholesky - @wraps(cholesky_gpu) - def cholesky(A: torch.Tensor, upper=False, out=None) -> torch.Tensor: - if A.device.type != 'cpu': - return cholesky_gpu(A, upper=upper, out=out) - L, _ = torch.linalg.cholesky_ex(A, upper=upper, out=out) - return L - torch.linalg.cholesky = cholesky + cholesky_gpu = torch.linalg.cholesky + @wraps(cholesky_gpu) + def cholesky(A: torch.Tensor, upper=False, out=None) -> torch.Tensor: + if A.device.type != 'cpu': + return cholesky_gpu(A, upper=upper, out=out) + L = torch.from_numpy(np.linalg.cholesky(A.numpy(), upper=upper)) + if out is not None: + out.copy_(L) + return L + torch.linalg.cholesky = cholesky + except Exception as e: + return False, e + return True, None is_wsl: bool = False else: @@ -290,16 +289,18 @@ else: return [Agent(x) for x in agents] def postinstall(): - if not is_wsl: - return - try: - if shutil.which("conda") is not None: - # Preload stdc++ library. This will bypass Anaconda stdc++ library. - load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") - # Preload rocr4wsl. The user don't have to replace the library file. - load_library_global("/opt/rocm/lib/libhsa-runtime64.so") - except OSError: - pass + if is_wsl: + try: + if shutil.which("conda") is not None: + # Preload stdc++ library. This will bypass Anaconda stdc++ library. + load_library_global("/lib/x86_64-linux-gnu/libstdc++.so.6") + # Preload rocr4wsl. The user don't have to replace the library file. + load_library_global("/opt/rocm/lib/libhsa-runtime64.so") + except OSError: + pass + + def rocm_init(): + return True, None is_wsl: bool = os.environ.get('WSL_DISTRO_NAME', 'unknown' if spawn('wslpath -w /') else None) is not None environment = None diff --git a/modules/shared.py b/modules/shared.py index 78ff5ac0c..6f54bff2c 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -83,6 +83,11 @@ elif cmd_opts.use_directml: ok, e = directml_init() if not ok: log.error(f'DirectML initialization failed: {e}') +elif cmd_opts.use_rocm or devices.has_rocm(): + from modules.rocm import rocm_init + ok, e = rocm_init() + if not ok: + log.error(f'ROCm initialization failed: {e}') devices.backend = devices.get_backend(cmd_opts) devices.device = devices.get_optimal_device() mem_stat = memory_stats() From 4a70e82b0c8e021cf48d62445bc4b5e503fa2f7a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 14:05:20 +0300 Subject: [PATCH 082/230] ROCm always use numpy on cholesky --- modules/devices.py | 2 ++ modules/rocm.py | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/devices.py b/modules/devices.py index 804fdaa9b..a98b53d02 100644 --- a/modules/devices.py +++ b/modules/devices.py @@ -48,9 +48,11 @@ def has_mps() -> bool: def has_xpu() -> bool: return bool(hasattr(torch, 'xpu') and torch.xpu.is_available()) + def has_rocm() -> bool: return bool(torch.version.hip is not None and torch.cuda.is_available()) + def has_zluda() -> bool: if not cuda_ok: return False diff --git a/modules/rocm.py b/modules/rocm.py index 643e02692..30e90f000 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -251,12 +251,10 @@ if sys.platform == "win32": cholesky_ex_gpu = torch.linalg.cholesky_ex @wraps(cholesky_ex_gpu) def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.return_types.linalg_cholesky_ex: - if A.device.type != 'cpu': - return cholesky_ex_gpu(A, upper=upper, check_errors=check_errors, out=out) - assert not check_errors - L = torch.from_numpy(np.linalg.cholesky(A.numpy(), upper=upper)) - info = torch.tensor(0, dtype=torch.int32, device='cpu') + return_device = A.device + L = torch.from_numpy(np.linalg.cholesky(A.to("cpu").numpy(), upper=upper)).to(return_device) + info = torch.tensor(0, dtype=torch.int32, device=return_device) if out is not None: out[0].copy_(L) out[1].copy_(info) @@ -266,9 +264,8 @@ if sys.platform == "win32": cholesky_gpu = torch.linalg.cholesky @wraps(cholesky_gpu) def cholesky(A: torch.Tensor, upper=False, out=None) -> torch.Tensor: - if A.device.type != 'cpu': - return cholesky_gpu(A, upper=upper, out=out) - L = torch.from_numpy(np.linalg.cholesky(A.numpy(), upper=upper)) + return_device = A.device + L = torch.from_numpy(np.linalg.cholesky(A.to("cpu").numpy(), upper=upper)).to(return_device) if out is not None: out.copy_(L) return L From 32755358675dd16631c887b49b02cadc53a56431 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 09:09:19 -0400 Subject: [PATCH 083/230] update loopback and note changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- scripts/loopback.py | 2 +- wiki | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12627f6bd..28d098a4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-25 +## Update for 2025-09-28 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -53,6 +53,7 @@ - **video** support for configurable multi-stage models such as WAN-2.2-14B - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring + - update **loopback** script with radon seed option, thanks @rabanti - **Fixes** - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load diff --git a/scripts/loopback.py b/scripts/loopback.py index 571f67665..e24683ce6 100644 --- a/scripts/loopback.py +++ b/scripts/loopback.py @@ -82,11 +82,11 @@ class Script(scripts_manager.Script): if randomize_seed: p.seed = random.randrange(4294967294) p.all_seeds = [p.seed] - log.info(f'Setting random seed {p.seed} for loopback iteration {i}') p.seed = processed.seed + 1 # why? p.denoising_strength = calculate_denoising_strength(i + 1) last_image = processed.images[0] p.init_images = [last_image] + log.info(f'Loopback: iteration={i} seed={p.seed} curve={denoising_curve} strength={p.denoising_strength}:{final_denoising_strength}') if initial_batch_count == 1: history.append(last_image) all_images.append(last_image) diff --git a/wiki b/wiki index bd9905932..77e5745f7 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit bd990593287f36d4c76828a2db0eaa019ca0630f +Subproject commit 77e5745f7a7b8ac2f9d029c6ebb83c954be56006 From 02f03d56a71b2a579af51293dcd7f550fe7dab0a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 16:23:29 +0300 Subject: [PATCH 084/230] set offload_buffers to true on balanced offload --- modules/sd_offload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sd_offload.py b/modules/sd_offload.py index 19e59de3d..4126b81e8 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -245,7 +245,7 @@ class OffloadHook(accelerate.hooks.ModelHook): if isinstance(device_map[v], int): device_map[v] = f"{devices.device.type}:{device_map[v]}" # int implies CUDA or XPU device, but it will break DirectML backend so we add type if device_map is not None: - module = accelerate.dispatch_model(module, device_map=device_map, offload_dir=offload_dir) + module = accelerate.dispatch_model(module, device_map=device_map, offload_dir=offload_dir, offload_buffers=True) module._hf_hook.execution_device = torch.device(devices.device) # pylint: disable=protected-access module.balanced_offload_device_map = device_map module.balanced_offload_max_memory = max_memory From 9e6fdaa5cca2690abbc29bdbe6662c0d15e5179e Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 09:24:04 -0400 Subject: [PATCH 085/230] vae slicing and tiling enabled on low and med vram, off otherwise Signed-off-by: Vladimir Mandic --- modules/processing_vae.py | 4 ++-- modules/sd_hijack_vae.py | 2 +- modules/shared.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/processing_vae.py b/modules/processing_vae.py index aca549a39..933af425f 100644 --- a/modules/processing_vae.py +++ b/modules/processing_vae.py @@ -173,7 +173,7 @@ def full_vae_decode(latents, model): log_debug(f'VAE memory: {shared.mem_mon.read()}') vae_name = os.path.splitext(os.path.basename(sd_vae.loaded_vae_file))[0] if sd_vae.loaded_vae_file is not None else "default" vae_scale_factor = sd_vae.get_vae_scale_factor(model) - shared.log.debug(f'Decode: vae="{vae_name}" scale={vae_scale_factor} upcast={upcast} slicing={getattr(model.vae, "use_slicing", None)} tiling={getattr(model.vae, "use_tiling", None)} latents={list(latents.shape)}:{latents.device}:{latents.dtype} time={t1-t0:.3f}') + shared.log.debug(f'Decode: vae="{vae_name}" scale={vae_scale_factor} upcast={upcast} slicing={getattr(model.vae, "use_slicing", None)} tiling={getattr(model.vae, "use_tiling", None)} latents={list(latents.shape)}:{latents.device} dtype={latents.dtype} time={t1-t0:.3f}') return decoded @@ -221,7 +221,7 @@ def taesd_vae_decode(latents): else: decoded = sd_vae_taesd.decode(latents) t1 = time.time() - shared.log.debug(f'Decode: vae="taesd" latents={latents.shape}:{latents.dtype}:{latents.device} time={t1-t0:.3f}') + shared.log.debug(f'Decode: vae="taesd" latents={latents.shape}:{latents.device} dtype={latents.dtype} time={t1-t0:.3f}') return decoded diff --git a/modules/sd_hijack_vae.py b/modules/sd_hijack_vae.py index edd8427e6..2563ccfed 100644 --- a/modules/sd_hijack_vae.py +++ b/modules/sd_hijack_vae.py @@ -18,7 +18,7 @@ def hijack_vae_decode(*args, **kwargs): latents = args[0].to(device=devices.device, dtype=shared.sd_model.vae.dtype) # upcast to vae dtype res = shared.sd_model.vae.orig_decode(latents, *args[1:], **kwargs) t1 = time.time() - shared.log.debug(f'Decode: vae={shared.sd_model.vae.__class__.__name__} slicing={getattr(shared.sd_model.vae, "use_slicing", None)} tiling={getattr(shared.sd_model.vae, "use_tiling", None)} latents={list(latents.shape)}:{latents.device}:{latents.dtype} time={t1-t0:.3f}') + shared.log.debug(f'Decode: vae={shared.sd_model.vae.__class__.__name__} slicing={getattr(shared.sd_model.vae, "use_slicing", None)} tiling={getattr(shared.sd_model.vae, "use_tiling", None)} latents={list(latents.shape)}:{latents.device} dtype={latents.dtype} time={t1-t0:.3f}') else: res = shared.sd_model.vae.orig_decode(*args, **kwargs) except Exception as e: diff --git a/modules/shared.py b/modules/shared.py index 6f54bff2c..c7d507a9e 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -256,7 +256,7 @@ options_templates.update(options_section(('vae_encoder', "Variational Auto Encod "sd_vae": OptionInfo("Automatic", "VAE model", gr.Dropdown, lambda: {"choices": shared_items.sd_vae_items()}, refresh=shared_items.refresh_vae_list), "diffusers_vae_upcast": OptionInfo("default", "VAE upcasting", gr.Radio, {"choices": ['default', 'true', 'false']}), "no_half_vae": OptionInfo(False if not cmd_opts.use_openvino else True, "Full precision (--no-half-vae)"), - "diffusers_vae_slicing": OptionInfo(True, "VAE slicing", gr.Checkbox), + "diffusers_vae_slicing": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE slicing", gr.Checkbox), "diffusers_vae_tiling": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE tiling", gr.Checkbox), "diffusers_vae_tile_size": OptionInfo(0, "VAE tile size", gr.Slider, {"minimum": 0, "maximum": 4096, "step": 8 }), "diffusers_vae_tile_overlap": OptionInfo(0.25, "VAE tile overlap", gr.Slider, {"minimum": 0, "maximum": 0.95, "step": 0.05 }), From 749878289f4904be4188906c6c3f77c4884f69e9 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 09:25:38 -0400 Subject: [PATCH 086/230] document vae changes Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + modules/shared.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28d098a4e..b10970e6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring - update **loopback** script with radon seed option, thanks @rabanti + - **vae** slicing enable for lowvram/medvram, tiling for lowvram, both disabled otherwise - **Fixes** - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load diff --git a/modules/shared.py b/modules/shared.py index c7d507a9e..a9600ce71 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -257,7 +257,7 @@ options_templates.update(options_section(('vae_encoder', "Variational Auto Encod "diffusers_vae_upcast": OptionInfo("default", "VAE upcasting", gr.Radio, {"choices": ['default', 'true', 'false']}), "no_half_vae": OptionInfo(False if not cmd_opts.use_openvino else True, "Full precision (--no-half-vae)"), "diffusers_vae_slicing": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE slicing", gr.Checkbox), - "diffusers_vae_tiling": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE tiling", gr.Checkbox), + "diffusers_vae_tiling": OptionInfo(cmd_opts.lowvram, "VAE tiling", gr.Checkbox), "diffusers_vae_tile_size": OptionInfo(0, "VAE tile size", gr.Slider, {"minimum": 0, "maximum": 4096, "step": 8 }), "diffusers_vae_tile_overlap": OptionInfo(0.25, "VAE tile overlap", gr.Slider, {"minimum": 0, "maximum": 0.95, "step": 0.05 }), "remote_vae_type": OptionInfo('raw', "Remote VAE image type", gr.Dropdown, {"choices": ['raw', 'jpg', 'png']}), From 6f2145fa570ed34d291a40cd7aef6e610f2bf2c7 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 16:47:31 +0300 Subject: [PATCH 087/230] revert offload_buffers --- modules/sd_offload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sd_offload.py b/modules/sd_offload.py index 4126b81e8..19e59de3d 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -245,7 +245,7 @@ class OffloadHook(accelerate.hooks.ModelHook): if isinstance(device_map[v], int): device_map[v] = f"{devices.device.type}:{device_map[v]}" # int implies CUDA or XPU device, but it will break DirectML backend so we add type if device_map is not None: - module = accelerate.dispatch_model(module, device_map=device_map, offload_dir=offload_dir, offload_buffers=True) + module = accelerate.dispatch_model(module, device_map=device_map, offload_dir=offload_dir) module._hf_hook.execution_device = torch.device(devices.device) # pylint: disable=protected-access module.balanced_offload_device_map = device_map module.balanced_offload_max_memory = max_memory From 9d0d17a54b1b5a67c50a3805671ae99a9a64281f Mon Sep 17 00:00:00 2001 From: Aleri Kaisattera <73682764+alerikaisattera@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:44:54 +0600 Subject: [PATCH 088/230] Add model size and release date to reference model list --- html/reference.json | 280 +++++++++++++++++++++++++++++++++----------- 1 file changed, 210 insertions(+), 70 deletions(-) diff --git a/html/reference.json b/html/reference.json index c8886af6b..4a45cb86c 100644 --- a/html/reference.json +++ b/html/reference.json @@ -37,7 +37,9 @@ "path": "v1-5-pruned-fp16-emaonly.safetensors@https://huggingface.co/Aptronym/SDNext/resolve/main/Reference/v1-5-pruned-fp16-emaonly.safetensors?download=true", "preview": "v1-5-pruned-fp16-emaonly.jpg", "desc": "Stable Diffusion 1.5 is the base model all other 1.5 checkpoint were trained from. It's a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. The Stable-Diffusion-v1-5 checkpoint was initialized with the weights of the Stable-Diffusion-v1-2 checkpoint and subsequently fine-tuned on 595k steps at resolution 512x512.", - "extras": "width: 512, height: 512, sampler: DEIS, steps: 20, cfg_scale: 6.0" + "extras": "width: 512, height: 512, sampler: DEIS, steps: 20, cfg_scale: 6.0", + "size": 2.28, + "date": "2022 October" }, "StabilityAI StableDiffusion 2.1": { "path": "huggingface/stabilityai/stable-diffusion-2-1-base", @@ -45,7 +47,9 @@ "skip": true, "variant": "fp16", "desc": "This stable-diffusion-2-1-base model fine-tunes stable-diffusion-2-base (512-base-ema.ckpt) with 220k extra steps taken", - "extras": "width: 512, height: 512, sampler: DEIS, steps: 20, cfg_scale: 6.0" + "extras": "width: 512, height: 512, sampler: DEIS, steps: 20, cfg_scale: 6.0", + "size": 2.58, + "date": "2022 December" }, "StabilityAI StableDiffusion 2.1 V": { "path": "huggingface/stabilityai/stable-diffusion-2-1", @@ -61,7 +65,9 @@ "desc": "Stable Diffusion XL (SDXL) is AI image generation model that is tailored towards more photorealistic outputs with more detailed imagery and composition compared to previous SD models, including SD 2.1. It can make realistic faces and better image composition, all while using shorter and simpler prompts at a greatly increased base resolution of 1024x1024. Just like its predecessors, SDXL has the ability to generate image variations using image-to-image prompting, inpainting (reimagining of the selected parts of an image), and outpainting (creating new parts that lie outside the image borders).", "skip": true, "variant": "fp16", - "extras": "" + "extras": "", + "size": 6.94, + "date": "2023 July" }, "StabilityAI StableDiffusion XL Turbo": { "path": "stabilityai/sdxl-turbo", @@ -77,7 +83,9 @@ "variant": "bf16", "desc": "Stable Cascade is a diffusion model built upon the Würstchen architecture and its main difference to other models like Stable Diffusion is that it is working at a much smaller latent space. Why is this important? The smaller the latent space, the faster you can run inference and the cheaper the training becomes. How small is the latent space? Stable Diffusion uses a compression factor of 8, resulting in a 1024x1024 image being encoded to 128x128. Stable Cascade achieves a compression factor of 42, meaning that it is possible to encode a 1024x1024 image to 24x24, while maintaining crisp reconstructions. The text-conditional model is then trained in the highly compressed latent space. Previous versions of this architecture, achieved a 16x cost reduction over Stable Diffusion 1.5", "preview": "stabilityai--stable-cascade.jpg", - "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 1.0" + "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 1.0", + "size": 11.82, + "date": "2024 February" }, "StabilityAI Stable Cascade Lite": { "path": "huggingface/stabilityai/stable-cascade-lite", @@ -85,7 +93,9 @@ "variant": "bf16", "desc": "Stable Cascade is a diffusion model built upon the Würstchen architecture and its main difference to other models like Stable Diffusion is that it is working at a much smaller latent space. Why is this important? The smaller the latent space, the faster you can run inference and the cheaper the training becomes. How small is the latent space? Stable Diffusion uses a compression factor of 8, resulting in a 1024x1024 image being encoded to 128x128. Stable Cascade achieves a compression factor of 42, meaning that it is possible to encode a 1024x1024 image to 24x24, while maintaining crisp reconstructions. The text-conditional model is then trained in the highly compressed latent space. Previous versions of this architecture, achieved a 16x cost reduction over Stable Diffusion 1.5", "preview": "stabilityai--stable-cascade-lite.jpg", - "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 1.0" + "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 1.0", + "size": 4.97, + "date": "2024 February" }, "StabilityAI Stable Diffusion 3 Medium": { "path": "stabilityai/stable-diffusion-3-medium-diffusers", @@ -93,7 +103,9 @@ "variant": "fp16", "desc": "Stable Diffusion 3 Medium is a Multimodal Diffusion Transformer (MMDiT) text-to-image model that features greatly improved performance in image quality, typography, complex prompt understanding, and resource-efficiency", "preview": "stabilityai--stable-diffusion-3.jpg", - "extras": "sampler: Default, cfg_scale: 7.0" + "extras": "sampler: Default, cfg_scale: 7.0", + "size": 15.14, + "date": "2024 June" }, "StabilityAI Stable Diffusion 3.5 Medium": { "path": "stabilityai/stable-diffusion-3.5-medium", @@ -101,7 +113,9 @@ "variant": "fp16", "desc": "Stable Diffusion 3.5 Medium is a Multimodal Diffusion Transformer with improvements (MMDiT-X) text-to-image model that features improved performance in image quality, typography, complex prompt understanding, and resource-efficiency.", "preview": "stabilityai--stable-diffusion-3_5-medium.jpg", - "extras": "sampler: Default, cfg_scale: 7.0" + "extras": "sampler: Default, cfg_scale: 7.0", + "size": 15.89, + "date": "2024 October" }, "StabilityAI Stable Diffusion 3.5 Large": { "path": "stabilityai/stable-diffusion-3.5-large", @@ -109,7 +123,9 @@ "variant": "fp16", "desc": "Stable Diffusion 3.5 Large is a Multimodal Diffusion Transformer (MMDiT) text-to-image model that features improved performance in image quality, typography, complex prompt understanding, and resource-efficiency.", "preview": "stabilityai--stable-diffusion-3_5-large.jpg", - "extras": "sampler: Default, cfg_scale: 7.0" + "extras": "sampler: Default, cfg_scale: 7.0", + "size": 26.98, + "date": "2024 October" }, "StabilityAI Stable Diffusion 3.5 Turbo": { "path": "stabilityai/stable-diffusion-3.5-large-turbo", @@ -125,28 +141,36 @@ "preview": "black-forest-labs--FLUX.1-dev.jpg", "desc": "FLUX.1 models are based on a hybrid architecture of multimodal and parallel diffusion transformer blocks, scaled to 12B parameters and builing on flow matching", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 32.93, + "date": "2024 August" }, "Black Forest Labs FLUX.1 Schnell": { "path": "black-forest-labs/FLUX.1-schnell", "preview": "black-forest-labs--FLUX.1-schnell.jpg", "desc": "FLUX.1 models are based on a hybrid architecture of multimodal and parallel diffusion transformer blocks, scaled to 12B parameters and builing on flow matching. Trained using latent adversarial diffusion distillation, FLUX.1 [schnell] can generate high-quality images in only 1 to 4 steps", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 32.93, + "date": "2024 August" }, "Black Forest Labs FLUX.1 Kontext Dev": { "path": "black-forest-labs/FLUX.1-Kontext-dev", "preview": "black-forest-labs--FLUX.1-Kontext-dev.jpg", "desc": "FLUX.1 Kontext [dev] is a 12 billion parameter rectified flow transformer capable of editing images based on text instructions.", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 32.93, + "date": "2025 June" }, "Black Forest Labs FLUX.1 Krea Dev": { "path": "black-forest-labs/FLUX.1-Krea-dev", "preview": "black-forest-labs--FLUX.1-Krea-dev.jpg", "desc": "FLUX.1 Krea [dev] is a 12 billion parameter rectified flow transformer capable of generating images from text descriptions.", "skip": true, - "extras": "sampler: Default, cfg_scale: 4.5" + "extras": "sampler: Default, cfg_scale: 4.5", + "size": 32.93, + "date": "2025 July" }, "Tencent FLUX.1 Dev SRPO": { "path": "vladmandic/flux.1-dev-SRPO", @@ -161,42 +185,54 @@ "preview": "Qwen--Qwen-Image.jpg", "desc": " Qwen-Image, an image generation foundation model in the Qwen series that achieves significant advances in complex text rendering and precise image editing.", "skip": true, - "extras": "" + "extras": "", + "size": 56.1, + "date": "2025 August" }, "Qwen-Image-Edit": { "path": "Qwen/Qwen-Image-Edit", "preview": "Qwen--Qwen-Image-Edit.jpg", "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", "skip": true, - "extras": "" + "extras": "", + "size": 56.1, + "date": "2025 August" }, "Qwen-Image-Edit-2509": { "path": "Qwen/Qwen-Image-Edit-2509", "preview": "Qwen--Qwen-Image-Edit-2509.jpg", "desc": "Qwen-Image-Edit, the image editing version of Qwen-Image. Built upon our 20B Qwen-Image model, Qwen-Image-Edit successfully extends Qwen-Image’s unique text rendering capabilities to image editing tasks, enabling precise text editing.", "skip": true, - "extras": "" + "extras": "", + "size": 56.1, + "date": "2025 September" }, "Qwen-Image-Lightning": { "path": "vladmandic/Qwen-Lightning", "preview": "vladmandic--Qwen-Lightning.jpg", "desc": "Qwen-Lightning is step-distilled from Qwen-Image to allow for generation in 8 steps.", "skip": true, - "extras": "steps: 8" + "extras": "steps: 8", + "size": 56.1, + "date": "2025 August" }, "Qwen-Image-Distill": { "path": "SahilCarterr/Qwen-Image-Distill-Full", "preview": "SahilCarterr--Qwen-Image-Distill-Full.jpg", "desc": "Qwen-Image-Distill is a distilled and accelerated version of Qwen-Image by DiffSynth-Studio.", "skip": true, - "extras": "steps: 15" + "extras": "steps: 15", + "size": 56.1, + "date": "2025 August" }, "Qwen-Image-Lightning-Edit": { "path": "vladmandic/Qwen-Lightning-Edit", "preview": "vladmandic--Qwen-Lightning-Edit.jpg", "desc": " Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.", "skip": true, - "extras": "steps: 8" + "extras": "steps: 8", + "size": 56.1, + "date": "2025 August" }, "lodestones Chroma1 HD": { @@ -204,42 +240,54 @@ "preview": "lodestones--Chroma-HD.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. This is the high-res fine-tune of the Chroma1-Base at a 1024x1024 resolution.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "lodestones Chroma1 Base": { "path": "lodestones/Chroma1-Base", "preview": "lodestones--Chroma-Base.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. This is the core 512x512 model. It's a solid, all-around foundation for pretty much any creative project.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "lodestones Chroma1 Flash": { "path": "lodestones/Chroma1-Flash", "preview": "lodestones--Chroma-flash.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. A fine-tuned version of the Chroma1-Base made to find the best way to make these flow matching models faster.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "lodestones Chroma1 v50 Preview Annealed": { "path": "vladmandic/chroma-unlocked-v50-annealed", "preview": "lodestones--Chroma-annealed.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Re-tweaked variant with extra noise added.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "lodestones Chroma1 v48 Preview": { "path": "vladmandic/chroma-unlocked-v48", "preview": "lodestones--Chroma.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Last raw version of Chroma before final finetuning.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "lodestones Chroma1 v48 Preview Calibrated": { "path": "vladmandic/chroma-unlocked-v48-detail-calibrated", "preview": "lodestones--Chroma-detail.jpg", "desc": "Chroma is a 8.9B parameter model based on FLUX.1-schnell. It’s fully Apache 2.0 licensed, ensuring that anyone can use, modify, and build on top of it—no corporate gatekeeping. Last raw version of Chroma before final finetuning but with some detail calibration.", "skip": true, - "extras": "" + "extras": "", + "size": 26.84, + "date": "2025 July" }, "Ostris Flex.2 Preview": { @@ -247,14 +295,18 @@ "preview": "ostris--Flex.2-preview.jpg", "desc": "Open Source 8B parameter Text to Image Diffusion Model with universal control and inpainting support built in. Early access preview release. The next version of Flex.1-alpha", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 25.65, + "date": "2025 April" }, "Ostris Flex.1 Alpha": { "path": "ostris/Flex.1-alpha", "preview": "ostris--Flex.1-alpha.jpg", "desc": "Flex.1 alpha is a pre-trained base 8 billion parameter rectified flow transformer capable of generating images from text descriptions. It has a similar architecture to FLUX.1-dev, but with fewer double transformer blocks (8 vs 19)", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 25.65, + "date": "2025 January" }, "Wan-AI Wan2.1 1.3B": { @@ -262,14 +314,18 @@ "preview": "Wan-AI--Wan2.1-T2V-1.3B-Diffusers.jpg", "desc": "Wan is an advanced and powerful visual generation model developed by Tongyi Lab of Alibaba Group. It can generate videos based on text, images, and other control signals. The Wan2.1 series models are now fully open-source.", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 27.72, + "date": "2025 February" }, "Wan-AI Wan2.1 14B": { "path": "Wan-AI/Wan2.1-T2V-14B-Diffusers", "preview": "Wan-AI--Wan2.1-T2V-14B-Diffusers.jpg", "desc": "Wan is an advanced and powerful visual generation model developed by Tongyi Lab of Alibaba Group. It can generate videos based on text, images, and other control signals. The Wan2.1 series models are now fully open-source.", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 78.52, + "date": "2025 February" }, "Wan-AI Wan2.2 5B": { "path": "Wan-AI/Wan2.2-TI2V-5B-Diffusers", @@ -305,21 +361,27 @@ "preview": "Freepik--F-Lite.jpg", "desc": "F Lite is a 10B parameter diffusion model created by Freepik and Fal, trained exclusively on copyright-safe and SFW content. The model was trained on Freepik's internal dataset comprising approximately 80 million copyright-safe images, making it the first publicly available model of this scale trained exclusively on legally compliant and SFW content.", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 19.81, + "date": "2025 May" }, "Freepik F-Lite Texture": { "path": "Freepik/F-Lite-Texture", "preview": "Freepik--F-Lite-Texture.jpg", "desc": "F Lite is a 10B parameter diffusion model created by Freepik and Fal, trained exclusively on copyright-safe and SFW content. The model was trained on Freepik's internal dataset comprising approximately 80 million copyright-safe images, making it the first publicly available model of this scale trained exclusively on legally compliant and SFW content.", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 19.81, + "date": "2025 May" }, "Freepik F-Lite 7B": { "path": "Freepik/F-Lite-7B", "preview": "Freepik--F-Lite-7B.jpg", "desc": "F Lite is a 10B parameter diffusion model created by Freepik and Fal, trained exclusively on copyright-safe and SFW content. The model was trained on Freepik's internal dataset comprising approximately 80 million copyright-safe images, making it the first publicly available model of this scale trained exclusively on legally compliant and SFW content.", "skip": true, - "extras": "sampler: Default, cfg_scale: 3.5" + "extras": "sampler: Default, cfg_scale: 3.5", + "size": 13.89, + "date": "2025 May" }, "SDXS DreamShaper 512": { @@ -340,13 +402,17 @@ "path": "Efficient-Large-Model/SANA1.5_1.6B_1024px_diffusers", "desc": "Sana is an efficient model with scaling of training-time and inference time techniques. SANA-1.5 delivers: efficient model growth from 1.6B Sana-1.0 model to 4.8B, achieving similar or better performance than training from scratch and saving 60% training cost; efficient model depth pruning, slimming any model size as you want; powerful VLM selection based inference scaling, smaller model+inference scaling > larger model.", "preview": "Efficient-Large-Model--SANA1.5_1.6B_1024px_diffusers.jpg", - "skip": true + "skip": true, + "size": 9.49, + "date": "2025 March" }, "NVLabs Sana 1.5 4.8B 1k": { "path": "Efficient-Large-Model/SANA1.5_4.8B_1024px_diffusers", "desc": "Sana is an efficient model with scaling of training-time and inference time techniques. SANA-1.5 delivers: efficient model growth from 1.6B Sana-1.0 model to 4.8B, achieving similar or better performance than training from scratch and saving 60% training cost; efficient model depth pruning, slimming any model size as you want; powerful VLM selection based inference scaling, smaller model+inference scaling > larger model.", "preview": "Efficient-Large-Model--SANA1.5_4.8B_1024px_diffusers.jpg", - "skip": true + "skip": true, + "size": 15.58, + "date": "2025 March" }, "NVLabs Sana 1.5 1.6B 1k Sprint": { "path": "Efficient-Large-Model/Sana_Sprint_1.6B_1024px_diffusers", @@ -358,63 +424,83 @@ "path": "Efficient-Large-Model/Sana_1600M_4Kpx_BF16_diffusers", "desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.", "preview": "Efficient-Large-Model--Sana_1600M_4Kpx_BF16_diffusers.jpg", - "skip": true + "skip": true, + "size": 12.63, + "date": "2024 November" }, "NVLabs Sana 1.0 1.6B 2k": { "path": "Efficient-Large-Model/Sana_1600M_2Kpx_BF16_diffusers", "desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.", "preview": "Efficient-Large-Model--Sana_1600M_2Kpx_BF16_diffusers.jpg", - "skip": true + "skip": true, + "size": 12.63, + "date": "2024 November" }, "NVLabs Sana 1.0 1.6B 1k": { "path": "Efficient-Large-Model/Sana_1600M_1024px_diffusers", "desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.", "preview": "Efficient-Large-Model--Sana_1600M_1024px_diffusers.jpg", - "skip": true + "skip": true, + "size": 12.63, + "date": "2024 November" }, "NVLabs Sana 1.0 0.6B 0.5k": { "path": "Efficient-Large-Model/Sana_600M_512px_diffusers", "desc": "Sana is a text-to-image framework that can efficiently generate images up to 4096 × 4096 resolution. Sana can synthesize high-resolution, high-quality images with strong text-image alignment at a remarkably fast speed, deployable on laptop GPU.", "preview": "Efficient-Large-Model--Sana_600M_512px_diffusers.jpg", - "skip": true + "skip": true, + "size": 7.51, + "date": "2024 November" }, "nVidia Cosmos-Predict2 T2I 2B": { "path": "nvidia/Cosmos-Predict2-2B-Text2Image", "desc": "Cosmos-Predict2: A family of highly performant pre-trained world foundation models purpose-built for generating physics-aware images, videos and world states for physical AI development.", "preview": "nvidia--Cosmos-Predict2-2B-Text2Image.jpg", - "skip": true + "skip": true, + "size": 13.32, + "date": "2025 June" }, "nVidia Cosmos-Predict2 T2I 14B": { "path": "nvidia/Cosmos-Predict2-14B-Text2Image", "desc": "Cosmos-Predict2: A family of highly performant pre-trained world foundation models purpose-built for generating physics-aware images, videos and world states for physical AI development.", "preview": "nvidia--Cosmos-Predict2-14B-Text2Image.jpg", - "skip": true + "skip": true, + "size": 37.36, + "date": "2025 June" }, "VectorSpaceLab OmniGen v1": { "path": "Shitao/OmniGen-v1-diffusers", "desc": "OmniGen is a unified image generation model that can generate a wide range of images from multi-modal prompts. It is designed to be simple, flexible and easy to use.", "preview": "Shitao--OmniGen-v1.jpg", - "skip": true + "skip": true, + "size": 15.47, + "date": "2024 October" }, "VectorSpaceLab OmniGen v2": { "path": "OmniGen2/OmniGen2", "desc": "OmniGen2 is a powerful and efficient unified multimodal model. Unlike OmniGen v1, OmniGen2 features two distinct decoding pathways for text and image modalities, utilizing unshared parameters and a decoupled image tokenizer.", "preview": "OmniGen2--OmniGen2.jpg", - "skip": true + "skip": true, + "size": 30.5, + "date": "2025 June" }, "AuraFlow 0.3": { "path": "fal/AuraFlow-v0.3", "desc": "AuraFlow v0.3 is the fully open-sourced flow-based text-to-image generation model. The model was trained with more compute compared to the previous version, AuraFlow-v0.2. Compared to AuraFlow-v0.2, the model is fine-tuned on more aesthetic datasets and now supports various aspect ratio, (now width and height up to 1536 pixels).", "preview": "fal--AuraFlow-v0.3.jpg", - "skip": true + "skip": true, + "size": 31.9, + "date": "2024 August" }, "AuraFlow 0.2": { "path": "fal/AuraFlow-v0.2", "desc": "AuraFlow v0.2 is the fully open-sourced largest flow-based text-to-image generation model. The model was trained with more compute compared to the previous version, AuraFlow-v0.1", "preview": "fal--AuraFlow-v0.2.jpg", - "skip": true + "skip": true, + "size": 31.9, + "date": "2024 July" }, "Segmind Vega": { @@ -423,7 +509,9 @@ "desc": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities. Trained on diverse datasets, including Grit and Midjourney scrape data, it excels at creating a wide range of visual content based on textual prompts. Employing a knowledge distillation strategy, Segmind-Vega leverages the teachings of several expert models, including SDXL, ZavyChromaXL, and JuggernautXL, to combine their strengths and produce compelling visual outputs.", "variant": "fp16", "skip": true, - "extras": "sampler: Default, cfg_scale: 9.0" + "extras": "sampler: Default, cfg_scale: 9.0", + "size": 6.43, + "date": "2023 November" }, "Segmind SSD-1B": { "path": "huggingface/segmind/SSD-1B", @@ -431,13 +519,17 @@ "desc": "The Segmind Stable Diffusion Model (SSD-1B) offers a compact, efficient, and distilled version of the SDXL model. At 50% smaller and 60% faster than Stable Diffusion XL (SDXL), it provides quick and seamless performance without sacrificing image quality.", "variant": "fp16", "skip": true, - "extras": "sampler: Default, cfg_scale: 9.0" + "extras": "sampler: Default, cfg_scale: 9.0", + "size": 8.72, + "date": "2023 October" }, "Segmind Tiny": { "path": "segmind/tiny-sd", "preview": "segmind--tiny-sd.jpg", "desc": "Segmind's Tiny-SD offers a compact, efficient, and distilled version of Realistic Vision 4.0 and is up to 80% faster than SD1.5", - "extras": "width: 512, height: 512, sampler: Default, cfg_scale: 9.0" + "extras": "width: 512, height: 512, sampler: Default, cfg_scale: 9.0", + "size": 1.03, + "date": "2023 July" }, "Segmind SegMoE SD 4x2": { "path": "segmind/SegMoE-SD-4x2-v0", @@ -461,7 +553,9 @@ "path": "PixArt-alpha/PixArt-XL-2-1024-MS", "desc": "PixArt-α is a Transformer-based T2I diffusion model whose image generation quality is competitive with state-of-the-art image generators (e.g., Imagen, SDXL, and even Midjourney), and the training speed markedly surpasses existing large-scale T2I models. Extensive experiments demonstrate that PIXART-α excels in image quality, artistry, and semantic control. It can directly generate 1024px images from text prompts within a single sampling process.", "preview": "PixArt-alpha--PixArt-XL-2-1024-MS.jpg", - "extras": "sampler: Default, cfg_scale: 2.0" + "extras": "sampler: Default, cfg_scale: 2.0", + "size": 21.3, + "date": "2023 November" }, "Pixart-Σ Small": { "path": "huggingface/PixArt-alpha/PixArt-Sigma-XL-2-512-MS", @@ -482,14 +576,18 @@ "desc": "PixArt-Σ, a Diffusion Transformer model (DiT) capable of directly generating images at 4K resolution. PixArt-Σ represents a significant advancement over its predecessor, PixArt-α, offering images of markedly higher fidelity and improved alignment with text prompts.", "preview": "PixArt-alpha--PixArt-Sigma-XL-2-2K-MS.jpg", "skip": true, - "extras": "sampler: Default, cfg_scale: 2.0" + "extras": "sampler: Default, cfg_scale: 2.0", + "size": 21.3, + "date": "2024 April" }, "Tencent HunyuanDiT 1.2": { "path": "Tencent-Hunyuan/HunyuanDiT-v1.2-Diffusers", "desc": "Hunyuan-DiT : A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding.", "preview": "Tencent-Hunyuan--HunyuanDiT-v1.2-Diffusers.jpg", - "extras": "sampler: Default, cfg_scale: 2.0" + "extras": "sampler: Default, cfg_scale: 2.0", + "size": 14.09, + "date": "2024 May" }, "Tencent HunyuanDiT 1.2 Distilled": { "path": "Tencent-Hunyuan/HunyuanDiT-v1.2-Diffusers-Distilled", @@ -515,14 +613,18 @@ "desc": "The Lumina-Next-SFT is a Next-DiT model containing 2B parameters and utilizes Gemma-2B as the text encoder, enhanced through high-quality supervised fine-tuning (SFT).", "preview": "Alpha-VLLM--Lumina-Next-SFT-diffusers.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 8.67, + "date": "2024 June" }, "AlphaVLLM Lumina 2": { "path": "Alpha-VLLM/Lumina-Image-2.0", "desc": "A Unified and Efficient Image Generative Model. Lumina-Image-2.0 is a 2 billion parameter flow-based diffusion transformer capable of generating images from text descriptions.", "preview": "Alpha-VLLM--Lumina-Image-2.0.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 20.75, + "date": "2025 January" }, "HiDream-I1 Fast": { @@ -530,21 +632,27 @@ "desc": "HiDream-I1 is a new open-source image generative foundation model with 17B parameters that achieves state-of-the-art image generation quality within seconds.", "preview": "HiDream-ai--HiDream-I1-Fast.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 58.4, + "date": "2025 April" }, "HiDream-I1 Dev": { "path": "HiDream-ai/HiDream-I1-Dev", "desc": "HiDream-I1 is a new open-source image generative foundation model with 17B parameters that achieves state-of-the-art image generation quality within seconds.", "preview": "HiDream-ai--HiDream-I1-Dev.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 58.4, + "date": "2025 April" }, "HiDream-I1 Full": { "path": "HiDream-ai/HiDream-I1-Full", "desc": "HiDream-I1 is a new open-source image generative foundation model with 17B parameters that achieves state-of-the-art image generation quality within seconds.", "preview": "HiDream-ai--HiDream-I1-Full.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 58.4, + "date": "2025 April" }, "HiDream-E1 Full": { "path": "HiDream-ai/HiDream-E1-Full", @@ -559,34 +667,44 @@ "desc": "Kolors is a large-scale text-to-image generation model based on latent diffusion, developed by the Kuaishou Kolors team. Trained on billions of text-image pairs, Kolors exhibits significant advantages over both open-source and proprietary models in visual quality, complex semantic accuracy, and text rendering for both Chinese and English characters. Furthermore, Kolors supports both Chinese and English inputs", "preview": "Kwai-Kolors--Kolors-diffusers.jpg", "skip": true, - "extras": "width: 1024, height: 1024" + "extras": "width: 1024, height: 1024", + "size": 17.40, + "date": "2024 July" }, "Kandinsky 2.1": { "path": "kandinsky-community/kandinsky-2-1", "desc": "Kandinsky 2.1 is a text-conditional diffusion model based on unCLIP and latent diffusion, composed of a transformer-based image prior model, a unet diffusion model, and a decoder. Kandinsky 2.1 inherits best practices from Dall-E 2 and Latent diffusion while introducing some new ideas. It uses the CLIP model as a text and image encoder, and diffusion image prior (mapping) between latent spaces of CLIP modalities. This approach increases the visual performance of the model and unveils new horizons in blending images and text-guided image manipulation.", "preview": "kandinsky-community--kandinsky-2-1.jpg", - "extras": "width: 768, height: 768, sampler: Default" + "extras": "width: 768, height: 768, sampler: Default", + "size": 5.15, + "date": "2023 April" }, "Kandinsky 2.2": { "path": "kandinsky-community/kandinsky-2-2-decoder", "desc": "Kandinsky 2.2 is a text-conditional diffusion model (+0.1!) based on unCLIP and latent diffusion, composed of a transformer-based image prior model, a unet diffusion model, and a decoder. Kandinsky 2.2 inherits best practices from Dall-E 2 and Latent diffusion while introducing some new ideas. It uses the CLIP model as a text and image encoder, and diffusion image prior (mapping) between latent spaces of CLIP modalities. This approach increases the visual performance of the model and unveils new horizons in blending images and text-guided image manipulation.", "preview": "kandinsky-community--kandinsky-2-2-decoder.jpg", - "extras": "width: 768, height: 768, sampler: Default" + "extras": "width: 768, height: 768, sampler: Default", + "size": 5.15, + "date": "2023 July" }, "Kandinsky 3": { "path": "kandinsky-community/kandinsky-3", "desc": "Kandinsky 3.0 is an open-source text-to-image diffusion model built upon the Kandinsky2-x model family. In comparison to its predecessors, Kandinsky 3.0 incorporates more data and specifically related to Russian culture, which allows to generate pictures related to Russin culture. Furthermore, enhancements have been made to the text understanding and visual quality of the model, achieved by increasing the size of the text encoder and Diffusion U-Net models, respectively.", "preview": "kandinsky-community--kandinsky-3.jpg", "variant": "fp16", - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 27.72, + "date": "2023 November" }, "Playground v1": { "path": "playgroundai/playground-v1", "desc": "Playground v1 is a latent diffusion model that improves the overall HDR quality to get more stunning images.", "preview": "playgroundai--playground-v1.jpg", - "extras": "width: 512, height: 512, sampler: Default" + "extras": "width: 512, height: 512, sampler: Default", + "size": 4.95, + "date": "2023 December" }, "Playground v2 Small": { "path": "playgroundai/playground-v2-256px-base", @@ -611,20 +729,26 @@ "desc": "Playground v2.5 is a diffusion-based text-to-image generative model, and a successor to Playground v2. Playground v2.5 is the state-of-the-art open-source model in aesthetic quality.", "preview": "playgroundai--playground-v2.5-1024px-aesthetic.jpg", "variant": "fp16", - "extras": "sampler: DPM++ 2M EDM" + "extras": "sampler: DPM++ 2M EDM", + "size": 13.35, + "date": "2023 December" }, "CogView 4": { "path": "zai-org/CogView4-6B", "desc": "An innovative cascaded framework that enhances the performance of text-to-image diffusion. CogView is the first model implementing relay diffusion in the realm of text-to-image generation, executing the task by first creating low-resolution images and subsequently applying relay-based super-resolution.", "preview": "THUDM--CogView4-6B.jpg", - "skip": true + "skip": true, + "size": 30.39, + "date": "2025 March" }, "CogView 3 Plus": { "path": "zai-org/CogView3-Plus-3B", "desc": "An innovative cascaded framework that enhances the performance of text-to-image diffusion. CogView is the first model implementing relay diffusion in the realm of text-to-image generation, executing the task by first creating low-resolution images and subsequently applying relay-based super-resolution.", "preview": "THUDM--CogView3-Plus-3B.jpg", - "skip": true + "skip": true, + "size": 24.96, + "date": "2024 October" }, "ShuttleAI Shuttle 3.0 Diffusion": { @@ -650,14 +774,18 @@ "path": "briaai/BRIA-3.2", "desc": "Bria 3.2 is the next-generation commercial-ready text-to-image model. With just 4 billion parameters, it provides exceptional aesthetics and text rendering, evaluated to provide on par results to leading open-source models, and outperforming other licensed models.", "preview": "briaai--BRIA-3.2.jpg", - "skip": true + "skip": true, + "size": 18.66, + "date": "2025 June" }, "Meissonic": { "path": "MeissonFlow/Meissonic", "desc": "Meissonic is a non-autoregressive mask image modeling text-to-image synthesis model that can generate high-resolution images. It is designed to run on consumer graphics cards.", "preview": "MeissonFlow--Meissonic.jpg", - "skip": true + "skip": true, + "size": 3.64, + "date": "2024 October" }, "aMUSEd 256": { @@ -678,7 +806,9 @@ "path": "warp-ai/wuerstchen", "desc": "Würstchen is a diffusion model whose text-conditional model works in a highly compressed latent space of images. Why is this important? Compressing data can reduce computational costs for both training and inference by magnitudes. Training on 1024x1024 images, is way more expensive than training at 32x32. Usually, other works make use of a relatively small compression, in the range of 4x - 8x spatial compression. Würstchen takes this to an extreme. Through its novel design, we achieve a 42x spatial compression. Würstchen employs a two-stage compression, what we call Stage A and Stage B. Stage A is a VQGAN, and Stage B is a Diffusion Autoencoder (more details can be found in the paper). A third model, Stage C, is learned in that highly compressed latent space. This training requires fractions of the compute used for current top-performing models, allowing also cheaper and faster inference.", "preview": "warp-ai--wuerstchen.jpg", - "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 0.0" + "extras": "sampler: Default, cfg_scale: 4.0, image_cfg_scale: 0.0", + "size": 12.16, + "date": "2023 August" }, "KOALA 700M": { @@ -687,7 +817,9 @@ "skip": true, "desc": "Fast text-to-image model, called KOALA, by compressing SDXL's U-Net and distilling knowledge from SDXL into our model. KOALA-700M can generate a 1024x1024 image in less than 1.5 seconds on an NVIDIA 4090 GPU, which is more than 2x faster than SDXL.", "preview": "etri-vilab--koala-700m-llava-cap.jpg", - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 6.58, + "date": "2024 January" }, "HDM-XUT 340M Anime": { @@ -702,13 +834,17 @@ "path": "thu-ml/unidiffuser-v1", "desc": "UniDiffuser is a unified diffusion framework to fit all distributions relevant to a set of multi-modal data in one transformer. UniDiffuser is able to perform image, text, text-to-image, image-to-text, and image-text pair generation by setting proper timesteps without additional overhead.\nSpecifically, UniDiffuser employs a variation of transformer, called U-ViT, which parameterizes the joint noise prediction network. Other components perform as encoders and decoders of different modalities, including a pretrained image autoencoder from Stable Diffusion, a pretrained image ViT-B/32 CLIP encoder, a pretrained text ViT-L CLIP encoder, and a GPT-2 text decoder finetuned by ourselves.", "preview": "thu-ml--unidiffuser-v1.jpg", - "extras": "width: 512, height: 512, sampler: Default" + "extras": "width: 512, height: 512, sampler: Default", + "size": 5.37, + "date": "2023 May" }, "SalesForce BLIP-Diffusion": { "path": "salesforce/blipdiffusion", "desc": "BLIP-Diffusion, a new subject-driven image generation model that supports multimodal control which consumes inputs of subject images and text prompts. Unlike other subject-driven generation models, BLIP-Diffusion introduces a new multimodal encoder which is pre-trained to provide subject representation.", - "preview": "salesforce--blipdiffusion.jpg" + "preview": "salesforce--blipdiffusion.jpg", + "size": 7.23, + "date": "2023 July" }, "InstaFlow 0.9B": { @@ -721,13 +857,17 @@ "path": "DeepFloyd/IF-I-M-v1.0", "desc": "DeepFloyd-IF is a pixel-based text-to-image triple-cascaded diffusion model, that can generate pictures with new state-of-the-art for photorealism and language understanding. The result is a highly efficient model that outperforms current state-of-the-art models, achieving a zero-shot FID-30K score of 6.66 on the COCO dataset. It is modular and composed of frozen text mode and three pixel cascaded diffusion modules, each designed to generate images of increasing resolution: 64x64, 256x256, and 1024x1024.", "preview": "DeepFloyd--IF-I-M-v1.0.jpg", - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 12.79, + "date": "2023 April" }, "DeepFloyd IF Large": { "path": "DeepFloyd/IF-I-L-v1.0", "desc": "DeepFloyd-IF is a pixel-based text-to-image triple-cascaded diffusion model, that can generate pictures with new state-of-the-art for photorealism and language understanding. The result is a highly efficient model that outperforms current state-of-the-art models, achieving a zero-shot FID-30K score of 6.66 on the COCO dataset. It is modular and composed of frozen text mode and three pixel cascaded diffusion modules, each designed to generate images of increasing resolution: 64x64, 256x256, and 1024x1024.", "preview": "DeepFloyd--IF-I-L-v1.0.jpg", - "extras": "sampler: Default" + "extras": "sampler: Default", + "size": 15.48, + "date": "2023 April" } } From 1b45c145e9429f1e059335c120037cf04f3f902a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 28 Sep 2025 20:40:24 +0300 Subject: [PATCH 089/230] SDNQ re-enable dynamic compile --- modules/sdnq/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index ecd06a653..783a7ab2f 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -44,7 +44,7 @@ allowed_types = linear_types + conv_types + conv_transpose_types if use_torch_compile: torch._dynamo.config.cache_size_limit = max(8192, torch._dynamo.config.cache_size_limit) torch._dynamo.config.accumulated_recompile_limit = max(8192, torch._dynamo.config.accumulated_recompile_limit) - compile_func = partial(torch.compile, fullgraph=True, dynamic=False) + compile_func = partial(torch.compile, fullgraph=True) else: def compile_func(fn, **kwargs): # pylint: disable=unused-argument return fn From eb025eaf3139d0a296496816f65603db8f391e2f Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 18:01:31 -0400 Subject: [PATCH 090/230] remove split-attention and add attention slicing option Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 +- javascript/guidance.js | 20 +++++ modules/control/run.py | 10 ++- modules/img2img.py | 11 ++- modules/modular_guiders.py | 87 ++++++++++++++++++++++ modules/processing_class.py | 13 +++- modules/processing_diffusers.py | 2 + modules/sd_models.py | 12 +-- modules/shared.py | 2 + modules/shared_items.py | 1 - modules/txt2img.py | 6 ++ modules/ui_control.py | 17 +++-- modules/ui_guidance.py | 125 ++++++++++++++++++++++++++++++++ modules/ui_img2img.py | 27 ++++--- modules/ui_sections.py | 15 ---- modules/ui_txt2img.py | 21 ++++-- scripts/xyz/xyz_grid_classes.py | 2 + scripts/xyz/xyz_grid_shared.py | 7 ++ scripts/xyz_grid_on.py | 1 + 19 files changed, 331 insertions(+), 52 deletions(-) create mode 100644 javascript/guidance.js create mode 100644 modules/modular_guiders.py create mode 100644 modules/ui_guidance.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b10970e6d..474ab69f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,7 +54,9 @@ - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring - update **loopback** script with radon seed option, thanks @rabanti - - **vae** slicing enable for lowvram/medvram, tiling for lowvram, both disabled otherwise + - **vae** slicing enable for lowvram/medvram, tiling for lowvram, both disabled otherwise + - **attention** remove split-attention and add explicitly attention slicing enable/disable option + can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems - **Fixes** - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load diff --git a/javascript/guidance.js b/javascript/guidance.js new file mode 100644 index 000000000..11c2430d3 --- /dev/null +++ b/javascript/guidance.js @@ -0,0 +1,20 @@ +const guiders = { + None: '', + 'LSC: LayerSkipConfig': 'https://github.com/huggingface/diffusers/blob/041501aea92919c9c7f36e189fc9cf7d865ebb96/src/diffusers/hooks/layer_skip.py#L41', + 'CFG: ClassifierFreeGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.ClassifierFreeGuidance', + 'Auto: AutoGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.AutoGuidance', + 'Zero: ClassifierFreeZeroStar': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.ClassifierFreeZeroStarGuidance', + 'PAG: PerturbedAttentionGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.PerturbedAttentionGuidance', + 'APG: AdaptiveProjectedGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.AdaptiveProjectedGuidance', + 'SLG: SkipLayerGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.SkipLayerGuidance', + 'SEG: SmoothedEnergyGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.SmoothedEnergyGuidance', + 'TCFG: TangentialClassifierFreeGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.TangentialClassifierFreeGuidance', + 'FDG: FrequencyDecoupledGuidance': 'https://huggingface.co/docs/diffusers/v0.35.1/en/api/modular_diffusers/guiders#diffusers.FrequencyDecoupledGuidance', +}; + +function getGuidanceDocs(guider) { + if (guider.label) guider = guider.label; + const url = guiders[guider]; + log('getGuidanceDocs', guider, url); + if (url) window.open(url, '_blank'); +} diff --git a/modules/control/run.py b/modules/control/run.py index 586958a49..3f6b0f7be 100644 --- a/modules/control/run.py +++ b/modules/control/run.py @@ -255,6 +255,7 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg prompt: str = '', negative_prompt: str = '', styles: List[str] = [], steps: int = 20, sampler_index: int = None, seed: int = -1, subseed: int = -1, subseed_strength: float = 0, seed_resize_from_h: int = -1, seed_resize_from_w: int = -1, + guidance_name: str = 'Default', guidance_scale: float = 6.0, guidance_rescale: float = 0.0, guidance_start: float = 0.0, guidance_stop: float = 1.0, cfg_scale: float = 6.0, clip_skip: float = 1.0, image_cfg_scale: float = 6.0, diffusers_guidance_rescale: float = 0.7, pag_scale: float = 0.0, pag_adaptive: float = 0.5, cfg_end: float = 1.0, vae_type: str = 'Full', tiling: bool = False, hidiffusion: bool = False, detailer_enabled: bool = True, detailer_prompt: str = '', detailer_negative: str = '', detailer_steps: int = 10, detailer_strength: float = 0.3, detailer_resolution: int = 1024, @@ -306,7 +307,13 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg seed_resize_from_h = seed_resize_from_h, seed_resize_from_w = seed_resize_from_w, denoising_strength = denoising_strength, - # advanced + # modular guidance + guidance_name = guidance_name, + guidance_scale = guidance_scale, + guidance_rescale = guidance_rescale, + guidance_start = guidance_start, + guidance_stop = guidance_stop, + # legacy guidance cfg_scale = cfg_scale, cfg_end = cfg_end, clip_skip = clip_skip, @@ -314,6 +321,7 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg diffusers_guidance_rescale = diffusers_guidance_rescale, pag_scale = pag_scale, pag_adaptive = pag_adaptive, + # advanced vae_type = vae_type, tiling = tiling, hidiffusion = hidiffusion, diff --git a/modules/img2img.py b/modules/img2img.py index 19da4b92f..4809d9fa0 100644 --- a/modules/img2img.py +++ b/modules/img2img.py @@ -161,10 +161,8 @@ def img2img(id_task: str, state: str, mode: int, vae_type, tiling, hidiffusion, detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, n_iter, batch_size, - cfg_scale, image_cfg_scale, - diffusers_guidance_rescale, - pag_scale, pag_adaptive, - cfg_end, + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, + cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, refiner_start, clip_skip, denoising_strength, @@ -255,6 +253,11 @@ def img2img(id_task: str, state: str, mode: int, batch_size=batch_size, n_iter=n_iter, steps=steps, + guidance_name=guidance_name, + guidance_scale=guidance_scale, + guidance_rescale=guidance_rescale, + guidance_start=guidance_start, + guidance_stop=guidance_stop, cfg_scale=cfg_scale, cfg_end=cfg_end, clip_skip=clip_skip, diff --git a/modules/modular_guiders.py b/modules/modular_guiders.py new file mode 100644 index 000000000..ee9c3655c --- /dev/null +++ b/modules/modular_guiders.py @@ -0,0 +1,87 @@ +import diffusers +from modules import shared, errors, processing + + +# ['Default', 'CFG', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG'] +guiders = { + # 'None': { 'cls': None, 'args': {}, }, + 'Default': { 'cls': None, 'args': {}, }, + 'CFG: ClassifierFreeGuidance': { 'cls': diffusers.ClassifierFreeGuidance, 'args': {} }, + 'Auto: AutoGuidance': { 'cls': diffusers.AutoGuidance, 'args': { 'dropout': 1.0, 'auto_guidance_layers': [7, 8, 9], 'auto_guidance_config': None } }, + 'Zero: ClassifierFreeZeroStar': { 'cls': diffusers.ClassifierFreeZeroStarGuidance, 'args': { 'zero_init_steps': 1 } }, + 'PAG: PerturbedAttentionGuidance': { 'cls': diffusers.PerturbedAttentionGuidance, 'args': { 'perturbed_guidance_scale': 2.8, 'perturbed_guidance_start': 0.01, 'perturbed_guidance_stop': 0.2, 'perturbed_guidance_layers': [7, 8, 9], 'perturbed_guidance_config': None } }, + 'APG: AdaptiveProjectedGuidance': { 'cls': diffusers.AdaptiveProjectedGuidance, 'args': { 'adaptive_projected_guidance_momentum': -1, 'adaptive_projected_guidance_rescale': 15.0 } }, + 'SLG: SkipLayerGuidance': { 'cls': diffusers.SkipLayerGuidance, 'args': { 'skip_layer_guidance_scale': 2.8, 'skip_layer_guidance_start': 0.01, 'skip_layer_guidance_stop': 0.2, 'skip_layer_guidance_layers': [7, 8, 9], 'skip_layer_config': None } }, + 'SEG: SmoothedEnergyGuidance': { 'cls': diffusers.SmoothedEnergyGuidance, 'args': { 'seg_guidance_scale': 3.0, 'seg_blur_sigma': 9999999.0, 'seg_blur_threshold_inf': 9999.0, 'seg_guidance_start': 0.0, 'seg_guidance_stop': 1.0, 'seg_guidance_layers': [7, 8, 9], 'seg_guidance_config': None } }, + 'TCFG: TangentialClassifierFreeGuidance': { 'cls': diffusers.TangentialClassifierFreeGuidance, 'args': {} }, + 'FDG: FrequencyDecoupledGuidance': { 'cls': diffusers.FrequencyDecoupledGuidance, 'args': { 'guidance_scales': [10.0, 5.0], 'parallel_weights': 1.0, 'guidance_rescale_space': "data" } }, +} +base_args = { + 'guidance_scale': 6.0, + 'guidance_rescale': 0.0, + 'start': 0.0, + 'stop': 1.0, +} + + +def set_guider(p: processing.StableDiffusionProcessing): + guidance_name = p.guidance_name or 'Default' + if guidance_name not in guiders: + return None + + if guidance_name == 'Default': + if hasattr(shared.sd_model, 'default_guider'): + guider_info = shared.sd_model.default_guider + shared.sd_model.update_components(guider=guider_info) + else: + guider_info = shared.sd_model.get_component_spec("guider") + shared.sd_model.default_guider = guider_info + guider_cls = guider_info.type_hint + if guider_info is not None and guider_cls is not None and guider_info.config is not None: + guider_args = {k: v for k, v in guider_info.config.items() if not k.startswith('_') and v is not None} + else: + guider_args = {} + shared.log.info(f'Guider: name={guidance_name} cls={guider_cls.__name__} args={guider_args}') + return + if guidance_name == 'None': + shared.sd_model.update_components(guider=None) # breaks the pipeline + shared.log.info(f'Guider: name={guidance_name}') + return + + guider_info = guiders[guidance_name] + guider_cls = guider_info['cls'] + guider_args = {} + for k, v in base_args.items(): + if v is not None and v >= 0.0: + guider_args[k] = v + shared.log.warning('Guiders: partially implemented') # TODO: guiders + for k, v in guider_info['args'].items(): + try: + if k is None: + pass + elif k.endswith('_layers') and isinstance(v, str): + guider_args[k] = [int(x.strip()) for x in v.split(',') if x.strip().isdigit()] + elif k.endswith('_config'): + # if lsc_enabled + # guider_args[k] = diffusers.LayerSkipConfig(...) + pass + elif isinstance(v, list) and len(v) > 0: + guider_args[k] = v + elif isinstance(v, int) and (v >= 0): + guider_args[k] = int(v) + elif isinstance(v, float) and (v >= 0.0): + guider_args[k] = float(v) + elif isinstance(v, str) and (len(v) > 0): + guider_args[k] = v + except Exception as e: + shared.log.error(f'Guiders: arg={k} value={v} error={e}') + errors.display(e, 'Guiders') + # guider_args.update(guider_info['args']) + if guider_cls is not None: + try: + guider_instance = guider_cls(**guider_args) + shared.log.info(f'Guider: name={guidance_name} cls={guider_cls.__name__} args={guider_args}') + shared.sd_model.update_components(guider=guider_instance) + except Exception as e: + shared.log.error(f'Guider: name={guidance_name} cls={guider_cls.__name__} args={guider_args} {e}') + return diff --git a/modules/processing_class.py b/modules/processing_class.py index d0d634cfa..ddad4686e 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -36,7 +36,13 @@ class StableDiffusionProcessing: sampler_name: str = None, hr_sampler_name: str = None, eta: float = None, - # guidance + # modular guidance + guidance_name: str = 'Default', + guidance_scale: float = 6.0, + guidance_rescale: float = 0.0, + guidance_start: float = 0.0, + guidance_stop: float = 1.0, + # legacy guidance cfg_scale: float = 6.0, cfg_end: float = 1, diffusers_guidance_rescale: float = 0.0, @@ -247,6 +253,11 @@ class StableDiffusionProcessing: self.do_not_save_grid = do_not_save_grid self.override_settings_restore_afterwards = override_settings_restore_afterwards self.eta = eta + self.guidance_name = guidance_name + self.guidance_scale = guidance_scale + self.guidance_rescale = guidance_rescale + self.guidance_start = guidance_start + self.guidance_stop = guidance_stop self.cfg_scale = cfg_scale self.cfg_end = cfg_end self.diffusers_guidance_rescale = diffusers_guidance_rescale diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 6453516c0..277b5e1c5 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -102,6 +102,8 @@ def process_pre(p: processing.StableDiffusionProcessing): modular_pipe = modular.convert_to_modular(shared.sd_model) if modular_pipe is not None: shared.sd_model = modular_pipe + from modules import modular_guiders + modular_guiders.set_guider(p) timer.process.record('pre') diff --git a/modules/sd_models.py b/modules/sd_models.py index 9b9ec7d68..e759ac56f 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -1070,17 +1070,19 @@ def set_diffusers_attention(pipe, quiet:bool=False): pipe.enable_xformers_memory_efficient_attention() else: shared.log.warning(f"Attention: xFormers is not compatible with {pipe.__class__.__name__}") - elif shared.opts.cross_attention_optimization == "Split attention": - if hasattr(pipe, "enable_attention_slicing"): - pipe.enable_attention_slicing() - else: - shared.log.warning(f"Attention: Split attention is not compatible with {pipe.__class__.__name__}") elif shared.opts.cross_attention_optimization == "Batch matrix-matrix": set_attn(pipe, p.AttnProcessor(), name="Batch matrix-matrix") elif shared.opts.cross_attention_optimization == "Dynamic Attention BMM": from modules.sd_hijack_dynamic_atten import DynamicAttnProcessorBMM set_attn(pipe, DynamicAttnProcessorBMM(), name="Dynamic Attention BMM") + if shared.opts.attention_slicing != "Default" and hasattr(pipe, "enable_attention_slicing") and hasattr(pipe, "disable_attention_slicing"): + if shared.opts.attention_slicing: + pipe.enable_attention_slicing() + else: + pipe.disable_attention_slicing() + shared.log.debug(f"Attention: slicing={shared.opts.attention_slicing}") + pipe.current_attn_name = shared.opts.cross_attention_optimization diff --git a/modules/shared.py b/modules/shared.py index a9600ce71..8dcf8f26d 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -290,6 +290,8 @@ options_templates.update(options_section(('cuda', "Compute Settings"), { "cross_attention_sep": OptionInfo("

    Cross Attention

    ", "", gr.HTML), "cross_attention_optimization": OptionInfo(startup_cross_attention, "Attention optimization method", gr.Radio, lambda: {"choices": shared_items.list_crossattention()}), + "attention_": OptionInfo("

    Cross Attention

    ", "", gr.HTML), + "attention_slicing": OptionInfo('Default', "Attention slicing", gr.CheckboxGroup, {"choices": ['Default', 'Enabled', 'Disabled']}), "sdp_options": OptionInfo(startup_sdp_options, "SDP options", gr.CheckboxGroup, {"choices": startup_sdp_choices}), "xformers_options": OptionInfo(['Flash attention'], "xFormers options", gr.CheckboxGroup, {"choices": ['Flash attention'] }), "dynamic_attention_slice_rate": OptionInfo(0.5, "Dynamic Attention slicing rate in GB", gr.Slider, {"minimum": 0.01, "maximum": max(gpu_memory,4), "step": 0.01}), diff --git a/modules/shared_items.py b/modules/shared_items.py index 8eac5e070..f4d98e955 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -120,7 +120,6 @@ def list_crossattention(): "Scaled-Dot-Product", "xFormers", "Batch matrix-matrix", - "Split attention", "Dynamic Attention BMM" ] diff --git a/modules/txt2img.py b/modules/txt2img.py index 3397d4fe9..08d4f1bf2 100644 --- a/modules/txt2img.py +++ b/modules/txt2img.py @@ -14,6 +14,7 @@ def txt2img(id_task, state, vae_type, tiling, hidiffusion, detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, n_iter, batch_size, + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, clip_skip, seed, subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w, @@ -55,6 +56,11 @@ def txt2img(id_task, state, batch_size=batch_size, n_iter=n_iter, steps=steps, + guidance_name=guidance_name, + guidance_scale=guidance_scale, + guidance_rescale=guidance_rescale, + guidance_start=guidance_start, + guidance_stop=guidance_stop, cfg_scale=cfg_scale, image_cfg_scale=image_cfg_scale, diffusers_guidance_rescale=diffusers_guidance_rescale, diff --git a/modules/ui_control.py b/modules/ui_control.py index a1c77848d..3f43701af 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -2,7 +2,8 @@ import os import time import gradio as gr from modules.control import unit -from modules import errors, shared, progress, ui_common, ui_sections, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports +from modules import errors, shared, progress, generation_parameters_copypaste, call_queue, scripts_manager, masking, images, processing_vae, timer # pylint: disable=ungrouped-imports +from modules import ui_common, ui_sections, ui_guidance from modules import ui_control_helpers as helpers @@ -156,7 +157,7 @@ def create_ui(_blocks: gr.Blocks=None): mask_controls = masking.create_segment_ui() - cfg_scale, image_cfg_scale, guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('control') + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_guidance.create_guidance_inputs('control') vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('control') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('control') @@ -274,7 +275,8 @@ def create_ui(_blocks: gr.Blocks=None): prompt, negative, styles, steps, sampler_index, seed, subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w, - cfg_scale, clip_skip, image_cfg_scale, guidance_rescale, pag_scale, pag_adaptive, cfg_end, vae_type, tiling, hidiffusion, + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, + cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, vae_type, tiling, hidiffusion, detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio, resize_mode_before, resize_name_before, resize_context_before, width_before, height_before, scale_by_before, selected_scale_tab_before, @@ -354,14 +356,19 @@ def create_ui(_blocks: gr.Blocks=None): (mask_controls[4], "Mask erode"), (mask_controls[5], "Mask dilate"), (mask_controls[6], "Mask auto"), + # guidance + (guidance_name, "Guidance"), + (guidance_scale, "Guidance scale"), + (guidance_rescale, "Guidance rescale"), + (guidance_start, "Guidance start"), + (guidance_stop, "Guidance stop"), # advanced - (cfg_scale, "Guidance scale"), (cfg_scale, "CFG scale"), (cfg_end, "CFG end"), (clip_skip, "Clip skip"), (image_cfg_scale, "Image CFG scale"), (image_cfg_scale, "Hires CFG scale"), - (guidance_rescale, "CFG rescale"), + (diffusers_guidance_rescale, "CFG rescale"), (vae_type, "VAE type"), (tiling, "Tiling"), (hidiffusion, "HiDiffusion"), diff --git a/modules/ui_guidance.py b/modules/ui_guidance.py new file mode 100644 index 000000000..3f3b3f8f3 --- /dev/null +++ b/modules/ui_guidance.py @@ -0,0 +1,125 @@ +import gradio as gr +from modules import shared, modular_guiders +from modules import ui_symbols, ui_components + + +def create_guidance_inputs(tab): + with gr.Accordion(open=False, label='Guidance', elem_id=f"{tab}_guidance", elem_classes=["small-accordion"]): + with gr.Group(): + + with gr.Row(elem_id=f"{tab}_guider_row", elem_classes=['flexbox'], visible=shared.opts.model_modular_enable): + guidance_name = gr.Dropdown(choices=list(modular_guiders.guiders.keys()), value='Default', label='Guider', elem_id=f"{tab}_guider") + guidance_btn = ui_components.ToolButton(value=ui_symbols.book, elem_id=f"{tab}_guider_docs") + guidance_btn.click(fn=None, _js='getGuidanceDocs', inputs=[guidance_name], outputs=[]) + with gr.Row(visible=shared.opts.model_modular_enable): + guidance_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_guidance_scale") + guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Guidance rescale', value=0.0, elem_id=f"{tab}_guidance_rescale") + with gr.Row(visible=shared.opts.model_modular_enable): + guidance_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Guidance start', value=0.0, elem_id=f"{tab}_guidance_start") + guidance_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance stop', value=1.0, elem_id=f"{tab}_guidance_stop") + guidance_args = [guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop] + + lsc_group = gr.Accordion(open=False, label='Layer skip guidance', elem_classes=["small-accordion"], visible=shared.opts.model_modular_enable) + with lsc_group: + with gr.Row(): + guidance_lsc_enabled = gr.Checkbox(label='Enable LayerSkipConfig', value=False) + guidance_lsc_label = gr.Label(value='LSC: LayerSkipConfig', elem_id=f"{tab}_lsc_label", visible=False) + guidance_lsc_btn = ui_components.ToolButton(value=ui_symbols.book, elem_id=f"{tab}_lsc_docs", elem_classes=["guidance-docs"]) + guidance_lsc_btn.click(fn=None, _js='getGuidanceDocs', inputs=[guidance_lsc_label], outputs=[]) + with gr.Row(): + guidance_lsc_indices = gr.Textbox(label='LSC layer indices', value='1, 2, 3', placeholder='Comma-separated layer indices to skip') + with gr.Row(): + guidance_lsc_fqn = gr.Textbox(label='LSC fully qualified name', value='transformer_blocks', placeholder='Fully qualified name of the layer stack') + with gr.Row(): + guidance_lsc_skip_attention = gr.Checkbox(label='LSC skip attention blocks', value=True) + guidance_lsc_skip_ff = gr.Checkbox(label='LSC skip feed-forward blocks', value=True) + guidance_lsc_skip_attention_scores = gr.Checkbox(label='LSC skip attention scores', value=False) + with gr.Row(): + guidance_lsc_dropout = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='LSC dropout rate', value=1.0) + lsc_args = [guidance_lsc_enabled, guidance_lsc_indices, guidance_lsc_fqn, guidance_lsc_skip_attention, guidance_lsc_skip_ff, guidance_lsc_skip_attention_scores, guidance_lsc_dropout] + + auto_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with auto_group: + guidance_auto_dropout = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='AutoGuidance dropout', value=0.1) + guidance_auto_layers = gr.Textbox(label='AutoGuidance layers', value='7, 8, 9', placeholder='Comma-separated layer indices, e.g. 7,8,9') + guidance_auto_config = gr.Dropdown(choices=[None, 'config1', 'config2'], value=None, label='AutoGuidance config') + guidance_auto_args = [guidance_auto_dropout, guidance_auto_layers, guidance_auto_config] + + zero_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with zero_group: + guidance_zero_init_steps = gr.Slider(minimum=0, maximum=10, step=1, label='ZeroStar init steps', value=1) + guidance_zero_args = [guidance_zero_init_steps] + + pag_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with pag_group: + guidance_pag_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.05, label='PAG scale', value=2.8) + guidance_pag_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='PAG start', value=0.01) + guidance_pag_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='PAG stop', value=0.2) + guidance_pag_layers = gr.Textbox(label='PAG layers', value='7, 8, 9', placeholder='Comma-separated layer indices, e.g. 7,8,9') + guidance_pag_config = gr.Dropdown(choices=[None, 'config1', 'config2'], value=None, label='PAG config') + guidance_pag_args = [guidance_pag_scale, guidance_pag_start, guidance_pag_stop, guidance_pag_layers, guidance_pag_config] + + apg_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with apg_group: + guidance_apg_momentum = gr.Slider(minimum=-1.0, maximum=1.0, step=0.05, label='APG momentum', value=-1.0) + guidance_apg_rescale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='APG rescale', value=15.0) + guidance_apg_args = [guidance_apg_momentum, guidance_apg_rescale] + + slg_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with slg_group: + guidance_slg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='SLG scale', value=2.8) + guidance_slg_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='SLG start', value=0.01) + guidance_slg_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='SLG stop', value=0.2) + guidance_slg_layers = gr.Textbox(label='SLG layers', value='7, 8, 9', placeholder='Comma-separated layer indices, e.g. 7,8,9') + guidance_slg_config = gr.Dropdown(choices=[None, 'config1', 'config2'], value=None, label='SLG config') + guidance_slg_args = [guidance_slg_scale, guidance_slg_start, guidance_slg_stop, guidance_slg_layers, guidance_slg_config] + + seg_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with seg_group: + guidance_seg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='SEG scale', value=3.0) + guidance_seg_blur_sigma = gr.Number(label='SEG blur sigma', value=9999999.0) + guidance_seg_blur_threshold_inf = gr.Number(label='SEG blur threshold inf', value=9999.0) + guidance_seg_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='SEG start', value=0.0) + guidance_seg_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='SEG stop', value=1.0) + guidance_seg_layers = gr.Textbox(label='SEG layers', value='7, 8, 9', placeholder='Comma-separated layer indices, e.g. 7,8,9') + guidance_seg_config = gr.Dropdown(choices=[None, 'config1', 'config2'], value=None, label='SEG config') + guidance_seg_args = [guidance_seg_scale, guidance_seg_blur_sigma, guidance_seg_blur_threshold_inf, guidance_seg_start, guidance_seg_stop, guidance_seg_layers, guidance_seg_config] + + tcfg_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with tcfg_group: + pass + + fdg_group = gr.Accordion(open=True, label='Advanced guidance params', elem_classes=["small-accordion"], visible=False) + with fdg_group: + guidance_fdg_scales = gr.Textbox(label='FDG scales', value='10.0, 5.0', placeholder='Comma-separated scales, e.g. 10.0,5.0') + guidance_fdg_weights = gr.Textbox(label='FDG weights', value='1.0', placeholder='Single float or comma-separated weights, e.g. 1.0 or 1.0,0.5') + guidance_fdg_rescale_space = gr.Dropdown(choices=['data', 'freq'], value='data', label='FDG rescale space') + guidance_fdg_args = [guidance_fdg_scales, guidance_fdg_weights, guidance_fdg_rescale_space] + + def adv_visibility(guidance_name): + return [ + gr.update(visible=guidance_name.startswith('Auto')), + gr.update(visible=guidance_name.startswith('Zero')), + gr.update(visible=guidance_name.startswith('PAG')), + gr.update(visible=guidance_name.startswith('APG')), + gr.update(visible=guidance_name.startswith('SLG')), + gr.update(visible=guidance_name.startswith('SEG')), + gr.update(visible=guidance_name.startswith('TCFG')), + gr.update(visible=guidance_name.startswith('FDG')), + ] + guidance_name.change(fn=adv_visibility, inputs=[guidance_name], outputs=[auto_group, zero_group, pag_group, apg_group, slg_group, seg_group, tcfg_group, fdg_group]) + + gr.HTML(value='

    Fallback guidance

    ', visible=shared.opts.model_modular_enable, elem_id=f"{tab}_guidance_note") + with gr.Row(elem_id=f"{tab}_cfg_row", elem_classes=['flexbox']): + cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_cfg_scale") + cfg_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance end', value=1.0, elem_id=f"{tab}_cfg_end") + with gr.Row(): + image_cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Refine guidance', value=6.0, elem_id=f"{tab}_image_cfg_scale") + diffusers_guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Rescale guidance', value=0.0, elem_id=f"{tab}_image_cfg_rescale") + with gr.Row(): + diffusers_pag_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.05, label='Attention guidance', value=0.0, elem_id=f"{tab}_pag_scale") + diffusers_pag_adaptive = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Adaptive scaling', value=0.5, elem_id=f"{tab}_pag_adaptive") + + _modular_args = guidance_args + lsc_args + guidance_auto_args + guidance_zero_args + guidance_pag_args + guidance_apg_args + guidance_slg_args + guidance_seg_args + guidance_fdg_args + standard_args = [cfg_scale, image_cfg_scale, diffusers_guidance_rescale, diffusers_pag_scale, diffusers_pag_adaptive, cfg_end] + return guidance_args + standard_args diff --git a/modules/ui_img2img.py b/modules/ui_img2img.py index 7e7db44cb..cf1324484 100644 --- a/modules/ui_img2img.py +++ b/modules/ui_img2img.py @@ -1,11 +1,11 @@ -import os -from PIL import Image import gradio as gr -from modules.call_queue import wrap_gradio_gpu_call, wrap_queued_call -from modules import timer, shared, ui_common, ui_sections, generation_parameters_copypaste, processing_vae +from modules import timer, shared, call_queue, generation_parameters_copypaste, processing_vae +from modules import ui_common, ui_sections, ui_guidance def process_interrogate(mode, ii_input_files, ii_input_dir, ii_output_dir, *ii_singles): + import os + from PIL import Image from modules.interrogate.interrogate import interrogate mode = int(mode) if mode in {0, 1, 3, 4}: @@ -132,7 +132,7 @@ def create_ui(): denoising_strength = gr.Slider(minimum=0.00, maximum=0.99, step=0.01, label='Denoising strength', value=0.30, elem_id="img2img_denoising_strength") refiner_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Denoise start', value=0.0, elem_id="img2img_refiner_start") - cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('img2img') + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_guidance.create_guidance_inputs('img2img') vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('img2img') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('img2img') enable_hr, hr_sampler_index, hr_denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, hr_refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('img2img') @@ -177,8 +177,8 @@ def create_ui(): vae_type, tiling, hidiffusion, detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, batch_count, batch_size, - cfg_scale, image_cfg_scale, - diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, + cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, refiner_start, clip_skip, denoising_strength, @@ -194,7 +194,7 @@ def create_ui(): override_settings, ] img2img_dict = dict( - fn=wrap_gradio_gpu_call(modules.img2img.img2img, extra_outputs=[None, '', ''], name='Image'), + fn=call_queue.wrap_gradio_gpu_call(modules.img2img.img2img, extra_outputs=[None, '', ''], name='Image'), _js="submit_img2img", inputs= img2img_args + img2img_script_inputs, outputs=[ @@ -229,8 +229,8 @@ def create_ui(): ) interrogate_btn.click(fn=lambda *args: process_interrogate(*args), **interrogate_args) - img2img_token_button.click(fn=wrap_queued_call(ui_common.update_token_counter), inputs=[img2img_prompt], outputs=[img2img_token_counter], show_progress = False) - img2img_negative_token_button.click(fn=wrap_queued_call(ui_common.update_token_counter), inputs=[img2img_negative_prompt], outputs=[img2img_negative_token_counter], show_progress = False) + img2img_token_button.click(fn=call_queue.wrap_queued_call(ui_common.update_token_counter), inputs=[img2img_prompt], outputs=[img2img_token_counter], show_progress = False) + img2img_negative_token_button.click(fn=call_queue.wrap_queued_call(ui_common.update_token_counter), inputs=[img2img_negative_prompt], outputs=[img2img_negative_token_counter], show_progress = False) ui_extra_networks.setup_ui(extra_networks_ui_img2img, img2img_gallery) img2img_paste_fields = [ @@ -254,8 +254,13 @@ def create_ui(): (seed, "Seed"), (subseed, "Variation seed"), (subseed_strength, "Variation strength"), + # guidance + (guidance_name, "Guidance"), + (guidance_scale, "Guidance scale"), + (guidance_rescale, "Guidance rescale"), + (guidance_start, "Guidance start"), + (guidance_stop, "Guidance stop"), # advanced - (cfg_scale, "Guidance scale"), (cfg_scale, "CFG scale"), (cfg_end, "CFG end"), (image_cfg_scale, "Image CFG scale"), diff --git a/modules/ui_sections.py b/modules/ui_sections.py index 829c502bd..683681cd5 100644 --- a/modules/ui_sections.py +++ b/modules/ui_sections.py @@ -146,21 +146,6 @@ def create_video_inputs(tab:str, show_always:bool=False): return video_type, video_duration, video_loop, video_pad, video_interpolate -def create_guidance_inputs(tab): - with gr.Accordion(open=False, label="Guidance", elem_id=f"{tab}_guidance", elem_classes=["small-accordion"]): - with gr.Group(): - with gr.Row(elem_id=f"{tab}_cfg_row", elem_classes=['flexbox']): - cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_cfg_scale") - cfg_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance end', value=1.0, elem_id=f"{tab}_cfg_end") - with gr.Row(): - image_cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Refine guidance', value=6.0, elem_id=f"{tab}_image_cfg_scale") - diffusers_guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Rescale guidance', value=0.0, elem_id=f"{tab}_image_cfg_rescale") - with gr.Row(): - diffusers_pag_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.05, label='Attention guidance', value=0.0, elem_id=f"{tab}_pag_scale") - diffusers_pag_adaptive = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Adaptive scaling', value=0.5, elem_id=f"{tab}_pag_adaptive") - return cfg_scale, image_cfg_scale, diffusers_guidance_rescale, diffusers_pag_scale, diffusers_pag_adaptive, cfg_end - - def create_advanced_inputs(tab): with gr.Accordion(open=False, label="Advanced", elem_id=f"{tab}_advanced", elem_classes=["small-accordion"]): with gr.Group(): diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index 0fae0c606..6eccbdd82 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -1,7 +1,6 @@ import gradio as gr -from modules.call_queue import wrap_gradio_gpu_call, wrap_queued_call -from modules import timer, shared, ui_common, ui_sections, generation_parameters_copypaste, processing_vae, images -from modules.ui_components import ToolButton # pylint: disable=unused-import +from modules import timer, shared, call_queue, generation_parameters_copypaste, processing_vae, images +from modules import ui_common, ui_sections, ui_guidance def create_ui(): @@ -33,7 +32,7 @@ def create_ui(): with gr.Accordion(open=False, label="Samplers", elem_classes=["small-accordion"], elem_id="txt2img_sampler_group"): ui_sections.create_sampler_options('txt2img') seed, reuse_seed, subseed, reuse_subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w = ui_sections.create_seed_inputs('txt2img') - cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_guidance_inputs('txt2img') + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_guidance.create_guidance_inputs('txt2img') vae_type, tiling, hidiffusion, clip_skip = ui_sections.create_advanced_inputs('txt2img') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('txt2img') enable_hr, hr_sampler_index, denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('txt2img') @@ -57,6 +56,7 @@ def create_ui(): vae_type, tiling, hidiffusion, detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, batch_count, batch_size, + guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, clip_skip, seed, subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w, @@ -68,7 +68,7 @@ def create_ui(): override_settings, ] txt2img_dict = dict( - fn=wrap_gradio_gpu_call(modules.txt2img.txt2img, extra_outputs=[None, '', ''], name='Text'), + fn=call_queue.wrap_gradio_gpu_call(modules.txt2img.txt2img, extra_outputs=[None, '', ''], name='Text'), _js="submit_txt2img", inputs=txt2img_args + txt2img_script_inputs, outputs=[ @@ -106,8 +106,13 @@ def create_ui(): (seed, "Seed"), (subseed, "Variation seed"), (subseed_strength, "Variation strength"), + # guidance + (guidance_name, "Guidance"), + (guidance_scale, "Guidance scale"), + (guidance_rescale, "Guidance rescale"), + (guidance_start, "Guidance start"), + (guidance_stop, "Guidance stop"), # advanced - (cfg_scale, "Guidance scale"), (cfg_scale, "CFG scale"), (cfg_end, "CFG end"), (clip_skip, "Clip skip"), @@ -156,7 +161,7 @@ def create_ui(): txt2img_bindings = generation_parameters_copypaste.ParamBinding(paste_button=txt2img_paste, tabname="txt2img", source_text_component=txt2img_prompt, source_image_component=None) generation_parameters_copypaste.register_paste_params_button(txt2img_bindings) - txt2img_token_button.click(fn=wrap_queued_call(ui_common.update_token_counter), inputs=[txt2img_prompt], outputs=[txt2img_token_counter], show_progress = False) - txt2img_negative_token_button.click(fn=wrap_queued_call(ui_common.update_token_counter), inputs=[txt2img_negative_prompt], outputs=[txt2img_negative_token_counter], show_progress = False) + txt2img_token_button.click(fn=call_queue.wrap_queued_call(ui_common.update_token_counter), inputs=[txt2img_prompt], outputs=[txt2img_token_counter], show_progress = False) + txt2img_negative_token_button.click(fn=call_queue.wrap_queued_call(ui_common.update_token_counter), inputs=[txt2img_negative_prompt], outputs=[txt2img_negative_token_counter], show_progress = False) ui_extra_networks.setup_ui(extra_networks_ui, txt2img_gallery) diff --git a/scripts/xyz/xyz_grid_classes.py b/scripts/xyz/xyz_grid_classes.py index 306b591f3..0836adbbf 100644 --- a/scripts/xyz/xyz_grid_classes.py +++ b/scripts/xyz/xyz_grid_classes.py @@ -20,6 +20,7 @@ from scripts.xyz.xyz_grid_shared import ( # pylint: disable=no-name-in-module, u apply_lora, apply_lora_strength, apply_te, + apply_guidance, apply_styles, apply_upscaler, apply_context, @@ -223,6 +224,7 @@ axis_options = [ AxisOption("[Sampler] Shift", float, apply_setting("schedulers_shift")), AxisOption("[Sampler] eta delta", float, apply_setting("eta_noise_seed_delta")), AxisOption("[Sampler] eta multiplier", float, apply_setting("scheduler_eta")), + AxisOption("[Guidance] Guidance name", str, apply_guidance, choices=lambda: ['Default', 'CFG', 'Auto', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG']), AxisOption("[Refine] Upscaler", str, apply_field("hr_upscaler"), cost=0.3, choices=lambda: [x.name for x in shared.sd_upscalers]), AxisOption("[Refine] Sampler", str, apply_hr_sampler_name, fmt=format_value_add_label, confirm=confirm_samplers, choices=lambda: [x.name for x in sd_samplers.samplers]), AxisOption("[Refine] Denoising strength", float, apply_field("denoising_strength")), diff --git a/scripts/xyz/xyz_grid_shared.py b/scripts/xyz/xyz_grid_shared.py index 0c95d14de..76d4df769 100644 --- a/scripts/xyz/xyz_grid_shared.py +++ b/scripts/xyz/xyz_grid_shared.py @@ -254,6 +254,13 @@ def apply_te(p, x, xs): shared.log.debug(f'XYZ grid apply text-encoder: "{x}"') +def apply_guidance(p, x, xs): + from modules.modular_guiders import guiders + guiders = list(guiders.keys()) + p.guidance_name = [g for g in guiders if g.lower().startswith(x.lower())][0] + shared.log.debug(f'XYZ grid apply guidance: "{p.guidance_name}"') + + def apply_styles(p: processing.StableDiffusionProcessingTxt2Img, x: str, _): p.styles.extend(x.split(',')) shared.log.debug(f'XYZ grid apply style: "{x}"') diff --git a/scripts/xyz_grid_on.py b/scripts/xyz_grid_on.py index f79be6636..595536067 100644 --- a/scripts/xyz_grid_on.py +++ b/scripts/xyz_grid_on.py @@ -324,6 +324,7 @@ class Script(scripts_manager.Script): def cell(x, y, z, ix, iy, iz): if shared.state.interrupted: + shared.log.warning('XYZ grid: Interrupted') return processing.Processed(p, [], p.seed, ""), 0 p.xyz = True pc = copy(p) From c661497b87df1c0712029e82bed69f49d1dae9e3 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 18:09:09 -0400 Subject: [PATCH 091/230] linting Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 8 ++++++++ modules/modular_guiders.py | 2 +- modules/rocm.py | 12 ++++++------ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 474ab69f6..829902abe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,7 +56,15 @@ - update **loopback** script with radon seed option, thanks @rabanti - **vae** slicing enable for lowvram/medvram, tiling for lowvram, both disabled otherwise - **attention** remove split-attention and add explicitly attention slicing enable/disable option + enable in *settings -> compute settings* can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems +- **Experimental** + - `new` command line flag enables new `pydantic` and `albumentations` packages + - **modular pipelines**: enable in *settings -> model options* + only compatible with some pipelines, invalidates preview generation + - **modular guiders**: automatically used for compatible pipelines when *modular pipelines* is enabled + allows for using many different guidance methods: + *CFG, CFGZero, PAG, APG, SLG, SEG, TCFG, FDG* - **Fixes** - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load diff --git a/modules/modular_guiders.py b/modules/modular_guiders.py index ee9c3655c..556ad52b4 100644 --- a/modules/modular_guiders.py +++ b/modules/modular_guiders.py @@ -27,7 +27,7 @@ base_args = { def set_guider(p: processing.StableDiffusionProcessing): guidance_name = p.guidance_name or 'Default' if guidance_name not in guiders: - return None + return if guidance_name == 'Default': if hasattr(shared.sd_model, 'default_guider'): diff --git a/modules/rocm.py b/modules/rocm.py index 30e90f000..000eb039f 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -107,7 +107,7 @@ class Agent: return "gfx94X-dcgpu" if self.gfx_version == 0x950: return "gfx950-dcgpu" - raise Exception(f"Unsupported GPU architecture: {self.name}") + raise RuntimeError(f"Unsupported GPU architecture: {self.name}") def get_gfx_version(self) -> Union[str, None]: if self.gfx_version >= 0x1100 and self.gfx_version < 0x1200: @@ -190,10 +190,10 @@ def get_version() -> str: return f'{arr[0]}.{arr[1]}' if len(arr) >= 2 else None else: # If rocm-sdk package is installed, the hip library may be used by PyTorch. - version = ctypes.c_int() - environment.hip.hipRuntimeGetVersion(ctypes.byref(version)) - major = version.value // 10000000 - minor = (version.value // 100000) % 100 + ver = ctypes.c_int() + environment.hip.hipRuntimeGetVersion(ctypes.byref(ver)) + major = ver.value // 10000000 + minor = (ver.value // 100000) % 100 #patch = version.value % 100000 return f"{major}.{minor}" @@ -306,7 +306,7 @@ is_installed = False version = None def refresh(): - global environment, blaslt_tensile_libpath, is_installed, version + global environment, blaslt_tensile_libpath, is_installed, version # pylint: disable=global-statement environment = find() if environment is not None: if isinstance(environment, ROCmEnvironment): From 8cc9c23f98b73c74c1b6a49af1a6afa8af9e7914 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 18:44:42 -0400 Subject: [PATCH 092/230] add directml and rocm note to changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 8 ++++++++ html/reference.json | 7 +++++++ installer.py | 3 ++- modules/modular.py | 4 ++++ modules/shared.py | 2 +- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 829902abe..3186996a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ available for *text-to-image* and *text-to-video* and *image-to-video* workflows - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) and [Nunchaku Qwen Image Edit 2509](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit-2509) updated version of Qwen Image Edit with improved image consistency + - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) + updated version of E1 image editing model - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) SRPO is trained by Tencent with specific technique: directly aligning the full diffusion trajectory with fine-grained human preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) @@ -21,6 +23,12 @@ enable in *settings -> pipeline modifers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled +- **Compute** + - **ROCm** for Windows + support for both official torch preview release of `torch-rocm` for windows and **TheRock** unoffical `torch-rocm` builds for windows + note that rocm for windows is still in preview and has limited gpu support, please check rocm docs for details + - **DirectML** warn as end-of-life + `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` - **Extensions** - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) was a high-value built-in extension, but it has not been maintained for 1.5 years diff --git a/html/reference.json b/html/reference.json index c8886af6b..4b5f01c99 100644 --- a/html/reference.json +++ b/html/reference.json @@ -553,6 +553,13 @@ "skip": true, "extras": "sampler: Default" }, + "HiDream-E1.1": { + "path": "HiDream-ai/HiDream-E1-1", + "desc": "HiDream-E1 is an image editing model built on HiDream-I1.", + "preview": "HiDream-ai--HiDream-E1-Full.jpg", + "skip": true, + "extras": "sampler: Default" + }, "Kwai Kolors": { "path": "Kwai-Kolors/Kolors-diffusers", diff --git a/installer.py b/installer.py index 1932a20af..7d111d44c 100644 --- a/installer.py +++ b/installer.py @@ -967,7 +967,8 @@ def check_torch(): if args.use_directml and allow_directml: import torch_directml # pylint: disable=import-error dml_ver = pkg_resources.get_distribution("torch-directml") - log.info(f'Torch backend: DirectML ({dml_ver})') + log.warning(f'Torch backend: DirectML ({dml_ver})') + log.warning('DirectML: end-of-life') for i in range(0, torch_directml.device_count()): log.info(f'Torch detected GPU: {torch_directml.device_name(i)}') except Exception: diff --git a/modules/modular.py b/modules/modular.py index 595b860f7..5f3bfefc2 100644 --- a/modules/modular.py +++ b/modules/modular.py @@ -6,8 +6,12 @@ from modules import shared modular_map= { 'StableDiffusionXLPipeline': 'StableDiffusionXLAutoBlocks', 'StableDiffusionXLImg2ImgPipeline': 'StableDiffusionXLAutoBlocks', + 'StableDiffusionXLInpaintPipeline': 'StableDiffusionXLAutoBlocks', 'FluxPipeline': 'FluxAutoBlocks', + 'FluxImg2ImgPipeline': 'FluxAutoBlocks', + 'FluxInpaintPipeline': 'FluxAutoBlocks', 'WanPipeline': 'WanAutoBlocks', + 'WanImageToVideoPipeline': 'WanAutoBlocks', 'QwenImagePipeline': 'QwenImageAutoBlocks', 'QwenImageEditPipeline': 'QwenImageEditAutoBlocks', } diff --git a/modules/shared.py b/modules/shared.py index 8dcf8f26d..d35dc6fbb 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -291,7 +291,7 @@ options_templates.update(options_section(('cuda', "Compute Settings"), { "cross_attention_sep": OptionInfo("

    Cross Attention

    ", "", gr.HTML), "cross_attention_optimization": OptionInfo(startup_cross_attention, "Attention optimization method", gr.Radio, lambda: {"choices": shared_items.list_crossattention()}), "attention_": OptionInfo("

    Cross Attention

    ", "", gr.HTML), - "attention_slicing": OptionInfo('Default', "Attention slicing", gr.CheckboxGroup, {"choices": ['Default', 'Enabled', 'Disabled']}), + "attention_slicing": OptionInfo('Default', "Attention slicing", gr.Radio, {"choices": ['Default', 'Enabled', 'Disabled']}), "sdp_options": OptionInfo(startup_sdp_options, "SDP options", gr.CheckboxGroup, {"choices": startup_sdp_choices}), "xformers_options": OptionInfo(['Flash attention'], "xFormers options", gr.CheckboxGroup, {"choices": ['Flash attention'] }), "dynamic_attention_slice_rate": OptionInfo(0.5, "Dynamic Attention slicing rate in GB", gr.Slider, {"minimum": 0.01, "maximum": max(gpu_memory,4), "step": 0.01}), From 70a2c209b144ce795dd050d425a4f85ad85ee373 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 20:22:25 -0400 Subject: [PATCH 093/230] cleanup Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ html/reference.json | 3 ++- modules/lora/lora_nunchaku.py | 6 +++--- modules/model_quant.py | 5 ----- pipelines/model_qwen.py | 2 +- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3186996a9..a036f9cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ note that rocm for windows is still in preview and has limited gpu support, please check rocm docs for details - **DirectML** warn as end-of-life `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` + - command line params `--use-zluda` and `--use-rocm` will attempt desired operation or fail if not possible + previously sdnext was performing a fallback to `torch-cpu` which is not desired - **Extensions** - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) was a high-value built-in extension, but it has not been maintained for 1.5 years diff --git a/html/reference.json b/html/reference.json index ee89edb12..cc7a34eab 100644 --- a/html/reference.json +++ b/html/reference.json @@ -666,7 +666,8 @@ "desc": "HiDream-E1 is an image editing model built on HiDream-I1.", "preview": "HiDream-ai--HiDream-E1-Full.jpg", "skip": true, - "extras": "sampler: Default" + "extras": "sampler: Default", + "experimental": true }, "Kwai Kolors": { diff --git a/modules/lora/lora_nunchaku.py b/modules/lora/lora_nunchaku.py index d01238449..de4773158 100644 --- a/modules/lora/lora_nunchaku.py +++ b/modules/lora/lora_nunchaku.py @@ -8,9 +8,6 @@ previously_loaded = [] # we maintain private state here def load_nunchaku(names, strengths): global previously_loaded # pylint: disable=global-statement - if not hasattr(shared.sd_model, 'transformer') or not hasattr(shared.sd_model.transformer, 'update_lora_params'): - shared.log.error(f'Network load: type=LoRA method=nunchaku model={shared.sd_model.__class__.__name__} unsupported') - return False strengths = [s[0] if isinstance(s, list) else s for s in strengths] networks = lora_load.gather_networks(names) networks = [(network, strength) for network, strength in zip(networks, strengths) if network is not None and strength > 0] @@ -18,6 +15,9 @@ def load_nunchaku(names, strengths): is_changed = loras != previously_loaded if not is_changed: return False + if not hasattr(shared.sd_model, 'transformer') or not hasattr(shared.sd_model.transformer, 'update_lora_params'): + shared.log.error(f'Network load: type=LoRA method=nunchaku model={shared.sd_model.__class__.__name__} unsupported') + return False previously_loaded = loras try: diff --git a/modules/model_quant.py b/modules/model_quant.py index 33495b327..19b7ae7a7 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -501,11 +501,6 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access if model.__class__.__name__ == "ChromaTransformer2DModel": modules_to_not_convert.append("distilled_guidance_layer") - if model.__class__.__name__ == "QwenImageTransformer2DModel": - if "minimum_6bit" not in modules_dtype_dict.keys(): - modules_dtype_dict["minimum_6bit"] = ["img_mod", "pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out"] - else: - modules_dtype_dict["minimum_6bit"].extend(["img_mod", "pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out"]) sdnq_modules_to_not_convert = [m.strip() for m in re.split(';|,| ', shared.opts.sdnq_modules_to_not_convert) if len(m.strip()) > 1] if len(sdnq_modules_to_not_convert) > 0: diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index cf18e2143..8927c0fbb 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -46,7 +46,7 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): subfolder=transformer_subfolder, cls_name=diffusers.QwenImageTransformer2DModel, load_config=diffusers_load_config, - modules_dtype_dict={"minimum_6bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "transformer_blocks.0.img_mod.1.weight"]}, + modules_dtype_dict={"minimum_6bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "img_mod", "transformer_blocks.0.img_mod.1.weight"]}, ) repo_te = 'Qwen/Qwen-Image' From 2a7e545c096d2d6776e37b24fc637a9364163c99 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 20:50:14 -0400 Subject: [PATCH 094/230] update qwen layers to min-8bit Signed-off-by: Vladimir Mandic --- pipelines/model_qwen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index 8927c0fbb..f28313603 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -46,7 +46,7 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): subfolder=transformer_subfolder, cls_name=diffusers.QwenImageTransformer2DModel, load_config=diffusers_load_config, - modules_dtype_dict={"minimum_6bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "img_mod", "transformer_blocks.0.img_mod.1.weight"]}, + modules_dtype_dict={"minimum_8bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "img_mod", "transformer_blocks.0.img_mod.1.weight"]}, ) repo_te = 'Qwen/Qwen-Image' From c03a6928e4c128543f55e3c3b74da10dd8ece47e Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 21:19:36 -0400 Subject: [PATCH 095/230] reference models add size and release date info Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + modules/ui_extra_networks.py | 5 +++++ modules/ui_extra_networks_checkpoints.py | 13 +++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a036f9cbb..8a47fb014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ - **api** new endpoint POST `/sdapi/v1/civitai` to trigger civitai models metadata update accepts optional `page` parameter to search specific networks page - **reference models** additional example images, thanks @liutyi + - **reference models** add model size and release date, thanks @alerikaisattera - **video** support for configurable multi-stage models such as WAN-2.2-14B - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 645dab049..7777c73f2 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -828,6 +828,11 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): if is_valid: stat_size, stat_mtime = modelstats.stat(item.filename) + if hasattr(item, 'size') and item.size > 0: + stat_size = item.size + if hasattr(item, 'mtime') and item.mtime is not None: + stat_mtime = item.mtime + print('HERE', item.name, stat_size, stat_mtime) desc = item.description fullinfo = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True) if 'modelVersions' in fullinfo: # sanitize massive objects diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index 427de5f34..ae4c98422 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -2,6 +2,7 @@ import os import html import json import concurrent +from datetime import datetime from modules import shared, ui_extra_networks, sd_models, modelstats, paths @@ -45,8 +46,16 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): continue preview = v.get('preview', v['path']) preview_file = self.find_preview_file(os.path.join(paths.reference_path, preview)) - _size, mtime = modelstats.stat(preview_file) name = os.path.normpath(os.path.join(paths.reference_path, k)).replace('\\', '/') + size = int(float(v.get('size', 0)) * 1024 * 1024 * 1024) + mtime = v.get('date', None) + if mtime is None: + _size, mtime = modelstats.stat(preview_file) + else: + try: + mtime = datetime.strptime(mtime, '%Y %B') # 2025 January + except Exception: + _size, mtime = modelstats.stat(preview_file) yield { "type": 'Model', "name": name, @@ -57,7 +66,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): "onclick": '"' + html.escape(f"selectReference({json.dumps(url)})") + '"', "hash": None, "mtime": mtime, - "size": 0, + "size": size, "info": {}, "metadata": {}, "description": v.get('desc', ''), From 5d1bfc2bfcb63d8e34c96b7d2a5d942e7e242aaf Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 28 Sep 2025 21:36:16 -0400 Subject: [PATCH 096/230] cleanup Signed-off-by: Vladimir Mandic --- modules/ui_extra_networks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 7777c73f2..c60c04c86 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -832,7 +832,6 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): stat_size = item.size if hasattr(item, 'mtime') and item.mtime is not None: stat_mtime = item.mtime - print('HERE', item.name, stat_size, stat_mtime) desc = item.description fullinfo = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True) if 'modelVersions' in fullinfo: # sanitize massive objects From 93bdca0670c15abcf5e0b227ecf7f67f983fd0ea Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Sep 2025 10:56:03 -0400 Subject: [PATCH 097/230] fix image str decode and update requirements Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- extensions-builtin/sdnext-modernui | 2 +- installer.py | 2 +- modules/processing_helpers.py | 38 +++++++++++++++++++++++------- requirements.txt | 6 +---- 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a47fb014..f73e1bf33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-28 +## Update for 2025-09-29 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -83,6 +83,7 @@ - benchmark: remove forced sampler from system info benchmark - xyz-grid: fix xyz grid with random seeds - reference: fix download for sd15/sdxl reference models + - fix checks in init/mask image decode ## Update for 2025-09-15 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index b189fac67..620fc402a 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit b189fac67d24bf21c9b65cf45add5b8c29f7456f +Subproject commit 620fc402ad2de2d7446ae6b2586235ee5d75bb58 diff --git a/installer.py b/installer.py index 7d111d44c..b32a26664 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = '1448b035859dd57bbb565239dcdd79a025a85422' # diffusers commit hash + sha = '64a5187d96f9376c7cf5123db810f2d2da79d7d0' # diffusers commit hash pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index 7906261b9..b58f0594a 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -280,13 +280,38 @@ def validate_sample(tensor): return cast +def decode_images(image): + if isinstance(image, list): + decoded = [] + for i, img in enumerate(image): + if isinstance(img, str): + try: + decoded.append(helpers.decode_base64_to_image(img, quiet=True)) + except Exception as e: + shared.log.error(f'Decode image[{i}]: {e}') + elif isinstance(img, Image.Image): + decoded.append(img) + else: + shared.log.error(f'Decode image[{i}]: {type(img)} unknown type') + return decoded + elif isinstance(image, str): + try: + return helpers.decode_base64_to_image(image, quiet=True) + except Exception as e: + shared.log.error(f'Decode image: {e}') + elif isinstance(image, Image.Image): + return image + else: + shared.log.error(f'Decode image: {type(image)} unknown type') + return None + + def resize_init_images(p): if getattr(p, 'image', None) is not None and getattr(p, 'init_images', None) is None: p.init_images = [p.image] if getattr(p, 'init_images', None) is not None and len(p.init_images) > 0: - if isinstance(p.init_images[0], str): - p.init_images = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_images] + p.init_images = decode_images(p.init_images) vae_scale_factor = sd_vae.get_vae_scale_factor() tgt_width, tgt_height = vae_scale_factor * math.ceil(p.init_images[0].width / vae_scale_factor), vae_scale_factor * math.ceil(p.init_images[0].height / vae_scale_factor) if p.init_images[0].size != (tgt_width, tgt_height): @@ -296,16 +321,13 @@ def resize_init_images(p): p.width = tgt_width sd_hijack_hypertile.hypertile_set(p) if getattr(p, 'mask', None) is not None and p.mask is not None and p.mask.size != (tgt_width, tgt_height): - if isinstance(p.mask[0], str): - p.mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.mask] + p.mask = decode_images(p.mask) p.mask = images.resize_image(1, p.mask, tgt_width, tgt_height, upscaler_name=None) if getattr(p, 'init_mask', None) is not None and p.init_mask is not None and p.init_mask.size != (tgt_width, tgt_height): - if isinstance(p.init_mask[0], str): - p.init_mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_mask] + p.init_mask = decode_images(p.init_mask) p.init_mask = images.resize_image(1, p.init_mask, tgt_width, tgt_height, upscaler_name=None) if getattr(p, 'mask_for_overlay', None) is not None and p.mask_for_overlay is not None and p.mask_for_overlay.size != (tgt_width, tgt_height): - if isinstance(p.mask_for_overlay, str): - p.mask_for_overlay = helpers.decode_base64_to_image(p.mask_for_overlay, quiet=True) + p.mask_for_overlay = decode_images(p.mask_for_overlay) p.mask_for_overlay = images.resize_image(1, p.mask_for_overlay, tgt_width, tgt_height, upscaler_name=None) return tgt_width, tgt_height return p.width, p.height diff --git a/requirements.txt b/requirements.txt index cec622cb1..6ca4153e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,7 +44,7 @@ tqdm==4.67.1 accelerate==1.10.1 opencv-contrib-python-headless==4.11.0.86 einops==0.8.1 -huggingface_hub==0.35.0 +huggingface_hub==0.35.3 numexpr==2.11.0 numpy==2.1.2 pandas==2.3.1 @@ -69,7 +69,3 @@ seam-carving ruff pylint pre-commit - -# block -torch!=2.5.0 -torchvision!=0.20.0 From 206c79520723c13d54ff3b9642cdf69f6bc6b17b Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 29 Sep 2025 18:36:16 +0300 Subject: [PATCH 098/230] add Intel Graphics Software to autodetect --- installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer.py b/installer.py index b32a26664..8e2898a81 100644 --- a/installer.py +++ b/installer.py @@ -904,7 +904,7 @@ def check_torch(): else: is_cuda_available = allow_cuda and (args.use_cuda or shutil.which('nvidia-smi') is not None or args.use_xformers or os.path.exists(os.path.join(os.environ.get('SystemRoot') or r'C:\Windows', 'System32', 'nvidia-smi.exe'))) is_rocm_available = allow_rocm and (args.use_rocm or args.use_zluda or rocm.is_installed) - is_ipex_available = allow_ipex and (args.use_ipex or shutil.which('sycl-ls') is not None or shutil.which('sycl-ls.exe') is not None or os.environ.get('ONEAPI_ROOT') is not None or os.path.exists('/opt/intel/oneapi') or os.path.exists("C:/Program Files (x86)/Intel/oneAPI") or os.path.exists("C:/oneAPI")) + is_ipex_available = allow_ipex and (args.use_ipex or shutil.which('sycl-ls') is not None or shutil.which('sycl-ls.exe') is not None or os.environ.get('ONEAPI_ROOT') is not None or os.path.exists('/opt/intel/oneapi') or os.path.exists("C:/Program Files (x86)/Intel/oneAPI") or os.path.exists("C:/oneAPI") or os.path.exists("C:/Program Files/Intel/Intel Graphics Software")) if is_cuda_available and args.use_cuda: # prioritize cuda torch_command = install_cuda() From 00fa1dc59e40234ea73ca6b5f2b32d42e7033405 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Sep 2025 11:45:58 -0400 Subject: [PATCH 099/230] add online/offline since Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- javascript/monitor.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 620fc402a..d034f611d 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 620fc402ad2de2d7446ae6b2586235ee5d75bb58 +Subproject commit d034f611df9931d87059a8256a2c77cc82f8e11c diff --git a/javascript/monitor.js b/javascript/monitor.js index 1c194af08..276e4bc0e 100644 --- a/javascript/monitor.js +++ b/javascript/monitor.js @@ -2,11 +2,13 @@ async function updateIndicator(online, data, msg) { const el = document.getElementById('logo_nav'); if (!el || !data) return; const status = online ? 'online' : 'offline'; + const date = new Date(); const template = ` Version: ${data.updated}
    Commit: ${data.hash}
    Branch: ${data.branch}
    Status: ${status}
    + Since: ${date.toLocaleString()}
    `; if (online) { el.dataset.hint = template; From 3084c3214fc6c47d3d816af5f0177b1ed83fc7f4 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Sep 2025 16:33:03 -0400 Subject: [PATCH 100/230] disable transformers TOKENIZERS_PARALLELISM Signed-off-by: Vladimir Mandic --- installer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/installer.py b/installer.py index 8e2898a81..cb3153b3e 100644 --- a/installer.py +++ b/installer.py @@ -1348,6 +1348,7 @@ def set_environment(): os.environ.setdefault('UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS', '1') os.environ.setdefault('PYTORCH_ENABLE_XPU_FALLBACK', '1') os.environ.setdefault('PYTORCH_ENABLE_MPS_FALLBACK', '1') + os.environ.setdefault('TOKENIZERS_PARALLELISM', '0') def check_extensions(): From 6b67a9d0c45f76034aeb4736022df885537cef8e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 30 Sep 2025 01:58:13 +0300 Subject: [PATCH 101/230] SDNQ add check_mats to matmul --- modules/rocm.py | 8 ++++---- modules/sdnq/__init__.py | 14 ++++++++------ modules/sdnq/layers/conv/conv_fp8.py | 2 ++ modules/sdnq/layers/conv/conv_fp8_tensorwise.py | 2 ++ modules/sdnq/layers/conv/conv_int8.py | 2 ++ modules/sdnq/layers/linear/forward.py | 15 +++++++++++++++ modules/sdnq/layers/linear/linear_fp8.py | 2 ++ .../sdnq/layers/linear/linear_fp8_tensorwise.py | 2 ++ modules/sdnq/layers/linear/linear_int8.py | 2 ++ 9 files changed, 39 insertions(+), 10 deletions(-) diff --git a/modules/rocm.py b/modules/rocm.py index 000eb039f..1b03bfd32 100644 --- a/modules/rocm.py +++ b/modules/rocm.py @@ -248,8 +248,8 @@ if sys.platform == "win32": import torch import numpy as np - cholesky_ex_gpu = torch.linalg.cholesky_ex - @wraps(cholesky_ex_gpu) + original_cholesky_ex = torch.linalg.cholesky_ex + @wraps(original_cholesky_ex) def cholesky_ex(A: torch.Tensor, upper=False, check_errors=False, out=None) -> torch.return_types.linalg_cholesky_ex: assert not check_errors return_device = A.device @@ -261,8 +261,8 @@ if sys.platform == "win32": return torch.return_types.linalg_cholesky_ex((L, info), {}) torch.linalg.cholesky_ex = cholesky_ex - cholesky_gpu = torch.linalg.cholesky - @wraps(cholesky_gpu) + original_cholesky = torch.linalg.cholesky + @wraps(original_cholesky) def cholesky(A: torch.Tensor, upper=False, out=None) -> torch.Tensor: return_device = A.device L = torch.from_numpy(np.linalg.cholesky(A.to("cpu").numpy(), upper=upper)).to(return_device) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 82689efca..4f35009ec 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -172,12 +172,14 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if use_quantized_matmul and not re_quantize_for_matmul: scale.transpose_(0,1) layer.weight.transpose_(0,1) - if not dtype_dict[weights_dtype]["is_integer"]: - weight_stride = layer.weight.stride() - if not (weight_stride[0] == 1 and weight_stride[1] > 1): - layer.weight.data = layer.weight.t().contiguous().t() - if not use_tensorwise_fp8_matmul: - scale = scale.to(torch.float32) + weight_stride = layer.weight.stride() + if not (weight_stride[0] == 1 and weight_stride[1] > 1): + if devices.backend != "ipex": + layer.weight.data = layer.weight.t_().contiguous().t_() + elif devices.backend == "ipex": + layer.weight.data = layer.weight.t_().contiguous().t_() + if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: + scale = scale.to(torch.float32) layer.sdnq_dequantizer = dequantizer_dict[weights_dtype]( scale=scale, diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index 2d1407a47..7a83bb3a8 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -6,6 +6,7 @@ import torch from ...common import compile_func # noqa: TID252 from ..linear.linear_fp8 import quantize_fp8_matmul_input # noqa: TID252 +from ..linear.forward import check_mats # noqa: TID252 from .forward import get_conv_args, process_conv_input @@ -23,6 +24,7 @@ def conv_fp8_matmul( return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) input, input_scale = quantize_fp8_matmul_input(input) + input, weight = check_mats(input, weight) if groups == 1: if bias is not None and bias.dtype != torch.bfloat16: diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index bc968e519..e3b005622 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -7,6 +7,7 @@ import torch from ...common import compile_func # noqa: TID252 from ...dequantizer import dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from ..linear.linear_fp8_tensorwise import quantize_fp8_matmul_input_tensorwise # noqa: TID252 +from ..linear.forward import check_mats # noqa: TID252 from .forward import get_conv_args, process_conv_input @@ -24,6 +25,7 @@ def conv_fp8_matmul_tensorwise( return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) + input, weight = check_mats(input, weight) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) if groups == 1: diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index 6c59f6d60..260acd170 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -8,6 +8,7 @@ from ...common import compile_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from ..linear.linear_int8 import quantize_int8_matmul_input # noqa: TID252 +from ..linear.forward import check_mats # noqa: TID252 from .forward import get_conv_args, process_conv_input @@ -29,6 +30,7 @@ def conv_int8_matmul( input, scale = quantize_int8_matmul_input(input, scale) if quantized_weight_shape is not None: weight = unpack_int_symetric(weight, quantized_weight_shape, weights_dtype, dtype=torch.int8) + input, weight = check_mats(input, weight) if groups == 1: result = torch._int_mm(input, weight) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index 20224204c..eff9b0428 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -1,7 +1,22 @@ # pylint: disable=relative-beyond-top-level,redefined-builtin,protected-access +from typing import Tuple + import torch +def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + input_stride = input.stride() + if not (input_stride[0] > input_stride[1] and input_stride[1] == 1): + input = input.contiguous() + weight_stride = weight.stride() + if not (weight_stride[0] == 1 and weight_stride[1] > 1): + if weight.device.type != "xpu": + weight = weight.t().contiguous().t() + elif weight.device.type == "xpu": + weight = weight.t().contiguous().t() + return input, weight + + def quantized_linear_forward(self, input: torch.FloatTensor) -> torch.FloatTensor: return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight), self.bias) diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index 63eee40b4..d1845b1e7 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -6,6 +6,7 @@ import torch from ...common import compile_func # noqa: TID252 from ...dequantizer import quantize_fp8 # noqa: TID252 +from .forward import check_mats def quantize_fp8_matmul_input(input: torch.FloatTensor) -> Tuple[torch.Tensor, torch.FloatTensor]: @@ -23,6 +24,7 @@ def fp8_matmul( return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) input, input_scale = quantize_fp8_matmul_input(input) + input, weight = check_mats(input, weight) if bias is not None and bias.dtype != torch.bfloat16: bias = bias.to(dtype=torch.bfloat16) return torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16).view(output_shape).to(return_dtype) diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index 0343087c5..a35eb0721 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -6,6 +6,7 @@ import torch from ...common import compile_func # noqa: TID252 from ...dequantizer import quantize_fp8, dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 +from .forward import check_mats def quantize_fp8_matmul_input_tensorwise(input: torch.FloatTensor, scale: torch.FloatTensor) -> Tuple[torch.Tensor, torch.FloatTensor]: @@ -27,6 +28,7 @@ def fp8_matmul_tensorwise( output_shape = (*input.shape[:-1], weight.shape[-1]) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) + input, weight = check_mats(input, weight) if bias is not None: return dequantize_symmetric_with_bias(torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=scale.dtype), scale, bias, return_dtype, output_shape) else: diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index bcc4d775c..356179b97 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -7,6 +7,7 @@ import torch from ...common import compile_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import quantize_int8, dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 +from .forward import check_mats def quantize_int8_matmul_input(input: torch.FloatTensor, scale: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: @@ -31,6 +32,7 @@ def int8_matmul( return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) input, scale = quantize_int8_matmul_input(input, scale) + input, weight = check_mats(input, weight) if bias is not None: return dequantize_symmetric_with_bias(torch._int_mm(input, weight), scale, bias, return_dtype, output_shape) else: From 2621aecaccd92fa93b4b65a6be2a8e982e37235f Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Sep 2025 19:25:47 -0400 Subject: [PATCH 102/230] interrrupt will now show last known preview image Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/processing.py | 11 +++++++++-- modules/shared.py | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f73e1bf33..cee8bcb0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,8 @@ - networks ability to filter lora by base model version - **Other** - server will note when restart is recommended due to package updates + - **interrrupt** will now show last known preview image + *keep incomplete* setting is now *save interrupted* - **logging** enable `debug`, `docs` and `api-docs` by default - **ipex** simplify internal implementation - refactor to use new libraries diff --git a/modules/processing.py b/modules/processing.py index e01f88bdc..d42929b23 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -427,13 +427,20 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed: for script_image, script_infotext in zip(results.images, results.infotexts): output_images.append(script_image) infotexts.append(script_infotext) + if samples is None: from modules.processing_diffusers import process_diffusers samples = process_diffusers(p) timer.process.record('process') - if not shared.opts.keep_incomplete and shared.state.interrupted: - samples = [] + if shared.state.interrupted: + shared.log.debug(f'Process: batch={n+1}/{p.n_iter} interrupted') + p.do_not_save_samples = not shared.opts.keep_incomplete + if shared.state.current_image is not None and isinstance(shared.state.current_image, Image.Image): + samples = [shared.state.current_image] + infotexts = [create_infotext(p, p.all_prompts, p.all_seeds, p.all_subseeds, index=0)] + else: + samples = [] if p.scripts is not None and isinstance(p.scripts, scripts_manager.ScriptRunner): p.scripts.postprocess_batch(p, samples, batch_number=n) diff --git a/modules/shared.py b/modules/shared.py index d35dc6fbb..fab234f94 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -471,7 +471,7 @@ options_templates.update(options_section(('system-paths', "System Paths"), { options_templates.update(options_section(('saving-images', "Image Options"), { "samples_save": OptionInfo(True, "Save all generated images"), - "keep_incomplete": OptionInfo(True, "Keep incomplete images"), + "keep_incomplete": OptionInfo(True, "Save interrupted images"), "samples_format": OptionInfo('jpg', 'File format', gr.Dropdown, {"choices": ["jpg", "png", "webp", "tiff", "jp2", "jxl"]}), "jpeg_quality": OptionInfo(90, "Image quality", gr.Slider, {"minimum": 1, "maximum": 100, "step": 1}), "img_max_size_mp": OptionInfo(1000, "Maximum image size (MP)", gr.Slider, {"minimum": 100, "maximum": 2000, "step": 1}), From 0c1d34721c94841a5006c225a5a1d408af86b6be Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 30 Sep 2025 02:37:58 +0300 Subject: [PATCH 103/230] SDNQ use contiguous for intel --- modules/sdnq/__init__.py | 2 +- modules/sdnq/layers/linear/forward.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 4f35009ec..1a3686ccf 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -177,7 +177,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if devices.backend != "ipex": layer.weight.data = layer.weight.t_().contiguous().t_() elif devices.backend == "ipex": - layer.weight.data = layer.weight.t_().contiguous().t_() + layer.weight.data = layer.weight.contiguous() if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: scale = scale.to(torch.float32) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index eff9b0428..d404966c8 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -14,7 +14,7 @@ def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, if weight.device.type != "xpu": weight = weight.t().contiguous().t() elif weight.device.type == "xpu": - weight = weight.t().contiguous().t() + weight = weight.contiguous() return input, weight From 24c44af42fc265c7dea250ffdd4cbae10f6dfe25 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Tue, 30 Sep 2025 15:27:49 +0300 Subject: [PATCH 104/230] embed prompts to Tempest model, similar prompt for base and hyper --- html/reference.json | 4 ++-- models/Reference/tempest-by-vlad-base.jpg | Bin 34916 -> 0 bytes models/Reference/tempest-by-vlad-hyper.jpg | Bin 26074 -> 0 bytes models/Reference/tempestByVlad_baseV01.jpg | Bin 0 -> 76310 bytes models/Reference/tempestByVlad_hyperV01.jpg | Bin 0 -> 84660 bytes 5 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 models/Reference/tempest-by-vlad-base.jpg delete mode 100644 models/Reference/tempest-by-vlad-hyper.jpg create mode 100644 models/Reference/tempestByVlad_baseV01.jpg create mode 100644 models/Reference/tempestByVlad_hyperV01.jpg diff --git a/html/reference.json b/html/reference.json index cc7a34eab..8c5901381 100644 --- a/html/reference.json +++ b/html/reference.json @@ -1,13 +1,13 @@ { "Tempest-by-Vlad XL": { "path": "tempestByVlad_baseV01.safetensors@https://civitai.com/api/download/models/1301775", - "preview": "tempest-by-vlad-base.jpg", + "preview": "tempestByVlad_baseV01.jpg", "desc": "Flexible SDXL model with custom encoder and finetuned for larger landscape resolutions with high details and high contrast.", "extras": "" }, "Tempest-by-Vlad XL Hyper": { "path": "tempestByVlad_hyperV01.safetensors@https://civitai.com/api/download/models/1343512", - "preview": "tempest-by-vlad-hyper.jpg", + "preview": "tempestByVlad_hyperV01.jpg", "desc": "Custom distilled variant with goal to get as-normal-as-possible model that works with low steps and guidance-free", "extras": "" }, diff --git a/models/Reference/tempest-by-vlad-base.jpg b/models/Reference/tempest-by-vlad-base.jpg deleted file mode 100644 index 0d48f0a6219b4b6694c66c1ebb616bba47f6ac5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34916 zcmbTdWmH_jv*T~B>gw*ltABR@WZLRl>HrK30086P1^BxGPyvuV zAtE6nBqJdvc}h-3LCr-=O+`g5#LCXVB`qQ+D zPXMNW|A~X~zXb5#f`N&Jjf0DaPeAzOUxPL>044?&7A7_p4h}ZH*l~I8T{{ zlyE7G?D1IqD21ak%J5m0n+Jf#^IzFS9Q>mR2&tY?)6lYWaB^{jM8(7#*51+C)jc@$X?SFGYQJshm;PJV3xI zV*C~8;6G1D#U}cN{o8-g{ukN*Kd|WkE3*F=?0>k{0Yq3B|CEPC4p0Cb2*4%U)n9zz zW-fqi)(6#vx2(#6UQQqePQdAvpOT}0BD|lw3HI;P5@|0G_nlgmKbl$lb4wtMw8|bt z2j#S>SXo0@x{+Xfm)@w1;P@}~8BJIh&A&Z*9|gNmCckvX#FDoP=Jmp>`H_`$xRzP@ z8}HkkVws@NzuQ}_kGun~oL}!01vMHqYDvwqR=GbxIg3}Y-0;sSp1XGp-9ZQIMn#G; z1Hjv6@D(>E!5WtW+3{*v#`h|y=7UL!Wfc9Jmy70!#L^14+3|^P7$ccQ=yibh_T0eB z{165n!tVFPs*P`VTWfzWhB1-j96ZV0|% z%~~aUlOI>Y%jn}CR!TRDtjq2i?-ac)%nSmZnW74Fi1LKgeWx&LCU!;Hip)#T@_hKK zIL1ll`v>Z@4~bW=DoUhYpJ5rVl%7C}a`mEzqvWPTsPedFm2#rSDwm>!hbfJW4UN<& ziMYyPij+n=il541T!8;75Jh%Mlp&^(jv9c{=wHc38DgkWn*4X||8B(vsFXEcve8kn zE5(j!x|Yw*pV1jM7ux(>Hxh!sg8jJs1kfcWMSo-1vJbC?Ygs8*MqW;mPT?D$OM^H505ZvKHr-fXiQaUo8?r_7 zL+?)>`CkCEk9KZ%GaPmk9DCtSo**OP>oMn5MO;%6Gs8n${r$5_?l-CX#M!Wcgt(pM z*@PD_9j`37JfPv!X66}w3c(sx(3AAa7NFd)6Nil-1a2_y`wouqDigg!N1qDeEY^5_ zGooEW?|=(mo^98)Wl<+5uE+A>aLM#gnj~^_P-o^#58Q+=VBZj2;%8OLElwm*v^r`4#iMbb}hr%|3{s<|Iz+`>-j%-V-rRv{pzSpBSYk%gfBNF5DSUnqNAop zKk-`{os9*if^k(p{~uG~0yGrAz8Y_J%e&GP`U!3eSRcD_c9DA)WjO;Dt73GguWuAF z+l+#D1qbi*xqQ%fAA!)$(56%5)p8!x1ydi^kNHEp8V&dg;PSV+eIWAXYTKL^skP_+ zJoSsrR!CWSVZ}!E?vI4CNvzi74dD*S6P>abIy`j3S{wbMXXRB@MyJrU z_|nN`E3uMqVjp`GWwoGl+_PavWi(=|FKZL+*}}}3Fow(q9;<_%^+H}`FV#}#j!ClA zwaL>EO4gH&c@u2TOTg7ThM; z^LB#=>r7iAlz?H_0zF4?EwkjNPXP1_Q5ON{B<#u|rk4vBAmKsPn(GUTU+q1YgY>Ys ztvxZS*aO}5*0Ky9m)1#HD%&SU<1WmQ`;7j%#|C2cqKX^`$52~1t;RNb>NUFpWI32) z^lJkGmrbmxzF6UF6@QeTx06Y%=)!W1kR54mp#hVBfo6N6gCz9yl|bO-^pmH`-y4nO zzcwZfp5yGrELU3*dj_G6)Exe+msgcX;ZPbW;!qkJV$N%+YajuXsKHZdc;Y4C5jA1} zchs&o>s^-9=Z?CQU;t%@rys0lS{5?q7@Ks}=IVAr-ZtNmR>@#`7Nw=rvPxl_R2+g} ztdCR1Zk>I2^*P?supZ(uR^oxW0R9F1>bP3yNZo>Z)AR3D4d{ZbGKAV z$)nDrDZ-a@dpFg=nwGO1&R|tmRmTPavHDTxO>RqsnXE-8mt=RPTf)L<2bU}ivYf3djT8+aP0=dU!S~)JrD6%XwyOVd3)?<}LO9c2eOd{^Wy(#d> z8xwgD#}4@T$a8vB3=~+YNaJT-ShT+0i}{1=E5L0nyj!&Tf;GS} z&1pvIY})BWpaVP&g~nc22C_7tE9n^p7=L)WaW~&r|L2+tZ=s8N{X>~aVaD~P42~7H zT}%u_T5WdieNLLna-FT#;UU|;GMKeq*8ghkycQSn7x|L>uI!3#Eg8(iZt^ zZc?3k_<+&Nk|aYbQPvW0HK|J{zZ)sZlPndmQe|bKIA7!VwpN{lId7w;EN%3*&K*-)nRT)Q_r!6sJ8M8a~nBHbQvV>N&OJ1SOKc*HdVBVt^o?mAh>&Qyq++9-o0k z_0*YCdC{a|g}_M;5wMr@quO8vJ*KY%kTzn$JjrY6UT3LW)pjmwXu%C@@M>$ zlUTQgpTl94e2Yj@&(b?Jy)bH%ku`xdOtpGH;lgYKQ|Y{-on3quu(#deE!Z4&q3u&< zy4NGrcs~s0tg>}`TdOGxt6<4?AjNH@qh5k+diL%t{GhCj8mMF}$x&BElTJm~h!GrW z<0i_O6;f?TEZ3X1A5rjeHtltb9Zp7SK;FKp9js};uLMD*;@JEwD-d^FCDkw)xbAWd zjdaAsv#SN=mn_A}g73=R@&%pbOOI~<1kpyE>J76I$(ST;aDSIgt9ovguqg(j7nG07 z_;ZU1XTJ;rn-l&RlJhg_p~xuV0nIq%)9j*DylLLiQphe3Cm)mn;G=R-4@+%%jNL43 zXvR%Adcxe>0Fo-J!>9p)Y48jns87hWUslGM&}DzGgz428Ak~tmyYrJAzQhD9R5`HQ zl8UK059L(LCa2`=M)I+LU@C#mQ(I%0z3U>uy(G3`5auSxnWuZBZRyDGXFSfC+cgZ< z>6=Y9dGZ8wp5|8fD6Xz&{Yr3Ji9>sjk{C#HT?SPg0Lax5;4Z@a5%%M|8D(KY^cg>< zg`9*Kd(Dg=$Xu9Dln(cR3Qotwjd+-EWLw6C)V{Kx7sGvK;4`v@F6NgJ@j}ulj<>cUZ{`B=#owzT1fHF&uM%xQ)Pj80US^2|T2Y+OZnPcz=h znt~$Racs~|T-aJ>X1Stw)pJ?l8QKFYct{hFSr_t2CB90O(YaP0E7D3`YZXa7X|k_w z8*W(Vkab9JdZXKrPf2`f&cHo(KrLKE=Fc4+qv_7jUR=kwT+m{am25_Al)OwfRS7#cb6?$_8Chj%bAePG8mxu^GMD>-2|?s#E`I@MuSLflk-&o> zO>}D*27C)Pc&?E}%{aAVf(#;-U#GNk+s1f)4>9HW_)X3Yew$wc&E|Inwa>vU<;Ntf zPZp(9k@RIBtF)XEZYz52qCr`YshSGE!x~qJ3?P$ePw<{_Kc=qKUdreL?MD~o+L=L_ zB-1Zgq$4@8y`%E>CRfvbkl?1!xNq&UX9+Puhnv9MFagIW9E0d z@6SnyRr{;4xWSBVg}BWatX`kq+$}+e-q24_DK>s+<0mFI{cvDu<>5^kXR|t1Z!WI1 zGTq@dA^qOZ)DM#b12przz+TNU9xn&K<9*C*MxD z==C^2U!&prxf>Ip$PJ5X7T5@ichA7m!^#UKsG?(bqUX~@K zy88KG+4wZeJPMSG^nc#wW6b>{PX?))>NjkE_UuI5NZ+mL(osaDRRU2B%NDdaB?~Zf z5b%2(qXv?^hQ8JavwHb!t)BrD;`}1VdU^38N^uIL^PQM+z+?oQEUn5It~YD7J~7I^ z5yJ9jYyI4|I(Mq70lWD=MTz&VQ%Q8IYgcgAYH;m`>N*Lv`tcBYDlsdH7k7dchSE=I`XP9+hvPs4^oUvVg*c+SMcFtp0cd) zCo29{Ox&V%lDKVc__-ecLcsACT`<&T@;WN1Nq!j&40e~`2v~2eP~g+)y~oW-(wzb; zc)BpQA)TLXNMNDCX6-}`21uxTW~juwU}#Nq_G=ztcRQE2)dW12XN)V%am0bAIaCi5URkZ5;+d&aaq*=0 z#Egcc5kCe?euVqj6A3I)Pgsv<@wP&CR!nl>?4J3B=urV{?zdMxX7{-wcUAH=>-8t| z4FPmL`L>!42e9PGaMyKIBR}NJWbT-p(1|&A!K~TDLuzm5qjq+NQW`ZuDxhIM1G%Ys zuB$gFBpdU4@i)jtjCdef@$gmX%ft5OoX1=d(@QZOHv){_k?;C%AfMouyE~qtRul9X zi>#l~Xze!HE!cr($q$RGnx`njc}_I@dTM;*Y135QAzkhGx~U}5>(bw0Cj-&H zEibNHYA03qh~z6CR@i+wmdCK<+j?qd=^Lo*2#)DGA7~3qPOXIqdPH?iW1^R?CtG>#S#CTMQ$ns4enh0NwlVw(yOds6nHm^!K&cY-M&Lqbm`> znJnM49O+2Efx7l|2wia|2C9VEHJpLi`tTB$ZJfF+41AS;Kva8cb5n@{os-xz{X z9A8)pXl&34T@dk}dhZ>o0O_J*lF~dgwUbO=>P)*DmT2Y)c-0lCY`{{LdvqtmeloY@ ztk6SglQKtIMaE!;oD}~$%ImC8TIH}c$Wo9Ucwu6>DeLMk8;q!l+-yHM1KVv)O&NhX z+cL>>=}oZ>SuCg{77gs1V2zSe2#DTf%yRVmGC$lM{OXpAFt5Tl#0G-3Yw#<&92;Nv zHl6_8Vap_XDM*_am2YJv!2sJ1h3?|+Gjm2$|3S9%hMfSD&rfu?3Z7mZ_Sp*7$~K=$ z9eo25OUY2dqkA^j`h?a7dF{Mb55c!S+7t12#?c-O4NFOI`YTozfjMdv);X@{{+x=W-K8NtPx-x&g7Hr$uirOa zdXTB0>!fEOVh3duKxmVmn^2yn~f|r z3DY(fa){5adsSx1494(%+8!@%W2xG8`rtB3M5UM!gLmR9Mgb0kD>8+_f^Y!LWn;1S z0nCuH>8pLhR`>SfWLD~6H_bkU5=Doha%tJ#{mu%XnrmQKHYlJGY&^^^8BIb81?i2< z!yrPMj&4=M>;QICw6`jmgzRqPQ^0tmqfP!e$C5X9SpkKJfsB;YVHAzythPTl7NIb7 zN<2%G01L*Sq?HcBk%Q{{T}Qh!XltRaJu2qEEBR69x&p!oXH1$KxGOj)*aWEvX8T-b zR-Oq{Wke!hkO^-X?5lA3*jtjbjb`Z_Z2uvLvid9+(!jr<}beMAvXYCEraZf?W63Y0xj5$nEf+VNd&zZgBYS;6& zBF`4g%RZZ5LtF|u|GGGMaKL48@MinA(Z@1My($71(-_kq%uS{h_*OBH&zV=`no;g$g97Qmq3tY|6pM#Dr7PMFc3PHYkf-j>mL7Vo z_);#>c8R|Z*1U0Uy)~s1`=~Y&knxn)@hmy({x1L&t!YNtN=E6gRVV(C^?Yk3fJ*94 zjHC>~zBr0qSP_4vX`UH@<95nUR}#{MFmCH6H>k~ZXwQhoquZ!b<@aeFLdX{?JfPEf z-N;x4SlQlxeKaZAVp}hlis?``y*aVC89xn!rf|7?WDeB{dUbF;YyYx<%KQS{bCLBP zJ+l7dLNq@iA^dR1n8Qo5Mrg$>e_;xhE10z+CWUd@<%tjd{0q=-$%3@}{&sK9d6XmP zzIzcLwzAIX*_2ix9g(4RXY)q7qE55j5Rd4|M?wXpDIwO= zt}h$=6YV`S&Q5tqocTy!tZ7qa96x?4b7o*O{9Ft)(C)OnSkw5`>VP+Qtx#-JX_%dj zdWvVFNVYk_oX{-UV8v%X)f2>b9izX(ACd+VKWwTRP8hNH%Olqu|zMGuu2U{(;& zN??7fTL}qQ|0KIOPhitW;M$|vg2!i>IpOjOo}8(#C%+{zfuj;4ZghZNXt!x5d=-!H zZfXYr@#GFV6kuV!db=DL&ky}384s_{K&50XWbsQsJ6|C;Im&XN&>=ieCXC*>@s=RohyK=()Ojrz83)WxgjKIssk!?Fz`(ib{BrG4Xq zb=_fP2EmP1Y$3v0fIC3$V&&-cPjiG8H9;tvuxVDeL0cv|wdYZEr5B;U7hMWanz~s|_)ZOO(4M z)b&oLtBb{#lm5yMuYxa3juC~A>6=vQf0WBfoR#!j^R1xVtPzWmpY`MKkG|G0&9uh zU`GJKqE)8a3X74pf( z`EGqb zckpf<)%R2Pd#=tIt;%w@qpHM^gZ9IsZ=>zygk~X(ZA6(l*llJFE*lxHQ>j9!w{&Vp z?FQONFFFH`!xIP*K87(I9sf?nomxuF`A6N3F9_%N`az0WcQ3%pWLjobONzLsYa_?D ztwf8HBhF!zBR!~Lqidde4ad4kU&l-Z0(Ng_Rwj^p0yI8o={L)jq^Yy~EF>2zu1qK6 zOJ%Ti!>I%e^;?x8B+3qu2iE{Zp{v^;h6qr-KSfe8L6g#&Oly*GGA&0;H}1uv?%SVr9NKVZh0fG#A<^1d zPWc=cyKvvEsdO<5OcX21U7+5lcCM>l1dAYP)HYA_3X|T5vu_F&5!ShO_ef(PR6is zk^n86bjW6ct8IPE1bhR{w{ShDMZ2H+vcW3JNQk}D$H?U5;cf1l?tnh&2ySh0dY4Kq zSO0k??!N$tPRI2=2`O&rORzti>UxBlyd=@ri|hzumiK=1R=>;nCIT)jL%=&)ssB3K znZ%PG&>L;9LEf~^J0-E7uJ~MF~z^C^of!jI4pd zb|P*5{&HO>SFrvPmf@tofCk5`)T9d=YQ0m8F_3?QB+vJTjV=CzN$HPpQnn*_Uhpu! zGJKv!yuP3~-oEX14Q$gA8;bkV2v*_f)i%)y^1J>W;l7f@!a<6+vYZ5*>3;e`ksr%? zXfoAV>GSWh-*2R6HJrRAe4%cxnG#^*iT-c1qGt)Yii^r+;k}L>oj-nDn4&~7jXB!U zv|?-N6jEGgU8G+&zSb*Wic9I}$bH_vVPeYlcpACHU&MAfr;gODSA(xGePC{MQGRwg z5<@5-X{OxY@vg4tBxD&jZb?0^t$!UN>ez`7peIb2&gpE$0O*W`p}z z171}K@#V)bLEoXxFxZ5E@u)9l^mq>gi7%9+sNDsRhUb& zTNh<=T7qD96GM2jEL zUxyCG4YbQ-Sg6T<-_?`9m-$@9c3#^bTrFD||Hu-}Sb6cBRj#gH+2vKo69bjQ2prji zPTOo!`!g2xLU2)L@;({|+b&nkddf0Eo1efs^LoE|y}GW_i&KnqZMAr|ztUZq7@>o1 zYs;W$Tpk8Eq!$&z33e-+m_(u=^Tf?jmcB$2Jhq~Ik=*6Zt8ri2t2Bt7_BvI1u3h4I zTdpcj(K>IPd${N%?8Qv9cd+d-2=Z{7wa%?m(wVz501?SgCsddqVS@zw%b(W0CZjJg z59@j{gPRYQf_X`uGa+(&tYdyrdw+V&ez11Yc|q{ilC z;qc`c-Ums9eb-I^WT4*7e@XwL@WE_>eUR;QV3A9^7?Rv2!Fq$Vi0IpP*YhuNN{v~H zD@%%~9&c$LS`!<_vL!QPG#}& z6~?v{ufX)?lturr-Bul2r$8wi|8@-@sf;0I?J=He)UvCas&M3Va=>yEezM--r+7y6 zwEB0>-1+DRnO)@LM!^UObdvY}Fr=HwZIE$vxoFuc>vg~-4{i9kz>j$Q>j!Xb+s!ap z%E%YfocY4y0vDVNVf?Ym3}=H9pwuO3yR>C5eN{f^y|bt6MU@h6b}83xu^M9LpF=sB zp(8#qvL@iG=6SyU7ckT91sOVjabj3a9W)wt^uBS$I3s{@^aaHF*LsT5@M^1j1by=b zUpzzIc^FKMMuUm_7#jbBV$$bG)pzS4J=+ajI5ymO)pg;pmKt;fHZF3Qxwor3Ke$BH%?L*7_|1a$Wv~K-qSN8FPODLJ(qd1{~&getc(~2x3X}r9XOb>qbM}{~1*ZV6%a+ zG^{Zz+sDheWUcyEpn6`hJca98v zjTu!})lJyy;dJvsXc)>@uI`tbjTHeC7q?6ot-)GogIE~8P0KRV&dalt1j_WMa}7Dc zAws7)({%s*j&;{BQ1Ft`>;2FMyl#tO(>%jqNp1b2u;_aEc*E}6QWjV8ns@(#DaTOK zyt@cJN9JI!1u-r5W!$Cx#kZ6;^I{-v?Wy*K@~%bIc zEy*r(+aheRKA$ULZl-lg;;X-meRQpI*%(`F+W7+vux#z?h{W6c_V}ZrM<(v=L0Ib2 ztF7d0zHd~wG?!*(vLjBm1s7^5tB&o~q+y%$E=_3kuyk!!rm^&;WNd=`t?c713zTph)2J_Urq}oZ4@G$9{rzE6`T)|2_q6yf5V*Gr~h^nU& zO=*tYl5#2bla<*;#h+6=fD(YVT^@J=)#>T?={pJw;;O#nMCYCs@n`&+3tS268ha8-5b*QIXF7vTkD z`37~KUjus2Aqi{)Sxci9Qhqg)UpP6S`ZK?AP25nqJJpmaTHEl*&FFMf< z*W=_JcN!{2)T4;r8l(D(%8%cGRXN?iGgobzB)zVpKgK#+y*&KE%29>h>eO=}n$ z^j3bw1U^mI5r`kcc*M|Z19PMG{Nce-%9i(xtX6_*P?7%IxHatHo!i9`PGm&Rg-Kcw0#TDB`EnbKyV0*L&)Vs4?A^ z4UYL=-a4e!A}i}%NLRy-cC=Se1pls3u-}ijX)+;>rTsTH`vId!cXAuWvW{A>_%gYH zzW`dw0^zqtu~b!_6_cH9CEL%wKxCO&j}=CWL%+Pd;!_(b2zCO~7#_Xfvv|$<(Zi~= zHJ|#^p0A7J>`!v@SEL9nUmww<^vLl;X1ucFH)S*ucGVFL|XeE+qE5?wR>RfBe^!qcB zbK_78_i(lar!* z%SqlpBUMIc=$muf=r1s2pjnpMFTHsnpEdtIjwgTX`bhO{R47BG!%*)$HBdDi%S7!- zMt?tYY3}_Uwv~TCfBiGK&0zs%;tuueWD<89;CmC=m1&c64jEG{t!S0$evYCCw7{ zm)hoY*OW?``$&QB?ITDEB{LnU!^{f*0?1dl`G+GjPSsTWKP2?1ueUNT%#0sk8UyY` zyWi4!>Qj9t+Fk-*yIEw$0QEOsW$uc)FupUpJ`2y9K~7`@0!Z;Nk!q~u?Lt4%wp!Lc z)MbaxbdJ{Hb0du@p9ws8dd@qD1Ye(s1q`p#&O%pm>#*mO(-jiTIjIU|w2@eLhdn$` z>Q~RFB*r@(G3seVi|754OOkH@Q*8W|^;jmzi~eFKk`O-6?bV?l2*TO{wr@tG_5=f? zVs-A9E>{%q=G(%(^wH~|)v@*vz?kq#HHOV-ikw*>!pDcw?HzH=a+?pzq5}1(YVx$- zDP|7MwRUVSw_HOBxBjNjC=OcNf%Ux1Ti6H)H94TaaN9kN0$JbYc z7!d0y|6MoZJ74tP&u~OS5_=cL=R|gGfQhKyb*aooN#}M(@6IJg(%33Ba+q2)vRVAO ze2MT8)8c2le#iFw6xyMGBwwA){h>;~9738(kc3ILi@H!LJJ2&hbvu2@_d-f~XFQO- z&OX4j7qt*BZE|d`lbwB zx5KWil)n8tskhKmozSWT)gDD^Z>YG%#CWtcH_dMkyuO*^dLFvmZxMA{&P?HD4-cm1 zRQsc-_pjCcN=ItG)`w<=8vAEr(J<~fy?HUwc8Hpk^_nc(e@Go^kF9J7FuP-zk0+A% z)$y87{tKWe!uYx5iozz78r5YiRe`i_;ExZCwYn$D~*hjAM;$rlaMu>JG8D**Wu@Dca&=sY=lz zs1kH{#5FJJlM+V-fybJv(B-VUiRI6(t{7SAn)^{F-y35zinjD8dwz=iC;58PBdTm{ zym?`lEA{L-EaRr@34yWkJM7}pzAzkz~xqv>pJfv*l-Y`K7tlVtbz4;;UH%h_ca~FKOs}=l8sJ zhd69Qhf6*up?hI{X4?}dir%5s+euIPTg|5ZEC9`Y%6Y&(_DJLz@W!|*1ZM+R_s>(TRBBN9IoX7psW!CK*R;GV zPd*;(RTzz9MBOxx_aM=VjY9mb)j(c~;+gQ|zi%n7^Eixe--G)rLw7*C^IcaMz7@zw<0(_DGOX^1^}f z<_A}ta(>$__D^p|3e}vqbXoBj+!w3?f}rNK(9J`X7Q2(v{zeZI@Un~|I-`SeY3+Eu zaLZD7d$c+7GX80@Y_g0Bl4{j@Xe0x|S!XRRt&D*@DF zQ9D#1RU9Qzy_W5+cvaAhw^hM5y{T5tj1ItAZ5Yi_hPb!Ghl1TkXxQKjMOKS%m(aE{ z)@rWyJg1H;OJI#j59LDsuw|!%(>P{Dw*2(K%Ln6d_^7H(7)z>DEk{x3dJ)MX+~Na{ znsl=PzdRDXrh%fOAD+2VbQznj_&|X2x~#} zTDwx4EL0lKiyvn)&749V@h1$!r`P=&d{71%Ye@8b}mqPzYfqJsw=Ws2RvItoOq;N^CjWV4nv=(*|( zX347TE4(CGB6oxfZH;?oO$%$x2)mOIoaxz-hRsbpJn3~sGCQWC%7uy+nNmUja@v&S zW&-!Q;^&l0k?vXQt^CUua}TED;ti%wS$gSsWL7MhSmZ@!T9?brd3F__5x+nW>q;Hi zLY(zfQVJ<9?P;{A#fkHI#Jvhw8w5w6{76MLpg_ps>F?1pzK$uK{9%8BIFOaY?%u6d z+E#9KH=8B59$^;!b=vh3oWDR%vc&fJn>c>g+4MyssYZM>%3?R+hQ8=ZF97+~ZFTMD z5_=&n_B6vUsI<@4UqEWrYu+EMd~IY>r71o*$HfVB=Ql*i3W8q8 z!Ap5q0<-rV`1A#S!ZW1tk~uHYM-0;6u8dBa4{!I9aD@q&1JWEs?oGiDqnF_A2Xa5! zua!l@zlpuvyW=t`oOqw}jgycVpl^PiIrW`w?qz=r8JqjeidQ9N0<37E8F9#9`n`<% z?xl7~4jS&7k1oG`j#&v2-z_PRx&dAl=dgNGDf%nQy&0R<*nLJDA5WCjOBV{vdPCgS z$qJh%uV8*^C-ADsj6wflkbw`$$7Y`8-(z=4jkoe(E~a@FFgIj&7wYNTA*kgTl+70F zlk+X|v-a69?nH06>SLU2nrFu7OK; zeu1a60oyf3<$ zm$YBJMtJRY!vy%=YRt#I$>HSpjsi}$3Zj0Bxz84|X~O>0Jb;sRLOei;e4ok+uQ;J| ziJU2B78OyStF(uQhydn&dP)Bn4k*cD6VG`#Em99nvDMyQYOoQmd0yPB>j@Q%D1>w} zh52*vkMJC)>$qNPbS0d6P`x4E?)7TNq5gLitq1I4%5In`0~USQAMXN>7;7+a=?{Gr z8kSFqpcVODJZ4)-IOP(Otx9>c(BtxrazXh=Jrry#sCCT4FXT}ZJ%u#|&0Y-`>#~b( zCIi>&x8R3RGDkqev!3J0f?utOh`I>h8)&1F3)^FieQTAVwbxEXV*Ge^0Y)w2uP@w^ z=>$%Ghr=L=> zQ$9UH)Ss?7px%Po6=|w9Ctnr-cth*%1}zOHNN}wAqKqzYt9jCut#MRm!r|z+UAOie zfBd?rc>8Is9!d=Ki7lJg8S#2FDaNpuRs>cSg+F!3vB#{+%>c4TrxayH@;a~qq`qEJ zo@G3r($_|&-_MkN4Jwh^MO`W^ApZh3Y;*FHF$U`p-)rXKFK_e?Tcr}L&NXR5cqpc zSf+nrYQe|2G=%2px-m<=nQA$5Od(W&m(>2ma-9Uep0eiuu`|9TykxL@z^(rpn$R~Z zx746l{3#<_fJ}<|^y6>nw5o_g9wuX0mTd;oog@5(Jil|YKb~>h1eHlPn1(+69brn! za;;aTjt{_ep5n^%)9QjIhkPI3w=hDsi6O{fFSMExhh z)6n}l6~}`iUz#8Lp6--Ki`1CS#o_K0<+(sDTQ!dEkC!Wsf3V*SmS;X(XiW1>q=kqM z$Zc%mi0JoT%Z?y?Y!*HdI0d_&PZ@-j`tVdjzh>WCF^6uew&s=%iqFuP@;3sjR%LsyBZ;At@=rf|GEHzlS1#%s2 z{sOpNJp0zu^`lU$tL;)7zGkMz1V$`z9wt4cCq?FY%y> zm4)=QtLVV@twQ@5mWP{R%OiBaV%=r{`lF~eW+0+OuztC|Fx2|UZy2k~o@T;Tb}=zs z05=n#WUg}QeG5Ga3O|kwt_3tr^=O<&iqR=&j6WBj3I%*`kkP@s>|(>%Zuf3u_3?fl znd|94+U97~Q7%!PY3_pjQ_5S$iYgrkKW?2~^a@+8@!HyFEctcytk8;uF9k8DF@R2g zMt`lv7C0~&n>f_nPP#bUdn$~5i`iIx{%YT)3$?;e6qzn`0~SK%JC*i643^O zoO?9+BjW)-Bu}(qBfKKceQNf6Irl0p)-ki&h^Ko-PoH>8U@Yg%olj@Js{Ipkvbp%` zVn)^30%LqudkVf`+?h0)lZEveX_7f=82L2vX2rvBBvbrL_jbbzXrx~zltzqBfqktA z$F^p<%Ol@=iEyF?r%oco^*qUw0AGqFmg*sM$4`7lm|BO0&$lbF(!%Ch#c#VRt5=ij z5H$&2&ZqBOS}ta@{m^NU1(;5#VSVHBEpGf%)5dWob>6CXo{zNUV|<$p6GnY!6${jn zc%KzRe;}Xy=Ggx8v;h}?Cv~Y*q_3a`v_;R`q9{dd264jvwd7&A2p{~ilkYEoatqAk zHFFxi}u)M}!kVeQ@cEToLc2@`{*76`@^?=? zm6`@`jE1G`%_1?o-1NKZm9lI1!G`e}%g9(sN(?)}SxB=-FyA3@2`S`Vt=5S->bF#5 z^^<>0t!+mO-$QqLs1n9^D|Qu~b1M17sK>QwNR43!l^aKa>sWJ#l15_V zCbFiwn&KXoBr@l?pf|Xx-bv0&)6xu|zgrxaCj_&i?Z`a-Ree)p1RUU1YcLF89OpS- zr?2v>n5&|%c^Tqel7Yx-Fi6^j&~DibJEb0jJpO$JWrrChvI+F>U0$zd_jgMS1O|~e zNuDwk@%;Y)O3J;ohTAet42a+J&m0r=^sMC#Ss*bFp>b%XQbH8<1Y}jj)@BSg ztbXKMp+Cy7bRyl&RcUN%-d$Ryq?&@O%JSrSk^s3r!nv5`mil63`J1AEJCj{biDNH` zJmWh!g+|jR&_4hN0=9I&2HR<~q{3F2(~uZ(yVkB0;{qpEQ&wfK4e8IN+7e?PY?#lm z^s5@?q_$dYk8^M5BLY0U_2R8GHyxg^yi;p(_6Y3R2;bBH0IgQ_Gme@bd2=cmotN&G z+>4xyQ|- zhlX!nJ@$o)%M)*pKd7rvcGTycRn2(4w>tZcI$6+y0j!yH3D-D`AEk6Q^2v1y%L{-Q zat~wNQ)G(t{n=E06`k5PvU;3t){8!QOi>n@E;fbDZ{OQqgxqISR4vWWf4mJ>HiYsa zEVROm43QIBGnlR8AL#sg;+%&0m*oJ8hUPo=w%p)(VyAu07K=i=UknvU!q$AO%umb) zYTDbgp4BJzT#lrL2k2?&g=Wl?421sxtQ2f$hUSwsX6gmDLegYbQ^;8Gdi18X6|K2# zZ{9v519z$INSc!Up-t4qhItvPF8eS6 z%S={AyNWg)!RENMZb~w`qQSm+__niex|(A zOVqbq208QwnFQC@t`-E5*Yu?6Td0*wy%E>yTCAa(FOk9S4Re#-BQaNuT7DpN*Y{2rL*(gb#A7n@rK5p^taIEBGcFrELO5fp2cW=4)S*_ZNy;qHPl?| zW;VdHWKq|Or*q;JW!n@4dzuuc_Cs-kTC)}#m6k?S0^}?w)38GT58;L#b;aD2&6Kz64~OWib>kxgD>v;QzY8cFJ!d2QVvw` zLFj9)x4A`CBOx6AMz{^0Wy3 zRoNU6%5XvLUX&)<*;AbJ_*Ws~`&5nA_5eO}hXdEvvxL>`T^(YEyy^iCz)ayJk=R%usvkqF*N8d1v{G;kC1 z1psl^JmWu~V59rk#!u_{)m?7+ZEXxne|8s}#_C5jMsqzDHdy-({*Ek37q z5E5Cq$^I3l=VfC!(dMblYxs6~l6miOmVc2>I}h?JqmNO$bA?LHv9?GeNRWK0Fe_R) zp|y{E%&NYox!LF@I8CTGK~p5Uh#acZt@SH=jxFR@K7bmE{{UKw%GIXgQlt%tM(()j zQdsMo`>RM=Nn;XVWFqx7$M}cEa@x1KrAeAWK|^nw2X zEyZ$P2=iY|nG#k)vXc`JP&4^|jc;6ds>0t(g7RfMrUV5GoG|JQO~T6M?e_z$%TQis z>fPXyRUwDudsiX<012C2Uncu_;zDtdPCpv$w5hE18)G8GsUjRmpWQU=pt_!KsadtX z%V#Uj2_M3L!lSjmy0T&;os{R2t--HF*7RFj$V)^KW&@{Y9)`U4P}APlMi@8;q3SB4 z`We)X^)z(tUE`Rv%vl`#{{UZFcC~74XOC2~=m;&3=U6ErM*fwzVJz)xVsnd0GNIUH zDfGo`oz;#hQ*oCvI(-`XUM#g{C^L;?=ks`L1hP-NP(V0SpINr(e^{3(UWUT9RJ zgzCwbZZB>o=1G~q8mv6VVs~*&G6Wl#;8jU(okv0m2#jify9 z=14Yy(={?_ElYxOmWJdDEWmDXqy3u8@mNcHB!vO_&m@Z4fAlMIQ(<5@1md`zdhUCx zt`b;zw@FxwF=!Qf+%zvEb%doSP;KdSL$mg=XE2V-(S$8cNoTiz6#EVM_yp(z&x6hGk$w zDZv%lTSg74HZi*x{7q-;HcM@Ims@{xDcdGLg}rN64HGk`Q{HIiSRC`5)~=0wZ0AVj zKe&+fKf-EztuYz{EKa9yJ$qJiIPzt;lzhPDPooNl9#(C2BzD)jWxd1!q(x}Y-YS0Y zxU4Jh3S7j#ZIg-6auoId0PE4E-_0$U0rJc8Fej*~pww>RmAttbN}LrZkII^~w<1@D zsK)-yx!gzCF2}at{_rvMMix)j#$*nGCIAASD-{d#})#-e}a zm9l+KfA(s8sE=tb#i44N29IvANTuQ|%un$W4o!Ld*_oteW@Qh+?T=d9*EKohia|80 z?89iTd*g_d&>39#r3l zf6E54BZ7O&sjcjwc|*QN(ZK3CJ*#ThK)TcP$=2+w}{*)!CJf9wtTy569g->&mrVF6PDB=II7xe2|?Ko^ee!Pb$8p z8O_zqV&->u0PPIl%Qe^N8ibeHdaR)Nuz;n%yuFX~s=5oqbrsS;n^reTqekZk7;40~I$e#(m6D zx%u3WrAG`F&f8W;C(u@`npDm?0MrYm$pdc+%EP+SxY8_}O*S}HgPfi@Jt`TY)9vl$ zP|Y)y;}u-O;fN)UPI;&KGHv^(@}*(i^V_68V{Su`X;7V`gIyM@reHLxtXn*cRzZk? zj9}J@nX-h-yz)q`8($90+JE+gJVGA9o0CvHM7K2}nHDcECugR3p`cQ>w`4oKkIU(RLO_ zlS*b`f&z+Li4h1ntk0Nw)RyIZ&|fSEYA!n>^{tG$gn+RT#h$HOiw>Ekjj<@Yn;(4i z6^-`A&n@^0VY*Y^m99Q(Y-zfJeq7TS5HU{&J?KAL(HJtau?^2prCCBpAXI8HdsN^Y zdQ%}6EFhYBfR6zBn&~36mI(Jvb_NF_YnQZ+6DT(qjS~0TYewedM2;e;_Y=N4?lp|{ zXH6!Oxm#Dcj%hZ;WH{=~de$7go~QAv4&jON!3*0pPEpCpBAQkrO}BB%25Mjc9cqwK zo>%>o-@jk{HeB*EZ<}^S|^okIdYa{*^YKiwqIQxY`9~>eGwche%vD099P$dFPSq zjMo1E3@mWPy0zQrE|+tsTH8cqU*Ac&U6h=ULPysXrM*GuYaUA&?d`nao2FbA$>93_ z6{V+4XM=N{#2vf6Ycr|Y>W5x97Ol6bIILR;+C~uL49&;&HM@R+tk@CxRSgb2UG8p4 zm|0LdpcjFy)=sm*h8r*WEWrak!RO#z_MDb*KR#5d@gt#?0Ry6tq;l=nMnJI3TX zquy!yZ1;GHyp`RLTH}#*&0kEog>8~$ILv^I;GFU5Yp}l3uP-d6w)RWkZymyqog8C6-r~Be4PFb$ZC)qX%-&O{ zbWpoG)gSDetnqlm@uv+g@PEtmidqd8 z%xxbAV^ij@fb0AQXIQ595lx~#PgDgnmy4ZX%J>)AiGQjG?AcoB` z{40EsG`kVXa%0aXj%bz3Ba>M7608k8?u}JZ0{WbCYjRCe_9&hY?5Jam@q-b_{A!do z*E3+c5>H?#Onk4Qm$k!v(MsTtzJMC)ZQ!=iv2&=~w9SmhfpR|@&%D2v#5chqv_a{# zbROoHF!>oAR|~uMgNl*ogZNEVDk+35YIAcJBbG3725QW@tcDR1MuLb4`EE+7V$mZz0r`C@z5J~NLtxH&)6VL!y=unu(_`8%+q+m zFcfF&P_@&O_iE&}DtS&ls-r+b#@=aaY0Qh7KDBqJU8_XFQH~fMm92k0wawE@3aBs3 z1RpMat0Kz5Ly2b`4vXtr40kp_0CobUFM8vgmo0z+=}fzAw%7qwhXg*%usu5V9Mp<= zr{TDPy&kM!-{BmO4-F{{VP7 zt8C^`W;EGoh&?hYwwj(z%mnc5BNqJluBzuqiLE6HK7FTe*R^tJc3h+M!vk1V)g739 z9;W5(%G+wu0mdR@`H}t=4BDP^gIM~_-Jy=z0=rmk?~W9=%t7w5fZ zW;?pndIEX=BC_K{Y^_ zt!!($Y+9C$EvCWpuIRwy3_5>>Xl9feS74R4JZ@-!1LeUS8jKEWqw!vrY;`AfTthi7 zhp;`xbJ)ddjHFK-m>`OmxRPAxMt-F3y-?m5HHvL5*p`Y4m{{TGX{HaEuhon-U_zg(6FrWEp z7^zl8KXv0YhFAM=?F7G-HLu)swv+O!PbS1H@V22=d6F^f}E>EYVktx|$O~rr1TB0W3v-g>pAl-8)gWx%qd^7QvR@devEPEN?9c zGfnn@xd8VynH`PnjpeL{C6lQu{c3Ewm3OhJf2rC?>LEvBr=efHS8ea@7zIECn9C;2 z5m}98{goR1rZYP?0#7jU_*Xx5VI$rd?eCpjobqx<<4=__b2N1KlPv5;3n2a$UbUYy z>|EK#miX(ndeE11c?%qplYxT7b*j=zK*s0%xHKr0DOkX5pk$he%O9;q$=#ZwJ9E;y zu6fo({%lmDXzIV=N*CIIvNf!vMi~^>kQ=2K?^d)sPckNADx}d7sO`skj;7XjMy1oA zvtW8xJt_IkbaTgu2JV=ycJfHlL$G90i08PAlTQTHcG`)8K*BJ6ja$0Bww^S2qbYC? z%vbIjtLjUNweCj|K48sixGe@itaOx@$>i4j7jcUcrE+mfK~CD3ZgA$1G0i>7mnR+R zpbF6#J;(Wmox1{<1vupOpc5Pz(~yAKAR34ODSsL)7bb6;rxe|->rCezX-0i$0%XWN zYIp-k`&4ApZDSJfMr%_`wLfak!T_aml4IM$vEM>I&6km0@u4hC4{En^(RAO`FJnnTFi-#}&dfiv~zyM2I8>k8{EO zY997Ar?Zh2#JQG7&r?#Rtd4<}YjRIxCe!-jvzWZnDkvvC02wFnsj+aU2WdWxFl$82 zTraC9xPohD0%hBgkV66w;w!uGZK1Z&M659P3}5i*KhM2++$<(=r0pewpKA51by)49 zNJufN0Hk*q;)cOS%(I$DW>jLUxq#twjMRBFxitlivzlq3-*IkWe37uQH9l%R#-Y5v zx3Nw4Q!HZ{0QEmXMS}Jzc(3f|LX_Na6oQTY)~_=2mD>QHY}ZxdeQq6BO$!8a2;-A* zXT~JQ9X}f90214*R~tjR?uJ3w=kA(Z+@;2!Iw8&t3vwcJv~DMi&CW<;F|7q5E4x{zOC;WA(30&~@u=ayeSwH;lwUD*lJ3@~#&Bt)9`1 z&G=~wW;jsqIma127w9Xc_e|KxviR9)^3|=d1+`8d&6-tIc9N?J%wM* zCWe^&&_F$fH+2flle-x0ibDewZPqnEg+|tP?bapyIH|KsKv?1YVQGC8!o9l6Y{K*e zkPp3bt8i7az!T_ruVN!31Ohz`Vrt$QvD8(WBM{BmlyH8vagypLpF_@)?5i`F$tQpX zIqt*!qbjGVBCKkf1;(=$qAJ}L z7*hV+bgs`u*5Q`MB?4xge5Fd~C+k>i;aiyP8sc|gtI0vj8o6)cD{Us&TiEH+Gmfsq zl6~t5H7$+fcikg@HKm5qC=>pH0*?~XEh?ZU6)SFH3M zT6lv+sM^XqjrqkStXDUYE4Vyv6w>63WMZk#lUln)IE|zoOl^@>{NvqNR*4z88J7Cg%Q!I7?zPii2{!{z1vjRkM(+Yyhcr z<=u8ktlHJHWhL?5|%`tZo(u^GQKk>a zqAq6LT_$*`W!l5Y2dK?B5GpMD)NgYXXAdfa=nhRFEbgqR^+6`1HM6i-T^SXzoDe$H z*EgXpWs)?Il|n%y1E;-lVp$`KIod))F~I)r4nL(AvmY-qW!sC{uC({w`;>gqk6>$> zo9-d6I)RD9H$yA?TE41#BZMV%Rhs(w-{Sv*62 z5D9`xj5zb61Rut-QJORI;PHY81b(!RcOAhMc;qO?X_uoW(@xu_bR*2zRYC5}^6~lS z@UKyVLj)1TBYZ}oM;?N_^TS$Xw^!>kDOjTUw-LcTfUeUL1A`=_{YEHAQf8OhPxl^= zw2tcI@Twkfm;SUkJ&$8W<@(2AJh7@}BRC+Aze;u_uYckuhI18}UBiOxGlT3a6I9lI z+jVIks+ma1-eMTuJ0JeFWHqTImYn&`^AAdjd0OVzFaEX@%_Pv=8ZF&j#W7*!4TKe5 z+ed6xI|pU~jxc{JvWyA??MIitBx57>r^>e`GiyQ#92H&4H>k#aYCVioehvqEv$0>3 zjCajwS!q{#o5qks`-A*h`E&0@tY0<8Xqq&dz2s3A!j4#u%U-1naofU>!UD#M6+rYA zoug@R={CMxe>9Ev-yMJY)qilQV2QU1iaU5>mF0>gN0aX|j28OQxKWyslID!oebt0F zcM(q`%&!s12_XReMP5R`#7UySGJCswU=764#0kLO*v(9i8AB-q5s*RaRc5n-;1#)5 zopY5ApzW%yr%t+>T)}i!5CCY8Ob)_$g#$~Sk(#~PvxDvSZ`PX?r+v%?j{W;vr*L)nFMnumm9b~0HoQh$N}0LHp(&|OpS zFdtJwZ39W3dpCx!#8u8x-bm9WPj zA;1LUxht!w?B{VG$Vtf<1Xo)j3XD%oR~4#C1nxm%Gv1-@Ty`RtTe{fMnE_MO6&%(? z@)whENYwY(Hs|uGCnipc1yp6h`LkCPh?JNVi0Aig53^KdaraDv@u@Z`95MXqgCl@V zS~F~@6w4b_8vIl%B^psY#UN zi$Rb9=0wVS5y<>$-c78nv}|H~cNG+u3RDG9#C7M9Rl#z1B&o+@yw&O4&sO#>jW#Yw zQlxfM{xuBRd+sY6t9^K>A)Y{TSQDRqD#zNRWg>XSeMLThGF>G47_wQ<899lM)0%*S zr{+>VqPhbhBzaqzGsq)2seGa%+bluB>7HuT*@UP^qdBbOwKT}!@U^)vpKT!FSsOjL z{&h}$C6pG8$ph4Xg;zQ=_A*{&7^alA3UO8!B=QAUdsmF%w=Fs~2y>EZhzGa+#SE&UzC51H5xe1AVnUhx%_BH5@Y>lJxw{b#xh-(p7@|v zBfBpxq|1T1kb#qv(zz2LI(dlw=$Pm8HQ4T9%FQRX7b3XrRf4?ggDmnD;C1GvNYW0) zAs}mT3Bkor=PTN*>H?ASupi#_{A)_XONL8*w-JFd!o>=c*WcfzWqpI>C?q>c1dLNj zy-^Lq8c3>Tjk#sy`W#lKnWM>g@X3I%x6E?iF;H-L{3@W+2X{Y}bUqcbOMAwX%yPnoCw! znZJ3p6fddwuR!q3Q0aOsLxz=AC*ZJ%1i0^b6HC4rDTldknR-wsL(pi83AP*kQMyJ zDaOT8pEA_g<2d6qboCXV1;ng@Wr{$9{#r-#55yXK8j?-3$6K$o%SdLaVzOU+*s>feH;SYBAFwX#CeUlGJrc^ z*E6f>)BT{Bp>nO$2Q?NgGn|;P1ZRq%>_O{Wb7^;b3waWNI-RwXD(rF_IUd!lOr>%k zH`G&ik3&+VW z-0G|D25ISPj0+98^&C?z?;@3c@B~$j>zpeL_Q!hXyIY->Qd%;ss;anED#MMeG7sZP zw>a8~j{IQN!aU_M^fdso*yQpLvEr}dS{eK=Qa469`O5o{IHxQgZqu{O{{U!lQ^gQR z%e#NNdQ|Tqj0`%c{DGvSZN}!G!ZYkaz}(IcZhBMM5fm$RYLc#IaR)vZr?pI;?ho{{>)el0Jrf=CK!3@EWe|wT? zPK1-A6~stUUP0^pSZ6w4=L*;BJaQkJl^E{Y7d*W%h~52XWXr80k?m zd7yw0f_VJxAIu*LZ~H#Xp(_g42^(Y8tS zH3P-AS6@O!L1TMvW10yY%U9$E>}i)8n2iXJ4JpUX*A=8>t#)!wl)0>niwQlePf3lV zxCC?~2Dwk|OWxBk`Y5Y5TIJjm2a(=I?hY}J@u%$(KUSXiI&Cf1Tj6bWD~N=Q0_OuK zk)PJI-q&Q$5Si6>{m}Uy)yuWiQr|R?N}*&b%ae|C)ABXe+}SX<{ocZiq18hjht{y0 zw2s;-xN1csT%sUZgq(LkO=I85Ac6e(BItfbj061Y{FsmwlEu`4jnT=U&!tkm(_t|) znBxa&`Ja>dlf^i($sC)^0+iZJeYxZxV^DdjspZF!o-%4nxXQQ~13iaos!)#9F{5_g zG-%W>-Nzo)J=`B@gFPpRbM8HBo{mXl<~bNuwbXA0(qAQd913^TiAA+zUe(5-YG9E5 z`aim9+G%(vkd!P@Nh#Af?O2iCN|yp<7;tmP8LP)sxt8R~3`-eh$Eo_(ib&;jWqmd+ zOX7=$%G<{p1KCq2^Ev)it>HVX%d^(Bqp`bmc7KPlYs0Khc+Yxt2K z8GueWW56{^=I%MRsBbfFK6G4T@vQB0OQeh1j4rHQ6fgrU2&(p1Z3}G+g+04fi+lDE z6_f^H#!vOC#g&}x0;zT-+j8SHQvAvCKXL0!%|V`cr-q`$+>ky8CaB4-*rc9X%jP&Z z!gEa4p_=DPnmc(mNsRRSz;zYC8O%jd5s}9Pk`8|wIc_xd)b#;#6UVtGj1n>fupi2* z{{U!6T&kFkJFg0aL5@B8-ajN=UiLKaMK5l3hEYQO!pVH9E2)fKv7v!BAM@?8k!M?sp3<9Udb zkVZ!(h~pjWo^KM{C(M!-9+<^hgI~43h2dl6?_Il_r!-%qVs$snQh&VM?td@pb(#8(7E*Klq~^sQ^1vBI%Ur?iNRjlk!n7ZY8MPa81$`ClWh@3%OrtSfX}UT7M7Ng zpcAgr-^501ns`+G(~6cG%e!HCm2#>$9+fN- zxNV`^aOurhk~AtqamQMwtOJdwZ$0TWG|S$7%5t*v?^Ytekhl(`J^8HZT1ccWSZ&7w znGMgFNRt7NLrKOv6sIMr(^`J~5O&DDz&JH6&Xm^BJg~@@Db&NCnJb$|kYSO^usjh@ zwz-hp7xNuuQ_0WXsN`#AY3*Y7KyKxVPq@f)$Ojd2+gX+~wouN!Lon%47F&V~6=^#A z)Uv|u9^?S=&{Ju35^~)aWV*JK_lr4&{W__s5@v80d~<=FJSvb1)ya(ECy7c_J?n+Y1nIVEb9iMzh{-sQc!+I_XfF(O-}OE z6lV^N?V8lJ)okasYfVDOddPE>9X-dPsc?Nprx&r>O>AT?7oD@ zlaDYAsr33+Cuglop>n*rBOh2=!_H$siH4XK5Kid-3(Ae5Vff%^QDy2L6>nPU$jxn(3`!N4H(W zJXc(FM+0|dD|@&zvU$N%$L~<7{OZbC4c=y(cE9e1$UlWXO9-2xBlW7!qoFxcp!(w< z%9tiec_q(~$#Dr8A9;RZT-?api6Xb!%JwuqT=H$lP2~RoI>nYJCp-TDN=2qu*xPZXufXdcF;dUq=AS;4k?!-_Htwyv2lT6lP}0zB${@l`#a2>vp;;P?kT4l^8F%;nS z1T9&Oj61nfML3a}v)|L})~Rgfri9?Cx|1_3GiYCko-F+h<20Fyv! zN}vN;I%LZX-!OLc0x;S9>nUX*@CV~swoQ23gdST49N{xV)DyG2HRaV3R9K$cWsGt2 zWd0oSS`psduvCW4utqXlkJ7Udb*BML`&4uo0~LM?OQ!?vS8l`ms&P`HklgN1ADEoa zEKrZ`#sNQ_O1BYXY*9%!yL6?F-W2G7pHt0D2m=F(Vj2vxef_bo_gAeQL1fG`XN?lrgSvUhwg`X1TLbxbpFOpHW-;s#K5;tD2j%Qc0d)EN>H)aLU7s zH8o^qAfL=}UXiG2);fwGIxIhD1DfQu4-DKu#jTH>82;~H%9?49SecUE@7sb@j^v!w z(JU@Qvxj5vRHcSU&K+<^Zj{ZZ`=6y&#O}8?2v=Ra5lE57obDr^?^Z@J+w`YL*Y1P( zQOqSDGg?Vv0Oi3wvCUc2qnheb94XhFVzaH|X<1QJl1>0oUWwtoH7sp}lOn9m>(mO$ za_DUZZB0EeN%jbY%ZCF8j8%p{v~LHY6vq$SADu}0oWF?d&@q}dE1tVogIt{DRPqnv zE7B(n+&AUcur<9t-L1<<8~LQ<;Yr0*U5S)#ai!Bflx{*k@Tboajj+l`)MBDIK9#A= z!G2@&5Lomcf`(t1oM+mzmPTnwLPHUOQ(MSkVr6sBZ+cfZXtgSaAmfqO+LwSgvH3?@ z8dO!@{{VN_)}gs^Bpa0cx#>)s4wC9JH+2JmDkTXaGVa0-qtdF5cpUmwjnTsyjh7|* zpGqz}SS~i)e(@VSMWQ(dD(X!C%2Fz-cz{RKur8I2|R zv((jy*&7YG7E#SmTX$`x7a;emkw7C2lq}uoR}--mg_1%_;2xDSOEf2RWw3j8sUwIC z1{;T=sZd8BP}^v*CN#X0Fk=~3^#iR+ye?&fBz0_270^~Hc|dXQD)e*3fHDX*4o!46 zj1;<+V~DZDGASS3BD8JN;W5H4IaAiNu3iY7IuJ9^=aEo8x8X$F%hgHlD;7y_{3WW0(rxg#42*dWzJz+#Db%hR_XjEd(K$72T-@B4 zZWR^TBqz%>&7z*8`^LH1r1Ll=VS5e*6G&7Q z^GvSXvy=J{YK?KWsxh|aQ>oDl3ht3W9qXsJ8zKU*blAhqpGw~c3I%Fli8oLUN18K0 z?n|1*yV2fTgXEPFxyjG)*0407(iz9k7RO}gDo8a{@N0Wpvtc2f2g>}PV_0vro)1w- ztB4$qjf!^m9rN`y6)5XSX1;=pb$ViyWpy34fa*c|S5i;C zFm@pteYgDc{LMUB+b{gFPs*LXg7nF{D_rSzw<9}3H>&Ym#-n2PQj~L$PYgSX>_Hf; zt$m~WDk~soX5ji#8aZzG=8ANKYvgn^g9P=(A&R*q05e@DhG#M?vH5DMxI2LAYn(z- zMRjZyIR?7@5Zg~}EVjrae1j}wp!Xis#A$}bNUfTHnn#giLhiv;dXvylE0)3arO3rn zx4equK1{0k>w{B<9qCxUWJpdZ%}0?&>Sk=1{J7+E??&p2G@#L7xi0EZ{8U*KZlz+A zC*Sp?FHr8M2Bl)IHfv}uMka+H+>UCY@b!b7`Aok?ttj!-nzJ6$-lfXMk%D`e58-<@ z&zB^qe>x!Wlp~k9WAsofr$s~86)1sQrxgyPFWIDK>Do=LgKml~&;9r0)~dNZK|euE zYk3!yIiy)6jPj-Se8JfGamkwwz87IIL3Na;zAsf271#a zwnUJXUK<0qwM+)o&r{y2$$Jz{!Oy6wvT9CpBU}%9E|7AzU3U?_bDrc0C~SEk2&}H)bkh0Uz+kg`=SRu{ptt2l=LA7wO9I@GCNYZ(y*-T=Pbp(w4bNa zfD3xn+gmY^_ZbV+FLOv_R<`0s4Im;gdG$4@@}mF|0wVCLItq!~ao_+4Ks!Tn0wGz{jXT#`HXs7G3mF=Lb0)|z>2)EWY# zvEgf1K$Yz^cuTj*CQ;Wtjb^Dh;MJ=kvf&)|VNTitc4ucI`BE|y(Bh+!5@^~tP{_js z8j|J1y14F&e@cyd^r37^-p4m{1iB^qTtat7*}y)YhPqp8g}AqlP%s^HgH?4{%jxok zUBnE4MrwwEsJ+29(+~Pnr4NHqWK!~Z6b7W>$6V9I#B{2Gz3D@H)Y!EqUrW4o;;hGc?^$^+I3og^xQd=c z%l3^M>3dTBtsAHn&n(V58hE*XYM*Au?IQO^+shLU6jf(s?TXI(OVReG^c20DDOHJK z-lAs|&$Q>LsG0I>M2zP&_9fj+l2t{_j1+sCX774zfh1k70}n%1WY0WX$wzQ%WWWCU z{#8SYKN_2w*%xjmj(inur@m@Sc8)xL@MF@mx%H>Uj>if!LSktb<(4wUm+i(oRB_!b zYTKBxH4{SWGRy@+=*!6*9`x9fOqcBszbVJ1GD)4!&mlibi}9mA)UH*7=qUP{Oqx&$ z=}2Pr=rc%3?^8tVg9^0$fsW_uY1o_Ctg2Ylk;RkGK~ns=z!|HS$f@(nxC5Z0V7Sk!oP!fg|;Pnn@&%FSdIDdN0w$$W(QJ``P7AgQ8D&xAwh1`IkX0R;0%bitZ zh-2s6eTHgTYf{Fd>i6=M?Z@L(Un~!`Sh@cIkC_jtKhC27ALUZZj>UCQPbU=pi|S1n z!6KG{8onI6@+Y3z{_N?2^&E=XBmhY~3gzsZW&ADv(5;PP=)rB}p&O*&`wDA7lf8>} zcTrwUV~M#P&11Xo^3Hs;-x%fiE%KdeUwkGfBHWsicYraryV45$jRrjnoR|g?=yqq%KWD4K8U| ze8j*KK=t>nbkVaAW|#s;;aJG(1{rfs7cwkm71%G`)|j%g9t|VPT=PJWI|C;Iq-Ysec11L+ zA>+FRkk^BCm&dsaq}(Jk)j2?zLowb160 z?o;ewT#w($?8o`k3BwUq?-Om*qtxcBINHIfFpC=?!)Ml;f_qfXGqlrib3#Da!0j8W zjtcTBDQ1#)FDsT~+|-f^gA|!j6dGLnQ%5xFLk!aO7&L)N?M?`3h-l!`mWE!0el(-r zfF8MG25Y6#ZA=zoMjXq|eX9b-6LE5=Iv!8byX%xgp;}20!mkFCcCrMoc4q@wJ|MMe z?bc+;G4&qRr@E_MUqNg_Oy7I9GgK>_%$GCEZm`JNMCqE=@Z^w@BzrM7GrQDPeO?P> zg=K+&E`I1eMMAg288q$()|7#af+{WJy&;nC9<+px#-b-Dic^u+orQ7xs3)3_G`XNxBvu*brDsjN zb*kB>yvrK}W67k;if>}Z>N8qeZkZj*hmrU_gpqy570LMAzx|z)#2#SgoKs54) ztpQJ^Np}K9!aaHGb0L_)Rd5<%B?>sH!r8vL0(e zfdI8;%*4n^q=IN+FdvOh9rd6q(H^ zIHm%O)?LB@c;Jp2wKG(86#14x+K|ysOLYoL=Od9?`gG=dRV4hwgITR21<7Gj=+X`H z#yj#Ubsnt}>S>9U{{Xx(REWqTwQtjXu|3z3Skf~QmEcgp3b|kb?N4G9WYZPCUEL}d z-otSmQoV|`!dKjQsHmr+XOq&AYe7(8Zaw-_@CQLnCp7HwK`b**DiuN84tolZoZ_Td zCX?>Q$MB-!vtx1r_N3Z7w-n}yqkXar98_)hNc5m~HoP};4Zf`cwhFo0#QWDpd!I z*;;RsG2Hb(O6XLCP^d5fz^Ed1Xq2JK2zF7f9VAH+M#N%rn29>CNn%x#a zI#$$rm9(8%L9Sy-)GZ8RDfZ{yw4~AO?(osdQ~lPgUW~S))y?I&iO0(8`O*fHoRtIC zxh+pkOBf7^e;{GdZtGOEtIOM>Vw&PWy{fHsdzo_UW4$Ep`EX4!e8xXH!1ks{73)rn)%*BsQtOjjHlbW^DqspFq%tfbmEf{R9E zx@?M0)0(R#w9)Qb(T~*>EXvw3{rLN_nWY(t+KN@&6t$6o9891h9scos8te%7O zMrpaDaHdG{OT|aNls0Gq`KtPXBGi#nFbK|b zlg23ALmc#{ZvjuJsVxy~1F5GI+qEQPbMsO%cN7Za6mv_*T48KbWSRoR@XzHjY-F01 zujV})0;&N{z#UC170l4DE4yxElTukmvfalM{nu@|`qV@WaYRmIkzIPJ1W+XP6_m#z zM(T$Kv@EqL2DNQGyCnF{3ju;1O6d5@BXh$rY?5-sr-l6m~IhC*N||Jt&Sa$&z`h zb8e1i-Y|1dhC+ItDPLVp68Cf^4r6myET?CaYd#jUJC#0sKhkc<}Mr;V3oQjVIDIqP(7X_|$zP3B)QcK-ltrF3bj>Db(X zc=Q$LY~y(qEOR;!m9bgMl9M%!Mv>k(i7gl9&*@P~;u}^>D*{ioayE|>K4v*JqS9HS zf~qr6=|vYBjp}SgbZ!n~Q_rjJ!NtKP zz<)zX%1Ta3LPE;Tz(mC=!YeK&%qt`)r3BKDk~5SS6w-3hHvC{^XKyE=?h)W_?GLiC z1OMkG2>1j9q{O7}$;sb?WrSqF|IhZf8-S0F5Q+#uLZAmA;v*p8BmC_H(ER&O6omgW z!2d7=L?mPsR5Wx9Osszcn%)2q5s;7&k&#ePkdgn54*vHXfQ*kqK*ueON~mp#M(;ty z69y|lXOOAyA=a6`VC1#(49CDEc}q%0&cw{Z%Er#eFCZu+EFvo>ub`-;tfH%@Z(wL- zYy!5nv9+^zaP;!_@%8f$2#kn~ijIl>3`t5(Nlp8jo{?EtR9sS8R$fur@U5|_xuvzO z{bz4q|G?nT@W{;U-2B4g((=l$?Va7d{e#1!| z`2V;Nk&%&*(f-4Qfav${M#4u%q2op+kk&@C^dO|?2}386ffdyEU@-9NTo7A%PGgcV z^8I4E{14iHk^SF+h5vt%{V%Zp&9wr+Mnd@a^N{cXl7KzEghuPf8J2NQadij#H2e*- z`jm_BRb^&~eQaK&HG%1|v%dBx@mK?=OWWvU4IXQAoNeynCv9J(>P1J&UFIj847iOp zD&;&yw(bf^V<$l6x&@;ovrD5H^|Mc#BgHff6|M)8sd82Ou;hfyVl=OE@i6`wFY;GP zvz4U0ikhEB4LvcAdt!X8T^~S(7Ne6U*W5JyZL_Li!aiA&SUlev1KrPfrGT2+zL3ka z(8om}ZEyBHefvdTFL%`?0vUGEcM7!)jxAY3)F+^{ATS#lNV7BamkD2GsV&^_q z&`owIs_1qrla3w$s4%J5)sQgSk{EfzAXE*M%^j$7VNQ@q@-Lzn?+rKjsgv}2fz^Po=KHk8pLG+NE2|UlU9vRv5%sx3nQ0VvYbKIo9i!@v(b||4 z6oYh!lC6585bwbv;-#{wY)RR7^+HZ+D^K?jXtLSMGf4VXD^Z%@x{mT&kbW1ZECr+X zg9mH()^pKRQ0~o4YkGg05WXcP{T&sz4$}!#`_Ij~c5qHNqFRmOy+^`j32T<1N3W;y zqi+>s^HgQT)A_@kA~S5pXR(t>MT)Qjp#AeerJwD{<{P z%UGfABLhPnstX0)ey>fg+X;%?jAuuA%f>f6Kf;7cMm?^LHpr6%e8UDS%5bDLU4wyd z)Dw$$VR>0yzgCJ3B!BWKS_M3_?n;l1r~c5LSEP>@IsRL*x2PDs-TrzRDH!p#@(FL^YS9Ca|cG)w#G{Q~Z z&5PVAZBmE93LZE715WLvF}%k0Np!>JJJ0gYe*yNyq(UFc2ltejrm;=9pPKKGFVz)( z?%QGh1^7|lSXiPhG~MP1YiDk+;pCVpULULLKVk(j>x*VVytG>WHw_4z4RK$SS;_B%91R)INc(&GgSQoNzKQ z$iu68&NG{Et!>yx2$jaBER8wwKlh-){a}DM*!!ImWF;+MyJV_HgBikcGGjb{6-!bB?}Si=(a*kyLw8);;o&w-JgXO z_1N%iJQaDyHkKMz%Z+S9VUJm%az2vX*N51@05M(qr`<o3iGmTNQzO3(c?&5p){k76wIn%Ct-Hb!?u zfTxh#;oPt&76mt%5V)8Jb(bQ8;BMr>WO`#FZrg^OUJQP&-O}cu3#7R4(0U>Ygc{htr7irn}IWy&TP~aVfo` z`*E=_LF`CO0AY?t99WekK1f#&>WY5*@-F6H0a(7`x0qq}dYQx5%>7Zh4?iJre;qp# zT){u%pYnQ&_T3BCW{e*L&OGV;u$-Z3eC+c`9f9mS%6Lc?J3MaoV+L;90w!RV`pxE@ zV}Mm9Z}6bOZGft(Wo> zT$>8)B3z4_q$^j&F2g9J#k^oDr%yk19ertAX5TTot2ruBr`j~G%1xd{i$^Kq^cip= zu#N77iewfst@rPcP9+w<%pHF!Z7x#Lor9#(2>c30`QCYWq2`IlS{4^Hr!e$kd_REN z2^T>e#bMh-p!1t}o?_+urUeyxwHlbkS2_I4oPFW`3ZeTCx(7yljHpY$OCafllcxtkL?S%xGN{Z$=b z=Un~1zRYAN+;u(9v#T;7C6R&wb%#J!Gp>-69S z;Ohyw#0=tZd)QzVYqd|h(8I@m+Uudgs}j4fe?GYX1vq%fFPU)6^R5tHOA+N_=&IN> zt+tEzL4DJRvj|0V;v$pRJS7LRXIA=FnOdcK|41>u>UkNNkF|dlNVpmZ zwI%w)dm_A7!(UP#FlZ#W6gCfZNYiEXTGA=vdy^+6cODjb_`iHH!czESEovREA;mIv zS2^SOmE+y6zJ0d9Sp9>hdx(i4u5KB-wQfuJAXJ$2?oo#r$iQAs8PN!px9hJQCFc&f zUnlS&44$5>4a|G8!T;*+!Qj5hyhmM}t=rnB$a8`46C94ma#fyg&5c`}Z3lIbY;rM0 z{J;$mON`RIE`#@{K#4i)CXS|37@5tqbfm3=JG%mZlS=0g|ul%Dj0 zlH4n}6?cHnYdDEx`TI$-tin9rxJ8h5E3M41rpCRvC)Yq$!Of%Vhgv_z2Lt&-|GK~&n#RPbwUj5*c zMAOyvpNXLu477SW?d4g7cc6HM`+A4$EMwjYUJ%pPsu%5P>!Nqa&Wg(R`>vhSzkm(? zQ~f`hgjkn6Fn&%&7=6MyrX?s5O;=-O#6)s?+$*Qge^ zfO{|-EL&W({1MYMmzgmTQ;MUSn)GceGR;Ija$GH3Lc;h{VfF}0kNI*wG6xdWzx!3M zQZX%}bsRIR2-elkR&kHRjHdc4CJxljMG?E*LHr>@dQfFYOz>T`Ajfrkl{Z-p?6!ln z7;~1>^rn^ppXAs+L4&Oo__hSuRlMFjsG29lesu3^S3DaHx&Z-hS;@Ejo*VWljY+Iq9{rY^8a5f} z?{ya%O3Tm~X2-v&_rYwGX_i+Nj|TcL zm#wX$OjbpqNg3I#~`XH>BtXzy)4hM0u)R|;LZF~#j9WO=?ec^5$B8RLI^mnLT5 zwvPZlPhWgWG2*lhv2S#_Zr4bE#jXm8GJ!l|2y;xcJ(Ws_YL*7tmf$q9VQZF4q(n&@ zY^c&wdL-JDiJYN%Ypya-9m}_7?b90|$5B!@rN7fQBF)JM&ssicZuwV9fa{D#_oXC1 z*J)18urZWOzt@wy9FqaVT3J8n9&8If$ESXJs#JMGy6uhx^6JRBfKA5h8Sk zrHYQA3f|W}xj8Z(CP`MvS&uX1PEF!xnI2I5bp-nU8hUp&W4c@GKdF6lTQfotd!SZ? zW_}zv%_#jfAsu(UAJ}LRcl{z5ufTD;ZU(-QJe&3^R%G~+4wHkdHhkAy$Z44i!3EZ& zBpZmWsgWnyNtPaM-)q^dhmt0nF}4#h2Eli|6LIqw`E3|4j(c3{+tTC6&rCF#=Z4>l z8oo1Ece);?UTn;!!!>M+adN8^wn^H-6hg*z64amh7behcWwi_oT&J3*T+wv7`f!9> z;!&r?^LN|bqm2x6I+_`Lf;zf7>h`AE>Ex|BN+G4{ueZL_lzsF4$6vl2#XRYs>iyBg z!@F$A%*zO_*bD1mspp&9t-C8#3eXV;rk|q<+e(zCshwJgA}9$1FttZp{{n2oh^Im~ z1vR2SOS@&?h_g|gQ|cw{SkQbpP(m*dO4Z;US7sUY{M5MWF1E{3>afUgU#aMW8j3z_ zM0p2>IAYV4d}w{!>~O~Ap_~FMD>^y}e1OGjADQU|5=VLfz&e_~HDD>_;x4_oZSGM+ zO*p8jslECmZ=JTeIo%~djwgOOe*0r9V#m`mwu!XY zFjn47E6%D+o&gI@luMM$#yfHaGb=Ag z%tkw?<~rN9trjyOwaO37Kd|NBAHaWGK9Q-at|m!7G`up;hVse88Zj@Yl zrfQeH@C>=P&$V+R40u9#6D|(A{R=qJ)yw9s-@WI@82;d;Qy37z*<)o6S248tIZcI4 z9k6j=%}_CE5|G$6N{ShgV5yd7$$lE|D3ZZU_p>AR<^7^MuA#RUi!eOJu)C}N zy%qLcdHTh2KvN}yaa!9&`E89+Y%C?_Xqx6bLE)bVa0gKHuR)F5I4|)bSl2wW4BmOr zoV2}}f$-?sfSxU@Xh^{8kGab}$5x79v=BI(FoXD$4%-S@`Y(BBsP71Q^)Ikd=-{P* zxG3fj?YB30;@moBsy~bwC#1zf@<#GdEkE#4a_thH7%OM?6PVIIAUu8|wpJOZ<2SR8 z%cUeV$k$SE5*XKt3Gj*<8t2(3+~Y+EfBP{1hbSPFI-|-E7DI)msgea9lynePFp#q% zb$9Y3jFoy>n-pTtP=6!AmS$yLnEZRr z98Atgi}f>%89t%AmIr%HLDGzVUM3Hgd7LN}%XOomC@3z%)N#i{ckAv;l~dfM2V2jT z69>x`sl;(mK=nj%03_V+^X;$1zRb!J_E0<@@hSm^>u^-OGB`*d*AG#D&_kOc&@bpM zIDo;qR2Fl(dG51Ivil1Z$b$g^*n+~I9YyrNBqmA2uJL}^oa$uw5c!$#+E6OT$TlT- zOwHQHsi8k5eTr@y4O%|UW8HnMI5H&(EcyNuMt8NkS)!k9Ha&65{cNh4ROo3+* zZK3_aM4;KKj~Hky5>>c{>+f1AZ@Df}-1a4i=e^~cA(N46#%Pf!9kBs-{O{>SBV|I9 z+B7MEH}R-{BK+0Lq&y~=jf~z5JPx(qbGAZ@O zN=>)uFTh-}Tyi8@CJ;xYik2CL(^g+{^?Y`0)XDN$GRqcL~qfG;t%A zw7$eVvsws}_Dg7XiuVJnMbx&t1_-Bw0p7a*hD;M zj%Dn#h9Vjz9?im2NGR9m-+*2-U?-Q5h2@}zG9 zO;0I;_R^D<5WkpW=)pv@kJf}Bko6%NP1@+a7jW-O(o&Dad`PcXdXv9zDg~5h5D>Je zPwL4;$o9kOn-(%#(`Smnpjk%e3;#0*Ya0SCH21ZD+xyadlWE9A#UerZVMvo-^0#Ys_N=#drim^8NQ(gVI&@#K+ zn1=v0O?abPH)nd#0*kOJd^T8 zGi8sq;jP>uwm@^ndRxL`jc;gcJ76J>07r`a?2g1mMqgQ~th)kFq3EUD z%IyE<4GD{b5*M9JL7Hq=N!jaZ@5<7NDLe@io-I~_&GF#R9l&Ll%G%6z46f8dF<6A)RD93XZM)V9 zC3frOP#x*X+JnD7qQ72C~=3!(eF z@+5U*=!^EODUp4*6fpDBtXxq!{6d4*@a7@M#$pDHFmJotmpwu)zQ*c zDd#%j>0yu)8wh=6WGVGhrrQLHCbk^_bW&XbWIHXjB@FCwhyh}GZjNg9xl1;G&L_BM za_D%3KRnpvYJ9r9dDKg*52wl#)mG*wZs(h+#1*6&(mOP7u5T+8#dyQ|v}QNczAeXP zox7H~?UH_OmC(RCAc&`ubZ?%vr;o5qx`i^v2?ou zOOxecW=^NTSOZmcz$Dy$)luMz3@<(Z#R-k1k?nYurI9XIMg+Cr+8?6er>`$+STPtl zH+v8*&62jY_qo(Dihg$QT?9;n+(`Y{W9H+NqW0Vjhy;o(9oCh6bE+c~wXP_&SvYT+ zq1I4;Iu#6TXV#}K7G~Tj-+dbUJ| zcI=e<-Q6ZJB9RLyEc#8U3J4qI9IGHB+iv`tu5#aR{YXCFVsQdH%KS_&AG-=k#F6M7 zyIw?Bq9i=g?u;u2bVPe;v?TrdWWj@Xkzf*2U#-8~&cwqG9MIyL6t9>q)|QP+3f#>_ z;aRwJr9}s?(jKE%wio{ZvE&vbXmt?X%=N;aSEH$7yPw(a?Dl(Jk5Kb%Iae>xCc_dO zbEj;+c;lElTXqP996!`Mxad$Jod1Qpm$w=&9AAN7B`pw#b^ci^K>XiWe9h<}=CE9koyVj|1OVKbo1Sli|3 zvgC5o_}q7?Wl{&#o}`Kg<)vRwK|NF*sA#BwzCaFj?4kf5?EzK2q2YbZc$`h_!{Sr# zvt!O&SfulJ(%}8mQ;n9?h=^?bBSWU8fw)={N1>|JNK z&Z7F;%7!YLry^mrJX>P6HOA^2zO47uH$s-z305NW>KaQQOkF>uNl)d*h*z3Aba^u- zq*58=K2Yqap?I_@Q&j{I`sPfVD%mZ^DCiU+;~RaVrQNg$G?beZ8>%8iNqK~lw>~YT z))Zfd;o_q6S68xNQP!0(nN1dGLl^qlBw0&awDU~d&%{rV-~{g<+ayvEua1L{oqrhx zLO%QV4Qgl=mI%KCl>`tS!*9>hLpyvatO7u*4@<$W}mjNMMuq?~+K zkEXu;!m>FYDCFa4OZxSkX;<=(ynYJ7le~$fchI~cN-2GdY4*A08{+t$-%`c;O!dbO z#Pt+N>lM>n8+awgFj_r7-z0TNRc;2$l75w$fsvq$`xG|~-RVswPw?+xw(sbZaKQMs z%NfHvM|k!X!tjUkVhHg=##($){%y6AT@o6B%pQ%nyz9!Ed^u~v9%N_sTV~^sy|c}B zkM3;QCkK4#bD!ca7>z z;4kOn!;7zFft=ca)boY z^f`uFc^*_8vJPl6{(faxn?1><8Y?#w%Ze4p19j-rsKne_L2G;kLlPQv?>75vSDaxDpc5L5FzJvo! zA8_1@%aTUk3#in7o~b#DigsL+!pJd<8XlY}mG5g+FydmEsaaW8__Io_|?dd`;Q9D7Um4~^h4b`7P?6&w&>}kK{iy4I%O_uEN!+3q6L0th; zR`nt|jhVN#fqmiLAJ#xLU%&Z%2t2w4%2@KCv5$ySHw}W22|xB#9wea&RhDk*I4&1Y zdq1QRoON@zc-$*h^%5u)@+N+=AAXV7Zf-NO5?IU=|Ms$scJTyBB5>Xufwhwv=$k94s% z2l@DKj{q!Ib|Ey%x%N-B61ih~XSiOIaNBMPw}~|E#E2;a*A(hB{<~|=4~||RCg5y8 zBeF3gvtc)tOJnKxRdJ|N=lv!SNCVx7ZtBwhF^T~a5A4{nN0MLmEpITZDa7;*eYB@2 z_MD@~xC-vV{Za3`E(f_l70_7V|cE)Y` z5KMmx(~Dx%K0+J?F?SX;lt65~E1WCS!LV?&L3~p(Kf_N67KJt+#JErxM@V zBXqD1vRn`=uM^B?aHue4)Rd4$3k*$O3R?cb)(1YQCDl164bq0_8n~W$kt)?wb%N0~ zb%KM(Z3uP+h<34)=knm%^i(rHdWKoxz`S>N1$zn@W!+JJN}B6r2Ma|25+*2KVA4Y0 zLLym7_m2HAONk~W8LBxK9@0W_b9~Yqid!Z);b(E;?^acBbHIKIB&t2>FTk!NKcl^6 z-6V5UvAu=q=ku<|sX_JGf@=9JCEb2IjReC~1XSJXfHhNtEgNUdQ?zoHu#IBV?Q z6D$guT`V*GaylIrwR2+pOXXMh(>kz}^Z56E8no9PW9Opct9xuS!d7+=#9^5{{5O}V zUm4SB9RWh;IS3cfk5j-nw(j>PI0@jtnH?J-v5u0jGMV^Dd-GeIOhynCyRenm z(j7(FvFk8O6PuljM<(}xIKx(=2IC=U9?L#11M8X9=#_Gzx#aD+QuQCt`1Faz9<2&UK29_8s?j%d+S>%Sqz~?e%+Pp)#pSnZOwQFN~mYGIu+n5*uqwv1tL$5D> zpTXOQiyW(@JDpI%FyPB4ca?)zUO2Pj+nls509dV~^{XgJ9z#5^Cza%)j(Nsm*7IW< zB=fPrTc@ZPWu9%tOQe3OG<9d_^cH@A)!+2%Q=uPZVrdNYmwtO!JJRcUH*WH}?#97W zzM>)gN`A1kFQLiSLp@iogwBDhcd_MrU+%7+Ss6Fqw#eu|w0aH2D+Q7(lPfaS1wC5p zF6}iZr=ii9MD9v(w@_7-7ps--6)?VKMrc7*GOfI)QCWV4SL(?2>^jHY)HaF% z?7C~pi0T$*?AZ7)nJMDNB;Qu?h+rAA{&Ps%hwd@!zX0|G>&Vn$MRcg2ZrA$lQ!B%ZzxdNW3aBK>f*%dnrR+k9>QKbAcPA7y4 zh-;86+1alQj+fx4P!_Kw9p=F|ka;dm9Jy3LB0R*wj_~KZIe*ZRd>nY3Asr9p$xIFS zI2+g`%!W<6!(5aQKCUCk?%*=(S$9LU(?+mV=#?-LLn=qTT(KM&&MusIcLZs0mO`)R9PKz#gKfb`#IIG9*C#M^Myrq4%4zAqwc;ECyHXG z(KSUt=N=-r<6Hb+f6^ztYlv(99eg~=AOy0$E!Wj;|NN~h@MdL4EKomc?sPYW%wnnU zRwLyMwTLA0At8Rc905h%C8q%-Xz`P^m#9%DHuj<|SgY%P&KVK-_948ue5X<$IcpI-m{kf@^1{3Vlc%$P$zZ|AP6+Tx6C6@igryH)XeC7LvxN-&Jpx zRkXEThuJ=~_Ho^*ijlad+Nr~n#ZZpX&T{ZbAD^eBTib~u`z^~JjY@gw8x8k$50jQV za}{K4<3z7PxXo5^I<2+$J#}h9Mt#vbN(L+j@m*d8e-$IOHEr#fM_%tj+ZP9ckuo8` z)(f!UTPnmECtAZG_4k>mnNg+T?WqhD5YnNm5)&Zt!iJAQ3+8W_I|w9b$`VLDIDf#u z1512A%Cs02Lr8fm!xc22kt5kqsGa=~<9>Il|4!TFig6g!+Kanfs_doM;iNjowN4q~ z#CGU7K3{06M$Th0;~W}{aE#abnwsNu)FCggT zLYWRy7jlNQm1vM>?-&==&72N5#F zP;&&fsV4|x#DLIgW*SyNjUKX$mXA2#*`D;999XP{ZSdDh(Z8Di*Q>HgFH6S_E#KBp zJa3~O?Vj0V7ix&pdx$(xgppiBbfuc#%iC~3YD4q!IuGmzchubKy3sO(GwS1HBrB=| zYHV|QG7Y_6r^kidzv%2r=qleP0GSsSh<2(Y0{D#_c_$g2e0U$o_6+kUn+%R|jKll) z0I)FQ5eHW%Obyp*dG*R9iQZJ4p4(zc|IDdmb(mgCul{?EXu4<|)^TNf(BVX0U+lUk z3Z_1aDm^|xqUntWj*hJXRcnUyDde4&_`vK`Cb2u)!VWn4zVIFkbNab@r!ZUJf|sjm z{1yHkqp~L?pgozKSdTF(UO2lU+q=Y_41<`+;=x)kMWr70Fhex@iQiqG#hWizmGEb# zqjnJ2H`Bu03FQKWgChfTdftA;7Qob7I&pR<5cboYjeqgyi$4WOb7@MlanL3+*jHg< zZx5wzuAVB|asMzD>QsE4x74@6`Mn<6DGyTgVLV+PhdA8O1IBxPMu?WR_qbdH2MQuH zRwVcg1%NY1l|b}s6#2fCWrGiaN07coHoPf|&=#aWRJ^1Ss6)m$g~-#SqgLb%C${Lu z*B(btwEGUw!Is_6p`2mJfsO>n3+QvlktcZIDwU$niL8%t634>yz^JuUIu!7DPAgiE zBhX5c5sgXq4=L)DX^yqd5TGiBvFX^yUB7A)Nm_~0>fM(_>b5%L+ z@`H@*LK6grG}~qjV1Fgs34Cp8D{a0rK&yoPYXQk#Fx%@e9XVE{-P5e!)jy>MDQVrf z8ZO-vb2QrXeB=9$fX)4YNsK2%RO^HCV;=^}`PZ#-LspJk;fR@x9g}CW@?Mtgo${z_ zwEZI(Cr%Fm&})5$R`UL?n&Jx@G-E}@=OKo7< z!d4$TBM+sk?$o@nPkLuq7U_fnZ|mhv@#_kNgMBHV(K=^$KXqVdY9{9mR}#H@8H&+W z*TFM;_B3Bh5WUXs4M0aS7QX+*X&HS&ASt@i+)?KRMh>uoYR~xyZC%R-#=pby{|%1C zumN(L3$X1-n%{ot!xFlhR%L4Y(AvrAsE)gyrJ8#k^Y`jto z%uh1YK=}iL=Fb$oj1tae8ZTPfuoTc|<*n^(eCIoZGFNxo30Em~qyi}CeP~!EnktG1 zD0lBF;{tM`*gUHerAh4cEeD)BroD$48?PCq`rCsHnb@O#01Vyo2TrW2#}n7WjzFn} zZ8IXj1j+?+nrN7loh?}z0RPh7clXEnh92*eHA?cE00dSkA)y*1v#6v?*sCpzq)8U5 zx)GhQ27!8d4PH`F6W4pRBSRCCt9g|~uQgqXiRb6CD|j31E1P;WI#GEm!y>=k?*>6S zygg0mf+qJTg-0u>chrb9J+W*iSgDp2!ClW{{zZk2gf4vv+mARs^wgDAGXvyed`ECnG^VK*OWqJ24w9RAl_6g~ZIX{xq#KwQ23uW?j@0aiF)Vtk*aLz`ul#9D~+B z7Ol0MoI5)VGNs4ScBuMmF}mN{&>|>sO3UfGN(0MC4VT^o_)(KlyH;HU)^S#?Yp2mtKpndKKA2GT4 z4CZbjuHsH9s;thPA(M<5VhT9GX(>;;uH=T^O%3-B!2g{y zum=pLg$4s7$nOdfXzaoL_J<;4E?rMDN1bDrt(TCpvSs0i4_;MVJ=rOmBk5KxP_tcH zp?OqopdQ4pzmi_qAeQychsL_$76PjhCar zT8!@*FeR-1d(gaW6|f}s^w%hL04i(;aZ3+Y5Ann!D@#`n;mtM(n_4$L90@+2zSteQ zPqMhH;gj3C*l%oHZR4=T#kj9=vntH`?3I-kcT+HvEVjTD-Plmhp#U^zo6*NE#y4TF zybC0~N?@(#l6RL7Xj05P5lD7ALs1@R+H0LyH?nBkD}WAkiT%qPjx(ub>D$wE_+ z6A|&ih7bMxiCm=&v~u8NM!gve#jq9lFo_5RqJ+hKEW>V+kelC{r(N~jJe<0 zOSU=Ou)?kh{AfmMcp_IK@+$*BOE_Ejf?k`r*O=-pChm2}N`!4I3WX}`@KWA;7=kqr z1{}gU`#r&c)S<`uoaTEKY*!uaDe@9>I?X(H;UZ^n;(q8HJ!nt8-=z~g+EagAR>QoK3%esV zjt`$JXPUI)A<)kG^t?7P+(v}SW8i_gQul#Z!>de5i#9Fh+ZQ_;4bKp1HF*cIG0)Y` z{`*^E*FKl_FQhBdHun;#*wfDPA!LwWMQ*=H(N>!r{^%fRbmnirwEC1$?OA6xMJK~-{p&c4ye*ylv_Om(oDrW>{*zV7naq%;u{`u4nyib>= zOT*A?=j|c`3Jqa?rlGZN+*JNzbX?O+>d@3a2pK106e)jO>7jN)u5MDWV<)dX`XrH= z6K+Lp>wPtiSfj#c1(Et(=BAdG&uZ4LlaBd|($o4BIl0A#mw?n2X^oaz##wBZ2>u*nYzB7D$ zqoP<&X#h{F@Bple=_n|E)V=u&AYL_*u}UIwrrdMHQS29JVU;sDOXs9DMY86pKsheag+jHzV9m6419@R2FTTodKN&QUl+moXHpLV*#fa#d9+Nq9jhkC)(rv3E8j%{;YV>_9HY*kk0txbhvd`2`!gQmMy_AaM=(CIt;&gn3#H)0+mngTt?Iqx%@D1A^c8aMi z04-ozPC-uI-D0^Y;GCpyl1j`C*_y5X z*8M(wVjKpGz#lSc`uJ1~TrHzIjvFJEc|SMTY#;5)ajSCr1@y#;Vj`QISqr;M8f3wl z(t-YZ_gT*}O!$W1k;kJKUyGK)SW!rfJP@%Pwo>t#1gXQFG&7g~r{ngLkj~ zmL4Xb^`BNWP?8r#w?~iezm^;0T1*X(Bu9ruCcVD^z-x;5XVWwd%&$m+-~?^uJO6b_ z?{3NOvMxYHTC}nf<4j_Y{r(;*50!iN1^OqBFQIx{dR`-ma-*$e=mXO$wI-v?Q#7y> zJs(qVsMaBuH5tF*l$qLzdoQ*S(1fJ?hgGwLj@Ro^r3X$Kap2Ui`jvb*tg6B^gRdeb zAw$Xol%;?`%D;Bo47$R!$}2k*30VgFMVVztGqu67P3Z4@>05(@=`EA%X4Ef*0mNAZ*)mqxamf;Il^s$JEaznRx96OI%*jg(*!$hYl?00 zk7&qP8^E`wO1cw5OxIu>+wT#K8+@Xx-gQNVao~V<0=l)j|GX$YpzZ!ucZ!p9C!Fev z5_kUR$+yqN?`J*69gYK^1xbG4YgUYV3F>r?C##6f=4=e9aF?iW`Wk9@sk{APmm@{Z z?9E=39ueEChh$ship;4D@>`KEuM}$Z_k-jVoc9w~cyl$0TS|`z%@7rbL!dUu$I^ zk+f@#k{!l|l(p$X0!8WuoZ9C2DTwNmKf+qsr8EvMY6M2rf@TJ&aUCgV)-wlw$Cdsv zUL@IVqcv3h3qU_Bcr$Y9<~%Pt%J#c%QTtSPvk9}X^}*E(m8V9UxT4S%%agEX#B>PE zo$&_B?uLiZzGa7IFB#>SGge%!ohwB)`6*R?DYKKh{TOkoH)*0)Qnyz*jlD+A zBd8zoQx{Grw5GTrT!2IgAV?A+aJZ}(Mk=US;8)`&D+>riU?&bfO2UNtrs{?nY^zuL z{aaVsR`3t_BiFyMl`MyHc&Y3$jynaF7bX%7dtF_0(Tax*l`(Cv4S{N;#eTVeYSKXX z;_Y^q(Iu_z(Cg2tOdaXVS3Hm;kS3JVkQ5qB0m)=adrR?kPa+#Ku3A9xU?>Ijbsc?z zO4C)4YIqW^AdQUwuVuN4KhD5CQM+~)xV=dC~;{1~AUBw@bJBy|Qo zwWO$zEhYagwj@d01%u28sJ4^NDd<0VDoVbD+esB-D2jk_S2TS%-rN9w=X&d-@b#*w z%JW&uO*;^d0$JTa!g_M+lN4&?MbtBZ`_*HPikT`hleF~T=P=xZ9AruHp-F2`V~sxYbm zrK-Q$Hk&v3@#FpK$xTq+>cSYNDF_|Eikzy(3qv&q!^Qg!ngPb_@mz+T4sBV%0E+57 zT=6A{P}z|C_O2q{c@`#BZYmY!c8z0YWX_kv*cNM=)dX(qSei5Kv|7LB6WW(8*>^Mi zLcpoPu3>-H8sFC&DOeHx<5v_zCsV~-wi(4z&MNJ~`j-ns;Vf3oxKSyi$~+Lq=-w{0}Mn(6!}G-|{-!yj7Yp-kK#t!qV?)mcddcNG(j z)`pRL-1ILoF`dG>zZu-c{gh)23o#hQVO-waq(zo@1bfyU#mv_-Zkk4O?rHnd+(||{ zka>@Sxj3tuZPB%zWNhs}E926sfyGKjA{DYBn|j;=TU5A+Wmk>ExHW;W=C4_5EfgPT zm~V$YJBpoc?49=uq)4%!o9_>7RW))`u|^9SfWLHg_Ngu}5!dY2 zYqH#RBz(?&O+~87BwA`jz!#I|_X|am7d6UqPVA&71J;;9J9#AY*0Yt|UF^I-~v^cO*M*OO>3@`?uM0i&aJ1HlQ^-KFk>Q9v|$&;?o2{^`c z`B4SU;Er<)uaZuT!GVT;d zaKpLgwKTsF&!)rW1X&}_Ks~CCrkHr79rC8DZDWiI);gmZq;-*aqIs0ETc88pp`XQ9 zN~C#6D+<;zsBzson zzPWEKd1l((2tAEvS@@n9bks+MjFGOzscCnA*HI5q+t6xouoK#iH$|_`SrnlzM;*KCkTvfe4MYodIdjLu4 zTGXi+EleRT41Pz+qc`Y){g#SBV&V)x{*V6L)7%r3_jvUkBE+wBw6KtGj_(l8lXYzFbx$L=t)C zw6)1M0;+kedsHE^b5xduH>q>IUbpBgJXQODx+;+}E+)hGy45?7qEWV->~~dnIh0hL z7WYRF_1X5TS5la*HvyWer}xI4e{h1|VIwr^E7<3TmkS+9fx#H7GtK6W)sF!Oz71$6 z`mi&amjs>5i_q$P8bEpef~$DRvwax<0H%M|scARH#htq_s`|C@zPJv13|7&%DbFPN z%%nfO{A+!#k{vh)I2f!2{{UUZUAjXxutA#6q&ci>P1%uK5Ym!56Iv!{zzSFcS+(c=bJmB1+)Z7k@XhO! z(0^LMn3CY1;yEA6n2`o~Cp`r{_<=U{B(bQE1%*v8+VQS93J3N6v;huII#QQrRYHDM z=qW#hj^NUA6rPzh0Vz^K9^_*bC~Su0?eFhTbB`$cfAy&lki-MP6u_J}&fA>r1LisV z-%7Tl?C^`vF_qcANWsAg*yrm>WoWmOEwP$7b|09zz$21QeX;u1h3?5%!Edo+kv?1= z2vA7Jd}Mxf0hfCs%Xcd--Hh2#pmaY!;<9MjGJCZT3D05=`TXhD%@TpQ z3RyfYl^{D4!$TCSj^;k_N&Aj5C31Bh}V+ghJGp4kmCb<=d zrKyl)R5y{B*9NpAx`{TSU@9F*B#ZKOqnW8#$Cpc(`5RbznpJ(Ek6I-_i<3=49C2Eb zix9W~=A&i}ARy8e+`JqdR4@Xq^Hg$ca=ET(q4{dvxeBK>P7E;XS0IZ$PZZk~%(;*J zOh!FxMnjnKj@6xXLSK!&t42Jy$rOPMNu=5oyA>UYr(0aCSE$TD!KmarSk`UAF_(Ba zp(M5(uO(x=yVW3TTm~5;soLtz1UnS*T)eZqaH$;Cn@O5Ta@}er1ue{DNg;I^jQ4Ek zsj9AeQ|=G%IjEfRM#n@|k*KHr2#;#OAM2azTS(vNhv`_O=9uHwtqGk4xo@(r+Ai)| z+SrrUp|!f$s)SWdW^(vd=}@)Mrd5*T&TZMrsbCAZ1KzTUDJB-K2}+I||U6O_B<$s0^~W?^7f+$RPl?HDGPeN~jxY6=6*{Bq=)*Oo-9s4n;>{Zf-7? zFgWUdl;VCytJ*XoJ2$vLenYi>pXd2eEySLMEox9^NL1$;WBn^3zGA;<)d|dU}2p zM&~Vd@P5~#nzbJO`%Q6#AnvPe{J&e6vsy=X*4zE#BEAj30YV>tBx06nMyFF=yr zCtu*kf89U*dTq40G`0>VM}_(}RQ^BxdZ`&`+{WK|P7O?vac1mqxkt5V!Qty!q7Jh# zCz{5#lPW6Iml8yZ$mC>W0Md)IDr)FmQ%+k5_>*w=s&;WL!}(rX_;vuM)1v$eL1?1m3=b+o( zq9j0scNB{!mO!ZPfjDx0^%emlxFPc1m1++vSji`xXB9#Au1NH!z;VyD0#3!4X7c4L zo-1a<_smpRHpln5t&K9^M*FkcvZ$Xfg)Pe3ig|j5J?j4e+Eyq4?^(Kxq3=U_ntjPH z5~|Wl>0D{r&*S0@n~RtvK*w&`)2t3MKbDoxmw)HAp5D$xy% z9OTv8Y?K6csu|#ly=F;TC9p?w!47%NHWP>IQlIs8S`+h;?@1LWa`49dlUAc)>MIWQ z+&BS<2BKM{RLEob)vXC^=r2Fj0y|Q`en4v;E4dy#G0j+8rd7b{O8Sp5kEyHLt8BDL`Vze3-kCj4ZbSRNdb{)ZQEW%rvHjpz z^Ay<*Un8d{^)!I_S0I88-g8n=`*qtim>`7>{Eb(~?#~?>t-u2%)Po}kNc>12)~le( z5IUNoMgxQ&T4~~*oW|dsH1wo0Xif*z8UX@4 zU~|dr0O$PuYP-fQXMMwS1|ToCYD-5Y%lYZ%pSl}>KgO66s*5|bZX{V9hFFe+)A6Qi z3$pA;KJ3aH@$Xe*62*V}&~u!Ud)BqhvAMB3Mr4GRUvb=iU&@mjA+?sSN=%ln2i{+p zRzxp~(YBior>Hy{$k%fuv36scvu!8|f@zm9c@jDgUOtqNrbj($$V2YF=pvv5k^wZg zJGRtut2Pg%3>N0BOhg!36ybn9YFh%oc?(Dz+N%&yWOwUK3kAR#G>E=o&{93rOs$pV`&Ad@XT2uEKpCaVjeVooc1J$-USo#GwLc&@2elLb z0IeTNrMZl@BUsC^z^ei^*Z~yy6nWrP>&Q_e45J36$g3HW#sC<24P@%3_ciB>egJra0dr#Vc^+Q==ce zA6l)EBW90g+PQ4Fi!_%&Z%VL0SclT4`WJ0RO#5S~Ezi$MJA9a?z;M+|Vp!{}GiT6K zZO||v`clk!&$T|^7&I_jkt%Fv^s8|wXo;v8e6?Z&h^kp@a#a9AO;8Q<8ou0Hn$G~> znh;2MKOy?kH{2B950q+4SWNT77C!TH^r|JD7L#q{*hZ&@l!AZH-4A`;Qs*VL*9_f z5P!#&(e_dLibZ7dl}h1&CwH!C*5Hd7`1{3i`P5RC6G@Ei85pJmA>=UcgGu+e^)%=R zSphvTX%})xrB5J&C<4X4_+(%X)?ZJpKK}XdZ=|`Ai#fmzjAx8hi=C`m*wWOYDqX~n6~qS#-@4YNjEt~HA?ga} z`5Lez1QNg;j+F!v?OmApN*o`dq@~Tc+<8phLfh=u&WraC%)d%V7={Dhw6z3Tp+`Mb zU{-7+6Ky?>3~^D2@RBFTyspRWdyZ1Z%U&!J^_{{r*739s-8_w z$&6I8mcv)ADIr^$Me9tP?$n`{7_K<(~6uN#03K({vv3c<;T*M@VNq;Cp%BA1hVC~Hv+HfECd*= z+kcWk?06=oznD2x2ZLF)sdvzg{{YnjYKb{xS6P8TzSU1|17@icA@DvJ^TsO8xyxp$ z$NXPPo)_A*$u(8JQBh8EDjzt2DTYGC3PUSS0Gfz0X3Z?1w5FEbcDW{~R@9bkw8$z+ zja9V*d4stFx>QwdNyPy{;;&XuL2L7CcC z<6yx0nxp27R_2zQEftUP64gkSTTlco&n$mR=CAPjlZNCHb6rHhBtzM2mb)0gEP4_} z3{l*vJZ};y#z5dO>({+ia5s<+Yh2)uZ%VB#nmNk+rlm5P841Otfb`07RUCrudm6qX zl_6ydkVxcv160_Rjgax2cJ!*atTx?@X?>AH0a4x)=g}ynkA>Mg>FIwYbB;BCFXynI!O@ zsQF)^9MsNus@4PjI^q8S+Q;ccHx%|KF@}q4a5IBgt_(M98;ly>khbYK>T)YDR!qjT zk%B%`{VPYY5!|+uV+^OKAk?#BY%m{qRzxzBWg+gWYSpF2`*DLxF3hRM>f@T-bJCuW zMyE9!%yChP2|a4=jM66&Cz+nq%jl!>zE8bOSsQjLIoO5GNbFONFeC-4+^ZN&3WGd* z(8QIdz+OD8R7|;AT>OMmZs|Z3+ANVxSkCTh$ot(W2d5MWNKymHHk)P z>k`uL6y-kD#5|(V5kcun3CBuaangVzD!ckq(E&8wtX_pzJ@G)US&j()Qp8n*6}UMh zRYH-zmVS2)P** zFO|U}fsiitBCN%3&S@10#}#HFFYt<%S|v?C%mZ_Drb}XqI@G`E8+u}^+$A=q+2dyW1ls4gm*R@nx5NnOW| za(Vu=;7r*;NAFaU2qPV8wykP@#WBYPaw_xNL~fm25rf7(ahlE7E}kfbpp?9fK4Fd& ze~oBnwPr20O}xq5VX1Vc$RoBY1TKV_iQeOB9fe%dq4Ki7d;87URGQyG>^*6NgH|Le zSm0Dx9dTMTVwmX0dr@&8?)V(j;XLpvd81%})YzuXqK7mx98~N%=}1QvRwm_br)kKe z80}Mm>rWwA0g5aaDuOf8o{T*zUn~l8q65t!x*riz+<{gBh;>m+i^~SBN92>p&1EKO z5}blFovT%31G3im`#2wS^s1Kz+~*6A!lg*36A`nXl)3pw6=qF@@loJnwKK5T`8_K} z+(ZY?qN>IhxvS7y$1VdND>*YrqU1?x>%yru6wwZRxK+NDcHd987&Ub*AWm^u+|tJ_ zGUGd-#ZZ)?{{WVFuEykAfOiG_>lW#4NjpgV>f<6>vCpGU!wZ^Mg5aph#b1o5UZS5N zC3=dxkz**pz^G%=kzm2=RwpDjGf@nl^`anA8iP*?pwkp&)Sz=r2XF;7n;oiLbfz$* z1VPDT$7+l_cdId?l6dV-hB&u;_{B0=3|A7ye|B25Ak=S$1{ja`YUQA@Tx0@kRW2-* zakKQGhGhM^V!4zMK9yE$k=PUXR<-5Tsayr(vZbB_!mThxH=8YyP7ez`Ob7IVBFH)D}mXAIaKYDc$N(|fiLrEZ%sX5OKF6!4EF zgRwa{`c$x8LLo@YfrZ8o70j6cIYL1l#Yr8+>~XxGuQgZhMToB>Sgxc+KQ3|z^s3wX z16JriM}fpZ|_5rh1yDF;7!e>!4vc{JC>009no86Mo!kgjB3m;w%J zq2S~kQ{$RU^~oa{G|-wYwa)f(iMM&qd(ubLpFv3A0;ADDr610f!4twdRrm)YsYELM zu>IowYD-3oe5e5Qs?rlv%y3Amu4-7&kihp>NfLMK^sbX_*ckJo0~p~y`t_5etfny!m;b1Y36O}jpM zTd6*nt$}c{t_&vw&{9c#8A3LZ^`lk^*yW?qXB&i)1YVynIjctAD|kYx;1AZVT+Sam z391t;r=7%#sGyXaAaz#c3{)j~!4&yJ4wN+t#O@WmN?9s!==c9N^Wt z65-Sm*%cQosUbP2&m%daRdptqS%TFQVRFM1q_`s@qAcFDyPu9|xLAJX$>NuB$l{|8 z+2*8;`RPMpVrWPwn!gB8a(Y#GQC)sfhN!St z5$t7OnK4zaptAt7Fsx&1nzI^LOq^63hAPy?Je|0x0x7N2F=JOJrfWjgr5FKCR*F1y zBDAemV}hYgMA=bBy@JZ>Hw+rJC7jYJUF213V|W1JMOwx49G6fl17j-ZNSA5Lwksmz zP1=6>uA<^e);>sMST}c4s~n=@t}Wb_m5MRL76%52p+#N^rl6D{Ecg{1*B}gJwOyGz z6z5T%38+U4#X3ntF*rX;XPL$Ttx=mKPrXwoT7_8pRLE!%HAO38o?4-HO!GnpA~DJ5 z0~I_7gyq~~tA~hn%})#4XXXUeq8Ynk_9P=9X0{XTte90^Yn-;avyFz>U5M@0opq~S z5Jk0%s``;Z2F1isC^?7`Sl4kUB_jYx|Z3s}zeK#EgSkLf15Uqa}(j-5k>$i;S~ot1y=&5J9J5ysvudImhFk zDtmbu8yFd?sH{lA=C4~@GpQ|(I`d3OTdnd!M&NtmvR|!i&nycT)s44zIjnhx9Ffq} zrJ+|4HaVs{e8!CNOk>S35Sp6WJ@N{Ka%)1-Ff&PwA+OA@^~E6TLmo?doYKe509k}| ztqWoM#i}rh(12iOkw}_W$vLX-*v&oKoo8$>Co!?Yfs$z@cVKSHgpLqhuE3Zr%t^7Em!IqObITRag} zu-WNPj2zI|>|cUebAirk$CC260UL3sbk*H1&_F)*rpE3$u^*Pl*0G$LE-|>#qiQ=c zq~fd1WpxMqd;&#li=AXefRW;;UB0C)BIQ11?5D6R(D{D`9N&WHw4Me5nR8adpbYm0cPq3|veOAh4 z$&`L{uv*wU<)cy$wN|*&H2IjUOSO;pc&u*@#+GHd-quw49CKJ#)@!)zeZbULI%8Y8 zRJmdGtm*#M3Bb55k9xSpZkU^WQEmYmE(-=8^sctMNyrWKrXYufT$UcEie$sgeX*bo z?b42+(9ODzJ=>AFs@pvcO*C6%Wo{ap2ODq)y>5({D*M#YpwB0YhzgkiphB3(I6PEL zicd8;QR`7Mu733h7}bt0^>*Ig)=YDQRK@|oIja#yhnAErUW7A#*2>jz$VNw6y)E61 zy74Lo^up)<*~`Db7`7nQ5nU-X#nFVJkZSgl^G{Y=9+dZ41=1p z6K+yL+6S#mHbf|r1M`a0wUSiFmHO3q)sHBrtAL$Hp?%qY>K~`c()AHFTUN zJ!)A!F6&IFc zfm-s|HMmk-vU&=tal5&VX<1lwWuutlKvuM&)FX&|=*)eEXG0o1;4o}`D{kFZ5EWzG zK9zDtQDhISZ9nRnLH4TGH|Z*6l;i1JM&URHAU>k1UQGrG+Mwg6DlBN3&osLZVO;%c zh2*kKK5eU7GJ|sFIM-qItoyrR1c4d+!;aL|t}`*BB%QxCL}FpoVy-;o9iVL$3o$2? zn!6zp!bENx8?bsB(tD{TRWLvhkM7kNz}@o$k5N{F%Nv0K1d&kRVT&P(@-}I{Ntd-{ zvMAg$(xsWC6Eiyv;O7--);rj@Lxqu7=3iQSi(-M=Las5-CYtIMh*sP^X-L7taf(s5 zVF2^%NUMz6NvEQccoeDtBRr2vkTUgAx1NTOT$T`2=QuT`V>wBc&Sb}7%}|XTjGmRH zY#kJNF@XKeXH!+7q%>zi7OxsZ^F)4_tldviSq5T>vGk|M=Wg2~u6;#Uxmog6Ry~eK6a1IS=S{X(Fk8r9nLK;o7 z;ZAzim9Lo`fns1!OjO8mIt?_-z%lLm)}jnI%!^o-vd)j?xf%57SK4?G1(nz_;9%D` zQ&wENf+G@WZT diff --git a/models/Reference/tempestByVlad_baseV01.jpg b/models/Reference/tempestByVlad_baseV01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2db7f03dad44f2053929fab2b335079cbcf67dfa GIT binary patch literal 76310 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%0AP`sZ>z?2aTw707?)j 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�I`u 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%0A)XTAfkT_f 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
    5p2EMU0cyzkdmg>6r3rw5y%Gs-rZh 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´+@Nzy zx>Xx`b3K`?dxiaZ!ka-5V zDS1~XIi&N8j5oL*DjTUC0$DENwqqzEWhwN{C$?X{X$6wLeF>(7$uinf3Fes}-)Vcr TN{@Q1Grw>&Q*^d&rGNj~jt|HU literal 0 HcmV?d00001 diff --git a/models/Reference/tempestByVlad_hyperV01.jpg b/models/Reference/tempestByVlad_hyperV01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc28c29d8cb1dff74816a747976d42158bd48520 GIT binary patch literal 84660 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

    ML}kryq$!b8FrL2FIVZ#8FIg!D??P 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

    s| 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 LTGjxz4A1}BRQ9|& literal 0 HcmV?d00001 From 201ca283005806fdf7e6ec836a11dd4e4c430f26 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 30 Sep 2025 14:27:43 -0400 Subject: [PATCH 105/230] improve ram monitor Signed-off-by: Vladimir Mandic --- modules/memstats.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/memstats.py b/modules/memstats.py index fdc94df37..1bb83998b 100644 --- a/modules/memstats.py +++ b/modules/memstats.py @@ -54,11 +54,24 @@ def ram_stats(): ram_total = 100 * res.rss / process.memory_percent() ram_total = min(ram_total, get_docker_limit(), get_runpod_limit()) ram['total'] = gb(ram_total) - ram['used'] = gb(res.rss) - ram['free'] = round(ram['total'] - ram['used']) + ram['rss'] = gb(res.rss) except Exception as e: ram['total'] = 0 + ram['rss'] = 0 + ram['error'] = str(e) + if not fail_once: + shared.log.error(f'RAM stats: {e}') + errors.display(e, 'RAM stats') + fail_once = True + try: + vmem = psutil.virtual_memory() + ram['used'] = gb(vmem.used) + ram['free'] = gb(vmem.free) + ram['avail'] = gb(vmem.available) + except Exception as e: ram['used'] = 0 + ram['free'] = 0 + ram['avail'] = 0 ram['error'] = str(e) if not fail_once: shared.log.error(f'RAM stats: {e}') From 8c2b76a8daef339a85abe465268a1136e1421d67 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 30 Sep 2025 14:36:55 -0400 Subject: [PATCH 106/230] add buffers and cache info Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 +++- modules/memstats.py | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cee8bcb0d..d48bce68d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-29 +## Update for 2025-09-30 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -56,6 +56,8 @@ - **interrrupt** will now show last known preview image *keep incomplete* setting is now *save interrupted* - **logging** enable `debug`, `docs` and `api-docs` by default + - **logging** add detailed ram/vram utilization info to log + logging frequency can be specified using `--monitor x` command line param, where x is number of seconds - **ipex** simplify internal implementation - refactor to use new libraries - styles and wildcards now use same seed as main generate for reproducible results diff --git a/modules/memstats.py b/modules/memstats.py index 1bb83998b..68a7d27ea 100644 --- a/modules/memstats.py +++ b/modules/memstats.py @@ -65,13 +65,17 @@ def ram_stats(): fail_once = True try: vmem = psutil.virtual_memory() - ram['used'] = gb(vmem.used) - ram['free'] = gb(vmem.free) - ram['avail'] = gb(vmem.available) + ram['used'] = gb(vmem.used) if hasattr(vmem, 'used') else 0 + ram['free'] = gb(vmem.free) if hasattr(vmem, 'free') else 0 + ram['avail'] = gb(vmem.available) if hasattr(vmem, 'available') else 0 + ram['buffers'] = gb(vmem.buffers) if hasattr(vmem, 'buffers') else 0 + ram['cached'] = gb(vmem.cached) if hasattr(vmem, 'cached') else 0 except Exception as e: ram['used'] = 0 ram['free'] = 0 ram['avail'] = 0 + ram['buffers'] = 0 + ram['cached'] = 0 ram['error'] = str(e) if not fail_once: shared.log.error(f'RAM stats: {e}') From 03382bdd4cc4644c0ac657fafda9b2bbf9ef0038 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 1 Oct 2025 01:35:51 +0300 Subject: [PATCH 107/230] SDNQ simplify check_mats --- modules/sdnq/__init__.py | 3 +-- modules/sdnq/layers/linear/forward.py | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 1a3686ccf..450b43d43 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -172,8 +172,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if use_quantized_matmul and not re_quantize_for_matmul: scale.transpose_(0,1) layer.weight.transpose_(0,1) - weight_stride = layer.weight.stride() - if not (weight_stride[0] == 1 and weight_stride[1] > 1): + if layer.weight.is_contiguous(): if devices.backend != "ipex": layer.weight.data = layer.weight.t_().contiguous().t_() elif devices.backend == "ipex": diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index d404966c8..18009c27b 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -6,11 +6,8 @@ import torch def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: - input_stride = input.stride() - if not (input_stride[0] > input_stride[1] and input_stride[1] == 1): - input = input.contiguous() - weight_stride = weight.stride() - if not (weight_stride[0] == 1 and weight_stride[1] > 1): + input = input.contiguous() + if weight.is_contiguous(): if weight.device.type != "xpu": weight = weight.t().contiguous().t() elif weight.device.type == "xpu": From 1fcf12d8747adf1e2482d5ade015346db02b6dab Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 10:24:20 -0400 Subject: [PATCH 108/230] lock diffusers versions for zluda/rocm/directml Signed-off-by: Vladimir Mandic --- installer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/installer.py b/installer.py index cb3153b3e..a2ec15fd2 100644 --- a/installer.py +++ b/installer.py @@ -609,6 +609,8 @@ def check_diffusers(): install('diffusers') return sha = '64a5187d96f9376c7cf5123db810f2d2da79d7d0' # diffusers commit hash + if args.use_rocm or args.use_zluda or args.use_directml: + sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' From 5d0a3e5e8a2c208169acf6467add2946bf5e73ff Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 10:58:52 -0400 Subject: [PATCH 109/230] fix microsoft-florence Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ extensions-builtin/sdnext-modernui | 2 +- modules/interrogate/vqa.py | 17 ++++++++++++++--- scripts/prompt_enhance.py | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d48bce68d..db8625033 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ allows for using many different guidance methods: *CFG, CFGZero, PAG, APG, SLG, SEG, TCFG, FDG* - **Fixes** + - **Microsoft Florence 2** both base and large variants + *note* this will trigger download of the new variant of the model, feel free to delete older variant in `huggingface` folder - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load - framepack: patch solver for unsupported gpus diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index d034f611d..e56b4f695 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit d034f611df9931d87059a8256a2c77cc82f8e11c +Subproject commit e56b4f69549e6654c953346082ff3947256c9636 diff --git a/modules/interrogate/vqa.py b/modules/interrogate/vqa.py index 578c96093..5518ff803 100644 --- a/modules/interrogate/vqa.py +++ b/modules/interrogate/vqa.py @@ -27,8 +27,10 @@ vlm_models = { "Apple FastVLM 0.5B": "apple/FastVLM-0.5B", "Apple FastVLM 1.5B": "apple/FastVLM-1.5B", "Apple FastVLM 7B": "apple/FastVLM-7B", - "Microsoft Florence 2 Base": "microsoft/Florence-2-base-ft", # 0.5GB - "Microsoft Florence 2 Large": "microsoft/Florence-2-large-ft", # 1.5GB + # "Microsoft Florence 2 Base": "microsoft/Florence-2-base-ft", # 0.5GB + # "Microsoft Florence 2 Large": "microsoft/Florence-2-large-ft", # 1.5GB + "Microsoft Florence 2 Base": "florence-community/Florence-2-base-ft", # 0.5GB + "Microsoft Florence 2 Large": "florence-community/Florence-2-large-ft", # 1.5GB "MiaoshouAI PromptGen 1.5 Base": "MiaoshouAI/Florence-2-base-PromptGen-v1.5@c06a5f02cc6071a5d65ee5d294cf3732d3097540", # 1.1GB "MiaoshouAI PromptGen 1.5 Large": "MiaoshouAI/Florence-2-large-PromptGen-v1.5@28a42440e39c9c32b83f7ae74ec2b3d1540404f0", # 3.3GB "MiaoshouAI PromptGen 2.0 Base": "MiaoshouAI/Florence-2-base-PromptGen-v2.0", # 1.1GB @@ -354,7 +356,6 @@ def smol(question: str, image: Image.Image, repo: str = None, system_prompt: str repo, cache_dir=shared.opts.hfcache_dir, torch_dtype=devices.dtype, - _attn_implementation="eager", **quant_args, ) processor = transformers.AutoProcessor.from_pretrained(repo, cache_dir=shared.opts.hfcache_dir) @@ -536,6 +537,7 @@ def florence(question: str, image: Image.Image, repo: str = None, revision: str shared.log.debug(f'Interrogate load: vlm="{repo}" path="{shared.opts.hfcache_dir}"') transformers.dynamic_module_utils.get_imports = get_imports model = None + """ model = transformers.AutoModelForCausalLM.from_pretrained( repo, trust_remote_code=True, @@ -544,6 +546,15 @@ def florence(question: str, image: Image.Image, repo: str = None, revision: str cache_dir=shared.opts.hfcache_dir, **quant_args, ) + """ + model = transformers.Florence2ForConditionalGeneration.from_pretrained( + repo, + dtype=torch.bfloat16, + revision=revision, + torch_dtype=devices.dtype, + cache_dir=shared.opts.hfcache_dir, + **quant_args, + ) processor = transformers.AutoProcessor.from_pretrained(repo, trust_remote_code=True, revision=revision, cache_dir=shared.opts.hfcache_dir) transformers.dynamic_module_utils.get_imports = _get_imports loaded = repo diff --git a/scripts/prompt_enhance.py b/scripts/prompt_enhance.py index aea0e5730..221d815dc 100644 --- a/scripts/prompt_enhance.py +++ b/scripts/prompt_enhance.py @@ -159,7 +159,7 @@ class Script(scripts_manager.Script): trust_remote_code=True, torch_dtype=devices.dtype, cache_dir=shared.opts.hfcache_dir, - _attn_implementation="eager", + # _attn_implementation="eager", **gguf_args, **quant_args, ) From 22074f47272b812ba6efed48aed8a2eafdcce755 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 12:02:55 -0400 Subject: [PATCH 110/230] cleanup vqa Signed-off-by: Vladimir Mandic --- modules/interrogate/vqa.py | 25 ++++++++++++++++++------- wiki | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/modules/interrogate/vqa.py b/modules/interrogate/vqa.py index 5518ff803..e1a9a095a 100644 --- a/modules/interrogate/vqa.py +++ b/modules/interrogate/vqa.py @@ -13,7 +13,7 @@ from modules import shared, devices, errors, model_quant, sd_models, sd_models_c processor = None model = None loaded: str = None -quant_args = {} +quant_args = None vlm_default = "Alibaba Qwen 2.5 VL 4B" vlm_models = { "Google Gemma 3 4B": "google/gemma-3-4b-it", @@ -90,14 +90,19 @@ def b64(image): def clean(response, question): strip = ['---', '\r', '\t', '**', '"', '“', '”', 'Assistant:', 'Caption:', '<|im_end|>', ''] - if isinstance(response, dict): - if 'task' in response: - response = response['task'] + if isinstance(response, str): + response = response.strip() + elif isinstance(response, dict): if 'answer' in response: response = response['answer'] - response = json.dumps(response) - if isinstance(response, list): + elif 'task' in response: + response = response['task'] + else: + response = json.dumps(response) + elif isinstance(response, list): response = response[0] + else: + response = str(response) question = question.replace('<', '').replace('>', '').replace('_', ' ') if question in response: response = response.split(question, 1)[1] @@ -525,11 +530,13 @@ def moondream(question: str, image: Image.Image, repo: str = None): def florence(question: str, image: Image.Image, repo: str = None, revision: str = None): global processor, model, loaded # pylint: disable=global-statement _get_imports = transformers.dynamic_module_utils.get_imports + def get_imports(f): R = _get_imports(f) if "flash_attn" in R: R.remove("flash_attn") # flash_attn is optional return R + revision = None if '@' in repo: repo, revision = repo.split('@') @@ -618,7 +625,8 @@ def interrogate(question:str='', system_prompt:str=None, prompt:str=None, image: global quant_args # pylint: disable=global-statement jobid = shared.state.begin('Interrogate LLM') t0 = time.time() - quant_args = model_quant.create_config(module='LLM') + if quant_args is None: + quant_args = model_quant.create_config(module='LLM') model_name = model_name or shared.opts.interrogate_vlm_model if isinstance(image, list): image = image[0] if len(image) > 0 else None @@ -634,9 +642,12 @@ def interrogate(question:str='', system_prompt:str=None, prompt:str=None, image: question = prompt if len(question) < 2: question = "Describe the image." + + """ if shared.sd_loaded: from modules.sd_models import apply_balanced_offload # prevent circular import apply_balanced_offload(shared.sd_model) + """ from modules import modelloader modelloader.hf_login() diff --git a/wiki b/wiki index 77e5745f7..f274489e4 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 77e5745f7a7b8ac2f9d029c6ebb83c954be56006 +Subproject commit f274489e42b97b57ea91b9e94087b8b39820a4ee From 81bb2b99ef58cea8fbec3161a914c0b82f36e159 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 1 Oct 2025 21:43:02 +0300 Subject: [PATCH 111/230] update florence promptgen repo ids --- modules/interrogate/vqa.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/interrogate/vqa.py b/modules/interrogate/vqa.py index e1a9a095a..baebb62c2 100644 --- a/modules/interrogate/vqa.py +++ b/modules/interrogate/vqa.py @@ -31,10 +31,14 @@ vlm_models = { # "Microsoft Florence 2 Large": "microsoft/Florence-2-large-ft", # 1.5GB "Microsoft Florence 2 Base": "florence-community/Florence-2-base-ft", # 0.5GB "Microsoft Florence 2 Large": "florence-community/Florence-2-large-ft", # 1.5GB - "MiaoshouAI PromptGen 1.5 Base": "MiaoshouAI/Florence-2-base-PromptGen-v1.5@c06a5f02cc6071a5d65ee5d294cf3732d3097540", # 1.1GB - "MiaoshouAI PromptGen 1.5 Large": "MiaoshouAI/Florence-2-large-PromptGen-v1.5@28a42440e39c9c32b83f7ae74ec2b3d1540404f0", # 3.3GB - "MiaoshouAI PromptGen 2.0 Base": "MiaoshouAI/Florence-2-base-PromptGen-v2.0", # 1.1GB - "MiaoshouAI PromptGen 2.0 Large": "MiaoshouAI/Florence-2-large-PromptGen-v2.0", # 3.3GB + #"MiaoshouAI PromptGen 1.5 Base": "MiaoshouAI/Florence-2-base-PromptGen-v1.5@c06a5f02cc6071a5d65ee5d294cf3732d3097540", # 1.1GB + #"MiaoshouAI PromptGen 1.5 Large": "MiaoshouAI/Florence-2-large-PromptGen-v1.5@28a42440e39c9c32b83f7ae74ec2b3d1540404f0", # 3.3GB + #"MiaoshouAI PromptGen 2.0 Base": "MiaoshouAI/Florence-2-base-PromptGen-v2.0", # 1.1GB + #"MiaoshouAI PromptGen 2.0 Large": "MiaoshouAI/Florence-2-large-PromptGen-v2.0", # 3.3GB + "MiaoshouAI PromptGen 1.5 Base": "Disty0/Florence-2-base-PromptGen-v1.5", # 0.5GB + "MiaoshouAI PromptGen 1.5 Large": "Disty0/Florence-2-large-PromptGen-v1.5", # 1.5GB + "MiaoshouAI PromptGen 2.0 Base": "Disty0/Florence-2-base-PromptGen-v2.0", # 0.5GB + "MiaoshouAI PromptGen 2.0 Large": "Disty0/Florence-2-large-PromptGen-v2.0", # 1.5GB "CogFlorence 2.0 Large": "thwri/CogFlorence-2-Large-Freeze", # 1.6GB "CogFlorence 2.2 Large": "thwri/CogFlorence-2.2-Large", # 1.6GB "Moondream 2": "vikhyatk/moondream2", # 3.7GB From ec7b22e38362b2383536ae7ae1606031aa575754 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 12:24:55 -0400 Subject: [PATCH 112/230] warn on startup if cuda/rocm are available and torch-cpu is installed Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + installer.py | 85 +++++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db8625033..a6214457e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` - command line params `--use-zluda` and `--use-rocm` will attempt desired operation or fail if not possible previously sdnext was performing a fallback to `torch-cpu` which is not desired + - **installer**: warn if cuda or rocm are available and `torch-cpu` is installed - **Extensions** - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) was a high-value built-in extension, but it has not been maintained for 1.5 years diff --git a/installer.py b/installer.py index a2ec15fd2..cde81c9c2 100644 --- a/installer.py +++ b/installer.py @@ -935,54 +935,59 @@ def check_torch(): else: log.warning('Torch: CPU-only version installed') torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') - if 'torch' in torch_command and not args.version: + if args.version: + return + + if 'torch' in torch_command: if not installed('torch'): log.info(f'Torch: download and install in progress... cmd="{torch_command}"') install('--upgrade pip', 'pip', reinstall=True) # pytorch rocm is too large for older pip install(torch_command, 'torch torchvision', quiet=True) - else: + + try: + import torch try: - import torch - log.info(f'Torch {torch.__version__}') - try: - import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import - log.info(f'Torch backend: Intel IPEX {ipex.__version__}') - except Exception: - pass - if hasattr(torch, "xpu") and torch.xpu.is_available() and allow_ipex: - if shutil.which('icpx') is not None: - log.info(f'{os.popen("icpx --version").read().rstrip()}') - for device in range(torch.xpu.device_count()): - log.info(f'Torch detected GPU: {torch.xpu.get_device_name(device)} VRAM {round(torch.xpu.get_device_properties(device).total_memory / 1024 / 1024)} Compute Units {torch.xpu.get_device_properties(device).max_compute_units}') - elif torch.cuda.is_available() and (allow_cuda or allow_rocm): - # log.debug(f'Torch allocator: {torch.cuda.get_allocator_backend()}') - if torch.version.cuda and allow_cuda: - log.info(f'Torch backend: nVidia CUDA {torch.version.cuda} cuDNN {torch.backends.cudnn.version() if torch.backends.cudnn.is_available() else "N/A"}') - elif torch.version.hip and allow_rocm: - log.info(f'Torch backend: AMD ROCm HIP {torch.version.hip}') - else: - log.warning('Unknown Torch backend') - for device in [torch.cuda.device(i) for i in range(torch.cuda.device_count())]: - log.info(f'Torch detected GPU: {torch.cuda.get_device_name(device)} VRAM {round(torch.cuda.get_device_properties(device).total_memory / 1024 / 1024)} Arch {torch.cuda.get_device_capability(device)} Cores {torch.cuda.get_device_properties(device).multi_processor_count}') + import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + log.info(f'Torch backend: type=IPEX version={ipex.__version__}') + except Exception: + pass + if 'cpu' in torch.__version__: + if is_cuda_available: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is available - consider reinstalling') + elif is_rocm_available: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is available - consider reinstalling') + if hasattr(torch, "xpu") and torch.xpu.is_available() and allow_ipex: + if shutil.which('icpx') is not None: + log.info(f'{os.popen("icpx --version").read().rstrip()}') + for device in range(torch.xpu.device_count()): + log.info(f'Torch detected: gpu="{torch.xpu.get_device_name(device)}" vram={round(torch.xpu.get_device_properties(device).total_memory / 1024 / 1024)} units={torch.xpu.get_device_properties(device).max_compute_units}') + elif torch.cuda.is_available() and (allow_cuda or allow_rocm): + if torch.version.cuda and allow_cuda: + log.info(f'Torch backend: version="{torch.__version__}" type=CUDA CUDA={torch.version.cuda} cuDNN={torch.backends.cudnn.version() if torch.backends.cudnn.is_available() else "N/A"}') + elif torch.version.hip and allow_rocm: + log.info(f'Torch backend: version="{torch.__version__}" type=ROCm HIP={torch.version.hip}') else: - try: - if args.use_directml and allow_directml: - import torch_directml # pylint: disable=import-error - dml_ver = pkg_resources.get_distribution("torch-directml") - log.warning(f'Torch backend: DirectML ({dml_ver})') - log.warning('DirectML: end-of-life') - for i in range(0, torch_directml.device_count()): - log.info(f'Torch detected GPU: {torch_directml.device_name(i)}') - except Exception: - log.warning("Torch reports CUDA not available") - except Exception as e: - log.error(f'Torch cannot load: {e}') - if not args.ignore: - sys.exit(1) + log.warning('Unknown Torch backend') + for device in [torch.cuda.device(i) for i in range(torch.cuda.device_count())]: + log.info(f'Torch detected: gpu="{torch.cuda.get_device_name(device)}" vram={round(torch.cuda.get_device_properties(device).total_memory / 1024 / 1024)} arch={torch.cuda.get_device_capability(device)} cores={torch.cuda.get_device_properties(device).multi_processor_count}') + else: + try: + if args.use_directml and allow_directml: + import torch_directml # pylint: disable=import-error + dml_ver = pkg_resources.get_distribution("torch-directml") + log.warning(f'Torch backend: DirectML ({dml_ver})') + log.warning('DirectML: end-of-life') + for i in range(0, torch_directml.device_count()): + log.info(f'Torch detected GPU: {torch_directml.device_name(i)}') + except Exception: + log.warning("Torch reports CUDA not available") + except Exception as e: + log.error(f'Torch cannot load: {e}') + if not args.ignore: + sys.exit(1) + if rocm.is_installed: rocm.postinstall() - if args.version: - return if not args.skip_all: install_torch_addons() check_cudnn() From 7bae6c2c83ecd921f69a7f94b34cc708ad52073b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 14:45:04 -0400 Subject: [PATCH 113/230] add florence/promptgen info to changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6214457e..7a68ac79b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-30 +## Update for 2025-10-01 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -84,6 +84,7 @@ - **Fixes** - **Microsoft Florence 2** both base and large variants *note* this will trigger download of the new variant of the model, feel free to delete older variant in `huggingface` folder + - **MiaoshouAI PromptGen** 1.5/2.0 in both base and large variants - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load - framepack: patch solver for unsupported gpus From 450464aa923522190688488f6f7d8914f47c35f2 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 1 Oct 2025 15:24:37 -0400 Subject: [PATCH 114/230] update todo Signed-off-by: Vladimir Mandic --- TODO.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.md b/TODO.md index e796a3740..1a5475c7d 100644 --- a/TODO.md +++ b/TODO.md @@ -36,6 +36,8 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### New models +- [Kandinsky 5](https://github.com/ai-forever/Kandinsky-5) +- [Bytedance Lynx](https://github.com/bytedance/lynx) - [HunyuanImage](https://huggingface.co/tencent/HunyuanImage-2.1) - [Phantom HuMo](https://github.com/Phantom-video/Phantom) - [Lumina-DiMOO](https://huggingface.co/Alpha-VLLM/Lumina-DiMOO) From 78820a14dc4ec2b29e657774f52c233be212d96f Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Wed, 1 Oct 2025 20:52:04 +0100 Subject: [PATCH 115/230] Allow VLM temp setting temperature to 0 Allow VLM temp setting temperature to 0 --- modules/ui_caption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_caption.py b/modules/ui_caption.py index 85d3ca0bc..86e2eade3 100644 --- a/modules/ui_caption.py +++ b/modules/ui_caption.py @@ -47,7 +47,7 @@ def create_ui(): with gr.Row(): vlm_max_tokens = gr.Slider(label='VLM max tokens', value=shared.opts.interrogate_vlm_max_length, minimum=16, maximum=4096, step=1, elem_id='vlm_max_tokens') vlm_num_beams = gr.Slider(label='VLM num beams', value=shared.opts.interrogate_vlm_num_beams, minimum=1, maximum=16, step=1, elem_id='vlm_num_beams') - vlm_temperature = gr.Slider(label='VLM Temperature', value=shared.opts.interrogate_vlm_temperature, minimum=0.1, maximum=1.0, step=0.01, elem_id='vlm_temperature') + vlm_temperature = gr.Slider(label='VLM Temperature', value=shared.opts.interrogate_vlm_temperature, minimum=0.0, maximum=1.0, step=0.01, elem_id='vlm_temperature') with gr.Row(): vlm_top_k = gr.Slider(label='Top-K', value=shared.opts.interrogate_vlm_top_k, minimum=0, maximum=99, step=1, elem_id='vlm_top_k') vlm_top_p = gr.Slider(label='Top-P', value=shared.opts.interrogate_vlm_top_p, minimum=0.0, maximum=1.0, step=0.01, elem_id='vlm_top_p') From f245506bf263f05a73718198ecba07233c7ab902 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 2 Oct 2025 08:17:32 -0400 Subject: [PATCH 116/230] cleanup hf login Signed-off-by: Vladimir Mandic --- modules/modelloader.py | 1 + modules/sd_models.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/modelloader.py b/modules/modelloader.py index 0eaccf1bd..bc2e0b607 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -22,6 +22,7 @@ pbar = None def hf_login(token=None): global loggedin # pylint: disable=global-statement token = token or shared.opts.huggingface_token + token = token.replace("\n", "").replace("\r", "").strip() if token is not None else None install('hf_xet', quiet=True) if token is None or len(token) <= 4: log.debug('HF login: no token provided') diff --git a/modules/sd_models.py b/modules/sd_models.py index e759ac56f..bb89f6df2 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -1220,9 +1220,9 @@ def hf_auth_check(checkpoint_info, force:bool=False): return True except Exception: pass + repo_id = path_to_repo(checkpoint_info) try: login = modelloader.hf_login() - repo_id = path_to_repo(checkpoint_info) return hf.auth_check(repo_id) except Exception as e: shared.log.error(f'Load model: repo="{repo_id}" login={login} {e}') From a0b375ae3dfa72f3b424ea194d7d4eb34244a72d Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 2 Oct 2025 12:19:54 -0400 Subject: [PATCH 117/230] update diffusers to unblock rocm Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 5 +++-- installer.py | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a68ac79b..b85d076d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-01 +## Update for 2025-10-02 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -92,7 +92,8 @@ - xyz-grid: fix xyz grid with random seeds - reference: fix download for sd15/sdxl reference models - fix checks in init/mask image decode - + - fix hf token with extra chars + ## Update for 2025-09-15 ### Highlights for 2025-09-15 diff --git a/installer.py b/installer.py index cde81c9c2..6df4d7129 100644 --- a/installer.py +++ b/installer.py @@ -608,9 +608,9 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = '64a5187d96f9376c7cf5123db810f2d2da79d7d0' # diffusers commit hash - if args.use_rocm or args.use_zluda or args.use_directml: - sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now + sha = 'b4297967a04cca6ac4493202c02d81c30d0f9ee8' # diffusers commit hash + # if args.use_rocm or args.use_zluda or args.use_directml: + # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' From 34c2a624aaf6bd443d3e937fed0c4403a620c752 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 2 Oct 2025 19:40:07 +0300 Subject: [PATCH 118/230] SDNQ autodetect fp8 tw fallback and disable dynamic compile --- modules/sdnq/common.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 783a7ab2f..b70c7b06b 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -4,7 +4,7 @@ import os from functools import partial import torch -from modules import shared +from modules import shared, devices torch_version = float(torch.__version__[:3]) @@ -34,7 +34,12 @@ if hasattr(torch, "float8_e5m2fnuz"): dtype_dict["float8_e5m2fnuz"] = {"min": -57344, "max": 57344, "num_bits": 8, "target_dtype": "fp8", "torch_dtype": torch.float8_e5m2fnuz, "storage_dtype": torch.float8_e5m2fnuz, "is_unsigned": False, "is_integer": False} use_torch_compile = shared.opts.sdnq_dequantize_compile # this setting requires a full restart of the webui to apply -use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", "1").lower() not in {"0", "false", "no"} # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting + +if devices.backend == "cuda" and os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", None) is None: + # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting + use_tensorwise_fp8_matmul = torch.cuda.get_device_capability(devices.device) < (9,0) +else: + use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", "1").lower() not in {"0", "false", "no"} linear_types = ("Linear",) conv_types = ("Conv1d", "Conv2d", "Conv3d") @@ -44,7 +49,7 @@ allowed_types = linear_types + conv_types + conv_transpose_types if use_torch_compile: torch._dynamo.config.cache_size_limit = max(8192, torch._dynamo.config.cache_size_limit) torch._dynamo.config.accumulated_recompile_limit = max(8192, torch._dynamo.config.accumulated_recompile_limit) - compile_func = partial(torch.compile, fullgraph=True) + compile_func = partial(torch.compile, fullgraph=True, dynamic=False) else: def compile_func(fn, **kwargs): # pylint: disable=unused-argument return fn From 7325f9dbaeb7d47275430f1510325c2b6d60502c Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 2 Oct 2025 16:28:31 -0400 Subject: [PATCH 119/230] dont import guiders until needed Signed-off-by: Vladimir Mandic --- modules/ui_guidance.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/ui_guidance.py b/modules/ui_guidance.py index 3f3b3f8f3..ae0506771 100644 --- a/modules/ui_guidance.py +++ b/modules/ui_guidance.py @@ -1,14 +1,17 @@ import gradio as gr -from modules import shared, modular_guiders +from modules import shared from modules import ui_symbols, ui_components +guiders = ['Default', 'CFG', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG'] + + def create_guidance_inputs(tab): with gr.Accordion(open=False, label='Guidance', elem_id=f"{tab}_guidance", elem_classes=["small-accordion"]): with gr.Group(): with gr.Row(elem_id=f"{tab}_guider_row", elem_classes=['flexbox'], visible=shared.opts.model_modular_enable): - guidance_name = gr.Dropdown(choices=list(modular_guiders.guiders.keys()), value='Default', label='Guider', elem_id=f"{tab}_guider") + guidance_name = gr.Dropdown(choices=guiders, value='Default', label='Guider', elem_id=f"{tab}_guider") guidance_btn = ui_components.ToolButton(value=ui_symbols.book, elem_id=f"{tab}_guider_docs") guidance_btn.click(fn=None, _js='getGuidanceDocs', inputs=[guidance_name], outputs=[]) with gr.Row(visible=shared.opts.model_modular_enable): From 75773eb3ccfa930425de1dc4042ea1342d433029 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 2 Oct 2025 17:38:07 -0400 Subject: [PATCH 120/230] lock diffusers version for rocm/zluda Signed-off-by: Vladimir Mandic --- installer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/installer.py b/installer.py index 6df4d7129..a4fea4002 100644 --- a/installer.py +++ b/installer.py @@ -609,8 +609,8 @@ def check_diffusers(): install('diffusers') return sha = 'b4297967a04cca6ac4493202c02d81c30d0f9ee8' # diffusers commit hash - # if args.use_rocm or args.use_zluda or args.use_directml: - # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now + if args.use_rocm or args.use_zluda or args.use_directml: + sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' From c5cab962233b36db28331519743532f45244b686 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 3 Oct 2025 02:58:14 +0300 Subject: [PATCH 121/230] SDNQ simplify check_mats --- modules/sdnq/__init__.py | 7 +++---- modules/sdnq/layers/linear/forward.py | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 450b43d43..a84f48f2e 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -172,11 +172,10 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if use_quantized_matmul and not re_quantize_for_matmul: scale.transpose_(0,1) layer.weight.transpose_(0,1) - if layer.weight.is_contiguous(): - if devices.backend != "ipex": - layer.weight.data = layer.weight.t_().contiguous().t_() - elif devices.backend == "ipex": + if devices.backend == "ipex": layer.weight.data = layer.weight.contiguous() + elif layer.weight.is_contiguous(): + layer.weight.data = layer.weight.t_().contiguous().t_() if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: scale = scale.to(torch.float32) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index 18009c27b..6977d6566 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -7,11 +7,10 @@ import torch def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: input = input.contiguous() - if weight.is_contiguous(): - if weight.device.type != "xpu": - weight = weight.t().contiguous().t() - elif weight.device.type == "xpu": + if weight.device.type == "xpu": weight = weight.contiguous() + elif weight.is_contiguous(): + weight = weight.t().contiguous().t() return input, weight From 54acf1760b2abbc160f1735f66a9c9ebea76f28d Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 3 Oct 2025 18:13:55 +0300 Subject: [PATCH 122/230] Make SDNQ scales compatible with balanced offload --- modules/lora/lora_apply.py | 30 +++++++++---- modules/sdnq/__init__.py | 11 +++-- modules/sdnq/dequantizer.py | 44 +++++++------------ modules/sdnq/layers/conv/conv_fp8.py | 5 +-- .../sdnq/layers/conv/conv_fp8_tensorwise.py | 5 +-- modules/sdnq/layers/conv/conv_int8.py | 6 +-- modules/sdnq/layers/conv/forward.py | 8 ++-- modules/sdnq/layers/linear/forward.py | 2 +- modules/sdnq/layers/linear/linear_fp8.py | 4 +- .../layers/linear/linear_fp8_tensorwise.py | 4 +- modules/sdnq/layers/linear/linear_int8.py | 6 +-- 11 files changed, 64 insertions(+), 61 deletions(-) diff --git a/modules/lora/lora_apply.py b/modules/lora/lora_apply.py index 0343d7b14..47b408446 100644 --- a/modules/lora/lora_apply.py +++ b/modules/lora/lora_apply.py @@ -47,6 +47,11 @@ def network_backup_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.n self.network_weights_backup = weight.clone().to(devices.cpu) if hasattr(self, "sdnq_dequantizer"): self.sdnq_dequantizer_backup = self.sdnq_dequantizer.to(devices.cpu) + self.sdnq_scale_backup = self.scale.clone().to(devices.cpu) + if self.zero_point is not None: + self.sdnq_zero_point_backup = self.zero_point.clone().to(devices.cpu) + else: + self.sdnq_zero_point_backup = None if bias_backup is None: if getattr(self, 'bias', None) is not None: @@ -80,9 +85,9 @@ def network_calc_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn. try: t0 = time.time() if hasattr(self, "sdnq_dequantizer_backup"): - weight = self.sdnq_dequantizer_backup.to(devices.device)(self.weight.to(devices.device), skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul) + weight = self.sdnq_dequantizer_backup.to(devices.device)(self.weight.to(devices.device), self.sdnq_scale_backup.to(devices.device), self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul) elif hasattr(self, "sdnq_dequantizer"): - weight = self.sdnq_dequantizer.to(devices.device)(self.weight.to(devices.device), skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul) + weight = self.sdnq_dequantizer.to(devices.device)(self.weight.to(devices.device), self.scale.to(devices.device), self.zero_point.to(devices.device) if self.zero_point is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul) else: weight = self.weight.to(devices.device) # must perform calc on gpu due to performance updown, ex_bias = module.calc_updown(weight) @@ -142,16 +147,18 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G try: from modules.sdnq import sdnq_quantize_layer if hasattr(self, "sdnq_dequantizer_backup"): - sdnq_dequantizer = self.sdnq_dequantizer_backup.to(devices.device) - else: - sdnq_dequantizer = self.sdnq_dequantizer.to(devices.device) - dequant_weight = sdnq_dequantizer(model_weights.to(devices.device), skip_quantized_matmul=sdnq_dequantizer.use_quantized_matmul) + weights_dtype = self.sdnq_dequantizer_backup.weights_dtype + dequant_weight = self.sdnq_dequantizer_backup.to(devices.device)(model_weights.to(devices.device), self.sdnq_scale_backup.to(devices.device), self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul) + elif hasattr(self, "sdnq_dequantizer"): + weights_dtype = self.sdnq_dequantizer.weights_dtype + dequant_weight = self.sdnq_dequantizer.to(devices.device)(model_weights.to(devices.device), self.scale.to(devices.device), self.zero_point.to(devices.device) if self.zero_point is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul) + new_weight = dequant_weight.to(devices.device, dtype=torch.float32) + lora_weights.to(devices.device, dtype=torch.float32) self.weight = torch.nn.Parameter(new_weight, requires_grad=False) - self.sdnq_dequantizer = None + del self.sdnq_dequantizer, self.scale, self.zero_point self = sdnq_quantize_layer( self, - sdnq_dequantizer.weights_dtype, + weights_dtype=weights_dtype, torch_dtype=devices.dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, quant_conv=shared.opts.sdnq_quantize_conv_layers, @@ -231,7 +238,12 @@ def network_apply_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn self.weight = torch.nn.Parameter(weights_backup.to(device), requires_grad=False) if hasattr(self, "sdnq_dequantizer_backup"): self.sdnq_dequantizer = self.sdnq_dequantizer_backup.to(device) - del self.sdnq_dequantizer_backup + self.scale = torch.nn.Parameter(self.sdnq_scale_backup.to(device), requires_grad=False) + if self.sdnq_zero_point_backup is not None: + self.zero_point = torch.nn.Parameter(self.sdnq_zero_point_backup.to(device), requires_grad=False) + else: + self.zero_point = None + del self.sdnq_dequantizer_backup, self.sdnq_scale_backup, self.sdnq_zero_point_backup if bias_backup is not None: self.bias = None diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index a84f48f2e..16fe6ec47 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -179,9 +179,15 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: scale = scale.to(torch.float32) + scale = scale.to(return_device, non_blocking=non_blocking) + layer.scale = torch.nn.Parameter(scale, requires_grad=False) + if zero_point is not None: + zero_point = zero_point.to(return_device, non_blocking=non_blocking) + layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) + else: + layer.zero_point = None + layer.sdnq_dequantizer = dequantizer_dict[weights_dtype]( - scale=scale, - zero_point=zero_point, quantized_weight_shape=layer.weight.shape, result_dtype=torch_dtype, result_shape=result_shape, @@ -191,7 +197,6 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz re_quantize_for_matmul=re_quantize_for_matmul, ) layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) - layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) layer.forward = layer.forward.__get__(layer, layer.__class__) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index be68ab96d..d82849177 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -73,8 +73,6 @@ def re_quantize_matmul_packed_int_symmetric(weight: torch.ByteTensor, scale: tor class AsymmetricWeightsDequantizer(torch.nn.Module): def __init__( self, - scale: torch.FloatTensor, - zero_point: torch.FloatTensor, result_dtype: torch.dtype, result_shape: torch.Size, original_shape: torch.Size, @@ -89,23 +87,20 @@ class AsymmetricWeightsDequantizer(torch.nn.Module): self.re_quantize_for_matmul = True self.result_dtype = result_dtype self.result_shape = result_shape - self.register_buffer("scale", scale) - self.register_buffer("zero_point", zero_point) def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return weight.to(dtype=dtype_dict[self.weights_dtype]["torch_dtype"]) - def re_quantize_matmul(self, weight, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_asymmetric_compiled(weight, self.scale, self.zero_point, self.result_shape) + def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_asymmetric_compiled(weight, scale, zero_point, self.result_shape) - def forward(self, weight, **kwargs): # pylint: disable=unused-argument - return dequantize_asymmetric_compiled(weight, self.scale, self.zero_point, self.result_dtype, self.result_shape) + def forward(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return dequantize_asymmetric_compiled(weight, scale, zero_point, self.result_dtype, self.result_shape) class SymmetricWeightsDequantizer(torch.nn.Module): def __init__( self, - scale: torch.FloatTensor, result_dtype: torch.dtype, result_shape: torch.Size, original_shape: torch.Size, @@ -121,24 +116,21 @@ class SymmetricWeightsDequantizer(torch.nn.Module): self.re_quantize_for_matmul = re_quantize_for_matmul self.result_dtype = result_dtype self.result_shape = result_shape - self.register_buffer("scale", scale) def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return weight.to(dtype=dtype_dict[self.weights_dtype]["torch_dtype"]) - def re_quantize_matmul(self, weight, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_symmetric_compiled(weight, self.scale, self.result_shape) + def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_symmetric_compiled(weight, scale, self.result_shape) - def forward(self, weight, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument + def forward(self, weight, scale, zero_point, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument skip_quantized_matmul = skip_quantized_matmul and not self.re_quantize_for_matmul - return dequantize_symmetric_compiled(weight, self.scale, self.result_dtype, self.result_shape, skip_quantized_matmul=skip_quantized_matmul) + return dequantize_symmetric_compiled(weight, scale, self.result_dtype, self.result_shape, skip_quantized_matmul=skip_quantized_matmul) class PackedINTAsymmetricWeightsDequantizer(torch.nn.Module): def __init__( self, - scale: torch.FloatTensor, - zero_point: torch.FloatTensor, quantized_weight_shape: torch.Size, result_dtype: torch.dtype, result_shape: torch.Size, @@ -155,23 +147,20 @@ class PackedINTAsymmetricWeightsDequantizer(torch.nn.Module): self.quantized_weight_shape = quantized_weight_shape self.result_dtype = result_dtype self.result_shape = result_shape - self.register_buffer("scale", scale) - self.register_buffer("zero_point", zero_point) def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return pack_int_asymetric(weight, self.weights_dtype) - def re_quantize_matmul(self, weight, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_packed_int_asymmetric_compiled(weight, self.scale, self.zero_point, self.quantized_weight_shape, self.result_shape, self.weights_dtype) + def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_shape, self.weights_dtype) - def forward(self, weight, **kwargs): # pylint: disable=unused-argument - return dequantize_packed_int_asymmetric_compiled(weight, self.scale, self.zero_point, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype) + def forward(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return dequantize_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype) class PackedINTSymmetricWeightsDequantizer(torch.nn.Module): def __init__( self, - scale: torch.FloatTensor, quantized_weight_shape: torch.Size, result_dtype: torch.dtype, result_shape: torch.Size, @@ -189,17 +178,16 @@ class PackedINTSymmetricWeightsDequantizer(torch.nn.Module): self.quantized_weight_shape = quantized_weight_shape self.result_dtype = result_dtype self.result_shape = result_shape - self.register_buffer("scale", scale) def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return pack_int_symetric(weight, self.weights_dtype) - def re_quantize_matmul(self, weight, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_packed_int_symmetric_compiled(weight, self.scale, self.quantized_weight_shape, self.result_shape, self.weights_dtype) + def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_shape, self.weights_dtype) - def forward(self, weight, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument + def forward(self, weight, scale, zero_point, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument skip_quantized_matmul = skip_quantized_matmul and not self.re_quantize_for_matmul - return dequantize_packed_int_symmetric_compiled(weight, self.scale, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype, skip_quantized_matmul=skip_quantized_matmul) + return dequantize_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype, skip_quantized_matmul=skip_quantized_matmul) dequantizer_dict = { diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index 7a83bb3a8..47f214937 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -58,11 +58,10 @@ def conv_fp8_matmul( def quantized_conv_forward_fp8_matmul(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) return conv_fp8_matmul( - input, self.weight, self.bias, - self.sdnq_dequantizer.scale, + input, self.weight, self.bias, self.scale, self.sdnq_dequantizer.result_shape, self._reversed_padding_repeated_twice, self.padding_mode, conv_type, diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index e3b005622..592a512ee 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -53,11 +53,10 @@ def conv_fp8_matmul_tensorwise( def quantized_conv_forward_fp8_matmul_tensorwise(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) return conv_fp8_matmul_tensorwise( - input, self.weight, self.bias, - self.sdnq_dequantizer.scale, + input, self.weight, self.bias, self.scale, self.sdnq_dequantizer.result_shape, self._reversed_padding_repeated_twice, self.padding_mode, conv_type, diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index 260acd170..0ae26b8f5 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -57,14 +57,14 @@ def conv_int8_matmul( def quantized_conv_forward_int8_matmul(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) if self.sdnq_dequantizer.re_quantize_for_matmul: - weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight) + weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point) quantized_weight_shape = None else: weight = self.weight - scale = self.sdnq_dequantizer.scale + scale = self.scale quantized_weight_shape = getattr(self.sdnq_dequantizer, "quantized_weight_shape", None) return conv_int8_matmul( input, weight, self.bias, diff --git a/modules/sdnq/layers/conv/forward.py b/modules/sdnq/layers/conv/forward.py index 44c90b061..69237ea68 100644 --- a/modules/sdnq/layers/conv/forward.py +++ b/modules/sdnq/layers/conv/forward.py @@ -75,19 +75,19 @@ def process_conv_input(conv_type, input, reversed_padding_repeated_twice, paddin def quantized_conv_forward(self, input) -> torch.FloatTensor: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias) def quantized_conv_transpose_1d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 1, self.dilation) - return torch.nn.functional.conv_transpose1d(input, self.sdnq_dequantizer(self.weight), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose1d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) def quantized_conv_transpose_2d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 2, self.dilation) - return torch.nn.functional.conv_transpose2d(input, self.sdnq_dequantizer(self.weight), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose2d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) def quantized_conv_transpose_3d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 3, self.dilation) - return torch.nn.functional.conv_transpose3d(input, self.sdnq_dequantizer(self.weight), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose3d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index 6977d6566..fc5b2ce60 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -15,4 +15,4 @@ def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, def quantized_linear_forward(self, input: torch.FloatTensor) -> torch.FloatTensor: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight), self.bias) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias) diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index d1845b1e7..3f2fb407c 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -32,8 +32,8 @@ def fp8_matmul( def quantized_linear_forward_fp8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) - return fp8_matmul(input, self.weight, self.bias, self.sdnq_dequantizer.scale) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return fp8_matmul(input, self.weight, self.bias, self.scale) fp8_matmul = compile_func(fp8_matmul) diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index a35eb0721..d39ea5519 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -37,8 +37,8 @@ def fp8_matmul_tensorwise( def quantized_linear_forward_fp8_matmul_tensorwise(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) - return fp8_matmul_tensorwise(input, self.weight, self.bias, self.sdnq_dequantizer.scale) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return fp8_matmul_tensorwise(input, self.weight, self.bias, self.scale) fp8_matmul_tensorwise = compile_func(fp8_matmul_tensorwise) diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index 356179b97..bfca56ce2 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -41,13 +41,13 @@ def int8_matmul( def quantized_linear_forward_int8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, skip_quantized_matmul=True), self.bias) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) if self.sdnq_dequantizer.re_quantize_for_matmul: - weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight) + weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point) quantized_weight_shape = None else: weight = self.weight - scale = self.sdnq_dequantizer.scale + scale = self.scale quantized_weight_shape = getattr(self.sdnq_dequantizer, "quantized_weight_shape", None) return int8_matmul(input, weight, self.bias, scale, quantized_weight_shape, self.sdnq_dequantizer.weights_dtype) From a6108dd6df8a1a480c3a6c70466c54e81a3bf664 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 3 Oct 2025 11:36:12 -0400 Subject: [PATCH 123/230] add qwen pruning variants Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 ++++-- html/reference.json | 31 +++++++++++++++++++++++++++++-- modules/mit_nunchaku.py | 2 +- modules/modelloader.py | 11 +++++++++-- modules/sd_checkpoint.py | 13 ++++++++++--- pipelines/generic.py | 2 +- pipelines/model_qwen.py | 14 +++++++++----- pipelines/qwen/__init__.py | 2 ++ pipelines/qwen/qwen_nunchaku.py | 4 +++- pipelines/qwen/qwen_pruning.py | 12 ++++++++++++ wiki | 2 +- 11 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 pipelines/qwen/__init__.py create mode 100644 pipelines/qwen/qwen_pruning.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b85d076d0..b9cde65f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,14 @@ # Change Log for SD.Next -## Update for 2025-10-02 +## Update for 2025-10-03 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows - [Qwen Image Edit 2509](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) and [Nunchaku Qwen Image Edit 2509](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit-2509) updated version of Qwen Image Edit with improved image consistency + - [Qwen Image Pruning](https://huggingface.co/OPPOer/Qwen-Image-Pruning) and [Qwen Image Edit Pruning](https://huggingface.co/OPPOer/Qwen-Image-Edit-Pruning) + pruned versions of Qwen with 13B params instead of 20B, with some quality tradeoff - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) updated version of E1 image editing model - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) @@ -15,7 +17,6 @@ impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models - *note*: sdxl support for nunchaku is not in released version of `nunchaku==1.0.0`, so you need to build [nunchaku](https://nunchaku.tech/docs/nunchaku/installation/installation.html) from source - **Features** - [Cache-DiT](https://github.com/vipshop/cache-dit) cache-dit is a unified, flexible and training-free cache acceleration framework @@ -74,6 +75,7 @@ - **attention** remove split-attention and add explicitly attention slicing enable/disable option enable in *settings -> compute settings* can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems + - **nunchaku** update to `1.0.1` - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* diff --git a/html/reference.json b/html/reference.json index 8c5901381..ad1b7e333 100644 --- a/html/reference.json +++ b/html/reference.json @@ -183,7 +183,7 @@ "Qwen-Image": { "path": "Qwen/Qwen-Image", "preview": "Qwen--Qwen-Image.jpg", - "desc": " Qwen-Image, an image generation foundation model in the Qwen series that achieves significant advances in complex text rendering and precise image editing.", + "desc": "Qwen-Image, an image generation foundation model in the Qwen series that achieves significant advances in complex text rendering and precise image editing.", "skip": true, "extras": "", "size": 56.1, @@ -228,12 +228,39 @@ "Qwen-Image-Lightning-Edit": { "path": "vladmandic/Qwen-Lightning-Edit", "preview": "vladmandic--Qwen-Lightning-Edit.jpg", - "desc": " Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.", + "desc": "Qwen-Lightning-Edit is step-distilled from Qwen-Image-Edit to allow for generation in 8 steps.", "skip": true, "extras": "steps: 8", "size": 56.1, "date": "2025 August" }, + "Qwen-Image-Pruning": { + "path": "OPPOer/Qwen-Image-Pruning-13B", + "subfolder": "Qwen-Image-13B", + "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", + "skip": true, + "size": 56.1, + "date": "2025 Ocotober" + }, + "Qwen-Image-Edit-Pruning": { + "path": "OPPOer/Qwen-Image-Edit-Pruning-13B", + "subfolder": "Qwen-Image-Edit-13B", + "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", + "skip": true, + "size": 56.1, + "date": "2025 Ocotober" + }, + "Qwen-Image-Edit-2509-Pruning": { + "path": "OPPOer/Qwen-Image-Edit-Pruning-14B", + "subfolder": "Qwen-Image-Edit-2509-14B", + "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", + "skip": true, + "size": 56.1, + "date": "2025 Ocotober" + }, "lodestones Chroma1 HD": { "path": "lodestones/Chroma1-HD", diff --git a/modules/mit_nunchaku.py b/modules/mit_nunchaku.py index a06e7cfda..b331f683a 100644 --- a/modules/mit_nunchaku.py +++ b/modules/mit_nunchaku.py @@ -4,7 +4,7 @@ from installer import log, pip from modules import devices -ver = '1.0.0' +ver = '1.0.1' ok = False diff --git a/modules/modelloader.py b/modules/modelloader.py index bc2e0b607..0502a367c 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -180,6 +180,13 @@ def find_diffuser(name: str, full=False): if len(repo) > 0: return [repo[0]['name']] hf_api = hf.HfApi() + suffix = '' + if len(name) > 3 and name.count('/') > 1: + parts = name.split('/') + name = '/'.join(parts[:2]) # only user/model + suffix = '/'.join(parts[2:]) # subfolder + if len(suffix) > 0: + suffix = '/' + suffix models = list(hf_api.list_models(model_name=name, library=['diffusers'], full=True, limit=20, sort="downloads", direction=-1)) if len(models) == 0: models = list(hf_api.list_models(model_name=name, full=True, limit=20, sort="downloads", direction=-1)) # widen search @@ -187,9 +194,9 @@ def find_diffuser(name: str, full=False): shared.log.debug(f'Search model: repo="{name}" {len(models) > 0}') if len(models) > 0: if not full: - return models[0].id + return models[0].id + suffix else: - return [m.id for m in models] + return [m.id + suffix for m in models] return None diff --git a/modules/sd_checkpoint.py b/modules/sd_checkpoint.py index a1ea0d8ed..6870c740f 100644 --- a/modules/sd_checkpoint.py +++ b/modules/sd_checkpoint.py @@ -27,6 +27,7 @@ class CheckpointInfo: self.hash = sha self.filename = filename self.type = '' + self.subfolder = None relname = filename app_path = os.path.abspath(paths.script_path) @@ -106,7 +107,7 @@ class CheckpointInfo: return self.shorthash def __str__(self): - return f"CheckpointInfo(name={self.name} filename={self.filename} hash={self.shorthash} type={self.type}" + return f'CheckpointInfo(name="{self.name}" filename="{self.filename}" hash={self.shorthash} type={self.type} title="{self.title}" path="{self.path}" subfolder="{self.subfolder}")' def setup_model(): @@ -231,7 +232,12 @@ def get_closet_checkpoint_match(s: str) -> CheckpointInfo: return checkpoint_info # huggingface search - if shared.opts.sd_checkpoint_autodownload and s.count('/') == 1: + if shared.opts.sd_checkpoint_autodownload and (s.count('/') == 1 or s.count('/') == 2): + if s.count('/') == 2: + subfolder = '/'.join(s.split('/')[2:]) # subfolder + s = '/'.join(s.split('/')[:2]) # only user/model + else: + subfolder = None modelloader.hf_login() found = modelloader.find_diffuser(s, full=True) if found is None: @@ -241,6 +247,7 @@ def get_closet_checkpoint_match(s: str) -> CheckpointInfo: if found is not None and len(found) == 1: checkpoint_info = CheckpointInfo(s) checkpoint_info.type = 'huggingface' + checkpoint_info.subfolder = subfolder return checkpoint_info # civitai search @@ -289,7 +296,7 @@ def select_checkpoint(op='model', sd_model_checkpoint=None): return None if model_checkpoint is not None: if model_checkpoint != 'model.safetensors' and model_checkpoint != 'stabilityai/stable-diffusion-xl-base-1.0': - shared.log.info(f'Load {op}: search="{model_checkpoint}" not found') + shared.log.error(f'Load {op}: search="{model_checkpoint}" not found') else: shared.log.info("Selecting first available checkpoint") else: diff --git a/pipelines/generic.py b/pipelines/generic.py index 2c5f0b847..0eb2c19c1 100644 --- a/pipelines/generic.py +++ b/pipelines/generic.py @@ -48,7 +48,7 @@ def load_transformer(repo_id, cls_name, load_config={}, subfolder="transformer", **quant_args, ) else: - shared.log.debug(f'Load model: transformer="{repo_id}" cls={cls_name.__name__} quant="{quant_type}" args={load_args}') + shared.log.debug(f'Load model: transformer="{repo_id}" cls={cls_name.__name__} subfolder={subfolder} quant="{quant_type}" args={load_args}') if dtype is not None: load_args['torch_dtype'] = dtype if subfolder is not None: diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index f28313603..eedefd014 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -1,11 +1,12 @@ import transformers import diffusers from modules import shared, devices, sd_models, model_quant, sd_hijack_te, sd_hijack_vae -from pipelines import generic def load_qwen(checkpoint_info, diffusers_load_config={}): + from pipelines import generic, qwen repo_id = sd_models.path_to_repo(checkpoint_info) + repo_subfolder = checkpoint_info.subfolder sd_models.hf_auth_check(checkpoint_info) transformer = None @@ -29,8 +30,7 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageInpaintPipeline if model_quant.check_nunchaku('Model'): - from pipelines.qwen.qwen_nunchaku import load_qwen_nunchaku - transformer = load_qwen_nunchaku(repo_id) + transformer = qwen.load_qwen_nunchaku(repo_id) if 'Qwen-Image-Distill-Full' in repo_id: repo_transformer = repo_id @@ -38,7 +38,10 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): repo_id = 'Qwen/Qwen-Image' else: repo_transformer = repo_id - transformer_subfolder = "transformer" + if repo_subfolder is not None: + transformer_subfolder = repo_subfolder + '/transformer' + else: + transformer_subfolder = "transformer" if transformer is None: transformer = generic.load_transformer( @@ -52,11 +55,12 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): repo_te = 'Qwen/Qwen-Image' text_encoder = generic.load_text_encoder(repo_te, cls_name=transformers.Qwen2_5_VLForConditionalGeneration, load_config=diffusers_load_config) - # NunchakuQwenImagePipeline + repo_id = qwen.check_qwen_pruning(repo_id) pipe = cls_name.from_pretrained( repo_id, transformer=transformer, text_encoder=text_encoder, + subfolder=repo_subfolder, cache_dir=shared.opts.diffusers_dir, **load_args, ) diff --git a/pipelines/qwen/__init__.py b/pipelines/qwen/__init__.py new file mode 100644 index 000000000..e1455f988 --- /dev/null +++ b/pipelines/qwen/__init__.py @@ -0,0 +1,2 @@ +from pipelines.qwen.qwen_nunchaku import load_qwen_nunchaku +from pipelines.qwen.qwen_pruning import check_qwen_pruning diff --git a/pipelines/qwen/qwen_nunchaku.py b/pipelines/qwen/qwen_nunchaku.py index 7c689c7a3..4c89b7b1c 100644 --- a/pipelines/qwen/qwen_nunchaku.py +++ b/pipelines/qwen/qwen_nunchaku.py @@ -11,7 +11,9 @@ def load_qwen_nunchaku(repo_id): except Exception: shared.log.error(f'Load module: quant=Nunchaku module=transformer repo="{repo_id}" low nunchaku version') return None - if repo_id.lower().endswith('qwen-image'): + if 'pruning' in repo_id.lower() or 'distill' in repo_id.lower(): + return None + elif repo_id.lower().endswith('qwen-image'): nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image/svdq-{nunchaku_precision}_r128-qwen-image.safetensors" # r32 vs r128 elif repo_id.lower().endswith('qwen-lightning'): nunchaku_repo = f"nunchaku-tech/nunchaku-qwen-image/svdq-{nunchaku_precision}_r128-qwen-image-lightningv1.1-8steps.safetensors" # 8-step variant diff --git a/pipelines/qwen/qwen_pruning.py b/pipelines/qwen/qwen_pruning.py new file mode 100644 index 000000000..971589958 --- /dev/null +++ b/pipelines/qwen/qwen_pruning.py @@ -0,0 +1,12 @@ +def check_qwen_pruning(repo_id): + from modules.shared import log + if 'pruning' not in repo_id.lower(): + return repo_id + if '2509' in repo_id: + repo_id = "Qwen/Qwen-Image-Edit-2509" + elif 'Edit' in repo_id: + repo_id = "Qwen/Qwen-Image-Edit" + else: + repo_id = "Qwen/Qwen-Image" + log.debug(f'Load model: variant=pruning target="{repo_id}"') + return repo_id diff --git a/wiki b/wiki index f274489e4..dfcb801c5 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit f274489e42b97b57ea91b9e94087b8b39820a4ee +Subproject commit dfcb801c592a493d48b7e22a0a46ab39340fd021 From 95a7da7e75350a0f9179f339fc06e36ece2d0b60 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 3 Oct 2025 18:54:58 +0300 Subject: [PATCH 124/230] SDNQ use non-contiguous re-quantize --- modules/sdnq/__init__.py | 1 + modules/sdnq/dequantizer.py | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 16fe6ec47..c7d832bb9 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -197,6 +197,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz re_quantize_for_matmul=re_quantize_for_matmul, ) layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) + layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) layer.forward = layer.forward.__get__(layer, layer.__class__) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index d82849177..22771b643 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -48,18 +48,25 @@ def quantize_fp8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.Tensor, return input, scale +def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: + if weight.ndim > 2: # convs + weight = weight.flatten(1,-1) + if weight.device.type == "xpu": + # return contiguous + weight, scale = quantize_int8(weight.t(), dim=0) + else: + # return non-contiguous + weight, scale = quantize_int8(weight, dim=-1) + weight, scale = weight.t_(), scale.t_() + return weight, scale + + def re_quantize_matmul_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, result_shape: torch.Size) -> Tuple[torch.CharTensor, torch.FloatTensor]: - result = dequantize_asymmetric(weight, scale, zero_point, scale.dtype, result_shape) - if result.ndim > 2: # convs - result = result.flatten(1,-1) - return quantize_int8(result.t_(), dim=0) + return re_quantize_int8(dequantize_asymmetric(weight, scale, zero_point, scale.dtype, result_shape)) def re_quantize_matmul_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, result_shape: torch.Size) -> Tuple[torch.CharTensor, torch.FloatTensor]: - result = dequantize_symmetric(weight, scale, scale.dtype, result_shape) - if result.ndim > 2: # convs - result = result.flatten(1,-1) - return quantize_int8(result.t_(), dim=0) + return re_quantize_int8(dequantize_symmetric(weight, scale, scale.dtype, result_shape)) def re_quantize_matmul_packed_int_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, shape: torch.Size, result_shape: torch.Size, weights_dtype: str) -> torch.FloatTensor: From 54ae18a6110a3a83babf6047fd3c0d99807c8bc1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 3 Oct 2025 12:23:22 -0400 Subject: [PATCH 125/230] update nunchaku Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 +- modules/mit_nunchaku.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9cde65f2..a34b0ec27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,7 +75,7 @@ - **attention** remove split-attention and add explicitly attention slicing enable/disable option enable in *settings -> compute settings* can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems - - **nunchaku** update to `1.0.1` + - **nunchaku** update to `1.0.1` and enhance installer - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* diff --git a/modules/mit_nunchaku.py b/modules/mit_nunchaku.py index b331f683a..9817c4e53 100644 --- a/modules/mit_nunchaku.py +++ b/modules/mit_nunchaku.py @@ -15,7 +15,11 @@ def check(): try: import nunchaku import nunchaku.utils - log.info(f'Nunchaku: path={nunchaku.__path__} precision={nunchaku.utils.get_precision()}') + from nunchaku import __version__ + log.info(f'Nunchaku: path={nunchaku.__path__} version={__version__.__version__} precision={nunchaku.utils.get_precision()}') + if __version__.__version__ != ver: + ok = False + return False ok = True return True except Exception as e: From e5ef08d4901b9be716a3c6604a32f20a522f5068 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Sat, 4 Oct 2025 12:18:17 +0300 Subject: [PATCH 126/230] SD1.5 and SD2.1 updated cover images --- ...stabilityai--stable-diffusion-2-1-base.jpg | Bin 58475 -> 49294 bytes .../stabilityai--stable-diffusion-2-1.jpg | Bin 63076 -> 83198 bytes models/Reference/v1-5-pruned-fp16-emaonly.jpg | Bin 94318 -> 84740 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/models/Reference/stabilityai--stable-diffusion-2-1-base.jpg b/models/Reference/stabilityai--stable-diffusion-2-1-base.jpg index ab0e655f2d571d50d4879684ce48561c74016b3b..9912ea894e3d42e637f6d58c5065ba9ea089e28a 100644 GIT binary patch literal 49294 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 literal 58475 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 diff --git a/models/Reference/stabilityai--stable-diffusion-2-1.jpg b/models/Reference/stabilityai--stable-diffusion-2-1.jpg index 42205ad67a739aaae9f8e91cda8bd35adb2f96f8..0560d5bfdccb58cd34e989f4aabe433906503023 100644 GIT binary patch literal 83198 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 o)lT@HC}5Wnm_)3N<|4 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

    >)DY7{89t!jQ z6~{!{3Bl}-9s_(^jTd}lPv51ft5nqaO)RVBXPim; zcLuYkPCONNhRd$4hD*unQVtZJeJHEqi&8Uqzu6(glDUy$L2W2~WaVEdq3}?)8H|kR zo9pVERvP?yyQ)5rj9rYSB|wCZQ~s4BuGJa4Ok}W0Ur)@O5ng&`+Nkz++-#nw&!=uG zD_u%))v}cgBqsomTG3p2ba_6BO|1`~Ay#3r=g4g(C0$*>trh)}m*?$w9ctQwz7NaD zNayCqwP(JYj=6VKB?k%#Q6JFLm-{R=I=QuZ3gGbd#TbpB?GrVip}5JThe7lc^Vqv8%6%>wS5xm*y{#@+%_mq_`L4+gTSEvaZY z83Ma(dWPkurU_QbuR?rd=Ve&VJ?Q1ajkU1yoN<&IDGYAZ7y1J60pbr!Y~I=2FV_p2 z8kgnbI}NB6sbqQq=~z*_Td8{94PSD;U1h1yIl`niwS6h{z^I*3xEhyTIM}`3WnB6` zlsw@nAEj2^NkYgY1XW9Iv9{(N@=tZ#vhx?sTK30Y&fAS+ZoWW$#$1fxSqMK+9)_xw z{0T_}cNAEFMhbyymx)gqx@&WM6Uc^%{W_NBlr*U5SIjYt=j~aQq4g8mQ&?H=5!KT4 zDJXOhaoE&Djykpz)U_6Y;W^+M`H$1*qpaZ>3{ z!BSGUqcpd9$Z&Lw{&}kw>Fnl?@js%xnO;LTuPm0NHk>RRdeXDu((fZ%_;F$Qgd$z6 z`9KWh55M%Iw#4eOaYIZO64ccErND4U+aG$yomoAWzCzE3Jr<=`WT(8^n^eK(9ad)U z*2~{^8(zt^UE{i_jjJro{#B1^^U*t=?t|1(BsvPR6hQOPF2~rmGF4!QW7~%J*Y)U!#+r* zJBfbi0k3SU(|emDJcN%SUoxEo1D{GEXjo3ov&e@T+(uGKAoc`(svE>&8g}n$x0l(NU&ZgXf`C*KKbzQ8j;)OG zx%J=@z5)LLTCQz%wa9noq&Dd+s0P-+yftqh?c9!)$slJ4)9DRR!8f%Gaz07HBB?W~2T^@qFbZzzR zW4FacR;v?jns9eqoLhHSe^3amSdy% zWNpHqulX*g0;IW_&N7)x(|5BNw> z?yf4KvwDI1g`K131au?^8{;SMinZ>9;Re+e;F6_#8cV5+>N)I#$im5RLXV6SDk9P{ zr&5way^SvWM_oB^OOK&`VoDtD0pmW^8Mro9;#^a9=__%R z{LQ3rq@Q}XYm~S`Hg}?(a6U%>3G1} zxK~;0zFS)faqOQhDaYoMX)zp%3S1o}1f+vny)@!hB&ePHUDPYq!EWutXEpt{`31s& zhZ2{PPYOnTMQX2tQ? z_qR7WCCKl$*9^F<`Dz}6{y!8R?L;IT){Vk-vP;aFkvp;34xwBk#4=ly*->@Ao}f4e zm<_6o){@#!i*`DSA6^5!L==x&T&^vfeZoX#43ObZKAi9=*V+9B{<_&mVFDE-#Xd>^ z$tnhivHYjUo`pN{WM)fw&tx;%TU=X~w)=W7vh+pSqL$8t-tu8h8V!-F3#PARr(?1@%$aJMWnhC)MxC+j}6{{R@w zd1~^c$4x=UWQA)V4ijzC`l2JP?zJl@&IUV*81B>=kfz&_F`~ZkRqfY-`>#{3AV-!Ek;ZtdHpW6OO>}@3mvDs+JK>>U0=AIXu;?}S{ls2HF>)Vg+MO7J}H%n@hD%l}%ro?=fU2lZ~ z4;ZWV$0)_t_9h%zX}K#YS07eL#dU9Xh;Kk|qqgu5k?~ErlAbvtg+4IoT0PZ)AP*`U z>!%V6W|2-Tv5RCRUA>xxm+$86)l0CueM)EdjVGzQc?ebt`pg z3rnBvSIh0H*SNY`Wt!}U++pMttSKP$dSq5}Z4Ty1%^T8DS=-p2q z?{AGUhZ`YD3Rv~5wi&0iR)T&L(Ou%M9c?Mr!IqViUN5{QT()~v%DGviJ1Wq(3c}mZ z%0A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%0DC0mqj5-Bq$I; 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 literal 94318 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

    BI^1^Ha9oeSmNsTee4R7vZOUM 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 From 99113947bf3ff83f705c47795ba344740490e855 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Oct 2025 18:31:25 +0300 Subject: [PATCH 127/230] SDNQ add RDNA2 INT8 support via Triton --- modules/sdnq/__init__.py | 4 +- modules/sdnq/common.py | 48 +++++++-- modules/sdnq/dequantizer.py | 6 +- modules/sdnq/layers/conv/conv_int8.py | 6 +- modules/sdnq/layers/linear/forward.py | 4 +- modules/sdnq/layers/linear/linear_int8.py | 6 +- modules/sdnq/triton_mm.py | 122 ++++++++++++++++++++++ 7 files changed, 172 insertions(+), 24 deletions(-) create mode 100644 modules/sdnq/triton_mm.py diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index c7d832bb9..1009fd811 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -11,7 +11,7 @@ from diffusers.quantizers.quantization_config import QuantizationConfigMixin from diffusers.utils import get_module_from_name from modules import devices, shared -from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types +from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm from .dequantizer import dequantizer_dict from .forward import get_forward_func @@ -172,7 +172,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if use_quantized_matmul and not re_quantize_for_matmul: scale.transpose_(0,1) layer.weight.transpose_(0,1) - if devices.backend == "ipex": + if use_contiguous_mm: layer.weight.data = layer.weight.contiguous() elif layer.weight.is_contiguous(): layer.weight.data = layer.weight.t_().contiguous().t_() diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index b70c7b06b..ed131423d 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -1,12 +1,10 @@ # pylint: disable=redefined-builtin,no-member,protected-access import os -from functools import partial import torch from modules import shared, devices -torch_version = float(torch.__version__[:3]) dtype_dict = { "int8": {"min": -128, "max": 127, "num_bits": 8, "target_dtype": torch.int8, "torch_dtype": torch.int8, "storage_dtype": torch.int8, "is_unsigned": False, "is_integer": True}, @@ -33,23 +31,51 @@ if hasattr(torch, "float8_e4m3fnuz"): if hasattr(torch, "float8_e5m2fnuz"): dtype_dict["float8_e5m2fnuz"] = {"min": -57344, "max": 57344, "num_bits": 8, "target_dtype": "fp8", "torch_dtype": torch.float8_e5m2fnuz, "storage_dtype": torch.float8_e5m2fnuz, "is_unsigned": False, "is_integer": False} +linear_types = {"Linear"} +conv_types = {"Conv1d", "Conv2d", "Conv3d"} +conv_transpose_types = {"ConvTranspose1d", "ConvTranspose2d", "ConvTranspose3d"} +allowed_types = set.union(linear_types, conv_types, conv_transpose_types) + use_torch_compile = shared.opts.sdnq_dequantize_compile # this setting requires a full restart of the webui to apply +is_rdna2 = bool(devices.backend == "rocm" and int(getattr(torch.cuda.get_device_properties(devices.device), "gcnArchName", "gfx0000")[3:]) < 1100) -if devices.backend == "cuda" and os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", None) is None: - # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting - use_tensorwise_fp8_matmul = torch.cuda.get_device_capability(devices.device) < (9,0) + +if os.environ.get("SDNQ_USE_TENSORWISE_FP8_MM", None) is None: + # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting + use_tensorwise_fp8_matmul = bool(devices.backend == "cuda" and torch.cuda.get_device_capability(devices.device) < (9,0)) else: - use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MATMUL", "1").lower() not in {"0", "false", "no"} + use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MM", "1").lower() not in {"0", "false", "no"} + +if os.environ.get("SDNQ_USE_CONTIGUOUS_MM", None) is None: + use_contiguous_mm = bool(is_rdna2 or devices.backend in {"cpu", "ipex", "zluda"}) +else: + use_contiguous_mm = bool(os.environ.get("SDNQ_USE_CONTIGUOUS_MM", "0").lower() not in {"0", "false", "no"}) + +if os.environ.get("SDNQ_USE_TRITON_MM", None) is None: + use_triton_mm = bool(is_rdna2 or devices.backend in {"cuda", "zluda"}) +else: + use_triton_mm = bool(os.environ.get("SDNQ_USE_TRITON_MM", "0").lower() not in {"0", "false", "no"}) + + +if use_triton_mm: + try: + from .triton_mm import int_mm + int_mm_func = int_mm + except ImportError: + int_mm_func = torch._int_mm +else: + int_mm_func = torch._int_mm -linear_types = ("Linear",) -conv_types = ("Conv1d", "Conv2d", "Conv3d") -conv_transpose_types = ("ConvTranspose1d", "ConvTranspose2d", "ConvTranspose3d") -allowed_types = linear_types + conv_types + conv_transpose_types if use_torch_compile: torch._dynamo.config.cache_size_limit = max(8192, torch._dynamo.config.cache_size_limit) torch._dynamo.config.accumulated_recompile_limit = max(8192, torch._dynamo.config.accumulated_recompile_limit) - compile_func = partial(torch.compile, fullgraph=True, dynamic=False) + def compile_func(fn, **kwargs): + if kwargs.get("fullgraph", None) is None: + kwargs["fullgraph"] = True + if kwargs.get("dynamic", None) is None: + kwargs["dynamic"] = False + return torch.compile(fn, **kwargs) else: def compile_func(fn, **kwargs): # pylint: disable=unused-argument return fn diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 22771b643..411ae236c 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from .common import dtype_dict, compile_func +from .common import dtype_dict, compile_func, use_contiguous_mm from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric @@ -51,11 +51,9 @@ def quantize_fp8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.Tensor, def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: if weight.ndim > 2: # convs weight = weight.flatten(1,-1) - if weight.device.type == "xpu": - # return contiguous + if use_contiguous_mm: weight, scale = quantize_int8(weight.t(), dim=0) else: - # return non-contiguous weight, scale = quantize_int8(weight, dim=-1) weight, scale = weight.t_(), scale.t_() return weight, scale diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index 0ae26b8f5..294f696b4 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -4,7 +4,7 @@ from typing import List import torch -from ...common import compile_func # noqa: TID252 +from ...common import compile_func, int_mm_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from ..linear.linear_int8 import quantize_int8_matmul_input # noqa: TID252 @@ -33,13 +33,13 @@ def conv_int8_matmul( input, weight = check_mats(input, weight) if groups == 1: - result = torch._int_mm(input, weight) + result = int_mm_func(input, weight) else: weight = weight.view(weight.shape[0], groups, weight.shape[1] // groups) input = input.view(input.shape[0], groups, input.shape[1] // groups) result = [] for i in range(groups): - result.append(torch._int_mm(input[:, i], weight[:, i])) + result.append(int_mm_func(input[:, i], weight[:, i])) result = torch.cat(result, dim=-1) if bias is not None: result = dequantize_symmetric_with_bias(result, scale, bias, return_dtype, mm_output_shape) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index fc5b2ce60..880b8ebc8 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -4,10 +4,12 @@ from typing import Tuple import torch +from ...common import use_contiguous_mm # noqa: TID252 + def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: input = input.contiguous() - if weight.device.type == "xpu": + if use_contiguous_mm: weight = weight.contiguous() elif weight.is_contiguous(): weight = weight.t().contiguous().t() diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index bfca56ce2..ae218a4fe 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from ...common import compile_func # noqa: TID252 +from ...common import compile_func, int_mm_func # noqa: TID252 from ...packed_int import unpack_int_symetric # noqa: TID252 from ...dequantizer import quantize_int8, dequantize_symmetric, dequantize_symmetric_with_bias # noqa: TID252 from .forward import check_mats @@ -34,9 +34,9 @@ def int8_matmul( input, scale = quantize_int8_matmul_input(input, scale) input, weight = check_mats(input, weight) if bias is not None: - return dequantize_symmetric_with_bias(torch._int_mm(input, weight), scale, bias, return_dtype, output_shape) + return dequantize_symmetric_with_bias(int_mm_func(input, weight), scale, bias, return_dtype, output_shape) else: - return dequantize_symmetric(torch._int_mm(input, weight), scale, return_dtype, output_shape) + return dequantize_symmetric(int_mm_func(input, weight), scale, return_dtype, output_shape) def quantized_linear_forward_int8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: diff --git a/modules/sdnq/triton_mm.py b/modules/sdnq/triton_mm.py new file mode 100644 index 000000000..d15294c3e --- /dev/null +++ b/modules/sdnq/triton_mm.py @@ -0,0 +1,122 @@ +""" +Modified from Triton MatMul example. +PyTorch torch._int_mm is broken on backward pass with Nvidia. +AMD RDNA2 doesn't support torch._int_mm, so we use int_mm via Triton. +""" + +import torch + +import triton +import triton.language as tl + + +def get_autotune_config(): + if triton.runtime.driver.active.get_current_target().backend == "cuda": + return [ + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=3, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=5, num_warps=2), + triton.Config({'BLOCK_SIZE_M': 32, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=5, num_warps=2), + # + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=3, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=3, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=4, num_warps=4), + ] + else: + return [ + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=2), + triton.Config({'BLOCK_SIZE_M': 32, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 32, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=2), + # + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 32, 'BLOCK_SIZE_K': 64, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=8), + triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 128, 'GROUP_SIZE_M': 8}, num_stages=2, num_warps=4), + ] + + +@triton.autotune(configs=get_autotune_config(), key=['M', 'N', 'K', 'stride_bk']) +@triton.jit +def int_mm_kernel( + a_ptr, b_ptr, c_ptr, + M, N, K, + stride_am, stride_ak, + stride_bk, stride_bn, + stride_cm, stride_cn, + BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, # + GROUP_SIZE_M: tl.constexpr +): + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + tl.assume(pid_m >= 0) + tl.assume(pid_n >= 0) + tl.assume(stride_am > 0) + tl.assume(stride_ak > 0) + tl.assume(stride_bn > 0) + tl.assume(stride_bk > 0) + tl.assume(stride_cm > 0) + tl.assume(stride_cn > 0) + + offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M + offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N + offs_k = tl.arange(0, BLOCK_SIZE_K) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) + b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) + + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.int32) + for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): + a = tl.load(a_ptrs, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) + b = tl.load(b_ptrs, mask=offs_k[:, None] < K - k * BLOCK_SIZE_K, other=0.0) + accumulator = tl.dot(a, b, accumulator, out_dtype=tl.int32) + a_ptrs += BLOCK_SIZE_K * stride_ak + b_ptrs += BLOCK_SIZE_K * stride_bk + + offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) + c_ptrs = c_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] + c_mask = (offs_cm[:, None] < M) & (offs_cn[None, :] < N) + tl.store(c_ptrs, accumulator, mask=c_mask) + + +def int_mm(a, b): + assert a.shape[1] == b.shape[0], "Incompatible dimensions" + assert a.is_contiguous(), "Matrix A must be contiguous" + M, K = a.shape + K, N = b.shape + c = torch.empty((M, N), device=a.device, dtype=torch.int32) + def grid(META): + return (triton.cdiv(M, META['BLOCK_SIZE_M']) * triton.cdiv(N, META['BLOCK_SIZE_N']), ) + int_mm_kernel[grid]( + a, b, c, + M, N, K, + a.stride(0), a.stride(1), + b.stride(0), b.stride(1), + c.stride(0), c.stride(1), + ) + return c From 5c5d7d5a86ac0d4602c959bdc761dd8101435a1d Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Oct 2025 18:38:18 +0300 Subject: [PATCH 128/230] cleanup --- modules/sdnq/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index ed131423d..5bcd60ce9 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -44,7 +44,7 @@ if os.environ.get("SDNQ_USE_TENSORWISE_FP8_MM", None) is None: # row-wise FP8 only exist on H100 hardware, sdnq will use software row-wise with tensorwise hardware with this setting use_tensorwise_fp8_matmul = bool(devices.backend == "cuda" and torch.cuda.get_device_capability(devices.device) < (9,0)) else: - use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MM", "1").lower() not in {"0", "false", "no"} + use_tensorwise_fp8_matmul = os.environ.get("SDNQ_USE_TENSORWISE_FP8_MM", "0").lower() not in {"0", "false", "no"} if os.environ.get("SDNQ_USE_CONTIGUOUS_MM", None) is None: use_contiguous_mm = bool(is_rdna2 or devices.backend in {"cpu", "ipex", "zluda"}) From df142afe81d1e1f12223efd7dcae73e9dde7a77e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Oct 2025 18:48:03 +0300 Subject: [PATCH 129/230] don't use triton mm for nvidia --- modules/sdnq/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 5bcd60ce9..8d0114e3e 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -52,7 +52,7 @@ else: use_contiguous_mm = bool(os.environ.get("SDNQ_USE_CONTIGUOUS_MM", "0").lower() not in {"0", "false", "no"}) if os.environ.get("SDNQ_USE_TRITON_MM", None) is None: - use_triton_mm = bool(is_rdna2 or devices.backend in {"cuda", "zluda"}) + use_triton_mm = bool(is_rdna2 or devices.backend == "zluda") else: use_triton_mm = bool(os.environ.get("SDNQ_USE_TRITON_MM", "0").lower() not in {"0", "false", "no"}) From f2e12a682ffc40ad7be52ed05e1954dce32bd0bc Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Oct 2025 19:17:05 +0300 Subject: [PATCH 130/230] SDNQ remove use_contiguous_mm path in re_quant --- modules/sdnq/dequantizer.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 411ae236c..3881cfe34 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -4,7 +4,7 @@ from typing import Tuple import torch -from .common import dtype_dict, compile_func, use_contiguous_mm +from .common import dtype_dict, compile_func from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric @@ -51,11 +51,7 @@ def quantize_fp8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.Tensor, def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: if weight.ndim > 2: # convs weight = weight.flatten(1,-1) - if use_contiguous_mm: - weight, scale = quantize_int8(weight.t(), dim=0) - else: - weight, scale = quantize_int8(weight, dim=-1) - weight, scale = weight.t_(), scale.t_() + weight, scale = quantize_int8(weight.t(), dim=0) return weight, scale From 8b698ed67f3da4b0a41b1bfe5bb2d5b6834bb4f8 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 15:48:42 -0400 Subject: [PATCH 131/230] upadte qwen pruning and allow hf models in subfolders Signed-off-by: Vladimir Mandic --- html/reference.json | 23 ++++++++++++++--------- modules/extras.py | 14 +++++++------- modules/modelloader.py | 6 ++++-- modules/modelstats.py | 2 +- modules/onnx_impl/ui.py | 4 ++-- modules/sd_checkpoint.py | 23 +++++++++++++++++------ modules/sd_models.py | 2 +- modules/sd_models_utils.py | 4 +++- modules/ui_extra_networks_checkpoints.py | 4 +++- modules/ui_settings.py | 2 +- pipelines/model_qwen.py | 2 +- pipelines/qwen/qwen_pruning.py | 16 ++++++++-------- scripts/stablevideodiffusion.py | 2 +- scripts/text2video.py | 2 +- scripts/xyz/xyz_grid_shared.py | 4 ++-- wiki | 2 +- 16 files changed, 67 insertions(+), 45 deletions(-) diff --git a/html/reference.json b/html/reference.json index ad1b7e333..2c3ca1d7e 100644 --- a/html/reference.json +++ b/html/reference.json @@ -234,31 +234,36 @@ "size": 56.1, "date": "2025 August" }, - "Qwen-Image-Pruning": { - "path": "OPPOer/Qwen-Image-Pruning-13B", + "Qwen-Image Pruning-13B": { + "path": "OPPOer/Qwen-Image-Pruning", "subfolder": "Qwen-Image-13B", "preview": "vladmandic--Qwen-Lightning-Edit.jpg", "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, - "size": 56.1, "date": "2025 Ocotober" }, - "Qwen-Image-Edit-Pruning": { - "path": "OPPOer/Qwen-Image-Edit-Pruning-13B", + "Qwen-Image Pruning-12B": { + "path": "OPPOer/Qwen-Image-Pruning", + "subfolder": "Qwen-Image-12B-40steps", + "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", + "skip": true, + "date": "2025 Ocotober" + }, + "Qwen-Image-Edit Pruning-13B": { + "path": "OPPOer/Qwen-Image-Edit-Pruning", "subfolder": "Qwen-Image-Edit-13B", "preview": "vladmandic--Qwen-Lightning-Edit.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, - "size": 56.1, "date": "2025 Ocotober" }, - "Qwen-Image-Edit-2509-Pruning": { - "path": "OPPOer/Qwen-Image-Edit-Pruning-14B", + "Qwen-Image-Edit-2509 Pruning-14B": { + "path": "OPPOer/Qwen-Image-Edit-Pruning", "subfolder": "Qwen-Image-Edit-2509-14B", "preview": "vladmandic--Qwen-Lightning-Edit.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, - "size": 56.1, "date": "2025 Ocotober" }, diff --git a/modules/extras.py b/modules/extras.py index 2914d6c1e..4f282653c 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -39,24 +39,24 @@ def run_modelmerger(id_task, **kwargs): # pylint: disable=unused-argument return [*[gr.update() for _ in range(4)], message] kwargs["models"] = { - "model_a": sd_models.get_closet_checkpoint_match(kwargs.get("primary_model_name", None)).filename, - "model_b": sd_models.get_closet_checkpoint_match(kwargs.get("secondary_model_name", None)).filename, + "model_a": sd_models.get_closest_checkpoint_match(kwargs.get("primary_model_name", None)).filename, + "model_b": sd_models.get_closest_checkpoint_match(kwargs.get("secondary_model_name", None)).filename, } if kwargs.get("primary_model_name", None) in [None, 'None']: return fail("Failed: Merging requires a primary model.") - primary_model_info = sd_models.get_closet_checkpoint_match(kwargs.get("primary_model_name", None)) + primary_model_info = sd_models.get_closest_checkpoint_match(kwargs.get("primary_model_name", None)) if kwargs.get("secondary_model_name", None) in [None, 'None']: return fail("Failed: Merging requires a secondary model.") - secondary_model_info = sd_models.get_closet_checkpoint_match(kwargs.get("secondary_model_name", None)) + secondary_model_info = sd_models.get_closest_checkpoint_match(kwargs.get("secondary_model_name", None)) if kwargs.get("tertiary_model_name", None) in [None, 'None'] and kwargs.get("merge_mode", None) in merge_utils.TRIPLE_METHODS: return fail(f"Failed: Interpolation method ({kwargs.get('merge_mode', None)}) requires a tertiary model.") - tertiary_model_info = sd_models.get_closet_checkpoint_match(kwargs.get("tertiary_model_name", None)) if kwargs.get("merge_mode", None) in merge_utils.TRIPLE_METHODS else None + tertiary_model_info = sd_models.get_closest_checkpoint_match(kwargs.get("tertiary_model_name", None)) if kwargs.get("merge_mode", None) in merge_utils.TRIPLE_METHODS else None del kwargs["primary_model_name"] del kwargs["secondary_model_name"] if kwargs.get("tertiary_model_name", None) is not None: - kwargs["models"] |= {"model_c": sd_models.get_closet_checkpoint_match(kwargs.get("tertiary_model_name", None)).filename} + kwargs["models"] |= {"model_c": sd_models.get_closest_checkpoint_match(kwargs.get("tertiary_model_name", None)).filename} del kwargs["tertiary_model_name"] if kwargs.get("alpha_base", None) and kwargs.get("alpha_in_blocks", None) and kwargs.get("alpha_mid_block", None) and kwargs.get("alpha_out_blocks", None): @@ -204,7 +204,7 @@ def run_model_modules(model_type:str, model_name:str, custom_name:str, if len(custom_name) == 0: yield msg("output name is required", err=True) return - checkpoint_info = sd_models.get_closet_checkpoint_match(model_name) + checkpoint_info = sd_models.get_closest_checkpoint_match(model_name) if checkpoint_info is None: yield msg("input model not found", err=True) return diff --git a/modules/modelloader.py b/modules/modelloader.py index 0502a367c..5018d5cb9 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -227,6 +227,8 @@ def get_reference_opts(name: str, quiet=False): def load_reference(name: str, variant: str = None, revision: str = None, mirror: str = None, custom_pipeline: str = None): + if '+' in name: + name = name.split('+')[0] found = [r for r in diffuser_repos if name == r['name'] or name == r['friendly'] or name == r['path']] if len(found) > 0: # already downloaded model_opts = get_reference_opts(found[0]['name']) @@ -258,7 +260,7 @@ def load_reference(name: str, variant: str = None, revision: str = None, mirror: def load_civitai(model: str, url: str): from modules import sd_models name, _ext = os.path.splitext(model) - info = sd_models.get_closet_checkpoint_match(name) + info = sd_models.get_closest_checkpoint_match(name) if info is not None: _model_opts = get_reference_opts(info.model_name) return name # already downloaded @@ -268,7 +270,7 @@ def load_civitai(model: str, url: str): download_civit_model_thread(model_name=model, model_url=url, model_path='', model_type='safetensors', token=shared.opts.civitai_token) shared.log.debug(f'Reference download complete: model="{name}"') sd_models.list_models() - info = sd_models.get_closet_checkpoint_match(name) + info = sd_models.get_closest_checkpoint_match(name) if info is not None: shared.log.debug(f'Reference: model="{name}"') return name # already downloaded diff --git a/modules/modelstats.py b/modules/modelstats.py index 2e5e7f447..2ab1a6b62 100644 --- a/modules/modelstats.py +++ b/modules/modelstats.py @@ -79,7 +79,7 @@ class Model(): return self.cls = shared.sd_model.__class__.__name__ self.type = shared.sd_model_type - self.info = sd_models.get_closet_checkpoint_match(name) + self.info = sd_models.get_closest_checkpoint_match(name) if self.info is not None: self.name = self.info.name or self.name self.hash = self.info.shorthash or '' diff --git a/modules/onnx_impl/ui.py b/modules/onnx_impl/ui.py index 0af6ba345..703392d82 100644 --- a/modules/onnx_impl/ui.py +++ b/modules/onnx_impl/ui.py @@ -15,7 +15,7 @@ def create_ui(): from modules.ui_common import create_refresh_button from modules.ui_components import DropdownMulti from modules.shared import log, opts, cmd_opts, refresh_checkpoints - from modules.sd_models import checkpoint_titles, get_closet_checkpoint_match + from modules.sd_models import checkpoint_titles, get_closest_checkpoint_match from modules.paths import sd_configs_path from .execution_providers import ExecutionProvider, install_execution_provider from .utils import check_diffusers_cache @@ -74,7 +74,7 @@ def create_ui(): cache_remove_optimized.click(fn=remove_cache_optimized, inputs=[cache_state_dirname, cache_optimized_selected,]) def cache_update_menus(query: str): - checkpoint_info = get_closet_checkpoint_match(query) + checkpoint_info = get_closest_checkpoint_match(query) if checkpoint_info is None: log.error(f"Could not find checkpoint object for '{query}'.") return diff --git a/modules/sd_checkpoint.py b/modules/sd_checkpoint.py index 6870c740f..4b0be2e97 100644 --- a/modules/sd_checkpoint.py +++ b/modules/sd_checkpoint.py @@ -22,12 +22,12 @@ warn_once = False class CheckpointInfo: - def __init__(self, filename, sha=None): + def __init__(self, filename, sha=None, subfolder=None): self.name = None self.hash = sha self.filename = filename self.type = '' - self.subfolder = None + self.subfolder = subfolder relname = filename app_path = os.path.abspath(paths.script_path) @@ -197,13 +197,13 @@ def remove_hash(s): return re.sub(r'\s*\[.*?\]', '', s) -def get_closet_checkpoint_match(s: str) -> CheckpointInfo: +def get_closest_checkpoint_match(s: str) -> CheckpointInfo: + # direct hf url if s.startswith('https://huggingface.co/'): model_name = s.replace('https://huggingface.co/', '') checkpoint_info = CheckpointInfo(model_name) # create a virutal model info checkpoint_info.type = 'huggingface' return checkpoint_info - if s.startswith('huggingface/'): model_name = s.replace('huggingface/', '') checkpoint_info = CheckpointInfo(model_name) # create a virutal model info @@ -229,6 +229,16 @@ def get_closet_checkpoint_match(s: str) -> CheckpointInfo: # absolute path if s.endswith('.safetensors') and os.path.isfile(s): checkpoint_info = CheckpointInfo(s) + checkpoint_info.type = 'safetensors' + return checkpoint_info + + # reference search + ref = [(k, v) for k, v in shared.reference_models.items() if f"{v.get('path', '')}+{v.get('subfolder', '')}" == s] + if ref and len(ref) > 0: + _name, info = ref[0] + checkpoint_info = CheckpointInfo(s) + checkpoint_info.subfolder = info.get('subfolder', None) + checkpoint_info.type = 'reference' return checkpoint_info # huggingface search @@ -247,7 +257,8 @@ def get_closet_checkpoint_match(s: str) -> CheckpointInfo: if found is not None and len(found) == 1: checkpoint_info = CheckpointInfo(s) checkpoint_info.type = 'huggingface' - checkpoint_info.subfolder = subfolder + if subfolder is not None and len(subfolder) > 0: + checkpoint_info.subfolder = subfolder return checkpoint_info # civitai search @@ -281,7 +292,7 @@ def select_checkpoint(op='model', sd_model_checkpoint=None): model_checkpoint = sd_model_checkpoint or (shared.opts.data.get('sd_model_refiner', None) if op == 'refiner' else shared.opts.data.get('sd_model_checkpoint', None)) if model_checkpoint is None or model_checkpoint == 'None' or len(model_checkpoint) < 3: return None - checkpoint_info = get_closet_checkpoint_match(model_checkpoint) + checkpoint_info = get_closest_checkpoint_match(model_checkpoint) if checkpoint_info is not None: shared.log.info(f'Load {op}: select="{checkpoint_info.title if checkpoint_info is not None else None}"') return checkpoint_info diff --git a/modules/sd_models.py b/modules/sd_models.py index bb89f6df2..8e971e400 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -13,7 +13,7 @@ from installer import log from modules import timer, paths, shared, shared_items, modelloader, devices, script_callbacks, sd_vae, sd_unet, errors, sd_models_compile, sd_hijack_accelerate, sd_detect, model_quant, sd_hijack_te from modules.memstats import memory_stats from modules.modeldata import model_data -from modules.sd_checkpoint import CheckpointInfo, select_checkpoint, list_models, checkpoints_list, checkpoint_titles, get_closet_checkpoint_match, model_hash, update_model_hashes, setup_model, write_metadata, read_metadata_from_safetensors # pylint: disable=unused-import +from modules.sd_checkpoint import CheckpointInfo, select_checkpoint, list_models, checkpoints_list, checkpoint_titles, get_closest_checkpoint_match, model_hash, update_model_hashes, setup_model, write_metadata, read_metadata_from_safetensors # pylint: disable=unused-import from modules.sd_offload import disable_offload, set_diffuser_offload, apply_balanced_offload, set_accelerate # pylint: disable=unused-import from modules.sd_models_utils import NoWatermark, get_signature, get_call, path_to_repo, patch_diffuser_config, convert_to_faketensors, read_state_dict, get_state_dict_from_checkpoint, apply_function_to_model # pylint: disable=unused-import diff --git a/modules/sd_models_utils.py b/modules/sd_models_utils.py index 0d201779c..637f8c585 100644 --- a/modules/sd_models_utils.py +++ b/modules/sd_models_utils.py @@ -8,7 +8,7 @@ import torch import safetensors.torch from modules import paths, shared, errors -from modules.sd_checkpoint import CheckpointInfo, select_checkpoint, list_models, checkpoints_list, checkpoint_titles, get_closet_checkpoint_match, model_hash, update_model_hashes, setup_model, write_metadata, read_metadata_from_safetensors # pylint: disable=unused-import +from modules.sd_checkpoint import CheckpointInfo, select_checkpoint, list_models, checkpoints_list, checkpoint_titles, get_closest_checkpoint_match, model_hash, update_model_hashes, setup_model, write_metadata, read_metadata_from_safetensors # pylint: disable=unused-import from modules.sd_offload import disable_offload, set_diffuser_offload, apply_balanced_offload, set_accelerate # pylint: disable=unused-import @@ -46,6 +46,8 @@ def path_to_repo(checkpoint_info): repo_id = repo_id.replace('--', '/') if repo_id.count('/') != 1: shared.log.warning(f'Model: repo="{repo_id}" repository not recognized') + if '+' in repo_id: + repo_id = repo_id.split('+')[0] return repo_id diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index ae4c98422..bd7bccc87 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -32,6 +32,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): def reference_downloaded(url): url = url.split('@')[0] if '@' in url else 'Diffusers/' + url + url = url.split('+')[0] if '+' in url else url return any(model.endswith(url) for model in existing) if not shared.opts.sd_checkpoint_autodownload or not shared.opts.extra_network_reference_enable: @@ -56,6 +57,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): mtime = datetime.strptime(mtime, '%Y %B') # 2025 January except Exception: _size, mtime = modelstats.stat(preview_file) + path = f'{v.get("path", "")}+{v.get("subfolder", "")}' yield { "type": 'Model', "name": name, @@ -63,7 +65,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): "filename": url, "preview": self.find_preview(os.path.join(paths.reference_path, preview)), "local_preview": preview_file, - "onclick": '"' + html.escape(f"selectReference({json.dumps(url)})") + '"', + "onclick": '"' + html.escape(f"selectReference({json.dumps(path)})") + '"', "hash": None, "mtime": mtime, "size": size, diff --git a/modules/ui_settings.py b/modules/ui_settings.py index 4cee32959..926b31762 100644 --- a/modules/ui_settings.py +++ b/modules/ui_settings.py @@ -24,7 +24,7 @@ def apply_setting(key, value): if key in shared.opts.disable_apply_metadata: gr.update() if key == "sd_model_checkpoint": - ckpt_info = sd_models.get_closet_checkpoint_match(value) + ckpt_info = sd_models.get_closest_checkpoint_match(value) if ckpt_info is not None: value = ckpt_info.title else: diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index eedefd014..6ed90bb15 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -55,7 +55,7 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): repo_te = 'Qwen/Qwen-Image' text_encoder = generic.load_text_encoder(repo_te, cls_name=transformers.Qwen2_5_VLForConditionalGeneration, load_config=diffusers_load_config) - repo_id = qwen.check_qwen_pruning(repo_id) + repo_id, repo_subfolder = qwen.check_qwen_pruning(repo_id, repo_subfolder) pipe = cls_name.from_pretrained( repo_id, transformer=transformer, diff --git a/pipelines/qwen/qwen_pruning.py b/pipelines/qwen/qwen_pruning.py index 971589958..e2a642af1 100644 --- a/pipelines/qwen/qwen_pruning.py +++ b/pipelines/qwen/qwen_pruning.py @@ -1,12 +1,12 @@ -def check_qwen_pruning(repo_id): +def check_qwen_pruning(repo_id, subfolder): from modules.shared import log if 'pruning' not in repo_id.lower(): - return repo_id - if '2509' in repo_id: - repo_id = "Qwen/Qwen-Image-Edit-2509" - elif 'Edit' in repo_id: - repo_id = "Qwen/Qwen-Image-Edit" + return repo_id, subfolder + if '2509' in (repo_id or '') or '2509' in (subfolder or ''): + repo_id, subfolder = "Qwen/Qwen-Image-Edit-2509", None + elif 'Edit' in (repo_id or '') or 'Edit' in (subfolder or ''): + repo_id, subfolder = "Qwen/Qwen-Image-Edit", None else: - repo_id = "Qwen/Qwen-Image" + repo_id, subfolder = "Qwen/Qwen-Image", None log.debug(f'Load model: variant=pruning target="{repo_id}"') - return repo_id + return repo_id, subfolder diff --git a/scripts/stablevideodiffusion.py b/scripts/stablevideodiffusion.py index 76aa08b22..a0b959824 100644 --- a/scripts/stablevideodiffusion.py +++ b/scripts/stablevideodiffusion.py @@ -53,7 +53,7 @@ class Script(scripts_manager.Script): # load/download model on-demand model_path = models[model] model_name = os.path.basename(model_path) - has_checkpoint = sd_models.get_closet_checkpoint_match(model_path) + has_checkpoint = sd_models.get_closest_checkpoint_match(model_path) if has_checkpoint is None: shared.log.error(f'SVD: no checkpoint for {model_name}') modelloader.load_reference(model_path, variant='fp16') diff --git a/scripts/text2video.py b/scripts/text2video.py index b69fd7605..f6880b10f 100644 --- a/scripts/text2video.py +++ b/scripts/text2video.py @@ -62,7 +62,7 @@ class Script(scripts_manager.Script): if model['path'] in shared.opts.sd_model_checkpoint: shared.log.debug(f'Text2Video cached: model={shared.opts.sd_model_checkpoint}') else: - checkpoint = sd_models.get_closet_checkpoint_match(model['path']) + checkpoint = sd_models.get_closest_checkpoint_match(model['path']) if checkpoint is None: shared.log.debug(f'Text2Video downloading: model={model["path"]}') checkpoint = modelloader.download_diffusers_model(hub_id=model['path']) diff --git a/scripts/xyz/xyz_grid_shared.py b/scripts/xyz/xyz_grid_shared.py index 76d4df769..dd454d3c2 100644 --- a/scripts/xyz/xyz_grid_shared.py +++ b/scripts/xyz/xyz_grid_shared.py @@ -164,7 +164,7 @@ def apply_sdnq_quant_te(p, x, xs): def apply_checkpoint(p, x, xs): if x == shared.opts.sd_model_checkpoint: return - info = sd_models.get_closet_checkpoint_match(x) + info = sd_models.get_closest_checkpoint_match(x) if info is None: shared.log.warning(f"XYZ grid: apply checkpoint unknown checkpoint: {x}") else: @@ -178,7 +178,7 @@ def apply_refiner(p, x, xs): return if x == 'None': return - info = sd_models.get_closet_checkpoint_match(x) + info = sd_models.get_closest_checkpoint_match(x) if info is None: shared.log.warning(f"XYZ grid: apply refiner unknown checkpoint: {x}") else: diff --git a/wiki b/wiki index dfcb801c5..f0f550688 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit dfcb801c592a493d48b7e22a0a46ab39340fd021 +Subproject commit f0f5506886e1478d08081ce5296eb246291fc196 From 4257ed7c4000c4438c3acba930757bfc539d74df Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Oct 2025 22:59:58 +0300 Subject: [PATCH 132/230] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34b0ec27..45a1a05e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,10 @@ main logo in top-left corner now indicates server connection status and hovering over it shows connection details - separate guidance and detail sections - networks ability to filter lora by base model version +- **SDNQ** + - make sdnq scales compatible with balanced offload + - add int8 matmul support for rdna2 gpus via triton + - improve int8 mamtul performance on intel gpus - **Other** - server will note when restart is recommended due to package updates - **interrrupt** will now show last known preview image From c530167cbe0403506f9ed1184645281feb21d8eb Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 18:06:22 -0400 Subject: [PATCH 133/230] qwen multi-image edits Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 ++++++++- javascript/control.js | 8 ++------ modules/control/run.py | 1 + modules/processing_args.py | 16 +++++++++------- modules/processing_class.py | 4 +++- modules/ui_control.py | 18 +++++++++--------- modules/ui_control_helpers.py | 10 +++++----- 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a1a05e3..9ba0cb443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-03 +## Update for 2025-10-04 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -18,6 +18,11 @@ note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models - **Features** + - [Qwen Image-Edit] multi-image editing + requires qwen-image-edit-2509 or its variant as multi-image edits are not available in original qwen-image + in ui control tab: inputs -> separate init image + add image for *input media* and *control media* + can be - [Cache-DiT](https://github.com/vipshop/cache-dit) cache-dit is a unified, flexible and training-free cache acceleration framework compatible with many dit-based models such as FLUX.1, Qwen, HunyuanImage, Wan2.2, Chroma, etc. @@ -87,6 +92,8 @@ - **modular guiders**: automatically used for compatible pipelines when *modular pipelines* is enabled allows for using many different guidance methods: *CFG, CFGZero, PAG, APG, SLG, SEG, TCFG, FDG* +- **Wiki** + - updates to *AMD-ROCm, ZLUDA, LoRA, DirectML, SDNQ* pages - **Fixes** - **Microsoft Florence 2** both base and large variants *note* this will trigger download of the new variant of the model, feel free to delete older variant in `huggingface` folder diff --git a/javascript/control.js b/javascript/control.js index 1c1c8b3cc..c94c61a67 100644 --- a/javascript/control.js +++ b/javascript/control.js @@ -2,13 +2,9 @@ function controlInputMode(inputMode, ...args) { const updateEl = gradioApp().getElementById('control_update'); if (updateEl) updateEl.click(); const tab = gradioApp().querySelector('#control-tab-input button.selected'); - if (!tab) return ['Select', ...args]; + if (!tab) return ['Image', ...args]; inputMode = tab.innerText; - if (inputMode === 'Image') { - if (!gradioApp().getElementById('control_input_select').classList.contains('hidden')) inputMode = 'Select'; - else if (!gradioApp().getElementById('control_input_resize').classList.contains('hidden')) inputMode = 'Outpaint'; - else if (!gradioApp().getElementById('control_input_inpaint').classList.contains('hidden')) inputMode = 'Inpaint'; - } + console.log('HERE0', tab, inputMode); return [inputMode, ...args]; } diff --git a/modules/control/run.py b/modules/control/run.py index 3f6b0f7be..b62cad89f 100644 --- a/modules/control/run.py +++ b/modules/control/run.py @@ -388,6 +388,7 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg ) p.state = state p.is_tile = False + p.init_control = inits or [] p.orig_init_images = inputs # TODO modernui: monkey-patch for missing tabs.select event diff --git a/modules/processing_args.py b/modules/processing_args.py index c1f0b9cdb..3e28e158a 100644 --- a/modules/processing_args.py +++ b/modules/processing_args.py @@ -123,9 +123,11 @@ def task_specific_kwargs(p, model): } # model specific args - if 'QwenImageEdit' in model_cls and len(getattr(p, 'init_images', [])) == 0: + if 'QwenImageEdit' in model_cls and (p.init_images is None or len(p.init_images) == 0): task_args['image'] = [Image.new('RGB', (p.width, p.height), (0, 0, 0))] # monkey-patch so qwen-image-edit pipeline does not error-out on t2i - if 'LatentConsistencyModelPipeline' in model_cls and hasattr(p, 'init_images') and len(p.init_images) > 0: + if 'QwenImageEditPlusPipeline' in model_cls and p.init_control is not None and len(p.init_control) > 0: + task_args['image'] += p.init_control + if 'LatentConsistencyModelPipeline' in model_cls and len(p.init_images) > 0: p.ops.append('lcm') init_latents = [processing_vae.vae_encode(image, model=shared.sd_model, vae_type=p.vae_type).squeeze(dim=0) for image in p.init_images] init_latent = torch.stack(init_latents, dim=0).to(shared.device) @@ -133,11 +135,11 @@ def task_specific_kwargs(p, model): init_latent = (1 - p.denoising_strength) * init_latent + init_noise task_args = { 'latents': init_latent.to(model.dtype), - 'width': p.width if hasattr(p, 'width') else None, - 'height': p.height if hasattr(p, 'height') else None, + 'width': p.width, + 'height': p.height, } if 'BlipDiffusionPipeline' in model_cls: - if len(getattr(p, 'init_images', [])) == 0: + if len(p.init_images) == 0: shared.log.error('BLiP diffusion requires init image') return task_args task_args = { @@ -146,9 +148,9 @@ def task_specific_kwargs(p, model): 'target_subject_category': getattr(p, 'prompt', '').split()[-1], 'output_type': 'pil', } - if ('WanImageToVideoPipeline' in model_cls) and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): + if ('WanImageToVideoPipeline' in model_cls) and (p.init_images is not None) and (len(p.init_images) > 0): task_args['image'] = p.init_images[0] - if ('WanVACEPipeline' in model_cls) and (getattr(p, 'init_images', None) is not None) and (len(p.init_images) > 0): + if ('WanVACEPipeline' in model_cls) and (p.init_images is not None) and (len(p.init_images) > 0): task_args['reference_images'] = p.init_images if debug_enabled: diff --git a/modules/processing_class.py b/modules/processing_class.py index ddad4686e..8ac7286fc 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -78,7 +78,8 @@ class StableDiffusionProcessing: hdr_color_picker: str = None, hdr_tint_ratio: float = 0, # img2img - init_images: list = None, + init_images: list = [], + init_control: list = [], denoising_strength: float = 0.3, image_cfg_scale: float = None, initial_noise_multiplier: float = None, # pylint: disable=unused-argument # a1111 compatibility @@ -214,6 +215,7 @@ class StableDiffusionProcessing: self.detailer_resolution = detailer_resolution self.restore_faces = restore_faces self.init_images = init_images + self.init_control = init_control self.resize_mode = resize_mode self.resize_name = resize_name self.resize_context = resize_context diff --git a/modules/ui_control.py b/modules/ui_control.py index 3f43701af..5ac075d61 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -183,14 +183,14 @@ def create_ui(_blocks: gr.Blocks=None): with gr.Column(scale=9, elem_id='control-input-column', visible=True) as column_input: gr.HTML('Input

    ') with gr.Tabs(elem_classes=['control-tabs'], elem_id='control-tab-input'): + input_mode = gr.Label(value='select', visible=False) with gr.Tab('Image', id='in-image') as tab_image: - input_mode = gr.Label(value='select', visible=False) - input_image = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="editor", height=gr_height, visible=True, image_mode='RGB', elem_id='control_input_select', elem_classes=['control-image']) - input_resize = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="select", height=gr_height, visible=False, image_mode='RGB', elem_id='control_input_resize', elem_classes=['control-image']) - input_inpaint = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="sketch", height=gr_height, visible=False, image_mode='RGB', elem_id='control_input_inpaint', brush_radius=32, mask_opacity=0.6, elem_classes=['control-image']) + input_image = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="editor", height=gr_height, image_mode='RGB', elem_id='control_input_select', elem_classes=['control-image']) btn_interrogate = ui_sections.create_interrogate_button('control', what='input') - with gr.Row(): - input_buttons = [gr.Button('Select', visible=True, interactive=False), gr.Button('Inpaint', visible=True, interactive=True), gr.Button('Outpaint', visible=True, interactive=True)] + with gr.Tab('Inpaint', id='in-inpaint') as _tab_inpaint: + input_inpaint = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="sketch", height=gr_height, image_mode='RGB', elem_id='control_input_inpaint', brush_radius=32, mask_opacity=0.6, elem_classes=['control-image']) + with gr.Tab('Outpaint', id='in-outpaint') as _tab_outpaint: + input_resize = gr.Image(label="Input", show_label=False, type="pil", interactive=True, tool="select", height=gr_height, image_mode='RGB', elem_id='control_input_resize', elem_classes=['control-image']) with gr.Tab('Video', id='in-video') as tab_video: input_video = gr.Video(label="Input", show_label=False, interactive=True, height=gr_height, elem_classes=['control-image']) with gr.Tab('Batch', id='in-batch') as tab_batch: @@ -231,9 +231,9 @@ def create_ui(_blocks: gr.Blocks=None): input_script_args = scripts_manager.scripts_current.setup_ui(parent='control', accordion=True) # handlers - for btn in input_buttons: - btn.click(fn=helpers.copy_input, inputs=[input_mode, btn, input_image, input_resize, input_inpaint], outputs=[input_image, input_resize, input_inpaint], _js='controlInputMode') - btn.click(fn=helpers.transfer_input, inputs=[btn], outputs=[input_image, input_resize, input_inpaint] + input_buttons) + # for btn in input_buttons: + # btn.click(fn=helpers.copy_input, inputs=[input_mode, btn, input_image, input_resize, input_inpaint], outputs=[input_image, input_resize, input_inpaint], _js='controlInputMode') + # btn.click(fn=helpers.transfer_input, inputs=[btn], outputs=[input_image, input_resize, input_inpaint] + input_buttons) # hidden button to update gradio control values for u in units: diff --git a/modules/ui_control_helpers.py b/modules/ui_control_helpers.py index c5757c56f..05e31bf1c 100644 --- a/modules/ui_control_helpers.py +++ b/modules/ui_control_helpers.py @@ -77,7 +77,7 @@ def get_video(filepath: str): def select_input(input_mode, input_image, init_image, init_type, input_resize, input_inpaint, input_video, input_batch, input_folder): global busy, input_source, input_init, input_mask # pylint: disable=global-statement busy = True - if input_mode == 'Select': + if input_mode == 'Image': selected_input = input_image elif input_mode == 'Outpaint': selected_input = input_resize @@ -159,16 +159,16 @@ def copy_input(mode_from, mode_to, input_image, input_resize, input_inpaint): if mode_from == mode_to: return [gr.update(), gr.update(), gr.update()] - elif mode_to == 'Select': + elif mode_to == 'Image': return [getimg(input_resize) if mode_from == 'Outpaint' else getimg(input_inpaint), None, None] elif mode_to == 'Inpaint': - return [None, None, getimg(input_image) if mode_from == 'Select' else getimg(input_resize)] + return [None, None, getimg(input_image) if mode_from == 'Image' else getimg(input_resize)] elif mode_to == 'Outpaint': - return [None, getimg(input_image) if mode_from == 'Select' else getimg(input_inpaint), None] + return [None, getimg(input_image) if mode_from == 'Image' else getimg(input_inpaint), None] else: shared.log.error(f'Control transfer unknown input: from={mode_from} to={mode_to}') return [gr.update(), gr.update(), gr.update()] def transfer_input(dst): - return [gr.update(visible=dst=='Select'), gr.update(visible=dst=='Outpaint'), gr.update(visible=dst=='Inpaint'), gr.update(interactive=dst!='Select'), gr.update(interactive=dst!='Inpaint'), gr.update(interactive=dst!='Outpaint')] + return [gr.update(visible=dst=='Image'), gr.update(visible=dst=='Outpaint'), gr.update(visible=dst=='Inpaint'), gr.update(interactive=dst!='Image'), gr.update(interactive=dst!='Inpaint'), gr.update(interactive=dst!='Outpaint')] From f38de145839346550c1c00002f11ce9bf7b950cc Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 18:06:47 -0400 Subject: [PATCH 134/230] update modernui Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- wiki | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index e56b4f695..165925a2c 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit e56b4f69549e6654c953346082ff3947256c9636 +Subproject commit 165925a2cc849595053ddb147eb0dc781b302d2b diff --git a/wiki b/wiki index f0f550688..f483ca713 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit f0f5506886e1478d08081ce5296eb246291fc196 +Subproject commit f483ca7138cd2e67822f980d2eb8dc677202c7ce From 8325e886c722e64df7c33f0f2d016b873b151a63 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 18:11:52 -0400 Subject: [PATCH 135/230] add typo to legacy compatibility options Signed-off-by: Vladimir Mandic --- TODO.md | 1 + modules/sd_models.py | 1 + 2 files changed, 2 insertions(+) diff --git a/TODO.md b/TODO.md index 1a5475c7d..01bcdad79 100644 --- a/TODO.md +++ b/TODO.md @@ -36,6 +36,7 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### New models +- [Ovi](https://github.com/character-ai/Ovi) - [Kandinsky 5](https://github.com/ai-forever/Kandinsky-5) - [Bytedance Lynx](https://github.com/bytedance/lynx) - [HunyuanImage](https://huggingface.co/tencent/HunyuanImage-2.1) diff --git a/modules/sd_models.py b/modules/sd_models.py index 8e971e400..b8e3c0391 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -28,6 +28,7 @@ debug_move = log.trace if os.environ.get('SD_MOVE_DEBUG', None) is not None else debug_load = os.environ.get('SD_LOAD_DEBUG', None) debug_process = log.trace if os.environ.get('SD_PROCESS_DEBUG', None) is not None else lambda *args, **kwargs: None diffusers_version = int(diffusers.__version__.split('.')[1]) +get_closet_checkpoint_match = get_closest_checkpoint_match # legacy compatibility checkpoint_tiles = checkpoint_titles # legacy compatibility allow_post_quant = None pipe_switch_task_exclude = [ From 95217d48c1aeb3bd2bb1e838f779407aabc9f602 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 18:32:56 -0400 Subject: [PATCH 136/230] xyz add guidance params Signed-off-by: Vladimir Mandic --- scripts/xyz/xyz_grid_classes.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/xyz/xyz_grid_classes.py b/scripts/xyz/xyz_grid_classes.py index 0836adbbf..43dc9b2a3 100644 --- a/scripts/xyz/xyz_grid_classes.py +++ b/scripts/xyz/xyz_grid_classes.py @@ -201,8 +201,6 @@ axis_options = [ AxisOption("[Param] Height", int, apply_field("height")), AxisOption("[Param] Seed", int, apply_seed), AxisOption("[Param] Steps", int, apply_field("steps")), - AxisOption("[Param] Guidance scale", float, apply_field("cfg_scale")), - AxisOption("[Param] Guidance end", float, apply_field("cfg_end")), AxisOption("[Param] Variation seed", int, apply_field("subseed")), AxisOption("[Param] Variation strength", float, apply_field("subseed_strength")), AxisOption("[Param] Clip skip", float, apply_clip_skip), @@ -224,13 +222,15 @@ axis_options = [ AxisOption("[Sampler] Shift", float, apply_setting("schedulers_shift")), AxisOption("[Sampler] eta delta", float, apply_setting("eta_noise_seed_delta")), AxisOption("[Sampler] eta multiplier", float, apply_setting("scheduler_eta")), - AxisOption("[Guidance] Guidance name", str, apply_guidance, choices=lambda: ['Default', 'CFG', 'Auto', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG']), + AxisOption("[Guidance] scale", float, apply_field("cfg_scale")), + AxisOption("[Guidance] end", float, apply_field("cfg_end")), + AxisOption("[Guidance] image scale", float, apply_field("image_cfg_scale")), + AxisOption("[Guidance] rescale", float, apply_field("diffusers_guidance_rescale")), + AxisOption("[Guidance] modular name", str, apply_guidance, choices=lambda: ['Default', 'CFG', 'Auto', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG']), AxisOption("[Refine] Upscaler", str, apply_field("hr_upscaler"), cost=0.3, choices=lambda: [x.name for x in shared.sd_upscalers]), AxisOption("[Refine] Sampler", str, apply_hr_sampler_name, fmt=format_value_add_label, confirm=confirm_samplers, choices=lambda: [x.name for x in sd_samplers.samplers]), AxisOption("[Refine] Denoising strength", float, apply_field("denoising_strength")), AxisOption("[Refine] Hires steps", int, apply_field("hr_second_pass_steps")), - AxisOption("[Refine] Guidance scale", float, apply_field("image_cfg_scale")), - AxisOption("[Refine] Guidance rescale", float, apply_field("diffusers_guidance_rescale")), AxisOption("[Refine] Refiner start", float, apply_field("refiner_start")), AxisOption("[Refine] Refiner steps", float, apply_field("refiner_steps")), AxisOption("[Postprocess] Upscaler", str, apply_upscaler, cost=0.4, choices=lambda: [x.name for x in shared.sd_upscalers]), From 96e5e6f164413c13f1a23f7f4df6effcf5ad2bc1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 4 Oct 2025 18:33:26 -0400 Subject: [PATCH 137/230] update changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba0cb443..d722cc944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,7 +84,8 @@ - **attention** remove split-attention and add explicitly attention slicing enable/disable option enable in *settings -> compute settings* can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems - - **nunchaku** update to `1.0.1` and enhance installer + - **nunchaku** update to `1.0.1` and enhance installer + - **xyz-grid** add guidance section - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* From a164f3e0c282eb38f9cfd86e16434b3ebc6678f3 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 5 Oct 2025 03:12:05 +0300 Subject: [PATCH 138/230] SDNQ Improve UINT3 and below quant speed --- modules/sdnq/packed_int.py | 93 ++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 54 deletions(-) diff --git a/modules/sdnq/packed_int.py b/modules/sdnq/packed_int.py index 31e8d9214..09a38efbc 100644 --- a/modules/sdnq/packed_int.py +++ b/modules/sdnq/packed_int.py @@ -219,79 +219,64 @@ def unpack_uint4(packed_tensor: torch.ByteTensor, shape: torch.Size) -> torch.By def unpack_uint3(packed_tensor: torch.ByteTensor, shape: torch.Size) -> torch.ByteTensor: - result = torch.cat( - ( - torch.bitwise_and( - torch.cat( - ( - packed_tensor[:, :3], - torch.bitwise_right_shift(packed_tensor[:, :3], 3) - ), - dim=-1 - ), - 7 - ), - torch.bitwise_or( - torch.bitwise_right_shift(packed_tensor[:, :2], 6), - torch.bitwise_and( - torch.stack( - ( - torch.bitwise_right_shift(packed_tensor[:, 2], 4), - torch.bitwise_right_shift(packed_tensor[:, 2], 5), + result = torch.bitwise_and( + torch.cat( + ( + packed_tensor[:, :3], + torch.bitwise_right_shift(packed_tensor[:, :3], 3), + torch.bitwise_or( + torch.bitwise_right_shift(packed_tensor[:, :2], 6), + torch.bitwise_and( + torch.stack( + ( + torch.bitwise_right_shift(packed_tensor[:, 2], 4), + torch.bitwise_right_shift(packed_tensor[:, 2], 5), + ), + dim=-1 ), - dim=-1 + 4 ), - 4 ), ), + dim=-1 ), - dim=-1 + 7 ).view(shape) return result def unpack_uint2(packed_tensor: torch.ByteTensor, shape: torch.Size) -> torch.ByteTensor: - result = torch.cat( - ( - torch.bitwise_and( - torch.stack( - ( - packed_tensor, - torch.bitwise_right_shift(packed_tensor, 2), - torch.bitwise_right_shift(packed_tensor, 4) - ), - dim=-1 - ), - 3 + result = torch.bitwise_and( + torch.stack( + ( + packed_tensor, + torch.bitwise_right_shift(packed_tensor, 2), + torch.bitwise_right_shift(packed_tensor, 4), + torch.bitwise_right_shift(packed_tensor, 6), ), - torch.bitwise_right_shift(packed_tensor, 6).unsqueeze(-1), + dim=-1 ), - dim=-1 + 3 ).view(shape) return result def unpack_uint1(packed_tensor: torch.Tensor, shape: torch.Size) -> torch.Tensor: - result = torch.cat( - ( - torch.bitwise_and( - torch.stack( - ( - packed_tensor, - torch.bitwise_right_shift(packed_tensor, 1), - torch.bitwise_right_shift(packed_tensor, 2), - torch.bitwise_right_shift(packed_tensor, 3), - torch.bitwise_right_shift(packed_tensor, 4), - torch.bitwise_right_shift(packed_tensor, 5), - torch.bitwise_right_shift(packed_tensor, 6), - ), - dim=-1 - ), - 1 + result = torch.bitwise_and( + torch.stack( + ( + packed_tensor, + torch.bitwise_right_shift(packed_tensor, 1), + torch.bitwise_right_shift(packed_tensor, 2), + torch.bitwise_right_shift(packed_tensor, 3), + torch.bitwise_right_shift(packed_tensor, 4), + torch.bitwise_right_shift(packed_tensor, 5), + torch.bitwise_right_shift(packed_tensor, 6), + torch.bitwise_right_shift(packed_tensor, 7), ), - torch.bitwise_right_shift(packed_tensor, 7).unsqueeze(-1), + dim=-1 ), - dim=-1 + 1 ).view(shape) return result From 428600613aa47881c5af8624f97612a8d69dc83b Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 5 Oct 2025 15:30:15 +0300 Subject: [PATCH 139/230] SDNQ fix new transformers again --- modules/sdnq/__init__.py | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 1009fd811..39077d917 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -1,6 +1,6 @@ # pylint: disable=redefined-builtin,no-member,protected-access -from typing import Any, Dict, List, Tuple, Optional, Union +from typing import Dict, List, Tuple, Optional, Union from dataclasses import dataclass from enum import Enum @@ -286,8 +286,7 @@ class SDNQQuantizer(DiffusersQuantizer): model, param_value: "torch.Tensor", param_name: str, - state_dict: Dict[str, Any], # pylint: disable=unused-argument - **kwargs, # pylint: disable=unused-argument + *args, **kwargs, # pylint: disable=unused-argument ): if param_name.endswith(".weight"): split_param_name = param_name.split(".") @@ -303,8 +302,9 @@ class SDNQQuantizer(DiffusersQuantizer): return True else: return True - with devices.inference_context(): - param_value.data = param_value.clone() # safetensors is unable to release the cpu memory without this + if param_value is not None: + with devices.inference_context(): + param_value.data = param_value.clone() # safetensors is unable to release the cpu memory without this return False def check_quantized_param(self, *args, **kwargs) -> bool: @@ -313,6 +313,12 @@ class SDNQQuantizer(DiffusersQuantizer): """ return self.check_if_quantized_param(*args, **kwargs) + def param_needs_quantization(self, model, param_name: str, *args, **kwargs) -> bool: + """ + needed for transformers compatibilty, returns self.check_if_quantized_param + """ + return self.check_if_quantized_param(model, None, param_name, *args, **kwargs) + @devices.inference_context() def create_quantized_param( # pylint: disable=arguments-differ self, @@ -320,9 +326,7 @@ class SDNQQuantizer(DiffusersQuantizer): param_value: torch.FloatTensor, param_name: str, target_device: torch.device, - state_dict: Dict[str, Any], # pylint: disable=unused-argument - unexpected_keys: List[str], # pylint: disable=unused-argument - **kwargs, # pylint: disable=unused-argument + *args, **kwargs, # pylint: disable=unused-argument ): weights_dtype = self.quantization_config.weights_dtype if len(self.quantization_config.modules_dtype_dict.keys()) > 0: @@ -422,49 +426,49 @@ class SDNQQuantizer(DiffusersQuantizer): """ return self.get_accelerator_warm_up_factor() - def update_tp_plan(self, config): + def update_tp_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return config - def update_ep_plan(self, config): + def update_ep_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return config - def update_unexpected_keys(self, model, unexpected_keys: List[str], prefix: str) -> List[str]: # pylint: disable=unused-argument + def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return unexpected_keys - def update_missing_keys_after_loading(self, model, missing_keys: List[str], prefix: str) -> List[str]: # pylint: disable=unused-argument + def update_missing_keys_after_loading(self, model, missing_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return missing_keys - def update_state_dict_with_metadata(self, state_dict: dict, metadata: dict) -> dict: # pylint: disable=unused-argument + def update_state_dict_with_metadata(self, state_dict: dict, *args, **kwargs) -> dict: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return state_dict - def update_expected_keys(self, model, expected_keys: List[str], loaded_keys: List[str]) -> List[str]: # pylint: disable=unused-argument + def update_expected_keys(self, model, expected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return expected_keys - def update_param_name(self, param_name: str) -> str: + def update_param_name(self, param_name: str, *args, **kwargs) -> str: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ return param_name - def update_dtype(self, dtype: torch.dtype) -> torch.dtype: + def update_dtype(self, dtype: torch.dtype, *args, **kwargs) -> torch.dtype: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function """ From 18e24e9861e52a93e8dcd8ec73410fba608cc61c Mon Sep 17 00:00:00 2001 From: -akku- <151517253+akku1139@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:36:30 +0900 Subject: [PATCH 140/230] fix typo: "Transfrer" -> "Transfer" --- html/locale_en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/locale_en.json b/html/locale_en.json index 056637d2b..42d81e431 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -126,7 +126,7 @@ {"id":"","label":"➠ Sketch","localized":"","reload":"","hint":"Transfer image to sketch interface"}, {"id":"","label":"➠ Composite","localized":"","reload":"","hint":"Transfer image to inpaint sketch interface"}, {"id":"","label":"➠ Process","localized":"","reload":"","hint":"Transfer image to process interface"}, - {"id":"","label":"➠ Control","localized":"","reload":"","hint":"Transfrer image to control interface"}, + {"id":"","label":"➠ Control","localized":"","reload":"","hint":"Transfer image to control interface"}, {"id":"","label":"➠ Caption","localized":"","reload":"","hint":"Transfer image to caption interface"} ], "generate": [ From 7cd2c6d87f1e1aa3d6701baf9422c92c4672a616 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 09:56:28 -0400 Subject: [PATCH 141/230] update diffusers Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 +- installer.py | 2 +- wiki | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d722cc944..58e7aacb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-04 +## Update for 2025-10-05 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) diff --git a/installer.py b/installer.py index a4fea4002..63e678bef 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = 'b4297967a04cca6ac4493202c02d81c30d0f9ee8' # diffusers commit hash + sha = '2b7deffe361b7b0e1d2665a1f9f0bd4daea4927c' # diffusers commit hash if args.use_rocm or args.use_zluda or args.use_directml: sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) diff --git a/wiki b/wiki index f483ca713..c5321049f 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit f483ca7138cd2e67822f980d2eb8dc677202c7ce +Subproject commit c5321049fbab6169c0ffa10accde4ad139639f2a From 268798a24e82410a355b118cb957a59c78e69ecf Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 10:39:55 -0400 Subject: [PATCH 142/230] add framepack granular job tracking Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 +++ modules/framepack/framepack_vae.py | 5 ++++- modules/framepack/framepack_worker.py | 15 ++++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58e7aacb1..4d3d9a478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -107,6 +107,9 @@ - reference: fix download for sd15/sdxl reference models - fix checks in init/mask image decode - fix hf token with extra chars + - **FramePack** job state tracking + - **LTXVideo** with offloading + - **WAN** with offloading ## Update for 2025-09-15 diff --git a/modules/framepack/framepack_vae.py b/modules/framepack/framepack_vae.py index da5144cf7..908378a8b 100644 --- a/modules/framepack/framepack_vae.py +++ b/modules/framepack/framepack_vae.py @@ -85,7 +85,10 @@ def vae_decode(latents, vae_type): elif vae_type == 'Remote': return vae_decode_remote(latents) else: # vae_type == 'Full' - return vae_decode_full(latents) + jobid = shared.state.begin('VAE Decode') + result = vae_decode_full(latents) + shared.state.end(jobid) + return result def vae_encode(image): diff --git a/modules/framepack/framepack_worker.py b/modules/framepack/framepack_worker.py index eedbad13b..cda5677f8 100644 --- a/modules/framepack/framepack_worker.py +++ b/modules/framepack/framepack_worker.py @@ -65,14 +65,13 @@ def worker( metadata['title'] = 'sdnext framepack' metadata['description'] = f'variant:{variant} seed:{seed} steps:{steps} scale:{cfg_scale} distilled:{cfg_distilled} rescale:{cfg_rescale} shift:{shift} start:{start_weight} end:{end_weight} vision:{vision_weight}' - shared.state.begin('Video') + videojob = shared.state.begin('Video') shared.state.job_count = 1 text_encoder = shared.sd_model.text_encoder text_encoder_2 = shared.sd_model.text_encoder_2 tokenizer = shared.sd_model.tokenizer tokenizer_2 = shared.sd_model.tokenizer_2 - vae = shared.sd_model.vae feature_extractor = shared.sd_model.feature_extractor image_encoder = shared.sd_model.image_processor transformer = shared.sd_model.transformer @@ -196,7 +195,6 @@ def worker( image_encoder_last_hidden_state = vision_encode(input_image, end_image) # Sample loop - shared.state.textinfo = 'Sample' stream.output_queue.push(('progress', (None, 'Start sampling...'))) generator = torch.Generator("cpu").manual_seed(seed) if is_f1: @@ -213,6 +211,7 @@ def worker( llama_vec, llama_vec_n, llama_attention_mask, llama_attention_mask_n, clip_l_pooler, clip_l_pooler_n = text_encode(current_prompt, i=lattent_padding_loop+1) last_prompt = current_prompt + sammplejob = shared.state.begin('Sample') lattent_padding_loop += 1 # shared.log.trace(f'FramePack: op=sample section={lattent_padding_loop}/{len(latent_paddings)} frames={total_generated_frames}/{num_frames*len(latent_paddings)} window={latent_window_size} size={num_frames}') if is_f1: @@ -274,7 +273,6 @@ def worker( dtype=devices.dtype, callback=step_callback, ) - timer.process.add('sample', time.time()-t_sample) if is_last_section: generated_latents = torch.cat([start_latent.to(generated_latents), generated_latents], dim=2) @@ -287,15 +285,18 @@ def worker( history_latents = torch.cat([generated_latents.to(history_latents), history_latents], dim=2) real_history_latents = history_latents[:, :, :total_generated_latent_frames, :, :] - t_vae = time.time() sd_models.apply_balanced_offload(shared.sd_model) + timer.process.add('sample', time.time()-t_sample) + shared.state.end(sammplejob) + + t_vae = time.time() if history_pixels is None: history_pixels = framepack_vae.vae_decode(real_history_latents, vae_type=vae_type).cpu() else: overlapped_frames = latent_window_size * 4 - 3 if is_f1: section_latent_frames = latent_window_size * 2 - current_pixels = framepack_vae.vae_decode(real_history_latents[:, :, -section_latent_frames:], vae).cpu() + current_pixels = framepack_vae.vae_decode(real_history_latents[:, :, -section_latent_frames:], vae_type=vae_type).cpu() history_pixels = utils.soft_append_bcthw(history_pixels, current_pixels, overlapped_frames) else: section_latent_frames = (latent_window_size * 2 + 1) if is_last_section else (latent_window_size * 2) @@ -321,4 +322,4 @@ def worker( stream.output_queue.push(('end', None)) t1 = time.time() shared.log.info(f'Processed: frames={total_generated_frames} fps={total_generated_frames/(t1-t0):.2f} its={(shared.state.sampling_step)/(t1-t0):.2f} time={t1-t0:.2f} timers={timer.process.dct()} memory={memstats.memory_stats()}') - shared.state.end() + shared.state.end(videojob) From 9e52d0c1fbf76f2f9a2cccc224f0cd3cb71703c4 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 5 Oct 2025 22:50:30 +0300 Subject: [PATCH 143/230] SDNQ add SVDQuant quantization method --- CHANGELOG.md | 5 +- modules/lora/lora_apply.py | 53 +++++++++++-- modules/model_quant.py | 10 ++- modules/sdnq/__init__.py | 75 ++++++++++++++---- modules/sdnq/dequantizer.py | 78 +++++++++++-------- modules/sdnq/layers/conv/conv_fp8.py | 12 ++- .../sdnq/layers/conv/conv_fp8_tensorwise.py | 13 +++- modules/sdnq/layers/conv/conv_int8.py | 15 +++- modules/sdnq/layers/conv/forward.py | 8 +- modules/sdnq/layers/linear/forward.py | 2 +- modules/sdnq/layers/linear/linear_fp8.py | 13 +++- .../layers/linear/linear_fp8_tensorwise.py | 11 ++- modules/sdnq/layers/linear/linear_int8.py | 13 +++- modules/shared.py | 2 + 14 files changed, 229 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d3d9a478..55df207f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,9 +59,10 @@ - separate guidance and detail sections - networks ability to filter lora by base model version - **SDNQ** + - add `SVDQuant` quantization method support - make sdnq scales compatible with balanced offload - - add int8 matmul support for rdna2 gpus via triton - - improve int8 mamtul performance on intel gpus + - add int8 matmul support for RDNA2 GPUs via triton + - improve int8 mamtul performance on Intel GPUs - **Other** - server will note when restart is recommended due to package updates - **interrrupt** will now show last known preview image diff --git a/modules/lora/lora_apply.py b/modules/lora/lora_apply.py index 47b408446..d076efb97 100644 --- a/modules/lora/lora_apply.py +++ b/modules/lora/lora_apply.py @@ -52,6 +52,12 @@ def network_backup_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.n self.sdnq_zero_point_backup = self.zero_point.clone().to(devices.cpu) else: self.sdnq_zero_point_backup = None + if self.svd_up is not None: + self.sdnq_svd_up_backup = self.svd_up.clone().to(devices.cpu) + self.sdnq_svd_down_backup = self.svd_down.clone().to(devices.cpu) + else: + self.sdnq_svd_up_backup = None + self.sdnq_svd_down_backup = None if bias_backup is None: if getattr(self, 'bias', None) is not None: @@ -85,9 +91,23 @@ def network_calc_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn. try: t0 = time.time() if hasattr(self, "sdnq_dequantizer_backup"): - weight = self.sdnq_dequantizer_backup.to(devices.device)(self.weight.to(devices.device), self.sdnq_scale_backup.to(devices.device), self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul) + weight = self.sdnq_dequantizer_backup.to(devices.device)( + self.weight.to(devices.device), + self.sdnq_scale_backup.to(devices.device), + self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, + self.sdnq_svd_up_backup.to(devices.device) if self.sdnq_svd_up_backup is not None else None, + self.sdnq_svd_down_backup.to(devices.device) if self.sdnq_svd_down_backup is not None else None, + skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul + ) elif hasattr(self, "sdnq_dequantizer"): - weight = self.sdnq_dequantizer.to(devices.device)(self.weight.to(devices.device), self.scale.to(devices.device), self.zero_point.to(devices.device) if self.zero_point is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul) + weight = self.sdnq_dequantizer.to(devices.device)( + self.weight.to(devices.device), + self.scale.to(devices.device), + self.zero_point.to(devices.device) if self.zero_point is not None else None, + self.svd_up.to(devices.device) if self.svd_up is not None else None, + self.svd_down.to(devices.device) if self.svd_down is not None else None, + skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul + ) else: weight = self.weight.to(devices.device) # must perform calc on gpu due to performance updown, ex_bias = module.calc_updown(weight) @@ -148,19 +168,35 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G from modules.sdnq import sdnq_quantize_layer if hasattr(self, "sdnq_dequantizer_backup"): weights_dtype = self.sdnq_dequantizer_backup.weights_dtype - dequant_weight = self.sdnq_dequantizer_backup.to(devices.device)(model_weights.to(devices.device), self.sdnq_scale_backup.to(devices.device), self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul) + dequant_weight = self.sdnq_dequantizer_backup.to(devices.device)( + model_weights.to(devices.device), + self.sdnq_scale_backup.to(devices.device), + self.sdnq_zero_point_backup.to(devices.device) if self.sdnq_zero_point_backup is not None else None, + self.sdnq_svd_up_backup.to(devices.device) if self.sdnq_svd_up_backup is not None else None, + self.sdnq_svd_down_backup.to(devices.device) if self.sdnq_svd_down_backup is not None else None, + skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul + ) elif hasattr(self, "sdnq_dequantizer"): weights_dtype = self.sdnq_dequantizer.weights_dtype - dequant_weight = self.sdnq_dequantizer.to(devices.device)(model_weights.to(devices.device), self.scale.to(devices.device), self.zero_point.to(devices.device) if self.zero_point is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul) + dequant_weight = self.sdnq_dequantizer.to(devices.device)( + model_weights.to(devices.device), + self.scale.to(devices.device), + self.zero_point.to(devices.device) if self.zero_point is not None else None, + self.svd_up.to(devices.device) if self.svd_up is not None else None, + self.svd_down.to(devices.device) if self.svd_down is not None else None, + skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul + ) new_weight = dequant_weight.to(devices.device, dtype=torch.float32) + lora_weights.to(devices.device, dtype=torch.float32) self.weight = torch.nn.Parameter(new_weight, requires_grad=False) - del self.sdnq_dequantizer, self.scale, self.zero_point + del self.sdnq_dequantizer, self.scale, self.zero_point, self.svd_up, self.svd_down self = sdnq_quantize_layer( self, weights_dtype=weights_dtype, torch_dtype=devices.dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, + svd_rank=shared.opts.sdnq_svd_rank, + use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, use_quantized_matmul_conv=shared.opts.sdnq_use_quantized_matmul_conv, @@ -243,7 +279,12 @@ def network_apply_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn self.zero_point = torch.nn.Parameter(self.sdnq_zero_point_backup.to(device), requires_grad=False) else: self.zero_point = None - del self.sdnq_dequantizer_backup, self.sdnq_scale_backup, self.sdnq_zero_point_backup + if self.sdnq_svd_up_backup is not None: + self.svd_up = torch.nn.Parameter(self.sdnq_svd_up_backup.to(device), requires_grad=False) + self.svd_down = torch.nn.Parameter(self.sdnq_svd_down_backup.to(device), requires_grad=False) + else: + self.svd_up, self.svd_down = None, None + del self.sdnq_dequantizer_backup, self.sdnq_scale_backup, self.sdnq_zero_point_backup, self.sdnq_svd_up_backup, self.sdnq_svd_down_backup if bias_backup is not None: self.bias = None diff --git a/modules/model_quant.py b/modules/model_quant.py index 19b7ae7a7..288d6e8ed 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -205,6 +205,8 @@ def create_sdnq_config(kwargs = None, allow: bool = True, module: str = 'Model', sdnq_config = SDNQConfig( weights_dtype=weights_dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, + svd_rank=shared.opts.sdnq_svd_rank, + use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, use_quantized_matmul_conv=shared.opts.sdnq_use_quantized_matmul_conv, @@ -215,7 +217,7 @@ def create_sdnq_config(kwargs = None, allow: bool = True, module: str = 'Model', modules_to_not_convert=modules_to_not_convert, modules_dtype_dict=modules_dtype_dict.copy(), ) - log.debug(f'Quantization: module="{module}" type=sdnq mode=pre dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') + log.debug(f'Quantization: module="{module}" type=sdnq mode=pre dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') if kwargs is None: return sdnq_config else: @@ -533,6 +535,8 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh weights_dtype=weights_dtype, torch_dtype=devices.dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, + svd_rank=shared.opts.sdnq_svd_rank, + use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, use_quantized_matmul_conv=shared.opts.sdnq_use_quantized_matmul_conv, @@ -572,7 +576,7 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh if do_gc: devices.torch_gc(force=True, reason='sdnq') - log.debug(f'Quantization: module="{op if op is not None else model.__class__}" type=sdnq mode=post dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') + log.debug(f'Quantization: module="{op if op is not None else model.__class__}" type=sdnq mode=post dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') return model @@ -580,7 +584,7 @@ def sdnq_quantize_weights(sd_model): try: t0 = time.time() from modules import shared, devices, sd_models - log.debug(f"Quantization: type=SDNQ modules={shared.opts.sdnq_quantize_weights} dtype={shared.opts.sdnq_quantize_weights_mode} dtype_te={shared.opts.sdnq_quantize_weights_mode_te} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} pre_forward={shared.opts.diffusers_offload_pre}") + log.debug(f"Quantization: type=SDNQ modules={shared.opts.sdnq_quantize_weights} dtype={shared.opts.sdnq_quantize_weights_mode} dtype_te={shared.opts.sdnq_quantize_weights_mode_te} matmul={shared.opts.sdnq_use_quantized_matmul} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} pre_forward={shared.opts.diffusers_offload_pre}") global quant_last_model_name, quant_last_model_device # pylint: disable=global-statement sd_model = sd_models.apply_function_to_model(sd_model, sdnq_quantize_model, shared.opts.sdnq_quantize_weights, op="sdnq") diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 39077d917..5e90e0cc1 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -48,8 +48,15 @@ def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[i return quantized_weight, scale, zero_point +def apply_svdquant(weight: torch.FloatTensor, rank: int = 128) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: + U, S, svd_down = torch.svd_lowrank(weight, q=rank) + svd_up = torch.mul(U, S.unsqueeze(0)) + svd_down = svd_down.t_() + return weight.sub_(torch.mm(svd_up, svd_down)), svd_up, svd_down + + @devices.inference_context() -def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument +def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument layer_class_name = layer.__class__.__name__ if layer_class_name in allowed_types: num_of_groups = 1 @@ -103,13 +110,30 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz else: use_quantized_matmul = output_channel_size % 16 == 0 and channel_size % 16 == 0 + layer.weight.requires_grad = False + if return_device is None: + return_device = layer.weight.device + if quantization_device is not None: + layer.weight.data = layer.weight.to(quantization_device, non_blocking=non_blocking) + if layer.weight.dtype != torch.float32: + layer.weight.data = layer.weight.to(dtype=torch.float32) + + if use_svd and is_linear_type: + layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank) + if use_quantized_matmul: + svd_up = svd_up.t_() + svd_down = svd_down.t_() + else: + use_svd = False + svd_up, svd_down = None, None + if group_size == 0: if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] >= 6: group_size = -1 elif is_linear_type: - group_size = 2 ** (2 + dtype_dict[weights_dtype]["num_bits"]) + group_size = 2 ** ((2 if not use_svd else 3) + dtype_dict[weights_dtype]["num_bits"]) else: - group_size = 2 ** (1 + dtype_dict[weights_dtype]["num_bits"]) + group_size = 2 ** ((1 if not use_svd else 2) + dtype_dict[weights_dtype]["num_bits"]) elif use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: group_size = -1 # override user value, re-quantizing 8bit into 8bit is pointless elif group_size != -1 and not is_linear_type: @@ -154,24 +178,19 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz new_shape[last_dim_index - 1 : last_dim_index] = (num_of_groups, group_size) layer.weight.data = layer.weight.reshape(new_shape) - layer.weight.requires_grad = False - if return_device is None: - return_device = layer.weight.device - if quantization_device is not None: - layer.weight.data = layer.weight.to(quantization_device, non_blocking=non_blocking) - if layer.weight.dtype != torch.float32: - layer.weight.data = layer.weight.to(dtype=torch.float32) - layer.weight.data, scale, zero_point = quantize_weight(layer.weight, reduction_axes, weights_dtype) if not dequantize_fp32 and not (use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"] and not use_tensorwise_fp8_matmul): - scale = scale.to(torch_dtype) + scale = scale.to(dtype=torch_dtype) if zero_point is not None: - zero_point = zero_point.to(torch_dtype) + zero_point = zero_point.to(dtype=torch_dtype) + if svd_up is not None: + svd_up = svd_up.to(dtype=torch_dtype) + svd_down = svd_down.to(dtype=torch_dtype) re_quantize_for_matmul = (num_of_groups > 1 or zero_point is not None) if use_quantized_matmul and not re_quantize_for_matmul: - scale.transpose_(0,1) - layer.weight.transpose_(0,1) + scale.t_() + layer.weight.t_() if use_contiguous_mm: layer.weight.data = layer.weight.contiguous() elif layer.weight.is_contiguous(): @@ -186,6 +205,13 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) else: layer.zero_point = None + if svd_up is not None: + svd_up = svd_up.to(return_device, non_blocking=non_blocking) + svd_down = svd_down.to(return_device, non_blocking=non_blocking) + layer.svd_up = torch.nn.Parameter(svd_up, requires_grad=False) + layer.svd_down = torch.nn.Parameter(svd_down, requires_grad=False) + else: + layer.svd_up, layer.svd_down = None, None layer.sdnq_dequantizer = dequantizer_dict[weights_dtype]( quantized_weight_shape=layer.weight.shape, @@ -204,7 +230,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz return layer -def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, op=None): # pylint: disable=unused-argument +def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, op=None): # pylint: disable=unused-argument has_children = list(model.children()) if not has_children: return model @@ -238,6 +264,8 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si weights_dtype=weights_dtype, torch_dtype=torch_dtype, group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, use_quantized_matmul_conv=use_quantized_matmul_conv, @@ -252,6 +280,8 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si weights_dtype=weights_dtype, torch_dtype=torch_dtype, group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, use_quantized_matmul_conv=use_quantized_matmul_conv, @@ -371,6 +401,8 @@ class SDNQQuantizer(DiffusersQuantizer): weights_dtype=weights_dtype, torch_dtype=self.torch_dtype, group_size=self.quantization_config.group_size, + svd_rank=self.quantization_config.svd_rank, + use_svd=self.quantization_config.use_svd, quant_conv=self.quantization_config.quant_conv, use_quantized_matmul=self.quantization_config.use_quantized_matmul, use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, @@ -497,8 +529,13 @@ class SDNQConfig(QuantizationConfigMixin): weights_dtype (`str`, *optional*, defaults to `"int8"`): The target dtype for the weights after quantization. Supported values are: ("int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz") - weights_dtype (`int`, *optional*, defaults to `0`): + group_size (`int`, *optional*, defaults to `0`): Used to decide how many elements of a tensor will share the same quantization group. + group_size = 0 will automatically select a group size based on weights_dtype. + svd_rank (`int`, *optional*, defaults to `128`): + The rank size used for the SVDQuant algorithm. + use_svd (`bool`, *optional*, defaults to `False`): + Enabling this option will use SVDQuant algorithm. quant_conv (`bool`, *optional*, defaults to `False`): Enabling this option will quantize the convolutional layers in UNet models too. use_quantized_matmul (`bool`, *optional*, defaults to `False`): @@ -524,6 +561,8 @@ class SDNQConfig(QuantizationConfigMixin): self, weights_dtype: str = "int8", group_size: int = 0, + svd_rank: int = 128, + use_svd: bool = False, quant_conv: bool = False, use_quantized_matmul: bool = False, use_quantized_matmul_conv: bool = False, @@ -538,6 +577,8 @@ class SDNQConfig(QuantizationConfigMixin): self.weights_dtype = weights_dtype self.quant_method = QuantizationMethod.SDNQ self.group_size = group_size + self.svd_rank = svd_rank + self.use_svd = use_svd self.quant_conv = quant_conv self.use_quantized_matmul = use_quantized_matmul self.use_quantized_matmul_conv = use_quantized_matmul_conv diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 3881cfe34..72a058555 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -1,6 +1,6 @@ # pylint: disable=redefined-builtin,no-member,protected-access -from typing import Tuple +from typing import Tuple, Optional import torch @@ -8,19 +8,31 @@ from .common import dtype_dict, compile_func from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric -def dequantize_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, dtype: torch.dtype, result_shape: torch.Size) -> torch.FloatTensor: - result = torch.addcmul(zero_point, weight.to(dtype=scale.dtype), scale).to(dtype=dtype) +def dequantize_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, dtype: torch.dtype, result_shape: torch.Size, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None, skip_quantized_matmul: bool = False) -> torch.FloatTensor: + result = torch.addcmul(zero_point, weight.to(dtype=scale.dtype), scale) if result_shape is not None: result = result.view(result_shape) + if svd_up is not None: + if skip_quantized_matmul: + svd_up, svd_down = svd_up.t(), svd_down.t() + result = torch.addmm(result, svd_up, svd_down) + if dtype is not None: + result = result.to(dtype=dtype) return result -def dequantize_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, dtype: torch.dtype, result_shape: torch.Size, skip_quantized_matmul: bool = False) -> torch.FloatTensor: - result = weight.to(dtype=scale.dtype).mul_(scale).to(dtype=dtype) +def dequantize_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, dtype: torch.dtype, result_shape: torch.Size, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None, skip_quantized_matmul: bool = False) -> torch.FloatTensor: + result = weight.to(dtype=scale.dtype).mul_(scale) if skip_quantized_matmul: result.t_() if result_shape is not None: result = result.view(result_shape) + if svd_up is not None: + if skip_quantized_matmul: + svd_up, svd_down = svd_up.t(), svd_down.t() + result = torch.addmm(result, svd_up, svd_down) + if dtype is not None: + result = result.to(dtype=dtype) return result @@ -28,12 +40,12 @@ def dequantize_symmetric_with_bias(weight: torch.CharTensor, scale: torch.FloatT return torch.addcmul(bias, weight.to(dtype=scale.dtype), scale).to(dtype=dtype).view(result_shape) -def dequantize_packed_int_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, shape: torch.Size, dtype: torch.dtype, result_shape: torch.Size, weights_dtype: str) -> torch.FloatTensor: - return dequantize_asymmetric(unpack_int_asymetric(weight, shape, weights_dtype), scale, zero_point, dtype, result_shape) +def dequantize_packed_int_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, shape: torch.Size, dtype: torch.dtype, result_shape: torch.Size, weights_dtype: str, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None, skip_quantized_matmul: bool = False) -> torch.FloatTensor: + return dequantize_asymmetric(unpack_int_asymetric(weight, shape, weights_dtype), scale, zero_point, dtype, result_shape, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) -def dequantize_packed_int_symmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, shape: torch.Size, dtype: torch.dtype, result_shape: torch.Size, weights_dtype: str, skip_quantized_matmul: bool = False) -> torch.FloatTensor: - return dequantize_symmetric(unpack_int_symetric(weight, shape, weights_dtype, dtype=scale.dtype), scale, dtype, result_shape, skip_quantized_matmul=skip_quantized_matmul) +def dequantize_packed_int_symmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, shape: torch.Size, dtype: torch.dtype, result_shape: torch.Size, weights_dtype: str, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None, skip_quantized_matmul: bool = False) -> torch.FloatTensor: + return dequantize_symmetric(unpack_int_symetric(weight, shape, weights_dtype, dtype=scale.dtype), scale, dtype, result_shape, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) def quantize_int8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.CharTensor, torch.FloatTensor]: @@ -55,20 +67,20 @@ def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch return weight, scale -def re_quantize_matmul_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, result_shape: torch.Size) -> Tuple[torch.CharTensor, torch.FloatTensor]: - return re_quantize_int8(dequantize_asymmetric(weight, scale, zero_point, scale.dtype, result_shape)) +def re_quantize_matmul_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, result_shape: torch.Size, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None) -> Tuple[torch.CharTensor, torch.FloatTensor]: + return re_quantize_int8(dequantize_asymmetric(weight, scale, zero_point, scale.dtype, result_shape, svd_up=svd_up, svd_down=svd_down)) -def re_quantize_matmul_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, result_shape: torch.Size) -> Tuple[torch.CharTensor, torch.FloatTensor]: - return re_quantize_int8(dequantize_symmetric(weight, scale, scale.dtype, result_shape)) +def re_quantize_matmul_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, result_shape: torch.Size, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None) -> Tuple[torch.CharTensor, torch.FloatTensor]: + return re_quantize_int8(dequantize_symmetric(weight, scale, scale.dtype, result_shape, svd_up=svd_up, svd_down=svd_down)) -def re_quantize_matmul_packed_int_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, shape: torch.Size, result_shape: torch.Size, weights_dtype: str) -> torch.FloatTensor: - return re_quantize_matmul_asymmetric(unpack_int_asymetric(weight, shape, weights_dtype), scale, zero_point, result_shape) +def re_quantize_matmul_packed_int_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, shape: torch.Size, result_shape: torch.Size, weights_dtype: str, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None) -> torch.FloatTensor: + return re_quantize_matmul_asymmetric(unpack_int_asymetric(weight, shape, weights_dtype), scale, zero_point, result_shape, svd_up=svd_up, svd_down=svd_down) -def re_quantize_matmul_packed_int_symmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, shape: torch.Size, result_shape: torch.Size, weights_dtype: str) -> torch.FloatTensor: - return re_quantize_matmul_symmetric(unpack_int_symetric(weight, shape, weights_dtype, dtype=scale.dtype), scale, result_shape) +def re_quantize_matmul_packed_int_symmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, shape: torch.Size, result_shape: torch.Size, weights_dtype: str, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None) -> torch.FloatTensor: + return re_quantize_matmul_symmetric(unpack_int_symetric(weight, shape, weights_dtype, dtype=scale.dtype), scale, result_shape, svd_up=svd_up, svd_down=svd_down) class AsymmetricWeightsDequantizer(torch.nn.Module): @@ -92,11 +104,11 @@ class AsymmetricWeightsDequantizer(torch.nn.Module): def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return weight.to(dtype=dtype_dict[self.weights_dtype]["torch_dtype"]) - def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_asymmetric_compiled(weight, scale, zero_point, self.result_shape) + def re_quantize_matmul(self, weight, scale, zero_point, svd_up, svd_down, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_asymmetric_compiled(weight, scale, zero_point, self.result_shape, svd_up=svd_up, svd_down=svd_down) - def forward(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return dequantize_asymmetric_compiled(weight, scale, zero_point, self.result_dtype, self.result_shape) + def forward(self, weight, scale, zero_point, svd_up, svd_down, skip_quantized_matmul=False): # pylint: disable=unused-argument + return dequantize_asymmetric_compiled(weight, scale, zero_point, self.result_dtype, self.result_shape, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) class SymmetricWeightsDequantizer(torch.nn.Module): @@ -121,12 +133,12 @@ class SymmetricWeightsDequantizer(torch.nn.Module): def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return weight.to(dtype=dtype_dict[self.weights_dtype]["torch_dtype"]) - def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_symmetric_compiled(weight, scale, self.result_shape) + def re_quantize_matmul(self, weight, scale, zero_point, svd_up, svd_down, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_symmetric_compiled(weight, scale, self.result_shape, svd_up=svd_up, svd_down=svd_down) - def forward(self, weight, scale, zero_point, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument + def forward(self, weight, scale, zero_point, svd_up, svd_down, skip_quantized_matmul=False): # pylint: disable=unused-argument skip_quantized_matmul = skip_quantized_matmul and not self.re_quantize_for_matmul - return dequantize_symmetric_compiled(weight, scale, self.result_dtype, self.result_shape, skip_quantized_matmul=skip_quantized_matmul) + return dequantize_symmetric_compiled(weight, scale, self.result_dtype, self.result_shape, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) class PackedINTAsymmetricWeightsDequantizer(torch.nn.Module): @@ -152,11 +164,11 @@ class PackedINTAsymmetricWeightsDequantizer(torch.nn.Module): def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return pack_int_asymetric(weight, self.weights_dtype) - def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_shape, self.weights_dtype) + def re_quantize_matmul(self, weight, scale, zero_point, svd_up, svd_down, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_shape, self.weights_dtype, svd_up=svd_up, svd_down=svd_down) - def forward(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return dequantize_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype) + def forward(self, weight, scale, zero_point, svd_up, svd_down, skip_quantized_matmul=False): # pylint: disable=unused-argument + return dequantize_packed_int_asymmetric_compiled(weight, scale, zero_point, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) class PackedINTSymmetricWeightsDequantizer(torch.nn.Module): @@ -183,12 +195,12 @@ class PackedINTSymmetricWeightsDequantizer(torch.nn.Module): def pack_weight(self, weight: torch.Tensor) -> torch.Tensor: return pack_int_symetric(weight, self.weights_dtype) - def re_quantize_matmul(self, weight, scale, zero_point, **kwargs): # pylint: disable=unused-argument - return re_quantize_matmul_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_shape, self.weights_dtype) + def re_quantize_matmul(self, weight, scale, zero_point, svd_up, svd_down, **kwargs): # pylint: disable=unused-argument + return re_quantize_matmul_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_shape, self.weights_dtype, svd_up=svd_up, svd_down=svd_down) - def forward(self, weight, scale, zero_point, skip_quantized_matmul=False, **kwargs): # pylint: disable=unused-argument + def forward(self, weight, scale, zero_point, svd_up, svd_down, skip_quantized_matmul=False): # pylint: disable=unused-argument skip_quantized_matmul = skip_quantized_matmul and not self.re_quantize_for_matmul - return dequantize_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype, skip_quantized_matmul=skip_quantized_matmul) + return dequantize_packed_int_symmetric_compiled(weight, scale, self.quantized_weight_shape, self.result_dtype, self.result_shape, self.weights_dtype, svd_up=svd_up, svd_down=svd_down, skip_quantized_matmul=skip_quantized_matmul) dequantizer_dict = { diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index 47f214937..d700a6998 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -15,6 +15,8 @@ def conv_fp8_matmul( weight: torch.Tensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, result_shape: torch.Size, reversed_padding_repeated_twice: List[int], padding_mode: str, conv_type: int, @@ -23,6 +25,9 @@ def conv_fp8_matmul( ) -> torch.FloatTensor: return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) + if svd_up is not None: + svd_bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + input, input_scale = quantize_fp8_matmul_input(input) input, weight = check_mats(input, weight) @@ -46,6 +51,8 @@ def conv_fp8_matmul( for i in range(groups): result.append(torch._scaled_mm(input[:, i], weight[:, i], scale_a=input_scale[i], scale_b=scale[i], bias=None, out_dtype=torch.bfloat16)) result = torch.cat(result, dim=-1).view(mm_output_shape).to(return_dtype) + if svd_up is not None: + result.add_(svd_bias) if conv_type == 1: result = result.transpose_(1,2) @@ -58,10 +65,11 @@ def conv_fp8_matmul( def quantized_conv_forward_fp8_matmul(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) return conv_fp8_matmul( - input, self.weight, self.bias, self.scale, + input, self.weight, self.bias, + self.scale, self.svd_up, self.svd_down, self.sdnq_dequantizer.result_shape, self._reversed_padding_repeated_twice, self.padding_mode, conv_type, diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index 592a512ee..1893ad8a5 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -16,6 +16,8 @@ def conv_fp8_matmul_tensorwise( weight: torch.Tensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, result_shape: torch.Size, reversed_padding_repeated_twice: List[int], padding_mode: str, conv_type: int, @@ -24,6 +26,12 @@ def conv_fp8_matmul_tensorwise( ) -> torch.FloatTensor: return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) + if svd_up is not None: + if bias is not None: + bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + else: + bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) input, weight = check_mats(input, weight) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) @@ -53,10 +61,11 @@ def conv_fp8_matmul_tensorwise( def quantized_conv_forward_fp8_matmul_tensorwise(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) return conv_fp8_matmul_tensorwise( - input, self.weight, self.bias, self.scale, + input, self.weight, self.bias, + self.scale, self.svd_up, self.svd_down, self.sdnq_dequantizer.result_shape, self._reversed_padding_repeated_twice, self.padding_mode, conv_type, diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index 294f696b4..82bd51f95 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -17,6 +17,8 @@ def conv_int8_matmul( weight: torch.CharTensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, quantized_weight_shape: torch.Size, result_shape: torch.Size, weights_dtype: str, @@ -27,6 +29,12 @@ def conv_int8_matmul( ) -> torch.FloatTensor: return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) + if svd_up is not None: + if bias is not None: + bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + else: + bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + input, scale = quantize_int8_matmul_input(input, scale) if quantized_weight_shape is not None: weight = unpack_int_symetric(weight, quantized_weight_shape, weights_dtype, dtype=torch.int8) @@ -57,10 +65,10 @@ def conv_int8_matmul( def quantized_conv_forward_int8_matmul(self, input) -> torch.FloatTensor: if torch.numel(input) / input.shape[2] < 32: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) conv_type, stride, padding, dilation = get_conv_args(input.ndim, self.stride, self.padding, self.dilation) if self.sdnq_dequantizer.re_quantize_for_matmul: - weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point) + weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point, None, None) quantized_weight_shape = None else: weight = self.weight @@ -68,7 +76,8 @@ def quantized_conv_forward_int8_matmul(self, input) -> torch.FloatTensor: quantized_weight_shape = getattr(self.sdnq_dequantizer, "quantized_weight_shape", None) return conv_int8_matmul( input, weight, self.bias, - scale, quantized_weight_shape, + scale, self.svd_up, self.svd_down, + quantized_weight_shape, self.sdnq_dequantizer.result_shape, self.sdnq_dequantizer.weights_dtype, self._reversed_padding_repeated_twice, diff --git a/modules/sdnq/layers/conv/forward.py b/modules/sdnq/layers/conv/forward.py index 69237ea68..2ed3d816f 100644 --- a/modules/sdnq/layers/conv/forward.py +++ b/modules/sdnq/layers/conv/forward.py @@ -75,19 +75,19 @@ def process_conv_input(conv_type, input, reversed_padding_repeated_twice, paddin def quantized_conv_forward(self, input) -> torch.FloatTensor: - return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias) + return self._conv_forward(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down), self.bias) def quantized_conv_transpose_1d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 1, self.dilation) - return torch.nn.functional.conv_transpose1d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose1d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) def quantized_conv_transpose_2d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 2, self.dilation) - return torch.nn.functional.conv_transpose2d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose2d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) def quantized_conv_transpose_3d_forward(self, input: torch.FloatTensor, output_size: Optional[list[int]] = None) -> torch.FloatTensor: output_padding = self._output_padding(input, output_size, self.stride, self.padding, self.kernel_size, 3, self.dilation) - return torch.nn.functional.conv_transpose3d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) + return torch.nn.functional.conv_transpose3d(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down), self.bias, self.stride, self.padding, output_padding, self.groups, self.dilation) diff --git a/modules/sdnq/layers/linear/forward.py b/modules/sdnq/layers/linear/forward.py index 880b8ebc8..2371b6abb 100644 --- a/modules/sdnq/layers/linear/forward.py +++ b/modules/sdnq/layers/linear/forward.py @@ -17,4 +17,4 @@ def check_mats(input: torch.Tensor, weight: torch.Tensor) -> Tuple[torch.Tensor, def quantized_linear_forward(self, input: torch.FloatTensor) -> torch.FloatTensor: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point), self.bias) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down), self.bias) diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index 3f2fb407c..205b141e8 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -20,20 +20,27 @@ def fp8_matmul( weight: torch.Tensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, ) -> torch.FloatTensor: return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) + if svd_up is not None: + svd_bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) input, input_scale = quantize_fp8_matmul_input(input) input, weight = check_mats(input, weight) if bias is not None and bias.dtype != torch.bfloat16: bias = bias.to(dtype=torch.bfloat16) - return torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16).view(output_shape).to(return_dtype) + result = torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16).view(output_shape).to(return_dtype) + if svd_up is not None: + result.add_(svd_bias) + return result def quantized_linear_forward_fp8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) - return fp8_matmul(input, self.weight, self.bias, self.scale) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) + return fp8_matmul(input, self.weight, self.bias, self.scale, self.svd_up, self.svd_down) fp8_matmul = compile_func(fp8_matmul) diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index d39ea5519..bd7a9b973 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -23,10 +23,17 @@ def fp8_matmul_tensorwise( weight: torch.Tensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, ) -> torch.FloatTensor: return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) + if svd_up is not None: + if bias is not None: + bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + else: + bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) input, weight = check_mats(input, weight) if bias is not None: @@ -37,8 +44,8 @@ def fp8_matmul_tensorwise( def quantized_linear_forward_fp8_matmul_tensorwise(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) - return fp8_matmul_tensorwise(input, self.weight, self.bias, self.scale) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) + return fp8_matmul_tensorwise(input, self.weight, self.bias, self.scale, self.svd_up, self.svd_down) fp8_matmul_tensorwise = compile_func(fp8_matmul_tensorwise) diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index ae218a4fe..ce8bcf788 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -24,6 +24,8 @@ def int8_matmul( weight: torch.Tensor, bias: torch.FloatTensor, scale: torch.FloatTensor, + svd_up: torch.FloatTensor, + svd_down: torch.FloatTensor, quantized_weight_shape: torch.Size, weights_dtype: str, ) -> torch.FloatTensor: @@ -31,6 +33,11 @@ def int8_matmul( weight = unpack_int_symetric(weight, quantized_weight_shape, weights_dtype, dtype=torch.int8) return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) + if svd_up is not None: + if bias is not None: + bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + else: + bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) input, scale = quantize_int8_matmul_input(input, scale) input, weight = check_mats(input, weight) if bias is not None: @@ -41,15 +48,15 @@ def int8_matmul( def quantized_linear_forward_int8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: if torch.numel(input) / input.shape[-1] < 32: - return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, skip_quantized_matmul=True), self.bias) + return torch.nn.functional.linear(input, self.sdnq_dequantizer(self.weight, self.scale, self.zero_point, self.svd_up, self.svd_down, skip_quantized_matmul=True), self.bias) if self.sdnq_dequantizer.re_quantize_for_matmul: - weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point) + weight, scale = self.sdnq_dequantizer.re_quantize_matmul(self.weight, self.scale, self.zero_point, None, None) quantized_weight_shape = None else: weight = self.weight scale = self.scale quantized_weight_shape = getattr(self.sdnq_dequantizer, "quantized_weight_shape", None) - return int8_matmul(input, weight, self.bias, scale, quantized_weight_shape, self.sdnq_dequantizer.weights_dtype) + return int8_matmul(input, weight, self.bias, scale, self.svd_up, self.svd_down, quantized_weight_shape, self.sdnq_dequantizer.weights_dtype) int8_matmul = compile_func(int8_matmul) diff --git a/modules/shared.py b/modules/shared.py index fab234f94..339cac0f1 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -201,6 +201,8 @@ options_templates.update(options_section(("quantization", "Model Quantization"), "sdnq_modules_to_not_convert": OptionInfo("", "Modules to not convert"), "sdnq_modules_dtype_dict": OptionInfo("{}", "Modules dtype dict"), "sdnq_quantize_weights_group_size": OptionInfo(0, "Group size", gr.Slider, {"minimum": -1, "maximum": 4096, "step": 1}), + "sdnq_svd_rank": OptionInfo(128, "SVDQuant Rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), + "sdnq_use_svd": OptionInfo(False, "Use SVDQuant quantization", gr.Checkbox), "sdnq_quantize_conv_layers": OptionInfo(False, "Quantize convolutional layers", gr.Checkbox), "sdnq_dequantize_compile": OptionInfo(devices.has_triton(), "Dequantize using torch.compile", gr.Checkbox), "sdnq_use_quantized_matmul": OptionInfo(False, "Use quantized MatMul", gr.Checkbox), From 0acb571472563c34c27318b14783278569dad623 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 00:57:23 +0300 Subject: [PATCH 144/230] SDNQ ass load and save model funcs --- modules/sdnq/__init__.py | 629 +------------------------------------ modules/sdnq/loader.py | 65 ++++ modules/sdnq/quantizer.py | 635 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 712 insertions(+), 617 deletions(-) create mode 100644 modules/sdnq/loader.py create mode 100644 modules/sdnq/quantizer.py diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 5e90e0cc1..121db2c8d 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -1,617 +1,12 @@ -# pylint: disable=redefined-builtin,no-member,protected-access - -from typing import Dict, List, Tuple, Optional, Union -from dataclasses import dataclass -from enum import Enum - -import re -import torch -from diffusers.quantizers.base import DiffusersQuantizer -from diffusers.quantizers.quantization_config import QuantizationConfigMixin -from diffusers.utils import get_module_from_name -from modules import devices, shared - -from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm -from .dequantizer import dequantizer_dict -from .forward import get_forward_func - - -class QuantizationMethod(str, Enum): - SDNQ = "sdnq" - - -def get_scale_asymmetric(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> Tuple[torch.FloatTensor, torch.FloatTensor]: - zero_point = torch.amin(weight, dim=reduction_axes, keepdims=True) - scale = torch.amax(weight, dim=reduction_axes, keepdims=True).sub_(zero_point).div_(dtype_dict[weights_dtype]["max"] - dtype_dict[weights_dtype]["min"]) - if dtype_dict[weights_dtype]["min"] != 0: - zero_point.sub_(torch.mul(scale, dtype_dict[weights_dtype]["min"])) - return scale, zero_point - - -def get_scale_symmetric(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> torch.FloatTensor: - return torch.amax(weight.abs(), dim=reduction_axes, keepdims=True).div_(dtype_dict[weights_dtype]["max"]) - - -def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> Tuple[torch.Tensor, torch.FloatTensor, torch.FloatTensor]: - if dtype_dict[weights_dtype]["is_unsigned"]: - scale, zero_point = get_scale_asymmetric(weight, reduction_axes, weights_dtype) - quantized_weight = torch.sub(weight, zero_point).div_(scale) - else: - scale = get_scale_symmetric(weight, reduction_axes, weights_dtype) - quantized_weight = torch.div(weight, scale) - zero_point = None - if dtype_dict[weights_dtype]["is_integer"]: - quantized_weight.round_() - else: - quantized_weight.nan_to_num_() - quantized_weight = quantized_weight.clamp_(dtype_dict[weights_dtype]["min"], dtype_dict[weights_dtype]["max"]).to(dtype_dict[weights_dtype]["torch_dtype"]) - return quantized_weight, scale, zero_point - - -def apply_svdquant(weight: torch.FloatTensor, rank: int = 128) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: - U, S, svd_down = torch.svd_lowrank(weight, q=rank) - svd_up = torch.mul(U, S.unsqueeze(0)) - svd_down = svd_down.t_() - return weight.sub_(torch.mm(svd_up, svd_down)), svd_up, svd_down - - -@devices.inference_context() -def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument - layer_class_name = layer.__class__.__name__ - if layer_class_name in allowed_types: - num_of_groups = 1 - is_conv_type = False - is_conv_transpose_type = False - is_linear_type = False - result_shape = None - original_shape = layer.weight.shape - if torch_dtype is None: - torch_dtype = devices.dtype - - if layer_class_name in conv_types: - if not quant_conv: - return layer - if dtype_dict[weights_dtype]["num_bits"] < 4: - weights_dtype = "uint4" - is_conv_type = True - reduction_axes = 1 - output_channel_size, channel_size = layer.weight.shape[:2] - group_channel_size = channel_size // layer.groups - use_quantized_matmul = False - if use_quantized_matmul_conv: - use_quantized_matmul = group_channel_size >= 32 and output_channel_size >= 32 - if use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"]: - use_quantized_matmul = output_channel_size % 16 == 0 and group_channel_size % 16 == 0 - if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: - result_shape = layer.weight.shape - layer.weight.data = layer.weight.flatten(1,-1) - reduction_axes = -1 - elif layer_class_name in conv_transpose_types: - if not quant_conv: - return layer - if dtype_dict[weights_dtype]["num_bits"] < 4: - weights_dtype = "uint4" - is_conv_transpose_type = True - reduction_axes = 0 - channel_size, output_channel_size = layer.weight.shape[:2] - use_quantized_matmul = False - else: - is_linear_type = True - reduction_axes = -1 - try: - output_channel_size, channel_size = layer.weight.shape - except Exception as e: - raise ValueError(f"SDNQ: param_name={param_name} layer_class_name={layer_class_name} layer_weight_shape={layer.weight.shape} weights_dtype={weights_dtype} unsupported") from e - if use_quantized_matmul: - use_quantized_matmul = channel_size >= 32 and output_channel_size >= 32 - if use_quantized_matmul: - if dtype_dict[weights_dtype]["is_integer"]: - use_quantized_matmul = output_channel_size % 8 == 0 and channel_size % 8 == 0 - else: - use_quantized_matmul = output_channel_size % 16 == 0 and channel_size % 16 == 0 - - layer.weight.requires_grad = False - if return_device is None: - return_device = layer.weight.device - if quantization_device is not None: - layer.weight.data = layer.weight.to(quantization_device, non_blocking=non_blocking) - if layer.weight.dtype != torch.float32: - layer.weight.data = layer.weight.to(dtype=torch.float32) - - if use_svd and is_linear_type: - layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank) - if use_quantized_matmul: - svd_up = svd_up.t_() - svd_down = svd_down.t_() - else: - use_svd = False - svd_up, svd_down = None, None - - if group_size == 0: - if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] >= 6: - group_size = -1 - elif is_linear_type: - group_size = 2 ** ((2 if not use_svd else 3) + dtype_dict[weights_dtype]["num_bits"]) - else: - group_size = 2 ** ((1 if not use_svd else 2) + dtype_dict[weights_dtype]["num_bits"]) - elif use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: - group_size = -1 # override user value, re-quantizing 8bit into 8bit is pointless - elif group_size != -1 and not is_linear_type: - group_size = max(group_size // 2, 1) - - if group_size > 0: - if group_size >= channel_size: - group_size = channel_size - num_of_groups = 1 - else: - num_of_groups = channel_size // group_size - while num_of_groups * group_size != channel_size: # find something divisible - num_of_groups -= 1 - if num_of_groups <= 1: - group_size = channel_size - num_of_groups = 1 - break - group_size = channel_size // num_of_groups - group_size = int(group_size) - num_of_groups = int(num_of_groups) - - if num_of_groups > 1: - if result_shape is None: - result_shape = layer.weight.shape - new_shape = list(result_shape) - if is_conv_type: - # output_channel_size, channel_size, X, X - # output_channel_size, num_of_groups, group_size, X, X - new_shape[1] = group_size - new_shape.insert(1, num_of_groups) - reduction_axes = 2 - elif is_conv_transpose_type: - #channel_size, output_channel_size, X, X - #num_of_groups, group_size, output_channel_size, X, X - new_shape[0] = group_size - new_shape.insert(0, num_of_groups) - reduction_axes = 1 - elif is_linear_type: - # output_channel_size, channel_size - # output_channel_size, num_of_groups, group_size - last_dim_index = layer.weight.ndim - new_shape[last_dim_index - 1 : last_dim_index] = (num_of_groups, group_size) - layer.weight.data = layer.weight.reshape(new_shape) - - layer.weight.data, scale, zero_point = quantize_weight(layer.weight, reduction_axes, weights_dtype) - if not dequantize_fp32 and not (use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"] and not use_tensorwise_fp8_matmul): - scale = scale.to(dtype=torch_dtype) - if zero_point is not None: - zero_point = zero_point.to(dtype=torch_dtype) - if svd_up is not None: - svd_up = svd_up.to(dtype=torch_dtype) - svd_down = svd_down.to(dtype=torch_dtype) - - re_quantize_for_matmul = (num_of_groups > 1 or zero_point is not None) - if use_quantized_matmul and not re_quantize_for_matmul: - scale.t_() - layer.weight.t_() - if use_contiguous_mm: - layer.weight.data = layer.weight.contiguous() - elif layer.weight.is_contiguous(): - layer.weight.data = layer.weight.t_().contiguous().t_() - if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: - scale = scale.to(torch.float32) - - scale = scale.to(return_device, non_blocking=non_blocking) - layer.scale = torch.nn.Parameter(scale, requires_grad=False) - if zero_point is not None: - zero_point = zero_point.to(return_device, non_blocking=non_blocking) - layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) - else: - layer.zero_point = None - if svd_up is not None: - svd_up = svd_up.to(return_device, non_blocking=non_blocking) - svd_down = svd_down.to(return_device, non_blocking=non_blocking) - layer.svd_up = torch.nn.Parameter(svd_up, requires_grad=False) - layer.svd_down = torch.nn.Parameter(svd_down, requires_grad=False) - else: - layer.svd_up, layer.svd_down = None, None - - layer.sdnq_dequantizer = dequantizer_dict[weights_dtype]( - quantized_weight_shape=layer.weight.shape, - result_dtype=torch_dtype, - result_shape=result_shape, - original_shape=original_shape, - weights_dtype=weights_dtype, - use_quantized_matmul=use_quantized_matmul, - re_quantize_for_matmul=re_quantize_for_matmul, - ) - layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) - layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) - - layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) - layer.forward = layer.forward.__get__(layer, layer.__class__) - return layer - - -def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, op=None): # pylint: disable=unused-argument - has_children = list(model.children()) - if not has_children: - return model - if modules_to_not_convert is None: - modules_to_not_convert = [] - if modules_dtype_dict is None: - modules_dtype_dict = {} - for param_name, module in model.named_children(): - if param_name in modules_to_not_convert: - continue - if hasattr(module, "weight") and module.weight is not None: - if len(modules_dtype_dict.keys()) > 0: - for key, value in modules_dtype_dict.items(): - if param_name in value: - key = key.lower() - if key in {"8bit", "8bits"}: - if dtype_dict[weights_dtype]["num_bits"] != 8: - weights_dtype = "int8" - elif key.startswith("minimum_"): - minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") - minimum_bits = int(minimum_bits_str) - if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: - weights_dtype = "int" + minimum_bits_str - if minimum_bits <= 4: - weights_dtype = "u" + weights_dtype - else: - weights_dtype = key - - module = sdnq_quantize_layer( - module, - weights_dtype=weights_dtype, - torch_dtype=torch_dtype, - group_size=group_size, - svd_rank=svd_rank, - use_svd=use_svd, - quant_conv=quant_conv, - use_quantized_matmul=use_quantized_matmul, - use_quantized_matmul_conv=use_quantized_matmul_conv, - dequantize_fp32=dequantize_fp32, - non_blocking=non_blocking, - quantization_device=quantization_device, - return_device=return_device, - param_name=param_name, - ) - module = apply_sdnq_to_module( - module, - weights_dtype=weights_dtype, - torch_dtype=torch_dtype, - group_size=group_size, - svd_rank=svd_rank, - use_svd=use_svd, - quant_conv=quant_conv, - use_quantized_matmul=use_quantized_matmul, - use_quantized_matmul_conv=use_quantized_matmul_conv, - dequantize_fp32=dequantize_fp32, - non_blocking=non_blocking, - quantization_device=quantization_device, - return_device=return_device, - modules_to_not_convert=modules_to_not_convert, - modules_dtype_dict=modules_dtype_dict, - op=op, - ) - return model - - -class SDNQQuantizer(DiffusersQuantizer): - r""" - Diffusers Quantizer for SDNQ - """ - - requires_parameters_quantization = True - use_keep_in_fp32_modules = True - requires_calibration = False - required_packages = None - torch_dtype = None - - def __init__(self, quantization_config, **kwargs): - super().__init__(quantization_config, **kwargs) - self.modules_to_not_convert = [] - - def check_if_quantized_param( - self, - model, - param_value: "torch.Tensor", - param_name: str, - *args, **kwargs, # pylint: disable=unused-argument - ): - if param_name.endswith(".weight"): - split_param_name = param_name.split(".") - if ( - param_name not in self.modules_to_not_convert - and not any(param in split_param_name for param in self.modules_to_not_convert) - and not any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in self.modules_to_not_convert) - ): - layer_class_name = get_module_from_name(model, param_name)[0].__class__.__name__ - if layer_class_name in allowed_types: - if layer_class_name in conv_types or layer_class_name in conv_transpose_types: - if self.quantization_config.quant_conv: - return True - else: - return True - if param_value is not None: - with devices.inference_context(): - param_value.data = param_value.clone() # safetensors is unable to release the cpu memory without this - return False - - def check_quantized_param(self, *args, **kwargs) -> bool: - """ - needed for transformers compatibilty, returns self.check_if_quantized_param - """ - return self.check_if_quantized_param(*args, **kwargs) - - def param_needs_quantization(self, model, param_name: str, *args, **kwargs) -> bool: - """ - needed for transformers compatibilty, returns self.check_if_quantized_param - """ - return self.check_if_quantized_param(model, None, param_name, *args, **kwargs) - - @devices.inference_context() - def create_quantized_param( # pylint: disable=arguments-differ - self, - model, - param_value: torch.FloatTensor, - param_name: str, - target_device: torch.device, - *args, **kwargs, # pylint: disable=unused-argument - ): - weights_dtype = self.quantization_config.weights_dtype - if len(self.quantization_config.modules_dtype_dict.keys()) > 0: - split_param_name = param_name.split(".") - for key, value in self.quantization_config.modules_dtype_dict.items(): - if ( - param_name in value - or any(param in split_param_name for param in value) - or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in value) - ): - key = key.lower() - if key in {"8bit", "8bits"}: - if dtype_dict[weights_dtype]["num_bits"] != 8: - weights_dtype = "int8" - elif key.startswith("minimum_"): - minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") - minimum_bits = int(minimum_bits_str) - if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: - weights_dtype = "int" + minimum_bits_str - if minimum_bits <= 4: - weights_dtype = "u" + weights_dtype - else: - weights_dtype = key - - if self.quantization_config.return_device is not None: - return_device = self.quantization_config.return_device - else: - return_device = target_device - - if self.quantization_config.quantization_device is not None: - target_device = self.quantization_config.quantization_device - - if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): - param_value = param_value.clone() - else: - param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) - - layer, _ = get_module_from_name(model, param_name) - layer.weight = torch.nn.Parameter(param_value, requires_grad=False) - layer = sdnq_quantize_layer( - layer, - weights_dtype=weights_dtype, - torch_dtype=self.torch_dtype, - group_size=self.quantization_config.group_size, - svd_rank=self.quantization_config.svd_rank, - use_svd=self.quantization_config.use_svd, - quant_conv=self.quantization_config.quant_conv, - use_quantized_matmul=self.quantization_config.use_quantized_matmul, - use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, - dequantize_fp32=self.quantization_config.dequantize_fp32, - non_blocking=self.quantization_config.non_blocking, - quantization_device=None, - return_device=return_device, - param_name=param_name, - ) - - def adjust_max_memory(self, max_memory: Dict[str, Union[int, str]]) -> Dict[str, Union[int, str]]: - max_memory = {key: val * 0.80 for key, val in max_memory.items()} - return max_memory - - def adjust_target_dtype(self, target_dtype: torch.dtype) -> torch.dtype: # pylint: disable=unused-argument,arguments-renamed - return dtype_dict[self.quantization_config.weights_dtype]["target_dtype"] - - def update_torch_dtype(self, torch_dtype: torch.dtype = None) -> torch.dtype: - if torch_dtype is None: - torch_dtype = devices.dtype - self.torch_dtype = torch_dtype - return torch_dtype - - def _process_model_before_weight_loading( # pylint: disable=arguments-differ - self, - model, - device_map, # pylint: disable=unused-argument - keep_in_fp32_modules: List[str] = None, - **kwargs, # pylint: disable=unused-argument - ): - if keep_in_fp32_modules is not None: - self.modules_to_not_convert.extend(keep_in_fp32_modules) - elif getattr(model, "_keep_in_fp32_modules", None) is not None: - self.modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - self.modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access - self.modules_to_not_convert.extend(self.quantization_config.modules_to_not_convert) - self.quantization_config.modules_to_not_convert = self.modules_to_not_convert - model.config.quantization_config = self.quantization_config - - def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument - if shared.opts.diffusers_offload_mode != "none": - model = model.to(devices.cpu) - devices.torch_gc(force=True, reason="sdnq") - return model - - def get_accelerator_warm_up_factor(self): - return 32 // dtype_dict[self.quantization_config.weights_dtype]["num_bits"] - - def get_cuda_warm_up_factor(self): - """ - needed for transformers compatibilty, returns self.get_accelerator_warm_up_factor - """ - return self.get_accelerator_warm_up_factor() - - def update_tp_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return config - - def update_ep_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return config - - def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return unexpected_keys - - def update_missing_keys_after_loading(self, model, missing_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return missing_keys - - def update_state_dict_with_metadata(self, state_dict: dict, *args, **kwargs) -> dict: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return state_dict - - def update_expected_keys(self, model, expected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return expected_keys - - def update_param_name(self, param_name: str, *args, **kwargs) -> str: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return param_name - - def update_dtype(self, dtype: torch.dtype, *args, **kwargs) -> torch.dtype: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return dtype - - @property - def is_trainable(self): - return False - - @property - def is_serializable(self): - return True - - @property - def is_compileable(self): - return True - - -@dataclass -class SDNQConfig(QuantizationConfigMixin): - """ - This is a wrapper class about all possible attributes and features that you can play with a model that has been - loaded using `sdnq`. - - Args: - weights_dtype (`str`, *optional*, defaults to `"int8"`): - The target dtype for the weights after quantization. Supported values are: - ("int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz") - group_size (`int`, *optional*, defaults to `0`): - Used to decide how many elements of a tensor will share the same quantization group. - group_size = 0 will automatically select a group size based on weights_dtype. - svd_rank (`int`, *optional*, defaults to `128`): - The rank size used for the SVDQuant algorithm. - use_svd (`bool`, *optional*, defaults to `False`): - Enabling this option will use SVDQuant algorithm. - quant_conv (`bool`, *optional*, defaults to `False`): - Enabling this option will quantize the convolutional layers in UNet models too. - use_quantized_matmul (`bool`, *optional*, defaults to `False`): - Enabling this option will use quantized INT8 or FP8 MatMul instead of BF16 / FP16. - use_quantized_matmul_conv (`bool`, *optional*, defaults to `False`): - Same as use_quantized_matmul_conv but for the convolutional layers with UNets like SDXL. - dequantize_fp32 (`bool`, *optional*, defaults to `False`): - Enabling this option will use FP32 on the dequantization step. - non_blocking (`bool`, *optional*, defaults to `False`): - Enabling this option will use non blocking ops when moving layers between the quantization device and the return device. - quantization_device (`torch.device`, *optional*, defaults to `None`): - Used to set which device will be used for the quantization calculation on model load. - return_device (`torch.device`, *optional*, defaults to `None`): - Used to set which device will the quantized weights be sent back to. - modules_to_not_convert (`list`, *optional*, default to `None`): - The list of modules to not quantize, useful for quantizing models that explicitly require to have some - modules left in their original precision (e.g. Whisper encoder, Llava encoder, Mixtral gate layers). - modules_dtype_dict (`dict`, *optional*, default to `None`): - The dict of dtypes and list of modules, useful for quantizing some modules with a different dtype. - """ - - def __init__( # pylint: disable=super-init-not-called - self, - weights_dtype: str = "int8", - group_size: int = 0, - svd_rank: int = 128, - use_svd: bool = False, - quant_conv: bool = False, - use_quantized_matmul: bool = False, - use_quantized_matmul_conv: bool = False, - dequantize_fp32: bool = False, - non_blocking: bool = False, - quantization_device: Optional[torch.device] = None, - return_device: Optional[torch.device] = None, - modules_to_not_convert: Optional[List[str]] = None, - modules_dtype_dict: Optional[Dict[str, List[str]]] = None, - **kwargs, # pylint: disable=unused-argument - ): - self.weights_dtype = weights_dtype - self.quant_method = QuantizationMethod.SDNQ - self.group_size = group_size - self.svd_rank = svd_rank - self.use_svd = use_svd - self.quant_conv = quant_conv - self.use_quantized_matmul = use_quantized_matmul - self.use_quantized_matmul_conv = use_quantized_matmul_conv - self.dequantize_fp32 = dequantize_fp32 - self.non_blocking = non_blocking - self.quantization_device = quantization_device - self.return_device = return_device - self.modules_to_not_convert = modules_to_not_convert - self.modules_dtype_dict = modules_dtype_dict - self.post_init() - self.is_integer = dtype_dict[self.weights_dtype]["is_integer"] - - def post_init(self): - r""" - Safety checker that arguments are correct - """ - accepted_weights = ["int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz"] - if self.weights_dtype not in accepted_weights: - raise ValueError(f"Only support weights in {accepted_weights} but found {self.weights_dtype}") - - if self.modules_to_not_convert is None: - self.modules_to_not_convert = [] - elif not isinstance(self.modules_to_not_convert, list): - self.modules_to_not_convert = [self.modules_to_not_convert] - - if self.modules_dtype_dict is None: - self.modules_dtype_dict = {} - - -import diffusers.quantizers.auto # noqa: E402,RUF100 # pylint: disable=wrong-import-order -diffusers.quantizers.auto.AUTO_QUANTIZER_MAPPING["sdnq"] = SDNQQuantizer -diffusers.quantizers.auto.AUTO_QUANTIZATION_CONFIG_MAPPING["sdnq"] = SDNQConfig - -import transformers.quantizers.auto # noqa: E402,RUF100 # pylint: disable=wrong-import-order -transformers.quantizers.auto.AUTO_QUANTIZER_MAPPING["sdnq"] = SDNQQuantizer -transformers.quantizers.auto.AUTO_QUANTIZATION_CONFIG_MAPPING["sdnq"] = SDNQConfig +from .quantizer import SDNQConfig, SDNQQuantizer, apply_sdnq_to_module, sdnq_quantize_layer +from .loader import save_sdnq_model, load_sdnq_model + + +__all__ = [ + "SDNQConfig", + "SDNQQuantizer", + "apply_sdnq_to_module", + "load_sdnq_model", + "save_sdnq_model", + "sdnq_quantize_layer", +] diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py new file mode 100644 index 000000000..3473e70ad --- /dev/null +++ b/modules/sdnq/loader.py @@ -0,0 +1,65 @@ +import os +import json +import torch +from safetensors import safe_open +from diffusers.models.modeling_utils import ModelMixin + +from .quantizer import SDNQConfig, apply_sdnq_to_module +from .common import use_contiguous_mm, use_tensorwise_fp8_matmul +from .dequantizer import dequantize_symmetric_compiled, quantize_fp8 + + +def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str) -> None: + model.save_pretrained(model_path) + sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) + + +def load_sdnq_model(model_cls: ModelMixin, model_path: str, use_quantized_matmul: bool = False) -> ModelMixin: + with torch.device("meta"): + with open(os.path.join(model_path, "quantization_config.json"), "r") as f: + quantization_config = json.load(f) + quantization_config.pop("is_integer", None) + quantization_config.pop("quant_method", None) + quantization_config.pop("quantization_device", None) + quantization_config.pop("return_device", None) + quantization_config.pop("non_blocking", None) + config = model_cls.load_config(model_path) + model = model_cls.from_config(config) + model = apply_sdnq_to_module(model, **quantization_config) + + state_dict = {} + with safe_open(os.path.join(model_path, "diffusion_pytorch_model.safetensors"), framework="pt") as f: + for k in f.keys(): + state_dict[k] = f.get_tensor(k) + model.load_state_dict(state_dict, assign=True) + del state_dict + if use_quantized_matmul and not quantization_config["use_quantized_matmul"]: + model = enable_quantized_mamtul(model) + return model + + +def enable_quantized_mamtul(model): + has_children = list(model.children()) + if not has_children: + return model + for module in model.children(): + if hasattr(module, "sdnq_dequantizer"): + if not module.sdnq_dequantizer.use_quantized_matmul: + if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn"} and module.sdnq_dequantizer.result_shape != module.weight.shape: + if module.sdnq_dequantizer.weights_dtype == "int8": + module.weight.data, module.scale.data = module.sdnq_dequantizer.re_quantize_matmul(module.weight, module.scale, module.zero_point, None, None) + elif module.sdnq_dequantizer.weights_dtype == "float8_e4m3fn": + module.weight.data, module.scale.data = quantize_fp8(dequantize_symmetric_compiled(module.weight, module.scale, module.sdnq_dequantizer.result_dtype, module.sdnq_dequantizer.result_shape)) + module.weight.data, module.scale.data = module.weight.t_(), module.scale.t_() + if not use_tensorwise_fp8_matmul: + module.scale.data = module.scale.to(dtype=torch.float32) + if use_contiguous_mm: + module.weight.data = module.weight.contiguous() + elif module.weight.is_contiguous(): + module.weight.data = module.weight.t_().contiguous().t_() + if module.svd_up is not None: + module.svd_up.data = module.svd_up.t_() + module.svd_down.data = module.svd_down.t_() + module.sdnq_dequantizer.use_quantized_matmul = True + module = enable_quantized_mamtul(module) + return model diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py new file mode 100644 index 000000000..135736d60 --- /dev/null +++ b/modules/sdnq/quantizer.py @@ -0,0 +1,635 @@ +# pylint: disable=redefined-builtin,no-member,protected-access + +from typing import Dict, List, Tuple, Optional, Union +from dataclasses import dataclass +from enum import Enum + +import re +import torch +from diffusers.quantizers.base import DiffusersQuantizer +from diffusers.quantizers.quantization_config import QuantizationConfigMixin +from diffusers.utils import get_module_from_name +from modules import devices, shared + +from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm +from .dequantizer import dequantizer_dict +from .forward import get_forward_func + + +class QuantizationMethod(str, Enum): + SDNQ = "sdnq" + + +def get_scale_asymmetric(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + zero_point = torch.amin(weight, dim=reduction_axes, keepdims=True) + scale = torch.amax(weight, dim=reduction_axes, keepdims=True).sub_(zero_point).div_(dtype_dict[weights_dtype]["max"] - dtype_dict[weights_dtype]["min"]) + if dtype_dict[weights_dtype]["min"] != 0: + zero_point.sub_(torch.mul(scale, dtype_dict[weights_dtype]["min"])) + return scale, zero_point + + +def get_scale_symmetric(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> torch.FloatTensor: + return torch.amax(weight.abs(), dim=reduction_axes, keepdims=True).div_(dtype_dict[weights_dtype]["max"]) + + +def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[int]], weights_dtype: str) -> Tuple[torch.Tensor, torch.FloatTensor, torch.FloatTensor]: + if dtype_dict[weights_dtype]["is_unsigned"]: + scale, zero_point = get_scale_asymmetric(weight, reduction_axes, weights_dtype) + quantized_weight = torch.sub(weight, zero_point).div_(scale) + else: + scale = get_scale_symmetric(weight, reduction_axes, weights_dtype) + quantized_weight = torch.div(weight, scale) + zero_point = None + if dtype_dict[weights_dtype]["is_integer"]: + quantized_weight.round_() + else: + quantized_weight.nan_to_num_() + quantized_weight = quantized_weight.clamp_(dtype_dict[weights_dtype]["min"], dtype_dict[weights_dtype]["max"]).to(dtype_dict[weights_dtype]["torch_dtype"]) + return quantized_weight, scale, zero_point + + +def apply_svdquant(weight: torch.FloatTensor, rank: int = 128) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: + U, S, svd_down = torch.svd_lowrank(weight, q=rank) + svd_up = torch.mul(U, S.unsqueeze(0)) + svd_down = svd_down.t_() + return weight.sub_(torch.mm(svd_up, svd_down)), svd_up, svd_down + + +@devices.inference_context() +def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument + layer_class_name = layer.__class__.__name__ + if layer_class_name in allowed_types: + num_of_groups = 1 + is_conv_type = False + is_conv_transpose_type = False + is_linear_type = False + result_shape = None + original_shape = layer.weight.shape + if torch_dtype is None: + torch_dtype = devices.dtype + + if layer_class_name in conv_types: + if not quant_conv: + return layer + if dtype_dict[weights_dtype]["num_bits"] < 4: + weights_dtype = "uint4" + is_conv_type = True + reduction_axes = 1 + output_channel_size, channel_size = layer.weight.shape[:2] + group_channel_size = channel_size // layer.groups + use_quantized_matmul = False + if use_quantized_matmul_conv: + use_quantized_matmul = group_channel_size >= 32 and output_channel_size >= 32 + if use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"]: + use_quantized_matmul = output_channel_size % 16 == 0 and group_channel_size % 16 == 0 + if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: + result_shape = layer.weight.shape + layer.weight.data = layer.weight.flatten(1,-1) + reduction_axes = -1 + elif layer_class_name in conv_transpose_types: + if not quant_conv: + return layer + if dtype_dict[weights_dtype]["num_bits"] < 4: + weights_dtype = "uint4" + is_conv_transpose_type = True + reduction_axes = 0 + channel_size, output_channel_size = layer.weight.shape[:2] + use_quantized_matmul = False + else: + is_linear_type = True + reduction_axes = -1 + try: + output_channel_size, channel_size = layer.weight.shape + except Exception as e: + raise ValueError(f"SDNQ: param_name={param_name} layer_class_name={layer_class_name} layer_weight_shape={layer.weight.shape} weights_dtype={weights_dtype} unsupported") from e + if use_quantized_matmul: + use_quantized_matmul = channel_size >= 32 and output_channel_size >= 32 + if use_quantized_matmul: + if dtype_dict[weights_dtype]["is_integer"]: + use_quantized_matmul = output_channel_size % 8 == 0 and channel_size % 8 == 0 + else: + use_quantized_matmul = output_channel_size % 16 == 0 and channel_size % 16 == 0 + + layer.weight.requires_grad = False + if return_device is None: + return_device = layer.weight.device + if quantization_device is not None: + layer.weight.data = layer.weight.to(quantization_device, non_blocking=non_blocking) + if layer.weight.dtype != torch.float32: + layer.weight.data = layer.weight.to(dtype=torch.float32) + + if use_svd and is_linear_type: + layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank) + if use_quantized_matmul: + svd_up = svd_up.t_() + svd_down = svd_down.t_() + else: + use_svd = False + svd_up, svd_down = None, None + + if group_size == 0: + if use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] >= 6: + group_size = -1 + elif is_linear_type: + group_size = 2 ** ((2 if not use_svd else 3) + dtype_dict[weights_dtype]["num_bits"]) + else: + group_size = 2 ** ((1 if not use_svd else 2) + dtype_dict[weights_dtype]["num_bits"]) + elif use_quantized_matmul and dtype_dict[weights_dtype]["num_bits"] == 8: + group_size = -1 # override user value, re-quantizing 8bit into 8bit is pointless + elif group_size != -1 and not is_linear_type: + group_size = max(group_size // 2, 1) + + if group_size > 0: + if group_size >= channel_size: + group_size = channel_size + num_of_groups = 1 + else: + num_of_groups = channel_size // group_size + while num_of_groups * group_size != channel_size: # find something divisible + num_of_groups -= 1 + if num_of_groups <= 1: + group_size = channel_size + num_of_groups = 1 + break + group_size = channel_size // num_of_groups + group_size = int(group_size) + num_of_groups = int(num_of_groups) + + if num_of_groups > 1: + if result_shape is None: + result_shape = layer.weight.shape + new_shape = list(result_shape) + if is_conv_type: + # output_channel_size, channel_size, X, X + # output_channel_size, num_of_groups, group_size, X, X + new_shape[1] = group_size + new_shape.insert(1, num_of_groups) + reduction_axes = 2 + elif is_conv_transpose_type: + #channel_size, output_channel_size, X, X + #num_of_groups, group_size, output_channel_size, X, X + new_shape[0] = group_size + new_shape.insert(0, num_of_groups) + reduction_axes = 1 + elif is_linear_type: + # output_channel_size, channel_size + # output_channel_size, num_of_groups, group_size + last_dim_index = layer.weight.ndim + new_shape[last_dim_index - 1 : last_dim_index] = (num_of_groups, group_size) + layer.weight.data = layer.weight.reshape(new_shape) + + layer.weight.data, scale, zero_point = quantize_weight(layer.weight, reduction_axes, weights_dtype) + if not dequantize_fp32 and not (use_quantized_matmul and not dtype_dict[weights_dtype]["is_integer"] and not use_tensorwise_fp8_matmul): + scale = scale.to(dtype=torch_dtype) + if zero_point is not None: + zero_point = zero_point.to(dtype=torch_dtype) + if svd_up is not None: + svd_up = svd_up.to(dtype=torch_dtype) + svd_down = svd_down.to(dtype=torch_dtype) + + re_quantize_for_matmul = (num_of_groups > 1 or zero_point is not None) + if use_quantized_matmul and not re_quantize_for_matmul: + scale.t_() + layer.weight.t_() + if use_contiguous_mm: + layer.weight.data = layer.weight.contiguous() + elif layer.weight.is_contiguous(): + layer.weight.data = layer.weight.t_().contiguous().t_() + if not use_tensorwise_fp8_matmul and not dtype_dict[weights_dtype]["is_integer"]: + scale = scale.to(dtype=torch.float32) + + scale = scale.to(return_device, non_blocking=non_blocking) + layer.scale = torch.nn.Parameter(scale, requires_grad=False) + if zero_point is not None: + zero_point = zero_point.to(return_device, non_blocking=non_blocking) + layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) + else: + layer.zero_point = None + if svd_up is not None: + svd_up = svd_up.to(return_device, non_blocking=non_blocking) + svd_down = svd_down.to(return_device, non_blocking=non_blocking) + layer.svd_up = torch.nn.Parameter(svd_up, requires_grad=False) + layer.svd_down = torch.nn.Parameter(svd_down, requires_grad=False) + else: + layer.svd_up, layer.svd_down = None, None + + layer.sdnq_dequantizer = dequantizer_dict[weights_dtype]( + quantized_weight_shape=layer.weight.shape, + result_dtype=torch_dtype, + result_shape=result_shape, + original_shape=original_shape, + weights_dtype=weights_dtype, + use_quantized_matmul=use_quantized_matmul, + re_quantize_for_matmul=re_quantize_for_matmul, + ) + layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) + layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) + + layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) + layer.forward = layer.forward.__get__(layer, layer.__class__) + return layer + + +def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, full_param_name="", op=None): # pylint: disable=unused-argument + has_children = list(model.children()) + if not has_children: + return model + if modules_to_not_convert is None: + modules_to_not_convert = [] + if modules_dtype_dict is None: + modules_dtype_dict = {} + for param_name, module in model.named_children(): + if param_name == "sdnq_dequantizer": + continue + if full_param_name: + param_name = full_param_name + "." + param_name + if hasattr(module, "weight") and module.weight is not None: + param_name = param_name + ".weight" + split_param_name = param_name.split(".") + if ( + param_name in modules_to_not_convert + or any(param in split_param_name for param in modules_to_not_convert) + or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in modules_to_not_convert) + ): + continue + else: + layer_class_name = module.__class__.__name__ + if layer_class_name in allowed_types: + if (layer_class_name in conv_types or layer_class_name in conv_transpose_types) and not quant_conv: + continue + else: + continue + if len(modules_dtype_dict.keys()) > 0: + for key, value in modules_dtype_dict.items(): + if param_name in value: + key = key.lower() + if key in {"8bit", "8bits"}: + if dtype_dict[weights_dtype]["num_bits"] != 8: + weights_dtype = "int8" + elif key.startswith("minimum_"): + minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") + minimum_bits = int(minimum_bits_str) + if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: + weights_dtype = "int" + minimum_bits_str + if minimum_bits <= 4: + weights_dtype = "u" + weights_dtype + else: + weights_dtype = key + + module = sdnq_quantize_layer( + module, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, + quant_conv=quant_conv, + use_quantized_matmul=use_quantized_matmul, + use_quantized_matmul_conv=use_quantized_matmul_conv, + dequantize_fp32=dequantize_fp32, + non_blocking=non_blocking, + quantization_device=quantization_device, + return_device=return_device, + param_name=param_name, + ) + module = apply_sdnq_to_module( + module, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, + quant_conv=quant_conv, + use_quantized_matmul=use_quantized_matmul, + use_quantized_matmul_conv=use_quantized_matmul_conv, + dequantize_fp32=dequantize_fp32, + non_blocking=non_blocking, + quantization_device=quantization_device, + return_device=return_device, + modules_to_not_convert=modules_to_not_convert, + modules_dtype_dict=modules_dtype_dict, + full_param_name=param_name, + op=op, + ) + return model + + +class SDNQQuantizer(DiffusersQuantizer): + r""" + Diffusers Quantizer for SDNQ + """ + + requires_parameters_quantization = True + use_keep_in_fp32_modules = True + requires_calibration = False + required_packages = None + torch_dtype = None + + def __init__(self, quantization_config, **kwargs): + super().__init__(quantization_config, **kwargs) + self.modules_to_not_convert = [] + + def check_if_quantized_param( + self, + model, + param_value: "torch.Tensor", + param_name: str, + *args, **kwargs, # pylint: disable=unused-argument + ): + if param_name.endswith(".weight"): + split_param_name = param_name.split(".") + if ( + param_name not in self.modules_to_not_convert + and not any(param in split_param_name for param in self.modules_to_not_convert) + and not any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in self.modules_to_not_convert) + ): + layer_class_name = get_module_from_name(model, param_name)[0].__class__.__name__ + if layer_class_name in allowed_types: + if layer_class_name in conv_types or layer_class_name in conv_transpose_types: + if self.quantization_config.quant_conv: + return True + else: + return True + if param_value is not None: + with devices.inference_context(): + param_value.data = param_value.clone() # safetensors is unable to release the cpu memory without this + return False + + def check_quantized_param(self, *args, **kwargs) -> bool: + """ + needed for transformers compatibilty, returns self.check_if_quantized_param + """ + return self.check_if_quantized_param(*args, **kwargs) + + def param_needs_quantization(self, model, param_name: str, *args, **kwargs) -> bool: + """ + needed for transformers compatibilty, returns self.check_if_quantized_param + """ + return self.check_if_quantized_param(model, None, param_name, *args, **kwargs) + + @devices.inference_context() + def create_quantized_param( # pylint: disable=arguments-differ + self, + model, + param_value: torch.FloatTensor, + param_name: str, + target_device: torch.device, + *args, **kwargs, # pylint: disable=unused-argument + ): + weights_dtype = self.quantization_config.weights_dtype + if len(self.quantization_config.modules_dtype_dict.keys()) > 0: + split_param_name = param_name.split(".") + for key, value in self.quantization_config.modules_dtype_dict.items(): + if ( + param_name in value + or any(param in split_param_name for param in value) + or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in value) + ): + key = key.lower() + if key in {"8bit", "8bits"}: + if dtype_dict[weights_dtype]["num_bits"] != 8: + weights_dtype = "int8" + elif key.startswith("minimum_"): + minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") + minimum_bits = int(minimum_bits_str) + if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: + weights_dtype = "int" + minimum_bits_str + if minimum_bits <= 4: + weights_dtype = "u" + weights_dtype + else: + weights_dtype = key + + if self.quantization_config.return_device is not None: + return_device = self.quantization_config.return_device + else: + return_device = target_device + + if self.quantization_config.quantization_device is not None: + target_device = self.quantization_config.quantization_device + + if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): + param_value = param_value.clone() + else: + param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) + + layer, _ = get_module_from_name(model, param_name) + layer.weight = torch.nn.Parameter(param_value, requires_grad=False) + layer = sdnq_quantize_layer( + layer, + weights_dtype=weights_dtype, + torch_dtype=self.torch_dtype, + group_size=self.quantization_config.group_size, + svd_rank=self.quantization_config.svd_rank, + use_svd=self.quantization_config.use_svd, + quant_conv=self.quantization_config.quant_conv, + use_quantized_matmul=self.quantization_config.use_quantized_matmul, + use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, + dequantize_fp32=self.quantization_config.dequantize_fp32, + non_blocking=self.quantization_config.non_blocking, + quantization_device=None, + return_device=return_device, + param_name=param_name, + ) + + def adjust_max_memory(self, max_memory: Dict[str, Union[int, str]]) -> Dict[str, Union[int, str]]: + max_memory = {key: val * 0.80 for key, val in max_memory.items()} + return max_memory + + def adjust_target_dtype(self, target_dtype: torch.dtype) -> torch.dtype: # pylint: disable=unused-argument,arguments-renamed + return dtype_dict[self.quantization_config.weights_dtype]["target_dtype"] + + def update_torch_dtype(self, torch_dtype: torch.dtype = None) -> torch.dtype: + if torch_dtype is None: + torch_dtype = devices.dtype + self.torch_dtype = torch_dtype + return torch_dtype + + def _process_model_before_weight_loading( # pylint: disable=arguments-differ + self, + model, + device_map, # pylint: disable=unused-argument + keep_in_fp32_modules: List[str] = None, + **kwargs, # pylint: disable=unused-argument + ): + if keep_in_fp32_modules is not None: + self.modules_to_not_convert.extend(keep_in_fp32_modules) + elif getattr(model, "_keep_in_fp32_modules", None) is not None: + self.modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access + if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: + self.modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + self.modules_to_not_convert.extend(self.quantization_config.modules_to_not_convert) + self.quantization_config.modules_to_not_convert = self.modules_to_not_convert + model.config.quantization_config = self.quantization_config + + def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument + if shared.opts.diffusers_offload_mode != "none": + model = model.to(devices.cpu) + devices.torch_gc(force=True, reason="sdnq") + return model + + def get_accelerator_warm_up_factor(self): + return 32 // dtype_dict[self.quantization_config.weights_dtype]["num_bits"] + + def get_cuda_warm_up_factor(self): + """ + needed for transformers compatibilty, returns self.get_accelerator_warm_up_factor + """ + return self.get_accelerator_warm_up_factor() + + def update_tp_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return config + + def update_ep_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return config + + def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return unexpected_keys + + def update_missing_keys_after_loading(self, model, missing_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return missing_keys + + def update_state_dict_with_metadata(self, state_dict: dict, *args, **kwargs) -> dict: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return state_dict + + def update_expected_keys(self, model, expected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return expected_keys + + def update_param_name(self, param_name: str, *args, **kwargs) -> str: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return param_name + + def update_dtype(self, dtype: torch.dtype, *args, **kwargs) -> torch.dtype: # pylint: disable=unused-argument + """ + needed for transformers compatibilty, no-op function + """ + return dtype + + @property + def is_trainable(self): + return False + + @property + def is_serializable(self): + return True + + @property + def is_compileable(self): + return True + + +@dataclass +class SDNQConfig(QuantizationConfigMixin): + """ + This is a wrapper class about all possible attributes and features that you can play with a model that has been + loaded using `sdnq`. + + Args: + weights_dtype (`str`, *optional*, defaults to `"int8"`): + The target dtype for the weights after quantization. Supported values are: + ("int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz") + group_size (`int`, *optional*, defaults to `0`): + Used to decide how many elements of a tensor will share the same quantization group. + group_size = 0 will automatically select a group size based on weights_dtype. + svd_rank (`int`, *optional*, defaults to `128`): + The rank size used for the SVDQuant algorithm. + use_svd (`bool`, *optional*, defaults to `False`): + Enabling this option will use SVDQuant algorithm. + quant_conv (`bool`, *optional*, defaults to `False`): + Enabling this option will quantize the convolutional layers in UNet models too. + use_quantized_matmul (`bool`, *optional*, defaults to `False`): + Enabling this option will use quantized INT8 or FP8 MatMul instead of BF16 / FP16. + use_quantized_matmul_conv (`bool`, *optional*, defaults to `False`): + Same as use_quantized_matmul_conv but for the convolutional layers with UNets like SDXL. + dequantize_fp32 (`bool`, *optional*, defaults to `False`): + Enabling this option will use FP32 on the dequantization step. + non_blocking (`bool`, *optional*, defaults to `False`): + Enabling this option will use non blocking ops when moving layers between the quantization device and the return device. + quantization_device (`torch.device`, *optional*, defaults to `None`): + Used to set which device will be used for the quantization calculation on model load. + return_device (`torch.device`, *optional*, defaults to `None`): + Used to set which device will the quantized weights be sent back to. + modules_to_not_convert (`list`, *optional*, default to `None`): + The list of modules to not quantize, useful for quantizing models that explicitly require to have some + modules left in their original precision (e.g. Whisper encoder, Llava encoder, Mixtral gate layers). + modules_dtype_dict (`dict`, *optional*, default to `None`): + The dict of dtypes and list of modules, useful for quantizing some modules with a different dtype. + """ + + def __init__( # pylint: disable=super-init-not-called + self, + weights_dtype: str = "int8", + group_size: int = 0, + svd_rank: int = 128, + use_svd: bool = False, + quant_conv: bool = False, + use_quantized_matmul: bool = False, + use_quantized_matmul_conv: bool = False, + dequantize_fp32: bool = False, + non_blocking: bool = False, + quantization_device: Optional[torch.device] = None, + return_device: Optional[torch.device] = None, + modules_to_not_convert: Optional[List[str]] = None, + modules_dtype_dict: Optional[Dict[str, List[str]]] = None, + **kwargs, # pylint: disable=unused-argument + ): + self.weights_dtype = weights_dtype + self.quant_method = QuantizationMethod.SDNQ + self.group_size = group_size + self.svd_rank = svd_rank + self.use_svd = use_svd + self.quant_conv = quant_conv + self.use_quantized_matmul = use_quantized_matmul + self.use_quantized_matmul_conv = use_quantized_matmul_conv + self.dequantize_fp32 = dequantize_fp32 + self.non_blocking = non_blocking + self.quantization_device = quantization_device + self.return_device = return_device + self.modules_to_not_convert = modules_to_not_convert + self.modules_dtype_dict = modules_dtype_dict + self.post_init() + self.is_integer = dtype_dict[self.weights_dtype]["is_integer"] + + def post_init(self): + r""" + Safety checker that arguments are correct + """ + accepted_weights = ["int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz"] + if self.weights_dtype not in accepted_weights: + raise ValueError(f"Only support weights in {accepted_weights} but found {self.weights_dtype}") + + if self.modules_to_not_convert is None: + self.modules_to_not_convert = [] + elif not isinstance(self.modules_to_not_convert, list): + self.modules_to_not_convert = [self.modules_to_not_convert] + + if self.modules_dtype_dict is None: + self.modules_dtype_dict = {} + + +import diffusers.quantizers.auto # noqa: E402,RUF100 # pylint: disable=wrong-import-order +diffusers.quantizers.auto.AUTO_QUANTIZER_MAPPING["sdnq"] = SDNQQuantizer +diffusers.quantizers.auto.AUTO_QUANTIZATION_CONFIG_MAPPING["sdnq"] = SDNQConfig + +import transformers.quantizers.auto # noqa: E402,RUF100 # pylint: disable=wrong-import-order +transformers.quantizers.auto.AUTO_QUANTIZER_MAPPING["sdnq"] = SDNQQuantizer +transformers.quantizers.auto.AUTO_QUANTIZATION_CONFIG_MAPPING["sdnq"] = SDNQConfig From ebb26ac123c548981c5a9b7d38d739a3e217da5a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 01:04:00 +0300 Subject: [PATCH 145/230] SDNQ make load file name configurable --- modules/sdnq/loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 3473e70ad..fc2ed831c 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -14,7 +14,7 @@ def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str) sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) -def load_sdnq_model(model_cls: ModelMixin, model_path: str, use_quantized_matmul: bool = False) -> ModelMixin: +def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", use_quantized_matmul: bool = False) -> ModelMixin: with torch.device("meta"): with open(os.path.join(model_path, "quantization_config.json"), "r") as f: quantization_config = json.load(f) @@ -28,7 +28,7 @@ def load_sdnq_model(model_cls: ModelMixin, model_path: str, use_quantized_matmul model = apply_sdnq_to_module(model, **quantization_config) state_dict = {} - with safe_open(os.path.join(model_path, "diffusion_pytorch_model.safetensors"), framework="pt") as f: + with safe_open(os.path.join(model_path, file_name), framework="pt") as f: for k in f.keys(): state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) From 1f81a37e8e8dea43f2497d26d1b1d32475294cb9 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 01:27:29 +0300 Subject: [PATCH 146/230] Set the default svd rank to 32 --- modules/sdnq/loader.py | 4 ++-- modules/sdnq/quantizer.py | 10 +++++----- modules/shared.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index fc2ed831c..6a625ba17 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -9,8 +9,8 @@ from .common import use_contiguous_mm, use_tensorwise_fp8_matmul from .dequantizer import dequantize_symmetric_compiled, quantize_fp8 -def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str) -> None: - model.save_pretrained(model_path) +def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, max_shard_size: str = "10GB") -> None: + model.save_pretrained(model_path, max_shard_size=max_shard_size) sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 135736d60..a92cb455a 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -48,7 +48,7 @@ def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[i return quantized_weight, scale, zero_point -def apply_svdquant(weight: torch.FloatTensor, rank: int = 128) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: +def apply_svdquant(weight: torch.FloatTensor, rank: int = 32) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: U, S, svd_down = torch.svd_lowrank(weight, q=rank) svd_up = torch.mul(U, S.unsqueeze(0)) svd_down = svd_down.t_() @@ -56,7 +56,7 @@ def apply_svdquant(weight: torch.FloatTensor, rank: int = 128) -> Tuple[torch.Fl @devices.inference_context() -def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument +def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument layer_class_name = layer.__class__.__name__ if layer_class_name in allowed_types: num_of_groups = 1 @@ -230,7 +230,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz return layer -def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=128, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, full_param_name="", op=None): # pylint: disable=unused-argument +def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, full_param_name="", op=None): # pylint: disable=unused-argument has_children = list(model.children()) if not has_children: return model @@ -550,7 +550,7 @@ class SDNQConfig(QuantizationConfigMixin): group_size (`int`, *optional*, defaults to `0`): Used to decide how many elements of a tensor will share the same quantization group. group_size = 0 will automatically select a group size based on weights_dtype. - svd_rank (`int`, *optional*, defaults to `128`): + svd_rank (`int`, *optional*, defaults to `32`): The rank size used for the SVDQuant algorithm. use_svd (`bool`, *optional*, defaults to `False`): Enabling this option will use SVDQuant algorithm. @@ -579,7 +579,7 @@ class SDNQConfig(QuantizationConfigMixin): self, weights_dtype: str = "int8", group_size: int = 0, - svd_rank: int = 128, + svd_rank: int = 32, use_svd: bool = False, quant_conv: bool = False, use_quantized_matmul: bool = False, diff --git a/modules/shared.py b/modules/shared.py index 339cac0f1..16009b1e0 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -201,7 +201,7 @@ options_templates.update(options_section(("quantization", "Model Quantization"), "sdnq_modules_to_not_convert": OptionInfo("", "Modules to not convert"), "sdnq_modules_dtype_dict": OptionInfo("{}", "Modules dtype dict"), "sdnq_quantize_weights_group_size": OptionInfo(0, "Group size", gr.Slider, {"minimum": -1, "maximum": 4096, "step": 1}), - "sdnq_svd_rank": OptionInfo(128, "SVDQuant Rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), + "sdnq_svd_rank": OptionInfo(32, "SVDQuant Rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), "sdnq_use_svd": OptionInfo(False, "Use SVDQuant quantization", gr.Checkbox), "sdnq_quantize_conv_layers": OptionInfo(False, "Quantize convolutional layers", gr.Checkbox), "sdnq_dequantize_compile": OptionInfo(devices.has_triton(), "Dequantize using torch.compile", gr.Checkbox), From 23f2deaa584e7e5a494936766129045be18e8d5e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 02:04:28 +0300 Subject: [PATCH 147/230] fix enable_quantized_mamtul --- modules/sdnq/dequantizer.py | 11 ++++++++++- modules/sdnq/loader.py | 18 +++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 72a058555..38f09f0a1 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -4,7 +4,7 @@ from typing import Tuple, Optional import torch -from .common import dtype_dict, compile_func +from .common import dtype_dict, compile_func, use_tensorwise_fp8_matmul from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric @@ -67,6 +67,15 @@ def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch return weight, scale +def re_quantize_fp8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: + if weight.ndim > 2: # convs + weight = weight.flatten(1,-1) + weight, scale = quantize_fp8(weight.t(), dim=0) + if not use_tensorwise_fp8_matmul: + scale = scale.to(dtype=torch.float32) + return weight, scale + + def re_quantize_matmul_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, zero_point: torch.FloatTensor, result_shape: torch.Size, svd_up: Optional[torch.FloatTensor] = None, svd_down: Optional[torch.FloatTensor] = None) -> Tuple[torch.CharTensor, torch.FloatTensor]: return re_quantize_int8(dequantize_asymmetric(weight, scale, zero_point, scale.dtype, result_shape, svd_up=svd_up, svd_down=svd_down)) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 6a625ba17..aabd2496c 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -4,9 +4,9 @@ import torch from safetensors import safe_open from diffusers.models.modeling_utils import ModelMixin +from .common import use_contiguous_mm from .quantizer import SDNQConfig, apply_sdnq_to_module -from .common import use_contiguous_mm, use_tensorwise_fp8_matmul -from .dequantizer import dequantize_symmetric_compiled, quantize_fp8 +from .dequantizer import dequantize_symmetric_compiled, re_quantize_int8, re_quantize_fp8 def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, max_shard_size: str = "10GB") -> None: @@ -45,14 +45,14 @@ def enable_quantized_mamtul(model): for module in model.children(): if hasattr(module, "sdnq_dequantizer"): if not module.sdnq_dequantizer.use_quantized_matmul: - if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn"} and module.sdnq_dequantizer.result_shape != module.weight.shape: - if module.sdnq_dequantizer.weights_dtype == "int8": - module.weight.data, module.scale.data = module.sdnq_dequantizer.re_quantize_matmul(module.weight, module.scale, module.zero_point, None, None) - elif module.sdnq_dequantizer.weights_dtype == "float8_e4m3fn": - module.weight.data, module.scale.data = quantize_fp8(dequantize_symmetric_compiled(module.weight, module.scale, module.sdnq_dequantizer.result_dtype, module.sdnq_dequantizer.result_shape)) + if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn"}: + if module.sdnq_dequantizer.re_quantize_for_matmul: + if module.sdnq_dequantizer.weights_dtype == "int8": + module.weight.data, module.scale.data = re_quantize_int8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + else: + module.weight.data, module.scale.data = re_quantize_fp8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + else: module.weight.data, module.scale.data = module.weight.t_(), module.scale.t_() - if not use_tensorwise_fp8_matmul: - module.scale.data = module.scale.to(dtype=torch.float32) if use_contiguous_mm: module.weight.data = module.weight.contiguous() elif module.weight.is_contiguous(): From 50c3385cf96b5ae2110cea1ec17e7148c22fbf81 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 11:59:58 -0400 Subject: [PATCH 148/230] fix ltx model selection Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 7 ++++--- modules/ltx/ltx_process.py | 4 +++- modules/ltx/ltx_ui.py | 14 +------------- modules/ltx/ltx_util.py | 9 ++++++++- modules/video_models/video_ui.py | 3 ++- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55df207f5..105788420 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -108,9 +108,10 @@ - reference: fix download for sd15/sdxl reference models - fix checks in init/mask image decode - fix hf token with extra chars - - **FramePack** job state tracking - - **LTXVideo** with offloading - - **WAN** with offloading + - **FramePack** add job state tracking + - **LTXVideo** fix model selection in ltx tab + - **LTXVideo** fix run with offloading + - **WAN** fix run with offloading ## Update for 2025-09-15 diff --git a/modules/ltx/ltx_process.py b/modules/ltx/ltx_process.py index 79837f1fa..4de9084a5 100644 --- a/modules/ltx/ltx_process.py +++ b/modules/ltx/ltx_process.py @@ -13,7 +13,7 @@ from modules.ltx.ltx_util import get_bucket, get_frames, load_model, load_upsamp debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None else lambda *args, **kwargs: None -engine, model = 'LTX Video', 'LTXVideo 0.9.7 13B' +# engine, model = 'LTX Video', 'LTXVideo 0.9.7 13B' upsample_repo_id = "a-r-r-o-w/LTX-Video-0.9.7-Latent-Spatial-Upsampler-diffusers" upsample_pipe = None queue_lock = threading.Lock() @@ -21,6 +21,7 @@ queue_lock = threading.Lock() def run_ltx(task_id, _ui_state, + model:str, prompt:str, negative:str, styles:list[str], @@ -73,6 +74,7 @@ def run_ltx(task_id, memstats.reset_stats() timer.process.reset() yield None, 'LTX: Loading...' + engine = 'LTX Video' load_model(engine, model) shared.state.begin('Video', task_id=task_id) diff --git a/modules/ltx/ltx_ui.py b/modules/ltx/ltx_ui.py index e0626bbe4..04cea1d1e 100644 --- a/modules/ltx/ltx_ui.py +++ b/modules/ltx/ltx_ui.py @@ -10,18 +10,6 @@ from modules.ltx import ltx_process debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None else lambda *args, **kwargs: None -def load_model(model_name): - if model_name is None or model_name == 'None': - shared.log.info('LTX model unload') - from modules import sd_models - sd_models.unload_model_weights() - return - else: - model_instance = [m for m in models['LTX Video'] if m.name == model_name][0] - from modules.video_models import video_load - video_load.load_model(model_instance) - - def create_ui(prompt, negative, styles, overrides): with gr.Row(): with gr.Column(variant='compact', elem_id="ltx_settings", elem_classes=['settings-column'], scale=1): @@ -30,7 +18,6 @@ def create_ui(prompt, negative, styles, overrides): with gr.Row(): ltx_models = [m.name for m in models['LTX Video']] model = gr.Dropdown(label='LTX model', choices=ltx_models, value=ltx_models[0]) - model.change(fn=load_model, inputs=[model], outputs=[], show_progress=True) with gr.Accordion(open=True, label="LTX size", elem_id='ltx_generate_accordion'): with gr.Row(): width, height = ui_sections.create_resolution_inputs('ltx', default_width=832, default_height=480) @@ -90,6 +77,7 @@ def create_ui(prompt, negative, styles, overrides): state_inputs = [task_id, ui_state] video_inputs = [ + model, prompt, negative, styles, width, height, frames, steps, sampler_index, seed, diff --git a/modules/ltx/ltx_util.py b/modules/ltx/ltx_util.py index a07434734..9cca59306 100644 --- a/modules/ltx/ltx_util.py +++ b/modules/ltx/ltx_util.py @@ -4,6 +4,9 @@ from PIL import Image from modules import devices, shared, sd_models, timer, extra_networks +loaded_model: str = None + + def get_bucket(size: int): return int(size) - (int(size) % shared.sd_model.vae_temporal_compression_ratio) @@ -13,11 +16,15 @@ def get_frames(frames: int): def load_model(engine: str, model: str): + global loaded_model # pylint: disable=global-statement + if loaded_model == model: + return t0 = time.time() from modules.video_models import models_def, video_load selected: models_def.Model = [m for m in models_def.models[engine] if m.name == model][0] - shared.log.info(f'Video load: cls={selected.repo_cls.__name__} repo="{selected.repo}"') + shared.log.info(f'Video load: engine="{engine}" selected="{model}" {selected}') video_load.load_model(selected) + loaded_model = model t1 = time.time() shared.sd_model = sd_models.apply_balanced_offload(shared.sd_model) t2 = time.time() diff --git a/modules/video_models/video_ui.py b/modules/video_models/video_ui.py index 5b103d023..910f665a4 100644 --- a/modules/video_models/video_ui.py +++ b/modules/video_models/video_ui.py @@ -1,6 +1,6 @@ import os import gradio as gr -from modules import shared, sd_models, ui_common, ui_sections, ui_symbols, call_queue +from modules import shared, sd_models, ui_common, ui_sections, ui_symbols, ui_video_vlm, call_queue from modules.ui_components import ToolButton from modules.video_models import models_def, video_utils from modules.video_models import video_run @@ -112,6 +112,7 @@ def create_ui(prompt, negative, styles, overrides): init_image = gr.Image(elem_id="video_image", show_label=False, type="pil", image_mode="RGB", width=256, height=256) gr.HTML("
      Last image") last_image = gr.Image(elem_id="video_last", show_label=False, type="pil", image_mode="RGB", width=256, height=256) + vlm_enhance, vlm_model, vlm_system_prompt = ui_video_vlm.create_ui(prompt_element=prompt, image_element=init_image) with gr.Accordion(open=False, label="Output", elem_id='video_output_accordion'): with gr.Row(): save_frames = gr.Checkbox(label='Save image frames', value=False, elem_id="video_save_frames") From 7dad90b385cb00aff983626dbf3973d8ddaa08d2 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 12:15:15 -0400 Subject: [PATCH 149/230] video use shared t5 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 10 ++++++---- modules/video_models/video_load.py | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 105788420..ddd8b3a5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,12 @@ can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems - **nunchaku** update to `1.0.1` and enhance installer - **xyz-grid** add guidance section +- **Video** + - use shared T5 text encoder for video models when possible + - **FramePack** add job state tracking + - **LTXVideo** fix model selection in ltx tab + - **LTXVideo** fix run with offloading + - **WAN** fix run with offloading - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* @@ -108,10 +114,6 @@ - reference: fix download for sd15/sdxl reference models - fix checks in init/mask image decode - fix hf token with extra chars - - **FramePack** add job state tracking - - **LTXVideo** fix model selection in ltx tab - - **LTXVideo** fix run with offloading - - **WAN** fix run with offloading ## Update for 2025-09-15 diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index 874df0231..51a17d2ce 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -25,6 +25,10 @@ def load_model(selected: models_def.Model): # text encoder try: load_args, quant_args = model_quant.get_dit_args({}, module='TE', device_map=True) + if selected.te_cls.__name__ == 'T5EncoderModel' and shared.opts.te_shared_t5: + selected.te = 'Disty0/t5-xxl' + selected.te_folder = '' + selected.te_revision = None shared.log.debug(f'Video load: module=te repo="{selected.te or selected.repo}" folder="{selected.te_folder}" cls={selected.te_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') kwargs["text_encoder"] = selected.te_cls.from_pretrained( pretrained_model_name_or_path=selected.te or selected.repo, @@ -84,17 +88,23 @@ def load_model(selected: models_def.Model): shared.sd_model.sd_model_hash = None sd_models.set_diffuser_options(shared.sd_model, offload=False) + decode, text, image, slicing, tiling = False, False, False, False, False if selected.vae_hijack and hasattr(shared.sd_model.vae, 'decode'): sd_hijack_vae.init_hijack(shared.sd_model) + decode = True if selected.te_hijack and hasattr(shared.sd_model, 'encode_prompt'): sd_hijack_te.init_hijack(shared.sd_model) + text = True if selected.image_hijack and hasattr(shared.sd_model, 'encode_image'): shared.sd_model.orig_encode_image = shared.sd_model.encode_image shared.sd_model.encode_image = video_utils.hijack_encode_image - if hasattr(shared.sd_model.vae, 'enable_slicing'): + image = True + if hasattr(shared.sd_model, 'vae') and hasattr(shared.sd_model.vae, 'enable_slicing'): shared.sd_model.vae.enable_slicing() - if hasattr(shared.sd_model.vae, 'enable_tiling'): + slicing = True + if hasattr(shared.sd_model, 'vae') and hasattr(shared.sd_model.vae, 'enable_tiling'): shared.sd_model.vae.enable_tiling() + tiling = True if hasattr(shared.sd_model, "set_progress_bar_config"): shared.sd_model.set_progress_bar_config(bar_format='Progress {rate_fmt}{postfix} {bar} {percentage:3.0f}% {n_fmt}/{total_fmt} {elapsed} {remaining} ' + '\x1b[38;5;71m', ncols=80, colour='#327fba') @@ -104,5 +114,6 @@ def load_model(selected: models_def.Model): loaded_model = selected.name msg = f'Video load: cls={shared.sd_model.__class__.__name__} model="{selected.name}" time={t1-t0:.2f}' shared.log.info(msg) + shared.log.debug(f'Video hijacks: decode={decode} text={text} image={image} slicing={slicing} tiling={tiling}') shared.state.end(jobid) return msg From d7d86ed28663211b52694a72693b14a0b9e823ff Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 12:23:33 -0400 Subject: [PATCH 150/230] ltx job tracking Signed-off-by: Vladimir Mandic --- modules/ltx/ltx_process.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/ltx/ltx_process.py b/modules/ltx/ltx_process.py index 4de9084a5..46374d77d 100644 --- a/modules/ltx/ltx_process.py +++ b/modules/ltx/ltx_process.py @@ -77,7 +77,7 @@ def run_ltx(task_id, engine = 'LTX Video' load_model(engine, model) - shared.state.begin('Video', task_id=task_id) + videojob = shared.state.begin('Video', task_id=task_id) shared.state.job_count = 1 p = processing.StableDiffusionProcessingVideo( @@ -107,7 +107,7 @@ def run_ltx(task_id, prompt, negative, networks = get_prompts(prompt, negative, styles) sampler_name = processing.get_sampler_name(sampler_index) sd_samplers.create_sampler(sampler_name, shared.sd_model) - shared.log.debug(f'Video: cls={shared.sd_model.__class__.__name__} op=init prompt="{prompt}" negative="{negative}" styles={styles} networks={networks} sampler={shared.sd_model.scheduler.__class__.__name__}') + shared.log.debug(f'Video: cls={shared.sd_model.__class__.__name__} op=init styles={styles} networks={networks} sampler={shared.sd_model.scheduler.__class__.__name__}') extra_networks.activate(p, networks) t0 = time.time() @@ -129,6 +129,7 @@ def run_ltx(task_id, if len(conditions) > 0: base_args["conditions"] = conditions yield None, 'LTX: Generate in progress...' + samplejob = shared.state.begin('Sample') try: latents = shared.sd_model(**base_args).frames[0] except AssertionError as e: @@ -143,10 +144,11 @@ def run_ltx(task_id, timer.process.add('offload', t1 - t0) timer.process.add('base', t2 - t1) timer.process.add('offload', t3 - t2) + shared.state.end(samplejob) if upsample_enable: t4 = time.time() - shared.state.begin('Upsample') + upsamplejob = shared.state.begin('Upsample') global upsample_pipe # pylint: disable=global-statement upsample_pipe = load_upsample(upsample_pipe, upsample_repo_id) upsample_pipe = sd_models.apply_balanced_offload(upsample_pipe) @@ -174,11 +176,11 @@ def run_ltx(task_id, t6 = time.time() timer.process.add('upsample', t5 - t4) timer.process.add('offload', t6 - t5) - shared.state.end() + shared.state.end(upsamplejob) if refine_enable: t7 = time.time() - shared.state.begin('Refine') + refinejob = shared.state.begin('Refine') shared.sd_model = sd_models.apply_balanced_offload(shared.sd_model) refine_args = { "prompt": prompt, @@ -213,7 +215,7 @@ def run_ltx(task_id, t9 = time.time() timer.process.add('refine', t8 - t7) timer.process.add('offload', t9 - t8) - shared.state.end() + shared.state.end(refinejob) extra_networks.deactivate(p) @@ -252,7 +254,7 @@ def run_ltx(task_id, fps = f'{num_frames/(t_end-t0):.2f}' its = f'{(steps)/(t_end-t0):.2f}' - shared.state.end() + shared.state.end(videojob) progress.finish_task(task_id) shared.log.info(f'Processed: fn="{video_file}" frames={num_frames} fps={fps} its={its} resolution={resolution} time={t_end-t0:.2f} timers={timer.process.dct()} memory={memstats.memory_stats()}') From 58b0ab9da6db4807719ed4ae165e756e95b9ca22 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 13:30:22 -0400 Subject: [PATCH 151/230] unified video save Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 +++++---- javascript/control.js | 1 - javascript/history.js | 2 +- modules/video.py | 4 ++-- modules/video_models/video_run.py | 27 +++++++++++++++++++++++---- modules/video_models/video_save.py | 23 +++++++++++++++++++++-- modules/video_models/video_ui.py | 24 +++++++++++++++++------- 7 files changed, 69 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddd8b3a5d..0b2124b1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,10 +89,11 @@ - **xyz-grid** add guidance section - **Video** - use shared T5 text encoder for video models when possible - - **FramePack** add job state tracking - - **LTXVideo** fix model selection in ltx tab - - **LTXVideo** fix run with offloading - - **WAN** fix run with offloading + - unified video save code across all video models + also avoids creation of temporary files for each frame unless user wants to save them + - add job state tracking for video generation + - improve offloading for **ltx** and **wan** + - fix model selection in ltx tab - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* diff --git a/javascript/control.js b/javascript/control.js index c94c61a67..e0bb550ba 100644 --- a/javascript/control.js +++ b/javascript/control.js @@ -4,7 +4,6 @@ function controlInputMode(inputMode, ...args) { const tab = gradioApp().querySelector('#control-tab-input button.selected'); if (!tab) return ['Image', ...args]; inputMode = tab.innerText; - console.log('HERE0', tab, inputMode); return [inputMode, ...args]; } diff --git a/javascript/history.js b/javascript/history.js index ff2db4831..2a40b0859 100644 --- a/javascript/history.js +++ b/javascript/history.js @@ -45,7 +45,7 @@ function refreshHistory() { if (inferenceTypes.some((type) => entry.job.toLowerCase().startsWith(type))) entry.type = 'inference'; else if (ioTypes.some((type) => entry.job.toLowerCase().startsWith(type))) entry.type = 'io'; else entry.type = 'default'; - ts.push({ start, end: end.timestamp, label: entry.job, type: entry.type }); + if (start && end.timestamp) ts.push({ start, end: end.timestamp, label: entry.job, type: entry.type }); } } if (!ts.length) return; diff --git a/modules/video.py b/modules/video.py index fe7d88c36..b95ae7aa1 100644 --- a/modules/video.py +++ b/modules/video.py @@ -29,7 +29,7 @@ def save_video_atomic(images, filename, video_type: str = 'none', duration: floa except Exception as e: shared.log.error(f'Save video: cv2: {e}') return - jobid = shared.state.begin('Save video') + savejob = shared.state.begin('Save video') os.makedirs(os.path.dirname(filename), exist_ok=True) if video_type.lower() in ['gif', 'png']: append = images.copy() @@ -57,7 +57,7 @@ def save_video_atomic(images, filename, video_type: str = 'none', duration: floa video_writer.write(img) size = os.path.getsize(filename) shared.log.info(f'Save video: file="{filename}" frames={len(frames)} duration={duration} fourcc={fourcc} size={size}') - shared.state.end(jobid) + shared.state.end(savejob) def save_video(p, images, filename = None, video_type: str = 'none', duration: float = 2.0, loop: bool = False, interpolate: int = 0, scale: float = 1.0, pad: int = 1, change: float = 0.3, sync: bool = False): diff --git a/modules/video_models/video_run.py b/modules/video_models/video_run.py index 33d4f5d13..1dccc3611 100644 --- a/modules/video_models/video_run.py +++ b/modules/video_models/video_run.py @@ -1,16 +1,17 @@ import os import time from modules import shared, errors, sd_models, processing, devices, images, ui_common -from modules.video_models import models_def, video_utils, video_load, video_vae, video_overrides +from modules.video_models import models_def, video_utils, video_load, video_vae, video_overrides, video_save debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None else lambda *args, **kwargs: None def generate(*args, **kwargs): - task_id, ui_state, engine, model, prompt, negative, styles, width, height, frames, steps, sampler_index, sampler_shift, dynamic_shift, seed, guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, save_frames, video_type, video_duration, video_loop, video_pad, video_interpolate, override_settings = args + task_id, ui_state, engine, model, prompt, negative, styles, width, height, frames, steps, sampler_index, sampler_shift, dynamic_shift, seed, guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, override_settings = args if engine is None or model is None or engine == 'None' or model == 'None': return video_utils.queue_err('model not selected') + # videojob = shared.state.begin('Video') found = [model.name for model in models_def.models.get(engine, [])] selected: models_def.Model = [m for m in models_def.models[engine] if m.name == model][0] if len(found) > 0 else None if not shared.sd_loaded: @@ -51,7 +52,7 @@ def generate(*args, **kwargs): p.script_args = None p.state = ui_state p.do_not_save_grid = True - p.do_not_save_samples = not save_frames + p.do_not_save_samples = not mp4_frames p.outpath_samples = shared.opts.outdir_samples or shared.opts.outdir_video if 'T2V' in model: if init_image is not None: @@ -119,6 +120,24 @@ def generate(*args, **kwargs): if processed is None or len(processed.images) == 0: return video_utils.queue_err('processing failed') shared.log.info(f'Video: name="{selected.name}" cls={shared.sd_model.__class__.__name__} frames={len(processed.images)} time={t1-t0:.2f}') - video_file = images.save_video(p, filename=None, images=processed.images, video_type=video_type, duration=video_duration, loop=video_loop, pad=video_pad, interpolate=video_interpolate) + + # video_file = images.save_video(p, filename=None, images=processed.images, video_type=video_type, duration=video_duration, loop=video_loop, pad=video_pad, interpolate=video_interpolate) # legacy video save from list of images + pixels = video_save.images_to_tensor(processed.images) + _num_frames, video_file = video_save.save_video( + pixels=pixels, + mp4_fps=mp4_fps, + mp4_codec=mp4_codec, + mp4_opt=mp4_opt, + mp4_ext=mp4_ext, + mp4_sf=mp4_sf, + mp4_video=mp4_video, + mp4_frames=mp4_frames, + mp4_interpolate=mp4_interpolate, + metadata={}, + ) + if not mp4_frames: + processed.images = [] + generation_info_js = processed.js() if processed is not None else '' + # shared.state.end(videojob) return processed.images, video_file, generation_info_js, processed.info, ui_common.plaintext_to_html(processed.comments) diff --git a/modules/video_models/video_save.py b/modules/video_models/video_save.py index 2ce71f0af..41095922f 100644 --- a/modules/video_models/video_save.py +++ b/modules/video_models/video_save.py @@ -2,6 +2,7 @@ import os import time import datetime import cv2 +import numpy as np import torch import einops from modules import shared, errors ,timer, rife @@ -13,6 +14,18 @@ def get_video_filename(frames:int, codec:str): return output_filename +def images_to_tensor(images): + if images is None or len(images) == 0: + return None + array = [torch.from_numpy(np.array(image)) for image in images] + tensor = torch.stack(array, dim=0) # n h w c + tensor = tensor.unsqueeze(0) # 1, n, h, w, c + tensor = tensor.permute(0, 4, 1, 2, 3).contiguous() # 1, c, n, h, w + tensor = (tensor.float() / 127.5) - 1.0 # from [0,255] to [-1,1] + # shared.log.debug(f'Video output: images={len(images)} tensor={tensor.shape}') + return tensor + + def atomic_save_video(filename, tensor:torch.Tensor, fps:float=24, codec:str='libx264', pix_fmt:str='yuv420p', options:str='', metadata:dict={}, pbar=None): try: import av @@ -21,6 +34,7 @@ def atomic_save_video(filename, tensor:torch.Tensor, fps:float=24, codec:str='li shared.log.error(f'Video: {e}') return + savejob = shared.state.begin('Save video') frames, height, width, _channels = tensor.shape rate = round(fps) options_str = options @@ -54,6 +68,7 @@ def atomic_save_video(filename, tensor:torch.Tensor, fps:float=24, codec:str='li for packet in stream.encode(): # flush container.mux(packet) shared.state.outputs(filename) + shared.state.end(savejob) def save_video( @@ -73,13 +88,16 @@ def save_video( output_video = None if pixels is None: return 0, output_video + if not torch.is_tensor(pixels): + shared.log.error(f'Video: type={type(pixels)} not a tensor') + return 0, output_video t_save = time.time() n, _c, t, h, w = pixels.shape size = pixels.element_size() * pixels.numel() shared.log.debug(f'Video: video={mp4_video} export={mp4_frames} safetensors={mp4_sf} interpolate={mp4_interpolate}') shared.log.debug(f'Video: encode={t} raw={size} latent={pixels.shape} fps={mp4_fps} codec={mp4_codec} ext={mp4_ext} options="{mp4_opt}"') - jobid = shared.state.begin('Save video') try: + preparejob = shared.state.begin('Prepare video') if stream is not None: stream.output_queue.push(('progress', (None, 'Saving video...'))) if mp4_interpolate > 0: @@ -111,6 +129,8 @@ def save_video( shared.state.outputs(fn) cv2.imwrite(fn, image) + shared.state.end(preparejob) + if mp4_video and (mp4_codec != 'none'): output_video = f'{output_filename}.{mp4_ext}' atomic_save_video(output_video, tensor=x, fps=mp4_fps, codec=mp4_codec, options=mp4_opt, metadata=metadata, pbar=pbar) @@ -125,5 +145,4 @@ def save_video( shared.log.error(f'Video save: raw={size} {e}') errors.display(e, 'video') timer.process.add('save', time.time()-t_save) - shared.state.end(jobid) return t, output_video diff --git a/modules/video_models/video_ui.py b/modules/video_models/video_ui.py index 910f665a4..faea8b6ef 100644 --- a/modules/video_models/video_ui.py +++ b/modules/video_models/video_ui.py @@ -112,20 +112,31 @@ def create_ui(prompt, negative, styles, overrides): init_image = gr.Image(elem_id="video_image", show_label=False, type="pil", image_mode="RGB", width=256, height=256) gr.HTML("
      Last image") last_image = gr.Image(elem_id="video_last", show_label=False, type="pil", image_mode="RGB", width=256, height=256) + vlm_enhance, vlm_model, vlm_system_prompt = ui_video_vlm.create_ui(prompt_element=prompt, image_element=init_image) - with gr.Accordion(open=False, label="Output", elem_id='video_output_accordion'): + + with gr.Accordion(label="Video", open=False, elem_id='video_output_accordion'): with gr.Row(): - save_frames = gr.Checkbox(label='Save image frames', value=False, elem_id="video_save_frames") + mp4_fps = gr.Slider(label="FPS", minimum=1, maximum=60, value=24, step=1) + mp4_interpolate = gr.Slider(label="Video interpolation", minimum=0, maximum=10, value=0, step=1) with gr.Row(): - video_type, video_duration, video_loop, video_pad, video_interpolate = ui_sections.create_video_inputs(tab='video', show_always=True) + mp4_codec = gr.Dropdown(label="Video codec", choices=['none', 'libx264'], value='libx264', type='value') + ui_common.create_refresh_button(mp4_codec, video_utils.get_codecs, elem_id="framepack_mp4_codec_refresh") + mp4_ext = gr.Textbox(label="Video format", value='mp4', elem_id="framepack_mp4_ext") + mp4_opt = gr.Textbox(label="Video options", value='crf:16', elem_id="framepack_mp4_ext") + with gr.Row(): + mp4_video = gr.Checkbox(label='Video save video', value=True, elem_id="framepack_mp4_video") + mp4_frames = gr.Checkbox(label='Video save frames', value=False, elem_id="framepack_mp4_frames") + mp4_sf = gr.Checkbox(label='Video save safetensors', value=False, elem_id="framepack_mp4_sf") + # output panel with gallery and video tabs with gr.Column(elem_id='video-output-column', scale=2) as _column_output: with gr.Tabs(elem_classes=['video-output-tabs'], elem_id='video-output-tabs'): - with gr.Tab('Frames', id='out-gallery'): - gallery, gen_info, html_info, _html_info_formatted, html_log = ui_common.create_output_panel("video", prompt=prompt, preview=False, transfer=False, scale=2) with gr.Tab('Video', id='out-video'): video = gr.Video(label="Output", show_label=False, elem_id='control_output_video', elem_classes=['control-image'], height=512, autoplay=False) + with gr.Tab('Frames', id='out-gallery'): + gallery, gen_info, html_info, _html_info_formatted, html_log = ui_common.create_output_panel("video", prompt=prompt, preview=False, transfer=False, scale=2) # connect reuse seed button ui_common.connect_reuse_seed(seed, reuse_seed, gen_info, is_subseed=False) @@ -151,8 +162,7 @@ def create_ui(prompt, negative, styles, overrides): guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, - save_frames, - video_type, video_duration, video_loop, video_pad, video_interpolate, + mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, overrides, ] video_outputs = [ From 3e47f3dd9a91052d43f4397e412cc28abd027e9b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 13:56:10 -0400 Subject: [PATCH 152/230] video prompt enhance Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + modules/interrogate/vqa.py | 17 ++++++++--------- modules/ui_video_vlm.py | 1 - modules/video_models/video_prompt.py | 21 +++++++++++++++++++++ modules/video_models/video_run.py | 6 ++++-- modules/video_models/video_ui.py | 1 + 6 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 modules/video_models/video_prompt.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b2124b1e..8ad0b182a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,7 @@ - use shared T5 text encoder for video models when possible - unified video save code across all video models also avoids creation of temporary files for each frame unless user wants to save them + - unified prompt enhance code across all video models - add job state tracking for video generation - improve offloading for **ltx** and **wan** - fix model selection in ltx tab diff --git a/modules/interrogate/vqa.py b/modules/interrogate/vqa.py index baebb62c2..0821d5c4f 100644 --- a/modules/interrogate/vqa.py +++ b/modules/interrogate/vqa.py @@ -636,12 +636,11 @@ def interrogate(question:str='', system_prompt:str=None, prompt:str=None, image: image = image[0] if len(image) > 0 else None if isinstance(image, dict) and 'name' in image: image = Image.open(image['name']) - if image is None: - return '' - if image.width > 768 or image.height > 768: - image.thumbnail((768, 768), Image.Resampling.LANCZOS) - if image.mode != 'RGB': - image = image.convert('RGB') + if isinstance(image, Image.Image): + if image.width > 768 or image.height > 768: + image.thumbnail((768, 768), Image.Resampling.LANCZOS) + if image.mode != 'RGB': + image = image.convert('RGB') if prompt is not None and len(prompt) > 0: question = prompt if len(question) < 2: @@ -664,9 +663,9 @@ def interrogate(question:str='', system_prompt:str=None, prompt:str=None, image: if vqa_model is None: shared.log.error(f'Interrogate: type=vlm model="{model_name}" unknown') return '' - if image is None: - shared.log.error(f'Interrogate: type=vlm model="{model_name}" no input image') - return '' + # if image is None: + # shared.log.error(f'Interrogate: type=vlm model="{model_name}" no input image') + # return '' if 'git' in vqa_model.lower(): answer = git(question, image, vqa_model) diff --git a/modules/ui_video_vlm.py b/modules/ui_video_vlm.py index 685c6d8d8..c7ce3a229 100644 --- a/modules/ui_video_vlm.py +++ b/modules/ui_video_vlm.py @@ -46,7 +46,6 @@ def enhance_prompt(enable:bool, model:str=None, image=None, prompt:str='', syste system_prompt += system_prompts['nsfw_ok'] if nsfw else system_prompts['nsfw_no'] system_prompt += f" {system_prompts['suffix']} {system_prompts['example']}" shared.log.debug(f'Video prompt enhance: model="{model}" image={image} nsfw={nsfw} prompt="{prompt}"') - # shared.log.trace(f'Video prompt enhance: system="{system_prompt}"') answer = vqa.interrogate(question='', prompt=prompt, system_prompt=system_prompt, image=image, model_name=model, quiet=False) shared.log.debug(f'Video prompt enhance: answer="{answer}"') return answer diff --git a/modules/video_models/video_prompt.py b/modules/video_models/video_prompt.py new file mode 100644 index 000000000..bbb29c409 --- /dev/null +++ b/modules/video_models/video_prompt.py @@ -0,0 +1,21 @@ +from modules import shared, extra_networks, ui_video_vlm + + +def prepare_prompt(p, init_image, prompt:str, vlm_enhance:bool, vlm_model:str, vlm_system_prompt:str): + p.prompt = shared.prompt_styles.apply_styles_to_prompt(p.prompt, p.styles) + p.negative_prompt = shared.prompt_styles.apply_negative_styles_to_prompt(p.negative_prompt, p.styles) + shared.prompt_styles.apply_styles_to_extra(p) + p.prompts, p.network_data = extra_networks.parse_prompts([p.prompt]) + extra_networks.activate(p) + prompt = p.prompts[0] + + new_prompt = ui_video_vlm.enhance_prompt( + enable=vlm_enhance, + model=vlm_model, + image=init_image, + prompt=prompt, + system_prompt=vlm_system_prompt, + ) + if new_prompt is not None and len(new_prompt) > 0: + prompt = new_prompt + return prompt diff --git a/modules/video_models/video_run.py b/modules/video_models/video_run.py index 1dccc3611..40f7e154f 100644 --- a/modules/video_models/video_run.py +++ b/modules/video_models/video_run.py @@ -1,14 +1,14 @@ import os import time from modules import shared, errors, sd_models, processing, devices, images, ui_common -from modules.video_models import models_def, video_utils, video_load, video_vae, video_overrides, video_save +from modules.video_models import models_def, video_utils, video_load, video_vae, video_overrides, video_save, video_prompt debug = shared.log.trace if os.environ.get('SD_VIDEO_DEBUG', None) is not None else lambda *args, **kwargs: None def generate(*args, **kwargs): - task_id, ui_state, engine, model, prompt, negative, styles, width, height, frames, steps, sampler_index, sampler_shift, dynamic_shift, seed, guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, override_settings = args + task_id, ui_state, engine, model, prompt, negative, styles, width, height, frames, steps, sampler_index, sampler_shift, dynamic_shift, seed, guidance_scale, guidance_true, init_image, init_strength, last_image, vae_type, vae_tile_frames, mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, vlm_enhance, vlm_model, vlm_system_prompt, override_settings = args if engine is None or model is None or engine == 'None' or model == 'None': return video_utils.queue_err('model not selected') # videojob = shared.state.begin('Video') @@ -81,6 +81,8 @@ def generate(*args, **kwargs): shared.sd_model = sd_models.apply_balanced_offload(shared.sd_model) devices.torch_gc(force=True, reason='video') + prompt = video_prompt.prepare_prompt(p, init_image, prompt, vlm_enhance, vlm_model, vlm_system_prompt) + # set args processing.fix_seed(p) video_vae.set_vae_params(p) diff --git a/modules/video_models/video_ui.py b/modules/video_models/video_ui.py index faea8b6ef..cd78f45a2 100644 --- a/modules/video_models/video_ui.py +++ b/modules/video_models/video_ui.py @@ -163,6 +163,7 @@ def create_ui(prompt, negative, styles, overrides): init_image, init_strength, last_image, vae_type, vae_tile_frames, mp4_fps, mp4_interpolate, mp4_codec, mp4_ext, mp4_opt, mp4_video, mp4_frames, mp4_sf, + vlm_enhance, vlm_model, vlm_system_prompt, overrides, ] video_outputs = [ From d48fe5adab93ceac10a6f1c7d11e154d7da4625b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 14:14:38 -0400 Subject: [PATCH 153/230] update modernui Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + extensions-builtin/sdnext-modernui | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ad0b182a..110b6ae69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ main logo in top-left corner now indicates server connection status and hovering over it shows connection details - separate guidance and detail sections - networks ability to filter lora by base model version + - add interrogate button to input images - **SDNQ** - add `SVDQuant` quantization method support - make sdnq scales compatible with balanced offload diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 165925a2c..e58d96e26 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 165925a2cc849595053ddb147eb0dc781b302d2b +Subproject commit e58d96e26290960e1df35d0e012c5e50b4e6a606 From 28e3ae048080a2ae50ad93bb7fb8f700242dd3a6 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 20:17:30 -0400 Subject: [PATCH 154/230] experimental xomni Signed-off-by: Vladimir Mandic --- .pylintrc | 1 + .ruff.toml | 1 + CHANGELOG.md | 11 +- TODO.md | 1 - html/reference.json | 10 + models/Reference/X-Omni--X-Omni-SFT.jpg | Bin 0 -> 77817 bytes modules/modeldata.py | 2 + modules/sd_checkpoint.py | 2 + modules/sd_detect.py | 2 + modules/sd_models.py | 5 + modules/sd_offload.py | 4 +- modules/shared_items.py | 1 + modules/ui_extra_networks_checkpoints.py | 5 +- modules/video_models/video_load.py | 33 +- pipelines/model_xomni.py | 113 +++ pipelines/xomni/__init__.py | 0 pipelines/xomni/configuration_xomni.py | 25 + pipelines/xomni/modeling_siglip_flux.py | 841 +++++++++++++++++++ pipelines/xomni/modeling_siglip_tokenizer.py | 231 +++++ pipelines/xomni/modeling_vit.py | 699 +++++++++++++++ pipelines/xomni/modeling_xomni.py | 317 +++++++ 21 files changed, 2282 insertions(+), 22 deletions(-) create mode 100644 models/Reference/X-Omni--X-Omni-SFT.jpg create mode 100644 pipelines/model_xomni.py create mode 100644 pipelines/xomni/__init__.py create mode 100644 pipelines/xomni/configuration_xomni.py create mode 100644 pipelines/xomni/modeling_siglip_flux.py create mode 100644 pipelines/xomni/modeling_siglip_tokenizer.py create mode 100644 pipelines/xomni/modeling_vit.py create mode 100644 pipelines/xomni/modeling_xomni.py diff --git a/.pylintrc b/.pylintrc index 7b6cdb7cb..5b4e398dc 100644 --- a/.pylintrc +++ b/.pylintrc @@ -42,6 +42,7 @@ ignore-paths=/usr/lib/.*$, pipelines/meissonic, pipelines/omnigen2, pipelines/segmoe, + pipelines/xomni, scripts/consistory, scripts/ctrlx, scripts/daam, diff --git a/.ruff.toml b/.ruff.toml index 297515402..7433d76da 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -22,6 +22,7 @@ exclude = [ "pipelines/omnigen2", "pipelines/hdm", "pipelines/segmoe", + "pipelines/xomni", "scripts/lbm", "scripts/daam", diff --git a/CHANGELOG.md b/CHANGELOG.md index 110b6ae69..ceb6ff539 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,14 +9,16 @@ updated version of Qwen Image Edit with improved image consistency - [Qwen Image Pruning](https://huggingface.co/OPPOer/Qwen-Image-Pruning) and [Qwen Image Edit Pruning](https://huggingface.co/OPPOer/Qwen-Image-Edit-Pruning) pruned versions of Qwen with 13B params instead of 20B, with some quality tradeoff - - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) - updated version of E1 image editing model - [Tencent FLUX.1 Dev SRPO](https://huggingface.co/tencent/SRPO) SRPO is trained by Tencent with specific technique: directly aligning the full diffusion trajectory with fine-grained human preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models + - [X-Omni SFT](https://x-omni-team.github.io/) + *experimental*: X-omni is a transformer-only discrete autoregressive image generative model trained with reinforcement learning + - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) + *experimental*: updated version of E1 image editing model - **Features** - [Qwen Image-Edit] multi-image editing requires qwen-image-edit-2509 or its variant as multi-image edits are not available in original qwen-image @@ -94,8 +96,9 @@ also avoids creation of temporary files for each frame unless user wants to save them - unified prompt enhance code across all video models - add job state tracking for video generation - - improve offloading for **ltx** and **wan** - - fix model selection in ltx tab + - fix quantization not being applied on load for some models + - improve offloading for **ltx** and **wan** + - fix model selection in **ltx** tab - **Experimental** - `new` command line flag enables new `pydantic` and `albumentations` packages - **modular pipelines**: enable in *settings -> model options* diff --git a/TODO.md b/TODO.md index 01bcdad79..adb84fbd8 100644 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### Under Consideration - [Inf-DiT](https://github.com/zai-org/Inf-DiT) -- [X-Omni](https://github.com/X-Omni-Team/X-Omni/blob/main/README.md) - [DiffSynth Studio](https://github.com/modelscope/DiffSynth-Studio) - [IPAdapter negative guidance](https://github.com/huggingface/diffusers/discussions/7167) - [IPAdapter composition](https://huggingface.co/ostris/ip-composition-adapter) diff --git a/html/reference.json b/html/reference.json index 2c3ca1d7e..45f2bd2d5 100644 --- a/html/reference.json +++ b/html/reference.json @@ -501,6 +501,16 @@ "date": "2025 June" }, + "X-Omni SFT": { + "path": "X-Omni/X-Omni-SFT", + "desc": "X-Omni: Reinforcement learning makes discrete autoregressive image generative models great again", + "preview": "X-Omni--X-Omni-SFT.jpg", + "skip": true, + "size": 0, + "date": "2024 September", + "experimental": true + }, + "VectorSpaceLab OmniGen v1": { "path": "Shitao/OmniGen-v1-diffusers", "desc": "OmniGen is a unified image generation model that can generate a wide range of images from multi-modal prompts. It is designed to be simple, flexible and easy to use.", diff --git a/models/Reference/X-Omni--X-Omni-SFT.jpg b/models/Reference/X-Omni--X-Omni-SFT.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2394b57b4e94214ba70c291b208b62f2d3380ad GIT binary patch literal 77817 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
    <3E|+ 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 CheckpointInfo: # reference search ref = [(k, v) for k, v in shared.reference_models.items() if f"{v.get('path', '')}+{v.get('subfolder', '')}" == s] + if len(ref) == 0: + ref = [(k, v) for k, v in shared.reference_models.items() if v.get('path', '') == s] if ref and len(ref) > 0: _name, info = ref[0] checkpoint_info = CheckpointInfo(s) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 838c68770..0cd3cdb86 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -115,6 +115,8 @@ def guess_by_name(fn, current_guess): return 'Kandinsky 3.0' elif 'hunyuanimage' in fn.lower(): return 'HunyuanImage' + elif 'x-omni' in fn.lower(): + return 'X-Omni' elif 'sdxl-turbo' in fn.lower() or 'stable-diffusion-xl' in fn.lower(): return 'Stable Diffusion XL' return current_guess diff --git a/modules/sd_models.py b/modules/sd_models.py index b8e3c0391..426a7ca3d 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -47,6 +47,7 @@ pipe_switch_task_exclude = [ 'StableDiffusionControlNetXSPipeline', 'StableDiffusionXLControlNetXSPipeline', 'StableDiffusionReferencePipeline', 'StableDiffusionXLInstantIDPipeline', + 'XOmniPipeline', ] i2i_pipes = [ 'LEditsPPPipelineStableDiffusion', @@ -399,6 +400,10 @@ def load_diffuser_force(model_type, checkpoint_info, diffusers_load_config, op=' from pipelines.model_hyimage import load_hyimage sd_model = load_hyimage(checkpoint_info, diffusers_load_config) # pylint: disable=assignment-from-none allow_post_quant = False + elif model_type in ['X-Omni']: + from pipelines.model_xomni import load_xomni + sd_model = load_xomni(checkpoint_info, diffusers_load_config) # pylint: disable=assignment-from-none + allow_post_quant = False except Exception as e: shared.log.error(f'Load {op}: path="{checkpoint_info.path}" {e}') if debug_load: diff --git a/modules/sd_offload.py b/modules/sd_offload.py index 19e59de3d..54446abdf 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -13,7 +13,7 @@ from modules.timer import process as process_timer debug = os.environ.get('SD_MOVE_DEBUG', None) is not None debug_move = log.trace if debug else lambda *args, **kwargs: None -offload_warn = ['sc', 'sd3', 'f1', 'h1', 'hunyuandit', 'auraflow', 'omnigen', 'omnigen2', 'cogview4', 'cosmos', 'chroma'] +offload_warn = ['sc', 'sd3', 'f1', 'h1', 'hunyuandit', 'auraflow', 'omnigen', 'omnigen2', 'cogview4', 'cosmos', 'chroma', 'x-omni'] offload_post = ['h1'] offload_hook_instance = None balanced_offload_exclude = ['CogView4Pipeline', 'MeissonicPipeline'] @@ -224,7 +224,7 @@ class OffloadHook(accelerate.hooks.ModelHook): for module_name in get_module_names(pipe): module_instance = getattr(pipe, module_name, None) module_cls = module_instance.__class__.__name__ - if (_id != id(module_instance)) and (module_cls not in self.offload_never) and (not devices.same_device(module_instance.device, devices.cpu)): + if (module_instance is not None) and (_id != id(module_instance)) and (module_cls not in self.offload_never) and (not devices.same_device(module_instance.device, devices.cpu)): apply_balanced_offload_to_module(module_instance, op='pre') self.last_cls = module.__class__.__name__ process_timer.add('offload', time.time() - t0) diff --git a/modules/shared_items.py b/modules/shared_items.py index f4d98e955..f09df5769 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -56,6 +56,7 @@ pipelines = { 'Bria': getattr(diffusers, 'DiffusionPipeline', None), 'hdm': getattr(diffusers, 'DiffusionPipeline', None), 'HunyuanImage': getattr(diffusers, 'DiffusionPipeline', None), + 'X-Omni': getattr(diffusers, 'DiffusionPipeline', None), } diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index bd7bccc87..6e6fcc197 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -57,7 +57,10 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): mtime = datetime.strptime(mtime, '%Y %B') # 2025 January except Exception: _size, mtime = modelstats.stat(preview_file) - path = f'{v.get("path", "")}+{v.get("subfolder", "")}' + if len(v.get("subfolder", "")) > 0: + path = f'{v.get("path", "")}+{v.get("subfolder", "")}' + else: + path = f'{v.get("path", "")}' yield { "type": 'Model', "name": name, diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index 51a17d2ce..55e57647f 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -44,24 +44,29 @@ def load_model(selected: models_def.Model): # transformer try: + def load_dit_folder(dit_folder): + if dit_folder is not None and dit_folder not in kwargs: + # get a new quant arg on every loop to prevent the quant config classes getting entangled + load_args, quant_args = model_quant.get_dit_args({}, module='Model', device_map=True) + shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') + kwargs[dit_folder] = selected.dit_cls.from_pretrained( + pretrained_model_name_or_path=selected.dit or selected.repo, + subfolder=dit_folder, + revision=selected.dit_revision or selected.repo_revision, + cache_dir=shared.opts.hfcache_dir, + **load_args, + **quant_args + ) + else: + shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} skip') + if selected.dit_folder is None: selected.dit_folder = ['transformer'] if isinstance(selected.dit_folder, list) or isinstance(selected.dit_folder, tuple): for dit_folder in selected.dit_folder: # wan a14b has transformer and transformer_2 - if dit_folder is not None and dit_folder not in kwargs: - # get a new quant arg on every loop to prevent the quant config classes getting entangled - load_args, quant_args = model_quant.get_dit_args({}, module='Model', device_map=True) - shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') - kwargs[dit_folder] = selected.dit_cls.from_pretrained( - pretrained_model_name_or_path=selected.dit or selected.repo, - subfolder=dit_folder, - revision=selected.dit_revision or selected.repo_revision, - cache_dir=shared.opts.hfcache_dir, - **load_args, - **quant_args - ) - else: - shared.log.debug(f'Video load: module=transformer repo="{selected.dit or selected.repo}" module="{dit_folder}" folder="{dit_folder}" cls={selected.dit_cls.__name__} skip') + load_dit_folder(dit_folder) + else: + load_dit_folder(selected.dit_folder) except Exception as e: shared.log.error(f'video load: module=transformer cls={selected.dit_cls.__name__} {e}') errors.display(e, 'video') diff --git a/pipelines/model_xomni.py b/pipelines/model_xomni.py new file mode 100644 index 000000000..838a0c0b3 --- /dev/null +++ b/pipelines/model_xomni.py @@ -0,0 +1,113 @@ +import torch +import transformers +import diffusers +from modules import shared, devices, sd_models, model_quant + + +class XOmniPipeline(diffusers.DiffusionPipeline): + def __init__( + self, + tokenizer=None, + model=None, + ): + super().__init__() + self.tokenizer = tokenizer + self.model = model + self.register_modules( + tokenizer=tokenizer, + model=model, + ) + + def load( + self, + repo_id, + load_config: dict = {}, + ): + from pipelines.xomni import modeling_xomni + load_args, quant_args = model_quant.get_dit_args(load_config, module='Model', device_map=True) + shared.log.debug(f'Load model: cls=XOmniPipeline module=tokenizer repo_id="{repo_id}"') + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + repo_id, + use_fast=True, + ) + shared.log.debug(f'Load model: cls=XOmniPipeline module=transformer repo_id="{repo_id}" args={load_args}') + # self.model = transformers.AutoModelForCausalLM.from_pretrained( + self.model = modeling_xomni.XOmniForCausalLM.from_pretrained( + repo_id, + # trust_remote_code=True, + cache_dir=shared.opts.hfcache_dir, + **load_args, + **quant_args, + ) + flux_repo_id = "black-forest-labs/FLUX.1-dev" + shared.log.debug(f'Load model: cls=XOmniPipeline module=vision repo_id="{flux_repo_id}"') + self.model.init_vision( + flux_repo_id, + **quant_args, + ) + self.model.set_generation_mode('image') + + def __call__( + self, + prompt: str = "", + width: int = 1024, + height: int = 1024, + seed: int = -1, + temperature: float = 1.0, + downsample_size: int = 16, + min_p: float = 0.03, + top_p: float = 1.0, + cfg_scale: float = 1.0, + ): + + if isinstance(prompt, list): + prompt = prompt[0] + token_h, token_w = height // downsample_size, width // downsample_size + image_prefix = f'{token_h} {token_w}' + generation_config = transformers.generation.GenerationConfig( + max_new_tokens=token_h * token_w, + do_sample=True, + temperature=temperature, + min_p=min_p, + top_p=top_p, + guidance_scale=cfg_scale, + suppress_tokens=self.tokenizer.convert_tokens_to_ids(self.model.config.mm_special_tokens), + ) + + # Sample inputs: + tokens = self.tokenizer( + [prompt + image_prefix], + return_tensors='pt', + padding='longest', + padding_side='left', + ) + input_ids = tokens.input_ids.to(devices.device) + attention_mask = tokens.attention_mask.to(devices.device) + negative_ids = self.tokenizer.encode( + image_prefix, + add_special_tokens=False, + return_tensors='pt', + ).to(devices.device).expand(1, -1) + + torch.manual_seed(seed) + tokens = self.model.generate( + inputs=input_ids, + attention_mask=attention_mask, + generation_config=generation_config, + negative_prompt_ids=negative_ids, + ) + + tokens = torch.nn.functional.pad(tokens, (0, 1), value=self.tokenizer.convert_tokens_to_ids('')) + torch.manual_seed(seed) + _, images = self.model.mmdecode(self.tokenizer, tokens[0], skip_special_tokens=False) + images[0].save('/tmp/xomni_out.png') + return images + + +def load_xomni(checkpoint_info, diffusers_load_config={}): + repo_id = sd_models.path_to_repo(checkpoint_info) + sd_models.hf_auth_check(checkpoint_info) + + pipe = XOmniPipeline() + pipe.load(repo_id, load_config=diffusers_load_config) + return pipe diff --git a/pipelines/xomni/__init__.py b/pipelines/xomni/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pipelines/xomni/configuration_xomni.py b/pipelines/xomni/configuration_xomni.py new file mode 100644 index 000000000..dc22747f7 --- /dev/null +++ b/pipelines/xomni/configuration_xomni.py @@ -0,0 +1,25 @@ +from transformers import AutoConfig, Qwen2Config +from typing import Tuple + + +class XOmniConfig(Qwen2Config): + model_type = "x-omni" + + def __init__( + self, + num_mm_adap_layers: int = 4, + num_mm_head_layers: int = 4, + mm_vocab_size: int = 16448, + image_vocab_size: int = 16384, + mm_special_tokens: Tuple[str] = ('', '', ''), + **kwargs, + ): + super().__init__(**kwargs) + self.num_mm_adap_layers = num_mm_adap_layers + self.num_mm_head_layers = num_mm_head_layers + self.mm_vocab_size = mm_vocab_size + self.image_vocab_size = image_vocab_size + self.mm_special_tokens = mm_special_tokens + + +AutoConfig.register("x-omni", XOmniConfig) diff --git a/pipelines/xomni/modeling_siglip_flux.py b/pipelines/xomni/modeling_siglip_flux.py new file mode 100644 index 000000000..8db60374a --- /dev/null +++ b/pipelines/xomni/modeling_siglip_flux.py @@ -0,0 +1,841 @@ +import torch +import numpy as np + +from typing import Any, Callable, Dict, Tuple, List, Optional, Union +from diffusers import FluxTransformer2DModel +from diffusers.configuration_utils import register_to_config +from diffusers.utils import logging, USE_PEFT_BACKEND, scale_lora_layers, unscale_lora_layers +from diffusers.models.modeling_outputs import Transformer2DModelOutput +from diffusers.pipelines.flux.pipeline_flux import FluxPipeline, calculate_shift, retrieve_timesteps +from diffusers.image_processor import PipelineImageInput +from diffusers.pipelines.flux.pipeline_output import FluxPipelineOutput + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +def drop_token(x, drop_prob: float = 0., training: bool = False, scale_by_keep: bool = True): + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0], x.shape[1], 1) + random_tensor = x.new_empty(shape).bernoulli_(keep_prob) + if keep_prob > 0.0 and scale_by_keep: + random_tensor.div_(keep_prob) + return x * random_tensor + + +class FluxTransformer2DModelWithSigLIP(FluxTransformer2DModel): + @register_to_config + def __init__( + self, + patch_size: int = 1, + in_channels: int = 64, + out_channels: Optional[int] = None, + num_layers: int = 19, + num_single_layers: int = 38, + attention_head_dim: int = 128, + num_attention_heads: int = 24, + joint_attention_dim: int = 4096, + pooled_projection_dim: int = 768, + guidance_embeds: bool = False, + axes_dims_rope: Tuple[int] = (16, 56, 56), + siglip_channels: Optional[int] = None, + drop_token_prob: float = 0., + ): + super().__init__( + patch_size=patch_size, + in_channels=in_channels, + out_channels=out_channels, + num_layers=num_layers, + num_single_layers=num_single_layers, + attention_head_dim=attention_head_dim, + num_attention_heads=num_attention_heads, + joint_attention_dim=joint_attention_dim, + pooled_projection_dim=pooled_projection_dim, + guidance_embeds=guidance_embeds, + axes_dims_rope=axes_dims_rope, + ) + self.drop_token_prob = drop_token_prob + if siglip_channels is not None: + self.init_siglip_embed(siglip_channels) + + def init_siglip_embed(self, siglip_channels): + self.siglip_embed = torch.nn.Linear(siglip_channels, self.inner_dim, bias=False) + torch.nn.init.zeros_(self.siglip_embed.weight) + + def forward( + self, + hidden_states: torch.Tensor, + encoder_hidden_states: torch.Tensor = None, + pooled_projections: torch.Tensor = None, + timestep: torch.LongTensor = None, + img_ids: torch.Tensor = None, + txt_ids: torch.Tensor = None, + guidance: torch.Tensor = None, + siglip_tensor: Optional[torch.Tensor] = None, + joint_attention_kwargs: Optional[Dict[str, Any]] = None, + controlnet_block_samples=None, + controlnet_single_block_samples=None, + return_dict: bool = True, + controlnet_blocks_repeat: bool = False, + ) -> Union[torch.Tensor, Transformer2DModelOutput]: + """ + The [`FluxTransformer2DModel`] forward method. + + Args: + hidden_states (`torch.Tensor` of shape `(batch_size, image_sequence_length, in_channels)`): + Input `hidden_states`. + encoder_hidden_states (`torch.Tensor` of shape `(batch_size, text_sequence_length, joint_attention_dim)`): + Conditional embeddings (embeddings computed from the input conditions such as prompts) to use. + pooled_projections (`torch.Tensor` of shape `(batch_size, projection_dim)`): Embeddings projected + from the embeddings of input conditions. + timestep ( `torch.LongTensor`): + Used to indicate denoising step. + block_controlnet_hidden_states: (`list` of `torch.Tensor`): + A list of tensors that if specified are added to the residuals of transformer blocks. + joint_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.transformer_2d.Transformer2DModelOutput`] instead of a plain + tuple. + + Returns: + If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a + `tuple` where the first element is the sample tensor. + """ + if joint_attention_kwargs is not None: + joint_attention_kwargs = joint_attention_kwargs.copy() + lora_scale = joint_attention_kwargs.pop("scale", 1.0) + else: + lora_scale = 1.0 + + if USE_PEFT_BACKEND: + # weight the lora layers by setting `lora_scale` for each PEFT layer + scale_lora_layers(self, lora_scale) + else: + if joint_attention_kwargs is not None and joint_attention_kwargs.get("scale", None) is not None: + logger.warning( + "Passing `scale` via `joint_attention_kwargs` when not using the PEFT backend is ineffective." + ) + + hidden_states = self.x_embedder(hidden_states) + + timestep = timestep.to(hidden_states.dtype) * 1000 + if guidance is not None: + guidance = guidance.to(hidden_states.dtype) * 1000 + else: + guidance = None + + temb = ( + self.time_text_embed(timestep, pooled_projections) + if guidance is None + else self.time_text_embed(timestep, guidance, pooled_projections) + ) + encoder_hidden_states = self.context_embedder(encoder_hidden_states) + + if txt_ids.ndim == 3: + logger.warning( + "Passing `txt_ids` 3d torch.Tensor is deprecated." + "Please remove the batch dimension and pass it as a 2d torch Tensor" + ) + txt_ids = txt_ids[0] + if img_ids.ndim == 3: + logger.warning( + "Passing `img_ids` 3d torch.Tensor is deprecated." + "Please remove the batch dimension and pass it as a 2d torch Tensor" + ) + img_ids = img_ids[0] + + ids = torch.cat((txt_ids, img_ids), dim=0) + image_rotary_emb = self.pos_embed(ids) + + if joint_attention_kwargs is not None and "ip_adapter_image_embeds" in joint_attention_kwargs: + ip_adapter_image_embeds = joint_attention_kwargs.pop("ip_adapter_image_embeds") + ip_hidden_states = self.encoder_hid_proj(ip_adapter_image_embeds) + joint_attention_kwargs.update({"ip_hidden_states": ip_hidden_states}) + + for index_block, block in enumerate(self.transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + encoder_hidden_states, hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + encoder_hidden_states, + temb, + image_rotary_emb, + ) + + else: + encoder_hidden_states, hidden_states = block( + hidden_states=hidden_states, + encoder_hidden_states=encoder_hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_block_samples is not None: + interval_control = len(self.transformer_blocks) / len(controlnet_block_samples) + interval_control = int(np.ceil(interval_control)) + # For Xlabs ControlNet. + if controlnet_blocks_repeat: + hidden_states = ( + hidden_states + controlnet_block_samples[index_block % len(controlnet_block_samples)] + ) + else: + hidden_states = hidden_states + controlnet_block_samples[index_block // interval_control] + + if siglip_tensor is not None: + siglip_tensor = drop_token(siglip_tensor, self.drop_token_prob, training=self.training) + hidden_states = hidden_states + self.siglip_embed(siglip_tensor) + + hidden_states = torch.cat([encoder_hidden_states, hidden_states], dim=1) + + for index_block, block in enumerate(self.single_transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + temb, + image_rotary_emb, + ) + + else: + hidden_states = block( + hidden_states=hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_single_block_samples is not None: + interval_control = len(self.single_transformer_blocks) / len(controlnet_single_block_samples) + interval_control = int(np.ceil(interval_control)) + hidden_states[:, encoder_hidden_states.shape[1]:, ...] = ( + hidden_states[:, encoder_hidden_states.shape[1]:, ...] + + controlnet_single_block_samples[index_block // interval_control] + ) + + hidden_states = hidden_states[:, encoder_hidden_states.shape[1]:, ...] + + hidden_states = self.norm_out(hidden_states, temb) + output = self.proj_out(hidden_states) + + if USE_PEFT_BACKEND: + # remove `lora_scale` from each PEFT layer + unscale_lora_layers(self, lora_scale) + + if not return_dict: + return (output,) + + return Transformer2DModelOutput(sample=output) + + +def teacache_forward( + self, + hidden_states: torch.Tensor, + encoder_hidden_states: torch.Tensor = None, + pooled_projections: torch.Tensor = None, + timestep: torch.LongTensor = None, + img_ids: torch.Tensor = None, + txt_ids: torch.Tensor = None, + guidance: torch.Tensor = None, + joint_attention_kwargs: Optional[Dict[str, Any]] = None, + controlnet_block_samples=None, + controlnet_single_block_samples=None, + return_dict: bool = True, + controlnet_blocks_repeat: bool = False, + siglip_tensor: Optional[torch.Tensor] = None, +) -> Union[torch.FloatTensor, Transformer2DModelOutput]: + """ + The [`FluxTransformer2DModel`] forward method. + + Args: + hidden_states (`torch.FloatTensor` of shape `(batch size, channel, height, width)`): + Input `hidden_states`. + encoder_hidden_states (`torch.FloatTensor` of shape `(batch size, sequence_len, embed_dims)`): + Conditional embeddings (embeddings computed from the input conditions such as prompts) to use. + pooled_projections (`torch.FloatTensor` of shape `(batch_size, projection_dim)`): Embeddings projected + from the embeddings of input conditions. + timestep ( `torch.LongTensor`): + Used to indicate denoising step. + block_controlnet_hidden_states: (`list` of `torch.Tensor`): + A list of tensors that if specified are added to the residuals of transformer blocks. + joint_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.transformer_2d.Transformer2DModelOutput`] instead of a plain + tuple. + + Returns: + If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a + `tuple` where the first element is the sample tensor. + """ + if joint_attention_kwargs is not None: + joint_attention_kwargs = joint_attention_kwargs.copy() + lora_scale = joint_attention_kwargs.pop("scale", 1.0) + else: + lora_scale = 1.0 + + if USE_PEFT_BACKEND: + # weight the lora layers by setting `lora_scale` for each PEFT layer + scale_lora_layers(self, lora_scale) + else: + if joint_attention_kwargs is not None and joint_attention_kwargs.get("scale", None) is not None: + logger.warning( + "Passing `scale` via `joint_attention_kwargs` when not using the PEFT backend is ineffective." + ) + + batch_size, seq_len, channels = hidden_states.shape + device, dtype = hidden_states.device, hidden_states.dtype + hidden_states = self.x_embedder(hidden_states) + + timestep = timestep.to(hidden_states.dtype) * 1000 + if guidance is not None: + guidance = guidance.to(hidden_states.dtype) * 1000 + else: + guidance = None + + temb = ( + self.time_text_embed(timestep, pooled_projections) + if guidance is None + else self.time_text_embed(timestep, guidance, pooled_projections) + ) + encoder_hidden_states = self.context_embedder(encoder_hidden_states) + + if txt_ids.ndim == 3: + logger.warning( + "Passing `txt_ids` 3d torch.Tensor is deprecated." + "Please remove the batch dimension and pass it as a 2d torch Tensor" + ) + txt_ids = txt_ids[0] + if img_ids.ndim == 3: + logger.warning( + "Passing `img_ids` 3d torch.Tensor is deprecated." + "Please remove the batch dimension and pass it as a 2d torch Tensor" + ) + img_ids = img_ids[0] + + ids = torch.cat((txt_ids, img_ids), dim=0) + image_rotary_emb = self.pos_embed(ids) + + if joint_attention_kwargs is not None and "ip_adapter_image_embeds" in joint_attention_kwargs: + ip_adapter_image_embeds = joint_attention_kwargs.pop("ip_adapter_image_embeds") + ip_hidden_states = self.encoder_hid_proj(ip_adapter_image_embeds) + joint_attention_kwargs.update({"ip_hidden_states": ip_hidden_states}) + + if self.enable_teacache: + inp = hidden_states.clone() + temb_ = temb.clone() + modulated_inp, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.transformer_blocks[0].norm1(inp, emb=temb_) + if self.cnt == 0 or self.cnt == self.num_steps - 1: + should_calc = True + self.accumulated_rel_l1_distance = 0 + else: + coefficients = [4.98651651e+02, -2.83781631e+02, 5.58554382e+01, -3.82021401e+00, 2.64230861e-01] + rescale_func = np.poly1d(coefficients) + # rescale_func = Polynomial(coefficients.reverse()) + self.accumulated_rel_l1_distance += rescale_func(((modulated_inp - self.previous_modulated_input).abs().mean() / self.previous_modulated_input.abs().mean()).cpu().item()) + if self.accumulated_rel_l1_distance < self.rel_l1_thresh: + should_calc = False + else: + should_calc = True + self.accumulated_rel_l1_distance = 0 + self.previous_modulated_input = modulated_inp + self.cnt += 1 + if self.cnt == self.num_steps: + self.cnt = 0 + + if self.enable_teacache: + if not should_calc: + hidden_states += self.previous_residual + else: + ori_hidden_states = hidden_states.clone() + for index_block, block in enumerate(self.transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + encoder_hidden_states, hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + encoder_hidden_states, + temb, + image_rotary_emb, + ) + + else: + encoder_hidden_states, hidden_states = block( + hidden_states=hidden_states, + encoder_hidden_states=encoder_hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_block_samples is not None: + interval_control = len(self.transformer_blocks) / len(controlnet_block_samples) + interval_control = int(np.ceil(interval_control)) + # For Xlabs ControlNet. + if controlnet_blocks_repeat: + hidden_states = ( + hidden_states + controlnet_block_samples[index_block % len(controlnet_block_samples)] + ) + else: + hidden_states = hidden_states + controlnet_block_samples[index_block // interval_control] + + if siglip_tensor is not None: + siglip_tensor = drop_token(siglip_tensor, self.drop_token_prob, training=self.training) + hidden_states = hidden_states + self.siglip_embed(siglip_tensor) + hidden_states = torch.cat([encoder_hidden_states, hidden_states], dim=1) + + for index_block, block in enumerate(self.single_transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + temb, + image_rotary_emb, + ) + + else: + hidden_states = block( + hidden_states=hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_single_block_samples is not None: + interval_control = len(self.single_transformer_blocks) / len(controlnet_single_block_samples) + interval_control = int(np.ceil(interval_control)) + hidden_states[:, encoder_hidden_states.shape[1]:, ...] = ( + hidden_states[:, encoder_hidden_states.shape[1]:, ...] + + controlnet_single_block_samples[index_block // interval_control] + ) + + hidden_states = hidden_states[:, encoder_hidden_states.shape[1]:, ...] + self.previous_residual = hidden_states - ori_hidden_states + else: + for index_block, block in enumerate(self.transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + encoder_hidden_states, hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + encoder_hidden_states, + temb, + image_rotary_emb, + ) + else: + encoder_hidden_states, hidden_states = block( + hidden_states=hidden_states, + encoder_hidden_states=encoder_hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_block_samples is not None: + interval_control = len(self.transformer_blocks) / len(controlnet_block_samples) + interval_control = int(np.ceil(interval_control)) + # For Xlabs ControlNet. + if controlnet_blocks_repeat: + hidden_states = ( + hidden_states + controlnet_block_samples[index_block % len(controlnet_block_samples)] + ) + else: + hidden_states = hidden_states + controlnet_block_samples[index_block // interval_control] + if siglip_tensor is not None: + siglip_tensor = drop_token(siglip_tensor, self.drop_token_prob, training=self.training) + hidden_states = hidden_states + self.siglip_embed(siglip_tensor) + hidden_states = torch.cat([encoder_hidden_states, hidden_states], dim=1) + + for index_block, block in enumerate(self.single_transformer_blocks): + if torch.is_grad_enabled() and self.gradient_checkpointing: + hidden_states = self._gradient_checkpointing_func( + block, + hidden_states, + temb, + image_rotary_emb, + ) + + else: + hidden_states = block( + hidden_states=hidden_states, + temb=temb, + image_rotary_emb=image_rotary_emb, + joint_attention_kwargs=joint_attention_kwargs, + ) + + # controlnet residual + if controlnet_single_block_samples is not None: + interval_control = len(self.single_transformer_blocks) / len(controlnet_single_block_samples) + interval_control = int(np.ceil(interval_control)) + hidden_states[:, encoder_hidden_states.shape[1]:, ...] = ( + hidden_states[:, encoder_hidden_states.shape[1]:, ...] + + controlnet_single_block_samples[index_block // interval_control] + ) + + hidden_states = hidden_states[:, encoder_hidden_states.shape[1]:, ...] + + hidden_states = self.norm_out(hidden_states, temb) + output = self.proj_out(hidden_states) + + if USE_PEFT_BACKEND: + # remove `lora_scale` from each PEFT layer + unscale_lora_layers(self, lora_scale) + + if not return_dict: + return (output,) + + return Transformer2DModelOutput(sample=output) + + +class FluxPipelineWithSigLIP(FluxPipeline): + + @torch.no_grad() + def __call__( + self, + siglip_tensor: torch.Tensor, + prompt: Union[str, List[str]] = None, + prompt_2: Optional[Union[str, List[str]]] = None, + negative_prompt: Union[str, List[str]] = None, + negative_prompt_2: Optional[Union[str, List[str]]] = None, + true_cfg_scale: float = 1.0, + true_cfg_scale_2: float = 1.0, + height: Optional[int] = None, + width: Optional[int] = None, + num_inference_steps: int = 28, + sigmas: Optional[List[float]] = None, + guidance_scale: float = 3.5, + num_images_per_prompt: Optional[int] = 1, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + latents: Optional[torch.FloatTensor] = None, + prompt_embeds: Optional[torch.FloatTensor] = None, + pooled_prompt_embeds: Optional[torch.FloatTensor] = None, + ip_adapter_image: Optional[PipelineImageInput] = None, + ip_adapter_image_embeds: Optional[List[torch.Tensor]] = None, + negative_ip_adapter_image: Optional[PipelineImageInput] = None, + negative_ip_adapter_image_embeds: Optional[List[torch.Tensor]] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + negative_pooled_prompt_embeds: Optional[torch.FloatTensor] = None, + output_type: Optional[str] = "pil", + return_dict: bool = True, + joint_attention_kwargs: Optional[Dict[str, Any]] = None, + callback_on_step_end: Optional[Callable[[int, int, Dict], None]] = None, + callback_on_step_end_tensor_inputs: List[str] = ["latents"], + max_sequence_length: int = 512, + ): + r""" + Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. + instead. + prompt_2 (`str` or `List[str]`, *optional*): + The prompt or prompts to be sent to `tokenizer_2` and `text_encoder_2`. If not defined, `prompt` is + will be used instead. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `true_cfg_scale` is + not greater than `1`). + negative_prompt_2 (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation to be sent to `tokenizer_2` and + `text_encoder_2`. If not defined, `negative_prompt` is used in all the text-encoders. + true_cfg_scale (`float`, *optional*, defaults to 1.0): + When > 1.0 and a provided `negative_prompt`, enables true classifier-free guidance. + height (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): + The height in pixels of the generated image. This is set to 1024 by default for the best results. + width (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): + The width in pixels of the generated image. This is set to 1024 by default for the best results. + num_inference_steps (`int`, *optional*, defaults to 50): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + sigmas (`List[float]`, *optional*): + Custom sigmas to use for the denoising process with schedulers which support a `sigmas` argument in + their `set_timesteps` method. If not defined, the default behavior when `num_inference_steps` is passed + will be used. + guidance_scale (`float`, *optional*, defaults to 3.5): + Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). + `guidance_scale` is defined as `w` of equation 2. of [Imagen + Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > + 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, + usually at the expense of lower image quality. + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + generator (`torch.Generator` or `List[torch.Generator]`, *optional*): + One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) + to make generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image + generation. Can be used to tweak the same generation with different prompts. If not provided, a latents + tensor will ge generated by sampling using the supplied random `generator`. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + pooled_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated pooled text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. + If not provided, pooled text embeddings will be generated from `prompt` input argument. + ip_adapter_image: (`PipelineImageInput`, *optional*): Optional image input to work with IP Adapters. + ip_adapter_image_embeds (`List[torch.Tensor]`, *optional*): + Pre-generated image embeddings for IP-Adapter. It should be a list of length same as number of + IP-adapters. Each element should be a tensor of shape `(batch_size, num_images, emb_dim)`. If not + provided, embeddings are computed from the `ip_adapter_image` input argument. + negative_ip_adapter_image: + (`PipelineImageInput`, *optional*): Optional image input to work with IP Adapters. + negative_ip_adapter_image_embeds (`List[torch.Tensor]`, *optional*): + Pre-generated image embeddings for IP-Adapter. It should be a list of length same as number of + IP-adapters. Each element should be a tensor of shape `(batch_size, num_images, emb_dim)`. If not + provided, embeddings are computed from the `ip_adapter_image` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + negative_pooled_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative pooled text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, pooled negative_prompt_embeds will be generated from `negative_prompt` + input argument. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generate image. Choose between + [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.flux.FluxPipelineOutput`] instead of a plain tuple. + joint_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + callback_on_step_end (`Callable`, *optional*): + A function that calls at the end of each denoising steps during the inference. The function is called + with the following arguments: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, + callback_kwargs: Dict)`. `callback_kwargs` will include a list of all tensors as specified by + `callback_on_step_end_tensor_inputs`. + callback_on_step_end_tensor_inputs (`List`, *optional*): + The list of tensor inputs for the `callback_on_step_end` function. The tensors specified in the list + will be passed as `callback_kwargs` argument. You will only be able to include variables listed in the + `._callback_tensor_inputs` attribute of your pipeline class. + max_sequence_length (`int` defaults to 512): Maximum sequence length to use with the `prompt`. + + Examples: + + Returns: + [`~pipelines.flux.FluxPipelineOutput`] or `tuple`: [`~pipelines.flux.FluxPipelineOutput`] if `return_dict` + is True, otherwise a `tuple`. When returning a tuple, the first element is a list with the generated + images. + """ + assert true_cfg_scale == true_cfg_scale_2 + + height = height or self.default_sample_size * self.vae_scale_factor + width = width or self.default_sample_size * self.vae_scale_factor + + # 1. Check inputs. Raise error if not correct + self.check_inputs( + prompt, + prompt_2, + height, + width, + negative_prompt=negative_prompt, + negative_prompt_2=negative_prompt_2, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + pooled_prompt_embeds=pooled_prompt_embeds, + negative_pooled_prompt_embeds=negative_pooled_prompt_embeds, + callback_on_step_end_tensor_inputs=callback_on_step_end_tensor_inputs, + max_sequence_length=max_sequence_length, + ) + + self._guidance_scale = guidance_scale + self._joint_attention_kwargs = joint_attention_kwargs + self._current_timestep = None + self._interrupt = False + + # 2. Define call parameters + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + device = self._execution_device + + lora_scale = ( + self.joint_attention_kwargs.get("scale", None) if self.joint_attention_kwargs is not None else None + ) + has_neg_prompt = negative_prompt is not None or ( + negative_prompt_embeds is not None and negative_pooled_prompt_embeds is not None + ) + do_true_cfg = true_cfg_scale > 1 and has_neg_prompt + ( + prompt_embeds, + pooled_prompt_embeds, + text_ids, + ) = self.encode_prompt( + prompt=prompt, + prompt_2=prompt_2, + prompt_embeds=prompt_embeds, + pooled_prompt_embeds=pooled_prompt_embeds, + device=device, + num_images_per_prompt=num_images_per_prompt, + max_sequence_length=max_sequence_length, + lora_scale=lora_scale, + ) + assert do_true_cfg + ( + negative_prompt_embeds, + negative_pooled_prompt_embeds, + _, + ) = self.encode_prompt( + prompt=negative_prompt, + prompt_2=negative_prompt_2, + prompt_embeds=negative_prompt_embeds, + pooled_prompt_embeds=negative_pooled_prompt_embeds, + device=device, + num_images_per_prompt=num_images_per_prompt, + max_sequence_length=max_sequence_length, + lora_scale=lora_scale, + ) + + # 4. Prepare latent variables + num_channels_latents = self.transformer.config.in_channels // 4 + latents, latent_image_ids = self.prepare_latents( + batch_size * num_images_per_prompt, + num_channels_latents, + height, + width, + prompt_embeds.dtype, + device, + generator, + latents, + ) + + # 5. Prepare timesteps + sigmas = np.linspace(1.0, 1 / num_inference_steps, num_inference_steps) if sigmas is None else sigmas + image_seq_len = latents.shape[1] + mu = calculate_shift( + image_seq_len, + self.scheduler.config.get("base_image_seq_len", 256), + self.scheduler.config.get("max_image_seq_len", 4096), + self.scheduler.config.get("base_shift", 0.5), + self.scheduler.config.get("max_shift", 1.15), + ) + timesteps, num_inference_steps = retrieve_timesteps( + self.scheduler, + num_inference_steps, + device, + sigmas=sigmas, + mu=mu, + ) + num_warmup_steps = max(len(timesteps) - num_inference_steps * self.scheduler.order, 0) + self._num_timesteps = len(timesteps) + + # handle guidance + if self.transformer.config.guidance_embeds: + guidance = torch.full([1], guidance_scale, device=device, dtype=torch.float32) + guidance = guidance.expand(latents.shape[0] * 2) + else: + guidance = None + + if (ip_adapter_image is not None or ip_adapter_image_embeds is not None) and ( + negative_ip_adapter_image is None and negative_ip_adapter_image_embeds is None + ): + negative_ip_adapter_image = np.zeros((width, height, 3), dtype=np.uint8) + negative_ip_adapter_image = [negative_ip_adapter_image] * self.transformer.encoder_hid_proj.num_ip_adapters + + elif (ip_adapter_image is None and ip_adapter_image_embeds is None) and ( + negative_ip_adapter_image is not None or negative_ip_adapter_image_embeds is not None + ): + ip_adapter_image = np.zeros((width, height, 3), dtype=np.uint8) + ip_adapter_image = [ip_adapter_image] * self.transformer.encoder_hid_proj.num_ip_adapters + + if self.joint_attention_kwargs is None: + self._joint_attention_kwargs = {} + + image_embeds = None + negative_image_embeds = None + if ip_adapter_image is not None or ip_adapter_image_embeds is not None: + image_embeds = self.prepare_ip_adapter_image_embeds( + ip_adapter_image, + ip_adapter_image_embeds, + device, + batch_size * num_images_per_prompt, + ) + if negative_ip_adapter_image is not None or negative_ip_adapter_image_embeds is not None: + negative_image_embeds = self.prepare_ip_adapter_image_embeds( + negative_ip_adapter_image, + negative_ip_adapter_image_embeds, + device, + batch_size * num_images_per_prompt, + ) + + # 6. Denoising loop + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + if self.interrupt: + continue + + self._current_timestep = t + if image_embeds is not None: + self._joint_attention_kwargs["ip_adapter_image_embeds"] = image_embeds + # broadcast to batch dimension in a way that's compatible with ONNX/Core ML + timestep = t.expand(latents.shape[0] * 2).to(latents.dtype) + + batch_noise_pred = self.transformer( + hidden_states=torch.cat([latents, latents], dim=0), + timestep=timestep / 1000, + guidance=guidance, + pooled_projections=torch.cat([pooled_prompt_embeds, negative_pooled_prompt_embeds.expand_as(pooled_prompt_embeds)], dim=0), + encoder_hidden_states=torch.cat([prompt_embeds, negative_prompt_embeds.expand_as(prompt_embeds)], dim=0), + txt_ids=text_ids, + img_ids=latent_image_ids, + joint_attention_kwargs=self.joint_attention_kwargs, + siglip_tensor=torch.cat([siglip_tensor, torch.zeros_like(siglip_tensor)], dim=0), + return_dict=False, + )[0] + noise_pred, neg_noise_pred = batch_noise_pred.chunk(2) + noise_pred = neg_noise_pred + true_cfg_scale * (noise_pred - neg_noise_pred) + + # compute the previous noisy sample x_t -> x_t-1 + latents_dtype = latents.dtype + latents = self.scheduler.step(noise_pred, t, latents, return_dict=False)[0] + + if latents.dtype != latents_dtype: + if torch.backends.mps.is_available(): + # some platforms (eg. apple mps) misbehave due to a pytorch bug: https://github.com/pytorch/pytorch/pull/99272 + latents = latents.to(latents_dtype) + + if callback_on_step_end is not None: + callback_kwargs = {} + for k in callback_on_step_end_tensor_inputs: + callback_kwargs[k] = locals()[k] + callback_outputs = callback_on_step_end(self, i, t, callback_kwargs) + + latents = callback_outputs.pop("latents", latents) + prompt_embeds = callback_outputs.pop("prompt_embeds", prompt_embeds) + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + + self._current_timestep = None + + if output_type == "latent": + image = latents + else: + latents = self._unpack_latents(latents, height, width, self.vae_scale_factor) + latents = (latents / self.vae.config.scaling_factor) + self.vae.config.shift_factor + image = self.vae.decode(latents, return_dict=False)[0] + image = self.image_processor.postprocess(image, output_type=output_type) + + # Offload all models + self.maybe_free_model_hooks() + + if not return_dict: + return (image,) + + return FluxPipelineOutput(images=image) diff --git a/pipelines/xomni/modeling_siglip_tokenizer.py b/pipelines/xomni/modeling_siglip_tokenizer.py new file mode 100644 index 000000000..26e67571d --- /dev/null +++ b/pipelines/xomni/modeling_siglip_tokenizer.py @@ -0,0 +1,231 @@ + + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import einsum +from torchvision import transforms + +from PIL import Image +from einops import rearrange + +from .modeling_vit import create_siglip_vit + + +def create_anyres_preprocess( + short_size=384, + long_size=1152, + patch_size=16, + random_ratio=None, + min_short_size=128, + max_aspect_ratio=3., + filtering=True +): + + def resize_and_filtering(pil_image): + pil_image = pil_image.convert('RGB') + width, height = pil_image.size + ss, ls = min(width, height), max(width, height) + aspect_ratio = ls / ss + if filtering and (ss < min_short_size or aspect_ratio > max_aspect_ratio): + return None + target_width, target_height = width, height + if random_ratio is not None: + log_ratio = torch.log(torch.tensor(random_ratio)) + sqrt_ratio = torch.exp(0.5 * torch.empty(1).uniform_(log_ratio[0], log_ratio[1])).item() + target_width = int(round(target_width * sqrt_ratio)) + target_height = int(round(target_height / sqrt_ratio)) + + ss = min(target_width, target_height) + if ss < short_size: + target_width = target_width * (short_size / ss) + target_height = target_height * (short_size / ss) + + ls = max(target_width, target_height) + if ls > long_size: + target_width = target_width * (long_size / ls) + target_height = target_height * (long_size / ls) + + target_width = int(round(target_width / patch_size)) * patch_size + target_height = int(round(target_height / patch_size)) * patch_size + pil_image = pil_image.resize((target_width, target_height), resample=Image.BICUBIC) + + to_tensor = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]), + ]) + return to_tensor(pil_image) + + transform = transforms.Lambda(resize_and_filtering) + return transform + + +class IBQ(nn.Module): + def __init__(self, n_e, e_dim, skip_quantization_prob=0.0, quantization_temp=2.0, beta=0.25, sane_index_shape=False, l2_norm=True): + super().__init__() + self.n_e = n_e + self.e_dim = e_dim + self.quantization_temp = quantization_temp + self.skip_quantization_prob = skip_quantization_prob + self.beta = beta + self.sane_index_shape = sane_index_shape + self.l2_norm = l2_norm + + self.embedding = nn.Embedding(self.n_e, self.e_dim) + self.embedding.weight.data.uniform_(-1.0 / self.n_e, 1.0 / self.n_e) + if self.l2_norm: + self.embedding.weight.data = F.normalize(self.embedding.weight.data, p=2, dim=-1) + + def forward(self, z, temp=None, rescale_logits=False, return_logits=False, **kwargs): + assert temp is None or temp == 1.0, "Only for interface compatible with Gumbel" + assert rescale_logits == False, "Only for interface compatible with Gumbel" + assert return_logits == False, "Only for interface compatible with Gumbel" + # reshape z -> (batch, height, width, channel) and flatten + z = rearrange(z, 'b c h w -> b h w c').contiguous() + assert z.shape[-1] == self.e_dim + z_flattened = z.view(-1, self.e_dim) + # distances from z to embeddings e_j (z - e)^2 = z^2 + e^2 - 2 e * z + + if self.l2_norm: + z = F.normalize(z, p=2, dim=-1) + z_flattened = F.normalize(z_flattened, p=2, dim=-1) + embedding = F.normalize(self.embedding.weight, p=2, dim=-1) + else: + embedding = self.embedding.weight + + d = torch.sum(z_flattened ** 2, dim=1, keepdim=True) + \ + torch.sum(embedding**2, dim=1) - 2 * \ + torch.einsum('bd,dn->bn', z_flattened, torch.einsum('n d -> d n', embedding)) + + if self.training: + logits = -d / self.quantization_temp + soft_one_hot = F.softmax(logits, dim=1) + min_encoding_indices = soft_one_hot.max(1, keepdim=True)[1] + hard_one_hot = torch.zeros_like(logits, memory_format=torch.legacy_contiguous_format).scatter_(1, min_encoding_indices, 1.0) + one_hot = hard_one_hot - soft_one_hot.detach() + soft_one_hot + + z_q = einsum('b n, n d -> b d', one_hot, self.embedding.weight).view(z.shape) + z_q_2 = einsum('b n, n d -> b d', hard_one_hot, self.embedding.weight).view(z.shape) + + # compute loss for embedding + commit_loss = torch.mean((z_q - z) ** 2) + torch.mean((z_q_2.detach() - z) ** 2) + self.beta * \ + torch.mean((z_q_2 - z.detach()) ** 2) + else: + min_encoding_indices = torch.argmin(d, dim=1) + z_q = embedding[min_encoding_indices].view(z.shape) + commit_loss = None + + if self.training and self.skip_quantization_prob > 0.0: + z_q = torch.where( + torch.rand_like(z_q[:, 0:1, 0:1, 0:1]).expand_as(z_q) <= self.skip_quantization_prob, + z, z_q, + ) + + # reshape back to match original input shape + z_q = rearrange(z_q, 'b h w c -> b c h w').contiguous() + + if self.sane_index_shape: + min_encoding_indices = min_encoding_indices.reshape(z_q.shape[0], z_q.shape[2], z_q.shape[3]) + + return (z_q, None, min_encoding_indices), commit_loss + + def get_codebook_entry(self, indices, bhwc): + # shape specifying (batch, height, width, channel) + # get quantized latent vectors + z_q = self.embedding(indices) + + if bhwc is not None: + z_q = z_q.view(bhwc) + # reshape back to match original input shape + z_q = z_q.permute(0, 3, 1, 2).contiguous() + + return z_q + + +class ResidualBlock(nn.Module): + def __init__(self, channels, num_groups=32): + super().__init__() + self.conv1 = nn.Conv2d(channels, channels, 3, padding='same') + self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=channels) + self.activate = nn.GELU() + self.conv2 = nn.Conv2d(channels, channels, 3, padding='same') + self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=channels) + + def forward(self, x): + res = x + x = self.norm1(x) + x = self.activate(x) + x = self.conv1(x) + x = self.norm2(x) + x = self.activate(x) + x = self.conv2(x) + return x + res + + +class VQConvProjector(nn.Module): + def __init__( + self, + z_channels=1536, + codebook_size=16384, + codebook_dim=2048, + conv_layers=2, + with_norm=True, + skip_quant_prob=0.1, + ): + super().__init__() + self.quant_conv = nn.Conv2d(z_channels, codebook_dim, 1) + self.quantize = IBQ(codebook_size, codebook_dim, skip_quant_prob, sane_index_shape=True) + self.post_quant_conv = nn.Conv2d(codebook_dim, z_channels, 1) + block = ResidualBlock + self.post_conv = nn.Sequential(*[block(z_channels) for _ in range(conv_layers)]) + + def forward(self, x, h, w): + x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) + z = self.quant_conv(x) + (z_q, _, _), codebook_loss = self.quantize(z) + z = self.post_quant_conv(z_q) + z = self.post_conv(z) + z = rearrange(z, 'b c h w -> b (h w) c') + return z, codebook_loss + + def encode(self, x, h, w): + x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) + z = self.quant_conv(x) + (_, _, tokens), _ = self.quantize(z) + return tokens + + def decode(self, tokens, bhwc): + z_q = self.quantize.get_codebook_entry(tokens, bhwc) + z = self.post_quant_conv(z_q) + z = self.post_conv(z) + return z + + +class SiglipTokenizer(nn.Module): + def __init__( + self, + siglip_name, + siglip_path, + projector_path, + z_channels=1536, + codebook_size=16384, + codebook_dim=2048, + with_norm=True + ): + super().__init__() + self.vit = create_siglip_vit(model_name=siglip_name, path=siglip_path) + self.vqproj = VQConvProjector( + z_channels=z_channels, + codebook_size=codebook_size, + codebook_dim=codebook_dim, + with_norm=with_norm + ) + self.vqproj.load_state_dict(torch.load(projector_path, map_location='cpu'), strict=True) + + def encode(self, x): + features, (h, w), _ = self.vit(x) + tokens = self.vqproj.encode(features, h, w) + return tokens + + def decode(self, tokens, bhwc): + return self.vqproj.decode(tokens, bhwc) diff --git a/pipelines/xomni/modeling_vit.py b/pipelines/xomni/modeling_vit.py new file mode 100644 index 000000000..722851a41 --- /dev/null +++ b/pipelines/xomni/modeling_vit.py @@ -0,0 +1,699 @@ +import math +import warnings +from dataclasses import dataclass +from functools import partial +from typing import ( + Callable, Dict, Final, List, Literal, Optional, + Sequence, Set, Tuple, Type, Union, +) + +from torch.utils.checkpoint import checkpoint +import torch +import torch.nn as nn +import torch.nn.functional as F + +from timm.layers import ( + DropPath, LayerType, Mlp, PatchDropout, + PatchEmbed, resample_abs_pos_embed, +) +from timm.models._manipulate import checkpoint_seq, named_apply + +from flash_attn import flash_attn_func, flash_attn_varlen_func + + +def _no_grad_trunc_normal_(tensor, mean, std, a, b): + # Cut & paste from PyTorch official master until it's in a few official releases - RW + # Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf + def norm_cdf(x): + # Computes standard normal cumulative distribution function + return (1.0 + math.erf(x / math.sqrt(2.0))) / 2.0 + + if (mean < a - 2 * std) or (mean > b + 2 * std): + warnings.warn( + "mean is more than 2 std from [a, b] in nn.init.trunc_normal_. " + "The distribution of values may be incorrect.", + stacklevel=2, + ) + + with torch.no_grad(): + # Values are generated by using a truncated uniform distribution and + # then using the inverse CDF for the normal distribution. + # Get upper and lower cdf values + l = norm_cdf((a - mean) / std) # noqa: E741 + u = norm_cdf((b - mean) / std) + + # Uniformly fill tensor with values from [l, u], then translate to + # [2l-1, 2u-1]. + tensor.uniform_(2 * l - 1, 2 * u - 1) + + # Use inverse cdf transform for normal distribution to get truncated + # standard normal + tensor.erfinv_() + + # Transform to proper mean, std + tensor.mul_(std * math.sqrt(2.0)) + tensor.add_(mean) + + # Clamp to ensure it's in the proper range + tensor.clamp_(min=a, max=b) + return tensor + + +def trunc_normal_(tensor, mean=0.0, std=1.0, a=-2.0, b=2.0): + # type: (torch.Tensor, float, float, float, float) -> torch.Tensor + r"""The original timm.models.layers.weight_init.trunc_normal_ can not handle bfloat16 yet, here we first + convert the tensor to float32, apply the trunc_normal_() in float32, and then convert it back to its orignal dtype. + Fills the input Tensor with values drawn from a truncated normal distribution. The values are effectively drawn + from the normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` + with values outside :math:`[a, b]` redrawn until they are within + the bounds. The method used for generating the random values works + best when :math:`a \leq \text{mean} \leq b`. + Args: + tensor: an n-dimensional `torch.Tensor` + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + a: the minimum cutoff value + b: the maximum cutoff value + Examples: + >>> w = torch.empty(3, 5) + >>> nn.init.trunc_normal_(w) + """ + + with torch.no_grad(): + dtype = tensor.dtype + tensor_fp32 = tensor.float() + tensor_fp32 = _no_grad_trunc_normal_(tensor_fp32, mean, std, a, b) + tensor_dtype = tensor_fp32.to(dtype=dtype) + tensor.copy_(tensor_dtype) + + +def init_weights(self): + if self.pos_embed is not None: + trunc_normal_(self.pos_embed, std=self.pos_embed.shape[1] ** -0.5) + trunc_normal_(self.latent, std=self.latent_dim**-0.5) + + +def init_weights_vit_timm(module: nn.Module, name: str = "") -> None: + """ViT weight initialization, original timm impl (for reproducibility)""" + if isinstance(module, nn.Linear): + trunc_normal_(module.weight, std=0.02) + if module.bias is not None: + nn.init.zeros_(module.bias) + elif hasattr(module, "init_weights"): + module.init_weights() + + +class Attention(nn.Module): + fused_attn: Final[bool] + + def __init__( + self, + dim: int, + num_heads: int = 8, + qkv_bias: bool = False, + qk_norm: bool = False, + attn_drop: float = 0.0, + proj_drop: float = 0.0, + norm_layer: nn.Module = nn.LayerNorm, + ) -> None: + super().__init__() + assert dim % num_heads == 0, "dim should be divisible by num_heads" + self.num_heads = num_heads + self.head_dim = dim // num_heads + self.scale = self.head_dim**-0.5 + # self.fused_attn = use_fused_attn() + self.fused_attn = True + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.q_norm = norm_layer(self.head_dim) if qk_norm else nn.Identity() + self.k_norm = norm_layer(self.head_dim) if qk_norm else nn.Identity() + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) if proj_drop > 0.0 else nn.Identity() + + def forward(self, x: torch.Tensor, cu_slens=None) -> torch.Tensor: + B, N, C = x.shape + qkv = ( + self.qkv(x) + .reshape(B, N, 3, self.num_heads, self.head_dim) + .permute(2, 0, 3, 1, 4) + ) + q, k, v = qkv.unbind(0) + q, k = self.q_norm(q), self.k_norm(k) + + if cu_slens is not None: + q = q.permute(0, 2, 1, 3) # B, num_heads, N, C -> B, N, num_heads, C + k = k.permute(0, 2, 1, 3) + v = v.permute(0, 2, 1, 3) + max_seqlen = torch.max(cu_slens[1:] - cu_slens[:-1]).item() + x = flash_attn_varlen_func( + q.squeeze(0), + k.squeeze(0), + v.squeeze(0), + cu_seqlens_q=cu_slens, + cu_seqlens_k=cu_slens, + max_seqlen_q=max_seqlen, + max_seqlen_k=max_seqlen, + softmax_scale=self.scale, + causal=False, + ) + + x = x.reshape(B, N, -1) + x = self.proj(x) + x = self.proj_drop(x) + + else: + q = q.permute(0, 2, 1, 3) # B, num_heads, N, C -> B, N, num_heads, C + k = k.permute(0, 2, 1, 3) + v = v.permute(0, 2, 1, 3) + x = flash_attn_func(q, k, v, softmax_scale=self.scale) # -> b, n, h, c + + x = x.reshape(B, N, -1) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class LayerScale(nn.Module): + def __init__( + self, + dim: int, + init_values: float = 1e-5, + inplace: bool = False, + ) -> None: + super().__init__() + self.inplace = inplace + self.gamma = nn.Parameter(init_values * torch.ones(dim)) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return x.mul_(self.gamma) if self.inplace else x * self.gamma + + +class Block(nn.Module): + def __init__( + self, + dim: int, + num_heads: int, + mlp_ratio: float = 4.0, + qkv_bias: bool = False, + qk_norm: bool = False, + proj_drop: float = 0.0, + attn_drop: float = 0.0, + init_values: Optional[float] = None, + drop_path: float = 0.0, + act_layer: nn.Module = nn.GELU, + norm_layer: nn.Module = nn.LayerNorm, + mlp_layer: nn.Module = Mlp, + ) -> None: + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention( + dim, + num_heads=num_heads, + qkv_bias=qkv_bias, + qk_norm=qk_norm, + attn_drop=attn_drop, + proj_drop=proj_drop, + norm_layer=norm_layer, + ) + self.ls1 = ( + LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + ) + self.drop_path1 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + self.norm2 = norm_layer(dim) + self.mlp = mlp_layer( + in_features=dim, + hidden_features=int(dim * mlp_ratio), + act_layer=act_layer, + drop=proj_drop, + ) + self.ls2 = ( + LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + ) + self.drop_path2 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + def forward(self, x: torch.Tensor, cu_slens=None) -> torch.Tensor: + x = x + self.drop_path1(self.ls1(self.attn(self.norm1(x), cu_slens=cu_slens))) + x = x + self.drop_path2(self.ls2(self.mlp(self.norm2(x)))) + return x + + +class VisionTransformer(nn.Module): + """Vision Transformer + + A PyTorch impl of : `An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale` + - https://arxiv.org/abs/2010.11929 + """ + + dynamic_img_size: Final[bool] + + def __init__( + self, + img_size: Union[int, Tuple[int, int]] = 224, + patch_size: Union[int, Tuple[int, int]] = 16, + in_chans: int = 3, + num_classes: int = 1000, + global_pool: Literal["", "avg", "token", "map"] = "token", + embed_dim: int = 768, + depth: int = 12, + num_heads: int = 12, + mlp_ratio: float = 4.0, + qkv_bias: bool = True, + qk_norm: bool = False, + init_values: Optional[float] = None, + class_token: bool = True, + no_embed_class: bool = False, + reg_tokens: int = 0, + pre_norm: bool = False, + fc_norm: Optional[bool] = None, + dynamic_img_size: bool = False, + dynamic_img_pad: bool = False, + drop_rate: float = 0.0, + pos_drop_rate: float = 0.0, + patch_drop_rate: float = 0.0, + proj_drop_rate: float = 0.0, + attn_drop_rate: float = 0.0, + drop_path_rate: float = 0.0, + weight_init: Literal["skip", "jax", "jax_nlhb", "moco", ""] = "", + embed_layer: Callable = PatchEmbed, + norm_layer: Optional[LayerType] = None, + act_layer: Optional[LayerType] = None, + strict_img_size: bool = False, + block_fn: Type[nn.Module] = Block, + mlp_layer: Type[nn.Module] = Mlp, + ignore_head: bool = False, + ) -> None: + """ + Args: + img_size: Input image size. + patch_size: Patch size. + in_chans: Number of image input channels. + num_classes: Mumber of classes for classification head. + global_pool: Type of global pooling for final sequence (default: 'token'). + embed_dim: Transformer embedding dimension. + depth: Depth of transformer. + num_heads: Number of attention heads. + mlp_ratio: Ratio of mlp hidden dim to embedding dim. + qkv_bias: Enable bias for qkv projections if True. + init_values: Layer-scale init values (layer-scale enabled if not None). + class_token: Use class token. + no_embed_class: Don't include position embeddings for class (or reg) tokens. + reg_tokens: Number of register tokens. + fc_norm: Pre head norm after pool (instead of before), if None, enabled when global_pool == 'avg'. + drop_rate: Head dropout rate. + pos_drop_rate: Position embedding dropout rate. + attn_drop_rate: Attention dropout rate. + drop_path_rate: Stochastic depth rate. + weight_init: Weight initialization scheme. + embed_layer: Patch embedding layer. + norm_layer: Normalization layer. + act_layer: MLP activation layer. + block_fn: Transformer block layer. + """ + super().__init__() + assert global_pool in ("", "avg", "token", "map") + assert class_token or global_pool != "token" + use_fc_norm = global_pool == "avg" if fc_norm is None else fc_norm + # norm_layer = get_norm_layer(norm_layer) or partial(nn.LayerNorm, eps=1e-6) + # act_layer = get_act_layer(act_layer) or nn.GELU + norm_layer = partial(nn.LayerNorm, eps=1e-6) + act_layer = nn.GELU + + self.num_classes = num_classes + self.global_pool = global_pool + self.num_features = self.embed_dim = ( + embed_dim # num_features for consistency with other models + ) + self.num_prefix_tokens = 1 if class_token else 0 + self.num_prefix_tokens += reg_tokens + self.num_reg_tokens = reg_tokens + self.has_class_token = class_token + self.no_embed_class = ( + no_embed_class # don't embed prefix positions (includes reg) + ) + self.dynamic_img_size = dynamic_img_size + self.grad_checkpointing = False + self.ignore_head = ignore_head + + embed_args = {} + if dynamic_img_size: + # flatten deferred until after pos embed + embed_args.update(dict(strict_img_size=False, output_fmt="NHWC")) + self.patch_embed = embed_layer( + img_size=img_size, + patch_size=patch_size, + in_chans=in_chans, + embed_dim=embed_dim, + bias=not pre_norm, # disable bias if pre-norm is used (e.g. CLIP) + dynamic_img_pad=dynamic_img_pad, + strict_img_size=strict_img_size, + **embed_args, + ) + num_patches = self.patch_embed.num_patches + + self.cls_token = ( + nn.Parameter(torch.zeros(1, 1, embed_dim)) if class_token else None + ) + self.reg_token = ( + nn.Parameter(torch.zeros(1, reg_tokens, embed_dim)) if reg_tokens else None + ) + embed_len = ( + num_patches if no_embed_class else num_patches + self.num_prefix_tokens + ) + self.pos_embed = nn.Parameter(torch.randn(1, embed_len, embed_dim) * 0.02) + self.pos_drop = nn.Dropout(p=pos_drop_rate) + if patch_drop_rate > 0: + self.patch_drop = PatchDropout( + patch_drop_rate, + num_prefix_tokens=self.num_prefix_tokens, + ) + else: + self.patch_drop = nn.Identity() + self.norm_pre = norm_layer(embed_dim) if pre_norm else nn.Identity() + + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, depth) + ] # stochastic depth decay rule + self.blocks = nn.Sequential( + *[ + block_fn( + dim=embed_dim, + num_heads=num_heads, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + qk_norm=qk_norm, + init_values=init_values, + proj_drop=proj_drop_rate, + attn_drop=attn_drop_rate, + drop_path=dpr[i], + norm_layer=norm_layer, + act_layer=act_layer, + mlp_layer=mlp_layer, + ) + for i in range(depth) + ] + ) + + def init_weights(self, mode: Literal["jax", "jax_nlhb", "moco", ""] = "") -> None: + assert mode in ("jax", "jax_nlhb", "moco", "") + # head_bias = -math.log(self.num_classes) if "nlhb" in mode else 0.0 + trunc_normal_(self.pos_embed, std=0.02) + if self.cls_token is not None: + nn.init.normal_(self.cls_token, std=1e-6) + named_apply(init_weights_vit_timm, self) + + @torch.jit.ignore + def no_weight_decay(self) -> Set: + return {"pos_embed", "cls_token", "dist_token"} + + @torch.jit.ignore + def group_matcher(self, coarse: bool = False) -> Dict: + return dict( + stem=r"^cls_token|pos_embed|patch_embed", # stem and embed + blocks=[(r"^blocks\.(\d+)", None), (r"^norm", (99999,))], + ) + + @torch.jit.ignore + def set_grad_checkpointing(self, enable: bool = True) -> None: + self.grad_checkpointing = enable + + @torch.jit.ignore + def get_classifier(self) -> nn.Module: + return self.head + + def reset_classifier(self, num_classes: int, global_pool=None) -> None: + self.num_classes = num_classes + if global_pool is not None: + assert global_pool in ("", "avg", "token", "map") + if global_pool == "map" and self.attn_pool is None: + assert ( + False + ), "Cannot currently add attention pooling in reset_classifier()." + elif global_pool != "map " and self.attn_pool is not None: + self.attn_pool = None # remove attention pooling + self.global_pool = global_pool + self.head = ( + nn.Linear(self.embed_dim, num_classes) if num_classes > 0 else nn.Identity() + ) + + def rescale_positional_embedding(self, out_size): + h, w = out_size + pos_embed_shape = int((self.pos_embed.shape[1]) ** 0.5) + if (h, w) == (pos_embed_shape, pos_embed_shape): + return self.pos_embed + rescaled_positional_embedding = \ + self.pos_embed.new_zeros(1, h*w, self.pos_embed.shape[2]) + pe_2d = self.pos_embed[0].T.contiguous().view(1, -1, pos_embed_shape, pos_embed_shape) + pe_2d = F.interpolate(pe_2d, out_size, mode='bilinear', align_corners=False).view(-1, h*w) + rescaled_positional_embedding[0] = pe_2d.T.contiguous() + return rescaled_positional_embedding + + def _pos_embed(self, x: torch.Tensor) -> torch.Tensor: + if self.dynamic_img_size: + B, H, W, C = x.shape + pos_embed = resample_abs_pos_embed( + self.pos_embed, + (H, W), + num_prefix_tokens=0 if self.no_embed_class else self.num_prefix_tokens, + ) + x = x.view(B, -1, C) + else: + pos_embed = self.pos_embed + + to_cat = [] + if self.cls_token is not None: + to_cat.append(self.cls_token.expand(x.shape[0], -1, -1)) + if self.reg_token is not None: + to_cat.append(self.reg_token.expand(x.shape[0], -1, -1)) + + if self.no_embed_class: + # deit-3, updated JAX (big vision) + # position embedding does not overlap with class token, add then concat + x = x + pos_embed + if to_cat: + x = torch.cat(to_cat + [x], dim=1) + else: + # original timm, JAX, and deit vit impl + # pos_embed has entry for class token, concat then add + if to_cat: + x = torch.cat(to_cat + [x], dim=1) + x = x + pos_embed + + return self.pos_drop(x) + + def _intermediate_layers( + self, + x: torch.Tensor, + n: Union[int, Sequence] = 1, + ) -> List[torch.Tensor]: + outputs, num_blocks = [], len(self.blocks) + take_indices = set( + range(num_blocks - n, num_blocks) if isinstance(n, int) else n + ) + + # forward pass + x = self.patch_embed(x) + x = self._pos_embed(x) + x = self.patch_drop(x) + x = self.norm_pre(x) + for i, blk in enumerate(self.blocks): + x = blk(x) + if i in take_indices: + outputs.append(x) + + return outputs + + def get_intermediate_layers( + self, + x: torch.Tensor, + n: Union[int, Sequence] = 1, + reshape: bool = False, + return_prefix_tokens: bool = False, + norm: bool = False, + ) -> Tuple[Union[torch.Tensor, Tuple[torch.Tensor]]]: + """Intermediate layer accessor (NOTE: This is a WIP experiment). + Inspired by DINO / DINOv2 interface + """ + # take last n blocks if n is an int, if in is a sequence, select by matching indices + outputs = self._intermediate_layers(x, n) + if norm: + outputs = [self.norm(out) for out in outputs] + prefix_tokens = [out[:, 0 : self.num_prefix_tokens] for out in outputs] + outputs = [out[:, self.num_prefix_tokens :] for out in outputs] + + if reshape: + grid_size = self.patch_embed.grid_size + outputs = [ + out.reshape(x.shape[0], grid_size[0], grid_size[1], -1) + .permute(0, 3, 1, 2) + .contiguous() + for out in outputs + ] + + if return_prefix_tokens: + return tuple(zip(outputs, prefix_tokens)) + return tuple(outputs) + + def forward_features_list(self, x_list): + x_all = [] + image_sizes = [] + for x in x_list: + bs, _, h, w = x.shape + + # fix patch size=14 in datasets + pad_h = (self.patch_embed.patch_size[0] - h % self.patch_embed.patch_size[0]) % self.patch_embed.patch_size[0] + pad_w = (self.patch_embed.patch_size[1] - w % self.patch_embed.patch_size[1]) % self.patch_embed.patch_size[1] + x = F.pad(x, (0, pad_w, 0, pad_h)) + + bs, _, h, w = x.shape + + h = h // self.patch_embed.patch_size[0] + w = w // self.patch_embed.patch_size[1] + + x = self.patch_embed(x) + x = x + self.rescale_positional_embedding(out_size=(h, w)) + x = self.patch_drop(x) + x = self.norm_pre(x) + x_all.append(x) + image_sizes.append((h, w)) + + slen = [xi.size(1) for xi in x_all] + x = torch.cat(x_all, dim=1) + + cu_indices = [0, ] + for i in slen: + cu_indices.append(cu_indices[-1] + i) + + cu_slens = torch.tensor(cu_indices, dtype=torch.int32).to(x.device) + for idx, blk in enumerate(self.blocks): + if self.grad_checkpointing and not torch.jit.is_scripting(): + x = checkpoint(blk, x, cu_slens, use_reentrant=True) + else: + x = blk(x, cu_slens=cu_slens) + feats = x.split(slen, dim=1) #[(1, slen, c)] + return feats, image_sizes + + def forward_features(self, x: torch.Tensor) -> torch.Tensor: + bs, _, h, w = x.shape + h = h // self.patch_embed.patch_size[0] + w = w // self.patch_embed.patch_size[1] + + x = self.patch_embed(x) + # x = self._pos_embed(x) + x = x + self.rescale_positional_embedding(out_size=(h, w)) + x = self.patch_drop(x) + x = self.norm_pre(x) + if self.grad_checkpointing and not torch.jit.is_scripting(): + x = checkpoint_seq(self.blocks, x) + else: + x = self.blocks(x) + return x, (h, w) + + def forward_head(self, x: torch.Tensor, pre_logits: bool = False) -> torch.Tensor: + x = self.norm(x) + if self.attn_pool is not None: + x = self.attn_pool(x) + elif self.global_pool == "avg": + x = x[:, self.num_prefix_tokens :].mean(dim=1) + elif self.global_pool: + x = x[:, 0] # class token + x = self.fc_norm(x) + x = self.head_drop(x) + return x if pre_logits else self.head(x) + + def forward(self, x, cal_attn_pool=False): + if type(x) is list: + x, image_sizes = self.forward_features_list(x) + return x, image_sizes, None + else: + x, image_sizes = self.forward_features(x) + return x, image_sizes, None + +@dataclass +class SigLIPVisionCfg: + width: int = 1152 + layers: Union[Tuple[int, int, int, int], int] = 27 + heads: int = 16 + patch_size: int = 14 + image_size: Union[Tuple[int, int], int] = 336 + global_pool: str = "map" + mlp_ratio: float = 3.7362 + class_token: bool = False + num_classes: int = 0 + use_checkpoint: bool = False + + +SigLIP_MODEL_CONFIG = { + "siglip_so400m_patch16_384": { + "image_size": 384, + "patch_size": 16, + "width": 1152, + "layers": 27, + "heads": 16, + "mlp_ratio": 3.7362, + "global_pool": "map", + "use_checkpoint": False, + }, + "siglip2_giant_patch16_384":{ + "image_size": 384, + "patch_size": 16, + "width": 1536, + "layers": 40, + "heads": 16, + "mlp_ratio": 4, + "global_pool": "map", + "use_checkpoint": False, + }, +} + + +def resize_evaclip_pos_embed(model: VisionTransformer, interpolation: str = 'bicubic'): + # interpolate position embedding + orig_size = 24 + new_size = 128 + pos_tokens = model.pos_embed + pos_tokens = pos_tokens.reshape(-1, orig_size, orig_size, model.embed_dim).permute(0, 3, 1, 2) + pos_tokens = torch.nn.functional.interpolate( + pos_tokens, size=(new_size, new_size), mode=interpolation, align_corners=False) + pos_tokens = pos_tokens.permute(0, 2, 3, 1).flatten(1, 2) + model.pos_embed = nn.Parameter(pos_tokens, requires_grad=True) + return model + + +def create_siglip_vit( + model_name: str = "siglip_so400m_patch14_384", + select_layer: int = -1, + path: str = "", + gradient_checkpointing: bool = False, + **kwargs, +): + vision_cfg = SigLIPVisionCfg(**SigLIP_MODEL_CONFIG[model_name]) + + if select_layer <= 0: + layers = min(vision_cfg.layers, vision_cfg.layers + select_layer + 1) + else: + layers = min(vision_cfg.layers, select_layer) + + model = VisionTransformer( + img_size=2048, + patch_size=16, + embed_dim=vision_cfg.width, + depth=layers, + num_heads=vision_cfg.heads, + mlp_ratio=vision_cfg.mlp_ratio, + class_token=vision_cfg.class_token, + global_pool=vision_cfg.global_pool, + dynamic_img_pad=False, + strict_img_size=False, + ignore_head=kwargs.get("ignore_head", False), + weight_init=kwargs.get("weight_init", "skip"), + num_classes=0 + ) + model.config = vision_cfg + state_dict = torch.load(path, map_location="cpu") + model.load_state_dict(state_dict, strict=False) + + if gradient_checkpointing: + model.set_grad_checkpointing(True) + return model diff --git a/pipelines/xomni/modeling_xomni.py b/pipelines/xomni/modeling_xomni.py new file mode 100644 index 000000000..2e05dec0e --- /dev/null +++ b/pipelines/xomni/modeling_xomni.py @@ -0,0 +1,317 @@ +import os +from types import SimpleNamespace +from typing import Tuple, List, Optional, Union + +import torch +import torch.nn as nn + +from huggingface_hub import hf_hub_download +from transformers import Qwen2ForCausalLM, AutoModel, AutoModelForCausalLM +from transformers.modeling_outputs import CausalLMOutputWithPast +from transformers.models.qwen2.modeling_qwen2 import Qwen2RMSNorm, Qwen2RotaryEmbedding, Qwen2DecoderLayer, Qwen2Model, Qwen2PreTrainedModel + +from .configuration_xomni import XOmniConfig +from .modeling_siglip_tokenizer import create_anyres_preprocess, SiglipTokenizer +from .modeling_siglip_flux import FluxTransformer2DModelWithSigLIP, FluxPipelineWithSigLIP +from .modeling_vit import create_siglip_vit + + +class XOmniDecoderLayer(Qwen2DecoderLayer): + def __init__(self, config: XOmniConfig, layer_idx: int): + super().__init__(config, layer_idx) + self.layer_idx = layer_idx + self.is_lm_layer = config.num_mm_adap_layers <= layer_idx < config.num_hidden_layers - config.num_mm_head_layers + + def forward( + self, + hidden_states: torch.Tensor, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + hidden_states, multimodal_mask = torch.split(hidden_states, hidden_states.shape[-1] // 2, dim=-1) + if self.is_lm_layer: + output_hidden_states, *others = super().forward(hidden_states, **kwargs) + output_hidden_states = torch.cat([output_hidden_states, multimodal_mask], dim=-1) + return output_hidden_states, *others + + # mm_hidden_states = torch.where(multimodal_mask.bool(), hidden_states, torch.zeros_like(hidden_states)) + output_hidden_states, *others = super().forward(hidden_states, **kwargs) + output_hidden_states = torch.where(multimodal_mask.bool(), output_hidden_states, hidden_states) + output_hidden_states = torch.cat([output_hidden_states, multimodal_mask], dim=-1) + return output_hidden_states, *others + + +class XOmniModel(Qwen2Model, Qwen2PreTrainedModel): + model_type = "x-omni" + config_class = XOmniConfig + + def __init__(self, config: XOmniConfig): + Qwen2PreTrainedModel.__init__(self, config) + self.padding_idx = -1 + self.vocab_size = config.vocab_size + + self.lm_embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.mm_embed_tokens = nn.Embedding(config.mm_vocab_size, config.hidden_size, self.padding_idx) + + self.layers = nn.ModuleList( + [XOmniDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.lm_norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.mm_norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.rotary_emb = Qwen2RotaryEmbedding(config=config) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.lm_embed_tokens + + def set_input_embeddings(self, value): + self.lm_embed_tokens = value + + def embed_tokens(self, input_ids): + (B, L), C = input_ids.shape, self.config.hidden_size + multimodal_mask = input_ids >= self.config.vocab_size + lm_input_ids = input_ids[~multimodal_mask][None, :] + mm_input_ids = input_ids[multimodal_mask][None, :] - self.config.vocab_size + lm_embeds = self.lm_embed_tokens(lm_input_ids) + mm_embeds = self.mm_embed_tokens(mm_input_ids) + + inputs_embeds = lm_embeds.new_empty((B, L, C)) + multimodal_mask = multimodal_mask[:, :, None].expand_as(inputs_embeds) + inputs_embeds[~multimodal_mask] = lm_embeds.reshape(-1) + inputs_embeds[multimodal_mask] = mm_embeds.reshape(-1) + + inputs_embeds = torch.cat([inputs_embeds, multimodal_mask.to(inputs_embeds.dtype)], dim=-1) + return inputs_embeds + + def norm(self, hidden_states): + hidden_states, multimodal_mask = torch.split(hidden_states, hidden_states.shape[-1] // 2, dim=-1) + return torch.where(multimodal_mask.bool(), self.mm_norm(hidden_states), self.lm_norm(hidden_states)) + + +class XOmniForCausalLM(Qwen2ForCausalLM): + model_type = "x-omni" + config_class = XOmniConfig + + _keys_to_ignore_on_load_missing = r'image_tokenizer\.*' + + def __init__(self, config): + super().__init__(config) + self.model = XOmniModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + self.mm_head = nn.Linear(config.hidden_size, config.mm_vocab_size, bias=False) + + self.generation_mode = 'text' + # Initialize weights and apply final processing + self.post_init() + + @property + def device(self): + return next(iter(self.parameters())).device + + def init_vision(self, flux_pipe_path, **kwargs): + self.som_token = self.config.mm_special_tokens[0] + self.eom_token = self.config.mm_special_tokens[1] + self.img_token = self.config.mm_special_tokens[2] + + self.vision_config = SimpleNamespace(**self.config.vision_config) + self.transform_config = SimpleNamespace(**self.vision_config.transform) + self.encoder_config = SimpleNamespace(**self.vision_config.encoder) + self.decoder_config = SimpleNamespace(**self.vision_config.decoder) + + dtype_map = {'float32': torch.float32, 'float16': torch.float16, 'bfloat16': torch.bfloat16} + self.vision_dtype = dtype_map[self.vision_config.dtype] + + self.image_transform = create_anyres_preprocess(**self.vision_config.transform) + + self.encoder_config.siglip_path = os.path.join(self.name_or_path, self.encoder_config.siglip_path) if os.path.isdir(self.name_or_path) else hf_hub_download(repo_id=self.name_or_path, filename=self.encoder_config.siglip_path) + self.encoder_config.projector_path = os.path.join(self.name_or_path, self.encoder_config.projector_path) if os.path.isdir(self.name_or_path) else hf_hub_download(repo_id=self.name_or_path, filename=self.encoder_config.projector_path) + + self.image_tokenizer = SiglipTokenizer(**vars(self.encoder_config)) + self.image_tokenizer.to(self.device, self.vision_dtype) + + transformer = FluxTransformer2DModelWithSigLIP.from_pretrained( + self.name_or_path, + siglip_channels=self.encoder_config.z_channels, + torch_dtype=self.vision_dtype, + subfolder=self.decoder_config.model_path, + **kwargs, + ) + + self.decoder_pipe = FluxPipelineWithSigLIP.from_pretrained( + flux_pipe_path, + transformer=transformer, + torch_dtype=self.vision_dtype, + ) + self.decoder_pipe.set_progress_bar_config(disable=True) + + def set_generation_mode(self, mode): + assert mode in ('text', 'image'), f'Invalid generation mode: {mode}' + self.generation_mode = mode + + def mmencode(self, tokenizer, texts=None, images=None, **kwargs): + texts = texts or [] + images = images or [] + doc = '' + while len(texts) > 0 or len(images) > 0: + if len(texts) > 0: + doc += texts.pop(0) + if len(images) > 0: + doc += self.tokenize_image(images.pop(0)) + return tokenizer.encode(doc, **kwargs) + + def mmdecode(self, tokenizer, token_ids, force_text=None, **kwargs): + force_text = force_text or [] + if isinstance(token_ids, torch.Tensor): + if len(token_ids.shape) == 2: + assert token_ids.shape[0] == 1 + token_ids = token_ids[0] + assert len(token_ids.shape) == 1 + else: + if not isinstance(token_ids[0], int): + assert len(token_ids) == 1 + token_ids = token_ids[0] + assert isinstance(token_ids[0], int) + + doc = tokenizer.decode(token_ids, **kwargs) + doc = doc.replace(tokenizer.pad_token, '') + doc = doc.replace('', '') + texts, images = [], [] + text_image_chunks = doc.split(self.eom_token) + for chunk in text_image_chunks: + text, image_str = chunk.split(self.som_token) \ + if self.som_token in chunk else (chunk, '') + texts.append(text) + if self.img_token in image_str: + image_meta, token_str = image_str.split(self.img_token) + H, W = tuple(map(int, image_meta.split(' '))) + token_ids = list(map( + lambda x: int(x.split('>')[0]), + token_str.split(' 0: + image = self.detokenize_image([force_text.pop(0)], images, token_ids, (H, W)) + else: + image = self.detokenize_image(texts, images, token_ids, (H, W)) + images.append(image) + return texts, images + + @torch.no_grad() + def tokenize_image(self, image): + assert hasattr(self, 'image_tokenizer'), 'Please call "init_vision" before that.' + + image_str = self.som_token + image = self.image_transform(image) + assert image is not None, f'Unsupported image aspect ratio (max {self.transform_config.max_aspect_ratio}) or image resolution is too low (min {self.transform_config.min_short_size})' + + image = image[None, ...].to(self.device, self.vision_dtype) + tokens = self.image_tokenizer.encode(image) + B, H, W = tokens.shape + tokens = tokens.view(B, -1).cpu().tolist()[0] + token_str = ''.join(map(lambda x: ''.format(token_id=x), tokens)) + image_str = f'{self.som_token}{H} {W}{self.img_token}{token_str}{self.eom_token}' + return image_str + + @torch.no_grad() + def detokenize_image(self, texts, images, token_ids, shape): + assert hasattr(self, 'image_tokenizer'), 'Please call "init_vision" before that.' + assert len(texts) == 1 and len(images) == 0, 'Only support one image per sample.' + H, W = shape + tokens = torch.tensor(token_ids, device=self.device, dtype=torch.long) + latents = self.image_tokenizer.decode(tokens, (1, H, W, self.encoder_config.codebook_dim)) + upscale_factor = self.decoder_config.upscale_factor + latents = latents.reshape(*latents.shape[:2], -1).transpose(1, 2).contiguous() + image = self.decoder_pipe( + latents, + [texts[0]], + negative_prompt=[''], + height=H * upscale_factor, width=W * upscale_factor, + num_inference_steps=self.decoder_config.num_inference_steps, + guidance_scale=1.0, + true_cfg_scale=self.decoder_config.cfg_scale, + true_cfg_scale_2=self.decoder_config.cfg_scale_2, + ).images[0] + + + return image + + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + cache_position: Optional[torch.LongTensor] = None, + num_logits_to_keep: int = 0, + ) -> Union[Tuple, CausalLMOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + self.model.has_sliding_layers = False + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + cache_position=cache_position, + ) + + hidden_states = outputs[0] + hidden_states = hidden_states[:, -num_logits_to_keep:, :] + logits = hidden_states.new_full( + (*hidden_states.shape[:-1], self.config.vocab_size + self.config.mm_vocab_size), + torch.finfo(hidden_states.dtype).min + ) + if self.generation_mode == 'text': + logits[:, :, :self.config.vocab_size] = self.lm_head(hidden_states) + else: + logits[:, :, self.config.vocab_size:self.config.vocab_size + self.config.image_vocab_size] = self.mm_head(hidden_states)[:, :, :self.config.image_vocab_size] + + logits = logits.float() + + loss = None + if labels is not None: + # Upcast to float if we need to compute the loss to avoid potential precision issues + logits = logits.float() + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = nn.CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + +AutoModel.register(XOmniConfig, XOmniModel) +AutoModelForCausalLM.register(XOmniConfig, XOmniForCausalLM) From a315a004e96bb5571205af9e2d6e7e7e34c654c7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Oct 2025 20:25:33 -0400 Subject: [PATCH 155/230] linting Signed-off-by: Vladimir Mandic --- modules/lora/lora_apply.py | 2 + modules/sdnq/loader.py | 2 +- modules/sdnq/quantizer.py | 11 ++-- pipelines/xomni/modeling_siglip_flux.py | 2 +- pipelines/xomni/modeling_siglip_tokenizer.py | 68 ++++++++++---------- pipelines/xomni/modeling_vit.py | 6 +- pipelines/xomni/modeling_xomni.py | 34 +++++----- 7 files changed, 63 insertions(+), 62 deletions(-) diff --git a/modules/lora/lora_apply.py b/modules/lora/lora_apply.py index d076efb97..51be0a74f 100644 --- a/modules/lora/lora_apply.py +++ b/modules/lora/lora_apply.py @@ -186,6 +186,8 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G self.svd_down.to(devices.device) if self.svd_down is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul ) + else: + weights_dtype = devices.dtype new_weight = dequant_weight.to(devices.device, dtype=torch.float32) + lora_weights.to(devices.device, dtype=torch.float32) self.weight = torch.nn.Parameter(new_weight, requires_grad=False) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index aabd2496c..a7a7f3ae6 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -16,7 +16,7 @@ def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", use_quantized_matmul: bool = False) -> ModelMixin: with torch.device("meta"): - with open(os.path.join(model_path, "quantization_config.json"), "r") as f: + with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: quantization_config = json.load(f) quantization_config.pop("is_integer", None) quantization_config.pop("quant_method", None) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index a92cb455a..d4769821e 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -252,13 +252,12 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in modules_to_not_convert) ): continue - else: - layer_class_name = module.__class__.__name__ - if layer_class_name in allowed_types: - if (layer_class_name in conv_types or layer_class_name in conv_transpose_types) and not quant_conv: - continue - else: + layer_class_name = module.__class__.__name__ + if layer_class_name in allowed_types: + if (layer_class_name in conv_types or layer_class_name in conv_transpose_types) and not quant_conv: continue + else: + continue if len(modules_dtype_dict.keys()) > 0: for key, value in modules_dtype_dict.items(): if param_name in value: diff --git a/pipelines/xomni/modeling_siglip_flux.py b/pipelines/xomni/modeling_siglip_flux.py index 8db60374a..18b7b3463 100644 --- a/pipelines/xomni/modeling_siglip_flux.py +++ b/pipelines/xomni/modeling_siglip_flux.py @@ -497,7 +497,7 @@ def teacache_forward( class FluxPipelineWithSigLIP(FluxPipeline): - + @torch.no_grad() def __call__( self, diff --git a/pipelines/xomni/modeling_siglip_tokenizer.py b/pipelines/xomni/modeling_siglip_tokenizer.py index 26e67571d..5e99d4ff8 100644 --- a/pipelines/xomni/modeling_siglip_tokenizer.py +++ b/pipelines/xomni/modeling_siglip_tokenizer.py @@ -13,12 +13,12 @@ from .modeling_vit import create_siglip_vit def create_anyres_preprocess( - short_size=384, - long_size=1152, - patch_size=16, - random_ratio=None, - min_short_size=128, - max_aspect_ratio=3., + short_size=384, + long_size=1152, + patch_size=16, + random_ratio=None, + min_short_size=128, + max_aspect_ratio=3., filtering=True ): @@ -35,21 +35,21 @@ def create_anyres_preprocess( sqrt_ratio = torch.exp(0.5 * torch.empty(1).uniform_(log_ratio[0], log_ratio[1])).item() target_width = int(round(target_width * sqrt_ratio)) target_height = int(round(target_height / sqrt_ratio)) - + ss = min(target_width, target_height) if ss < short_size: target_width = target_width * (short_size / ss) target_height = target_height * (short_size / ss) - + ls = max(target_width, target_height) if ls > long_size: target_width = target_width * (long_size / ls) target_height = target_height * (long_size / ls) - + target_width = int(round(target_width / patch_size)) * patch_size target_height = int(round(target_height / patch_size)) * patch_size pil_image = pil_image.resize((target_width, target_height), resample=Image.BICUBIC) - + to_tensor = transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]), @@ -75,7 +75,7 @@ class IBQ(nn.Module): self.embedding.weight.data.uniform_(-1.0 / self.n_e, 1.0 / self.n_e) if self.l2_norm: self.embedding.weight.data = F.normalize(self.embedding.weight.data, p=2, dim=-1) - + def forward(self, z, temp=None, rescale_logits=False, return_logits=False, **kwargs): assert temp is None or temp == 1.0, "Only for interface compatible with Gumbel" assert rescale_logits == False, "Only for interface compatible with Gumbel" @@ -96,7 +96,7 @@ class IBQ(nn.Module): d = torch.sum(z_flattened ** 2, dim=1, keepdim=True) + \ torch.sum(embedding**2, dim=1) - 2 * \ torch.einsum('bd,dn->bn', z_flattened, torch.einsum('n d -> d n', embedding)) - + if self.training: logits = -d / self.quantization_temp soft_one_hot = F.softmax(logits, dim=1) @@ -114,13 +114,13 @@ class IBQ(nn.Module): min_encoding_indices = torch.argmin(d, dim=1) z_q = embedding[min_encoding_indices].view(z.shape) commit_loss = None - + if self.training and self.skip_quantization_prob > 0.0: z_q = torch.where( torch.rand_like(z_q[:, 0:1, 0:1, 0:1]).expand_as(z_q) <= self.skip_quantization_prob, z, z_q, ) - + # reshape back to match original input shape z_q = rearrange(z_q, 'b h w c -> b c h w').contiguous() @@ -150,7 +150,7 @@ class ResidualBlock(nn.Module): self.activate = nn.GELU() self.conv2 = nn.Conv2d(channels, channels, 3, padding='same') self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=channels) - + def forward(self, x): res = x x = self.norm1(x) @@ -164,10 +164,10 @@ class ResidualBlock(nn.Module): class VQConvProjector(nn.Module): def __init__( - self, - z_channels=1536, - codebook_size=16384, - codebook_dim=2048, + self, + z_channels=1536, + codebook_size=16384, + codebook_dim=2048, conv_layers=2, with_norm=True, skip_quant_prob=0.1, @@ -178,7 +178,7 @@ class VQConvProjector(nn.Module): self.post_quant_conv = nn.Conv2d(codebook_dim, z_channels, 1) block = ResidualBlock self.post_conv = nn.Sequential(*[block(z_channels) for _ in range(conv_layers)]) - + def forward(self, x, h, w): x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) z = self.quant_conv(x) @@ -187,37 +187,37 @@ class VQConvProjector(nn.Module): z = self.post_conv(z) z = rearrange(z, 'b c h w -> b (h w) c') return z, codebook_loss - + def encode(self, x, h, w): x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) z = self.quant_conv(x) (_, _, tokens), _ = self.quantize(z) return tokens - + def decode(self, tokens, bhwc): z_q = self.quantize.get_codebook_entry(tokens, bhwc) z = self.post_quant_conv(z_q) - z = self.post_conv(z) + z = self.post_conv(z) return z class SiglipTokenizer(nn.Module): def __init__( - self, - siglip_name, - siglip_path, - projector_path, - z_channels=1536, - codebook_size=16384, - codebook_dim=2048, + self, + siglip_name, + siglip_path, + projector_path, + z_channels=1536, + codebook_size=16384, + codebook_dim=2048, with_norm=True ): super().__init__() self.vit = create_siglip_vit(model_name=siglip_name, path=siglip_path) self.vqproj = VQConvProjector( - z_channels=z_channels, - codebook_size=codebook_size, - codebook_dim=codebook_dim, + z_channels=z_channels, + codebook_size=codebook_size, + codebook_dim=codebook_dim, with_norm=with_norm ) self.vqproj.load_state_dict(torch.load(projector_path, map_location='cpu'), strict=True) @@ -226,6 +226,6 @@ class SiglipTokenizer(nn.Module): features, (h, w), _ = self.vit(x) tokens = self.vqproj.encode(features, h, w) return tokens - + def decode(self, tokens, bhwc): return self.vqproj.decode(tokens, bhwc) diff --git a/pipelines/xomni/modeling_vit.py b/pipelines/xomni/modeling_vit.py index 722851a41..150571c1d 100644 --- a/pipelines/xomni/modeling_vit.py +++ b/pipelines/xomni/modeling_vit.py @@ -541,7 +541,7 @@ class VisionTransformer(nn.Module): for x in x_list: bs, _, h, w = x.shape - # fix patch size=14 in datasets + # fix patch size=14 in datasets pad_h = (self.patch_embed.patch_size[0] - h % self.patch_embed.patch_size[0]) % self.patch_embed.patch_size[0] pad_w = (self.patch_embed.patch_size[1] - w % self.patch_embed.patch_size[1]) % self.patch_embed.patch_size[1] x = F.pad(x, (0, pad_w, 0, pad_h)) @@ -578,7 +578,7 @@ class VisionTransformer(nn.Module): bs, _, h, w = x.shape h = h // self.patch_embed.patch_size[0] w = w // self.patch_embed.patch_size[1] - + x = self.patch_embed(x) # x = self._pos_embed(x) x = x + self.rescale_positional_embedding(out_size=(h, w)) @@ -658,7 +658,7 @@ def resize_evaclip_pos_embed(model: VisionTransformer, interpolation: str = 'bic pos_tokens, size=(new_size, new_size), mode=interpolation, align_corners=False) pos_tokens = pos_tokens.permute(0, 2, 3, 1).flatten(1, 2) model.pos_embed = nn.Parameter(pos_tokens, requires_grad=True) - return model + return model def create_siglip_vit( diff --git a/pipelines/xomni/modeling_xomni.py b/pipelines/xomni/modeling_xomni.py index 2e05dec0e..7e46f781c 100644 --- a/pipelines/xomni/modeling_xomni.py +++ b/pipelines/xomni/modeling_xomni.py @@ -32,7 +32,7 @@ class XOmniDecoderLayer(Qwen2DecoderLayer): output_hidden_states, *others = super().forward(hidden_states, **kwargs) output_hidden_states = torch.cat([output_hidden_states, multimodal_mask], dim=-1) return output_hidden_states, *others - + # mm_hidden_states = torch.where(multimodal_mask.bool(), hidden_states, torch.zeros_like(hidden_states)) output_hidden_states, *others = super().forward(hidden_states, **kwargs) output_hidden_states = torch.where(multimodal_mask.bool(), output_hidden_states, hidden_states) @@ -48,7 +48,7 @@ class XOmniModel(Qwen2Model, Qwen2PreTrainedModel): Qwen2PreTrainedModel.__init__(self, config) self.padding_idx = -1 self.vocab_size = config.vocab_size - + self.lm_embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) self.mm_embed_tokens = nn.Embedding(config.mm_vocab_size, config.hidden_size, self.padding_idx) @@ -94,7 +94,7 @@ class XOmniModel(Qwen2Model, Qwen2PreTrainedModel): class XOmniForCausalLM(Qwen2ForCausalLM): model_type = "x-omni" config_class = XOmniConfig - + _keys_to_ignore_on_load_missing = r'image_tokenizer\.*' def __init__(self, config): @@ -102,7 +102,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): self.model = XOmniModel(config) self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) self.mm_head = nn.Linear(config.hidden_size, config.mm_vocab_size, bias=False) - + self.generation_mode = 'text' # Initialize weights and apply final processing self.post_init() @@ -110,7 +110,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): @property def device(self): return next(iter(self.parameters())).device - + def init_vision(self, flux_pipe_path, **kwargs): self.som_token = self.config.mm_special_tokens[0] self.eom_token = self.config.mm_special_tokens[1] @@ -125,7 +125,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): self.vision_dtype = dtype_map[self.vision_config.dtype] self.image_transform = create_anyres_preprocess(**self.vision_config.transform) - + self.encoder_config.siglip_path = os.path.join(self.name_or_path, self.encoder_config.siglip_path) if os.path.isdir(self.name_or_path) else hf_hub_download(repo_id=self.name_or_path, filename=self.encoder_config.siglip_path) self.encoder_config.projector_path = os.path.join(self.name_or_path, self.encoder_config.projector_path) if os.path.isdir(self.name_or_path) else hf_hub_download(repo_id=self.name_or_path, filename=self.encoder_config.projector_path) @@ -133,15 +133,15 @@ class XOmniForCausalLM(Qwen2ForCausalLM): self.image_tokenizer.to(self.device, self.vision_dtype) transformer = FluxTransformer2DModelWithSigLIP.from_pretrained( - self.name_or_path, - siglip_channels=self.encoder_config.z_channels, + self.name_or_path, + siglip_channels=self.encoder_config.z_channels, torch_dtype=self.vision_dtype, subfolder=self.decoder_config.model_path, **kwargs, ) self.decoder_pipe = FluxPipelineWithSigLIP.from_pretrained( - flux_pipe_path, + flux_pipe_path, transformer=transformer, torch_dtype=self.vision_dtype, ) @@ -161,7 +161,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): if len(images) > 0: doc += self.tokenize_image(images.pop(0)) return tokenizer.encode(doc, **kwargs) - + def mmdecode(self, tokenizer, token_ids, force_text=None, **kwargs): force_text = force_text or [] if isinstance(token_ids, torch.Tensor): @@ -174,7 +174,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): assert len(token_ids) == 1 token_ids = token_ids[0] assert isinstance(token_ids[0], int) - + doc = tokenizer.decode(token_ids, **kwargs) doc = doc.replace(tokenizer.pad_token, '') doc = doc.replace('', '') @@ -197,7 +197,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): image = self.detokenize_image(texts, images, token_ids, (H, W)) images.append(image) return texts, images - + @torch.no_grad() def tokenize_image(self, image): assert hasattr(self, 'image_tokenizer'), 'Please call "init_vision" before that.' @@ -213,7 +213,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): token_str = ''.join(map(lambda x: ''.format(token_id=x), tokens)) image_str = f'{self.som_token}{H} {W}{self.img_token}{token_str}{self.eom_token}' return image_str - + @torch.no_grad() def detokenize_image(self, texts, images, token_ids, shape): assert hasattr(self, 'image_tokenizer'), 'Please call "init_vision" before that.' @@ -228,7 +228,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): [texts[0]], negative_prompt=[''], height=H * upscale_factor, width=W * upscale_factor, - num_inference_steps=self.decoder_config.num_inference_steps, + num_inference_steps=self.decoder_config.num_inference_steps, guidance_scale=1.0, true_cfg_scale=self.decoder_config.cfg_scale, true_cfg_scale_2=self.decoder_config.cfg_scale_2, @@ -236,7 +236,7 @@ class XOmniForCausalLM(Qwen2ForCausalLM): return image - + def forward( self, input_ids: torch.LongTensor = None, @@ -275,14 +275,14 @@ class XOmniForCausalLM(Qwen2ForCausalLM): hidden_states = outputs[0] hidden_states = hidden_states[:, -num_logits_to_keep:, :] logits = hidden_states.new_full( - (*hidden_states.shape[:-1], self.config.vocab_size + self.config.mm_vocab_size), + (*hidden_states.shape[:-1], self.config.vocab_size + self.config.mm_vocab_size), torch.finfo(hidden_states.dtype).min ) if self.generation_mode == 'text': logits[:, :, :self.config.vocab_size] = self.lm_head(hidden_states) else: logits[:, :, self.config.vocab_size:self.config.vocab_size + self.config.image_vocab_size] = self.mm_head(hidden_states)[:, :, :self.config.image_vocab_size] - + logits = logits.float() loss = None From 5c042c5fb88e52a93ace4c860d824d28a3f27abf Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 11:30:26 +0300 Subject: [PATCH 156/230] cleanup --- modules/lora/lora_apply.py | 4 +--- modules/sdnq/loader.py | 6 +++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/lora/lora_apply.py b/modules/lora/lora_apply.py index 51be0a74f..2221fbf3e 100644 --- a/modules/lora/lora_apply.py +++ b/modules/lora/lora_apply.py @@ -176,7 +176,7 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G self.sdnq_svd_down_backup.to(devices.device) if self.sdnq_svd_down_backup is not None else None, skip_quantized_matmul=self.sdnq_dequantizer_backup.use_quantized_matmul ) - elif hasattr(self, "sdnq_dequantizer"): + else: weights_dtype = self.sdnq_dequantizer.weights_dtype dequant_weight = self.sdnq_dequantizer.to(devices.device)( model_weights.to(devices.device), @@ -186,8 +186,6 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G self.svd_down.to(devices.device) if self.svd_down is not None else None, skip_quantized_matmul=self.sdnq_dequantizer.use_quantized_matmul ) - else: - weights_dtype = devices.dtype new_weight = dequant_weight.to(devices.device, dtype=torch.float32) + lora_weights.to(devices.device, dtype=torch.float32) self.weight = torch.nn.Parameter(new_weight, requires_grad=False) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index a7a7f3ae6..700c497e5 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -4,7 +4,7 @@ import torch from safetensors import safe_open from diffusers.models.modeling_utils import ModelMixin -from .common import use_contiguous_mm +from .common import use_tensorwise_fp8_matmul, use_contiguous_mm from .quantizer import SDNQConfig, apply_sdnq_to_module from .dequantizer import dequantize_symmetric_compiled, re_quantize_int8, re_quantize_fp8 @@ -47,10 +47,14 @@ def enable_quantized_mamtul(model): if not module.sdnq_dequantizer.use_quantized_matmul: if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn"}: if module.sdnq_dequantizer.re_quantize_for_matmul: + return_dtype = module.scale.dtype if module.sdnq_dequantizer.weights_dtype == "int8": module.weight.data, module.scale.data = re_quantize_int8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + module.scale.data = module.scale.to(dtype=return_dtype) else: module.weight.data, module.scale.data = re_quantize_fp8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + if use_tensorwise_fp8_matmul: + module.scale.data = module.scale.to(dtype=return_dtype) else: module.weight.data, module.scale.data = module.weight.t_(), module.scale.t_() if use_contiguous_mm: From c931bf9efab69ecdc91d342d6f7adbbdeef10b35 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 17:44:52 +0300 Subject: [PATCH 157/230] SDNQ add dtype casting to loader --- modules/sdnq/dequantizer.py | 12 ++++---- modules/sdnq/loader.py | 58 ++++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 38f09f0a1..0d7b0a83e 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -54,9 +54,11 @@ def quantize_int8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.CharTe return input, scale -def quantize_fp8(input: torch.FloatTensor, dim: int = -1) -> Tuple[torch.Tensor, torch.FloatTensor]: - scale = torch.amax(input.abs(), dim=dim, keepdims=True).div_(448) - input = torch.div(input, scale).nan_to_num_().clamp_(-448, 448).to(dtype=torch.float8_e4m3fn) +def quantize_fp8(input: torch.FloatTensor, dim: int = -1, is_e5: bool = False) -> Tuple[torch.Tensor, torch.FloatTensor]: + max_range = 57344 if is_e5 else 448 + fp8_dtype = torch.float8_e5m2 if is_e5 else torch.float8_e4m3fn + scale = torch.amax(input.abs(), dim=dim, keepdims=True).div_(max_range) + input = torch.div(input, scale).nan_to_num_().clamp_(-max_range, max_range).to(dtype=fp8_dtype) return input, scale @@ -67,10 +69,10 @@ def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch return weight, scale -def re_quantize_fp8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: +def re_quantize_fp8(weight: torch.FloatTensor, is_e5: bool = False) -> Tuple[torch.CharTensor, torch.FloatTensor]: if weight.ndim > 2: # convs weight = weight.flatten(1,-1) - weight, scale = quantize_fp8(weight.t(), dim=0) + weight, scale = quantize_fp8(weight.t(), dim=0, is_e5=is_e5) if not use_tensorwise_fp8_matmul: scale = scale.to(dtype=torch.float32) return weight, scale diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 700c497e5..de02f0145 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -6,7 +6,7 @@ from diffusers.models.modeling_utils import ModelMixin from .common import use_tensorwise_fp8_matmul, use_contiguous_mm from .quantizer import SDNQConfig, apply_sdnq_to_module -from .dequantizer import dequantize_symmetric_compiled, re_quantize_int8, re_quantize_fp8 +from .dequantizer import dequantize_symmetric, re_quantize_int8, re_quantize_fp8 def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, max_shard_size: str = "10GB") -> None: @@ -14,7 +14,7 @@ def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) -def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", use_quantized_matmul: bool = False) -> ModelMixin: +def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = False) -> ModelMixin: with torch.device("meta"): with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: quantization_config = json.load(f) @@ -33,37 +33,55 @@ def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "di state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) del state_dict - if use_quantized_matmul and not quantization_config["use_quantized_matmul"]: - model = enable_quantized_mamtul(model) + model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) return model -def enable_quantized_mamtul(model): +def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = False): has_children = list(model.children()) if not has_children: return model for module in model.children(): if hasattr(module, "sdnq_dequantizer"): - if not module.sdnq_dequantizer.use_quantized_matmul: - if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn"}: - if module.sdnq_dequantizer.re_quantize_for_matmul: - return_dtype = module.scale.dtype + if dtype is not None: + module.sdnq_dequantizer.result_dtype = dtype + + current_scale_dtype = module.svd_up.dtype if module.svd_up is not None else module.scale.dtype + scale_dtype = torch.float32 if dequantize_fp32 is None and current_scale_dtype == torch.float32 else torch.float32 if dequantize_fp32 else module.sdnq_dequantizer.result_dtype + upcast_scale = bool(use_quantized_matmul and use_tensorwise_fp8_matmul and module.sdnq_dequantizer.weights_dtype in {"float8_e4m3fn", "float8_e5m2"}) + + if upcast_scale: + module.scale.data = module.scale.to(dtype=torch.float32) + else: + module.scale.data = module.scale.to(dtype=scale_dtype) + if module.zero_point is not None: + module.zero_point.data = module.zero_point.to(dtype=scale_dtype) + if module.svd_up is not None: + module.svd_up.data = module.svd_up.to(dtype=scale_dtype) + module.svd_down.data = module.svd_down.to(dtype=scale_dtype) + + if use_quantized_matmul != module.sdnq_dequantizer.use_quantized_matmul: + if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn", "float8_e5m2"}: + if use_quantized_matmul and module.sdnq_dequantizer.re_quantize_for_matmul: + scale_dtype = module.scale.dtype if module.sdnq_dequantizer.weights_dtype == "int8": - module.weight.data, module.scale.data = re_quantize_int8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) - module.scale.data = module.scale.to(dtype=return_dtype) + module.weight.data, module.scale.data = re_quantize_int8(dequantize_symmetric(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + module.scale.data = module.scale.to(dtype=scale_dtype) else: - module.weight.data, module.scale.data = re_quantize_fp8(dequantize_symmetric_compiled(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape)) + is_e5 = bool(module.sdnq_dequantizer.weights_dtype == "float8_e5m2") + module.weight.data, module.scale.data = re_quantize_fp8(dequantize_symmetric(module.weight, module.scale, torch.float32, module.sdnq_dequantizer.result_shape), is_e5=is_e5) if use_tensorwise_fp8_matmul: - module.scale.data = module.scale.to(dtype=return_dtype) - else: + module.scale.data = module.scale.to(dtype=scale_dtype) + elif not module.sdnq_dequantizer.re_quantize_for_matmul: module.weight.data, module.scale.data = module.weight.t_(), module.scale.t_() - if use_contiguous_mm: - module.weight.data = module.weight.contiguous() - elif module.weight.is_contiguous(): - module.weight.data = module.weight.t_().contiguous().t_() + if use_quantized_matmul: + if use_contiguous_mm: + module.weight.data = module.weight.contiguous() + elif module.weight.is_contiguous(): + module.weight.data = module.weight.t_().contiguous().t_() if module.svd_up is not None: module.svd_up.data = module.svd_up.t_() module.svd_down.data = module.svd_down.t_() - module.sdnq_dequantizer.use_quantized_matmul = True - module = enable_quantized_mamtul(module) + module.sdnq_dequantizer.use_quantized_matmul = use_quantized_matmul + module = apply_options_to_model(module, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) return model From be91bbff753c862c4088f6faefec48b08a5d756e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 18:26:42 +0300 Subject: [PATCH 158/230] SDNQ add SVD support for Convs --- modules/sdnq/dequantizer.py | 10 ++++++++-- modules/sdnq/layers/conv/conv_fp8.py | 5 +++-- modules/sdnq/layers/linear/linear_fp8.py | 3 ++- modules/sdnq/quantizer.py | 13 ++++++++++--- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 0d7b0a83e..0f2ee676e 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -15,7 +15,10 @@ def dequantize_asymmetric(weight: torch.ByteTensor, scale: torch.FloatTensor, ze if svd_up is not None: if skip_quantized_matmul: svd_up, svd_down = svd_up.t(), svd_down.t() - result = torch.addmm(result, svd_up, svd_down) + if result.ndim > 2 and weight.ndim > 2: # convs + result = result.add_(torch.mm(svd_up, svd_down).unflatten(-1, (*result.shape[1:],))) + else: + result = result.addmm_(svd_up, svd_down) if dtype is not None: result = result.to(dtype=dtype) return result @@ -30,7 +33,10 @@ def dequantize_symmetric(weight: torch.CharTensor, scale: torch.FloatTensor, dty if svd_up is not None: if skip_quantized_matmul: svd_up, svd_down = svd_up.t(), svd_down.t() - result = torch.addmm(result, svd_up, svd_down) + if result.ndim > 2 and weight.ndim > 2: # convs + result = result.add_(torch.mm(svd_up, svd_down).unflatten(-1, (*result.shape[1:],))) + else: + result = result.addmm_(svd_up, svd_down) if dtype is not None: result = result.to(dtype=dtype) return result diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index d700a6998..b07196ea7 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -34,7 +34,7 @@ def conv_fp8_matmul( if groups == 1: if bias is not None and bias.dtype != torch.bfloat16: bias = bias.to(dtype=torch.bfloat16) - result = torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16).view(mm_output_shape).to(return_dtype) + result = torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16) else: scale = scale.view(groups, 1, scale.shape[1] // groups) input_scale = input_scale.view(groups, input_scale.shape[0] // groups, 1) @@ -50,9 +50,10 @@ def conv_fp8_matmul( else: for i in range(groups): result.append(torch._scaled_mm(input[:, i], weight[:, i], scale_a=input_scale[i], scale_b=scale[i], bias=None, out_dtype=torch.bfloat16)) - result = torch.cat(result, dim=-1).view(mm_output_shape).to(return_dtype) + result = torch.cat(result, dim=-1) if svd_up is not None: result.add_(svd_bias) + result = result.view(mm_output_shape).to(return_dtype) if conv_type == 1: result = result.transpose_(1,2) diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index 205b141e8..0c8c26341 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -31,9 +31,10 @@ def fp8_matmul( input, weight = check_mats(input, weight) if bias is not None and bias.dtype != torch.bfloat16: bias = bias.to(dtype=torch.bfloat16) - result = torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16).view(output_shape).to(return_dtype) + result = torch._scaled_mm(input, weight, scale_a=input_scale, scale_b=scale, bias=bias, out_dtype=torch.bfloat16) if svd_up is not None: result.add_(svd_bias) + result = result.view(output_shape).to(return_dtype) return result diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index d4769821e..7261d2373 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -49,10 +49,18 @@ def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[i def apply_svdquant(weight: torch.FloatTensor, rank: int = 32) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: + reshape_weight = False + if weight.ndim > 2: # convs + reshape_weight = True + weight_shape = weight.shape + weight = weight.flatten(1,-1) U, S, svd_down = torch.svd_lowrank(weight, q=rank) svd_up = torch.mul(U, S.unsqueeze(0)) svd_down = svd_down.t_() - return weight.sub_(torch.mm(svd_up, svd_down)), svd_up, svd_down + weight = weight.sub_(torch.mm(svd_up, svd_down)) + if reshape_weight: + weight = weight.unflatten(-1, (*weight_shape[1:],)) + return weight, svd_up, svd_down @devices.inference_context() @@ -118,13 +126,12 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz if layer.weight.dtype != torch.float32: layer.weight.data = layer.weight.to(dtype=torch.float32) - if use_svd and is_linear_type: + if use_svd: layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank) if use_quantized_matmul: svd_up = svd_up.t_() svd_down = svd_down.t_() else: - use_svd = False svd_up, svd_down = None, None if group_size == 0: From 5306376b2a0025d3cdd712c153496259aafc0f01 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 6 Oct 2025 19:05:46 +0300 Subject: [PATCH 159/230] improve contiguous mm performance --- modules/sdnq/dequantizer.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 0f2ee676e..1181776c8 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -4,7 +4,7 @@ from typing import Tuple, Optional import torch -from .common import dtype_dict, compile_func, use_tensorwise_fp8_matmul +from .common import dtype_dict, compile_func, use_contiguous_mm, use_tensorwise_fp8_matmul from .packed_int import pack_int_symetric, unpack_int_symetric, pack_int_asymetric, unpack_int_asymetric @@ -71,7 +71,10 @@ def quantize_fp8(input: torch.FloatTensor, dim: int = -1, is_e5: bool = False) - def re_quantize_int8(weight: torch.FloatTensor) -> Tuple[torch.CharTensor, torch.FloatTensor]: if weight.ndim > 2: # convs weight = weight.flatten(1,-1) - weight, scale = quantize_int8(weight.t(), dim=0) + weight = weight.t() + if use_contiguous_mm: + weight = weight.contiguous() + weight, scale = quantize_int8(weight, dim=0) return weight, scale From aa0c10440f9225002fd157eefd512194ac99b005 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 7 Oct 2025 00:15:23 +0300 Subject: [PATCH 160/230] SDNQ make the loader don't touch the model options by default --- modules/sdnq/loader.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index de02f0145..79cd26054 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -14,7 +14,7 @@ def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) -def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = False) -> ModelMixin: +def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None) -> ModelMixin: with torch.device("meta"): with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: quantization_config = json.load(f) @@ -33,11 +33,12 @@ def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "di state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) del state_dict - model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) + if dtype is not None or dequantize_fp32 is not None or use_quantized_matmul is not None: + model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) return model -def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = False): +def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None): has_children = list(model.children()) if not has_children: return model @@ -48,7 +49,7 @@ def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bo current_scale_dtype = module.svd_up.dtype if module.svd_up is not None else module.scale.dtype scale_dtype = torch.float32 if dequantize_fp32 is None and current_scale_dtype == torch.float32 else torch.float32 if dequantize_fp32 else module.sdnq_dequantizer.result_dtype - upcast_scale = bool(use_quantized_matmul and use_tensorwise_fp8_matmul and module.sdnq_dequantizer.weights_dtype in {"float8_e4m3fn", "float8_e5m2"}) + upcast_scale = bool(use_tensorwise_fp8_matmul and module.sdnq_dequantizer.weights_dtype in {"float8_e4m3fn", "float8_e5m2"} and (use_quantized_matmul or (use_quantized_matmul is None and module.sdnq_dequantizer.use_quantized_matmul))) if upcast_scale: module.scale.data = module.scale.to(dtype=torch.float32) @@ -60,7 +61,7 @@ def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bo module.svd_up.data = module.svd_up.to(dtype=scale_dtype) module.svd_down.data = module.svd_down.to(dtype=scale_dtype) - if use_quantized_matmul != module.sdnq_dequantizer.use_quantized_matmul: + if use_quantized_matmul is not None and use_quantized_matmul != module.sdnq_dequantizer.use_quantized_matmul: if module.sdnq_dequantizer.weights_dtype in {"int8", "float8_e4m3fn", "float8_e5m2"}: if use_quantized_matmul and module.sdnq_dequantizer.re_quantize_for_matmul: scale_dtype = module.scale.dtype From 18f6ebb3f16e76a4cb619f7ff6fb04c0788c2da6 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 17:39:42 -0400 Subject: [PATCH 161/230] update modernui Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index e58d96e26..85ab79ed0 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit e58d96e26290960e1df35d0e012c5e50b4e6a606 +Subproject commit 85ab79ed0f8a9c8484e2b2372d745527ebc84e7d From d012ad5556fc63bf322955a9e52b5279b7bf1fe8 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 17:59:38 -0400 Subject: [PATCH 162/230] image viewer refocus on close Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + extensions-builtin/sdnext-modernui | 2 +- javascript/imageViewer.js | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ceb6ff539..b2d4023e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,6 +120,7 @@ - reference: fix download for sd15/sdxl reference models - fix checks in init/mask image decode - fix hf token with extra chars + - image viewer refocus on gallery after returning from full screen mode ## Update for 2025-09-15 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 85ab79ed0..39277a468 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 85ab79ed0f8a9c8484e2b2372d745527ebc84e7d +Subproject commit 39277a4688473e1e5fdb8a6173c8ded28c0439e1 diff --git a/javascript/imageViewer.js b/javascript/imageViewer.js index 5631c173b..e7eaca7a8 100644 --- a/javascript/imageViewer.js +++ b/javascript/imageViewer.js @@ -15,11 +15,20 @@ function cycleImageFit() { log('cycleImageFit', current, next); } +function isInViewport(element) { + const rect = element.getBoundingClientRect(); + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth); +} + function closeModal(evt, force = false) { if (force) gradioApp().getElementById('lightboxModal').style.display = 'none'; if (previewDrag) return; if (evt?.button !== 0) return; gradioApp().getElementById('lightboxModal').style.display = 'none'; + let thumbnails = Array.from(gradioApp().querySelectorAll('.thumbnails .thumbnail-item')); + thumbnails = thumbnails.filter((el) => el.checkVisibility()); + if (thumbnails.length === 0) return; + thumbnails[0].focus(); } function modalImageSwitch(offset) { From 1cd7b6d63a14b98f057694b7c66c302d83984e11 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 7 Oct 2025 01:27:49 +0300 Subject: [PATCH 163/230] fix upcast scale check --- modules/sdnq/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 79cd26054..92f784aaa 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -49,7 +49,7 @@ def apply_options_to_model(model, dtype: torch.dtype = None, dequantize_fp32: bo current_scale_dtype = module.svd_up.dtype if module.svd_up is not None else module.scale.dtype scale_dtype = torch.float32 if dequantize_fp32 is None and current_scale_dtype == torch.float32 else torch.float32 if dequantize_fp32 else module.sdnq_dequantizer.result_dtype - upcast_scale = bool(use_tensorwise_fp8_matmul and module.sdnq_dequantizer.weights_dtype in {"float8_e4m3fn", "float8_e5m2"} and (use_quantized_matmul or (use_quantized_matmul is None and module.sdnq_dequantizer.use_quantized_matmul))) + upcast_scale = bool(not use_tensorwise_fp8_matmul and module.sdnq_dequantizer.weights_dtype in {"float8_e4m3fn", "float8_e5m2"} and (use_quantized_matmul or (use_quantized_matmul is None and module.sdnq_dequantizer.use_quantized_matmul))) if upcast_scale: module.scale.data = module.scale.to(dtype=torch.float32) From 3fe1d090e4f0b5fe9aca88cda37acf616b8732df Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 19:13:29 -0400 Subject: [PATCH 164/230] add configurable layers to taehv Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 +++++---- modules/sd_vae_taesd.py | 4 +++- modules/taesd/taehv.py | 34 +++++++++++++++++++++++++++------- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2d4023e3..c4d78920c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,10 +62,10 @@ - networks ability to filter lora by base model version - add interrogate button to input images - **SDNQ** - - add `SVDQuant` quantization method support - - make sdnq scales compatible with balanced offload - - add int8 matmul support for RDNA2 GPUs via triton - - improve int8 mamtul performance on Intel GPUs + - add `SVDQuant` quantization method support + - make sdnq scales compatible with balanced offload + - add int8 matmul support for RDNA2 GPUs via triton + - improve int8 mamtul performance on Intel GPUs - **Other** - server will note when restart is recommended due to package updates - **interrrupt** will now show last known preview image @@ -90,6 +90,7 @@ can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems - **nunchaku** update to `1.0.1` and enhance installer - **xyz-grid** add guidance section + - **preview** implement configurable layers for WAN, Qwen, HV - **Video** - use shared T5 text encoder for video models when possible - unified video save code across all video models diff --git a/modules/sd_vae_taesd.py b/modules/sd_vae_taesd.py index aed995f1b..510215855 100644 --- a/modules/sd_vae_taesd.py +++ b/modules/sd_vae_taesd.py @@ -79,6 +79,7 @@ def get_model(model_type = 'decoder', variant = None): uri += '/tae' + model_cls + '_' + model_type + '.pth' try: torch.hub.download_url_to_file(uri, fn) + shared.log.print() # new line shared.log.info(f'Decode: type="taesd" variant="{variant}": uri="{uri}" fn="{fn}" download') except Exception as e: warn_once(f'download uri={uri} {e}', variant=variant) @@ -86,7 +87,8 @@ def get_model(model_type = 'decoder', variant = None): prev_cls = model_cls prev_type = model_type prev_model = variant - shared.log.debug(f'Decode: type="taesd" variant="{variant}" fn="{fn}" load') + shared.log.print() # new line + shared.log.debug(f'Decode: type="taesd" variant="{variant}" fn="{fn}" layers={shared.opts.taesd_layers} load') vae = None if 'TAE HunyuanVideo' in variant: from modules.taesd.taehv import TAEHV diff --git a/modules/taesd/taehv.py b/modules/taesd/taehv.py index 0f1828e45..bfeced7a7 100644 --- a/modules/taesd/taehv.py +++ b/modules/taesd/taehv.py @@ -159,6 +159,7 @@ class TAEHV(nn.Module): decoder_space_upscale: whether spatial upsampling is enabled for each block. upsampling can be disabled for a cheaper preview. """ super().__init__() + from modules import shared self.encoder = nn.Sequential( conv(TAEHV.image_channels, 64), nn.ReLU(inplace=True), TPool(64, 2), conv(64, 64, stride=2, bias=False), MemBlock(64, 64), MemBlock(64, 64), MemBlock(64, 64), @@ -168,13 +169,32 @@ class TAEHV(nn.Module): ) n_f = [256, 128, 64, 64] self.frames_to_trim = 2**sum(decoder_time_upscale) - 1 - self.decoder = nn.Sequential( - Clamp(), conv(TAEHV.latent_channels, n_f[0]), nn.ReLU(inplace=True), - MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), nn.Upsample(scale_factor=2 if decoder_space_upscale[0] else 1), TGrow(n_f[0], 1), conv(n_f[0], n_f[1], bias=False), - MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), nn.Upsample(scale_factor=2 if decoder_space_upscale[1] else 1), TGrow(n_f[1], 2 if decoder_time_upscale[0] else 1), conv(n_f[1], n_f[2], bias=False), - MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), nn.Upsample(scale_factor=2 if decoder_space_upscale[2] else 1), TGrow(n_f[2], 2 if decoder_time_upscale[1] else 1), conv(n_f[2], n_f[3], bias=False), - nn.ReLU(inplace=True), conv(n_f[3], TAEHV.image_channels), - ) + + if shared.opts.taesd_layers == 1: + self.decoder = nn.Sequential( + Clamp(), conv(TAEHV.latent_channels, n_f[0]), nn.ReLU(inplace=True), + MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), nn.Upsample(scale_factor=2 if decoder_space_upscale[0] else 1), TGrow(n_f[0], 1), conv(n_f[0], n_f[1], bias=False), + MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), nn.Identity(), TGrow(n_f[1], 2 if decoder_time_upscale[0] else 1), conv(n_f[1], n_f[2], bias=False), + MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), nn.Identity(), TGrow(n_f[2], 2 if decoder_time_upscale[1] else 1), conv(n_f[2], n_f[3], bias=False), + nn.ReLU(inplace=True), conv(n_f[3], TAEHV.image_channels), + ) + elif shared.opts.taesd_layers == 2: + self.decoder = nn.Sequential( + Clamp(), conv(TAEHV.latent_channels, n_f[0]), nn.ReLU(inplace=True), + MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), nn.Upsample(scale_factor=2 if decoder_space_upscale[0] else 1), TGrow(n_f[0], 1), conv(n_f[0], n_f[1], bias=False), + MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), nn.Upsample(scale_factor=2 if decoder_space_upscale[1] else 1), TGrow(n_f[1], 2 if decoder_time_upscale[0] else 1), conv(n_f[1], n_f[2], bias=False), + MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), nn.Identity(), TGrow(n_f[2], 2 if decoder_time_upscale[1] else 1), conv(n_f[2], n_f[3], bias=False), + nn.ReLU(inplace=True), conv(n_f[3], TAEHV.image_channels), + ) + else: + self.decoder = nn.Sequential( + Clamp(), conv(TAEHV.latent_channels, n_f[0]), nn.ReLU(inplace=True), + MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), MemBlock(n_f[0], n_f[0]), nn.Upsample(scale_factor=2 if decoder_space_upscale[0] else 1), TGrow(n_f[0], 1), conv(n_f[0], n_f[1], bias=False), + MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), MemBlock(n_f[1], n_f[1]), nn.Upsample(scale_factor=2 if decoder_space_upscale[1] else 1), TGrow(n_f[1], 2 if decoder_time_upscale[0] else 1), conv(n_f[1], n_f[2], bias=False), + MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), MemBlock(n_f[2], n_f[2]), nn.Upsample(scale_factor=2 if decoder_space_upscale[2] else 1), TGrow(n_f[2], 2 if decoder_time_upscale[1] else 1), conv(n_f[2], n_f[3], bias=False), + nn.ReLU(inplace=True), conv(n_f[3], TAEHV.image_channels), + ) + if checkpoint_path is not None: self.load_state_dict(self.patch_tgrow_layers(torch.load(checkpoint_path, map_location="cpu", weights_only=True))) From fc472f3f3a90de9b3c6fce3390f402ea973d9a18 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 20:20:46 -0400 Subject: [PATCH 165/230] reinstall if torch-cpu and use-cuda or use-rocm Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + installer.py | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d78920c..a707ffb6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` - command line params `--use-zluda` and `--use-rocm` will attempt desired operation or fail if not possible previously sdnext was performing a fallback to `torch-cpu` which is not desired + - if `--use-cuda` or `--use-rocm` are specified and `torch-cpu` is installed, installer will attempt to reinstall correct torch package - **installer**: warn if cuda or rocm are available and `torch-cpu` is installed - **Extensions** - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) diff --git a/installer.py b/installer.py index 63e678bef..55b198ff8 100644 --- a/installer.py +++ b/installer.py @@ -953,9 +953,19 @@ def check_torch(): pass if 'cpu' in torch.__version__: if is_cuda_available: - log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is available - consider reinstalling') + if args.use_cuda: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is selected - reinstalling') + uninstall(['torch', 'torchvision'], quiet=True) + install(torch_command, 'torch torchvision', quiet=True) # foce reinstall + else: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is available - consider reinstalling') elif is_rocm_available: - log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is available - consider reinstalling') + if args.use_rocm: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is selected - reinstalling') + uninstall(['torch', 'torchvision'], quiet=True) + install(torch_command, 'torch torchvision', quiet=True) # foce reinstall + else: + log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is available - consider reinstalling') if hasattr(torch, "xpu") and torch.xpu.is_available() and allow_ipex: if shutil.which('icpx') is not None: log.info(f'{os.popen("icpx --version").read().rstrip()}') From 0889d7227ec6de2c23e4f1bec61a5657f390e2fe Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 20:31:20 -0400 Subject: [PATCH 166/230] add force to pip flags Signed-off-by: Vladimir Mandic --- installer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/installer.py b/installer.py index 55b198ff8..95a007198 100644 --- a/installer.py +++ b/installer.py @@ -955,15 +955,13 @@ def check_torch(): if is_cuda_available: if args.use_cuda: log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is selected - reinstalling') - uninstall(['torch', 'torchvision'], quiet=True) - install(torch_command, 'torch torchvision', quiet=True) # foce reinstall + install(torch_command, 'torch torchvision', quiet=True, reinstall=True, force=True) # foce reinstall else: log.warning(f'Torch: version="{torch.__version__}" CPU version installed and CUDA is available - consider reinstalling') elif is_rocm_available: if args.use_rocm: log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is selected - reinstalling') - uninstall(['torch', 'torchvision'], quiet=True) - install(torch_command, 'torch torchvision', quiet=True) # foce reinstall + install(torch_command, 'torch torchvision', quiet=True, reinstall=True, force=True) # foce reinstall else: log.warning(f'Torch: version="{torch.__version__}" CPU version installed and ROCm is available - consider reinstalling') if hasattr(torch, "xpu") and torch.xpu.is_available() and allow_ipex: From 8e7ff0981134ec0a281b6df951332a88af5f4765 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 6 Oct 2025 20:54:48 -0400 Subject: [PATCH 167/230] fix sm dependency mess Signed-off-by: Vladimir Mandic --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 6ca4153e9..f41e599e2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -51,6 +51,7 @@ pandas==2.3.1 numba==0.61.2 protobuf==4.25.3 pytorch_lightning==2.5.5 +PyWavelets==1.9.0 urllib3==1.26.19 Pillow==10.4.0 timm==1.0.16 From fe41d7da2ac455083b60633e6b1e9acfb3e8f839 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 08:14:11 -0400 Subject: [PATCH 168/230] use shared llama Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/video_models/video_load.py | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a707ffb6a..5032207d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,7 +93,8 @@ - **xyz-grid** add guidance section - **preview** implement configurable layers for WAN, Qwen, HV - **Video** - - use shared T5 text encoder for video models when possible + - use shared **T5** text encoder for video models when possible + - use shared **LLama** text encoder for video models when possible - unified video save code across all video models also avoids creation of temporary files for each frame unless user wants to save them - unified prompt enhance code across all video models diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index 55e57647f..e8d616c69 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -25,10 +25,17 @@ def load_model(selected: models_def.Model): # text encoder try: load_args, quant_args = model_quant.get_dit_args({}, module='TE', device_map=True) + + # loader deduplication of text-encoder models if selected.te_cls.__name__ == 'T5EncoderModel' and shared.opts.te_shared_t5: selected.te = 'Disty0/t5-xxl' selected.te_folder = '' selected.te_revision = None + if selected.te_cls.__name__ == 'LlamaModel' and shared.opts.te_shared_t5: + selected.te = 'hunyuanvideo-community/HunyuanVideo' + selected.te_folder = 'text_encoder' + selected.te_revision = None + shared.log.debug(f'Video load: module=te repo="{selected.te or selected.repo}" folder="{selected.te_folder}" cls={selected.te_cls.__name__} quant={model_quant.get_quant_type(quant_args)}') kwargs["text_encoder"] = selected.te_cls.from_pretrained( pretrained_model_name_or_path=selected.te or selected.repo, From 25e28050c370061eec2bc7040aef4e5a6e8145ee Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 08:21:05 -0400 Subject: [PATCH 169/230] update swagger docs Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + html/swagger.css | 11351 ++++++++++++++++++++++++++++++++++++++---- modules/api/docs.py | 25 +- 3 files changed, 10504 insertions(+), 873 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5032207d4..d4f1ed331 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -92,6 +92,7 @@ - **nunchaku** update to `1.0.1` and enhance installer - **xyz-grid** add guidance section - **preview** implement configurable layers for WAN, Qwen, HV + - update swagger `/docs` endpoint style - **Video** - use shared **T5** text encoder for video models when possible - use shared **LLama** text encoder for video models when possible diff --git a/html/swagger.css b/html/swagger.css index 77a578923..ea5bc261b 100644 --- a/html/swagger.css +++ b/html/swagger.css @@ -1,868 +1,10499 @@ -.opblock { - border-width: 0 !important; -} -.opblock-summary-operation-id { - display: none !important; -} -.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type { - font-size: 14px; - color: white; +html { + background-color: #aaa; } -.swagger-ui .json-schema-2020-12-keyword__name--primary { - color: aqua; +.swagger-ui { + color: #3b4151; + font-family: system-ui, sans-serif; +} + +.swagger-ui body { + margin: 0; +} + +.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section { + display: block +} + +.swagger-ui h1 { + font-size: 2em; + margin: .67em 0 +} + +.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main { + display: block +} + +.swagger-ui figure { + margin: 1em 40px +} + +.swagger-ui hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +.swagger-ui pre { + font-family: monospace,monospace; + font-size: 1em +} + +.swagger-ui a { + background-color: transparent; + -webkit-text-decoration-skip: objects +} + +.swagger-ui abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted +} + +.swagger-ui b,.swagger-ui strong { + font-weight: inherit; + font-weight: bolder +} + +.swagger-ui code,.swagger-ui kbd,.swagger-ui samp { + font-family: monospace,monospace; + font-size: 1em +} + +.swagger-ui dfn { + font-style: italic +} + +.swagger-ui mark { + background-color: #ff0; + color: #000 +} + +.swagger-ui small { + font-size: 80% +} + +.swagger-ui sub,.swagger-ui sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +.swagger-ui sub { + bottom: -.25em +} + +.swagger-ui sup { + top: -.5em +} + +.swagger-ui audio,.swagger-ui video { + display: inline-block +} + +.swagger-ui audio:not([controls]) { + display: none; + height: 0 +} + +.swagger-ui svg:not(:root) { + overflow: hidden +} + +.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +.swagger-ui button,.swagger-ui input { + overflow: visible +} + +.swagger-ui button,.swagger-ui select { + text-transform: none +} + +.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button] { + -webkit-appearance: button +} + +.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner { + padding: 0 +} + +.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring { + outline: 1px dotted ButtonText +} + +.swagger-ui fieldset { + padding: .35em .75em .625em +} + +.swagger-ui legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +.swagger-ui progress { + display: inline-block; + vertical-align: baseline +} + +.swagger-ui textarea { + overflow: auto +} + +.swagger-ui [type=checkbox],.swagger-ui [type=radio] { + box-sizing: border-box; + padding: 0 +} + +.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button { + height: auto +} + +.swagger-ui [type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +.swagger-ui ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +.swagger-ui details,.swagger-ui menu { + display: block +} + +.swagger-ui summary { + display: list-item +} + +.swagger-ui canvas { + display: inline-block +} + +.swagger-ui [hidden],.swagger-ui template { + display: none +} + +.swagger-ui .debug * { + outline: 1px solid gold +} + +.swagger-ui .debug-white * { + outline: 1px solid #fff +} + +.swagger-ui .debug-black * { + outline: 1px solid #000 +} + +.swagger-ui .debug-grid { + background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0 +} + +.swagger-ui .debug-grid-16 { + background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0 +} + +.swagger-ui .debug-grid-8-solid { + background: #fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0 +} + +.swagger-ui .debug-grid-16-solid { + background: #fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0 +} + +.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul { + box-sizing: border-box +} + +.swagger-ui .aspect-ratio { + height: 0; + position: relative +} + +.swagger-ui .aspect-ratio--16x9 { + padding-bottom: 56.25% +} + +.swagger-ui .aspect-ratio--9x16 { + padding-bottom: 177.77% +} + +.swagger-ui .aspect-ratio--4x3 { + padding-bottom: 75% +} + +.swagger-ui .aspect-ratio--3x4 { + padding-bottom: 133.33% +} + +.swagger-ui .aspect-ratio--6x4 { + padding-bottom: 66.6% +} + +.swagger-ui .aspect-ratio--4x6 { + padding-bottom: 150% +} + +.swagger-ui .aspect-ratio--8x5 { + padding-bottom: 62.5% +} + +.swagger-ui .aspect-ratio--5x8 { + padding-bottom: 160% +} + +.swagger-ui .aspect-ratio--7x5 { + padding-bottom: 71.42% +} + +.swagger-ui .aspect-ratio--5x7 { + padding-bottom: 140% +} + +.swagger-ui .aspect-ratio--1x1 { + padding-bottom: 100% +} + +.swagger-ui .aspect-ratio--object { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100 +} + +@media screen and (min-width: 30em) { + .swagger-ui .aspect-ratio-ns { + height:0; + position: relative + } + + .swagger-ui .aspect-ratio--16x9-ns { + padding-bottom: 56.25% + } + + .swagger-ui .aspect-ratio--9x16-ns { + padding-bottom: 177.77% + } + + .swagger-ui .aspect-ratio--4x3-ns { + padding-bottom: 75% + } + + .swagger-ui .aspect-ratio--3x4-ns { + padding-bottom: 133.33% + } + + .swagger-ui .aspect-ratio--6x4-ns { + padding-bottom: 66.6% + } + + .swagger-ui .aspect-ratio--4x6-ns { + padding-bottom: 150% + } + + .swagger-ui .aspect-ratio--8x5-ns { + padding-bottom: 62.5% + } + + .swagger-ui .aspect-ratio--5x8-ns { + padding-bottom: 160% + } + + .swagger-ui .aspect-ratio--7x5-ns { + padding-bottom: 71.42% + } + + .swagger-ui .aspect-ratio--5x7-ns { + padding-bottom: 140% + } + + .swagger-ui .aspect-ratio--1x1-ns { + padding-bottom: 100% + } + + .swagger-ui .aspect-ratio--object-ns { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100 + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .aspect-ratio-m { + height:0; + position: relative + } + + .swagger-ui .aspect-ratio--16x9-m { + padding-bottom: 56.25% + } + + .swagger-ui .aspect-ratio--9x16-m { + padding-bottom: 177.77% + } + + .swagger-ui .aspect-ratio--4x3-m { + padding-bottom: 75% + } + + .swagger-ui .aspect-ratio--3x4-m { + padding-bottom: 133.33% + } + + .swagger-ui .aspect-ratio--6x4-m { + padding-bottom: 66.6% + } + + .swagger-ui .aspect-ratio--4x6-m { + padding-bottom: 150% + } + + .swagger-ui .aspect-ratio--8x5-m { + padding-bottom: 62.5% + } + + .swagger-ui .aspect-ratio--5x8-m { + padding-bottom: 160% + } + + .swagger-ui .aspect-ratio--7x5-m { + padding-bottom: 71.42% + } + + .swagger-ui .aspect-ratio--5x7-m { + padding-bottom: 140% + } + + .swagger-ui .aspect-ratio--1x1-m { + padding-bottom: 100% + } + + .swagger-ui .aspect-ratio--object-m { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100 + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .aspect-ratio-l { + height:0; + position: relative + } + + .swagger-ui .aspect-ratio--16x9-l { + padding-bottom: 56.25% + } + + .swagger-ui .aspect-ratio--9x16-l { + padding-bottom: 177.77% + } + + .swagger-ui .aspect-ratio--4x3-l { + padding-bottom: 75% + } + + .swagger-ui .aspect-ratio--3x4-l { + padding-bottom: 133.33% + } + + .swagger-ui .aspect-ratio--6x4-l { + padding-bottom: 66.6% + } + + .swagger-ui .aspect-ratio--4x6-l { + padding-bottom: 150% + } + + .swagger-ui .aspect-ratio--8x5-l { + padding-bottom: 62.5% + } + + .swagger-ui .aspect-ratio--5x8-l { + padding-bottom: 160% + } + + .swagger-ui .aspect-ratio--7x5-l { + padding-bottom: 71.42% + } + + .swagger-ui .aspect-ratio--5x7-l { + padding-bottom: 140% + } + + .swagger-ui .aspect-ratio--1x1-l { + padding-bottom: 100% + } + + .swagger-ui .aspect-ratio--object-l { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100 + } +} + +.swagger-ui img { + max-width: 100% +} + +.swagger-ui .cover { + background-size: cover!important +} + +.swagger-ui .contain { + background-size: contain!important +} + +@media screen and (min-width: 30em) { + .swagger-ui .cover-ns { + background-size:cover!important + } + + .swagger-ui .contain-ns { + background-size: contain!important + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .cover-m { + background-size:cover!important + } + + .swagger-ui .contain-m { + background-size: contain!important + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .cover-l { + background-size:cover!important + } + + .swagger-ui .contain-l { + background-size: contain!important + } +} + +.swagger-ui .bg-center { + background-position: 50%; + background-repeat: no-repeat +} + +.swagger-ui .bg-top { + background-position: top; + background-repeat: no-repeat +} + +.swagger-ui .bg-right { + background-position: 100%; + background-repeat: no-repeat +} + +.swagger-ui .bg-bottom { + background-position: bottom; + background-repeat: no-repeat +} + +.swagger-ui .bg-left { + background-position: 0; + background-repeat: no-repeat +} + +@media screen and (min-width: 30em) { + .swagger-ui .bg-center-ns { + background-position:50%; + background-repeat: no-repeat + } + + .swagger-ui .bg-top-ns { + background-position: top; + background-repeat: no-repeat + } + + .swagger-ui .bg-right-ns { + background-position: 100%; + background-repeat: no-repeat + } + + .swagger-ui .bg-bottom-ns { + background-position: bottom; + background-repeat: no-repeat + } + + .swagger-ui .bg-left-ns { + background-position: 0; + background-repeat: no-repeat + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .bg-center-m { + background-position:50%; + background-repeat: no-repeat + } + + .swagger-ui .bg-top-m { + background-position: top; + background-repeat: no-repeat + } + + .swagger-ui .bg-right-m { + background-position: 100%; + background-repeat: no-repeat + } + + .swagger-ui .bg-bottom-m { + background-position: bottom; + background-repeat: no-repeat + } + + .swagger-ui .bg-left-m { + background-position: 0; + background-repeat: no-repeat + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .bg-center-l { + background-position:50%; + background-repeat: no-repeat + } + + .swagger-ui .bg-top-l { + background-position: top; + background-repeat: no-repeat + } + + .swagger-ui .bg-right-l { + background-position: 100%; + background-repeat: no-repeat + } + + .swagger-ui .bg-bottom-l { + background-position: bottom; + background-repeat: no-repeat + } + + .swagger-ui .bg-left-l { + background-position: 0; + background-repeat: no-repeat + } +} + +.swagger-ui .pre { + overflow-x: auto; + overflow-y: hidden; + overflow: scroll +} + +.swagger-ui .top-0 { + top: 0 +} + +.swagger-ui .right-0 { + right: 0 +} + +.swagger-ui .bottom-0 { + bottom: 0 +} + +.swagger-ui .left-0 { + left: 0 +} + +.swagger-ui .top-1 { + top: 1rem +} + +.swagger-ui .right-1 { + right: 1rem +} + +.swagger-ui .bottom-1 { + bottom: 1rem +} + +.swagger-ui .left-1 { + left: 1rem +} + +.swagger-ui .top-2 { + top: 2rem +} + +.swagger-ui .right-2 { + right: 2rem +} + +.swagger-ui .bottom-2 { + bottom: 2rem +} + +.swagger-ui .left-2 { + left: 2rem +} + +.swagger-ui .top--1 { + top: -1rem +} + +.swagger-ui .right--1 { + right: -1rem +} + +.swagger-ui .bottom--1 { + bottom: -1rem +} + +.swagger-ui .left--1 { + left: -1rem +} + +.swagger-ui .top--2 { + top: -2rem +} + +.swagger-ui .right--2 { + right: -2rem +} + +.swagger-ui .bottom--2 { + bottom: -2rem +} + +.swagger-ui .left--2 { + left: -2rem +} + +.swagger-ui .absolute--fill { + bottom: 0; + left: 0; + right: 0; + top: 0 +} + +@media screen and (min-width: 30em) { + .swagger-ui .top-0-ns { + top:0 + } + + .swagger-ui .left-0-ns { + left: 0 + } + + .swagger-ui .right-0-ns { + right: 0 + } + + .swagger-ui .bottom-0-ns { + bottom: 0 + } + + .swagger-ui .top-1-ns { + top: 1rem + } + + .swagger-ui .left-1-ns { + left: 1rem + } + + .swagger-ui .right-1-ns { + right: 1rem + } + + .swagger-ui .bottom-1-ns { + bottom: 1rem + } + + .swagger-ui .top-2-ns { + top: 2rem + } + + .swagger-ui .left-2-ns { + left: 2rem + } + + .swagger-ui .right-2-ns { + right: 2rem + } + + .swagger-ui .bottom-2-ns { + bottom: 2rem + } + + .swagger-ui .top--1-ns { + top: -1rem + } + + .swagger-ui .right--1-ns { + right: -1rem + } + + .swagger-ui .bottom--1-ns { + bottom: -1rem + } + + .swagger-ui .left--1-ns { + left: -1rem + } + + .swagger-ui .top--2-ns { + top: -2rem + } + + .swagger-ui .right--2-ns { + right: -2rem + } + + .swagger-ui .bottom--2-ns { + bottom: -2rem + } + + .swagger-ui .left--2-ns { + left: -2rem + } + + .swagger-ui .absolute--fill-ns { + bottom: 0; + left: 0; + right: 0; + top: 0 + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .top-0-m { + top:0 + } + + .swagger-ui .left-0-m { + left: 0 + } + + .swagger-ui .right-0-m { + right: 0 + } + + .swagger-ui .bottom-0-m { + bottom: 0 + } + + .swagger-ui .top-1-m { + top: 1rem + } + + .swagger-ui .left-1-m { + left: 1rem + } + + .swagger-ui .right-1-m { + right: 1rem + } + + .swagger-ui .bottom-1-m { + bottom: 1rem + } + + .swagger-ui .top-2-m { + top: 2rem + } + + .swagger-ui .left-2-m { + left: 2rem + } + + .swagger-ui .right-2-m { + right: 2rem + } + + .swagger-ui .bottom-2-m { + bottom: 2rem + } + + .swagger-ui .top--1-m { + top: -1rem + } + + .swagger-ui .right--1-m { + right: -1rem + } + + .swagger-ui .bottom--1-m { + bottom: -1rem + } + + .swagger-ui .left--1-m { + left: -1rem + } + + .swagger-ui .top--2-m { + top: -2rem + } + + .swagger-ui .right--2-m { + right: -2rem + } + + .swagger-ui .bottom--2-m { + bottom: -2rem + } + + .swagger-ui .left--2-m { + left: -2rem + } + + .swagger-ui .absolute--fill-m { + bottom: 0; + left: 0; + right: 0; + top: 0 + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .top-0-l { + top:0 + } + + .swagger-ui .left-0-l { + left: 0 + } + + .swagger-ui .right-0-l { + right: 0 + } + + .swagger-ui .bottom-0-l { + bottom: 0 + } + + .swagger-ui .top-1-l { + top: 1rem + } + + .swagger-ui .left-1-l { + left: 1rem + } + + .swagger-ui .right-1-l { + right: 1rem + } + + .swagger-ui .bottom-1-l { + bottom: 1rem + } + + .swagger-ui .top-2-l { + top: 2rem + } + + .swagger-ui .left-2-l { + left: 2rem + } + + .swagger-ui .right-2-l { + right: 2rem + } + + .swagger-ui .bottom-2-l { + bottom: 2rem + } + + .swagger-ui .top--1-l { + top: -1rem + } + + .swagger-ui .right--1-l { + right: -1rem + } + + .swagger-ui .bottom--1-l { + bottom: -1rem + } + + .swagger-ui .left--1-l { + left: -1rem + } + + .swagger-ui .top--2-l { + top: -2rem + } + + .swagger-ui .right--2-l { + right: -2rem + } + + .swagger-ui .bottom--2-l { + bottom: -2rem + } + + .swagger-ui .left--2-l { + left: -2rem + } + + .swagger-ui .absolute--fill-l { + bottom: 0; + left: 0; + right: 0; + top: 0 + } +} + +.swagger-ui .cf:after,.swagger-ui .cf:before { + content: " "; + display: table +} + +.swagger-ui .cf:after { + clear: both +} + +.swagger-ui .cf { + zoom:1} + +.swagger-ui .cl { + clear: left +} + +.swagger-ui .cr { + clear: right +} + +.swagger-ui .cb { + clear: both +} + +.swagger-ui .cn { + clear: none +} + +@media screen and (min-width: 30em) { + .swagger-ui .cl-ns { + clear:left + } + + .swagger-ui .cr-ns { + clear: right + } + + .swagger-ui .cb-ns { + clear: both + } + + .swagger-ui .cn-ns { + clear: none + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .cl-m { + clear:left + } + + .swagger-ui .cr-m { + clear: right + } + + .swagger-ui .cb-m { + clear: both + } + + .swagger-ui .cn-m { + clear: none + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .cl-l { + clear:left + } + + .swagger-ui .cr-l { + clear: right + } + + .swagger-ui .cb-l { + clear: both + } + + .swagger-ui .cn-l { + clear: none + } +} + +.swagger-ui .flex { + display: flex +} + +.swagger-ui .inline-flex { + display: inline-flex +} + +.swagger-ui .flex-auto { + flex: 1 1 auto; + min-height: 0; + min-width: 0 +} + +.swagger-ui .flex-none { + flex: none +} + +.swagger-ui .flex-column { + flex-direction: column +} + +.swagger-ui .flex-row { + flex-direction: row +} + +.swagger-ui .flex-wrap { + flex-wrap: wrap +} + +.swagger-ui .flex-nowrap { + flex-wrap: nowrap +} + +.swagger-ui .flex-wrap-reverse { + flex-wrap: wrap-reverse +} + +.swagger-ui .flex-column-reverse { + flex-direction: column-reverse +} + +.swagger-ui .flex-row-reverse { + flex-direction: row-reverse +} + +.swagger-ui .items-start { + align-items: flex-start +} + +.swagger-ui .items-end { + align-items: flex-end +} + +.swagger-ui .items-center { + align-items: center +} + +.swagger-ui .items-baseline { + align-items: baseline +} + +.swagger-ui .items-stretch { + align-items: stretch +} + +.swagger-ui .self-start { + align-self: flex-start +} + +.swagger-ui .self-end { + align-self: flex-end +} + +.swagger-ui .self-center { + align-self: center +} + +.swagger-ui .self-baseline { + align-self: baseline +} + +.swagger-ui .self-stretch { + align-self: stretch +} + +.swagger-ui .justify-start { + justify-content: flex-start +} + +.swagger-ui .justify-end { + justify-content: flex-end +} + +.swagger-ui .justify-center { + justify-content: center +} + +.swagger-ui .justify-between { + justify-content: space-between +} + +.swagger-ui .justify-around { + justify-content: space-around +} + +.swagger-ui .content-start { + align-content: flex-start +} + +.swagger-ui .content-end { + align-content: flex-end +} + +.swagger-ui .content-center { + align-content: center +} + +.swagger-ui .content-between { + align-content: space-between +} + +.swagger-ui .content-around { + align-content: space-around +} + +.swagger-ui .content-stretch { + align-content: stretch +} + +.swagger-ui .order-0 { + order: 0 +} + +.swagger-ui .order-1 { + order: 1 +} + +.swagger-ui .order-2 { + order: 2 +} + +.swagger-ui .order-3 { + order: 3 +} + +.swagger-ui .order-4 { + order: 4 +} + +.swagger-ui .order-5 { + order: 5 +} + +.swagger-ui .order-6 { + order: 6 +} + +.swagger-ui .order-7 { + order: 7 +} + +.swagger-ui .order-8 { + order: 8 +} + +.swagger-ui .order-last { + order: 99999 +} + +.swagger-ui .flex-grow-0 { + flex-grow: 0 +} + +.swagger-ui .flex-grow-1 { + flex-grow: 1 +} + +.swagger-ui .flex-shrink-0 { + flex-shrink: 0 +} + +.swagger-ui .flex-shrink-1 { + flex-shrink: 1 +} + +@media screen and (min-width: 30em) { + .swagger-ui .flex-ns { + display:flex + } + + .swagger-ui .inline-flex-ns { + display: inline-flex + } + + .swagger-ui .flex-auto-ns { + flex: 1 1 auto; + min-height: 0; + min-width: 0 + } + + .swagger-ui .flex-none-ns { + flex: none + } + + .swagger-ui .flex-column-ns { + flex-direction: column + } + + .swagger-ui .flex-row-ns { + flex-direction: row + } + + .swagger-ui .flex-wrap-ns { + flex-wrap: wrap + } + + .swagger-ui .flex-nowrap-ns { + flex-wrap: nowrap + } + + .swagger-ui .flex-wrap-reverse-ns { + flex-wrap: wrap-reverse + } + + .swagger-ui .flex-column-reverse-ns { + flex-direction: column-reverse + } + + .swagger-ui .flex-row-reverse-ns { + flex-direction: row-reverse + } + + .swagger-ui .items-start-ns { + align-items: flex-start + } + + .swagger-ui .items-end-ns { + align-items: flex-end + } + + .swagger-ui .items-center-ns { + align-items: center + } + + .swagger-ui .items-baseline-ns { + align-items: baseline + } + + .swagger-ui .items-stretch-ns { + align-items: stretch + } + + .swagger-ui .self-start-ns { + align-self: flex-start + } + + .swagger-ui .self-end-ns { + align-self: flex-end + } + + .swagger-ui .self-center-ns { + align-self: center + } + + .swagger-ui .self-baseline-ns { + align-self: baseline + } + + .swagger-ui .self-stretch-ns { + align-self: stretch + } + + .swagger-ui .justify-start-ns { + justify-content: flex-start + } + + .swagger-ui .justify-end-ns { + justify-content: flex-end + } + + .swagger-ui .justify-center-ns { + justify-content: center + } + + .swagger-ui .justify-between-ns { + justify-content: space-between + } + + .swagger-ui .justify-around-ns { + justify-content: space-around + } + + .swagger-ui .content-start-ns { + align-content: flex-start + } + + .swagger-ui .content-end-ns { + align-content: flex-end + } + + .swagger-ui .content-center-ns { + align-content: center + } + + .swagger-ui .content-between-ns { + align-content: space-between + } + + .swagger-ui .content-around-ns { + align-content: space-around + } + + .swagger-ui .content-stretch-ns { + align-content: stretch + } + + .swagger-ui .order-0-ns { + order: 0 + } + + .swagger-ui .order-1-ns { + order: 1 + } + + .swagger-ui .order-2-ns { + order: 2 + } + + .swagger-ui .order-3-ns { + order: 3 + } + + .swagger-ui .order-4-ns { + order: 4 + } + + .swagger-ui .order-5-ns { + order: 5 + } + + .swagger-ui .order-6-ns { + order: 6 + } + + .swagger-ui .order-7-ns { + order: 7 + } + + .swagger-ui .order-8-ns { + order: 8 + } + + .swagger-ui .order-last-ns { + order: 99999 + } + + .swagger-ui .flex-grow-0-ns { + flex-grow: 0 + } + + .swagger-ui .flex-grow-1-ns { + flex-grow: 1 + } + + .swagger-ui .flex-shrink-0-ns { + flex-shrink: 0 + } + + .swagger-ui .flex-shrink-1-ns { + flex-shrink: 1 + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .flex-m { + display:flex + } + + .swagger-ui .inline-flex-m { + display: inline-flex + } + + .swagger-ui .flex-auto-m { + flex: 1 1 auto; + min-height: 0; + min-width: 0 + } + + .swagger-ui .flex-none-m { + flex: none + } + + .swagger-ui .flex-column-m { + flex-direction: column + } + + .swagger-ui .flex-row-m { + flex-direction: row + } + + .swagger-ui .flex-wrap-m { + flex-wrap: wrap + } + + .swagger-ui .flex-nowrap-m { + flex-wrap: nowrap + } + + .swagger-ui .flex-wrap-reverse-m { + flex-wrap: wrap-reverse + } + + .swagger-ui .flex-column-reverse-m { + flex-direction: column-reverse + } + + .swagger-ui .flex-row-reverse-m { + flex-direction: row-reverse + } + + .swagger-ui .items-start-m { + align-items: flex-start + } + + .swagger-ui .items-end-m { + align-items: flex-end + } + + .swagger-ui .items-center-m { + align-items: center + } + + .swagger-ui .items-baseline-m { + align-items: baseline + } + + .swagger-ui .items-stretch-m { + align-items: stretch + } + + .swagger-ui .self-start-m { + align-self: flex-start + } + + .swagger-ui .self-end-m { + align-self: flex-end + } + + .swagger-ui .self-center-m { + align-self: center + } + + .swagger-ui .self-baseline-m { + align-self: baseline + } + + .swagger-ui .self-stretch-m { + align-self: stretch + } + + .swagger-ui .justify-start-m { + justify-content: flex-start + } + + .swagger-ui .justify-end-m { + justify-content: flex-end + } + + .swagger-ui .justify-center-m { + justify-content: center + } + + .swagger-ui .justify-between-m { + justify-content: space-between + } + + .swagger-ui .justify-around-m { + justify-content: space-around + } + + .swagger-ui .content-start-m { + align-content: flex-start + } + + .swagger-ui .content-end-m { + align-content: flex-end + } + + .swagger-ui .content-center-m { + align-content: center + } + + .swagger-ui .content-between-m { + align-content: space-between + } + + .swagger-ui .content-around-m { + align-content: space-around + } + + .swagger-ui .content-stretch-m { + align-content: stretch + } + + .swagger-ui .order-0-m { + order: 0 + } + + .swagger-ui .order-1-m { + order: 1 + } + + .swagger-ui .order-2-m { + order: 2 + } + + .swagger-ui .order-3-m { + order: 3 + } + + .swagger-ui .order-4-m { + order: 4 + } + + .swagger-ui .order-5-m { + order: 5 + } + + .swagger-ui .order-6-m { + order: 6 + } + + .swagger-ui .order-7-m { + order: 7 + } + + .swagger-ui .order-8-m { + order: 8 + } + + .swagger-ui .order-last-m { + order: 99999 + } + + .swagger-ui .flex-grow-0-m { + flex-grow: 0 + } + + .swagger-ui .flex-grow-1-m { + flex-grow: 1 + } + + .swagger-ui .flex-shrink-0-m { + flex-shrink: 0 + } + + .swagger-ui .flex-shrink-1-m { + flex-shrink: 1 + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .flex-l { + display:flex + } + + .swagger-ui .inline-flex-l { + display: inline-flex + } + + .swagger-ui .flex-auto-l { + flex: 1 1 auto; + min-height: 0; + min-width: 0 + } + + .swagger-ui .flex-none-l { + flex: none + } + + .swagger-ui .flex-column-l { + flex-direction: column + } + + .swagger-ui .flex-row-l { + flex-direction: row + } + + .swagger-ui .flex-wrap-l { + flex-wrap: wrap + } + + .swagger-ui .flex-nowrap-l { + flex-wrap: nowrap + } + + .swagger-ui .flex-wrap-reverse-l { + flex-wrap: wrap-reverse + } + + .swagger-ui .flex-column-reverse-l { + flex-direction: column-reverse + } + + .swagger-ui .flex-row-reverse-l { + flex-direction: row-reverse + } + + .swagger-ui .items-start-l { + align-items: flex-start + } + + .swagger-ui .items-end-l { + align-items: flex-end + } + + .swagger-ui .items-center-l { + align-items: center + } + + .swagger-ui .items-baseline-l { + align-items: baseline + } + + .swagger-ui .items-stretch-l { + align-items: stretch + } + + .swagger-ui .self-start-l { + align-self: flex-start + } + + .swagger-ui .self-end-l { + align-self: flex-end + } + + .swagger-ui .self-center-l { + align-self: center + } + + .swagger-ui .self-baseline-l { + align-self: baseline + } + + .swagger-ui .self-stretch-l { + align-self: stretch + } + + .swagger-ui .justify-start-l { + justify-content: flex-start + } + + .swagger-ui .justify-end-l { + justify-content: flex-end + } + + .swagger-ui .justify-center-l { + justify-content: center + } + + .swagger-ui .justify-between-l { + justify-content: space-between + } + + .swagger-ui .justify-around-l { + justify-content: space-around + } + + .swagger-ui .content-start-l { + align-content: flex-start + } + + .swagger-ui .content-end-l { + align-content: flex-end + } + + .swagger-ui .content-center-l { + align-content: center + } + + .swagger-ui .content-between-l { + align-content: space-between + } + + .swagger-ui .content-around-l { + align-content: space-around + } + + .swagger-ui .content-stretch-l { + align-content: stretch + } + + .swagger-ui .order-0-l { + order: 0 + } + + .swagger-ui .order-1-l { + order: 1 + } + + .swagger-ui .order-2-l { + order: 2 + } + + .swagger-ui .order-3-l { + order: 3 + } + + .swagger-ui .order-4-l { + order: 4 + } + + .swagger-ui .order-5-l { + order: 5 + } + + .swagger-ui .order-6-l { + order: 6 + } + + .swagger-ui .order-7-l { + order: 7 + } + + .swagger-ui .order-8-l { + order: 8 + } + + .swagger-ui .order-last-l { + order: 99999 + } + + .swagger-ui .flex-grow-0-l { + flex-grow: 0 + } + + .swagger-ui .flex-grow-1-l { + flex-grow: 1 + } + + .swagger-ui .flex-shrink-0-l { + flex-shrink: 0 + } + + .swagger-ui .flex-shrink-1-l { + flex-shrink: 1 + } +} + +.swagger-ui .dn { + display: none +} + +.swagger-ui .di { + display: inline +} + +.swagger-ui .db { + display: block +} + +.swagger-ui .dib { + display: inline-block +} + +.swagger-ui .dit { + display: inline-table +} + +.swagger-ui .dt { + display: table +} + +.swagger-ui .dtc { + display: table-cell +} + +.swagger-ui .dt-row { + display: table-row +} + +.swagger-ui .dt-row-group { + display: table-row-group +} + +.swagger-ui .dt-column { + display: table-column +} + +.swagger-ui .dt-column-group { + display: table-column-group +} + +.swagger-ui .dt--fixed { + table-layout: fixed; + width: 100% +} + +@media screen and (min-width: 30em) { + .swagger-ui .dn-ns { + display:none + } + + .swagger-ui .di-ns { + display: inline + } + + .swagger-ui .db-ns { + display: block + } + + .swagger-ui .dib-ns { + display: inline-block + } + + .swagger-ui .dit-ns { + display: inline-table + } + + .swagger-ui .dt-ns { + display: table + } + + .swagger-ui .dtc-ns { + display: table-cell + } + + .swagger-ui .dt-row-ns { + display: table-row + } + + .swagger-ui .dt-row-group-ns { + display: table-row-group + } + + .swagger-ui .dt-column-ns { + display: table-column + } + + .swagger-ui .dt-column-group-ns { + display: table-column-group + } + + .swagger-ui .dt--fixed-ns { + table-layout: fixed; + width: 100% + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .dn-m { + display:none + } + + .swagger-ui .di-m { + display: inline + } + + .swagger-ui .db-m { + display: block + } + + .swagger-ui .dib-m { + display: inline-block + } + + .swagger-ui .dit-m { + display: inline-table + } + + .swagger-ui .dt-m { + display: table + } + + .swagger-ui .dtc-m { + display: table-cell + } + + .swagger-ui .dt-row-m { + display: table-row + } + + .swagger-ui .dt-row-group-m { + display: table-row-group + } + + .swagger-ui .dt-column-m { + display: table-column + } + + .swagger-ui .dt-column-group-m { + display: table-column-group + } + + .swagger-ui .dt--fixed-m { + table-layout: fixed; + width: 100% + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .dn-l { + display:none + } + + .swagger-ui .di-l { + display: inline + } + + .swagger-ui .db-l { + display: block + } + + .swagger-ui .dib-l { + display: inline-block + } + + .swagger-ui .dit-l { + display: inline-table + } + + .swagger-ui .dt-l { + display: table + } + + .swagger-ui .dtc-l { + display: table-cell + } + + .swagger-ui .dt-row-l { + display: table-row + } + + .swagger-ui .dt-row-group-l { + display: table-row-group + } + + .swagger-ui .dt-column-l { + display: table-column + } + + .swagger-ui .dt-column-group-l { + display: table-column-group + } + + .swagger-ui .dt--fixed-l { + table-layout: fixed; + width: 100% + } +} + +.swagger-ui .fl { + _display: inline; + float: left +} + +.swagger-ui .fr { + _display: inline; + float: right +} + +.swagger-ui .fn { + float: none +} + +@media screen and (min-width: 30em) { + .swagger-ui .fl-ns { + _display:inline; + float: left + } + + .swagger-ui .fr-ns { + _display: inline; + float: right + } + + .swagger-ui .fn-ns { + float: none + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .fl-m { + _display:inline; + float: left + } + + .swagger-ui .fr-m { + _display: inline; + float: right + } + + .swagger-ui .fn-m { + float: none + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .fl-l { + _display:inline; + float: left + } + + .swagger-ui .fr-l { + _display: inline; + float: right + } + + .swagger-ui .fn-l { + float: none + } +} + +.swagger-ui .sans-serif { + font-family: -apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif +} + +.swagger-ui .serif { + font-family: georgia,serif +} + +.swagger-ui .system-sans-serif { + font-family: sans-serif +} + +.swagger-ui .system-serif { + font-family: serif +} + +.swagger-ui .code,.swagger-ui code { + font-family: Consolas,monaco,monospace +} + +.swagger-ui .courier { + font-family: Courier Next,courier,monospace +} + +.swagger-ui .helvetica { + font-family: helvetica neue,helvetica,sans-serif +} + +.swagger-ui .avenir { + font-family: avenir next,avenir,sans-serif +} + +.swagger-ui .athelas { + font-family: athelas,georgia,serif +} + +.swagger-ui .georgia { + font-family: georgia,serif +} + +.swagger-ui .times { + font-family: times,serif +} + +.swagger-ui .bodoni { + font-family: Bodoni MT,serif +} + +.swagger-ui .calisto { + font-family: Calisto MT,serif +} + +.swagger-ui .garamond { + font-family: garamond,serif +} + +.swagger-ui .baskerville { + font-family: baskerville,serif +} + +.swagger-ui .i { + font-style: italic +} + +.swagger-ui .fs-normal { + font-style: normal +} + +@media screen and (min-width: 30em) { + .swagger-ui .i-ns { + font-style:italic + } + + .swagger-ui .fs-normal-ns { + font-style: normal + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .i-m { + font-style:italic + } + + .swagger-ui .fs-normal-m { + font-style: normal + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .i-l { + font-style:italic + } + + .swagger-ui .fs-normal-l { + font-style: normal + } +} + +.swagger-ui .normal { + font-weight: 400 +} + +.swagger-ui .b { + font-weight: 700 +} + +.swagger-ui .fw1 { + font-weight: 100 +} + +.swagger-ui .fw2 { + font-weight: 200 +} + +.swagger-ui .fw3 { + font-weight: 300 +} + +.swagger-ui .fw4 { + font-weight: 400 +} + +.swagger-ui .fw5 { + font-weight: 500 +} + +.swagger-ui .fw6 { + font-weight: 600 +} + +.swagger-ui .fw7 { + font-weight: 700 +} + +.swagger-ui .fw8 { + font-weight: 800 +} + +.swagger-ui .fw9 { + font-weight: 900 +} + +@media screen and (min-width: 30em) { + .swagger-ui .normal-ns { + font-weight:400 + } + + .swagger-ui .b-ns { + font-weight: 700 + } + + .swagger-ui .fw1-ns { + font-weight: 100 + } + + .swagger-ui .fw2-ns { + font-weight: 200 + } + + .swagger-ui .fw3-ns { + font-weight: 300 + } + + .swagger-ui .fw4-ns { + font-weight: 400 + } + + .swagger-ui .fw5-ns { + font-weight: 500 + } + + .swagger-ui .fw6-ns { + font-weight: 600 + } + + .swagger-ui .fw7-ns { + font-weight: 700 + } + + .swagger-ui .fw8-ns { + font-weight: 800 + } + + .swagger-ui .fw9-ns { + font-weight: 900 + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .normal-m { + font-weight:400 + } + + .swagger-ui .b-m { + font-weight: 700 + } + + .swagger-ui .fw1-m { + font-weight: 100 + } + + .swagger-ui .fw2-m { + font-weight: 200 + } + + .swagger-ui .fw3-m { + font-weight: 300 + } + + .swagger-ui .fw4-m { + font-weight: 400 + } + + .swagger-ui .fw5-m { + font-weight: 500 + } + + .swagger-ui .fw6-m { + font-weight: 600 + } + + .swagger-ui .fw7-m { + font-weight: 700 + } + + .swagger-ui .fw8-m { + font-weight: 800 + } + + .swagger-ui .fw9-m { + font-weight: 900 + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .normal-l { + font-weight:400 + } + + .swagger-ui .b-l { + font-weight: 700 + } + + .swagger-ui .fw1-l { + font-weight: 100 + } + + .swagger-ui .fw2-l { + font-weight: 200 + } + + .swagger-ui .fw3-l { + font-weight: 300 + } + + .swagger-ui .fw4-l { + font-weight: 400 + } + + .swagger-ui .fw5-l { + font-weight: 500 + } + + .swagger-ui .fw6-l { + font-weight: 600 + } + + .swagger-ui .fw7-l { + font-weight: 700 + } + + .swagger-ui .fw8-l { + font-weight: 800 + } + + .swagger-ui .fw9-l { + font-weight: 900 + } +} + +.swagger-ui .input-reset { + -webkit-appearance: none; + -moz-appearance: none +} + +.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner { + padding: 0 +} + +.swagger-ui .h1 { + height: 1rem +} + +.swagger-ui .h2 { + height: 2rem +} + +.swagger-ui .h3 { + height: 4rem +} + +.swagger-ui .h4 { + height: 8rem +} + +.swagger-ui .h5 { + height: 16rem +} + +.swagger-ui .h-25 { + height: 25% +} + +.swagger-ui .h-50 { + height: 50% +} + +.swagger-ui .h-75 { + height: 75% +} + +.swagger-ui .h-100 { + height: 100% +} + +.swagger-ui .min-h-100 { + min-height: 100% +} + +.swagger-ui .vh-25 { + height: 25vh +} + +.swagger-ui .vh-50 { + height: 50vh +} + +.swagger-ui .vh-75 { + height: 75vh +} + +.swagger-ui .vh-100 { + height: 100vh +} + +.swagger-ui .min-vh-100 { + min-height: 100vh +} + +.swagger-ui .h-auto { + height: auto +} + +.swagger-ui .h-inherit { + height: inherit +} + +@media screen and (min-width: 30em) { + .swagger-ui .h1-ns { + height:1rem + } + + .swagger-ui .h2-ns { + height: 2rem + } + + .swagger-ui .h3-ns { + height: 4rem + } + + .swagger-ui .h4-ns { + height: 8rem + } + + .swagger-ui .h5-ns { + height: 16rem + } + + .swagger-ui .h-25-ns { + height: 25% + } + + .swagger-ui .h-50-ns { + height: 50% + } + + .swagger-ui .h-75-ns { + height: 75% + } + + .swagger-ui .h-100-ns { + height: 100% + } + + .swagger-ui .min-h-100-ns { + min-height: 100% + } + + .swagger-ui .vh-25-ns { + height: 25vh + } + + .swagger-ui .vh-50-ns { + height: 50vh + } + + .swagger-ui .vh-75-ns { + height: 75vh + } + + .swagger-ui .vh-100-ns { + height: 100vh + } + + .swagger-ui .min-vh-100-ns { + min-height: 100vh + } + + .swagger-ui .h-auto-ns { + height: auto + } + + .swagger-ui .h-inherit-ns { + height: inherit + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .h1-m { + height:1rem + } + + .swagger-ui .h2-m { + height: 2rem + } + + .swagger-ui .h3-m { + height: 4rem + } + + .swagger-ui .h4-m { + height: 8rem + } + + .swagger-ui .h5-m { + height: 16rem + } + + .swagger-ui .h-25-m { + height: 25% + } + + .swagger-ui .h-50-m { + height: 50% + } + + .swagger-ui .h-75-m { + height: 75% + } + + .swagger-ui .h-100-m { + height: 100% + } + + .swagger-ui .min-h-100-m { + min-height: 100% + } + + .swagger-ui .vh-25-m { + height: 25vh + } + + .swagger-ui .vh-50-m { + height: 50vh + } + + .swagger-ui .vh-75-m { + height: 75vh + } + + .swagger-ui .vh-100-m { + height: 100vh + } + + .swagger-ui .min-vh-100-m { + min-height: 100vh + } + + .swagger-ui .h-auto-m { + height: auto + } + + .swagger-ui .h-inherit-m { + height: inherit + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .h1-l { + height:1rem + } + + .swagger-ui .h2-l { + height: 2rem + } + + .swagger-ui .h3-l { + height: 4rem + } + + .swagger-ui .h4-l { + height: 8rem + } + + .swagger-ui .h5-l { + height: 16rem + } + + .swagger-ui .h-25-l { + height: 25% + } + + .swagger-ui .h-50-l { + height: 50% + } + + .swagger-ui .h-75-l { + height: 75% + } + + .swagger-ui .h-100-l { + height: 100% + } + + .swagger-ui .min-h-100-l { + min-height: 100% + } + + .swagger-ui .vh-25-l { + height: 25vh + } + + .swagger-ui .vh-50-l { + height: 50vh + } + + .swagger-ui .vh-75-l { + height: 75vh + } + + .swagger-ui .vh-100-l { + height: 100vh + } + + .swagger-ui .min-vh-100-l { + min-height: 100vh + } + + .swagger-ui .h-auto-l { + height: auto + } + + .swagger-ui .h-inherit-l { + height: inherit + } +} + +.swagger-ui .tracked { + letter-spacing: .1em +} + +.swagger-ui .tracked-tight { + letter-spacing: -.05em +} + +.swagger-ui .tracked-mega { + letter-spacing: .25em +} + +@media screen and (min-width: 30em) { + .swagger-ui .tracked-ns { + letter-spacing:.1em + } + + .swagger-ui .tracked-tight-ns { + letter-spacing: -.05em + } + + .swagger-ui .tracked-mega-ns { + letter-spacing: .25em + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .tracked-m { + letter-spacing:.1em + } + + .swagger-ui .tracked-tight-m { + letter-spacing: -.05em + } + + .swagger-ui .tracked-mega-m { + letter-spacing: .25em + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .tracked-l { + letter-spacing:.1em + } + + .swagger-ui .tracked-tight-l { + letter-spacing: -.05em + } + + .swagger-ui .tracked-mega-l { + letter-spacing: .25em + } +} + +.swagger-ui .lh-solid { + line-height: 1 +} + +.swagger-ui .lh-title { + line-height: 1.25 +} + +.swagger-ui .lh-copy { + line-height: 1.5 +} + +@media screen and (min-width: 30em) { + .swagger-ui .lh-solid-ns { + line-height:1 + } + + .swagger-ui .lh-title-ns { + line-height: 1.25 + } + + .swagger-ui .lh-copy-ns { + line-height: 1.5 + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .lh-solid-m { + line-height:1 + } + + .swagger-ui .lh-title-m { + line-height: 1.25 + } + + .swagger-ui .lh-copy-m { + line-height: 1.5 + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .lh-solid-l { + line-height:1 + } + + .swagger-ui .lh-title-l { + line-height: 1.25 + } + + .swagger-ui .lh-copy-l { + line-height: 1.5 + } +} + +.swagger-ui .link { + -webkit-text-decoration: none; + text-decoration: none +} + +.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited { + transition: color .15s ease-in +} + +.swagger-ui .link:focus { + outline: 1px dotted currentColor +} + +.swagger-ui .list { + list-style-type: none +} + +.swagger-ui .mw-100 { + max-width: 100% +} + +.swagger-ui .mw1 { + max-width: 1rem +} + +.swagger-ui .mw2 { + max-width: 2rem +} + +.swagger-ui .mw3 { + max-width: 4rem +} + +.swagger-ui .mw4 { + max-width: 8rem +} + +.swagger-ui .mw5 { + max-width: 16rem +} + +.swagger-ui .mw6 { + max-width: 32rem +} + +.swagger-ui .mw7 { + max-width: 48rem +} + +.swagger-ui .mw8 { + max-width: 64rem +} + +.swagger-ui .mw9 { + max-width: 96rem +} + +.swagger-ui .mw-none { + max-width: none +} + +@media screen and (min-width: 30em) { + .swagger-ui .mw-100-ns { + max-width:100% + } + + .swagger-ui .mw1-ns { + max-width: 1rem + } + + .swagger-ui .mw2-ns { + max-width: 2rem + } + + .swagger-ui .mw3-ns { + max-width: 4rem + } + + .swagger-ui .mw4-ns { + max-width: 8rem + } + + .swagger-ui .mw5-ns { + max-width: 16rem + } + + .swagger-ui .mw6-ns { + max-width: 32rem + } + + .swagger-ui .mw7-ns { + max-width: 48rem + } + + .swagger-ui .mw8-ns { + max-width: 64rem + } + + .swagger-ui .mw9-ns { + max-width: 96rem + } + + .swagger-ui .mw-none-ns { + max-width: none + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .mw-100-m { + max-width:100% + } + + .swagger-ui .mw1-m { + max-width: 1rem + } + + .swagger-ui .mw2-m { + max-width: 2rem + } + + .swagger-ui .mw3-m { + max-width: 4rem + } + + .swagger-ui .mw4-m { + max-width: 8rem + } + + .swagger-ui .mw5-m { + max-width: 16rem + } + + .swagger-ui .mw6-m { + max-width: 32rem + } + + .swagger-ui .mw7-m { + max-width: 48rem + } + + .swagger-ui .mw8-m { + max-width: 64rem + } + + .swagger-ui .mw9-m { + max-width: 96rem + } + + .swagger-ui .mw-none-m { + max-width: none + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .mw-100-l { + max-width:100% + } + + .swagger-ui .mw1-l { + max-width: 1rem + } + + .swagger-ui .mw2-l { + max-width: 2rem + } + + .swagger-ui .mw3-l { + max-width: 4rem + } + + .swagger-ui .mw4-l { + max-width: 8rem + } + + .swagger-ui .mw5-l { + max-width: 16rem + } + + .swagger-ui .mw6-l { + max-width: 32rem + } + + .swagger-ui .mw7-l { + max-width: 48rem + } + + .swagger-ui .mw8-l { + max-width: 64rem + } + + .swagger-ui .mw9-l { + max-width: 96rem + } + + .swagger-ui .mw-none-l { + max-width: none + } +} + +.swagger-ui .w1 { + width: 1rem +} + +.swagger-ui .w2 { + width: 2rem +} + +.swagger-ui .w3 { + width: 4rem +} + +.swagger-ui .w4 { + width: 8rem +} + +.swagger-ui .w5 { + width: 16rem +} + +.swagger-ui .w-10 { + width: 10% +} + +.swagger-ui .w-20 { + width: 20% +} + +.swagger-ui .w-25 { + width: 25% +} + +.swagger-ui .w-30 { + width: 30% +} + +.swagger-ui .w-33 { + width: 33% +} + +.swagger-ui .w-34 { + width: 34% +} + +.swagger-ui .w-40 { + width: 40% +} + +.swagger-ui .w-50 { + width: 50% +} + +.swagger-ui .w-60 { + width: 60% +} + +.swagger-ui .w-70 { + width: 70% +} + +.swagger-ui .w-75 { + width: 75% +} + +.swagger-ui .w-80 { + width: 80% +} + +.swagger-ui .w-90 { + width: 90% +} + +.swagger-ui .w-100 { + width: 100% +} + +.swagger-ui .w-third { + width: 33.3333333333% +} + +.swagger-ui .w-two-thirds { + width: 66.6666666667% +} + +.swagger-ui .w-auto { + width: auto +} + +@media screen and (min-width: 30em) { + .swagger-ui .w1-ns { + width:1rem + } + + .swagger-ui .w2-ns { + width: 2rem + } + + .swagger-ui .w3-ns { + width: 4rem + } + + .swagger-ui .w4-ns { + width: 8rem + } + + .swagger-ui .w5-ns { + width: 16rem + } + + .swagger-ui .w-10-ns { + width: 10% + } + + .swagger-ui .w-20-ns { + width: 20% + } + + .swagger-ui .w-25-ns { + width: 25% + } + + .swagger-ui .w-30-ns { + width: 30% + } + + .swagger-ui .w-33-ns { + width: 33% + } + + .swagger-ui .w-34-ns { + width: 34% + } + + .swagger-ui .w-40-ns { + width: 40% + } + + .swagger-ui .w-50-ns { + width: 50% + } + + .swagger-ui .w-60-ns { + width: 60% + } + + .swagger-ui .w-70-ns { + width: 70% + } + + .swagger-ui .w-75-ns { + width: 75% + } + + .swagger-ui .w-80-ns { + width: 80% + } + + .swagger-ui .w-90-ns { + width: 90% + } + + .swagger-ui .w-100-ns { + width: 100% + } + + .swagger-ui .w-third-ns { + width: 33.3333333333% + } + + .swagger-ui .w-two-thirds-ns { + width: 66.6666666667% + } + + .swagger-ui .w-auto-ns { + width: auto + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .w1-m { + width:1rem + } + + .swagger-ui .w2-m { + width: 2rem + } + + .swagger-ui .w3-m { + width: 4rem + } + + .swagger-ui .w4-m { + width: 8rem + } + + .swagger-ui .w5-m { + width: 16rem + } + + .swagger-ui .w-10-m { + width: 10% + } + + .swagger-ui .w-20-m { + width: 20% + } + + .swagger-ui .w-25-m { + width: 25% + } + + .swagger-ui .w-30-m { + width: 30% + } + + .swagger-ui .w-33-m { + width: 33% + } + + .swagger-ui .w-34-m { + width: 34% + } + + .swagger-ui .w-40-m { + width: 40% + } + + .swagger-ui .w-50-m { + width: 50% + } + + .swagger-ui .w-60-m { + width: 60% + } + + .swagger-ui .w-70-m { + width: 70% + } + + .swagger-ui .w-75-m { + width: 75% + } + + .swagger-ui .w-80-m { + width: 80% + } + + .swagger-ui .w-90-m { + width: 90% + } + + .swagger-ui .w-100-m { + width: 100% + } + + .swagger-ui .w-third-m { + width: 33.3333333333% + } + + .swagger-ui .w-two-thirds-m { + width: 66.6666666667% + } + + .swagger-ui .w-auto-m { + width: auto + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .w1-l { + width:1rem + } + + .swagger-ui .w2-l { + width: 2rem + } + + .swagger-ui .w3-l { + width: 4rem + } + + .swagger-ui .w4-l { + width: 8rem + } + + .swagger-ui .w5-l { + width: 16rem + } + + .swagger-ui .w-10-l { + width: 10% + } + + .swagger-ui .w-20-l { + width: 20% + } + + .swagger-ui .w-25-l { + width: 25% + } + + .swagger-ui .w-30-l { + width: 30% + } + + .swagger-ui .w-33-l { + width: 33% + } + + .swagger-ui .w-34-l { + width: 34% + } + + .swagger-ui .w-40-l { + width: 40% + } + + .swagger-ui .w-50-l { + width: 50% + } + + .swagger-ui .w-60-l { + width: 60% + } + + .swagger-ui .w-70-l { + width: 70% + } + + .swagger-ui .w-75-l { + width: 75% + } + + .swagger-ui .w-80-l { + width: 80% + } + + .swagger-ui .w-90-l { + width: 90% + } + + .swagger-ui .w-100-l { + width: 100% + } + + .swagger-ui .w-third-l { + width: 33.3333333333% + } + + .swagger-ui .w-two-thirds-l { + width: 66.6666666667% + } + + .swagger-ui .w-auto-l { + width: auto + } +} + +.swagger-ui .overflow-visible { + overflow: visible +} + +.swagger-ui .overflow-hidden { + overflow: hidden +} + +.swagger-ui .overflow-scroll { + overflow: scroll +} + +.swagger-ui .overflow-auto { + overflow: auto +} + +.swagger-ui .overflow-x-visible { + overflow-x: visible +} + +.swagger-ui .overflow-x-hidden { + overflow-x: hidden +} + +.swagger-ui .overflow-x-scroll { + overflow-x: scroll +} + +.swagger-ui .overflow-x-auto { + overflow-x: auto +} + +.swagger-ui .overflow-y-visible { + overflow-y: visible +} + +.swagger-ui .overflow-y-hidden { + overflow-y: hidden +} + +.swagger-ui .overflow-y-scroll { + overflow-y: scroll +} + +.swagger-ui .overflow-y-auto { + overflow-y: auto +} + +@media screen and (min-width: 30em) { + .swagger-ui .overflow-visible-ns { + overflow:visible + } + + .swagger-ui .overflow-hidden-ns { + overflow: hidden + } + + .swagger-ui .overflow-scroll-ns { + overflow: scroll + } + + .swagger-ui .overflow-auto-ns { + overflow: auto + } + + .swagger-ui .overflow-x-visible-ns { + overflow-x: visible + } + + .swagger-ui .overflow-x-hidden-ns { + overflow-x: hidden + } + + .swagger-ui .overflow-x-scroll-ns { + overflow-x: scroll + } + + .swagger-ui .overflow-x-auto-ns { + overflow-x: auto + } + + .swagger-ui .overflow-y-visible-ns { + overflow-y: visible + } + + .swagger-ui .overflow-y-hidden-ns { + overflow-y: hidden + } + + .swagger-ui .overflow-y-scroll-ns { + overflow-y: scroll + } + + .swagger-ui .overflow-y-auto-ns { + overflow-y: auto + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .overflow-visible-m { + overflow:visible + } + + .swagger-ui .overflow-hidden-m { + overflow: hidden + } + + .swagger-ui .overflow-scroll-m { + overflow: scroll + } + + .swagger-ui .overflow-auto-m { + overflow: auto + } + + .swagger-ui .overflow-x-visible-m { + overflow-x: visible + } + + .swagger-ui .overflow-x-hidden-m { + overflow-x: hidden + } + + .swagger-ui .overflow-x-scroll-m { + overflow-x: scroll + } + + .swagger-ui .overflow-x-auto-m { + overflow-x: auto + } + + .swagger-ui .overflow-y-visible-m { + overflow-y: visible + } + + .swagger-ui .overflow-y-hidden-m { + overflow-y: hidden + } + + .swagger-ui .overflow-y-scroll-m { + overflow-y: scroll + } + + .swagger-ui .overflow-y-auto-m { + overflow-y: auto + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .overflow-visible-l { + overflow:visible + } + + .swagger-ui .overflow-hidden-l { + overflow: hidden + } + + .swagger-ui .overflow-scroll-l { + overflow: scroll + } + + .swagger-ui .overflow-auto-l { + overflow: auto + } + + .swagger-ui .overflow-x-visible-l { + overflow-x: visible + } + + .swagger-ui .overflow-x-hidden-l { + overflow-x: hidden + } + + .swagger-ui .overflow-x-scroll-l { + overflow-x: scroll + } + + .swagger-ui .overflow-x-auto-l { + overflow-x: auto + } + + .swagger-ui .overflow-y-visible-l { + overflow-y: visible + } + + .swagger-ui .overflow-y-hidden-l { + overflow-y: hidden + } + + .swagger-ui .overflow-y-scroll-l { + overflow-y: scroll + } + + .swagger-ui .overflow-y-auto-l { + overflow-y: auto + } +} + +.swagger-ui .static { + position: static +} + +.swagger-ui .relative { + position: relative +} + +.swagger-ui .absolute { + position: absolute +} + +.swagger-ui .fixed { + position: fixed +} + +@media screen and (min-width: 30em) { + .swagger-ui .static-ns { + position:static + } + + .swagger-ui .relative-ns { + position: relative + } + + .swagger-ui .absolute-ns { + position: absolute + } + + .swagger-ui .fixed-ns { + position: fixed + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .static-m { + position:static + } + + .swagger-ui .relative-m { + position: relative + } + + .swagger-ui .absolute-m { + position: absolute + } + + .swagger-ui .fixed-m { + position: fixed + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .static-l { + position:static + } + + .swagger-ui .relative-l { + position: relative + } + + .swagger-ui .absolute-l { + position: absolute + } + + .swagger-ui .fixed-l { + position: fixed + } +} + +.swagger-ui .o-100 { + opacity: 1 +} + +.swagger-ui .o-90 { + opacity: .9 +} + +.swagger-ui .o-80 { + opacity: .8 +} + +.swagger-ui .o-70 { + opacity: .7 +} + +.swagger-ui .o-60 { + opacity: .6 +} + +.swagger-ui .o-50 { + opacity: .5 +} + +.swagger-ui .o-40 { + opacity: .4 +} + +.swagger-ui .o-30 { + opacity: .3 +} + +.swagger-ui .o-20 { + opacity: .2 +} + +.swagger-ui .o-10 { + opacity: .1 +} + +.swagger-ui .o-05 { + opacity: .05 +} + +.swagger-ui .o-025 { + opacity: .025 +} + +.swagger-ui .o-0 { + opacity: 0 +} + +.swagger-ui .rotate-45 { + transform: rotate(45deg) +} + +.swagger-ui .rotate-90 { + transform: rotate(90deg) +} + +.swagger-ui .rotate-135 { + transform: rotate(135deg) +} + +.swagger-ui .rotate-180 { + transform: rotate(180deg) +} + +.swagger-ui .rotate-225 { + transform: rotate(225deg) +} + +.swagger-ui .rotate-270 { + transform: rotate(270deg) +} + +.swagger-ui .rotate-315 { + transform: rotate(315deg) +} + +@media screen and (min-width: 30em) { + .swagger-ui .rotate-45-ns { + transform:rotate(45deg) + } + + .swagger-ui .rotate-90-ns { + transform: rotate(90deg) + } + + .swagger-ui .rotate-135-ns { + transform: rotate(135deg) + } + + .swagger-ui .rotate-180-ns { + transform: rotate(180deg) + } + + .swagger-ui .rotate-225-ns { + transform: rotate(225deg) + } + + .swagger-ui .rotate-270-ns { + transform: rotate(270deg) + } + + .swagger-ui .rotate-315-ns { + transform: rotate(315deg) + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .rotate-45-m { + transform:rotate(45deg) + } + + .swagger-ui .rotate-90-m { + transform: rotate(90deg) + } + + .swagger-ui .rotate-135-m { + transform: rotate(135deg) + } + + .swagger-ui .rotate-180-m { + transform: rotate(180deg) + } + + .swagger-ui .rotate-225-m { + transform: rotate(225deg) + } + + .swagger-ui .rotate-270-m { + transform: rotate(270deg) + } + + .swagger-ui .rotate-315-m { + transform: rotate(315deg) + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .rotate-45-l { + transform:rotate(45deg) + } + + .swagger-ui .rotate-90-l { + transform: rotate(90deg) + } + + .swagger-ui .rotate-135-l { + transform: rotate(135deg) + } + + .swagger-ui .rotate-180-l { + transform: rotate(180deg) + } + + .swagger-ui .rotate-225-l { + transform: rotate(225deg) + } + + .swagger-ui .rotate-270-l { + transform: rotate(270deg) + } + + .swagger-ui .rotate-315-l { + transform: rotate(315deg) + } +} + +.swagger-ui .black-90 { + color: rgba(0,0,0,.9) +} + +.swagger-ui .black-80 { + color: rgba(0,0,0,.8) +} + +.swagger-ui .black-70 { + color: rgba(0,0,0,.7) +} + +.swagger-ui .black-60 { + color: rgba(0,0,0,.6) +} + +.swagger-ui .black-50 { + color: rgba(0,0,0,.5) +} + +.swagger-ui .black-40 { + color: rgba(0,0,0,.4) +} + +.swagger-ui .black-30 { + color: rgba(0,0,0,.3) +} + +.swagger-ui .black-20 { + color: rgba(0,0,0,.2) +} + +.swagger-ui .black-10 { + color: rgba(0,0,0,.1) +} + +.swagger-ui .black-05 { + color: rgba(0,0,0,.05) +} + +.swagger-ui .white-90 { + color: hsla(0,0%,100%,.9) +} + +.swagger-ui .white-80 { + color: hsla(0,0%,100%,.8) +} + +.swagger-ui .white-70 { + color: hsla(0,0%,100%,.7) +} + +.swagger-ui .white-60 { + color: hsla(0,0%,100%,.6) +} + +.swagger-ui .white-50 { + color: hsla(0,0%,100%,.5) +} + +.swagger-ui .white-40 { + color: hsla(0,0%,100%,.4) +} + +.swagger-ui .white-30 { + color: hsla(0,0%,100%,.3) +} + +.swagger-ui .white-20 { + color: hsla(0,0%,100%,.2) +} + +.swagger-ui .white-10 { + color: hsla(0,0%,100%,.1) +} + +.swagger-ui .black { + color: #000 +} + +.swagger-ui .near-black { + color: #111 +} + +.swagger-ui .dark-gray { + color: #333 +} + +.swagger-ui .mid-gray { + color: #555 +} + +.swagger-ui .gray { + color: #777 +} + +.swagger-ui .silver { + color: #999 +} + +.swagger-ui .light-silver { + color: #aaa +} + +.swagger-ui .moon-gray { + color: #ccc +} + +.swagger-ui .light-gray { + color: #eee +} + +.swagger-ui .near-white { + color: #f4f4f4 +} + +.swagger-ui .white { + color: #fff +} + +.swagger-ui .dark-red { + color: #e7040f +} + +.swagger-ui .red { + color: #ff4136 +} + +.swagger-ui .light-red { + color: #ff725c +} + +.swagger-ui .orange { + color: #ff6300 +} + +.swagger-ui .gold { + color: #ffb700 +} + +.swagger-ui .yellow { + color: gold +} + +.swagger-ui .light-yellow { + color: #fbf1a9 +} + +.swagger-ui .purple { + color: #5e2ca5 +} + +.swagger-ui .light-purple { + color: #a463f2 +} + +.swagger-ui .dark-pink { + color: #d5008f +} + +.swagger-ui .hot-pink { + color: #ff41b4 +} + +.swagger-ui .pink { + color: #ff80cc +} + +.swagger-ui .light-pink { + color: #ffa3d7 +} + +.swagger-ui .dark-green { + color: #137752 +} + +.swagger-ui .green { + color: #19a974 +} + +.swagger-ui .light-green { + color: #9eebcf +} + +.swagger-ui .navy { + color: #001b44 +} + +.swagger-ui .dark-blue { + color: #00449e +} + +.swagger-ui .blue { + color: #357edd +} + +.swagger-ui .light-blue { + color: #96ccff +} + +.swagger-ui .lightest-blue { + color: #cdecff +} + +.swagger-ui .washed-blue { + color: #f6fffe +} + +.swagger-ui .washed-green { + color: #e8fdf5 +} + +.swagger-ui .washed-yellow { + color: #fffceb +} + +.swagger-ui .washed-red { + color: #ffdfdf +} + +.swagger-ui .color-inherit { + color: inherit +} + +.swagger-ui .bg-black-90 { + background-color: rgba(0,0,0,.9) +} + +.swagger-ui .bg-black-80 { + background-color: rgba(0,0,0,.8) +} + +.swagger-ui .bg-black-70 { + background-color: rgba(0,0,0,.7) +} + +.swagger-ui .bg-black-60 { + background-color: rgba(0,0,0,.6) +} + +.swagger-ui .bg-black-50 { + background-color: rgba(0,0,0,.5) +} + +.swagger-ui .bg-black-40 { + background-color: rgba(0,0,0,.4) +} + +.swagger-ui .bg-black-30 { + background-color: rgba(0,0,0,.3) +} + +.swagger-ui .bg-black-20 { + background-color: rgba(0,0,0,.2) +} + +.swagger-ui .bg-black-10 { + background-color: rgba(0,0,0,.1) +} + +.swagger-ui .bg-black-05 { + background-color: rgba(0,0,0,.05) +} + +.swagger-ui .bg-white-90 { + background-color: hsla(0,0%,100%,.9) +} + +.swagger-ui .bg-white-80 { + background-color: hsla(0,0%,100%,.8) +} + +.swagger-ui .bg-white-70 { + background-color: hsla(0,0%,100%,.7) +} + +.swagger-ui .bg-white-60 { + background-color: hsla(0,0%,100%,.6) +} + +.swagger-ui .bg-white-50 { + background-color: hsla(0,0%,100%,.5) +} + +.swagger-ui .bg-white-40 { + background-color: hsla(0,0%,100%,.4) +} + +.swagger-ui .bg-white-30 { + background-color: hsla(0,0%,100%,.3) +} + +.swagger-ui .bg-white-20 { + background-color: hsla(0,0%,100%,.2) +} + +.swagger-ui .bg-white-10 { + background-color: hsla(0,0%,100%,.1) +} + +.swagger-ui .bg-black { + background-color: #000 +} + +.swagger-ui .bg-near-black { + background-color: #111 +} + +.swagger-ui .bg-dark-gray { + background-color: #333 +} + +.swagger-ui .bg-mid-gray { + background-color: #555 +} + +.swagger-ui .bg-gray { + background-color: #777 +} + +.swagger-ui .bg-silver { + background-color: #999 +} + +.swagger-ui .bg-light-silver { + background-color: #aaa +} + +.swagger-ui .bg-moon-gray { + background-color: #ccc +} + +.swagger-ui .bg-light-gray { + background-color: #eee +} + +.swagger-ui .bg-near-white { + background-color: #f4f4f4 +} + +.swagger-ui .bg-white { + background-color: #fff +} + +.swagger-ui .bg-transparent { + background-color: transparent +} + +.swagger-ui .bg-dark-red { + background-color: #e7040f +} + +.swagger-ui .bg-red { + background-color: #ff4136 +} + +.swagger-ui .bg-light-red { + background-color: #ff725c +} + +.swagger-ui .bg-orange { + background-color: #ff6300 +} + +.swagger-ui .bg-gold { + background-color: #ffb700 +} + +.swagger-ui .bg-yellow { + background-color: gold +} + +.swagger-ui .bg-light-yellow { + background-color: #fbf1a9 +} + +.swagger-ui .bg-purple { + background-color: #5e2ca5 +} + +.swagger-ui .bg-light-purple { + background-color: #a463f2 +} + +.swagger-ui .bg-dark-pink { + background-color: #d5008f +} + +.swagger-ui .bg-hot-pink { + background-color: #ff41b4 +} + +.swagger-ui .bg-pink { + background-color: #ff80cc +} + +.swagger-ui .bg-light-pink { + background-color: #ffa3d7 +} + +.swagger-ui .bg-dark-green { + background-color: #137752 +} + +.swagger-ui .bg-green { + background-color: #19a974 +} + +.swagger-ui .bg-light-green { + background-color: #9eebcf +} + +.swagger-ui .bg-navy { + background-color: #001b44 +} + +.swagger-ui .bg-dark-blue { + background-color: #00449e +} + +.swagger-ui .bg-blue { + background-color: #357edd +} + +.swagger-ui .bg-light-blue { + background-color: #96ccff +} + +.swagger-ui .bg-lightest-blue { + background-color: #cdecff +} + +.swagger-ui .bg-washed-blue { + background-color: #f6fffe +} + +.swagger-ui .bg-washed-green { + background-color: #e8fdf5 +} + +.swagger-ui .bg-washed-yellow { + background-color: #fffceb +} + +.swagger-ui .bg-washed-red { + background-color: #ffdfdf +} + +.swagger-ui .bg-inherit { + background-color: inherit +} + +.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover { + color: #000 +} + +.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover { + color: #111 +} + +.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover { + color: #333 +} + +.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover { + color: #555 +} + +.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover { + color: #777 +} + +.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover { + color: #999 +} + +.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover { + color: #aaa +} + +.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover { + color: #ccc +} + +.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover { + color: #eee +} + +.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover { + color: #f4f4f4 +} + +.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover { + color: #fff +} + +.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover { + color: rgba(0,0,0,.9) +} + +.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover { + color: rgba(0,0,0,.8) +} + +.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover { + color: rgba(0,0,0,.7) +} + +.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover { + color: rgba(0,0,0,.6) +} + +.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover { + color: rgba(0,0,0,.5) +} + +.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover { + color: rgba(0,0,0,.4) +} + +.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover { + color: rgba(0,0,0,.3) +} + +.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover { + color: rgba(0,0,0,.2) +} + +.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover { + color: rgba(0,0,0,.1) +} + +.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover { + color: hsla(0,0%,100%,.9) +} + +.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover { + color: hsla(0,0%,100%,.8) +} + +.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover { + color: hsla(0,0%,100%,.7) +} + +.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover { + color: hsla(0,0%,100%,.6) +} + +.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover { + color: hsla(0,0%,100%,.5) +} + +.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover { + color: hsla(0,0%,100%,.4) +} + +.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover { + color: hsla(0,0%,100%,.3) +} + +.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover { + color: hsla(0,0%,100%,.2) +} + +.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover { + color: hsla(0,0%,100%,.1) +} + +.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover { + color: inherit +} + +.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover { + background-color: #000 +} + +.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover { + background-color: #111 +} + +.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover { + background-color: #333 +} + +.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover { + background-color: #555 +} + +.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover { + background-color: #777 +} + +.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover { + background-color: #999 +} + +.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover { + background-color: #aaa +} + +.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover { + background-color: #ccc +} + +.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover { + background-color: #eee +} + +.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover { + background-color: #f4f4f4 +} + +.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover { + background-color: #fff +} + +.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover { + background-color: transparent +} + +.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover { + background-color: rgba(0,0,0,.9) +} + +.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover { + background-color: rgba(0,0,0,.8) +} + +.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover { + background-color: rgba(0,0,0,.7) +} + +.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover { + background-color: rgba(0,0,0,.6) +} + +.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover { + background-color: rgba(0,0,0,.5) +} + +.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover { + background-color: rgba(0,0,0,.4) +} + +.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover { + background-color: rgba(0,0,0,.3) +} + +.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover { + background-color: rgba(0,0,0,.2) +} + +.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover { + background-color: rgba(0,0,0,.1) +} + +.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover { + background-color: hsla(0,0%,100%,.9) +} + +.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover { + background-color: hsla(0,0%,100%,.8) +} + +.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover { + background-color: hsla(0,0%,100%,.7) +} + +.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover { + background-color: hsla(0,0%,100%,.6) +} + +.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover { + background-color: hsla(0,0%,100%,.5) +} + +.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover { + background-color: hsla(0,0%,100%,.4) +} + +.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover { + background-color: hsla(0,0%,100%,.3) +} + +.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover { + background-color: hsla(0,0%,100%,.2) +} + +.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover { + background-color: hsla(0,0%,100%,.1) +} + +.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover { + color: #e7040f +} + +.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover { + color: #ff4136 +} + +.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover { + color: #ff725c +} + +.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover { + color: #ff6300 +} + +.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover { + color: #ffb700 +} + +.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover { + color: gold +} + +.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover { + color: #fbf1a9 +} + +.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover { + color: #5e2ca5 +} + +.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover { + color: #a463f2 +} + +.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover { + color: #d5008f +} + +.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover { + color: #ff41b4 +} + +.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover { + color: #ff80cc +} + +.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover { + color: #ffa3d7 +} + +.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover { + color: #137752 +} + +.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover { + color: #19a974 +} + +.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover { + color: #9eebcf +} + +.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover { + color: #001b44 +} + +.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover { + color: #00449e +} + +.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover { + color: #357edd +} + +.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover { + color: #96ccff +} + +.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover { + color: #cdecff +} + +.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover { + color: #f6fffe +} + +.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover { + color: #e8fdf5 +} + +.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover { + color: #fffceb +} + +.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover { + color: #ffdfdf +} + +.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover { + background-color: #e7040f +} + +.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover { + background-color: #ff4136 +} + +.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover { + background-color: #ff725c +} + +.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover { + background-color: #ff6300 +} + +.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover { + background-color: #ffb700 +} + +.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover { + background-color: gold +} + +.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover { + background-color: #fbf1a9 +} + +.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover { + background-color: #5e2ca5 +} + +.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover { + background-color: #a463f2 +} + +.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover { + background-color: #d5008f +} + +.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover { + background-color: #ff41b4 +} + +.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover { + background-color: #ff80cc +} + +.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover { + background-color: #ffa3d7 +} + +.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover { + background-color: #137752 +} + +.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover { + background-color: #19a974 +} + +.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover { + background-color: #9eebcf +} + +.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover { + background-color: #001b44 +} + +.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover { + background-color: #00449e +} + +.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover { + background-color: #357edd +} + +.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover { + background-color: #96ccff +} + +.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover { + background-color: #cdecff +} + +.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover { + background-color: #f6fffe +} + +.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover { + background-color: #e8fdf5 +} + +.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover { + background-color: #fffceb +} + +.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover { + background-color: #ffdfdf +} + +.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover { + background-color: inherit +} + +.swagger-ui .pa0 { + padding: 0 +} + +.swagger-ui .pa1 { + padding: .25rem +} + +.swagger-ui .pa2 { + padding: .5rem +} + +.swagger-ui .pa3 { + padding: 1rem +} + +.swagger-ui .pa4 { + padding: 2rem +} + +.swagger-ui .pa5 { + padding: 4rem +} + +.swagger-ui .pa6 { + padding: 8rem +} + +.swagger-ui .pa7 { + padding: 16rem +} + +.swagger-ui .pl0 { + padding-left: 0 +} + +.swagger-ui .pl1 { + padding-left: .25rem +} + +.swagger-ui .pl2 { + padding-left: .5rem +} + +.swagger-ui .pl3 { + padding-left: 1rem +} + +.swagger-ui .pl4 { + padding-left: 2rem +} + +.swagger-ui .pl5 { + padding-left: 4rem +} + +.swagger-ui .pl6 { + padding-left: 8rem +} + +.swagger-ui .pl7 { + padding-left: 16rem +} + +.swagger-ui .pr0 { + padding-right: 0 +} + +.swagger-ui .pr1 { + padding-right: .25rem +} + +.swagger-ui .pr2 { + padding-right: .5rem +} + +.swagger-ui .pr3 { + padding-right: 1rem +} + +.swagger-ui .pr4 { + padding-right: 2rem +} + +.swagger-ui .pr5 { + padding-right: 4rem +} + +.swagger-ui .pr6 { + padding-right: 8rem +} + +.swagger-ui .pr7 { + padding-right: 16rem +} + +.swagger-ui .pb0 { + padding-bottom: 0 +} + +.swagger-ui .pb1 { + padding-bottom: .25rem +} + +.swagger-ui .pb2 { + padding-bottom: .5rem +} + +.swagger-ui .pb3 { + padding-bottom: 1rem +} + +.swagger-ui .pb4 { + padding-bottom: 2rem +} + +.swagger-ui .pb5 { + padding-bottom: 4rem +} + +.swagger-ui .pb6 { + padding-bottom: 8rem +} + +.swagger-ui .pb7 { + padding-bottom: 16rem +} + +.swagger-ui .pt0 { + padding-top: 0 +} + +.swagger-ui .pt1 { + padding-top: .25rem +} + +.swagger-ui .pt2 { + padding-top: .5rem +} + +.swagger-ui .pt3 { + padding-top: 1rem +} + +.swagger-ui .pt4 { + padding-top: 2rem +} + +.swagger-ui .pt5 { + padding-top: 4rem +} + +.swagger-ui .pt6 { + padding-top: 8rem +} + +.swagger-ui .pt7 { + padding-top: 16rem +} + +.swagger-ui .pv0 { + padding-bottom: 0; + padding-top: 0 +} + +.swagger-ui .pv1 { + padding-bottom: .25rem; + padding-top: .25rem +} + +.swagger-ui .pv2 { + padding-bottom: .5rem; + padding-top: .5rem +} + +.swagger-ui .pv3 { + padding-bottom: 1rem; + padding-top: 1rem +} + +.swagger-ui .pv4 { + padding-bottom: 2rem; + padding-top: 2rem +} + +.swagger-ui .pv5 { + padding-bottom: 4rem; + padding-top: 4rem +} + +.swagger-ui .pv6 { + padding-bottom: 8rem; + padding-top: 8rem +} + +.swagger-ui .pv7 { + padding-bottom: 16rem; + padding-top: 16rem +} + +.swagger-ui .ph0 { + padding-left: 0; + padding-right: 0 +} + +.swagger-ui .ph1 { + padding-left: .25rem; + padding-right: .25rem +} + +.swagger-ui .ph2 { + padding-left: .5rem; + padding-right: .5rem +} + +.swagger-ui .ph3 { + padding-left: 1rem; + padding-right: 1rem +} + +.swagger-ui .ph4 { + padding-left: 2rem; + padding-right: 2rem +} + +.swagger-ui .ph5 { + padding-left: 4rem; + padding-right: 4rem +} + +.swagger-ui .ph6 { + padding-left: 8rem; + padding-right: 8rem +} + +.swagger-ui .ph7 { + padding-left: 16rem; + padding-right: 16rem +} + +.swagger-ui .ma0 { + margin: 0 +} + +.swagger-ui .ma1 { + margin: .25rem +} + +.swagger-ui .ma2 { + margin: .5rem +} + +.swagger-ui .ma3 { + margin: 1rem +} + +.swagger-ui .ma4 { + margin: 2rem +} + +.swagger-ui .ma5 { + margin: 4rem +} + +.swagger-ui .ma6 { + margin: 8rem +} + +.swagger-ui .ma7 { + margin: 16rem +} + +.swagger-ui .ml0 { + margin-left: 0 +} + +.swagger-ui .ml1 { + margin-left: .25rem +} + +.swagger-ui .ml2 { + margin-left: .5rem +} + +.swagger-ui .ml3 { + margin-left: 1rem +} + +.swagger-ui .ml4 { + margin-left: 2rem +} + +.swagger-ui .ml5 { + margin-left: 4rem +} + +.swagger-ui .ml6 { + margin-left: 8rem +} + +.swagger-ui .ml7 { + margin-left: 16rem +} + +.swagger-ui .mr0 { + margin-right: 0 +} + +.swagger-ui .mr1 { + margin-right: .25rem +} + +.swagger-ui .mr2 { + margin-right: .5rem +} + +.swagger-ui .mr3 { + margin-right: 1rem +} + +.swagger-ui .mr4 { + margin-right: 2rem +} + +.swagger-ui .mr5 { + margin-right: 4rem +} + +.swagger-ui .mr6 { + margin-right: 8rem +} + +.swagger-ui .mr7 { + margin-right: 16rem +} + +.swagger-ui .mb0 { + margin-bottom: 0 +} + +.swagger-ui .mb1 { + margin-bottom: .25rem +} + +.swagger-ui .mb2 { + margin-bottom: .5rem +} + +.swagger-ui .mb3 { + margin-bottom: 1rem +} + +.swagger-ui .mb4 { + margin-bottom: 2rem +} + +.swagger-ui .mb5 { + margin-bottom: 4rem +} + +.swagger-ui .mb6 { + margin-bottom: 8rem +} + +.swagger-ui .mb7 { + margin-bottom: 16rem +} + +.swagger-ui .mt0 { + margin-top: 0 +} + +.swagger-ui .mt1 { + margin-top: .25rem +} + +.swagger-ui .mt2 { + margin-top: .5rem +} + +.swagger-ui .mt3 { + margin-top: 1rem +} + +.swagger-ui .mt4 { + margin-top: 2rem +} + +.swagger-ui .mt5 { + margin-top: 4rem +} + +.swagger-ui .mt6 { + margin-top: 8rem +} + +.swagger-ui .mt7 { + margin-top: 16rem +} + +.swagger-ui .mv0 { + margin-bottom: 0; + margin-top: 0 +} + +.swagger-ui .mv1 { + margin-bottom: .25rem; + margin-top: .25rem +} + +.swagger-ui .mv2 { + margin-bottom: .5rem; + margin-top: .5rem +} + +.swagger-ui .mv3 { + margin-bottom: 1rem; + margin-top: 1rem +} + +.swagger-ui .mv4 { + margin-bottom: 2rem; + margin-top: 2rem +} + +.swagger-ui .mv5 { + margin-bottom: 4rem; + margin-top: 4rem +} + +.swagger-ui .mv6 { + margin-bottom: 8rem; + margin-top: 8rem +} + +.swagger-ui .mv7 { + margin-bottom: 16rem; + margin-top: 16rem +} + +.swagger-ui .mh0 { + margin-left: 0; + margin-right: 0 +} + +.swagger-ui .mh1 { + margin-left: .25rem; + margin-right: .25rem +} + +.swagger-ui .mh2 { + margin-left: .5rem; + margin-right: .5rem +} + +.swagger-ui .mh3 { + margin-left: 1rem; + margin-right: 1rem +} + +.swagger-ui .mh4 { + margin-left: 2rem; + margin-right: 2rem +} + +.swagger-ui .mh5 { + margin-left: 4rem; + margin-right: 4rem +} + +.swagger-ui .mh6 { + margin-left: 8rem; + margin-right: 8rem +} + +.swagger-ui .mh7 { + margin-left: 16rem; + margin-right: 16rem +} + +@media screen and (min-width: 30em) { + .swagger-ui .pa0-ns { + padding:0 + } + + .swagger-ui .pa1-ns { + padding: .25rem + } + + .swagger-ui .pa2-ns { + padding: .5rem + } + + .swagger-ui .pa3-ns { + padding: 1rem + } + + .swagger-ui .pa4-ns { + padding: 2rem + } + + .swagger-ui .pa5-ns { + padding: 4rem + } + + .swagger-ui .pa6-ns { + padding: 8rem + } + + .swagger-ui .pa7-ns { + padding: 16rem + } + + .swagger-ui .pl0-ns { + padding-left: 0 + } + + .swagger-ui .pl1-ns { + padding-left: .25rem + } + + .swagger-ui .pl2-ns { + padding-left: .5rem + } + + .swagger-ui .pl3-ns { + padding-left: 1rem + } + + .swagger-ui .pl4-ns { + padding-left: 2rem + } + + .swagger-ui .pl5-ns { + padding-left: 4rem + } + + .swagger-ui .pl6-ns { + padding-left: 8rem + } + + .swagger-ui .pl7-ns { + padding-left: 16rem + } + + .swagger-ui .pr0-ns { + padding-right: 0 + } + + .swagger-ui .pr1-ns { + padding-right: .25rem + } + + .swagger-ui .pr2-ns { + padding-right: .5rem + } + + .swagger-ui .pr3-ns { + padding-right: 1rem + } + + .swagger-ui .pr4-ns { + padding-right: 2rem + } + + .swagger-ui .pr5-ns { + padding-right: 4rem + } + + .swagger-ui .pr6-ns { + padding-right: 8rem + } + + .swagger-ui .pr7-ns { + padding-right: 16rem + } + + .swagger-ui .pb0-ns { + padding-bottom: 0 + } + + .swagger-ui .pb1-ns { + padding-bottom: .25rem + } + + .swagger-ui .pb2-ns { + padding-bottom: .5rem + } + + .swagger-ui .pb3-ns { + padding-bottom: 1rem + } + + .swagger-ui .pb4-ns { + padding-bottom: 2rem + } + + .swagger-ui .pb5-ns { + padding-bottom: 4rem + } + + .swagger-ui .pb6-ns { + padding-bottom: 8rem + } + + .swagger-ui .pb7-ns { + padding-bottom: 16rem + } + + .swagger-ui .pt0-ns { + padding-top: 0 + } + + .swagger-ui .pt1-ns { + padding-top: .25rem + } + + .swagger-ui .pt2-ns { + padding-top: .5rem + } + + .swagger-ui .pt3-ns { + padding-top: 1rem + } + + .swagger-ui .pt4-ns { + padding-top: 2rem + } + + .swagger-ui .pt5-ns { + padding-top: 4rem + } + + .swagger-ui .pt6-ns { + padding-top: 8rem + } + + .swagger-ui .pt7-ns { + padding-top: 16rem + } + + .swagger-ui .pv0-ns { + padding-bottom: 0; + padding-top: 0 + } + + .swagger-ui .pv1-ns { + padding-bottom: .25rem; + padding-top: .25rem + } + + .swagger-ui .pv2-ns { + padding-bottom: .5rem; + padding-top: .5rem + } + + .swagger-ui .pv3-ns { + padding-bottom: 1rem; + padding-top: 1rem + } + + .swagger-ui .pv4-ns { + padding-bottom: 2rem; + padding-top: 2rem + } + + .swagger-ui .pv5-ns { + padding-bottom: 4rem; + padding-top: 4rem + } + + .swagger-ui .pv6-ns { + padding-bottom: 8rem; + padding-top: 8rem + } + + .swagger-ui .pv7-ns { + padding-bottom: 16rem; + padding-top: 16rem + } + + .swagger-ui .ph0-ns { + padding-left: 0; + padding-right: 0 + } + + .swagger-ui .ph1-ns { + padding-left: .25rem; + padding-right: .25rem + } + + .swagger-ui .ph2-ns { + padding-left: .5rem; + padding-right: .5rem + } + + .swagger-ui .ph3-ns { + padding-left: 1rem; + padding-right: 1rem + } + + .swagger-ui .ph4-ns { + padding-left: 2rem; + padding-right: 2rem + } + + .swagger-ui .ph5-ns { + padding-left: 4rem; + padding-right: 4rem + } + + .swagger-ui .ph6-ns { + padding-left: 8rem; + padding-right: 8rem + } + + .swagger-ui .ph7-ns { + padding-left: 16rem; + padding-right: 16rem + } + + .swagger-ui .ma0-ns { + margin: 0 + } + + .swagger-ui .ma1-ns { + margin: .25rem + } + + .swagger-ui .ma2-ns { + margin: .5rem + } + + .swagger-ui .ma3-ns { + margin: 1rem + } + + .swagger-ui .ma4-ns { + margin: 2rem + } + + .swagger-ui .ma5-ns { + margin: 4rem + } + + .swagger-ui .ma6-ns { + margin: 8rem + } + + .swagger-ui .ma7-ns { + margin: 16rem + } + + .swagger-ui .ml0-ns { + margin-left: 0 + } + + .swagger-ui .ml1-ns { + margin-left: .25rem + } + + .swagger-ui .ml2-ns { + margin-left: .5rem + } + + .swagger-ui .ml3-ns { + margin-left: 1rem + } + + .swagger-ui .ml4-ns { + margin-left: 2rem + } + + .swagger-ui .ml5-ns { + margin-left: 4rem + } + + .swagger-ui .ml6-ns { + margin-left: 8rem + } + + .swagger-ui .ml7-ns { + margin-left: 16rem + } + + .swagger-ui .mr0-ns { + margin-right: 0 + } + + .swagger-ui .mr1-ns { + margin-right: .25rem + } + + .swagger-ui .mr2-ns { + margin-right: .5rem + } + + .swagger-ui .mr3-ns { + margin-right: 1rem + } + + .swagger-ui .mr4-ns { + margin-right: 2rem + } + + .swagger-ui .mr5-ns { + margin-right: 4rem + } + + .swagger-ui .mr6-ns { + margin-right: 8rem + } + + .swagger-ui .mr7-ns { + margin-right: 16rem + } + + .swagger-ui .mb0-ns { + margin-bottom: 0 + } + + .swagger-ui .mb1-ns { + margin-bottom: .25rem + } + + .swagger-ui .mb2-ns { + margin-bottom: .5rem + } + + .swagger-ui .mb3-ns { + margin-bottom: 1rem + } + + .swagger-ui .mb4-ns { + margin-bottom: 2rem + } + + .swagger-ui .mb5-ns { + margin-bottom: 4rem + } + + .swagger-ui .mb6-ns { + margin-bottom: 8rem + } + + .swagger-ui .mb7-ns { + margin-bottom: 16rem + } + + .swagger-ui .mt0-ns { + margin-top: 0 + } + + .swagger-ui .mt1-ns { + margin-top: .25rem + } + + .swagger-ui .mt2-ns { + margin-top: .5rem + } + + .swagger-ui .mt3-ns { + margin-top: 1rem + } + + .swagger-ui .mt4-ns { + margin-top: 2rem + } + + .swagger-ui .mt5-ns { + margin-top: 4rem + } + + .swagger-ui .mt6-ns { + margin-top: 8rem + } + + .swagger-ui .mt7-ns { + margin-top: 16rem + } + + .swagger-ui .mv0-ns { + margin-bottom: 0; + margin-top: 0 + } + + .swagger-ui .mv1-ns { + margin-bottom: .25rem; + margin-top: .25rem + } + + .swagger-ui .mv2-ns { + margin-bottom: .5rem; + margin-top: .5rem + } + + .swagger-ui .mv3-ns { + margin-bottom: 1rem; + margin-top: 1rem + } + + .swagger-ui .mv4-ns { + margin-bottom: 2rem; + margin-top: 2rem + } + + .swagger-ui .mv5-ns { + margin-bottom: 4rem; + margin-top: 4rem + } + + .swagger-ui .mv6-ns { + margin-bottom: 8rem; + margin-top: 8rem + } + + .swagger-ui .mv7-ns { + margin-bottom: 16rem; + margin-top: 16rem + } + + .swagger-ui .mh0-ns { + margin-left: 0; + margin-right: 0 + } + + .swagger-ui .mh1-ns { + margin-left: .25rem; + margin-right: .25rem + } + + .swagger-ui .mh2-ns { + margin-left: .5rem; + margin-right: .5rem + } + + .swagger-ui .mh3-ns { + margin-left: 1rem; + margin-right: 1rem + } + + .swagger-ui .mh4-ns { + margin-left: 2rem; + margin-right: 2rem + } + + .swagger-ui .mh5-ns { + margin-left: 4rem; + margin-right: 4rem + } + + .swagger-ui .mh6-ns { + margin-left: 8rem; + margin-right: 8rem + } + + .swagger-ui .mh7-ns { + margin-left: 16rem; + margin-right: 16rem + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .pa0-m { + padding:0 + } + + .swagger-ui .pa1-m { + padding: .25rem + } + + .swagger-ui .pa2-m { + padding: .5rem + } + + .swagger-ui .pa3-m { + padding: 1rem + } + + .swagger-ui .pa4-m { + padding: 2rem + } + + .swagger-ui .pa5-m { + padding: 4rem + } + + .swagger-ui .pa6-m { + padding: 8rem + } + + .swagger-ui .pa7-m { + padding: 16rem + } + + .swagger-ui .pl0-m { + padding-left: 0 + } + + .swagger-ui .pl1-m { + padding-left: .25rem + } + + .swagger-ui .pl2-m { + padding-left: .5rem + } + + .swagger-ui .pl3-m { + padding-left: 1rem + } + + .swagger-ui .pl4-m { + padding-left: 2rem + } + + .swagger-ui .pl5-m { + padding-left: 4rem + } + + .swagger-ui .pl6-m { + padding-left: 8rem + } + + .swagger-ui .pl7-m { + padding-left: 16rem + } + + .swagger-ui .pr0-m { + padding-right: 0 + } + + .swagger-ui .pr1-m { + padding-right: .25rem + } + + .swagger-ui .pr2-m { + padding-right: .5rem + } + + .swagger-ui .pr3-m { + padding-right: 1rem + } + + .swagger-ui .pr4-m { + padding-right: 2rem + } + + .swagger-ui .pr5-m { + padding-right: 4rem + } + + .swagger-ui .pr6-m { + padding-right: 8rem + } + + .swagger-ui .pr7-m { + padding-right: 16rem + } + + .swagger-ui .pb0-m { + padding-bottom: 0 + } + + .swagger-ui .pb1-m { + padding-bottom: .25rem + } + + .swagger-ui .pb2-m { + padding-bottom: .5rem + } + + .swagger-ui .pb3-m { + padding-bottom: 1rem + } + + .swagger-ui .pb4-m { + padding-bottom: 2rem + } + + .swagger-ui .pb5-m { + padding-bottom: 4rem + } + + .swagger-ui .pb6-m { + padding-bottom: 8rem + } + + .swagger-ui .pb7-m { + padding-bottom: 16rem + } + + .swagger-ui .pt0-m { + padding-top: 0 + } + + .swagger-ui .pt1-m { + padding-top: .25rem + } + + .swagger-ui .pt2-m { + padding-top: .5rem + } + + .swagger-ui .pt3-m { + padding-top: 1rem + } + + .swagger-ui .pt4-m { + padding-top: 2rem + } + + .swagger-ui .pt5-m { + padding-top: 4rem + } + + .swagger-ui .pt6-m { + padding-top: 8rem + } + + .swagger-ui .pt7-m { + padding-top: 16rem + } + + .swagger-ui .pv0-m { + padding-bottom: 0; + padding-top: 0 + } + + .swagger-ui .pv1-m { + padding-bottom: .25rem; + padding-top: .25rem + } + + .swagger-ui .pv2-m { + padding-bottom: .5rem; + padding-top: .5rem + } + + .swagger-ui .pv3-m { + padding-bottom: 1rem; + padding-top: 1rem + } + + .swagger-ui .pv4-m { + padding-bottom: 2rem; + padding-top: 2rem + } + + .swagger-ui .pv5-m { + padding-bottom: 4rem; + padding-top: 4rem + } + + .swagger-ui .pv6-m { + padding-bottom: 8rem; + padding-top: 8rem + } + + .swagger-ui .pv7-m { + padding-bottom: 16rem; + padding-top: 16rem + } + + .swagger-ui .ph0-m { + padding-left: 0; + padding-right: 0 + } + + .swagger-ui .ph1-m { + padding-left: .25rem; + padding-right: .25rem + } + + .swagger-ui .ph2-m { + padding-left: .5rem; + padding-right: .5rem + } + + .swagger-ui .ph3-m { + padding-left: 1rem; + padding-right: 1rem + } + + .swagger-ui .ph4-m { + padding-left: 2rem; + padding-right: 2rem + } + + .swagger-ui .ph5-m { + padding-left: 4rem; + padding-right: 4rem + } + + .swagger-ui .ph6-m { + padding-left: 8rem; + padding-right: 8rem + } + + .swagger-ui .ph7-m { + padding-left: 16rem; + padding-right: 16rem + } + + .swagger-ui .ma0-m { + margin: 0 + } + + .swagger-ui .ma1-m { + margin: .25rem + } + + .swagger-ui .ma2-m { + margin: .5rem + } + + .swagger-ui .ma3-m { + margin: 1rem + } + + .swagger-ui .ma4-m { + margin: 2rem + } + + .swagger-ui .ma5-m { + margin: 4rem + } + + .swagger-ui .ma6-m { + margin: 8rem + } + + .swagger-ui .ma7-m { + margin: 16rem + } + + .swagger-ui .ml0-m { + margin-left: 0 + } + + .swagger-ui .ml1-m { + margin-left: .25rem + } + + .swagger-ui .ml2-m { + margin-left: .5rem + } + + .swagger-ui .ml3-m { + margin-left: 1rem + } + + .swagger-ui .ml4-m { + margin-left: 2rem + } + + .swagger-ui .ml5-m { + margin-left: 4rem + } + + .swagger-ui .ml6-m { + margin-left: 8rem + } + + .swagger-ui .ml7-m { + margin-left: 16rem + } + + .swagger-ui .mr0-m { + margin-right: 0 + } + + .swagger-ui .mr1-m { + margin-right: .25rem + } + + .swagger-ui .mr2-m { + margin-right: .5rem + } + + .swagger-ui .mr3-m { + margin-right: 1rem + } + + .swagger-ui .mr4-m { + margin-right: 2rem + } + + .swagger-ui .mr5-m { + margin-right: 4rem + } + + .swagger-ui .mr6-m { + margin-right: 8rem + } + + .swagger-ui .mr7-m { + margin-right: 16rem + } + + .swagger-ui .mb0-m { + margin-bottom: 0 + } + + .swagger-ui .mb1-m { + margin-bottom: .25rem + } + + .swagger-ui .mb2-m { + margin-bottom: .5rem + } + + .swagger-ui .mb3-m { + margin-bottom: 1rem + } + + .swagger-ui .mb4-m { + margin-bottom: 2rem + } + + .swagger-ui .mb5-m { + margin-bottom: 4rem + } + + .swagger-ui .mb6-m { + margin-bottom: 8rem + } + + .swagger-ui .mb7-m { + margin-bottom: 16rem + } + + .swagger-ui .mt0-m { + margin-top: 0 + } + + .swagger-ui .mt1-m { + margin-top: .25rem + } + + .swagger-ui .mt2-m { + margin-top: .5rem + } + + .swagger-ui .mt3-m { + margin-top: 1rem + } + + .swagger-ui .mt4-m { + margin-top: 2rem + } + + .swagger-ui .mt5-m { + margin-top: 4rem + } + + .swagger-ui .mt6-m { + margin-top: 8rem + } + + .swagger-ui .mt7-m { + margin-top: 16rem + } + + .swagger-ui .mv0-m { + margin-bottom: 0; + margin-top: 0 + } + + .swagger-ui .mv1-m { + margin-bottom: .25rem; + margin-top: .25rem + } + + .swagger-ui .mv2-m { + margin-bottom: .5rem; + margin-top: .5rem + } + + .swagger-ui .mv3-m { + margin-bottom: 1rem; + margin-top: 1rem + } + + .swagger-ui .mv4-m { + margin-bottom: 2rem; + margin-top: 2rem + } + + .swagger-ui .mv5-m { + margin-bottom: 4rem; + margin-top: 4rem + } + + .swagger-ui .mv6-m { + margin-bottom: 8rem; + margin-top: 8rem + } + + .swagger-ui .mv7-m { + margin-bottom: 16rem; + margin-top: 16rem + } + + .swagger-ui .mh0-m { + margin-left: 0; + margin-right: 0 + } + + .swagger-ui .mh1-m { + margin-left: .25rem; + margin-right: .25rem + } + + .swagger-ui .mh2-m { + margin-left: .5rem; + margin-right: .5rem + } + + .swagger-ui .mh3-m { + margin-left: 1rem; + margin-right: 1rem + } + + .swagger-ui .mh4-m { + margin-left: 2rem; + margin-right: 2rem + } + + .swagger-ui .mh5-m { + margin-left: 4rem; + margin-right: 4rem + } + + .swagger-ui .mh6-m { + margin-left: 8rem; + margin-right: 8rem + } + + .swagger-ui .mh7-m { + margin-left: 16rem; + margin-right: 16rem + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .pa0-l { + padding:0 + } + + .swagger-ui .pa1-l { + padding: .25rem + } + + .swagger-ui .pa2-l { + padding: .5rem + } + + .swagger-ui .pa3-l { + padding: 1rem + } + + .swagger-ui .pa4-l { + padding: 2rem + } + + .swagger-ui .pa5-l { + padding: 4rem + } + + .swagger-ui .pa6-l { + padding: 8rem + } + + .swagger-ui .pa7-l { + padding: 16rem + } + + .swagger-ui .pl0-l { + padding-left: 0 + } + + .swagger-ui .pl1-l { + padding-left: .25rem + } + + .swagger-ui .pl2-l { + padding-left: .5rem + } + + .swagger-ui .pl3-l { + padding-left: 1rem + } + + .swagger-ui .pl4-l { + padding-left: 2rem + } + + .swagger-ui .pl5-l { + padding-left: 4rem + } + + .swagger-ui .pl6-l { + padding-left: 8rem + } + + .swagger-ui .pl7-l { + padding-left: 16rem + } + + .swagger-ui .pr0-l { + padding-right: 0 + } + + .swagger-ui .pr1-l { + padding-right: .25rem + } + + .swagger-ui .pr2-l { + padding-right: .5rem + } + + .swagger-ui .pr3-l { + padding-right: 1rem + } + + .swagger-ui .pr4-l { + padding-right: 2rem + } + + .swagger-ui .pr5-l { + padding-right: 4rem + } + + .swagger-ui .pr6-l { + padding-right: 8rem + } + + .swagger-ui .pr7-l { + padding-right: 16rem + } + + .swagger-ui .pb0-l { + padding-bottom: 0 + } + + .swagger-ui .pb1-l { + padding-bottom: .25rem + } + + .swagger-ui .pb2-l { + padding-bottom: .5rem + } + + .swagger-ui .pb3-l { + padding-bottom: 1rem + } + + .swagger-ui .pb4-l { + padding-bottom: 2rem + } + + .swagger-ui .pb5-l { + padding-bottom: 4rem + } + + .swagger-ui .pb6-l { + padding-bottom: 8rem + } + + .swagger-ui .pb7-l { + padding-bottom: 16rem + } + + .swagger-ui .pt0-l { + padding-top: 0 + } + + .swagger-ui .pt1-l { + padding-top: .25rem + } + + .swagger-ui .pt2-l { + padding-top: .5rem + } + + .swagger-ui .pt3-l { + padding-top: 1rem + } + + .swagger-ui .pt4-l { + padding-top: 2rem + } + + .swagger-ui .pt5-l { + padding-top: 4rem + } + + .swagger-ui .pt6-l { + padding-top: 8rem + } + + .swagger-ui .pt7-l { + padding-top: 16rem + } + + .swagger-ui .pv0-l { + padding-bottom: 0; + padding-top: 0 + } + + .swagger-ui .pv1-l { + padding-bottom: .25rem; + padding-top: .25rem + } + + .swagger-ui .pv2-l { + padding-bottom: .5rem; + padding-top: .5rem + } + + .swagger-ui .pv3-l { + padding-bottom: 1rem; + padding-top: 1rem + } + + .swagger-ui .pv4-l { + padding-bottom: 2rem; + padding-top: 2rem + } + + .swagger-ui .pv5-l { + padding-bottom: 4rem; + padding-top: 4rem + } + + .swagger-ui .pv6-l { + padding-bottom: 8rem; + padding-top: 8rem + } + + .swagger-ui .pv7-l { + padding-bottom: 16rem; + padding-top: 16rem + } + + .swagger-ui .ph0-l { + padding-left: 0; + padding-right: 0 + } + + .swagger-ui .ph1-l { + padding-left: .25rem; + padding-right: .25rem + } + + .swagger-ui .ph2-l { + padding-left: .5rem; + padding-right: .5rem + } + + .swagger-ui .ph3-l { + padding-left: 1rem; + padding-right: 1rem + } + + .swagger-ui .ph4-l { + padding-left: 2rem; + padding-right: 2rem + } + + .swagger-ui .ph5-l { + padding-left: 4rem; + padding-right: 4rem + } + + .swagger-ui .ph6-l { + padding-left: 8rem; + padding-right: 8rem + } + + .swagger-ui .ph7-l { + padding-left: 16rem; + padding-right: 16rem + } + + .swagger-ui .ma0-l { + margin: 0 + } + + .swagger-ui .ma1-l { + margin: .25rem + } + + .swagger-ui .ma2-l { + margin: .5rem + } + + .swagger-ui .ma3-l { + margin: 1rem + } + + .swagger-ui .ma4-l { + margin: 2rem + } + + .swagger-ui .ma5-l { + margin: 4rem + } + + .swagger-ui .ma6-l { + margin: 8rem + } + + .swagger-ui .ma7-l { + margin: 16rem + } + + .swagger-ui .ml0-l { + margin-left: 0 + } + + .swagger-ui .ml1-l { + margin-left: .25rem + } + + .swagger-ui .ml2-l { + margin-left: .5rem + } + + .swagger-ui .ml3-l { + margin-left: 1rem + } + + .swagger-ui .ml4-l { + margin-left: 2rem + } + + .swagger-ui .ml5-l { + margin-left: 4rem + } + + .swagger-ui .ml6-l { + margin-left: 8rem + } + + .swagger-ui .ml7-l { + margin-left: 16rem + } + + .swagger-ui .mr0-l { + margin-right: 0 + } + + .swagger-ui .mr1-l { + margin-right: .25rem + } + + .swagger-ui .mr2-l { + margin-right: .5rem + } + + .swagger-ui .mr3-l { + margin-right: 1rem + } + + .swagger-ui .mr4-l { + margin-right: 2rem + } + + .swagger-ui .mr5-l { + margin-right: 4rem + } + + .swagger-ui .mr6-l { + margin-right: 8rem + } + + .swagger-ui .mr7-l { + margin-right: 16rem + } + + .swagger-ui .mb0-l { + margin-bottom: 0 + } + + .swagger-ui .mb1-l { + margin-bottom: .25rem + } + + .swagger-ui .mb2-l { + margin-bottom: .5rem + } + + .swagger-ui .mb3-l { + margin-bottom: 1rem + } + + .swagger-ui .mb4-l { + margin-bottom: 2rem + } + + .swagger-ui .mb5-l { + margin-bottom: 4rem + } + + .swagger-ui .mb6-l { + margin-bottom: 8rem + } + + .swagger-ui .mb7-l { + margin-bottom: 16rem + } + + .swagger-ui .mt0-l { + margin-top: 0 + } + + .swagger-ui .mt1-l { + margin-top: .25rem + } + + .swagger-ui .mt2-l { + margin-top: .5rem + } + + .swagger-ui .mt3-l { + margin-top: 1rem + } + + .swagger-ui .mt4-l { + margin-top: 2rem + } + + .swagger-ui .mt5-l { + margin-top: 4rem + } + + .swagger-ui .mt6-l { + margin-top: 8rem + } + + .swagger-ui .mt7-l { + margin-top: 16rem + } + + .swagger-ui .mv0-l { + margin-bottom: 0; + margin-top: 0 + } + + .swagger-ui .mv1-l { + margin-bottom: .25rem; + margin-top: .25rem + } + + .swagger-ui .mv2-l { + margin-bottom: .5rem; + margin-top: .5rem + } + + .swagger-ui .mv3-l { + margin-bottom: 1rem; + margin-top: 1rem + } + + .swagger-ui .mv4-l { + margin-bottom: 2rem; + margin-top: 2rem + } + + .swagger-ui .mv5-l { + margin-bottom: 4rem; + margin-top: 4rem + } + + .swagger-ui .mv6-l { + margin-bottom: 8rem; + margin-top: 8rem + } + + .swagger-ui .mv7-l { + margin-bottom: 16rem; + margin-top: 16rem + } + + .swagger-ui .mh0-l { + margin-left: 0; + margin-right: 0 + } + + .swagger-ui .mh1-l { + margin-left: .25rem; + margin-right: .25rem + } + + .swagger-ui .mh2-l { + margin-left: .5rem; + margin-right: .5rem + } + + .swagger-ui .mh3-l { + margin-left: 1rem; + margin-right: 1rem + } + + .swagger-ui .mh4-l { + margin-left: 2rem; + margin-right: 2rem + } + + .swagger-ui .mh5-l { + margin-left: 4rem; + margin-right: 4rem + } + + .swagger-ui .mh6-l { + margin-left: 8rem; + margin-right: 8rem + } + + .swagger-ui .mh7-l { + margin-left: 16rem; + margin-right: 16rem + } +} + +.swagger-ui .na1 { + margin: -.25rem +} + +.swagger-ui .na2 { + margin: -.5rem +} + +.swagger-ui .na3 { + margin: -1rem +} + +.swagger-ui .na4 { + margin: -2rem +} + +.swagger-ui .na5 { + margin: -4rem +} + +.swagger-ui .na6 { + margin: -8rem +} + +.swagger-ui .na7 { + margin: -16rem +} + +.swagger-ui .nl1 { + margin-left: -.25rem +} + +.swagger-ui .nl2 { + margin-left: -.5rem +} + +.swagger-ui .nl3 { + margin-left: -1rem +} + +.swagger-ui .nl4 { + margin-left: -2rem +} + +.swagger-ui .nl5 { + margin-left: -4rem +} + +.swagger-ui .nl6 { + margin-left: -8rem +} + +.swagger-ui .nl7 { + margin-left: -16rem +} + +.swagger-ui .nr1 { + margin-right: -.25rem +} + +.swagger-ui .nr2 { + margin-right: -.5rem +} + +.swagger-ui .nr3 { + margin-right: -1rem +} + +.swagger-ui .nr4 { + margin-right: -2rem +} + +.swagger-ui .nr5 { + margin-right: -4rem +} + +.swagger-ui .nr6 { + margin-right: -8rem +} + +.swagger-ui .nr7 { + margin-right: -16rem +} + +.swagger-ui .nb1 { + margin-bottom: -.25rem +} + +.swagger-ui .nb2 { + margin-bottom: -.5rem +} + +.swagger-ui .nb3 { + margin-bottom: -1rem +} + +.swagger-ui .nb4 { + margin-bottom: -2rem +} + +.swagger-ui .nb5 { + margin-bottom: -4rem +} + +.swagger-ui .nb6 { + margin-bottom: -8rem +} + +.swagger-ui .nb7 { + margin-bottom: -16rem +} + +.swagger-ui .nt1 { + margin-top: -.25rem +} + +.swagger-ui .nt2 { + margin-top: -.5rem +} + +.swagger-ui .nt3 { + margin-top: -1rem +} + +.swagger-ui .nt4 { + margin-top: -2rem +} + +.swagger-ui .nt5 { + margin-top: -4rem +} + +.swagger-ui .nt6 { + margin-top: -8rem +} + +.swagger-ui .nt7 { + margin-top: -16rem +} + +@media screen and (min-width: 30em) { + .swagger-ui .na1-ns { + margin:-.25rem + } + + .swagger-ui .na2-ns { + margin: -.5rem + } + + .swagger-ui .na3-ns { + margin: -1rem + } + + .swagger-ui .na4-ns { + margin: -2rem + } + + .swagger-ui .na5-ns { + margin: -4rem + } + + .swagger-ui .na6-ns { + margin: -8rem + } + + .swagger-ui .na7-ns { + margin: -16rem + } + + .swagger-ui .nl1-ns { + margin-left: -.25rem + } + + .swagger-ui .nl2-ns { + margin-left: -.5rem + } + + .swagger-ui .nl3-ns { + margin-left: -1rem + } + + .swagger-ui .nl4-ns { + margin-left: -2rem + } + + .swagger-ui .nl5-ns { + margin-left: -4rem + } + + .swagger-ui .nl6-ns { + margin-left: -8rem + } + + .swagger-ui .nl7-ns { + margin-left: -16rem + } + + .swagger-ui .nr1-ns { + margin-right: -.25rem + } + + .swagger-ui .nr2-ns { + margin-right: -.5rem + } + + .swagger-ui .nr3-ns { + margin-right: -1rem + } + + .swagger-ui .nr4-ns { + margin-right: -2rem + } + + .swagger-ui .nr5-ns { + margin-right: -4rem + } + + .swagger-ui .nr6-ns { + margin-right: -8rem + } + + .swagger-ui .nr7-ns { + margin-right: -16rem + } + + .swagger-ui .nb1-ns { + margin-bottom: -.25rem + } + + .swagger-ui .nb2-ns { + margin-bottom: -.5rem + } + + .swagger-ui .nb3-ns { + margin-bottom: -1rem + } + + .swagger-ui .nb4-ns { + margin-bottom: -2rem + } + + .swagger-ui .nb5-ns { + margin-bottom: -4rem + } + + .swagger-ui .nb6-ns { + margin-bottom: -8rem + } + + .swagger-ui .nb7-ns { + margin-bottom: -16rem + } + + .swagger-ui .nt1-ns { + margin-top: -.25rem + } + + .swagger-ui .nt2-ns { + margin-top: -.5rem + } + + .swagger-ui .nt3-ns { + margin-top: -1rem + } + + .swagger-ui .nt4-ns { + margin-top: -2rem + } + + .swagger-ui .nt5-ns { + margin-top: -4rem + } + + .swagger-ui .nt6-ns { + margin-top: -8rem + } + + .swagger-ui .nt7-ns { + margin-top: -16rem + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .na1-m { + margin:-.25rem + } + + .swagger-ui .na2-m { + margin: -.5rem + } + + .swagger-ui .na3-m { + margin: -1rem + } + + .swagger-ui .na4-m { + margin: -2rem + } + + .swagger-ui .na5-m { + margin: -4rem + } + + .swagger-ui .na6-m { + margin: -8rem + } + + .swagger-ui .na7-m { + margin: -16rem + } + + .swagger-ui .nl1-m { + margin-left: -.25rem + } + + .swagger-ui .nl2-m { + margin-left: -.5rem + } + + .swagger-ui .nl3-m { + margin-left: -1rem + } + + .swagger-ui .nl4-m { + margin-left: -2rem + } + + .swagger-ui .nl5-m { + margin-left: -4rem + } + + .swagger-ui .nl6-m { + margin-left: -8rem + } + + .swagger-ui .nl7-m { + margin-left: -16rem + } + + .swagger-ui .nr1-m { + margin-right: -.25rem + } + + .swagger-ui .nr2-m { + margin-right: -.5rem + } + + .swagger-ui .nr3-m { + margin-right: -1rem + } + + .swagger-ui .nr4-m { + margin-right: -2rem + } + + .swagger-ui .nr5-m { + margin-right: -4rem + } + + .swagger-ui .nr6-m { + margin-right: -8rem + } + + .swagger-ui .nr7-m { + margin-right: -16rem + } + + .swagger-ui .nb1-m { + margin-bottom: -.25rem + } + + .swagger-ui .nb2-m { + margin-bottom: -.5rem + } + + .swagger-ui .nb3-m { + margin-bottom: -1rem + } + + .swagger-ui .nb4-m { + margin-bottom: -2rem + } + + .swagger-ui .nb5-m { + margin-bottom: -4rem + } + + .swagger-ui .nb6-m { + margin-bottom: -8rem + } + + .swagger-ui .nb7-m { + margin-bottom: -16rem + } + + .swagger-ui .nt1-m { + margin-top: -.25rem + } + + .swagger-ui .nt2-m { + margin-top: -.5rem + } + + .swagger-ui .nt3-m { + margin-top: -1rem + } + + .swagger-ui .nt4-m { + margin-top: -2rem + } + + .swagger-ui .nt5-m { + margin-top: -4rem + } + + .swagger-ui .nt6-m { + margin-top: -8rem + } + + .swagger-ui .nt7-m { + margin-top: -16rem + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .na1-l { + margin:-.25rem + } + + .swagger-ui .na2-l { + margin: -.5rem + } + + .swagger-ui .na3-l { + margin: -1rem + } + + .swagger-ui .na4-l { + margin: -2rem + } + + .swagger-ui .na5-l { + margin: -4rem + } + + .swagger-ui .na6-l { + margin: -8rem + } + + .swagger-ui .na7-l { + margin: -16rem + } + + .swagger-ui .nl1-l { + margin-left: -.25rem + } + + .swagger-ui .nl2-l { + margin-left: -.5rem + } + + .swagger-ui .nl3-l { + margin-left: -1rem + } + + .swagger-ui .nl4-l { + margin-left: -2rem + } + + .swagger-ui .nl5-l { + margin-left: -4rem + } + + .swagger-ui .nl6-l { + margin-left: -8rem + } + + .swagger-ui .nl7-l { + margin-left: -16rem + } + + .swagger-ui .nr1-l { + margin-right: -.25rem + } + + .swagger-ui .nr2-l { + margin-right: -.5rem + } + + .swagger-ui .nr3-l { + margin-right: -1rem + } + + .swagger-ui .nr4-l { + margin-right: -2rem + } + + .swagger-ui .nr5-l { + margin-right: -4rem + } + + .swagger-ui .nr6-l { + margin-right: -8rem + } + + .swagger-ui .nr7-l { + margin-right: -16rem + } + + .swagger-ui .nb1-l { + margin-bottom: -.25rem + } + + .swagger-ui .nb2-l { + margin-bottom: -.5rem + } + + .swagger-ui .nb3-l { + margin-bottom: -1rem + } + + .swagger-ui .nb4-l { + margin-bottom: -2rem + } + + .swagger-ui .nb5-l { + margin-bottom: -4rem + } + + .swagger-ui .nb6-l { + margin-bottom: -8rem + } + + .swagger-ui .nb7-l { + margin-bottom: -16rem + } + + .swagger-ui .nt1-l { + margin-top: -.25rem + } + + .swagger-ui .nt2-l { + margin-top: -.5rem + } + + .swagger-ui .nt3-l { + margin-top: -1rem + } + + .swagger-ui .nt4-l { + margin-top: -2rem + } + + .swagger-ui .nt5-l { + margin-top: -4rem + } + + .swagger-ui .nt6-l { + margin-top: -8rem + } + + .swagger-ui .nt7-l { + margin-top: -16rem + } +} + +.swagger-ui .collapse { + border-collapse: collapse; + border-spacing: 0 +} + +.swagger-ui .striped--light-silver:nth-child(odd) { + background-color: #aaa +} + +.swagger-ui .striped--moon-gray:nth-child(odd) { + background-color: #ccc +} + +.swagger-ui .striped--light-gray:nth-child(odd) { + background-color: #eee +} + +.swagger-ui .striped--near-white:nth-child(odd) { + background-color: #f4f4f4 +} + +.swagger-ui .stripe-light:nth-child(odd) { + background-color: hsla(0,0%,100%,.1) +} + +.swagger-ui .stripe-dark:nth-child(odd) { + background-color: rgba(0,0,0,.1) +} + +.swagger-ui .strike { + -webkit-text-decoration: line-through; + text-decoration: line-through +} + +.swagger-ui .underline { + -webkit-text-decoration: underline; + text-decoration: underline +} + +.swagger-ui .no-underline { + -webkit-text-decoration: none; + text-decoration: none +} + +@media screen and (min-width: 30em) { + .swagger-ui .strike-ns { + -webkit-text-decoration:line-through; + text-decoration: line-through + } + + .swagger-ui .underline-ns { + -webkit-text-decoration: underline; + text-decoration: underline + } + + .swagger-ui .no-underline-ns { + -webkit-text-decoration: none; + text-decoration: none + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .strike-m { + -webkit-text-decoration:line-through; + text-decoration: line-through + } + + .swagger-ui .underline-m { + -webkit-text-decoration: underline; + text-decoration: underline + } + + .swagger-ui .no-underline-m { + -webkit-text-decoration: none; + text-decoration: none + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .strike-l { + -webkit-text-decoration:line-through; + text-decoration: line-through + } + + .swagger-ui .underline-l { + -webkit-text-decoration: underline; + text-decoration: underline + } + + .swagger-ui .no-underline-l { + -webkit-text-decoration: none; + text-decoration: none + } +} + +.swagger-ui .tl { + text-align: left +} + +.swagger-ui .tr { + text-align: right +} + +.swagger-ui .tc { + text-align: center +} + +.swagger-ui .tj { + text-align: justify +} + +@media screen and (min-width: 30em) { + .swagger-ui .tl-ns { + text-align:left + } + + .swagger-ui .tr-ns { + text-align: right + } + + .swagger-ui .tc-ns { + text-align: center + } + + .swagger-ui .tj-ns { + text-align: justify + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .tl-m { + text-align:left + } + + .swagger-ui .tr-m { + text-align: right + } + + .swagger-ui .tc-m { + text-align: center + } + + .swagger-ui .tj-m { + text-align: justify + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .tl-l { + text-align:left + } + + .swagger-ui .tr-l { + text-align: right + } + + .swagger-ui .tc-l { + text-align: center + } + + .swagger-ui .tj-l { + text-align: justify + } +} + +.swagger-ui .ttc { + text-transform: capitalize +} + +.swagger-ui .ttl { + text-transform: lowercase +} + +.swagger-ui .ttu { + text-transform: uppercase +} + +.swagger-ui .ttn { + text-transform: none +} + +@media screen and (min-width: 30em) { + .swagger-ui .ttc-ns { + text-transform:capitalize + } + + .swagger-ui .ttl-ns { + text-transform: lowercase + } + + .swagger-ui .ttu-ns { + text-transform: uppercase + } + + .swagger-ui .ttn-ns { + text-transform: none + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .ttc-m { + text-transform:capitalize + } + + .swagger-ui .ttl-m { + text-transform: lowercase + } + + .swagger-ui .ttu-m { + text-transform: uppercase + } + + .swagger-ui .ttn-m { + text-transform: none + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .ttc-l { + text-transform:capitalize + } + + .swagger-ui .ttl-l { + text-transform: lowercase + } + + .swagger-ui .ttu-l { + text-transform: uppercase + } + + .swagger-ui .ttn-l { + text-transform: none + } +} + +.swagger-ui .f-6,.swagger-ui .f-headline { + font-size: 6rem +} + +.swagger-ui .f-5,.swagger-ui .f-subheadline { + font-size: 5rem +} + +.swagger-ui .f1 { + font-size: 3rem +} + +.swagger-ui .f2 { + font-size: 2.25rem +} + +.swagger-ui .f3 { + font-size: 1.5rem +} + +.swagger-ui .f4 { + font-size: 1.25rem +} + +.swagger-ui .f5 { + font-size: 1rem +} + +.swagger-ui .f6 { + font-size: .875rem +} + +.swagger-ui .f7 { + font-size: .75rem +} + +@media screen and (min-width: 30em) { + .swagger-ui .f-6-ns,.swagger-ui .f-headline-ns { + font-size:6rem + } + + .swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns { + font-size: 5rem + } + + .swagger-ui .f1-ns { + font-size: 3rem + } + + .swagger-ui .f2-ns { + font-size: 2.25rem + } + + .swagger-ui .f3-ns { + font-size: 1.5rem + } + + .swagger-ui .f4-ns { + font-size: 1.25rem + } + + .swagger-ui .f5-ns { + font-size: 1rem + } + + .swagger-ui .f6-ns { + font-size: .875rem + } + + .swagger-ui .f7-ns { + font-size: .75rem + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .f-6-m,.swagger-ui .f-headline-m { + font-size:6rem + } + + .swagger-ui .f-5-m,.swagger-ui .f-subheadline-m { + font-size: 5rem + } + + .swagger-ui .f1-m { + font-size: 3rem + } + + .swagger-ui .f2-m { + font-size: 2.25rem + } + + .swagger-ui .f3-m { + font-size: 1.5rem + } + + .swagger-ui .f4-m { + font-size: 1.25rem + } + + .swagger-ui .f5-m { + font-size: 1rem + } + + .swagger-ui .f6-m { + font-size: .875rem + } + + .swagger-ui .f7-m { + font-size: .75rem + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .f-6-l,.swagger-ui .f-headline-l { + font-size:6rem + } + + .swagger-ui .f-5-l,.swagger-ui .f-subheadline-l { + font-size: 5rem + } + + .swagger-ui .f1-l { + font-size: 3rem + } + + .swagger-ui .f2-l { + font-size: 2.25rem + } + + .swagger-ui .f3-l { + font-size: 1.5rem + } + + .swagger-ui .f4-l { + font-size: 1.25rem + } + + .swagger-ui .f5-l { + font-size: 1rem + } + + .swagger-ui .f6-l { + font-size: .875rem + } + + .swagger-ui .f7-l { + font-size: .75rem + } +} + +.swagger-ui .measure { + max-width: 30em +} + +.swagger-ui .measure-wide { + max-width: 34em +} + +.swagger-ui .measure-narrow { + max-width: 20em +} + +.swagger-ui .indent { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em +} + +.swagger-ui .small-caps { + font-feature-settings: "smcp"; + font-variant: small-caps +} + +.swagger-ui .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +@media screen and (min-width: 30em) { + .swagger-ui .measure-ns { + max-width:30em + } + + .swagger-ui .measure-wide-ns { + max-width: 34em + } + + .swagger-ui .measure-narrow-ns { + max-width: 20em + } + + .swagger-ui .indent-ns { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em + } + + .swagger-ui .small-caps-ns { + font-feature-settings: "smcp"; + font-variant: small-caps + } + + .swagger-ui .truncate-ns { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .measure-m { + max-width:30em + } + + .swagger-ui .measure-wide-m { + max-width: 34em + } + + .swagger-ui .measure-narrow-m { + max-width: 20em + } + + .swagger-ui .indent-m { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em + } + + .swagger-ui .small-caps-m { + font-feature-settings: "smcp"; + font-variant: small-caps + } + + .swagger-ui .truncate-m { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .measure-l { + max-width:30em + } + + .swagger-ui .measure-wide-l { + max-width: 34em + } + + .swagger-ui .measure-narrow-l { + max-width: 20em + } + + .swagger-ui .indent-l { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em + } + + .swagger-ui .small-caps-l { + font-feature-settings: "smcp"; + font-variant: small-caps + } + + .swagger-ui .truncate-l { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap + } +} + +.swagger-ui .overflow-container { + overflow-y: scroll +} + +.swagger-ui .center { + margin-left: auto; + margin-right: auto +} + +.swagger-ui .mr-auto { + margin-right: auto +} + +.swagger-ui .ml-auto { + margin-left: auto +} + +@media screen and (min-width: 30em) { + .swagger-ui .center-ns { + margin-left:auto; + margin-right: auto + } + + .swagger-ui .mr-auto-ns { + margin-right: auto + } + + .swagger-ui .ml-auto-ns { + margin-left: auto + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .center-m { + margin-left:auto; + margin-right: auto + } + + .swagger-ui .mr-auto-m { + margin-right: auto + } + + .swagger-ui .ml-auto-m { + margin-left: auto + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .center-l { + margin-left:auto; + margin-right: auto + } + + .swagger-ui .mr-auto-l { + margin-right: auto + } + + .swagger-ui .ml-auto-l { + margin-left: auto + } +} + +.swagger-ui .clip { + position: fixed!important; + _position: absolute!important; + clip: rect(1px 1px 1px 1px); + clip: rect(1px,1px,1px,1px) +} + +@media screen and (min-width: 30em) { + .swagger-ui .clip-ns { + position:fixed!important; + _position: absolute!important; + clip: rect(1px 1px 1px 1px); + clip: rect(1px,1px,1px,1px) + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .clip-m { + position:fixed!important; + _position: absolute!important; + clip: rect(1px 1px 1px 1px); + clip: rect(1px,1px,1px,1px) + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .clip-l { + position:fixed!important; + _position: absolute!important; + clip: rect(1px 1px 1px 1px); + clip: rect(1px,1px,1px,1px) + } +} + +.swagger-ui .ws-normal { + white-space: normal +} + +.swagger-ui .nowrap { + white-space: nowrap +} + +.swagger-ui .pre { + white-space: pre +} + +@media screen and (min-width: 30em) { + .swagger-ui .ws-normal-ns { + white-space:normal + } + + .swagger-ui .nowrap-ns { + white-space: nowrap + } + + .swagger-ui .pre-ns { + white-space: pre + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .ws-normal-m { + white-space:normal + } + + .swagger-ui .nowrap-m { + white-space: nowrap + } + + .swagger-ui .pre-m { + white-space: pre + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .ws-normal-l { + white-space:normal + } + + .swagger-ui .nowrap-l { + white-space: nowrap + } + + .swagger-ui .pre-l { + white-space: pre + } +} + +.swagger-ui .v-base { + vertical-align: baseline +} + +.swagger-ui .v-mid { + vertical-align: middle +} + +.swagger-ui .v-top { + vertical-align: top +} + +.swagger-ui .v-btm { + vertical-align: bottom +} + +@media screen and (min-width: 30em) { + .swagger-ui .v-base-ns { + vertical-align:baseline + } + + .swagger-ui .v-mid-ns { + vertical-align: middle + } + + .swagger-ui .v-top-ns { + vertical-align: top + } + + .swagger-ui .v-btm-ns { + vertical-align: bottom + } +} + +@media screen and (min-width: 30em)and (max-width:60em) { + .swagger-ui .v-base-m { + vertical-align:baseline + } + + .swagger-ui .v-mid-m { + vertical-align: middle + } + + .swagger-ui .v-top-m { + vertical-align: top + } + + .swagger-ui .v-btm-m { + vertical-align: bottom + } +} + +@media screen and (min-width: 60em) { + .swagger-ui .v-base-l { + vertical-align:baseline + } + + .swagger-ui .v-mid-l { + vertical-align: middle + } + + .swagger-ui .v-top-l { + vertical-align: top + } + + .swagger-ui .v-btm-l { + vertical-align: bottom + } +} + +.swagger-ui .dim { + opacity: 1; + transition: opacity .15s ease-in +} + +.swagger-ui .dim:focus,.swagger-ui .dim:hover { + opacity: .5; + transition: opacity .15s ease-in +} + +.swagger-ui .dim:active { + opacity: .8; + transition: opacity .15s ease-out +} + +.swagger-ui .glow { + transition: opacity .15s ease-in +} + +.swagger-ui .glow:focus,.swagger-ui .glow:hover { + opacity: 1; + transition: opacity .15s ease-in +} + +.swagger-ui .hide-child .child { + opacity: 0; + transition: opacity .15s ease-in +} + +.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child { + opacity: 1; + transition: opacity .15s ease-in +} + +.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover { + -webkit-text-decoration: underline; + text-decoration: underline +} + +.swagger-ui .grow { + -moz-osx-font-smoothing: grayscale; + backface-visibility: hidden; + transform: translateZ(0); + transition: transform .25s ease-out +} + +.swagger-ui .grow:focus,.swagger-ui .grow:hover { + transform: scale(1.05) +} + +.swagger-ui .grow:active { + transform: scale(.9) +} + +.swagger-ui .grow-large { + -moz-osx-font-smoothing: grayscale; + backface-visibility: hidden; + transform: translateZ(0); + transition: transform .25s ease-in-out +} + +.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover { + transform: scale(1.2) +} + +.swagger-ui .grow-large:active { + transform: scale(.95) +} + +.swagger-ui .pointer:hover { + cursor: pointer +} + +.swagger-ui .shadow-hover { + cursor: pointer; + position: relative; + transition: all .5s cubic-bezier(.165,.84,.44,1) +} + +.swagger-ui .shadow-hover:after { + content: ""; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + transition: opacity .5s cubic-bezier(.165,.84,.44,1); + width: 100%; + z-index: -1 +} + +.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after { + opacity: 1 +} + +.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover { + transition: background-color .15s ease-in-out +} + +.swagger-ui .z-0 { + z-index: 0 +} + +.swagger-ui .z-1 { + z-index: 1 +} + +.swagger-ui .z-2 { + z-index: 2 +} + +.swagger-ui .z-3 { + z-index: 3 +} + +.swagger-ui .z-4 { + z-index: 4 +} + +.swagger-ui .z-5 { + z-index: 5 +} + +.swagger-ui .z-999 { + z-index: 999 +} + +.swagger-ui .z-9999 { + z-index: 9999 +} + +.swagger-ui .z-max { + z-index: 2147483647 +} + +.swagger-ui .z-inherit { + z-index: inherit +} + +.swagger-ui .z-initial,.swagger-ui .z-unset { + z-index: auto +} + +.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul { + line-height: 1.5 +} + +.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6 { + line-height: 1.25 +} + +.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul { + list-style-type: none; + margin-left: 0; + padding-left: 0 +} + +.swagger-ui .nested-copy-indent p+p { + margin-bottom: 0; + margin-top: 0; + text-indent: .1em +} + +.swagger-ui .nested-copy-seperator p+p { + margin-top: 1.5em +} + +.swagger-ui .nested-img img { + display: block; + max-width: 100%; + width: 100% +} + +.swagger-ui .nested-links a { + color: #357edd; + transition: color .15s ease-in +} + +.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover { + color: #96ccff; + transition: color .15s ease-in +} + +.swagger-ui .wrapper { + box-sizing: border-box; + margin: 0 auto; + max-width: 1460px; + padding: 0 20px; + width: 100% +} + +.swagger-ui .opblock-tag-section { + display: flex; + flex-direction: column +} + +.swagger-ui .try-out.btn-group { + display: flex; + flex: .1 2 auto; + padding: 0 +} + +.swagger-ui .try-out__btn { + margin-left: 1.25rem +} + +.swagger-ui .opblock-tag { + align-items: center; + cursor: pointer; + display: none; + padding: 10px 20px 10px 10px; + transition: all .2s +} + +.swagger-ui .opblock-tag:hover { + background: rgba(0,0,0,.02) +} + +.swagger-ui .opblock-tag { + color: #3b4151; + font-family: sans-serif; + font-size: 24px; + margin: 0 0 5px +} + +.swagger-ui .opblock-tag.no-desc span { + flex: 1 +} + +.swagger-ui .opblock-tag svg { + transition: all .4s +} + +.swagger-ui .opblock-tag small { + color: #3b4151; + flex: 2; + font-family: sans-serif; + font-size: 14px; + font-weight: 400; + padding: 0 10px +} + +.swagger-ui .opblock-tag>div { + flex: 1 1 150px; + font-weight: 400; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +@media(max-width: 640px) { + .swagger-ui .opblock-tag small,.swagger-ui .opblock-tag>div { + flex:1 + } +} + +.swagger-ui .opblock-tag .info__externaldocs { + text-align: right +} + +.swagger-ui .parameter__type { + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 600; + padding: 5px 0 +} + +.swagger-ui .parameter-controls { + margin-top: .75em +} + +.swagger-ui .examples__title { + display: block; + font-size: 1.1em; + font-weight: 700; + margin-bottom: .75em +} + +.swagger-ui .examples__section { + margin-top: 1.5em +} + +.swagger-ui .examples__section-header { + font-size: .9rem; + font-weight: 700; + margin-bottom: .5rem +} + +.swagger-ui .examples-select { + display: inline-block; + margin-bottom: .75em +} + +.swagger-ui .examples-select .examples-select-element { + width: 100% +} + +.swagger-ui .examples-select__section-label { + font-size: .9rem; + font-weight: 700; + margin-right: .5rem +} + +.swagger-ui .example__section { + margin-top: 1.5em +} + +.swagger-ui .example__section-header { + font-size: .9rem; + font-weight: 700; + margin-bottom: .5rem +} + +.swagger-ui .view-line-link { + cursor: pointer; + margin: 0 5px; + position: relative; + top: 3px; + transition: all .5s; + width: 20px +} + +.swagger-ui .opblock .tab-header { + display: flex; + flex: 1 +} + +.swagger-ui .opblock .tab-header .tab-item { + cursor: pointer; + padding: 0 40px +} + +.swagger-ui .opblock .tab-header .tab-item:first-of-type { + padding: 0 40px 0 0 +} + +.swagger-ui .opblock .tab-header .tab-item.active h4 span { + position: relative +} + +.swagger-ui .opblock .tab-header .tab-item.active h4 span:after { + background: grey; + bottom: -15px; + content: ""; + height: 4px; + left: 50%; + position: absolute; + transform: translateX(-50%); + width: 120% +} + +.swagger-ui .opblock .opblock-section-header { + align-items: center; + background: #ccc; + display: flex; + min-height: 50px; + padding: 8px 20px +} + +.swagger-ui .opblock .opblock-section-header>label { + align-items: center; + color: #3b4151; + display: flex; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: 0 0 0 auto +} + +.swagger-ui .opblock .opblock-section-header>label>span { + padding: 0 10px 0 0 +} + +.swagger-ui .opblock .opblock-section-header h4 { + color: #3b4151; + flex: 1; + font-family: sans-serif; + font-size: 14px; + margin: 0 +} + +.swagger-ui .opblock .opblock-summary-method { + background: #000; + color: #fff; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + min-width: 80px; + padding: 6px 0; + text-align: center; + text-shadow: 0 1px 0 rgba(0,0,0,.1) +} + +@media(max-width: 768px) { + .swagger-ui .opblock .opblock-summary-method { + font-size:12px + } +} + +.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated { + align-items: center; + color: #3b4151; + display: flex; + font-family: monospace; + font-size: 16px; + font-weight: 600; + word-break: break-word +} + +@media(max-width: 768px) { + .swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated { + font-size:12px + } +} + +.swagger-ui .opblock .opblock-summary-path { + flex-shrink: 1 +} + +@media(max-width: 640px) { + .swagger-ui .opblock .opblock-summary-path { + max-width:100% + } +} + +.swagger-ui .opblock .opblock-summary-path__deprecated { + -webkit-text-decoration: line-through; + text-decoration: line-through +} + +.swagger-ui .opblock .opblock-summary-operation-id { + font-size: 14px +} + +.swagger-ui .opblock .opblock-summary-description { + color: #3b4151; + font-family: sans-serif; + font-size: 13px; + word-break: break-word +} + +.swagger-ui .opblock .opblock-summary-path-description-wrapper { + align-items: center; + display: flex; + flex-direction: row; + flex-grow: 1; + flex-wrap: wrap; + gap: 0 10px; + padding: 0 10px +} + +@media(max-width: 550px) { + .swagger-ui .opblock .opblock-summary-path-description-wrapper { + align-items:flex-start; + flex-direction: column + } +} + +.swagger-ui .opblock .opblock-summary { + align-items: center; + cursor: pointer; + display: flex; + padding: 5px +} + +.swagger-ui .opblock .opblock-summary .view-line-link { + cursor: pointer; + margin: 0; + position: relative; + top: 2px; + transition: all .5s; + width: 0 +} + +.swagger-ui .opblock .opblock-summary:hover .view-line-link { + margin: 0 5px; + width: 18px +} + +.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard { + width: 24px +} + +.swagger-ui .opblock.opblock-post { + background: rgba(73,204,144,.1); +} + +.swagger-ui .opblock.opblock-post .opblock-summary-method { + background: darkmagenta; + box-shadow: 4px 4px 8px #444 +} + +.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after { + background: #49cc90 +} + +.swagger-ui .opblock.opblock-put { + background: rgba(252,161,48,.1); +} + +.swagger-ui .opblock.opblock-put .opblock-summary-method { + background: #fca130 +} + +.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after { + background: #fca130 +} + +.swagger-ui .opblock.opblock-delete { + background: rgba(249,62,62,.1); +} + +.swagger-ui .opblock.opblock-delete .opblock-summary-method { + background: #f93e3e +} + +.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after { + background: #f93e3e +} + +.swagger-ui .opblock.opblock-get { + background: rgba(97,175,254,.1); +} + +.swagger-ui .opblock.opblock-get .opblock-summary-method { + background: teal; + box-shadow: 4px 4px 8px #444; +} + +.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after { + background: #61affe +} + +.swagger-ui .opblock.opblock-patch { + background: rgba(80,227,194,.1); +} + +.swagger-ui .opblock.opblock-patch .opblock-summary-method { + background: #50e3c2 +} + +.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after { + background: #50e3c2 +} + +.swagger-ui .opblock.opblock-head .opblock-summary-method { + background: #9012fe; + box-shadow: 4px 4px 8px #444; +} + +.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after { + background: #9012fe +} + +.swagger-ui .opblock.opblock-options { + background: rgba(13,90,167,.1); +} + +.swagger-ui .opblock.opblock-options .opblock-summary-method { + background: #0d5aa7 +} + +.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after { + background: #0d5aa7 +} + +.swagger-ui .opblock.opblock-deprecated { + background: hsla(0,0%,92%,.1); + opacity: .6 +} + +.swagger-ui .opblock.opblock-deprecated .opblock-summary-method { + background: #ebebeb +} + +.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after { + background: #ebebeb +} + +.swagger-ui .opblock .opblock-schemes { + padding: 8px 20px +} + +.swagger-ui .opblock .opblock-schemes .schemes-title { + padding: 0 10px 0 0 +} + +.swagger-ui .filter .operation-filter-input { + margin: 20px 0; + padding: 10px; + width: 100% +} + +.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed { + color: red +} + +.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading { + color: #aaa +} + +.swagger-ui .model-example { + margin-top: 1em +} + +.swagger-ui .model-example .model-container { + overflow-x: auto; + width: 100% +} + +.swagger-ui .model-example .model-container .model-hint:not(.model-hint--embedded) { + top: -1.15em +} + +.swagger-ui .tab { + display: flex; + list-style: none; + padding: 0; + margin: 0.1em; +} + +.swagger-ui .tab li { + color: #3b4151; + cursor: pointer; + font-family: sans-serif; + font-size: 12px; + min-width: 60px; + padding: 0 +} + +.swagger-ui .tab li:first-of-type { + padding-left: 0; + padding-right: 12px; + position: relative +} + +.swagger-ui .tab li:first-of-type:after { + background: rgba(0,0,0,.2); + content: ""; + height: 100%; + position: absolute; + right: 6px; + top: 0; + width: 1px +} + +.swagger-ui .tab li.active { + font-weight: 700 +} + +.swagger-ui .tab li button.tablinks { + background: none; + color: inherit; + font-family: inherit; + font-weight: inherit; + padding: 0 +} + +.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px; + padding: 15px 20px +} + +.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4 { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px +} + +.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p { + color: #3b4151; + font-family: sans-serif; + font-size: 14px; + margin: 0 +} + +.swagger-ui .opblock-external-docs-wrapper h4 { + padding-left: 0 +} + +.swagger-ui .execute-wrapper { + padding: 20px; + text-align: right +} + +.swagger-ui .execute-wrapper .btn { + padding: 8px 40px; + width: 100% +} + +.swagger-ui .body-param-options { + display: flex; + flex-direction: column +} + +.swagger-ui .body-param-options .body-param-edit { + padding: 10px 0 +} + +.swagger-ui .body-param-options label { + padding: 8px 0 +} + +.swagger-ui .body-param-options label select { + margin: 3px 0 0 +} + +.swagger-ui .responses-inner { + padding-left: 20px; +} + +.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5 { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + margin: 10px 0 5px +} + +.swagger-ui .responses-inner .curl { + max-height: 400px; + min-height: 6em; + overflow-y: auto +} + +.swagger-ui .response-col_status { + color: #3b4151; + font-family: sans-serif; + font-size: 14px +} + +.swagger-ui .response-col_status .response-undocumented { + color: #909090; + font-family: monospace; + font-size: 11px; + font-weight: 600 +} + +.swagger-ui .response-col_links { + color: #3b4151; + font-family: sans-serif; + font-size: 14px; + max-width: 40em; + padding-left: 2em +} + +.swagger-ui .response-col_links .response-undocumented { + color: #909090; + font-family: monospace; + font-size: 11px; + font-weight: 600 +} + +.swagger-ui .response-col_links .operation-link { + margin-bottom: 1.5em +} + +.swagger-ui .response-col_links .operation-link .description { + margin-bottom: .5em +} + +.swagger-ui .opblock-body .opblock-loading-animation { + display: block; + margin: 3em auto +} + +.swagger-ui .opblock-body pre.microlight { + background: #333; + font-size: 12px; + hyphens: auto; + margin: 0; + padding: 10px; + white-space: pre-wrap; + word-break: break-all; + word-break: break-word; + word-wrap: break-word; + color: #fff; + font-family: monospace; + font-weight: 600 +} + +.swagger-ui .opblock-body pre.microlight .headerline { + display: block +} + +.swagger-ui .highlight-code { + position: relative +} + +.swagger-ui .highlight-code>.microlight { + max-height: 400px; + min-height: 6em; + overflow-y: auto +} + +.swagger-ui .highlight-code>.microlight code { + white-space: pre-wrap!important; + word-break: break-all +} + +.swagger-ui .curl-command { + position: relative +} + +.swagger-ui .download-contents { + align-items: center; + background: #7d8293; + bottom: 10px; + color: #fff; + display: flex; + font-family: sans-serif; + font-size: 14px; + font-weight: 600; + height: 30px; + justify-content: center; + padding: 5px; + position: absolute; + right: 10px; + text-align: center +} + +.swagger-ui .scheme-container { + background: #fff; + margin: 0 0 20px; + padding: 30px 0 +} + +.swagger-ui .scheme-container .schemes { + align-items: flex-end; + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: space-between +} + +.swagger-ui .scheme-container .schemes>.schemes-server-container { + display: flex; + flex-wrap: wrap; + gap: 10px +} + +.swagger-ui .scheme-container .schemes>.schemes-server-container>label { + color: #3b4151; + display: flex; + flex-direction: column; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: -20px 15px 0 0 +} + +.swagger-ui .scheme-container .schemes>.schemes-server-container>label select { + min-width: 130px; + text-transform: uppercase +} + +.swagger-ui .scheme-container .schemes:not(:has(.schemes-server-container)) { + justify-content: flex-end +} + +.swagger-ui .scheme-container .schemes .auth-wrapper { + flex: none; + justify-content: start +} + +.swagger-ui .scheme-container .schemes .auth-wrapper .authorize { + display: flex; + flex-wrap: nowrap; + margin: 0; + padding-right: 20px +} + +.swagger-ui .loading-container { + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + margin-top: 1em; + min-height: 1px; + padding: 40px 0 60px +} + +.swagger-ui .loading-container .loading { + position: relative +} + +.swagger-ui .loading-container .loading:after { + color: #3b4151; + content: "loading"; + font-family: sans-serif; + font-size: 10px; + font-weight: 700; + left: 50%; + position: absolute; + text-transform: uppercase; + top: 50%; + transform: translate(-50%,-50%) +} + +.swagger-ui .loading-container .loading:before { + animation: rotation 1s linear infinite,opacity .5s; + backface-visibility: hidden; + content: ""; + display: block; + height: 60px; + left: 50%; + margin: -30px; + opacity: 1; + position: absolute; + top: 50%; + width: 60px +} + +@keyframes rotation { + to { + transform: rotate(1turn) + } +} + +.swagger-ui .response-controls { + display: none; +} + +.swagger-ui .response-control-media-type { + margin-right: 1em +} + +.swagger-ui .response-control-media-type__accept-message { + color: green; + font-size: .7em +} + +.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title { + display: block; + font-size: .7em; + margin-bottom: .2em +} + +@keyframes blinker { + 50% { + opacity: 0 + } +} + +.swagger-ui .hidden { + display: none +} + +.swagger-ui .no-margin { + height: auto; + margin: 0; + padding: 0 +} + +.swagger-ui .float-right { + float: right +} + +.swagger-ui .svg-assets { + height: 0; + position: absolute; + width: 0 +} + +.swagger-ui section h3 { + color: #3b4151; + font-family: sans-serif +} + +.swagger-ui a.nostyle { + display: inline +} + +.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited { + color: inherit; + cursor: pointer; + text-decoration: inherit +} + +.swagger-ui .fallback { + color: #aaa; + padding: 1em +} + +.swagger-ui .version-pragma { + height: 100%; + padding: 5em 0 +} + +.swagger-ui .version-pragma__message { + display: flex; + font-size: 1.2em; + height: 100%; + justify-content: center; + line-height: 1.5em; + padding: 0 .6em; + text-align: center +} + +.swagger-ui .version-pragma__message>div { + flex: 1; + max-width: 55ch +} + +.swagger-ui .version-pragma__message code { + background-color: #dedede; + padding: 4px 4px 2px; + white-space: pre +} + +.swagger-ui .opblock-link { + font-weight: 400 +} + +.swagger-ui .opblock-link.shown { + font-weight: 700 +} + +.swagger-ui span.token-string { + color: #555 +} + +.swagger-ui span.token-not-formatted { + color: #555; + font-weight: 700 +} + +.swagger-ui .btn { + background: transparent; + color: #3b4151; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + padding: 5px 23px; + transition: all .3s; + box-shadow: 4px 4px 8px #444 +} + +.swagger-ui .btn.btn-sm { + font-size: 12px; + padding: 4px 23px +} + +.swagger-ui .btn[disabled] { + cursor: not-allowed; + opacity: .3 +} + +.swagger-ui .btn.cancel { + background-color: transparent; + color: #ff6060; + font-family: sans-serif +} + +.swagger-ui .btn.authorize { + background-color: transparent; + color: #49cc90; + display: inline; + line-height: 1 +} + +.swagger-ui .btn.authorize span { + float: left; + padding: 4px 20px 0 0 +} + +.swagger-ui .btn.authorize svg { + fill: #49cc90 +} + +.swagger-ui .btn.execute { + background-color: #4990e2; + color: #fff +} + +.swagger-ui .btn-group { + display: flex; + padding: 10px +} + +.swagger-ui .btn-group .btn { + flex: 1 +} + +.swagger-ui .authorization__btn { + background: none; + padding: 0 0 0 10px +} + +.swagger-ui .authorization__btn .locked { + opacity: 1 +} + +.swagger-ui .authorization__btn .unlocked { + opacity: .4 +} + +.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control { + all: inherit; + cursor: pointer; + flex: 1; + padding: 0 +} + +.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus { + outline: auto +} + +.swagger-ui .expand-methods,.swagger-ui .expand-operation { + background: none; +} + +.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg { + height: 20px; + width: 20px +} + +.swagger-ui .expand-methods { + padding: 0 10px +} + +.swagger-ui .expand-methods:hover svg { + fill: #404040 +} + +.swagger-ui .expand-methods svg { + transition: all .3s; + fill: #707070 +} + +.swagger-ui button { + cursor: pointer; + border: none; + box-shadow: 2px 2px 8px #aaa; +} + +.swagger-ui button.invalid { + animation: shake .4s 1; + background: #feebeb; +} + +.swagger-ui .copy-to-clipboard { + align-items: center; + background: #7d8293; + bottom: 10px; + display: flex; + height: 30px; + justify-content: center; + position: absolute; + right: 100px; + width: 30px +} + +.swagger-ui .copy-to-clipboard button { + background: url("data:image/svg+xml;charset=utf-8,") 50% no-repeat; + flex-grow: 1; + flex-shrink: 1; + height: 25px +} + +.swagger-ui .copy-to-clipboard:active { + background: #5e626f +} + +.swagger-ui .opblock-control-arrow { + background: none; + text-align: center +} + +.swagger-ui .curl-command .copy-to-clipboard { + bottom: 5px; + height: 20px; + right: 10px; + width: 20px +} + +.swagger-ui .curl-command .copy-to-clipboard button { + height: 18px +} + +.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard { + height: 26px; + position: static +} + +.swagger-ui select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: #f7f7f7 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat; + background-size: 20px; + color: #3b4151; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + padding: 5px 40px 5px 10px; + border: none; +} + +.swagger-ui select[multiple] { + background: #f7f7f7; + margin: 5px 0; + padding: 5px +} + +.swagger-ui select.invalid { + animation: shake .4s 1; + background: #feebeb; +} + +.swagger-ui .opblock-body select { + min-width: 230px +} + +@media(max-width: 768px) { + .swagger-ui .opblock-body select { + min-width:180px + } +} + +@media(max-width: 640px) { + .swagger-ui .opblock-body select { + min-width:100%; + width: 100% + } +} + +.swagger-ui label { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: 0 0 5px +} + +.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text] { + line-height: 1 +} + +@media(max-width: 768px) { + .swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text] { + max-width:175px + } +} + +.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea { + background: #fff; + margin: 5px 0; + min-width: 100px; + padding: 8px 10px +} + +.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid { + animation: shake .4s 1; + background: #feebeb; +} + +.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled] { + background-color: #fafafa; + color: #888; + cursor: not-allowed +} + +.swagger-ui textarea[disabled] { + background-color: #41444e; + color: #fff +} + +@keyframes shake { + 10%,90% { + transform: translate3d(-1px,0,0) + } + + 20%,80% { + transform: translate3d(2px,0,0) + } + + 30%,50%,70% { + transform: translate3d(-4px,0,0) + } + + 40%,60% { + transform: translate3d(4px,0,0) + } +} + +.swagger-ui textarea { + background: hsla(0,0%,100%,.8); + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 600; + min-height: 280px; + outline: none; + padding: 10px; + width: 100% +} + +.swagger-ui textarea.curl { + background: #41444e; + color: #fff; + font-family: monospace; + font-size: 12px; + font-weight: 600; + margin: 0; + min-height: 100px; + padding: 10px; + resize: none +} + +.swagger-ui .checkbox { + color: #303030; + padding: 5px 0 10px; + transition: opacity .5s +} + +.swagger-ui .checkbox label { + display: flex +} + +.swagger-ui .checkbox p { + color: #3b4151; + font-family: monospace; + font-style: italic; + font-weight: 400!important; + font-weight: 600; + margin: 0!important +} + +.swagger-ui .checkbox input[type=checkbox] { + display: none +} + +.swagger-ui .checkbox input[type=checkbox]+label>.item { + background: #e8e8e8; + cursor: pointer; + display: inline-block; + flex: none; + height: 16px; + margin: 0 8px 0 0; + padding: 5px; + position: relative; + top: 3px; + width: 16px +} + +.swagger-ui .checkbox input[type=checkbox]+label>.item:active { + transform: scale(.9) +} + +.swagger-ui .checkbox input[type=checkbox]:checked+label>.item { + background: #e8e8e8 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat +} + +.swagger-ui .dialog-ux { + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 9999 +} + +.swagger-ui .dialog-ux .backdrop-ux { + background: rgba(0,0,0,.8); + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0 +} + +.swagger-ui .dialog-ux .modal-ux { + background: #fff; + left: 50%; + max-width: 650px; + min-width: 300px; + position: absolute; + top: 50%; + transform: translate(-50%,-50%); + width: 100%; + z-index: 9999 +} + +.swagger-ui .dialog-ux .modal-ux-content { + max-height: 540px; + overflow-y: auto; + padding: 20px +} + +.swagger-ui .dialog-ux .modal-ux-content p { + color: #41444e; + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px +} + +.swagger-ui .dialog-ux .modal-ux-content h4 { + color: #3b4151; + font-family: sans-serif; + font-size: 18px; + font-weight: 600; + margin: 15px 0 0 +} + +.swagger-ui .dialog-ux .modal-ux-header { + align-items: center; + display: flex; + padding: 12px 0 +} + +.swagger-ui .dialog-ux .modal-ux-header .close-modal { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: none; + padding: 0 10px +} + +.swagger-ui .dialog-ux .modal-ux-header h3 { + color: #3b4151; + flex: 1; + font-family: sans-serif; + font-size: 20px; + font-weight: 600; + margin: 0; + padding: 0 20px +} + +.swagger-ui .model { + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 300; + font-weight: 600 +} + +.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td { + color: #a0a0a0!important +} + +.swagger-ui .model .deprecated>td:first-of-type { + -webkit-text-decoration: line-through; + text-decoration: line-through +} + +.swagger-ui .model-toggle { + cursor: pointer; + display: inline-block; + font-size: 10px; + margin: auto .3em; + position: relative; + top: 6px; + transform: rotate(90deg); + transform-origin: 50% 50%; + transition: transform .15s ease-in +} + +.swagger-ui .model-toggle.collapsed { + transform: rotate(0deg) +} + +.swagger-ui .model-toggle:after { + background: url("data:image/svg+xml;charset=utf-8,") 50% no-repeat; + background-size: 100%; + content: ""; + display: block; + height: 20px; + width: 20px +} + +.swagger-ui .model-jump-to-path { + cursor: pointer; + position: relative +} + +.swagger-ui .model-jump-to-path .view-line-link { + cursor: pointer; + position: absolute; + top: -.4em +} + +.swagger-ui .model-title { + position: relative +} + +.swagger-ui .model-title:hover .model-hint { + display: block +} + +.swagger-ui .model-hint { + background: rgba(0,0,0,.7); + color: #ebebeb; + display: none; + padding: .1em .5em; + position: absolute; + top: -1.8em; + white-space: nowrap +} + +.swagger-ui .model p { + margin: 0 0 1em +} + +.swagger-ui .model .property { + color: #999; + font-style: italic +} + +.swagger-ui .model .property.primitive { + color: #6b6b6b +} + +.swagger-ui .model .property.primitive.extension { + display: block +} + +.swagger-ui .model .property.primitive.extension>td:first-child { + padding-left: 0; + padding-right: 0; + width: auto +} + +.swagger-ui .model .property.primitive.extension>td:first-child:after { + content: ": " +} + +.swagger-ui .model .external-docs,.swagger-ui table.model tr.description { + color: #666; + font-weight: 400 +} + +.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child { + font-weight: 700 +} + +.swagger-ui table.model tr.property-row td { + vertical-align: top +} + +.swagger-ui table.model tr.property-row td:first-child { + padding-right: .2em +} + +.swagger-ui table.model tr.property-row .star { + color: red +} + +.swagger-ui table.model tr.extension { + color: #777 +} + +.swagger-ui table.model tr.extension td:last-child { + vertical-align: top +} + +.swagger-ui table.model tr.external-docs td:first-child { + font-weight: 700 +} + +.swagger-ui table.model tr .renderedMarkdown p:first-child { + margin-top: 0 +} + +.swagger-ui section.models { + margin: 30px 0 +} + +.swagger-ui section.models .pointer { + cursor: pointer +} + +.swagger-ui section.models.is-open { + padding: 0 0 20px +} + +.swagger-ui section.models.is-open h4 { + margin: 0 0 5px +} + +.swagger-ui section.models h4 { + align-items: center; + color: #606060; + cursor: pointer; + display: flex; + font-family: sans-serif; + font-size: 16px; + margin: 0; + padding: 10px 20px 10px 10px; + transition: all .2s +} + +.swagger-ui section.models h4 svg { + transition: all .4s +} + +.swagger-ui section.models h4 span { + flex: 1 +} + +.swagger-ui section.models h4:hover { + background: rgba(0,0,0,.02) +} + +.swagger-ui section.models h5 { + color: #707070; + font-family: sans-serif; + font-size: 16px; + margin: 0 0 10px +} + +.swagger-ui section.models .model-jump-to-path { + position: relative; + top: 5px +} + +.swagger-ui section.models .model-container { + background: rgba(0,0,0,.05); + margin: 0 20px 15px; + position: relative; + transition: all .5s +} + +.swagger-ui section.models .model-container:hover { + background: rgba(0,0,0,.07) +} + +.swagger-ui section.models .model-container:first-of-type { + margin: 20px +} + +.swagger-ui section.models .model-container:last-of-type { + margin: 0 20px +} + +.swagger-ui section.models .model-container .models-jump-to-path { + opacity: .65; + position: absolute; + right: 5px; + top: 8px +} + +.swagger-ui section.models .model-box { + background: none +} + +.swagger-ui section.models .model-box:has(.model-box) { + overflow-x: auto; + width: 100% +} + +.swagger-ui .model-box { + background: rgba(0,0,0,.1); + display: inline-block; + padding: 10px +} + +.swagger-ui .model-box .model-jump-to-path { + position: relative; + top: 4px +} + +.swagger-ui .model-box.deprecated { + opacity: .5 +} + +.swagger-ui .model-title { + color: #505050; + font-family: sans-serif; + font-size: 16px +} + +.swagger-ui .model-title img { + bottom: 0; + margin-left: 1em; + position: relative +} + +.swagger-ui .model-deprecated-warning { + color: #f93e3e; + font-family: sans-serif; + font-size: 16px; + font-weight: 600; + margin-right: 1em +} + +.swagger-ui span>span.model .brace-close { + padding: 0 0 0 10px +} + +.swagger-ui .prop-name { + display: inline-block; + margin-right: 1em +} + +.swagger-ui .prop-type { + color: #55a +} + +.swagger-ui .prop-enum { + display: block +} + +.swagger-ui .prop-format { + color: #606060 +} + +.swagger-ui .servers>label { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + margin: -20px 15px 0 0 +} + +.swagger-ui .servers>label select { + max-width: 100%; + min-width: 130px; + width: 100% +} + +.swagger-ui .servers h4.message { + padding-bottom: 2em +} + +.swagger-ui .servers table tr { + width: 30em +} + +.swagger-ui .servers table td { + display: inline-block; + max-width: 15em; + padding-bottom: 10px; + padding-top: 10px; + vertical-align: middle +} + +.swagger-ui .servers table td:first-of-type { + padding-right: 1em +} + +.swagger-ui .servers table td input { + height: 100%; + width: 100% +} + +.swagger-ui .servers .computed-url { + margin: 2em 0 +} + +.swagger-ui .servers .computed-url code { + display: inline-block; + font-size: 16px; + margin: 0 1em; + padding: 4px +} + +.swagger-ui .servers-title { + font-size: 12px; + font-weight: 700 +} + +.swagger-ui .operation-servers h4.message { + margin-bottom: 2em +} + +.swagger-ui table { + border-collapse: collapse; + padding: 0 10px; + width: 100% +} + +.swagger-ui table.model tbody tr td { + padding: 0 0 0 1em; + vertical-align: top +} + +.swagger-ui table.model tbody tr td:first-of-type { + padding: 0 0 0 2em; + width: 174px +} + +.swagger-ui table.headers td { + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 300; + font-weight: 600; + vertical-align: middle +} + +.swagger-ui table.headers .header-example { + color: #999; + font-style: italic +} + +.swagger-ui table tbody tr td { + vertical-align: top +} + +.swagger-ui table tbody tr td:first-of-type { + min-width: 6em; + padding: 4px; +} + +.swagger-ui table tbody tr td:has(.model-box) { + max-width: 1px +} + +.swagger-ui table thead tr td,.swagger-ui table thead tr th { + color: #3b4151; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + padding: 12px 0; + text-align: left +} + +.swagger-ui .parameters-col_description { + margin-bottom: 2em; + width: 99% +} + +.swagger-ui .parameters-col_description input { + max-width: 340px; + width: 100%; + border: none; + background-color: #eee; +} + +.swagger-ui .parameters-col_description .markdown:first-child p:first-child,.swagger-ui .parameters-col_description .renderedMarkdown:first-child p:first-child { + margin: 0 +} + +.swagger-ui .parameter__name { + color: #3b4151; + font-family: sans-serif; + font-size: 16px; + font-weight: 400; + margin-right: .75em +} + +.swagger-ui .parameter__name.required { + font-weight: 700 +} + +.swagger-ui .parameter__name.required span { + color: red +} + +.swagger-ui .parameter__name.required:after { + color: rgba(255,0,0,.6); + content: "required"; + font-size: 10px; + padding: 5px; + position: relative; + top: -6px +} + +.swagger-ui .parameter__extension,.swagger-ui .parameter__in { + color: grey; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600 +} + +.swagger-ui .parameter__deprecated { + color: red; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600 +} + +.swagger-ui .parameter__empty_value_toggle { + display: block; + font-size: 13px; + padding-bottom: 12px; + padding-top: 5px +} + +.swagger-ui .parameter__empty_value_toggle input { + margin-right: 7px; + width: auto +} + +.swagger-ui .parameter__empty_value_toggle.disabled { + opacity: .7 +} + +.swagger-ui .table-container { + padding-left: 20px +} + +.swagger-ui .response-col_description { + width: 99% +} + +.swagger-ui .response-col_description .markdown p:first-child,.swagger-ui .response-col_description .renderedMarkdown p:first-child { + margin: 0 +} + +.swagger-ui .response-col_description .markdown p:last-child,.swagger-ui .response-col_description .renderedMarkdown p:last-child { + margin-bottom: 0 +} + +.swagger-ui .response-col_links { + min-width: 6em +} + +.swagger-ui .response__extension { + color: grey; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600 +} + +.swagger-ui .topbar { + background-color: #1b1b1b; + padding: 10px 0 +} + +.swagger-ui .topbar .topbar-wrapper { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 10px +} + +@media(max-width: 550px) { + .swagger-ui .topbar .topbar-wrapper { + align-items:start; + flex-direction: column + } +} + +.swagger-ui .topbar a { + align-items: center; + color: #fff; + display: flex; + flex: 1; + font-family: sans-serif; + font-size: 1.5em; + font-weight: 700; + max-width: 300px; + -webkit-text-decoration: none; + text-decoration: none +} + +.swagger-ui .topbar a span { + margin: 0; + padding: 0 10px +} + +.swagger-ui .topbar .download-url-wrapper { + display: flex; + flex: 3; + justify-content: flex-end +} + +.swagger-ui .topbar .download-url-wrapper input[type=text] { + margin: 0; + max-width: 100%; + outline: none; + width: 100% +} + +.swagger-ui .topbar .download-url-wrapper .select-label { + align-items: center; + color: #f0f0f0; + display: flex; + margin: 0; + max-width: 600px; + width: 100% +} + +.swagger-ui .topbar .download-url-wrapper .select-label span { + flex: 1; + font-size: 16px; + padding: 0 10px 0 0; + text-align: right +} + +.swagger-ui .topbar .download-url-wrapper .select-label select { + flex: 2; + outline: none; + width: 100% +} + +.swagger-ui .topbar .download-url-wrapper .download-url-button { + background: #62a03f; + color: #fff; + font-family: sans-serif; + font-size: 16px; + font-weight: 700; + padding: 4px 30px +} + +@media(max-width: 550px) { + .swagger-ui .topbar .download-url-wrapper { + width:100% + } +} + +.swagger-ui .info { + margin: 20px 0; +} + +.swagger-ui .info.failed-config { + margin-left: auto; + margin-right: auto; + max-width: 880px; + text-align: center +} + +.swagger-ui .info hgroup.main a { + font-size: 12px +} + +.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info pre,.swagger-ui .info table { + font-size: 14px +} + +.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5,.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table { + color: #3b4151; + font-family: sans-serif +} + +.swagger-ui .info a { + color: #4990e2; + font-family: sans-serif; + font-size: 14px; + transition: all .4s; + display: none; +} + +.swagger-ui .info a:hover { + color: #1f69c0 +} + +.swagger-ui .info>div { + margin: 0 0 5px +} + +.swagger-ui .info .base-url { + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 300!important; + font-weight: 600; + margin: 0 +} + +.swagger-ui .info .title { + color: #3b4151; + font-family: sans-serif; + font-size: 36px; + margin: 0 +} + +.swagger-ui .info .title small { + background: #7d8492; + display: inline-block; + font-size: 10px; + margin: 0 0 0 5px; + padding: 2px 4px; + position: relative; + top: -5px; + vertical-align: super +} + +.swagger-ui .info .title small.version-stamp { + background-color: #89bf04 +} + +.swagger-ui .info .title small pre { + color: #fff; + font-family: sans-serif; + margin: 0; + padding: 0 +} + +.swagger-ui .auth-btn-wrapper { + display: flex; + justify-content: center; + padding: 10px 0 +} + +.swagger-ui .auth-btn-wrapper .btn-done { + margin-right: 1em +} + +.swagger-ui .auth-wrapper { + display: flex; + flex: 1; + justify-content: flex-end +} + +.swagger-ui .auth-wrapper .authorize { + margin-left: 10px; + margin-right: 10px; + padding-right: 20px +} + +.swagger-ui .auth-container { + margin: 0 0 10px; + padding: 10px 20px +} + +.swagger-ui .auth-container:last-of-type { + margin: 0; + padding: 10px 20px +} + +.swagger-ui .auth-container h4 { + margin: 5px 0 15px!important +} + +.swagger-ui .auth-container .wrapper { + margin: 0; + padding: 0 +} + +.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text] { + min-width: 230px +} + +.swagger-ui .auth-container .errors { + background-color: #fee; + color: red; + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 600; + margin: 1em; + padding: 10px +} + +.swagger-ui .auth-container .errors b { + margin-right: 1em; + text-transform: capitalize +} + +.swagger-ui .scopes h2 { + color: #3b4151; + font-family: sans-serif; + font-size: 14px +} + +.swagger-ui .scopes h2 a { + color: #4990e2; + cursor: pointer; + font-size: 12px; + padding-left: 10px; + -webkit-text-decoration: underline; + text-decoration: underline +} + +.swagger-ui .scope-def { + padding: 0 0 20px +} + +.swagger-ui .errors-wrapper { + animation: scaleUp .5s; + background: rgba(249,62,62,.1); + margin: 20px; + padding: 10px 20px +} + +.swagger-ui .errors-wrapper .error-wrapper { + margin: 0 0 10px +} + +.swagger-ui .errors-wrapper .errors h4 { + color: #3b4151; + font-family: monospace; + font-size: 14px; + font-weight: 600; + margin: 0 +} + +.swagger-ui .errors-wrapper .errors small { + color: #606060 +} + +.swagger-ui .errors-wrapper .errors .message { + white-space: pre-line +} + +.swagger-ui .errors-wrapper .errors .message.thrown { + max-width: 100% +} + +.swagger-ui .errors-wrapper .errors .error-line { + cursor: pointer; + -webkit-text-decoration: underline; + text-decoration: underline +} + +.swagger-ui .errors-wrapper hgroup { + align-items: center; + display: flex +} + +.swagger-ui .errors-wrapper hgroup h4 { + color: #3b4151; + flex: 1; + font-family: sans-serif; + font-size: 20px; + margin: 0 +} + +@keyframes scaleUp { + 0% { + opacity: 0; + transform: scale(.8) + } + + to { + opacity: 1; + transform: scale(1) + } +} + +.swagger-ui .Resizer.vertical.disabled { + display: none +} + +.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre { + margin: 1em auto; + word-break: break-all; + word-break: break-word +} + +.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre { + background: none; + color: #000; + font-weight: 400; + padding: 0; + white-space: pre-wrap +} + +.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code { + background: rgba(0,0,0,.05); + color: #9012fe; + font-family: monospace; + font-size: 14px; + font-weight: 600; + padding: 5px 7px +} + +.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code { + display: block +} + +.swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul { + margin: 0 0 0 20px +} + +.swagger-ui .json-schema-2020-12-\$vocabulary-uri { + margin-left: 35px +} + +.swagger-ui .json-schema-2020-12-\$vocabulary-uri--disabled { + -webkit-text-decoration: line-through; + text-decoration: line-through +} + +.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__value { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12__constraint { + background-color: #805ad5; + color: #3b4151; + color: #fff; + font-family: monospace; + font-weight: 600; + line-height: 1.5; + margin-left: 10px; + padding: 1px 3px +} + +.swagger-ui .json-schema-2020-12__constraint--string { + background-color: #d69e2e; + color: #fff +} + +.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__value { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul { + display: inline-block; + margin: 0; + padding: 0 +} + +.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul li { + display: inline; + list-style-type: none +} + +.swagger-ui .json-schema-2020-12-keyword--description { + color: #6b6b6b; + font-size: 12px; + margin-left: 20px +} + +.swagger-ui .json-schema-2020-12-keyword--description p { + margin: 0 +} + +.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__value,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__value { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__value { + color: #929292; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-keyword--patternProperties ul { + margin: 0; + padding: 0 +} + +.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:after,.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:before { + color: #55a; + content: "/" +} + +.swagger-ui .json-schema-2020-12-keyword--properties>ul { + margin: 0; + padding: 0 +} + +.swagger-ui .json-schema-2020-12-property { + list-style-type: none +} + +.swagger-ui .json-schema-2020-12-property--required>.json-schema-2020-12:first-of-type>.json-schema-2020-12-head .json-schema-2020-12__title:after { + color: red; + content: "*"; + font-weight: 700 +} + +.swagger-ui .json-schema-2020-12__title { + color: #505050; + display: inline-block; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + line-height: normal +} + +.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name { + margin: 0 +} + +.swagger-ui .json-schema-2020-12-property { + margin: 7px 0 } .swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title { - color: aqua; + color: #3b4151; + font-family: monospace; + font-size: 12px; + font-weight: 600; + vertical-align: middle } -@media only screen and (prefers-color-scheme: dark) { - - a { color: #8c8cfa; } - - ::-webkit-scrollbar-track-piece { background-color: rgba(255, 255, 255, .2) !important; } - - ::-webkit-scrollbar-track { background-color: rgba(255, 255, 255, .3) !important; } - - ::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, .5) !important; } - - embed[type="application/pdf"] { filter: invert(90%); } - - html { - background: #1f1f1f !important; - box-sizing: border-box; - filter: contrast(100%) brightness(100%) saturate(100%); - overflow-y: scroll; - } - - body { - background: #1f1f1f; - background-color: #1f1f1f; - background-image: none !important; - } - - button, input, select, textarea { - background-color: #1f1f1f; - color: #bfbfbf; - } - - font, html { color: #bfbfbf; } - - .swagger-ui, .swagger-ui section h3 { color: #b5bac9; } - - .swagger-ui a { background-color: transparent; } - - .swagger-ui mark { - background-color: #664b00; - color: #bfbfbf; - } - - .swagger-ui legend { color: inherit; } - - .swagger-ui .debug * { outline: #e6da99 solid 1px; } - - .swagger-ui .debug-white * { outline: #fff solid 1px; } - - .swagger-ui .debug-black * { outline: #bfbfbf solid 1px; } - - .swagger-ui .debug-grid { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) 0 0; } - - .swagger-ui .debug-grid-16 { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) 0 0; } - - .swagger-ui .debug-grid-8-solid { background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) 0 0 #1c1c21; } - - .swagger-ui .debug-grid-16-solid { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) 0 0 #1c1c21; } - - .swagger-ui .b--black { border-color: #000; } - - .swagger-ui .b--near-black { border-color: #121212; } - - .swagger-ui .b--dark-gray { border-color: #333; } - - .swagger-ui .b--mid-gray { border-color: #545454; } - - .swagger-ui .b--gray { border-color: #787878; } - - .swagger-ui .b--silver { border-color: #999; } - - .swagger-ui .b--light-silver { border-color: #6e6e6e; } - - .swagger-ui .b--moon-gray { border-color: #4d4d4d; } - - .swagger-ui .b--light-gray { border-color: #2b2b2b; } - - .swagger-ui .b--near-white { border-color: #242424; } - - .swagger-ui .b--white { border-color: #1c1c21; } - - .swagger-ui .b--white-90 { border-color: rgba(28, 28, 33, .9); } - - .swagger-ui .b--white-80 { border-color: rgba(28, 28, 33, .8); } - - .swagger-ui .b--white-70 { border-color: rgba(28, 28, 33, .7); } - - .swagger-ui .b--white-60 { border-color: rgba(28, 28, 33, .6); } - - .swagger-ui .b--white-50 { border-color: rgba(28, 28, 33, .5); } - - .swagger-ui .b--white-40 { border-color: rgba(28, 28, 33, .4); } - - .swagger-ui .b--white-30 { border-color: rgba(28, 28, 33, .3); } - - .swagger-ui .b--white-20 { border-color: rgba(28, 28, 33, .2); } - - .swagger-ui .b--white-10 { border-color: rgba(28, 28, 33, .1); } - - .swagger-ui .b--white-05 { border-color: rgba(28, 28, 33, .05); } - - .swagger-ui .b--white-025 { border-color: rgba(28, 28, 33, .024); } - - .swagger-ui .b--white-0125 { border-color: rgba(28, 28, 33, .01); } - - .swagger-ui .b--black-90 { border-color: rgba(0, 0, 0, .9); } - - .swagger-ui .b--black-80 { border-color: rgba(0, 0, 0, .8); } - - .swagger-ui .b--black-70 { border-color: rgba(0, 0, 0, .7); } - - .swagger-ui .b--black-60 { border-color: rgba(0, 0, 0, .6); } - - .swagger-ui .b--black-50 { border-color: rgba(0, 0, 0, .5); } - - .swagger-ui .b--black-40 { border-color: rgba(0, 0, 0, .4); } - - .swagger-ui .b--black-30 { border-color: rgba(0, 0, 0, .3); } - - .swagger-ui .b--black-20 { border-color: rgba(0, 0, 0, .2); } - - .swagger-ui .b--black-10 { border-color: rgba(0, 0, 0, .1); } - - .swagger-ui .b--black-05 { border-color: rgba(0, 0, 0, .05); } - - .swagger-ui .b--black-025 { border-color: rgba(0, 0, 0, .024); } - - .swagger-ui .b--black-0125 { border-color: rgba(0, 0, 0, .01); } - - .swagger-ui .b--dark-red { border-color: #bc2f36; } - - .swagger-ui .b--red { border-color: #c83932; } - - .swagger-ui .b--light-red { border-color: #ab3c2b; } - - .swagger-ui .b--orange { border-color: #cc6e33; } - - .swagger-ui .b--purple { border-color: #5e2ca5; } - - .swagger-ui .b--light-purple { border-color: #672caf; } - - .swagger-ui .b--dark-pink { border-color: #ab2b81; } - - .swagger-ui .b--hot-pink { border-color: #c03086; } - - .swagger-ui .b--pink { border-color: #8f2464; } - - .swagger-ui .b--light-pink { border-color: #721d4d; } - - .swagger-ui .b--dark-green { border-color: #1c6e50; } - - .swagger-ui .b--green { border-color: #279b70; } - - .swagger-ui .b--light-green { border-color: #228762; } - - .swagger-ui .b--navy { border-color: #0d1d35; } - - .swagger-ui .b--dark-blue { border-color: #20497e; } - - .swagger-ui .b--blue { border-color: #4380d0; } - - .swagger-ui .b--light-blue { border-color: #20517e; } - - .swagger-ui .b--lightest-blue { border-color: #143a52; } - - .swagger-ui .b--washed-blue { border-color: #0c312d; } - - .swagger-ui .b--washed-green { border-color: #0f3d2c; } - - .swagger-ui .b--washed-red { border-color: #411010; } - - .swagger-ui .b--transparent { border-color: transparent; } - - .swagger-ui .b--gold, .swagger-ui .b--light-yellow, .swagger-ui .b--washed-yellow, .swagger-ui .b--yellow { border-color: #664b00; } - - .swagger-ui .shadow-1 { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } - - .swagger-ui .shadow-2 { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } - - .swagger-ui .shadow-3 { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } - - .swagger-ui .shadow-4 { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } - - .swagger-ui .shadow-5 { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } - - @media screen and (min-width: 30em) { - .swagger-ui .shadow-1-ns { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } - - .swagger-ui .shadow-2-ns { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } - - .swagger-ui .shadow-3-ns { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } - - .swagger-ui .shadow-4-ns { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } - - .swagger-ui .shadow-5-ns { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } - } - - @media screen and (max-width: 60em) and (min-width: 30em) { - .swagger-ui .shadow-1-m { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } - - .swagger-ui .shadow-2-m { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } - - .swagger-ui .shadow-3-m { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } - - .swagger-ui .shadow-4-m { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } - - .swagger-ui .shadow-5-m { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } - } - - @media screen and (min-width: 60em) { - .swagger-ui .shadow-1-l { box-shadow: rgba(0, 0, 0, .2) 0 0 4px 2px; } - - .swagger-ui .shadow-2-l { box-shadow: rgba(0, 0, 0, .2) 0 0 8px 2px; } - - .swagger-ui .shadow-3-l { box-shadow: rgba(0, 0, 0, .2) 2px 2px 4px 2px; } - - .swagger-ui .shadow-4-l { box-shadow: rgba(0, 0, 0, .2) 2px 2px 8px 0; } - - .swagger-ui .shadow-5-l { box-shadow: rgba(0, 0, 0, .2) 4px 4px 8px 0; } - } - - .swagger-ui .black-05 { color: rgba(191, 191, 191, .05); } - - .swagger-ui .bg-black-05 { background-color: rgba(0, 0, 0, .05); } - - .swagger-ui .black-90, .swagger-ui .hover-black-90:focus, .swagger-ui .hover-black-90:hover { color: rgba(191, 191, 191, .9); } - - .swagger-ui .black-80, .swagger-ui .hover-black-80:focus, .swagger-ui .hover-black-80:hover { color: rgba(191, 191, 191, .8); } - - .swagger-ui .black-70, .swagger-ui .hover-black-70:focus, .swagger-ui .hover-black-70:hover { color: rgba(191, 191, 191, .7); } - - .swagger-ui .black-60, .swagger-ui .hover-black-60:focus, .swagger-ui .hover-black-60:hover { color: rgba(191, 191, 191, .6); } - - .swagger-ui .black-50, .swagger-ui .hover-black-50:focus, .swagger-ui .hover-black-50:hover { color: rgba(191, 191, 191, .5); } - - .swagger-ui .black-40, .swagger-ui .hover-black-40:focus, .swagger-ui .hover-black-40:hover { color: rgba(191, 191, 191, .4); } - - .swagger-ui .black-30, .swagger-ui .hover-black-30:focus, .swagger-ui .hover-black-30:hover { color: rgba(191, 191, 191, .3); } - - .swagger-ui .black-20, .swagger-ui .hover-black-20:focus, .swagger-ui .hover-black-20:hover { color: rgba(191, 191, 191, .2); } - - .swagger-ui .black-10, .swagger-ui .hover-black-10:focus, .swagger-ui .hover-black-10:hover { color: rgba(191, 191, 191, .1); } - - .swagger-ui .hover-white-90:focus, .swagger-ui .hover-white-90:hover, .swagger-ui .white-90 { color: rgba(255, 255, 255, .9); } - - .swagger-ui .hover-white-80:focus, .swagger-ui .hover-white-80:hover, .swagger-ui .white-80 { color: rgba(255, 255, 255, .8); } - - .swagger-ui .hover-white-70:focus, .swagger-ui .hover-white-70:hover, .swagger-ui .white-70 { color: rgba(255, 255, 255, .7); } - - .swagger-ui .hover-white-60:focus, .swagger-ui .hover-white-60:hover, .swagger-ui .white-60 { color: rgba(255, 255, 255, .6); } - - .swagger-ui .hover-white-50:focus, .swagger-ui .hover-white-50:hover, .swagger-ui .white-50 { color: rgba(255, 255, 255, .5); } - - .swagger-ui .hover-white-40:focus, .swagger-ui .hover-white-40:hover, .swagger-ui .white-40 { color: rgba(255, 255, 255, .4); } - - .swagger-ui .hover-white-30:focus, .swagger-ui .hover-white-30:hover, .swagger-ui .white-30 { color: rgba(255, 255, 255, .3); } - - .swagger-ui .hover-white-20:focus, .swagger-ui .hover-white-20:hover, .swagger-ui .white-20 { color: rgba(255, 255, 255, .2); } - - .swagger-ui .hover-white-10:focus, .swagger-ui .hover-white-10:hover, .swagger-ui .white-10 { color: rgba(255, 255, 255, .1); } - - .swagger-ui .hover-moon-gray:focus, .swagger-ui .hover-moon-gray:hover, .swagger-ui .moon-gray { color: #ccc; } - - .swagger-ui .hover-light-gray:focus, .swagger-ui .hover-light-gray:hover, .swagger-ui .light-gray { color: #ededed; } - - .swagger-ui .hover-near-white:focus, .swagger-ui .hover-near-white:hover, .swagger-ui .near-white { color: #f5f5f5; } - - .swagger-ui .dark-red, .swagger-ui .hover-dark-red:focus, .swagger-ui .hover-dark-red:hover { color: #e6999d; } - - .swagger-ui .hover-red:focus, .swagger-ui .hover-red:hover, .swagger-ui .red { color: #e69d99; } - - .swagger-ui .hover-light-red:focus, .swagger-ui .hover-light-red:hover, .swagger-ui .light-red { color: #e6a399; } - - .swagger-ui .hover-orange:focus, .swagger-ui .hover-orange:hover, .swagger-ui .orange { color: #e6b699; } - - .swagger-ui .gold, .swagger-ui .hover-gold:focus, .swagger-ui .hover-gold:hover { color: #e6d099; } - - .swagger-ui .hover-yellow:focus, .swagger-ui .hover-yellow:hover, .swagger-ui .yellow { color: #e6da99; } - - .swagger-ui .hover-light-yellow:focus, .swagger-ui .hover-light-yellow:hover, .swagger-ui .light-yellow { color: #ede6b6; } - - .swagger-ui .hover-purple:focus, .swagger-ui .hover-purple:hover, .swagger-ui .purple { color: #b99ae4; } - - .swagger-ui .hover-light-purple:focus, .swagger-ui .hover-light-purple:hover, .swagger-ui .light-purple { color: #bb99e6; } - - .swagger-ui .dark-pink, .swagger-ui .hover-dark-pink:focus, .swagger-ui .hover-dark-pink:hover { color: #e699cc; } - - .swagger-ui .hot-pink, .swagger-ui .hover-hot-pink:focus, .swagger-ui .hover-hot-pink:hover, .swagger-ui .hover-pink:focus, .swagger-ui .hover-pink:hover, .swagger-ui .pink { color: #e699c7; } - - .swagger-ui .hover-light-pink:focus, .swagger-ui .hover-light-pink:hover, .swagger-ui .light-pink { color: #edb6d5; } - - .swagger-ui .dark-green, .swagger-ui .green, .swagger-ui .hover-dark-green:focus, .swagger-ui .hover-dark-green:hover, .swagger-ui .hover-green:focus, .swagger-ui .hover-green:hover { color: #99e6c9; } - - .swagger-ui .hover-light-green:focus, .swagger-ui .hover-light-green:hover, .swagger-ui .light-green { color: #a1e8ce; } - - .swagger-ui .hover-navy:focus, .swagger-ui .hover-navy:hover, .swagger-ui .navy { color: #99b8e6; } - - .swagger-ui .blue, .swagger-ui .dark-blue, .swagger-ui .hover-blue:focus, .swagger-ui .hover-blue:hover, .swagger-ui .hover-dark-blue:focus, .swagger-ui .hover-dark-blue:hover { color: #99bae6; } - - .swagger-ui .hover-light-blue:focus, .swagger-ui .hover-light-blue:hover, .swagger-ui .light-blue { color: #a9cbea; } - - .swagger-ui .hover-lightest-blue:focus, .swagger-ui .hover-lightest-blue:hover, .swagger-ui .lightest-blue { color: #d6e9f5; } - - .swagger-ui .hover-washed-blue:focus, .swagger-ui .hover-washed-blue:hover, .swagger-ui .washed-blue { color: #f7fdfc; } - - .swagger-ui .hover-washed-green:focus, .swagger-ui .hover-washed-green:hover, .swagger-ui .washed-green { color: #ebfaf4; } - - .swagger-ui .hover-washed-yellow:focus, .swagger-ui .hover-washed-yellow:hover, .swagger-ui .washed-yellow { color: #fbf9ef; } - - .swagger-ui .hover-washed-red:focus, .swagger-ui .hover-washed-red:hover, .swagger-ui .washed-red { color: #f9e7e7; } - - .swagger-ui .color-inherit, .swagger-ui .hover-inherit:focus, .swagger-ui .hover-inherit:hover { color: inherit; } - - .swagger-ui .bg-black-90, .swagger-ui .hover-bg-black-90:focus, .swagger-ui .hover-bg-black-90:hover { background-color: rgba(0, 0, 0, .9); } - - .swagger-ui .bg-black-80, .swagger-ui .hover-bg-black-80:focus, .swagger-ui .hover-bg-black-80:hover { background-color: rgba(0, 0, 0, .8); } - - .swagger-ui .bg-black-70, .swagger-ui .hover-bg-black-70:focus, .swagger-ui .hover-bg-black-70:hover { background-color: rgba(0, 0, 0, .7); } - - .swagger-ui .bg-black-60, .swagger-ui .hover-bg-black-60:focus, .swagger-ui .hover-bg-black-60:hover { background-color: rgba(0, 0, 0, .6); } - - .swagger-ui .bg-black-50, .swagger-ui .hover-bg-black-50:focus, .swagger-ui .hover-bg-black-50:hover { background-color: rgba(0, 0, 0, .5); } - - .swagger-ui .bg-black-40, .swagger-ui .hover-bg-black-40:focus, .swagger-ui .hover-bg-black-40:hover { background-color: rgba(0, 0, 0, .4); } - - .swagger-ui .bg-black-30, .swagger-ui .hover-bg-black-30:focus, .swagger-ui .hover-bg-black-30:hover { background-color: rgba(0, 0, 0, .3); } - - .swagger-ui .bg-black-20, .swagger-ui .hover-bg-black-20:focus, .swagger-ui .hover-bg-black-20:hover { background-color: rgba(0, 0, 0, .2); } - - .swagger-ui .bg-white-90, .swagger-ui .hover-bg-white-90:focus, .swagger-ui .hover-bg-white-90:hover { background-color: rgba(28, 28, 33, .9); } - - .swagger-ui .bg-white-80, .swagger-ui .hover-bg-white-80:focus, .swagger-ui .hover-bg-white-80:hover { background-color: rgba(28, 28, 33, .8); } - - .swagger-ui .bg-white-70, .swagger-ui .hover-bg-white-70:focus, .swagger-ui .hover-bg-white-70:hover { background-color: rgba(28, 28, 33, .7); } - - .swagger-ui .bg-white-60, .swagger-ui .hover-bg-white-60:focus, .swagger-ui .hover-bg-white-60:hover { background-color: rgba(28, 28, 33, .6); } - - .swagger-ui .bg-white-50, .swagger-ui .hover-bg-white-50:focus, .swagger-ui .hover-bg-white-50:hover { background-color: rgba(28, 28, 33, .5); } - - .swagger-ui .bg-white-40, .swagger-ui .hover-bg-white-40:focus, .swagger-ui .hover-bg-white-40:hover { background-color: rgba(28, 28, 33, .4); } - - .swagger-ui .bg-white-30, .swagger-ui .hover-bg-white-30:focus, .swagger-ui .hover-bg-white-30:hover { background-color: rgba(28, 28, 33, .3); } - - .swagger-ui .bg-white-20, .swagger-ui .hover-bg-white-20:focus, .swagger-ui .hover-bg-white-20:hover { background-color: rgba(28, 28, 33, .2); } - - .swagger-ui .bg-black, .swagger-ui .hover-bg-black:focus, .swagger-ui .hover-bg-black:hover { background-color: #000; } - - .swagger-ui .bg-near-black, .swagger-ui .hover-bg-near-black:focus, .swagger-ui .hover-bg-near-black:hover { background-color: #121212; } - - .swagger-ui .bg-dark-gray, .swagger-ui .hover-bg-dark-gray:focus, .swagger-ui .hover-bg-dark-gray:hover { background-color: #333; } - - .swagger-ui .bg-mid-gray, .swagger-ui .hover-bg-mid-gray:focus, .swagger-ui .hover-bg-mid-gray:hover { background-color: #545454; } - - .swagger-ui .bg-gray, .swagger-ui .hover-bg-gray:focus, .swagger-ui .hover-bg-gray:hover { background-color: #787878; } - - .swagger-ui .bg-silver, .swagger-ui .hover-bg-silver:focus, .swagger-ui .hover-bg-silver:hover { background-color: #999; } - - .swagger-ui .bg-white, .swagger-ui .hover-bg-white:focus, .swagger-ui .hover-bg-white:hover { background-color: #1c1c21; } - - .swagger-ui .bg-transparent, .swagger-ui .hover-bg-transparent:focus, .swagger-ui .hover-bg-transparent:hover { background-color: transparent; } - - .swagger-ui .bg-dark-red, .swagger-ui .hover-bg-dark-red:focus, .swagger-ui .hover-bg-dark-red:hover { background-color: #bc2f36; } - - .swagger-ui .bg-red, .swagger-ui .hover-bg-red:focus, .swagger-ui .hover-bg-red:hover { background-color: #c83932; } - - .swagger-ui .bg-light-red, .swagger-ui .hover-bg-light-red:focus, .swagger-ui .hover-bg-light-red:hover { background-color: #ab3c2b; } - - .swagger-ui .bg-orange, .swagger-ui .hover-bg-orange:focus, .swagger-ui .hover-bg-orange:hover { background-color: #cc6e33; } - - .swagger-ui .bg-gold, .swagger-ui .bg-light-yellow, .swagger-ui .bg-washed-yellow, .swagger-ui .bg-yellow, .swagger-ui .hover-bg-gold:focus, .swagger-ui .hover-bg-gold:hover, .swagger-ui .hover-bg-light-yellow:focus, .swagger-ui .hover-bg-light-yellow:hover, .swagger-ui .hover-bg-washed-yellow:focus, .swagger-ui .hover-bg-washed-yellow:hover, .swagger-ui .hover-bg-yellow:focus, .swagger-ui .hover-bg-yellow:hover { background-color: #664b00; } - - .swagger-ui .bg-purple, .swagger-ui .hover-bg-purple:focus, .swagger-ui .hover-bg-purple:hover { background-color: #5e2ca5; } - - .swagger-ui .bg-light-purple, .swagger-ui .hover-bg-light-purple:focus, .swagger-ui .hover-bg-light-purple:hover { background-color: #672caf; } - - .swagger-ui .bg-dark-pink, .swagger-ui .hover-bg-dark-pink:focus, .swagger-ui .hover-bg-dark-pink:hover { background-color: #ab2b81; } - - .swagger-ui .bg-hot-pink, .swagger-ui .hover-bg-hot-pink:focus, .swagger-ui .hover-bg-hot-pink:hover { background-color: #c03086; } - - .swagger-ui .bg-pink, .swagger-ui .hover-bg-pink:focus, .swagger-ui .hover-bg-pink:hover { background-color: #8f2464; } - - .swagger-ui .bg-light-pink, .swagger-ui .hover-bg-light-pink:focus, .swagger-ui .hover-bg-light-pink:hover { background-color: #721d4d; } - - .swagger-ui .bg-dark-green, .swagger-ui .hover-bg-dark-green:focus, .swagger-ui .hover-bg-dark-green:hover { background-color: #1c6e50; } - - .swagger-ui .bg-green, .swagger-ui .hover-bg-green:focus, .swagger-ui .hover-bg-green:hover { background-color: #279b70; } - - .swagger-ui .bg-light-green, .swagger-ui .hover-bg-light-green:focus, .swagger-ui .hover-bg-light-green:hover { background-color: #228762; } - - .swagger-ui .bg-navy, .swagger-ui .hover-bg-navy:focus, .swagger-ui .hover-bg-navy:hover { background-color: #0d1d35; } - - .swagger-ui .bg-dark-blue, .swagger-ui .hover-bg-dark-blue:focus, .swagger-ui .hover-bg-dark-blue:hover { background-color: #20497e; } - - .swagger-ui .bg-blue, .swagger-ui .hover-bg-blue:focus, .swagger-ui .hover-bg-blue:hover { background-color: #4380d0; } - - .swagger-ui .bg-light-blue, .swagger-ui .hover-bg-light-blue:focus, .swagger-ui .hover-bg-light-blue:hover { background-color: #20517e; } - - .swagger-ui .bg-lightest-blue, .swagger-ui .hover-bg-lightest-blue:focus, .swagger-ui .hover-bg-lightest-blue:hover { background-color: #143a52; } - - .swagger-ui .bg-washed-blue, .swagger-ui .hover-bg-washed-blue:focus, .swagger-ui .hover-bg-washed-blue:hover { background-color: #0c312d; } - - .swagger-ui .bg-washed-green, .swagger-ui .hover-bg-washed-green:focus, .swagger-ui .hover-bg-washed-green:hover { background-color: #0f3d2c; } - - .swagger-ui .bg-washed-red, .swagger-ui .hover-bg-washed-red:focus, .swagger-ui .hover-bg-washed-red:hover { background-color: #411010; } - - .swagger-ui .bg-inherit, .swagger-ui .hover-bg-inherit:focus, .swagger-ui .hover-bg-inherit:hover { background-color: inherit; } - - .swagger-ui .shadow-hover { transition: all .5s cubic-bezier(.165, .84, .44, 1) 0s; } - - .swagger-ui .shadow-hover::after { - border-radius: inherit; - box-shadow: rgba(0, 0, 0, .2) 0 0 16px 2px; - content: ""; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - top: 0; - transition: opacity .5s cubic-bezier(.165, .84, .44, 1) 0s; - width: 100%; - z-index: -1; - } - - .swagger-ui .bg-animate, .swagger-ui .bg-animate:focus, .swagger-ui .bg-animate:hover { transition: background-color .15s ease-in-out 0s; } - - .swagger-ui .nested-links a { - color: #99bae6; - transition: color .15s ease-in 0s; - } - - .swagger-ui .nested-links a:focus, .swagger-ui .nested-links a:hover { - color: #a9cbea; - transition: color .15s ease-in 0s; - } - - .swagger-ui .opblock-tag { - border-bottom: 1px solid rgba(58, 64, 80, .3); - color: #b5bac9; - transition: all .2s ease 0s; - } - - .swagger-ui .opblock-tag svg, .swagger-ui section.models h4 svg { transition: all .4s ease 0s; } - - .swagger-ui .opblock { - border: 1px solid #000; - border-radius: 4px; - box-shadow: rgba(0, 0, 0, .19) 0 0 3px; - margin: 0 0 15px; - } - - .swagger-ui .opblock .tab-header .tab-item.active h4 span::after { background: gray; } - - .swagger-ui .opblock.is-open .opblock-summary { border-bottom: 1px solid #000; } - - .swagger-ui .opblock .opblock-section-header { - background: rgba(28, 28, 33, .8); - box-shadow: rgba(0, 0, 0, .1) 0 1px 2px; - } - - .swagger-ui .opblock .opblock-section-header > label > span { padding: 0 10px 0 0; } - - .swagger-ui .opblock .opblock-summary-method { - background: #000; - color: #fff; - text-shadow: rgba(0, 0, 0, .1) 0 1px 0; - } - - .swagger-ui .opblock.opblock-post { - background: rgba(72, 203, 144, .1); - border-color: #48cb90; - } - - .swagger-ui .opblock.opblock-post .opblock-summary-method, .swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span::after { background: #48cb90; } - - .swagger-ui .opblock.opblock-post .opblock-summary { border-color: #48cb90; } - - .swagger-ui .opblock.opblock-put { - background: rgba(213, 157, 88, .1); - border-color: #d59d58; - } - - .swagger-ui .opblock.opblock-put .opblock-summary-method, .swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span::after { background: #d59d58; } - - .swagger-ui .opblock.opblock-put .opblock-summary { border-color: #d59d58; } - - .swagger-ui .opblock.opblock-delete { - background: rgba(200, 50, 50, .1); - border-color: #c83232; - } - - .swagger-ui .opblock.opblock-delete .opblock-summary-method, .swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span::after { background: #c83232; } - - .swagger-ui .opblock.opblock-delete .opblock-summary { border-color: #c83232; } - - .swagger-ui .opblock.opblock-get { - background: rgba(42, 105, 167, .1); - border-color: #2a69a7; - } - - .swagger-ui .opblock.opblock-get .opblock-summary-method, .swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span::after { background: #2a69a7; } - - .swagger-ui .opblock.opblock-get .opblock-summary { border-color: #2a69a7; } - - .swagger-ui .opblock.opblock-patch { - background: rgba(92, 214, 188, .1); - border-color: #5cd6bc; - } - - .swagger-ui .opblock.opblock-patch .opblock-summary-method, .swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span::after { background: #5cd6bc; } - - .swagger-ui .opblock.opblock-patch .opblock-summary { border-color: #5cd6bc; } - - .swagger-ui .opblock.opblock-head { - background: rgba(140, 63, 207, .1); - border-color: #8c3fcf; - } - - .swagger-ui .opblock.opblock-head .opblock-summary-method, .swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span::after { background: #8c3fcf; } - - .swagger-ui .opblock.opblock-head .opblock-summary { border-color: #8c3fcf; } - - .swagger-ui .opblock.opblock-options { - background: rgba(36, 89, 143, .1); - border-color: #24598f; - } - - .swagger-ui .opblock.opblock-options .opblock-summary-method, .swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span::after { background: #24598f; } - - .swagger-ui .opblock.opblock-options .opblock-summary { border-color: #24598f; } - - .swagger-ui .opblock.opblock-deprecated { - background: rgba(46, 46, 46, .1); - border-color: #2e2e2e; - opacity: .6; - } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary-method, .swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span::after { background: #2e2e2e; } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary { border-color: #2e2e2e; } - - .swagger-ui .filter .operation-filter-input { border: 2px solid #2b3446; } - - .swagger-ui .tab li:first-of-type::after { background: rgba(0, 0, 0, .2); } - - .swagger-ui .download-contents { - background: #7c8192; - color: #fff; - } - - .swagger-ui .scheme-container { - background: #1c1c21; - box-shadow: rgba(0, 0, 0, .15) 0 1px 2px 0; - } - - .swagger-ui .loading-container .loading::before { - animation: 1s linear 0s infinite normal none running rotation, .5s ease 0s 1 normal none running opacity; - border-color: rgba(0, 0, 0, .6) rgba(84, 84, 84, .1) rgba(84, 84, 84, .1); - } - - .swagger-ui .response-control-media-type--accept-controller select { border-color: #196619; } - - .swagger-ui .response-control-media-type__accept-message { color: #99e699; } - - .swagger-ui .version-pragma__message code { background-color: #3b3b3b; } - - .swagger-ui .btn { - background: 0 0; - border: 2px solid gray; - box-shadow: rgba(0, 0, 0, .1) 0 1px 2px; - color: #b5bac9; - } - - .swagger-ui .btn:hover { box-shadow: rgba(0, 0, 0, .3) 0 0 5px; } - - .swagger-ui .btn.authorize, .swagger-ui .btn.cancel { - background-color: transparent; - border-color: #a72a2a; - color: #e69999; - } - - .swagger-ui .btn.cancel:hover { - background-color: #a72a2a; - color: #fff; - } - - .swagger-ui .btn.authorize { - border-color: #48cb90; - color: #9ce3c3; - } - - .swagger-ui .btn.authorize svg { fill: #9ce3c3; } - - .btn.authorize.unlocked:hover { - background-color: #48cb90; - color: #fff; - } - - .btn.authorize.unlocked:hover svg { - fill: #fbfbfb; - } - - .swagger-ui .btn.execute { - background-color: #5892d5; - border-color: #5892d5; - color: #fff; - } - - .swagger-ui .copy-to-clipboard { background: #7c8192; } - - .swagger-ui .copy-to-clipboard button { background: url("data:image/svg+xml;charset=utf-8,") 50% center no-repeat; } - - .swagger-ui select { - background: url("data:image/svg+xml;charset=utf-8,") right 10px center/20px no-repeat #212121; - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQuc3ZnIgogICBpZD0ic3ZnNCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEwIgogICAgIGlua3NjYXBlOmN4PSIxMCIKICAgICBpbmtzY2FwZTp6b29tPSI0MS41IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiIC8+Cjwvc3ZnPgo=) right 10px center/20px no-repeat #1c1c21; - border: 2px solid #41444e; - } - - .swagger-ui select[multiple] { background: #212121; } - - .swagger-ui button.invalid, .swagger-ui input[type=email].invalid, .swagger-ui input[type=file].invalid, .swagger-ui input[type=password].invalid, .swagger-ui input[type=search].invalid, .swagger-ui input[type=text].invalid, .swagger-ui select.invalid, .swagger-ui textarea.invalid { - background: #390e0e; - border-color: #c83232; - } - - .swagger-ui input[type=email], .swagger-ui input[type=file], .swagger-ui input[type=password], .swagger-ui input[type=search], .swagger-ui input[type=text], .swagger-ui textarea { - background: #1c1c21; - border: 1px solid #404040; - } - - .swagger-ui textarea { - background: rgba(28, 28, 33, .8); - color: #b5bac9; - } - - .swagger-ui input[disabled], .swagger-ui select[disabled] { - background-color: #1f1f1f; - color: #bfbfbf; - } - - .swagger-ui textarea[disabled] { - background-color: #41444e; - color: #fff; - } - - .swagger-ui select[disabled] { border-color: #878787; } - - .swagger-ui textarea:focus { border: 2px solid #2a69a7; } - - .swagger-ui .checkbox input[type=checkbox] + label > .item { - background: #303030; - box-shadow: #303030 0 0 0 2px; - } - - .swagger-ui .checkbox input[type=checkbox]:checked + label > .item { background: url("data:image/svg+xml;charset=utf-8,") 50% center no-repeat #303030; } - - .swagger-ui .dialog-ux .backdrop-ux { background: rgba(0, 0, 0, .8); } - - .swagger-ui .dialog-ux .modal-ux { - background: #1c1c21; - border: 1px solid #2e2e2e; - box-shadow: rgba(0, 0, 0, .2) 0 10px 30px 0; - } - - .swagger-ui .dialog-ux .modal-ux-header .close-modal { background: 0 0; } - - .swagger-ui .model .deprecated span, .swagger-ui .model .deprecated td { color: #bfbfbf !important; } - - .swagger-ui .model-toggle::after { background: url("data:image/svg+xml;charset=utf-8,") 50% center/100% no-repeat; } - - .swagger-ui .model-hint { - background: rgba(0, 0, 0, .7); - color: #ebebeb; - } - - .swagger-ui section.models { border: 1px solid rgba(58, 64, 80, .3); } - - .swagger-ui section.models.is-open h4 { border-bottom: 1px solid rgba(58, 64, 80, .3); } - - .swagger-ui section.models .model-container { background: rgba(0, 0, 0, .05); } - - .swagger-ui section.models .model-container:hover { background: rgba(0, 0, 0, .07); } - - .swagger-ui .model-box { background: rgba(0, 0, 0, .1); } - - .swagger-ui .prop-type { color: #aaaad4; } - - .swagger-ui table thead tr td, .swagger-ui table thead tr th { - border-bottom: 1px solid rgba(58, 64, 80, .2); - color: #b5bac9; - } - - .swagger-ui .parameter__name.required::after { color: rgba(230, 153, 153, .6); } - - .swagger-ui .topbar .download-url-wrapper .select-label { color: #f0f0f0; } - - .swagger-ui .topbar .download-url-wrapper .download-url-button { - background: #63a040; - color: #fff; - } - - .swagger-ui .info .title small { background: #7c8492; } - - .swagger-ui .info .title small.version-stamp { background-color: #7a9b27; } - - .swagger-ui .auth-container .errors { - background-color: #350d0d; - color: #b5bac9; - } - - .swagger-ui .errors-wrapper { - background: rgba(200, 50, 50, .1); - border: 2px solid #c83232; - } - - .swagger-ui .markdown code, .swagger-ui .renderedmarkdown code { - background: rgba(0, 0, 0, .05); - color: #c299e6; - } - - .swagger-ui .model-toggle:after { background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQyLnN2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyNCIKICAgd2lkdGg9IjI0Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii05IgogICAgIGlua3NjYXBlOmN5PSIxMiIKICAgICBpbmtzY2FwZTpjeD0iMTIiCiAgICAgaW5rc2NhcGU6em9vbT0iMzQuNTgzMzMzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz4KPC9zdmc+Cg==) 50% no-repeat; } - - /* arrows for each operation and request are now white */ - .arrow, #large-arrow-up { fill: #fff; } - - #unlocked { fill: #fff; } - - ::-webkit-scrollbar-track { background-color: #646464 !important; } - - ::-webkit-scrollbar-thumb { - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), linear-gradient(230deg, #696969 40%, transparent 41%), linear-gradient(0deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: linear-gradient(310deg, #696969 40%, transparent 41%), linear-gradient(50deg, #696969 40%, transparent 41%), linear-gradient(180deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: linear-gradient(210deg, #696969 40%, transparent 41%), linear-gradient(330deg, #696969 40%, transparent 41%), linear-gradient(90deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: linear-gradient(30deg, #696969 40%, transparent 41%), linear-gradient(150deg, #696969 40%, transparent 41%), linear-gradient(270deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button, ::-webkit-scrollbar-track-piece { background-color: #3e4346 !important; } - - .swagger-ui .black, .swagger-ui .checkbox, .swagger-ui .dark-gray, .swagger-ui .download-url-wrapper .loading, .swagger-ui .errors-wrapper .errors small, .swagger-ui .fallback, .swagger-ui .filter .loading, .swagger-ui .gray, .swagger-ui .hover-black:focus, .swagger-ui .hover-black:hover, .swagger-ui .hover-dark-gray:focus, .swagger-ui .hover-dark-gray:hover, .swagger-ui .hover-gray:focus, .swagger-ui .hover-gray:hover, .swagger-ui .hover-light-silver:focus, .swagger-ui .hover-light-silver:hover, .swagger-ui .hover-mid-gray:focus, .swagger-ui .hover-mid-gray:hover, .swagger-ui .hover-near-black:focus, .swagger-ui .hover-near-black:hover, .swagger-ui .hover-silver:focus, .swagger-ui .hover-silver:hover, .swagger-ui .light-silver, .swagger-ui .markdown pre, .swagger-ui .mid-gray, .swagger-ui .model .property, .swagger-ui .model .property.primitive, .swagger-ui .model-title, .swagger-ui .near-black, .swagger-ui .parameter__extension, .swagger-ui .parameter__in, .swagger-ui .prop-format, .swagger-ui .renderedmarkdown pre, .swagger-ui .response-col_links .response-undocumented, .swagger-ui .response-col_status .response-undocumented, .swagger-ui .silver, .swagger-ui section.models h4, .swagger-ui section.models h5, .swagger-ui span.token-not-formatted, .swagger-ui span.token-string, .swagger-ui table.headers .header-example, .swagger-ui table.model tr.description, .swagger-ui table.model tr.extension { color: #bfbfbf; } - - .swagger-ui .hover-white:focus, .swagger-ui .hover-white:hover, .swagger-ui .info .title small pre, .swagger-ui .topbar a, .swagger-ui .white { color: #fff; } - - .swagger-ui .bg-black-10, .swagger-ui .hover-bg-black-10:focus, .swagger-ui .hover-bg-black-10:hover, .swagger-ui .stripe-dark:nth-child(2n + 1) { background-color: rgba(0, 0, 0, .1); } - - .swagger-ui .bg-white-10, .swagger-ui .hover-bg-white-10:focus, .swagger-ui .hover-bg-white-10:hover, .swagger-ui .stripe-light:nth-child(2n + 1) { background-color: rgba(28, 28, 33, .1); } - - .swagger-ui .bg-light-silver, .swagger-ui .hover-bg-light-silver:focus, .swagger-ui .hover-bg-light-silver:hover, .swagger-ui .striped--light-silver:nth-child(2n + 1) { background-color: #6e6e6e; } - - .swagger-ui .bg-moon-gray, .swagger-ui .hover-bg-moon-gray:focus, .swagger-ui .hover-bg-moon-gray:hover, .swagger-ui .striped--moon-gray:nth-child(2n + 1) { background-color: #4d4d4d; } - - .swagger-ui .bg-light-gray, .swagger-ui .hover-bg-light-gray:focus, .swagger-ui .hover-bg-light-gray:hover, .swagger-ui .striped--light-gray:nth-child(2n + 1) { background-color: #2b2b2b; } - - .swagger-ui .bg-near-white, .swagger-ui .hover-bg-near-white:focus, .swagger-ui .hover-bg-near-white:hover, .swagger-ui .striped--near-white:nth-child(2n + 1) { background-color: #242424; } - - .swagger-ui .opblock-tag:hover, .swagger-ui section.models h4:hover { background: rgba(0, 0, 0, .02); } - - .swagger-ui .checkbox p, .swagger-ui .dialog-ux .modal-ux-content h4, .swagger-ui .dialog-ux .modal-ux-content p, .swagger-ui .dialog-ux .modal-ux-header h3, .swagger-ui .errors-wrapper .errors h4, .swagger-ui .errors-wrapper hgroup h4, .swagger-ui .info .base-url, .swagger-ui .info .title, .swagger-ui .info h1, .swagger-ui .info h2, .swagger-ui .info h3, .swagger-ui .info h4, .swagger-ui .info h5, .swagger-ui .info li, .swagger-ui .info p, .swagger-ui .info table, .swagger-ui .loading-container .loading::after, .swagger-ui .model, .swagger-ui .opblock .opblock-section-header h4, .swagger-ui .opblock .opblock-section-header > label, .swagger-ui .opblock .opblock-summary-description, .swagger-ui .opblock .opblock-summary-operation-id, .swagger-ui .opblock .opblock-summary-path, .swagger-ui .opblock .opblock-summary-path__deprecated, .swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-description-wrapper h4, .swagger-ui .opblock-description-wrapper p, .swagger-ui .opblock-external-docs-wrapper, .swagger-ui .opblock-external-docs-wrapper h4, .swagger-ui .opblock-external-docs-wrapper p, .swagger-ui .opblock-tag small, .swagger-ui .opblock-title_normal, .swagger-ui .opblock-title_normal h4, .swagger-ui .opblock-title_normal p, .swagger-ui .parameter__name, .swagger-ui .parameter__type, .swagger-ui .response-col_links, .swagger-ui .response-col_status, .swagger-ui .responses-inner h4, .swagger-ui .responses-inner h5, .swagger-ui .scheme-container .schemes > label, .swagger-ui .scopes h2, .swagger-ui .servers > label, .swagger-ui .tab li, .swagger-ui label, .swagger-ui select, .swagger-ui table.headers td { color: #b5bac9; } - - .swagger-ui .download-url-wrapper .failed, .swagger-ui .filter .failed, .swagger-ui .model-deprecated-warning, .swagger-ui .parameter__deprecated, .swagger-ui .parameter__name.required span, .swagger-ui table.model tr.property-row .star { color: #e69999; } - - .swagger-ui .opblock-body pre.microlight, .swagger-ui textarea.curl { - background: #41444e; - border-radius: 4px; - color: #fff; - } - - .swagger-ui .expand-methods svg, .swagger-ui .expand-methods:hover svg { fill: #bfbfbf; } - - .swagger-ui .auth-container, .swagger-ui .dialog-ux .modal-ux-header { border-bottom: 1px solid #2e2e2e; } - - .swagger-ui .topbar .download-url-wrapper .select-label select, .swagger-ui .topbar .download-url-wrapper input[type=text] { border: 2px solid #63a040; } - - .swagger-ui .info a, .swagger-ui .info a:hover, .swagger-ui .scopes h2 a { color: #99bde6; } - - /* Dark Scrollbar */ - ::-webkit-scrollbar { - width: 14px; - height: 14px; - } - - ::-webkit-scrollbar-button { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-track { - background-color: #646464 !important; - } - - ::-webkit-scrollbar-track-piece { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-thumb { - height: 50px; - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-corner {} - - ::-webkit-resizer {} - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: - linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), - linear-gradient(230deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(0deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: - linear-gradient(310deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(50deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(180deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: - linear-gradient(210deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(330deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(90deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: - linear-gradient(30deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(150deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(270deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } +.swagger-ui .json-schema-2020-12-keyword { + margin: 5px 0 +} + +.swagger-ui .json-schema-2020-12-keyword__children { + margin: 0 0 0 20px; + padding: 0 +} + +.swagger-ui .json-schema-2020-12-keyword__children--collapsed { + display: none +} + +.swagger-ui .json-schema-2020-12-keyword__name { + font-size: 12px; + font-weight: 700; + margin-left: 20px +} + +.swagger-ui .json-schema-2020-12-keyword__name--primary { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-keyword__name--secondary { + color: #6b6b6b; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-keyword__name--extension { + color: #929292; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-keyword__value { + color: #6b6b6b; + font-size: 12px; + font-style: italic; + font-weight: 400 +} + +.swagger-ui .json-schema-2020-12-keyword__value--primary { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-keyword__value--secondary { + color: #6b6b6b; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-keyword__value--extension { + color: #929292; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-keyword__value--warning { + color: #3b4151; + color: red; + display: inline-block; + font-family: monospace; + font-style: normal; + font-weight: 600; + line-height: 1.5; + margin-left: 10px; + padding: 1px 4px +} + +.swagger-ui .json-schema-2020-12-keyword__name--secondary+.json-schema-2020-12-keyword__value--secondary:before { + content: "=" +} + +.swagger-ui .json-schema-2020-12__attribute { + color: #3b4151; + font-family: monospace; + font-size: 12px; + padding-left: 10px; + text-transform: lowercase +} + +.swagger-ui .json-schema-2020-12__attribute--primary { + color: #55a +} + +.swagger-ui .json-schema-2020-12__attribute--muted { + color: gray +} + +.swagger-ui .json-schema-2020-12__attribute--warning { + color: red +} + +.swagger-ui .json-schema-2020-12-json-viewer { + margin: 5px 0 +} + +.swagger-ui .json-schema-2020-12-json-viewer__children { + margin: 0 0 0 20px; + padding: 0 +} + +.swagger-ui .json-schema-2020-12-json-viewer__children--collapsed { + display: none +} + +.swagger-ui .json-schema-2020-12-json-viewer__name { + font-size: 12px; + font-weight: 700; + margin-left: 20px +} + +.swagger-ui .json-schema-2020-12-json-viewer__name--primary { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-json-viewer__name--secondary { + color: #6b6b6b; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-json-viewer__name--extension { + color: #929292; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-json-viewer__value { + color: #6b6b6b; + font-size: 12px; + font-style: italic; + font-weight: 400 +} + +.swagger-ui .json-schema-2020-12-json-viewer__value--primary { + color: #3b4151; + font-style: normal +} + +.swagger-ui .json-schema-2020-12-json-viewer__value--secondary { + color: #6b6b6b; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-json-viewer__value--extension { + color: #929292; + font-style: italic +} + +.swagger-ui .json-schema-2020-12-json-viewer__value--warning { + color: #3b4151; + color: red; + display: inline-block; + font-family: monospace; + font-style: normal; + font-weight: 600; + line-height: 1.5; + margin-left: 10px; + padding: 1px 4px +} + +.swagger-ui .json-schema-2020-12-json-viewer__name--secondary+.json-schema-2020-12-json-viewer__value--secondary:before { + content: "=" +} + +.swagger-ui .json-schema-2020-12 { + background-color: rgba(0,0,0,.05); + padding: 12px 0 12px 20px +} + +.swagger-ui .json-schema-2020-12--embedded { + background-color: inherit; + padding-bottom: 0; + padding-left: inherit; + padding-right: inherit; + padding-top: 0 +} + +.swagger-ui .json-schema-2020-12-body { + margin: 2px 0 +} + +.swagger-ui .json-schema-2020-12-body--collapsed { + display: none +} + +.swagger-ui .json-schema-2020-12-accordion { + outline: none; + padding-left: 0; + border: none; + background-color: transparent; +} + +.swagger-ui .json-schema-2020-12-accordion__children { + display: inline-block +} + +.swagger-ui .json-schema-2020-12-accordion__icon { + display: inline-block; + height: 18px; + vertical-align: bottom; + width: 18px +} + +.swagger-ui .json-schema-2020-12-accordion__icon--expanded { + transform: rotate(-90deg); + transform-origin: 50% 50%; + transition: transform .15s ease-in +} + +.swagger-ui .json-schema-2020-12-accordion__icon--collapsed { + transform: rotate(0deg); + transform-origin: 50% 50%; + transition: transform .15s ease-in +} + +.swagger-ui .json-schema-2020-12-accordion__icon svg { + height: 20px; + width: 20px +} + +.swagger-ui .json-schema-2020-12-expand-deep-button { + color: #505050; + color: #55a; + font-family: sans-serif; + font-size: 12px; + padding-right: 0; + border: none; + background-color: transparent; +} + +.swagger-ui .model-box .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type { + font-size: 16px +} + +.swagger-ui .model-box>.json-schema-2020-12 { + margin: 0 +} + +.swagger-ui .model-box .json-schema-2020-12 { + background-color: transparent; + padding: 0 +} + +.swagger-ui .model-box .json-schema-2020-12-accordion,.swagger-ui .model-box .json-schema-2020-12-expand-deep-button { + background-color: transparent +} + +.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type { + font-size: 16px +} + +.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded) { + overflow-x: auto; + width: calc(100% - 40px) +} + +.response-col_description__inner { + font-weight: 500; + font-size: 1.2em; } diff --git a/modules/api/docs.py b/modules/api/docs.py index f384a1328..1eac8226e 100644 --- a/modules/api/docs.py +++ b/modules/api/docs.py @@ -41,20 +41,18 @@ def get_swagger_ui_html(*, if oauth2_redirect_url: html += f"oauth2RedirectUrl: window.location.origin + '{oauth2_redirect_url}'," html += """ - presets: [ - SwaggerUIBundle.presets.apis, - SwaggerUIBundle.SwaggerUIStandalonePreset - ], - })""" + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIBundle.SwaggerUIStandalonePreset + ], + })""" if init_oauth: - html += f""" - ui.initOAuth({json.dumps(jsonable_encoder(init_oauth))}) - """ + html += f"ui.initOAuth({json.dumps(jsonable_encoder(init_oauth))})" html += """ - - - - """ + + + + """ return HTMLResponse(html) @@ -74,8 +72,9 @@ def create_docs(app: FastAPI): title=f'{app.title}: Swagger UI', openapi_url=app.openapi_url, swagger_favicon_url='/file=html/favicon.svg', + swagger_css_url='/file=html/swagger.css', swagger_ui_parameters=swagger_ui_parameters, - swagger_extra_css_url='file=html/swagger.css', + # swagger_extra_css_url='file=html/swagger.css', ) # res = inject_css(html.content, 'html/swagger.css') return res From 7fdc880a7370eeb5814368d2475cefea4a451484 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 09:43:34 -0400 Subject: [PATCH 170/230] sdnq patches Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 +- modules/sdnq/loader.py | 21 ++++++++++++++++++--- modules/sdnq/quantizer.py | 21 +++++++++++++++------ pipelines/generic.py | 7 +++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4f1ed331..036717542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-05 +## Update for 2025-10-07 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 92f784aaa..86f67d372 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -9,9 +9,24 @@ from .quantizer import SDNQConfig, apply_sdnq_to_module from .dequantizer import dequantize_symmetric, re_quantize_int8, re_quantize_fp8 -def save_sdnq_model(model: ModelMixin, sdnq_config: SDNQConfig, model_path: str, max_shard_size: str = "10GB") -> None: - model.save_pretrained(model_path, max_shard_size=max_shard_size) - sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) +def get_module_names(model: ModelMixin) -> list: + modules_names = model._internal_dict.keys() # pylint: disable=protected-access + modules_names = [m for m in modules_names if not m.startswith('_')] + modules_names = [m for m in modules_names if isinstance(getattr(model, m, None), torch.nn.Module)] + modules_names = sorted(set(modules_names)) + return modules_names + + +def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", sdnq_config: SDNQConfig = None) -> None: + model.save_pretrained(model_path, max_shard_size=max_shard_size) # actual save + + if sdnq_config is not None: # if provided, save global config + sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) + + for module_name in get_module_names(model): # save per-module config if available + module = getattr(model, module_name, None) + if (module is not None) and hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): + module.quantization_config.to_json_file(os.path.join(model_path, f"{module_name}_quantization_config.json")) def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None) -> ModelMixin: diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 7261d2373..b3b853e97 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -6,6 +6,7 @@ from enum import Enum import re import torch +from transformers.quantizers import HfQuantizer from diffusers.quantizers.base import DiffusersQuantizer from diffusers.quantizers.quantization_config import QuantizationConfigMixin from diffusers.utils import get_module_from_name @@ -59,7 +60,7 @@ def apply_svdquant(weight: torch.FloatTensor, rank: int = 32) -> Tuple[torch.Flo svd_down = svd_down.t_() weight = weight.sub_(torch.mm(svd_up, svd_down)) if reshape_weight: - weight = weight.unflatten(-1, (*weight_shape[1:],)) + weight = weight.unflatten(-1, (*weight_shape[1:],)) # pylint: disable=possibly-used-before-assignment return weight, svd_up, svd_down @@ -320,7 +321,7 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model -class SDNQQuantizer(DiffusersQuantizer): +class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): r""" Diffusers Quantizer for SDNQ """ @@ -530,14 +531,16 @@ class SDNQQuantizer(DiffusersQuantizer): """ return dtype + def is_serializable(self, *args, **kwargs) -> bool: # pylint: disable=unused-argument, invalid-overridden-method + """ + needed for transformers compatibilty, returns True + """ + return True + @property def is_trainable(self): return False - @property - def is_serializable(self): - return True - @property def is_compileable(self): return True @@ -631,6 +634,12 @@ class SDNQConfig(QuantizationConfigMixin): if self.modules_dtype_dict is None: self.modules_dtype_dict = {} + def to_dict(self): + dct = self.__dict__.copy() # make serializable + dct["quantization_device"] = str(dct["quantization_device"]) if dct["quantization_device"] is not None else None + dct["return_device"] = str(dct["return_device"]) if dct["return_device"] is not None else None + return dct + import diffusers.quantizers.auto # noqa: E402,RUF100 # pylint: disable=wrong-import-order diffusers.quantizers.auto.AUTO_QUANTIZER_MAPPING["sdnq"] = SDNQQuantizer diff --git a/pipelines/generic.py b/pipelines/generic.py index 0eb2c19c1..f14f88ab8 100644 --- a/pipelines/generic.py +++ b/pipelines/generic.py @@ -61,9 +61,13 @@ def load_transformer(repo_id, cls_name, load_config={}, subfolder="transformer", **load_args, **quant_args, ) + sd_models.allow_post_quant = False # we already handled it if shared.opts.diffusers_offload_mode != 'none' and transformer is not None: sd_models.move_model(transformer, devices.cpu) + + if (transformer is not None) and (quant_type is not None) and (quant_args.get('quantization_config', None) is not None): # attach quantization_config + transformer.quantization_config = quant_args.get('quantization_config', None) except Exception as e: shared.log.error(f'Load model: transformer="{repo_id}" cls={cls_name.__name__} {e}') errors.display(e, 'Load:') @@ -157,6 +161,9 @@ def load_text_encoder(repo_id, cls_name, load_config={}, subfolder="text_encoder sd_models.allow_post_quant = False # we already handled it if shared.opts.diffusers_offload_mode != 'none' and text_encoder is not None: sd_models.move_model(text_encoder, devices.cpu) + + if (text_encoder is not None) and (quant_type is not None) and (quant_args.get('quantization_config', None) is not None): # attach quantization_config + text_encoder.quantization_config = quant_args.get('quantization_config', None) except Exception as e: shared.log.error(f'Load model: text_encoder="{repo_id}" cls={cls_name.__name__} {e}') errors.display(e, 'Load:') From 0092a8b86b36d07238c703e8b0be901ed9dcfd41 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 10:14:31 -0400 Subject: [PATCH 171/230] add quantization_config for post-load Signed-off-by: Vladimir Mandic --- modules/model_quant.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/modules/model_quant.py b/modules/model_quant.py index 288d6e8ed..f5baec12a 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -530,6 +530,7 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh backup_embeddings = copy.deepcopy(model.get_input_embeddings()) t0 = time.time() + model = apply_sdnq_to_module( model, weights_dtype=weights_dtype, @@ -548,6 +549,24 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh modules_dtype_dict=modules_dtype_dict.copy(), op=op, ) + + from modules.sdnq import SDNQConfig + model.quantization_config = SDNQConfig( + weights_dtype=weights_dtype, + group_size=shared.opts.sdnq_quantize_weights_group_size, + svd_rank=shared.opts.sdnq_svd_rank, + use_svd=shared.opts.sdnq_use_svd, + quant_conv=shared.opts.sdnq_quantize_conv_layers, + use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, + use_quantized_matmul_conv=shared.opts.sdnq_use_quantized_matmul_conv, + dequantize_fp32=shared.opts.sdnq_dequantize_fp32, + non_blocking=shared.opts.diffusers_offload_nonblocking, + quantization_device=quantization_device, + return_device=return_device, + modules_to_not_convert=modules_to_not_convert, + modules_dtype_dict=modules_dtype_dict.copy(), + ) + t1 = time.time() timer.load.add('sdnq', t1 - t0) model.quantization_method = 'SDNQ' From e4120bd4d6b6412007278018d01db5b9dffc27e0 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 10:57:17 -0400 Subject: [PATCH 172/230] detect sdnq saved model Signed-off-by: Vladimir Mandic --- modules/sd_detect.py | 5 +++++ modules/sd_models.py | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 0cd3cdb86..059b081a4 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -124,6 +124,8 @@ def guess_by_name(fn, current_guess): def guess_by_diffusers(fn, current_guess): exclude_by_name = ['ostris/Flex.2-preview'] # pipeline may be misleading + if not os.path.isdir(fn): + return current_guess, None index = os.path.join(fn, 'model_index.json') if os.path.exists(index) and os.path.isfile(index): index = shared.readfile(index, silent=True) @@ -136,9 +138,12 @@ def guess_by_diffusers(fn, current_guess): if pipeline is None: pipeline = cls if callable(pipeline): + is_quant = any(f for f in os.listdir(fn) if f.endswith('quantization_config.json')) pipelines = shared_items.get_pipelines() for k, v in pipelines.items(): if v is not None and v.__name__ == pipeline.__name__: + if is_quant: + k = f'{k} SDNQ' return k, v return current_guess, None diff --git a/modules/sd_models.py b/modules/sd_models.py index 426a7ca3d..449e26772 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -541,6 +541,11 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con return sd_model +def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): + shared.log.error(f'Load {op}: model="{checkpoint_info.name}" cls={pipeline.__name__} args={diffusers_load_config} SDNQ pre-quant not supported') + return None + + def set_overrides(sd_model, checkpoint_info): checkpoint_info_name = checkpoint_info.name.lower() if 'bigaspv25' in checkpoint_info_name or ('flow' in checkpoint_info_name and 'flower' not in checkpoint_info_name): @@ -657,6 +662,12 @@ def load_diffuser(checkpoint_info=None, op='model', revision=None): # pylint: di shared.log.error(f'Load {op}: type="{model_type}" pipeline="{pipeline}" not loaded') return + # load sdnq-prequantized model + if sd_model is None: + if model_type.endswith('SDNQ'): + allow_post_quant = False + sd_model = load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op) + # load from hf folder-style if sd_model is None: if os.path.isdir(checkpoint_info.path) or checkpoint_info.type == 'huggingface' or checkpoint_info.type == 'transformer': From 962cb7115d33ab863caf3b12ad4caab6d4abfdcf Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 7 Oct 2025 14:30:45 -0400 Subject: [PATCH 173/230] infra for full-model load/save with quant Signed-off-by: Vladimir Mandic --- modules/prompt_parser_diffusers.py | 3 ++ modules/sd_models.py | 28 ++++++++++++++--- modules/sd_offload.py | 1 + modules/sdnq/loader.py | 49 +++++++++++++++++++++++++----- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/modules/prompt_parser_diffusers.py b/modules/prompt_parser_diffusers.py index 31947ee7b..571bf70d1 100644 --- a/modules/prompt_parser_diffusers.py +++ b/modules/prompt_parser_diffusers.py @@ -589,6 +589,9 @@ def get_weighted_text_embeddings(pipe, prompt: str = "", neg_prompt: str = "", c negative_weights.pop(0) embedding_providers = prepare_embedding_providers(pipe, clip_skip) + if len(embedding_providers) == 0: + shared.log.error("Prompt encode: cannot find text encoder in model") + return None, None, None, None, None, None empty_embedding_providers = None if 'StableCascade' in pipe.__class__.__name__: empty_embedding_providers = [embedding_providers[1]] diff --git a/modules/sd_models.py b/modules/sd_models.py index 449e26772..c8f78c1ae 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -542,8 +542,27 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): - shared.log.error(f'Load {op}: model="{checkpoint_info.name}" cls={pipeline.__name__} args={diffusers_load_config} SDNQ pre-quant not supported') - return None + from modules import sdnq + modules = {} + for f in os.listdir(checkpoint_info.path): + if not f.endswith('quantization_config.json'): + continue + module_name = f.replace('_quantization_config.json', '') + quantization_config = shared.readfile(os.path.join(checkpoint_info.path, f), silent=True) + shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" prequant=sdnq') + module_path = os.path.join(checkpoint_info.path, module_name) + modules[module_name] = sdnq.load_sdnq_model( + model_path=module_path, + quantization_config=quantization_config, + ) + modules[module_name] = modules[module_name].to(device=devices.device) + sd_model = pipeline.from_pretrained( + checkpoint_info.path, + cache_dir=shared.opts.diffusers_dir, + **modules, + **diffusers_load_config, + ) + return sd_model def set_overrides(sd_model, checkpoint_info): @@ -665,8 +684,9 @@ def load_diffuser(checkpoint_info=None, op='model', revision=None): # pylint: di # load sdnq-prequantized model if sd_model is None: if model_type.endswith('SDNQ'): - allow_post_quant = False sd_model = load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op) + allow_post_quant = False + model_type = model_type.replace(' SDNQ', '') # load from hf folder-style if sd_model is None: @@ -1056,7 +1076,7 @@ def set_diffusers_attention(pipe, quiet:bool=False): if attention is None: return # other models uses their own attention processor - if pipe.__class__.__name__.startswith("StableDiffusion") and hasattr(pipe, "unet"): + if pipe.__class__.__name__.startswith("StableDiffusion") and getattr(pipe, "unet", None) is not None and hasattr(pipe.unet, "set_attn_processor"): try: pipe.unet.set_attn_processor(attention) except Exception as e: diff --git a/modules/sd_offload.py b/modules/sd_offload.py index 54446abdf..c52220ccb 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -434,6 +434,7 @@ def apply_balanced_offload(sd_model=None, exclude=[]): module.offload_dir = os.path.join(shared.opts.accelerate_offload_path, checkpoint_name, module_name) apply_balanced_offload_to_module(module, op='apply') report_model_stats(module_name, module) + set_accelerate(sd_model) t = time.time() - t0 process_timer.add('offload', t) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 86f67d372..4ba68a69f 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -29,24 +29,59 @@ def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "1 module.quantization_config.to_json_file(os.path.join(model_path, f"{module_name}_quantization_config.json")) -def load_sdnq_model(model_cls: ModelMixin, model_path: str, file_name: str = "diffusion_pytorch_model.safetensors", dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None) -> ModelMixin: - with torch.device("meta"): - with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: - quantization_config = json.load(f) +def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: + with torch.device("cpu"): + if quantization_config is None: + try: + with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: + quantization_config = json.load(f) + except Exception: + quantization_config = {} + if model_config is None: + try: + with open(os.path.join(model_path, 'config.json'), "r", encoding="utf-8") as f: + model_config = json.load(f) + except Exception: + model_config = {} + if model_cls is None: + import transformers + import diffusers + class_name = model_config.get("_class_name", None) or model_config.get("architectures", None) + if isinstance(class_name, list): + class_name = class_name[0] + if class_name is not None: + model_cls = getattr(diffusers, class_name, None) or getattr(transformers, class_name, None) + if model_cls is None: + raise ValueError(f"Cannot determine model class for {model_path}, please provide model_cls argument") quantization_config.pop("is_integer", None) quantization_config.pop("quant_method", None) quantization_config.pop("quantization_device", None) quantization_config.pop("return_device", None) quantization_config.pop("non_blocking", None) - config = model_cls.load_config(model_path) - model = model_cls.from_config(config) + if hasattr(model_cls, "load_config"): + config = model_cls.load_config(model_path) + model = model_cls.from_config(config) + elif hasattr(model_cls, "_from_config"): + config = transformers.PretrainedConfig.from_dict(model_config) + model = model_cls._from_config(config) # pylint: disable=protected-access + else: + raise ValueError(f"Dont know how to load model for {model_cls}") model = apply_sdnq_to_module(model, **quantization_config) state_dict = {} - with safe_open(os.path.join(model_path, file_name), framework="pt") as f: + if file_name: + fn = os.path.join(model_path, file_name) + elif os.path.exists(os.path.join(model_path, "diffusion_pytorch_model.safetensors")): + fn = os.path.join(model_path, "diffusion_pytorch_model.safetensors") + elif os.path.exists(os.path.join(model_path, "model.safetensors")): + fn = os.path.join(model_path, "model.safetensors") + else: + raise ValueError(f"Cannot find safetensors file in {model_path}, please provide file_name argument") + with safe_open(fn, framework="pt") as f: for k in f.keys(): state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) + model.quantization_method = "sdnq" del state_dict if dtype is not None or dequantize_fp32 is not None or use_quantized_matmul is not None: model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) From df03ea9ba8626c315cd1a7325ee6cb8fbf6e8e33 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 00:29:36 +0300 Subject: [PATCH 174/230] SDNQ add sdnq_post_load_quant and update Qwen keys --- modules/model_quant.py | 43 ++++--------------------- modules/sdnq/__init__.py | 4 ++- modules/sdnq/loader.py | 5 ++- modules/sdnq/quantizer.py | 68 ++++++++++++++++++++++++++++++++++++--- pipelines/model_qwen.py | 3 +- 5 files changed, 77 insertions(+), 46 deletions(-) diff --git a/modules/model_quant.py b/modules/model_quant.py index f5baec12a..c3d2439ec 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -479,7 +479,7 @@ def apply_layerwise(sd_model, quiet:bool=False): def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weights_dtype: str = None, modules_to_not_convert: list = None, modules_dtype_dict: dict = None): global quant_last_model_name, quant_last_model_device # pylint: disable=global-statement from modules import devices, shared, timer - from modules.sdnq import apply_sdnq_to_module + from modules.sdnq import sdnq_post_load_quant if weights_dtype is None: if op is not None and ("text_encoder" in op or op in {"TE", "LLM"}) and shared.opts.sdnq_quantize_weights_mode_te not in {"Same as model", "default"}: @@ -497,13 +497,6 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh if modules_dtype_dict is None: modules_dtype_dict = {} - if getattr(model, "_keep_in_fp32_modules", None) is not None: - modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access - if model.__class__.__name__ == "ChromaTransformer2DModel": - modules_to_not_convert.append("distilled_guidance_layer") - sdnq_modules_to_not_convert = [m.strip() for m in re.split(';|,| ', shared.opts.sdnq_modules_to_not_convert) if len(m.strip()) > 1] if len(sdnq_modules_to_not_convert) > 0: modules_to_not_convert.extend(sdnq_modules_to_not_convert) @@ -524,14 +517,9 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh except Exception as e: log.warning(f'Quantization: SDNQ failed to parse sdnq_modules_dtype_dict: {e}') - model.eval() - backup_embeddings = None - if hasattr(model, "get_input_embeddings"): - backup_embeddings = copy.deepcopy(model.get_input_embeddings()) - t0 = time.time() - model = apply_sdnq_to_module( + model = sdnq_post_load_quant( model, weights_dtype=weights_dtype, torch_dtype=devices.dtype, @@ -550,29 +538,8 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh op=op, ) - from modules.sdnq import SDNQConfig - model.quantization_config = SDNQConfig( - weights_dtype=weights_dtype, - group_size=shared.opts.sdnq_quantize_weights_group_size, - svd_rank=shared.opts.sdnq_svd_rank, - use_svd=shared.opts.sdnq_use_svd, - quant_conv=shared.opts.sdnq_quantize_conv_layers, - use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, - use_quantized_matmul_conv=shared.opts.sdnq_use_quantized_matmul_conv, - dequantize_fp32=shared.opts.sdnq_dequantize_fp32, - non_blocking=shared.opts.diffusers_offload_nonblocking, - quantization_device=quantization_device, - return_device=return_device, - modules_to_not_convert=modules_to_not_convert, - modules_dtype_dict=modules_dtype_dict.copy(), - ) - t1 = time.time() timer.load.add('sdnq', t1 - t0) - model.quantization_method = 'SDNQ' - - if hasattr(model, "set_input_embeddings") and backup_embeddings is not None: - model.set_input_embeddings(backup_embeddings) if op is not None and shared.opts.sdnq_quantize_shuffle_weights: if quant_last_model_name is not None: @@ -628,12 +595,14 @@ def optimum_quanto_model(model, op=None, sd_model=None, weights=None, activation from modules import devices, shared quanto = load_quanto('Quantize model: type=Optimum Quanto') global quant_last_model_name, quant_last_model_device # pylint: disable=global-statement - if sd_model is not None and ("Flux" in sd_model.__class__.__name__ or "Chroma" in sd_model.__class__.__name__): # LayerNorm is not supported + if model.__class__.__name__ in {"FluxTransformer2DModel", "ChromaTransformer2DModel"}: # LayerNorm is not supported exclude_list = ["transformer_blocks.*.norm1.norm", "transformer_blocks.*.norm2", "transformer_blocks.*.norm1_context.norm", "transformer_blocks.*.norm2_context", "single_transformer_blocks.*.norm.norm", "norm_out.norm"] - if "Chroma" in sd_model.__class__.__name__: + if model.__class__.__name__ == "ChromaTransformer2DModel": # we ignore the distilled guidance layer because it degrades quality too much # see: https://github.com/huggingface/diffusers/pull/11698#issuecomment-2969717180 for more details exclude_list.append("distilled_guidance_layer.*") + elif model.__class__.__name__ == "QwenImageTransformer2DModel": + exclude_list = ["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"] else: exclude_list = None weights = getattr(quanto, weights) if weights is not None else getattr(quanto, shared.opts.optimum_quanto_weights_type) diff --git a/modules/sdnq/__init__.py b/modules/sdnq/__init__.py index 121db2c8d..c67bf0db7 100644 --- a/modules/sdnq/__init__.py +++ b/modules/sdnq/__init__.py @@ -1,12 +1,14 @@ -from .quantizer import SDNQConfig, SDNQQuantizer, apply_sdnq_to_module, sdnq_quantize_layer +from .quantizer import QuantizationMethod, SDNQConfig, SDNQQuantizer, sdnq_post_load_quant, apply_sdnq_to_module, sdnq_quantize_layer from .loader import save_sdnq_model, load_sdnq_model __all__ = [ + "QuantizationMethod", "SDNQConfig", "SDNQQuantizer", "apply_sdnq_to_module", "load_sdnq_model", "save_sdnq_model", + "sdnq_post_load_quant", "sdnq_quantize_layer", ] diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 4ba68a69f..582c6b4b3 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -5,7 +5,7 @@ from safetensors import safe_open from diffusers.models.modeling_utils import ModelMixin from .common import use_tensorwise_fp8_matmul, use_contiguous_mm -from .quantizer import SDNQConfig, apply_sdnq_to_module +from .quantizer import SDNQConfig, sdnq_post_load_quant from .dequantizer import dequantize_symmetric, re_quantize_int8, re_quantize_fp8 @@ -66,7 +66,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model = model_cls._from_config(config) # pylint: disable=protected-access else: raise ValueError(f"Dont know how to load model for {model_cls}") - model = apply_sdnq_to_module(model, **quantization_config) + model = sdnq_post_load_quant(model, **quantization_config) state_dict = {} if file_name: @@ -81,7 +81,6 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st for k in f.keys(): state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) - model.quantization_method = "sdnq" del state_dict if dtype is not None or dequantize_fp32 is not None or use_quantized_matmul is not None: model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index b3b853e97..3fcf33ea7 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -75,7 +75,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz result_shape = None original_shape = layer.weight.shape if torch_dtype is None: - torch_dtype = devices.dtype + torch_dtype = layer.weight.dtype if layer_class_name in conv_types: if not quant_conv: @@ -321,6 +321,66 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model +def sdnq_post_load_quant(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, op=None): # pylint: disable=unused-argument + model.eval() + if modules_to_not_convert is None: + modules_to_not_convert = [] + if modules_dtype_dict is None: + modules_dtype_dict = {} + + if getattr(model, "_keep_in_fp32_modules", None) is not None: + modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access + if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: + modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + if model.__class__.__name__ == "ChromaTransformer2DModel": + modules_to_not_convert.append("distilled_guidance_layer") + elif model.__class__.__name__ == "QwenImageTransformer2DModel": + modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) + if "minimum_6bit" not in modules_dtype_dict.keys(): + modules_dtype_dict["minimum_6bit"] = ["img_mod"] + else: + modules_dtype_dict["minimum_6bit"].append("img_mod") + + model = apply_sdnq_to_module( + model, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, + quant_conv=quant_conv, + use_quantized_matmul=use_quantized_matmul, + use_quantized_matmul_conv=use_quantized_matmul_conv, + dequantize_fp32=dequantize_fp32, + non_blocking=non_blocking, + quantization_device=quantization_device, + return_device=return_device, + modules_to_not_convert=modules_to_not_convert, + modules_dtype_dict=modules_dtype_dict.copy(), + op=op, + ) + + model.quantization_config = SDNQConfig( + weights_dtype=weights_dtype, + group_size=group_size, + svd_rank=svd_rank, + use_svd=use_svd, + quant_conv=quant_conv, + use_quantized_matmul=use_quantized_matmul, + use_quantized_matmul_conv=use_quantized_matmul_conv, + dequantize_fp32=dequantize_fp32, + non_blocking=non_blocking, + quantization_device=quantization_device, + return_device=return_device, + modules_to_not_convert=modules_to_not_convert, + modules_dtype_dict=modules_dtype_dict.copy(), + ) + + model.quantization_method = QuantizationMethod.SDNQ + + return model + + class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): r""" Diffusers Quantizer for SDNQ @@ -384,6 +444,8 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): *args, **kwargs, # pylint: disable=unused-argument ): weights_dtype = self.quantization_config.weights_dtype + torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype + if len(self.quantization_config.modules_dtype_dict.keys()) > 0: split_param_name = param_name.split(".") for key, value in self.quantization_config.modules_dtype_dict.items(): @@ -424,7 +486,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): layer = sdnq_quantize_layer( layer, weights_dtype=weights_dtype, - torch_dtype=self.torch_dtype, + torch_dtype=torch_dtype, group_size=self.quantization_config.group_size, svd_rank=self.quantization_config.svd_rank, use_svd=self.quantization_config.use_svd, @@ -446,8 +508,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): return dtype_dict[self.quantization_config.weights_dtype]["target_dtype"] def update_torch_dtype(self, torch_dtype: torch.dtype = None) -> torch.dtype: - if torch_dtype is None: - torch_dtype = devices.dtype self.torch_dtype = torch_dtype return torch_dtype diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index 6ed90bb15..d9a98d9be 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -49,7 +49,8 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): subfolder=transformer_subfolder, cls_name=diffusers.QwenImageTransformer2DModel, load_config=diffusers_load_config, - modules_dtype_dict={"minimum_8bit": ["pos_embed", "time_text_embed", "img_in", "txt_in", "norm_out", "img_mod", "transformer_blocks.0.img_mod.1.weight"]}, + modules_dtype_dict={"minimum_6bit": ["img_mod"]}, + modules_to_not_convert=["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"], ) repo_te = 'Qwen/Qwen-Image' From 7fdf400e8bdcec24679901099e2dcce7db5f9103 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 00:41:04 +0300 Subject: [PATCH 175/230] cleanup --- modules/sdnq/loader.py | 2 +- modules/sdnq/quantizer.py | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 582c6b4b3..d4d4e8ab8 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -66,7 +66,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model = model_cls._from_config(config) # pylint: disable=protected-access else: raise ValueError(f"Dont know how to load model for {model_cls}") - model = sdnq_post_load_quant(model, **quantization_config) + model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config) state_dict = {} if file_name: diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 3fcf33ea7..9a9d9c368 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -321,26 +321,27 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model -def sdnq_post_load_quant(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, op=None): # pylint: disable=unused-argument - model.eval() +def sdnq_post_load_quant(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, add_skip_keys=True, op=None): # pylint: disable=unused-argument if modules_to_not_convert is None: modules_to_not_convert = [] if modules_dtype_dict is None: modules_dtype_dict = {} - if getattr(model, "_keep_in_fp32_modules", None) is not None: - modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access - if model.__class__.__name__ == "ChromaTransformer2DModel": - modules_to_not_convert.append("distilled_guidance_layer") - elif model.__class__.__name__ == "QwenImageTransformer2DModel": - modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) - if "minimum_6bit" not in modules_dtype_dict.keys(): - modules_dtype_dict["minimum_6bit"] = ["img_mod"] - else: - modules_dtype_dict["minimum_6bit"].append("img_mod") + if add_skip_keys: + if getattr(model, "_keep_in_fp32_modules", None) is not None: + modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access + if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: + modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + if model.__class__.__name__ == "ChromaTransformer2DModel": + modules_to_not_convert.append("distilled_guidance_layer") + elif model.__class__.__name__ == "QwenImageTransformer2DModel": + modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) + if "minimum_6bit" not in modules_dtype_dict.keys(): + modules_dtype_dict["minimum_6bit"] = ["img_mod"] + else: + modules_dtype_dict["minimum_6bit"].append("img_mod") + model.eval() model = apply_sdnq_to_module( model, weights_dtype=weights_dtype, From bdcd07f71318cb3393848185a4097a1c482cb7d7 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 01:11:40 +0300 Subject: [PATCH 176/230] Add add_module_skip_keys to pre-load quant too --- modules/sdnq/loader.py | 1 + modules/sdnq/quantizer.py | 71 ++++++++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index d4d4e8ab8..967254070 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -58,6 +58,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st quantization_config.pop("quantization_device", None) quantization_config.pop("return_device", None) quantization_config.pop("non_blocking", None) + quantization_config.pop("add_skip_keys", None) if hasattr(model_cls, "load_config"): config = model_cls.load_config(model_path) model = model_cls.from_config(config) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 9a9d9c368..4d7fdc3e2 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -321,25 +321,48 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model -def sdnq_post_load_quant(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, add_skip_keys=True, op=None): # pylint: disable=unused-argument +def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]]): + if getattr(model, "_keep_in_fp32_modules", None) is not None: + modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access + if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: + modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + if model.__class__.__name__ == "ChromaTransformer2DModel": + modules_to_not_convert.append("distilled_guidance_layer") + elif model.__class__.__name__ == "QwenImageTransformer2DModel": + modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) + if "minimum_6bit" not in modules_dtype_dict.keys(): + modules_dtype_dict["minimum_6bit"] = ["img_mod"] + else: + modules_dtype_dict["minimum_6bit"].append("img_mod") + return model, modules_to_not_convert, modules_dtype_dict + + +def sdnq_post_load_quant( + model, + weights_dtype="int8", + torch_dtype: torch.dtype = None, + group_size: int = 0, + svd_rank: int = 32, + use_svd: bool = False, + quant_conv: bool = False, + use_quantized_matmul: bool = False, + use_quantized_matmul_conv: bool = False, + dequantize_fp32: bool = False, + non_blocking: bool = False, + add_skip_keys:bool = True, + quantization_device: torch.device = None, + return_device: torch.device = None, + modules_to_not_convert: List[str] = None, + modules_dtype_dict: Dict[str, List[str]] = None, + op=None, +): if modules_to_not_convert is None: modules_to_not_convert = [] if modules_dtype_dict is None: modules_dtype_dict = {} if add_skip_keys: - if getattr(model, "_keep_in_fp32_modules", None) is not None: - modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access - if model.__class__.__name__ == "ChromaTransformer2DModel": - modules_to_not_convert.append("distilled_guidance_layer") - elif model.__class__.__name__ == "QwenImageTransformer2DModel": - modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) - if "minimum_6bit" not in modules_dtype_dict.keys(): - modules_dtype_dict["minimum_6bit"] = ["img_mod"] - else: - modules_dtype_dict["minimum_6bit"].append("img_mod") + model, modules_to_not_convert, modules_dtype_dict = add_module_skip_keys(model, modules_to_not_convert, modules_dtype_dict) model.eval() model = apply_sdnq_to_module( @@ -377,6 +400,8 @@ def sdnq_post_load_quant(model, weights_dtype="int8", torch_dtype=None, group_si modules_dtype_dict=modules_dtype_dict.copy(), ) + if hasattr(model, "config"): + model.config.quantization_config = model.quantization_config model.quantization_method = QuantizationMethod.SDNQ return model @@ -519,15 +544,17 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): keep_in_fp32_modules: List[str] = None, **kwargs, # pylint: disable=unused-argument ): - if keep_in_fp32_modules is not None: - self.modules_to_not_convert.extend(keep_in_fp32_modules) - elif getattr(model, "_keep_in_fp32_modules", None) is not None: - self.modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - self.modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + self.quantization_config.add_skip_keys: + if keep_in_fp32_modules is not None: + self.modules_to_not_convert.extend(keep_in_fp32_modules) + model, self.modules_to_not_convert, self.quantization_config.modules_dtype_dict = add_module_skip_keys( + model, self.modules_to_not_convert, self.quantization_config.modules_dtype_dict + ) self.modules_to_not_convert.extend(self.quantization_config.modules_to_not_convert) self.quantization_config.modules_to_not_convert = self.modules_to_not_convert - model.config.quantization_config = self.quantization_config + if hasattr(model, "config"): + model.config.quantization_config = self.quantization_config + model.quantization_config = self.quantization_config def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument if shared.opts.diffusers_offload_mode != "none": @@ -634,6 +661,8 @@ class SDNQConfig(QuantizationConfigMixin): Enabling this option will use FP32 on the dequantization step. non_blocking (`bool`, *optional*, defaults to `False`): Enabling this option will use non blocking ops when moving layers between the quantization device and the return device. + add_skip_keys (`bool`, *optional*, defaults to `True`): + Disabling this option won't add model specific modules_to_not_convert and modules_dtype_dict keys. quantization_device (`torch.device`, *optional*, defaults to `None`): Used to set which device will be used for the quantization calculation on model load. return_device (`torch.device`, *optional*, defaults to `None`): @@ -656,6 +685,7 @@ class SDNQConfig(QuantizationConfigMixin): use_quantized_matmul_conv: bool = False, dequantize_fp32: bool = False, non_blocking: bool = False, + add_skip_keys: bool = True, quantization_device: Optional[torch.device] = None, return_device: Optional[torch.device] = None, modules_to_not_convert: Optional[List[str]] = None, @@ -672,6 +702,7 @@ class SDNQConfig(QuantizationConfigMixin): self.use_quantized_matmul_conv = use_quantized_matmul_conv self.dequantize_fp32 = dequantize_fp32 self.non_blocking = non_blocking + self.add_skip_keys = add_skip_keys self.quantization_device = quantization_device self.return_device = return_device self.modules_to_not_convert = modules_to_not_convert From 25303bb182af9162330ffcc319e5d4805079ff27 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 01:16:25 +0300 Subject: [PATCH 177/230] cleanup --- modules/sdnq/quantizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 4d7fdc3e2..190ff096f 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -321,7 +321,7 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model -def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]]): +def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None): if getattr(model, "_keep_in_fp32_modules", None) is not None: modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: From 9c16e2234a83dd68b0b97fccb9afe345d59b878f Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 01:18:12 +0300 Subject: [PATCH 178/230] cleanup --- modules/sdnq/quantizer.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 190ff096f..50d4b49f3 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -322,6 +322,10 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None): + if modules_to_not_convert is None: + modules_to_not_convert = [] + if modules_dtype_dict is None: + modules_dtype_dict = {} if getattr(model, "_keep_in_fp32_modules", None) is not None: modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: @@ -356,11 +360,6 @@ def sdnq_post_load_quant( modules_dtype_dict: Dict[str, List[str]] = None, op=None, ): - if modules_to_not_convert is None: - modules_to_not_convert = [] - if modules_dtype_dict is None: - modules_dtype_dict = {} - if add_skip_keys: model, modules_to_not_convert, modules_dtype_dict = add_module_skip_keys(model, modules_to_not_convert, modules_dtype_dict) From 35277a79d37b5c58a0b67eaecafe463dac368b42 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Wed, 8 Oct 2025 01:21:11 +0300 Subject: [PATCH 179/230] cleanup x3 --- modules/sdnq/quantizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 50d4b49f3..a2922ec80 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -543,7 +543,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): keep_in_fp32_modules: List[str] = None, **kwargs, # pylint: disable=unused-argument ): - self.quantization_config.add_skip_keys: + if self.quantization_config.add_skip_keys: if keep_in_fp32_modules is not None: self.modules_to_not_convert.extend(keep_in_fp32_modules) model, self.modules_to_not_convert, self.quantization_config.modules_dtype_dict = add_module_skip_keys( From 6907fcd320a97f4ca852a6a2a1cf892272bf06fb Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 8 Oct 2025 13:47:34 -0400 Subject: [PATCH 180/230] speedup prequant model load Signed-off-by: Vladimir Mandic --- modules/sd_models.py | 3 ++- modules/sdnq/loader.py | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/sd_models.py b/modules/sd_models.py index c8f78c1ae..008125edb 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -549,11 +549,12 @@ def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): continue module_name = f.replace('_quantization_config.json', '') quantization_config = shared.readfile(os.path.join(checkpoint_info.path, f), silent=True) - shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" prequant=sdnq') + shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" direct={shared.opts.diffusers_to_gpu} prequant=sdnq') module_path = os.path.join(checkpoint_info.path, module_name) modules[module_name] = sdnq.load_sdnq_model( model_path=module_path, quantization_config=quantization_config, + device=devices.device if shared.opts.diffusers_to_gpu else devices.cpu, ) modules[module_name] = modules[module_name].to(device=devices.device) sd_model = pipeline.from_pretrained( diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 967254070..75e45db97 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -1,9 +1,7 @@ import os import json import torch -from safetensors import safe_open from diffusers.models.modeling_utils import ModelMixin - from .common import use_tensorwise_fp8_matmul, use_contiguous_mm from .quantizer import SDNQConfig, sdnq_post_load_quant from .dequantizer import dequantize_symmetric, re_quantize_int8, re_quantize_fp8 @@ -29,8 +27,10 @@ def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "1 module.quantization_config.to_json_file(os.path.join(model_path, f"{module_name}_quantization_config.json")) -def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: - with torch.device("cpu"): +def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = 'cpu', dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: + from accelerate import init_empty_weights + from safetensors.torch import safe_open + with init_empty_weights(): if quantization_config is None: try: with open(os.path.join(model_path, "quantization_config.json"), "r", encoding="utf-8") as f: @@ -64,7 +64,8 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model = model_cls.from_config(config) elif hasattr(model_cls, "_from_config"): config = transformers.PretrainedConfig.from_dict(model_config) - model = model_cls._from_config(config) # pylint: disable=protected-access + # model = model_cls._from_config(config) # pylint: disable=protected-access + model = model_cls(config) else: raise ValueError(f"Dont know how to load model for {model_cls}") model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config) @@ -78,12 +79,12 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st fn = os.path.join(model_path, "model.safetensors") else: raise ValueError(f"Cannot find safetensors file in {model_path}, please provide file_name argument") - with safe_open(fn, framework="pt") as f: + with safe_open(fn, framework="pt", device=str(device)) as f: for k in f.keys(): state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) del state_dict - if dtype is not None or dequantize_fp32 is not None or use_quantized_matmul is not None: + if (dtype is not None) or (dequantize_fp32 is not None) or (use_quantized_matmul is not None): model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) return model From 3c16b58e0df107a531226fa8d47aa73fca4066c4 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Wed, 8 Oct 2025 23:02:47 +0300 Subject: [PATCH 181/230] Qwen prunning models cover images --- html/reference.json | 8 ++++---- models/Reference/Qwen-Image-12B.jpg | Bin 0 -> 71565 bytes models/Reference/Qwen-Image-13B.jpg | Bin 0 -> 176594 bytes models/Reference/Qwen-Image-Edit-13B.jpg | Bin 0 -> 73538 bytes models/Reference/Qwen-Image-Edit-2509-14B.jpg | Bin 0 -> 90410 bytes 5 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 models/Reference/Qwen-Image-12B.jpg create mode 100644 models/Reference/Qwen-Image-13B.jpg create mode 100644 models/Reference/Qwen-Image-Edit-13B.jpg create mode 100644 models/Reference/Qwen-Image-Edit-2509-14B.jpg diff --git a/html/reference.json b/html/reference.json index 45f2bd2d5..2408364cc 100644 --- a/html/reference.json +++ b/html/reference.json @@ -237,7 +237,7 @@ "Qwen-Image Pruning-13B": { "path": "OPPOer/Qwen-Image-Pruning", "subfolder": "Qwen-Image-13B", - "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "preview": "Qwen-Image-13B.jpg", "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" @@ -245,7 +245,7 @@ "Qwen-Image Pruning-12B": { "path": "OPPOer/Qwen-Image-Pruning", "subfolder": "Qwen-Image-12B-40steps", - "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "preview": "Qwen-Image-12B.jpg", "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" @@ -253,7 +253,7 @@ "Qwen-Image-Edit Pruning-13B": { "path": "OPPOer/Qwen-Image-Edit-Pruning", "subfolder": "Qwen-Image-Edit-13B", - "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "preview": "Qwen-Image-Edit-13B.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" @@ -261,7 +261,7 @@ "Qwen-Image-Edit-2509 Pruning-14B": { "path": "OPPOer/Qwen-Image-Edit-Pruning", "subfolder": "Qwen-Image-Edit-2509-14B", - "preview": "vladmandic--Qwen-Lightning-Edit.jpg", + "preview": "Qwen-Image-Edit-2509-14B.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" diff --git a/models/Reference/Qwen-Image-12B.jpg b/models/Reference/Qwen-Image-12B.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f78f4b2939e05b4cc4a1fbeb89d88e09e2f58401 GIT binary patch literal 71565 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 QU|eLiC*r~9M2&y{*$!34egFUf literal 0 HcmV?d00001 diff --git a/models/Reference/Qwen-Image-13B.jpg b/models/Reference/Qwen-Image-13B.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9198264fd21c10298530719a8442047a4226774b GIT binary patch literal 176594 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 z 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

    }*G;<&7?hYK3Gc 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 literal 63076 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 Urr?pc$j3{MCH8U|Ay0$<*|hgJ7XSbN diff --git a/models/Reference/v1-5-pruned-fp16-emaonly.jpg b/models/Reference/v1-5-pruned-fp16-emaonly.jpg index 78a9c7e11ea453013eaea0c30454e352111157c4..8dc8df64b8f04524a0fe7601040a7429f82aecd4 100644 GIT binary patch literal 84740 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%0AG};~E{0t4kX#4U_WuBilF>5%0D9RJms(1C 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

    !i2ne@{{RX>sA)q`w3ZI`2)NXM%*=3o%4iVk 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�eA*P8#5fai&he#M>{rHVv}acd>ggYfSfKv^ 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 gB~6> Date: Thu, 9 Oct 2025 09:25:49 -0400 Subject: [PATCH 182/230] fix guidance metadata Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/pag/__init__.py | 4 ++-- modules/processing_info.py | 3 ++- modules/ui_control.py | 4 ++-- modules/ui_img2img.py | 4 ++-- modules/ui_txt2img.py | 4 ++-- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 036717542..c8c9d9745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-07 +## Update for 2025-10-09 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -125,6 +125,7 @@ - fix checks in init/mask image decode - fix hf token with extra chars - image viewer refocus on gallery after returning from full screen mode + - fix attention guidance metadata save/restore ## Update for 2025-09-15 diff --git a/modules/pag/__init__.py b/modules/pag/__init__.py index e67f5b086..4d92f689b 100644 --- a/modules/pag/__init__.py +++ b/modules/pag/__init__.py @@ -42,8 +42,8 @@ def apply(p: processing.StableDiffusionProcessing): # pylint: disable=arguments- pag_applied_layers_index = pag_applied_layers.split() if len(pag_applied_layers) > 0 else [] pag_applied_layers_index = [p.strip() for p in pag_applied_layers_index] p.task_args['pag_applied_layers_index'] = pag_applied_layers_index if len(pag_applied_layers_index) > 0 else ['m0'] # Available layers: d[0-5], m[0], u[0-8] - p.extra_generation_params["PAG scale"] = p.pag_scale - p.extra_generation_params["PAG adaptive"] = p.pag_adaptive + p.extra_generation_params["CFG true"] = p.pag_scale + p.extra_generation_params["CFG adaptive"] = p.pag_adaptive # shared.log.debug(f'{c}: args={p.task_args}') diff --git a/modules/processing_info.py b/modules/processing_info.py index e1d4d6379..cb1050349 100644 --- a/modules/processing_info.py +++ b/modules/processing_info.py @@ -50,7 +50,8 @@ def create_infotext(p: StableDiffusionProcessing, all_prompts=None, all_seeds=No "CFG scale": p.cfg_scale if p.cfg_scale > 1.0 else None, "CFG rescale": p.diffusers_guidance_rescale if p.diffusers_guidance_rescale > 0 else None, "CFG end": p.cfg_end if p.cfg_end < 1.0 else None, - "CFG true": p.pag_scale if p.pag_scale > 1 else None, + "CFG true": p.pag_scale if p.pag_scale > 0 else None, + "CFG adaptive": p.pag_adaptive if p.pag_adaptive != 0.5 else None, "Clip skip": p.clip_skip if p.clip_skip > 1 else None, "Batch": f'{p.n_iter}x{p.batch_size}' if p.n_iter > 1 or p.batch_size > 1 else None, "Refiner prompt": p.refiner_prompt if len(p.refiner_prompt) > 0 else None, diff --git a/modules/ui_control.py b/modules/ui_control.py index 5ac075d61..af5de9882 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -400,8 +400,8 @@ def create_ui(_blocks: gr.Blocks=None): (refiner_prompt, "Refiner prompt"), (refiner_negative, "Refiner negative"), # pag - (pag_scale, "PAG scale"), - (pag_adaptive, "PAG adaptive"), + (pag_scale, "CFG true"), + (pag_adaptive, "CFG adaptive"), # hidden (seed_resize_from_w, "Seed resize from-1"), (seed_resize_from_h, "Seed resize from-2"), diff --git a/modules/ui_img2img.py b/modules/ui_img2img.py index cf1324484..a22e66901 100644 --- a/modules/ui_img2img.py +++ b/modules/ui_img2img.py @@ -298,8 +298,8 @@ def create_ui(): (refiner_prompt, "refiner prompt"), (refiner_negative, "Refiner negative"), # pag - (pag_scale, "PAG scale"), - (pag_adaptive, "PAG adaptive"), + (pag_scale, "CFG true"), + (pag_adaptive, "CFG adaptive"), # inpaint (mask_blur, "Mask blur"), (mask_alpha, "Mask alpha"), diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index 6eccbdd82..f3e108666 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -150,8 +150,8 @@ def create_ui(): (refiner_prompt, "refiner prompt"), (refiner_negative, "Refiner negative"), # pag - (pag_scale, "PAG scale"), - (pag_adaptive, "PAG adaptive"), + (pag_scale, "CFG true"), + (pag_adaptive, "CFG adaptive"), # hidden (seed_resize_from_w, "Seed resize from-1"), (seed_resize_from_h, "Seed resize from-2"), From 620ad5acef2ffbabb06b46c0c95ed0b377b7c1d8 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 9 Oct 2025 09:38:07 -0400 Subject: [PATCH 183/230] update oppoer models Signed-off-by: Vladimir Mandic --- html/reference.json | 26 ++++++------------ ... OPPOer--Qwen-Image-Edit-2509-Pruning.jpg} | Bin ...pg => OPPOer--Qwen-Image-Edit-Pruning.jpg} | Bin ...12B.jpg => OPPOer--Qwen-Image-Pruning.jpg} | Bin 4 files changed, 9 insertions(+), 17 deletions(-) rename models/Reference/{Qwen-Image-Edit-2509-14B.jpg => OPPOer--Qwen-Image-Edit-2509-Pruning.jpg} (100%) rename models/Reference/{Qwen-Image-Edit-13B.jpg => OPPOer--Qwen-Image-Edit-Pruning.jpg} (100%) rename models/Reference/{Qwen-Image-12B.jpg => OPPOer--Qwen-Image-Pruning.jpg} (100%) diff --git a/html/reference.json b/html/reference.json index 2408364cc..8202631a2 100644 --- a/html/reference.json +++ b/html/reference.json @@ -234,34 +234,26 @@ "size": 56.1, "date": "2025 August" }, - "Qwen-Image Pruning-13B": { - "path": "OPPOer/Qwen-Image-Pruning", - "subfolder": "Qwen-Image-13B", - "preview": "Qwen-Image-13B.jpg", - "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", - "skip": true, - "date": "2025 Ocotober" - }, "Qwen-Image Pruning-12B": { "path": "OPPOer/Qwen-Image-Pruning", - "subfolder": "Qwen-Image-12B-40steps", - "preview": "Qwen-Image-12B.jpg", - "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", + "subfolder": "Qwen-Image-12B-8steps", + "preview": "OPPOer--Qwen-Image-Pruning.jpg", + "desc": "This open-source project is based on Qwen-Image and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 12B parameters.", "skip": true, "date": "2025 Ocotober" }, "Qwen-Image-Edit Pruning-13B": { "path": "OPPOer/Qwen-Image-Edit-Pruning", - "subfolder": "Qwen-Image-Edit-13B", - "preview": "Qwen-Image-Edit-13B.jpg", + "subfolder": "Qwen-Image-Edit-13B-4steps", + "preview": "OPPOer--Qwen-Image-Edit-Pruning.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" }, - "Qwen-Image-Edit-2509 Pruning-14B": { - "path": "OPPOer/Qwen-Image-Edit-Pruning", - "subfolder": "Qwen-Image-Edit-2509-14B", - "preview": "Qwen-Image-Edit-2509-14B.jpg", + "Qwen-Image-Edit-2509 Pruning-13B": { + "path": "OPPOer/Qwen-Image-Edit-2509-Pruning", + "subfolder": "Qwen-Image-Edit-2509-13B-4steps", + "preview": "OPPOer--Qwen-Image-Edit-2509-Pruning.jpg", "desc": "This open-source project is based on Qwen-Image-Edit and has attempted model pruning, removing 20 layers while retaining the weights of 40 layers, resulting in a model size of 13.6B parameters.", "skip": true, "date": "2025 Ocotober" diff --git a/models/Reference/Qwen-Image-Edit-2509-14B.jpg b/models/Reference/OPPOer--Qwen-Image-Edit-2509-Pruning.jpg similarity index 100% rename from models/Reference/Qwen-Image-Edit-2509-14B.jpg rename to models/Reference/OPPOer--Qwen-Image-Edit-2509-Pruning.jpg diff --git a/models/Reference/Qwen-Image-Edit-13B.jpg b/models/Reference/OPPOer--Qwen-Image-Edit-Pruning.jpg similarity index 100% rename from models/Reference/Qwen-Image-Edit-13B.jpg rename to models/Reference/OPPOer--Qwen-Image-Edit-Pruning.jpg diff --git a/models/Reference/Qwen-Image-12B.jpg b/models/Reference/OPPOer--Qwen-Image-Pruning.jpg similarity index 100% rename from models/Reference/Qwen-Image-12B.jpg rename to models/Reference/OPPOer--Qwen-Image-Pruning.jpg From 70defe6d06c70bee3925ab5491d7307206e5e979 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 9 Oct 2025 11:29:36 -0400 Subject: [PATCH 184/230] handle load shards Signed-off-by: Vladimir Mandic --- installer.py | 6 +++--- modules/loader.py | 7 ++++++- modules/sd_models.py | 46 ++++++++++++++++++++++++++++++++++++------ modules/sdnq/loader.py | 18 ++++++++--------- modules/ui_models.py | 19 +++++++++++++---- 5 files changed, 72 insertions(+), 24 deletions(-) diff --git a/installer.py b/installer.py index 95a007198..9129d2620 100644 --- a/installer.py +++ b/installer.py @@ -608,9 +608,9 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = '2b7deffe361b7b0e1d2665a1f9f0bd4daea4927c' # diffusers commit hash - if args.use_rocm or args.use_zluda or args.use_directml: - sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now + sha = 'a9df12ab451be65060f6f69e201e3a6cb2ee15e8' # diffusers commit hash + # if args.use_rocm or args.use_zluda or args.use_directml: + # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' diff --git a/modules/loader.py b/modules/loader.py index 7ee969962..a224c05c7 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -51,10 +51,15 @@ if torch.__version__.startswith('2.5.0'): errors.log.warning(f'Disabling cuDNN for SDP on torch={torch.__version__}') torch.backends.cuda.enable_cudnn_sdp(False) try: - import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + import intel_extension_for_pytorch as ipex # pylint: disable=import-error,unused-import errors.log.debug(f'Load IPEX=={ipex.__version__}') except Exception: pass +try: + import torch.distributed.distributed_c10d as _c10d # pylint: disable=unused-import,ungrouped-imports +except Exception: + errors.log.warning('Loader: torch is not built with distributed support') + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) warnings.filterwarnings(action="ignore", category=UserWarning, module="torchvision") diff --git a/modules/sd_models.py b/modules/sd_models.py index 008125edb..b0606dd76 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -551,12 +551,16 @@ def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): quantization_config = shared.readfile(os.path.join(checkpoint_info.path, f), silent=True) shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" direct={shared.opts.diffusers_to_gpu} prequant=sdnq') module_path = os.path.join(checkpoint_info.path, module_name) - modules[module_name] = sdnq.load_sdnq_model( - model_path=module_path, - quantization_config=quantization_config, - device=devices.device if shared.opts.diffusers_to_gpu else devices.cpu, - ) - modules[module_name] = modules[module_name].to(device=devices.device) + try: + modules[module_name] = sdnq.load_sdnq_model( + model_path=module_path, + quantization_config=quantization_config, + device=devices.device if shared.opts.diffusers_to_gpu else devices.cpu, + ) + modules[module_name] = modules[module_name].to(device=devices.device) + except Exception as e: + shared.log.error(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" {e}') + errors.display(e, 'Load') sd_model = pipeline.from_pretrained( checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, @@ -1265,3 +1269,33 @@ def hf_auth_check(checkpoint_info, force:bool=False): except Exception as e: shared.log.error(f'Load model: repo="{repo_id}" login={login} {e}') return False + + +def save_model(name: str, path: str = None, shard: str = None, overwrite: bool = False): + if (name is None) or len(name.strip()) == 0: + shared.log.error('Save model: invalid model name') + return 'Invalid model name' + if not shared.sd_loaded: + shared.log.error('Save model: model not loaded') + return 'Model not loaded' + from modules.sdnq import save_sdnq_model + if path is None: + path = shared.opts.diffusers_dir + model_name = os.path.join(path.strip(), name.strip()) + if os.path.exists(model_name) and not overwrite: + shared.log.error(f'Save model: path="{model_name}" exists') + return f'Path exists: {model_name}' + try: + t0 = time.time() + save_sdnq_model( + model=shared.sd_model, + model_path=model_name, + max_shard_size=shard, + ) + t1 = time.time() + shared.log.info(f'Save model: path="{model_name}" cls={shared.sd_model.__class__.__name__} time={t1 - t0:.2f}') + return f'Saved: {model_name}' + except Exception as e: + shared.log.error(f'Save model: path="{model_name}" {e}') + errors.display(e, 'Save model') + return f'Error: {e}' diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 75e45db97..8ed2761ef 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -64,24 +64,22 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model = model_cls.from_config(config) elif hasattr(model_cls, "_from_config"): config = transformers.PretrainedConfig.from_dict(model_config) - # model = model_cls._from_config(config) # pylint: disable=protected-access model = model_cls(config) else: raise ValueError(f"Dont know how to load model for {model_cls}") model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config) state_dict = {} + files = [] if file_name: - fn = os.path.join(model_path, file_name) - elif os.path.exists(os.path.join(model_path, "diffusion_pytorch_model.safetensors")): - fn = os.path.join(model_path, "diffusion_pytorch_model.safetensors") - elif os.path.exists(os.path.join(model_path, "model.safetensors")): - fn = os.path.join(model_path, "model.safetensors") + files.append(os.path.join(model_path, file_name)) else: - raise ValueError(f"Cannot find safetensors file in {model_path}, please provide file_name argument") - with safe_open(fn, framework="pt", device=str(device)) as f: - for k in f.keys(): - state_dict[k] = f.get_tensor(k) + all_files = os.listdir(model_path) + files = sorted([os.path.join(model_path, f) for f in all_files if f.endswith(".safetensors")]) + for fn in files: + with safe_open(fn, framework="pt", device=str(device)) as f: + for k in f.keys(): + state_dict[k] = f.get_tensor(k) model.load_state_dict(state_dict, assign=True) del state_dict if (dtype is not None) or (dequantize_fp32 is not None) or (use_quantized_matmul is not None): diff --git a/modules/ui_models.py b/modules/ui_models.py index 34563e891..89e5697ab 100644 --- a/modules/ui_models.py +++ b/modules/ui_models.py @@ -65,12 +65,23 @@ def create_ui(): return [html, meta] with gr.Row(): - gr.HTML('

    Analyze currently loaded model

    ') - with gr.Row(): - model_analyze = gr.Button(value="Analyze", variant='primary') + model_analyze = gr.Button(value="Analyze model", variant='primary') with gr.Row(): model_desc = gr.HTML(value="", elem_id="model_desc") - with gr.Row(): + with gr.Accordion(label="Save model", open=False): + with gr.Row(): + save_name = gr.Textbox(label="Model name", placeholder="Model name to save as") + with gr.Row(): + save_path = gr.Textbox(label="Model base path", placeholder="Path to save model to", value=opts.diffusers_dir) + with gr.Row(): + save_shard = gr.Textbox(label="Max shard size", placeholder="Maximum shard size", value="10GB") + save_overwrite = gr.Checkbox(label="Overwrite existing", value=False) + with gr.Row(): + save_result = gr.HTML(value="", elem_id="model_save_outcome") + with gr.Row(): + model_save = gr.Button(value="Save model", variant='primary') + model_save.click(fn=sd_models.save_model, inputs=[save_name, save_path, save_shard, save_overwrite], outputs=[save_result]) + with gr.Accordion(label="Metadata", open=False): model_meta = gr.JSON(label="Metadata", value={}, elem_id="model_meta") model_analyze.click(fn=analyze, inputs=[], outputs=[model_desc, model_meta]) From ee3e0aa978ad0ad3008824d6e678bc7b88504bda Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 9 Oct 2025 12:22:55 -0400 Subject: [PATCH 185/230] add epoch to namegens and disable spellchecks Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/images_namegen.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8c9d9745..214136cfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ - separate guidance and detail sections - networks ability to filter lora by base model version - add interrogate button to input images + - disable spellchecks on all text inputs - **SDNQ** - add `SVDQuant` quantization method support - make sdnq scales compatible with balanced offload @@ -93,6 +94,7 @@ - **xyz-grid** add guidance section - **preview** implement configurable layers for WAN, Qwen, HV - update swagger `/docs` endpoint style + - add `[epoch]` to filename template - **Video** - use shared **T5** text encoder for video models when possible - use shared **LLama** text encoder for video models when possible diff --git a/modules/images_namegen.py b/modules/images_namegen.py index c8971eff2..b50d2ae97 100644 --- a/modules/images_namegen.py +++ b/modules/images_namegen.py @@ -1,5 +1,6 @@ import re import os +import time import uuid import string import hashlib @@ -33,6 +34,7 @@ class FilenameGenerator: 'hash': lambda self: self.image_hash(), 'image_hash': lambda self: self.image_hash(), 'timestamp': lambda self: getattr(self.p, "job_timestamp", shared.state.job_timestamp), + 'epoch': lambda self: int(time.time()), 'job_timestamp': lambda self: getattr(self.p, "job_timestamp", shared.state.job_timestamp), 'model': lambda self: shared.sd_model.sd_checkpoint_info.title if shared.sd_loaded and getattr(shared.sd_model, 'sd_checkpoint_info', None) is not None else '', From 04b5a1a9e770c5cbcf0a11c51aa103e610a29522 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 9 Oct 2025 12:23:07 -0400 Subject: [PATCH 186/230] update modernui Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 39277a468..8451ed225 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 39277a4688473e1e5fdb8a6173c8ded28c0439e1 +Subproject commit 8451ed225e63e25db8627b57958a9cba2103f1fe From e19fb2d8337b8e7fb4fce409c66ea9f6b7e18d60 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 19:34:48 +0300 Subject: [PATCH 187/230] SDNQ keep the quant configs inside the module subfolder, add dtype cast and don't send to GPU --- modules/sd_detect.py | 14 +++++++++++++- modules/sd_models.py | 15 ++++++++------- modules/sdnq/loader.py | 19 ++++++++++++++----- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 059b081a4..7d3e20c2e 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -138,7 +138,19 @@ def guess_by_diffusers(fn, current_guess): if pipeline is None: pipeline = cls if callable(pipeline): - is_quant = any(f for f in os.listdir(fn) if f.endswith('quantization_config.json')) + is_quant = False + for folder in os.listdir(fn): + folder = os.path.join(fn, folder) + if is_quant: + break + if folder.endswith('quantization_config.json'): + is_quant = True + break + elif os.path.isdir(folder): + for f in os.listdir(folder): + if f.endswith('quantization_config.json'): + is_quant = True + break pipelines = shared_items.get_pipelines() for k, v in pipelines.items(): if v is not None and v.__name__ == pipeline.__name__: diff --git a/modules/sd_models.py b/modules/sd_models.py index b0606dd76..4400a0aa6 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -544,20 +544,20 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): from modules import sdnq modules = {} - for f in os.listdir(checkpoint_info.path): - if not f.endswith('quantization_config.json'): + for module_name in os.listdir(checkpoint_info.path): + quantization_config_path = os.path.join(checkpoint_info.path, module_name, 'quantization_config.json') + if not os.path.exists(quantization_config_path): continue - module_name = f.replace('_quantization_config.json', '') - quantization_config = shared.readfile(os.path.join(checkpoint_info.path, f), silent=True) + model_path = os.path.join(checkpoint_info.path, module_name) + quantization_config = shared.readfile(quantization_config_path, silent=True) shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" direct={shared.opts.diffusers_to_gpu} prequant=sdnq') - module_path = os.path.join(checkpoint_info.path, module_name) try: modules[module_name] = sdnq.load_sdnq_model( - model_path=module_path, + model_path=model_path, quantization_config=quantization_config, device=devices.device if shared.opts.diffusers_to_gpu else devices.cpu, + dtype=devices.dtype, ) - modules[module_name] = modules[module_name].to(device=devices.device) except Exception as e: shared.log.error(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" {e}') errors.display(e, 'Load') @@ -1291,6 +1291,7 @@ def save_model(name: str, path: str = None, shard: str = None, overwrite: bool = model=shared.sd_model, model_path=model_name, max_shard_size=shard, + is_pipeline=True, ) t1 = time.time() shared.log.info(f'Save model: path="{model_name}" cls={shared.sd_model.__class__.__name__} time={t1 - t0:.2f}') diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 8ed2761ef..242f1e83b 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -15,16 +15,25 @@ def get_module_names(model: ModelMixin) -> list: return modules_names -def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", sdnq_config: SDNQConfig = None) -> None: +def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", is_pipeline: bool = False, sdnq_config: SDNQConfig = None) -> None: model.save_pretrained(model_path, max_shard_size=max_shard_size) # actual save if sdnq_config is not None: # if provided, save global config sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) - for module_name in get_module_names(model): # save per-module config if available - module = getattr(model, module_name, None) - if (module is not None) and hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): - module.quantization_config.to_json_file(os.path.join(model_path, f"{module_name}_quantization_config.json")) + if is_pipeline: + for module_name in get_module_names(model): # save per-module config if available + module = getattr(model, module_name, None) + if (module is not None) and hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): + module.quantization_config.to_json_file(os.path.join(model_path, module_name, "quantization_config.json")) + elif sdnq_config is None: + quantization_config = None + if hasattr(model, "quantization_config"): + quantization_config = model.quantization_config + elif hasattr(model, "config") and hasattr(model.config, "quantization_config"): + quantization_config = model.config.quantization_config + if quantization_config is not None: + quantization_config.to_json_file(os.path.join(model_path, "quantization_config.json")) def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = 'cpu', dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: From a9de8ef1528223fe2b81fe0257e83efd147472e0 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 19:58:57 +0300 Subject: [PATCH 188/230] cleanup --- modules/sdnq/loader.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 242f1e83b..e50a83977 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -18,22 +18,25 @@ def get_module_names(model: ModelMixin) -> list: def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", is_pipeline: bool = False, sdnq_config: SDNQConfig = None) -> None: model.save_pretrained(model_path, max_shard_size=max_shard_size) # actual save + quantization_config_path = os.path.join(model_path, "quantization_config.json") if sdnq_config is not None: # if provided, save global config - sdnq_config.to_json_file(os.path.join(model_path, "quantization_config.json")) + sdnq_config.to_json_file(quantization_config_path) if is_pipeline: for module_name in get_module_names(model): # save per-module config if available module = getattr(model, module_name, None) - if (module is not None) and hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): - module.quantization_config.to_json_file(os.path.join(model_path, module_name, "quantization_config.json")) + if module is None: + continue + module_quantization_config_path = os.path.join(model_path, module_name, "quantization_config.json") + if hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): + module.quantization_config.to_json_file(module_quantization_config_path) + elif hasattr(module, "config"), hasattr(module.config, "quantization_config") and isinstance(module.config.quantization_config, SDNQConfig): + module.config.quantization_config.to_json_file(module_quantization_config_path) elif sdnq_config is None: - quantization_config = None - if hasattr(model, "quantization_config"): - quantization_config = model.quantization_config - elif hasattr(model, "config") and hasattr(model.config, "quantization_config"): - quantization_config = model.config.quantization_config - if quantization_config is not None: - quantization_config.to_json_file(os.path.join(model_path, "quantization_config.json")) + if hasattr(model, "quantization_config") and isinstance(model.quantization_config, SDNQConfig): + model.quantization_config.to_json_file(quantization_config_path) + elif hasattr(model, "config") and hasattr(model.config, "quantization_config") and isinstance(model.config.quantization_config, SDNQConfig): + model.config.quantization_config.to_json_file(quantization_config_path) def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = 'cpu', dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: From 612df3abbbca036d4a506afca1156ceef0e78331 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 20:09:34 +0300 Subject: [PATCH 189/230] cleanup --- modules/sdnq/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index e50a83977..de94a2a16 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -30,7 +30,7 @@ def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "1 module_quantization_config_path = os.path.join(model_path, module_name, "quantization_config.json") if hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): module.quantization_config.to_json_file(module_quantization_config_path) - elif hasattr(module, "config"), hasattr(module.config, "quantization_config") and isinstance(module.config.quantization_config, SDNQConfig): + elif hasattr(module, "config") and hasattr(module.config, "quantization_config") and isinstance(module.config.quantization_config, SDNQConfig): module.config.quantization_config.to_json_file(module_quantization_config_path) elif sdnq_config is None: if hasattr(model, "quantization_config") and isinstance(model.quantization_config, SDNQConfig): From 624e525fd192d1c8c8e327677026cdd453d30796 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 20:30:23 +0300 Subject: [PATCH 190/230] Fix VAE config not being read correctly with SDNQ pre-quants --- modules/sd_detect.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 7d3e20c2e..9996537c1 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -214,6 +214,7 @@ def detect_pipeline(f: str, op: str = 'model'): def get_load_config(model_file, model_type, config_type='yaml'): + model_type = model_type.removesuffix(' SDNQ') if config_type == 'yaml': yaml = os.path.splitext(model_file)[0] + '.yaml' if os.path.exists(yaml): From 6995d8c3c6ad140775d75e3a9ff55474034d4abb Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 22:42:20 +0300 Subject: [PATCH 191/230] SDNQ fix T5 loading --- modules/sdnq/loader.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index de94a2a16..a66e767a5 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -42,6 +42,7 @@ def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "1 def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = 'cpu', dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: from accelerate import init_empty_weights from safetensors.torch import safe_open + with init_empty_weights(): if quantization_config is None: try: @@ -49,12 +50,14 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st quantization_config = json.load(f) except Exception: quantization_config = {} + if model_config is None: try: with open(os.path.join(model_path, 'config.json'), "r", encoding="utf-8") as f: model_config = json.load(f) except Exception: model_config = {} + if model_cls is None: import transformers import diffusers @@ -65,12 +68,14 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model_cls = getattr(diffusers, class_name, None) or getattr(transformers, class_name, None) if model_cls is None: raise ValueError(f"Cannot determine model class for {model_path}, please provide model_cls argument") + quantization_config.pop("is_integer", None) quantization_config.pop("quant_method", None) quantization_config.pop("quantization_device", None) quantization_config.pop("return_device", None) quantization_config.pop("non_blocking", None) quantization_config.pop("add_skip_keys", None) + if hasattr(model_cls, "load_config"): config = model_cls.load_config(model_path) model = model_cls.from_config(config) @@ -79,6 +84,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st model = model_cls(config) else: raise ValueError(f"Dont know how to load model for {model_cls}") + model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config) state_dict = {} @@ -88,12 +94,18 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st else: all_files = os.listdir(model_path) files = sorted([os.path.join(model_path, f) for f in all_files if f.endswith(".safetensors")]) + for fn in files: with safe_open(fn, framework="pt", device=str(device)) as f: for k in f.keys(): state_dict[k] = f.get_tensor(k) + + if model.__class__.__name__ in {"T5EncoderModel", "UMT5EncoderModel"}: + state_dict["encoder.embed_tokens.weight"] = state_dict["shared.weight"] + model.load_state_dict(state_dict, assign=True) del state_dict + if (dtype is not None) or (dequantize_fp32 is not None) or (use_quantized_matmul is not None): model = apply_options_to_model(model, dtype=dtype, dequantize_fp32=dequantize_fp32, use_quantized_matmul=use_quantized_matmul) return model From 2a3deaa06434f44aa506fa20c06aead6a8f152a0 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 9 Oct 2025 22:46:27 +0300 Subject: [PATCH 192/230] Check T5 keys before override --- modules/sdnq/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index a66e767a5..375a336b6 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -100,7 +100,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st for k in f.keys(): state_dict[k] = f.get_tensor(k) - if model.__class__.__name__ in {"T5EncoderModel", "UMT5EncoderModel"}: + if model.__class__.__name__ in {"T5EncoderModel", "UMT5EncoderModel"} and "encoder.embed_tokens.weight" not in state_dict.keys(): state_dict["encoder.embed_tokens.weight"] = state_dict["shared.weight"] model.load_state_dict(state_dict, assign=True) From 5db54ffb55d2a4f909dae7ab9d5ea8b18aedc45b Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 9 Oct 2025 16:11:47 -0400 Subject: [PATCH 193/230] set unique guidance labels Signed-off-by: Vladimir Mandic --- extensions-builtin/sdnext-modernui | 2 +- modules/ui_guidance.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 8451ed225..81d8682e9 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 8451ed225e63e25db8627b57958a9cba2103f1fe +Subproject commit 81d8682e99ce1b1543e3b1d079015e1caca285db diff --git a/modules/ui_guidance.py b/modules/ui_guidance.py index ae0506771..a6ea46391 100644 --- a/modules/ui_guidance.py +++ b/modules/ui_guidance.py @@ -15,11 +15,11 @@ def create_guidance_inputs(tab): guidance_btn = ui_components.ToolButton(value=ui_symbols.book, elem_id=f"{tab}_guider_docs") guidance_btn.click(fn=None, _js='getGuidanceDocs', inputs=[guidance_name], outputs=[]) with gr.Row(visible=shared.opts.model_modular_enable): - guidance_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_guidance_scale") - guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Guidance rescale', value=0.0, elem_id=f"{tab}_guidance_rescale") + guidance_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='_Guidance scale', value=6.0, elem_id=f"{tab}_guidance_scale") + guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='_Guidance rescale', value=0.0, elem_id=f"{tab}_guidance_rescale") with gr.Row(visible=shared.opts.model_modular_enable): - guidance_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Guidance start', value=0.0, elem_id=f"{tab}_guidance_start") - guidance_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance stop', value=1.0, elem_id=f"{tab}_guidance_stop") + guidance_start = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='_Guidance start', value=0.0, elem_id=f"{tab}_guidance_start") + guidance_stop = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='_Guidance stop', value=1.0, elem_id=f"{tab}_guidance_stop") guidance_args = [guidance_name, guidance_scale, guidance_rescale, guidance_start, guidance_stop] lsc_group = gr.Accordion(open=False, label='Layer skip guidance', elem_classes=["small-accordion"], visible=shared.opts.model_modular_enable) @@ -117,8 +117,8 @@ def create_guidance_inputs(tab): cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Guidance scale', value=6.0, elem_id=f"{tab}_cfg_scale") cfg_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label='Guidance end', value=1.0, elem_id=f"{tab}_cfg_end") with gr.Row(): + diffusers_guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Guidance rescale', value=0.0, elem_id=f"{tab}_image_cfg_rescale") image_cfg_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.1, label='Refine guidance', value=6.0, elem_id=f"{tab}_image_cfg_scale") - diffusers_guidance_rescale = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Rescale guidance', value=0.0, elem_id=f"{tab}_image_cfg_rescale") with gr.Row(): diffusers_pag_scale = gr.Slider(minimum=0.0, maximum=30.0, step=0.05, label='Attention guidance', value=0.0, elem_id=f"{tab}_pag_scale") diffusers_pag_adaptive = gr.Slider(minimum=0.0, maximum=1.0, step=0.05, label='Adaptive scaling', value=0.5, elem_id=f"{tab}_pag_adaptive") From 53672ab9ede508b4eae19e9f8678585877d15a67 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 10 Oct 2025 14:19:16 -0400 Subject: [PATCH 194/230] add model save notes Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 ++++++++- extensions-builtin/sdnext-modernui | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 214136cfe..16faa4108 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,14 @@ - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) *experimental*: updated version of E1 image editing model - **Features** - - [Qwen Image-Edit] multi-image editing + - **Model save**: ability to save currently loaded model as a new standalone model + why? SD.Next always prefers to start with full model and quantize on-demand during load + however, when you find your exact preferred quantization settings that work well for you, + saving such model as a new model allows for faster loads and reduced disk space usage + so its best of both worlds: you can experiment and test different quantizations and once you find the one that works for you, save it as a new model + saved models appear in network tab as normal models and can be loaded as such + available in *models* tab + - [Qwen Image-Edit](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) multi-image editing requires qwen-image-edit-2509 or its variant as multi-image edits are not available in original qwen-image in ui control tab: inputs -> separate init image add image for *input media* and *control media* diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 81d8682e9..638a07d70 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 81d8682e99ce1b1543e3b1d079015e1caca285db +Subproject commit 638a07d70998cc4ffc1fd9fe8a51de180c1c9e08 From c7aba8589b46c075df9438c004eed91db61b898e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 00:05:09 +0300 Subject: [PATCH 195/230] SDNQ fix Qwen loading --- modules/sdnq/layers/conv/conv_fp8.py | 3 ++- modules/sdnq/layers/conv/conv_fp8_tensorwise.py | 5 +++-- modules/sdnq/layers/conv/conv_int8.py | 5 +++-- modules/sdnq/layers/linear/linear_fp8.py | 3 ++- .../sdnq/layers/linear/linear_fp8_tensorwise.py | 7 ++++--- modules/sdnq/layers/linear/linear_int8.py | 5 +++-- modules/sdnq/loader.py | 15 ++++++++++++--- modules/sdnq/quantizer.py | 6 +++++- 8 files changed, 34 insertions(+), 15 deletions(-) diff --git a/modules/sdnq/layers/conv/conv_fp8.py b/modules/sdnq/layers/conv/conv_fp8.py index b07196ea7..bdaf27062 100644 --- a/modules/sdnq/layers/conv/conv_fp8.py +++ b/modules/sdnq/layers/conv/conv_fp8.py @@ -26,7 +26,8 @@ def conv_fp8_matmul( return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) if svd_up is not None: - svd_bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + input = input.flatten(0,-2) + svd_bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) input, input_scale = quantize_fp8_matmul_input(input) input, weight = check_mats(input, weight) diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index 1893ad8a5..2dc9fbda3 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -27,10 +27,11 @@ def conv_fp8_matmul_tensorwise( return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) if svd_up is not None: + input = input.flatten(0,-2) if bias is not None: - bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.addmm(bias, torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: - bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) input, weight = check_mats(input, weight) diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index 82bd51f95..3332537d1 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -30,10 +30,11 @@ def conv_int8_matmul( return_dtype = input.dtype input, mm_output_shape = process_conv_input(conv_type, input, reversed_padding_repeated_twice, padding_mode, result_shape, stride, padding, dilation) if svd_up is not None: + input = input.flatten(0,-2) if bias is not None: - bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.addmm(bias, torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: - bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) input, scale = quantize_int8_matmul_input(input, scale) if quantized_weight_shape is not None: diff --git a/modules/sdnq/layers/linear/linear_fp8.py b/modules/sdnq/layers/linear/linear_fp8.py index 0c8c26341..2ddd137c1 100644 --- a/modules/sdnq/layers/linear/linear_fp8.py +++ b/modules/sdnq/layers/linear/linear_fp8.py @@ -26,7 +26,8 @@ def fp8_matmul( return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) if svd_up is not None: - svd_bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + input = input.flatten(0,-2) + svd_bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) input, input_scale = quantize_fp8_matmul_input(input) input, weight = check_mats(input, weight) if bias is not None and bias.dtype != torch.bfloat16: diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index bd7a9b973..c7978ef0a 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -28,12 +28,13 @@ def fp8_matmul_tensorwise( ) -> torch.FloatTensor: return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) - dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) if svd_up is not None: + input.flatten(0,-2) if bias is not None: - bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.addmm(bias, torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: - bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) + dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) input, scale = quantize_fp8_matmul_input_tensorwise(input, scale) input, weight = check_mats(input, weight) if bias is not None: diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index ce8bcf788..6d7f6f2b8 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -34,10 +34,11 @@ def int8_matmul( return_dtype = input.dtype output_shape = (*input.shape[:-1], weight.shape[-1]) if svd_up is not None: + input = input.flatten(0,-2) if bias is not None: - bias = torch.addmm(bias, torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.addmm(bias, torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: - bias = torch.mm(torch.mm(input.flatten(0,-2).to(dtype=svd_down.dtype), svd_down), svd_up) + bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) input, scale = quantize_int8_matmul_input(input, scale) input, weight = check_mats(input, weight) if bias is not None: diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 375a336b6..04fc5e9a5 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -1,4 +1,5 @@ import os +import re import json import torch from diffusers.models.modeling_utils import ModelMixin @@ -80,15 +81,17 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st config = model_cls.load_config(model_path) model = model_cls.from_config(config) elif hasattr(model_cls, "_from_config"): - config = transformers.PretrainedConfig.from_dict(model_config) + config = transformers.AutoConfig.from_pretrained(model_path) model = model_cls(config) else: raise ValueError(f"Dont know how to load model for {model_cls}") model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config) + key_mapping = getattr(model, "_checkpoint_conversion_mapping", None) state_dict = {} files = [] + if file_name: files.append(os.path.join(model_path, file_name)) else: @@ -97,8 +100,14 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st for fn in files: with safe_open(fn, framework="pt", device=str(device)) as f: - for k in f.keys(): - state_dict[k] = f.get_tensor(k) + for key in f.keys(): + new_key = key + if key_mapping: + for pattern, replacement in key_mapping.items(): + new_key, n_replace = re.subn(pattern, replacement, new_key) + if n_replace > 0: + break + state_dict[new_key] = f.get_tensor(key) if model.__class__.__name__ in {"T5EncoderModel", "UMT5EncoderModel"} and "encoder.embed_tokens.weight" not in state_dict.keys(): state_dict["encoder.embed_tokens.weight"] = state_dict["shared.weight"] diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index a2922ec80..d39523e5b 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -268,7 +268,11 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si continue if len(modules_dtype_dict.keys()) > 0: for key, value in modules_dtype_dict.items(): - if param_name in value: + if ( + param_name in value + or any(param in split_param_name for param in value) + or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in value) + ): key = key.lower() if key in {"8bit", "8bits"}: if dtype_dict[weights_dtype]["num_bits"] != 8: From 1d2775103fc9611b7d2fbe49ed4716690cefb7eb Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 00:55:22 +0300 Subject: [PATCH 196/230] Fix Qwen VAE --- modules/processing_vae.py | 17 ++++++++++++----- modules/taesd/taehv.py | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/processing_vae.py b/modules/processing_vae.py index 933af425f..00ffbb450 100644 --- a/modules/processing_vae.py +++ b/modules/processing_vae.py @@ -117,8 +117,10 @@ def full_vae_decode(latents, model): scaling_factor = model.vae.config.get("scaling_factor", 1.0) shift_factor = model.vae.config.get("shift_factor", None) if latents_mean and latents_std: - latents_mean = (torch.tensor(latents_mean).view(1, -1, 1, 1).to(latents.device, latents.dtype)) - latents_std = (torch.tensor(latents_std).view(1, -1, 1, 1).to(latents.device, latents.dtype)) + broadcast_shape = [1 for _ in range(latents.ndim)] + broadcast_shape[1] = -1 + latents_mean = (torch.tensor(latents_mean).view(*broadcast_shape).to(latents.device, latents.dtype)) + latents_std = (torch.tensor(latents_std).view(*broadcast_shape).to(latents.device, latents.dtype)) latents = ((latents * latents_std) / scaling_factor) + latents_mean else: latents = latents / scaling_factor @@ -237,13 +239,15 @@ def vae_postprocess(tensor, model, output_type='np'): if isinstance(tensor, list) and len(tensor) > 0 and torch.is_tensor(tensor[0]): tensor = torch.stack(tensor) if torch.is_tensor(tensor): - if len(tensor.shape) == 3 and tensor.shape[0] == 3: + if tensor.ndim == 3 and tensor.shape[0] == 3: tensor = tensor.unsqueeze(0) if hasattr(model, 'video_processor'): - if len(tensor.shape) == 6 and tensor.shape[1] == 1: + if tensor.ndim == 6 and tensor.shape[1] == 1: tensor = tensor.squeeze(0) images = model.video_processor.postprocess_video(tensor, output_type='pil') elif hasattr(model, 'image_processor'): + if tensor.ndim == 5 and tensor.shape[1] == 3: # Qwen Image + tensor = tensor[:, :, 0] images = model.image_processor.postprocess(tensor, output_type=output_type) elif hasattr(model, "vqgan"): images = tensor.permute(0, 2, 3, 1).cpu().float().numpy() @@ -252,6 +256,8 @@ def vae_postprocess(tensor, model, output_type='np'): else: from diffusers.image_processor import VaeImageProcessor model.image_processor = VaeImageProcessor() + if tensor.ndim == 5 and tensor.shape[1] == 3: # Qwen Image + tensor = tensor[:, :, 0] images = model.image_processor.postprocess(tensor, output_type=output_type) else: images = tensor if isinstance(tensor, list) or isinstance(tensor, np.ndarray) else [tensor] @@ -291,8 +297,9 @@ def vae_decode(latents, model, output_type='np', vae_type='Full', width=None, he latent_num_frames = (frames - 1) // model.vae_temporal_compression_ratio + 1 latents = model._unpack_latents(latents.unsqueeze(0), latent_num_frames, height // 32, width // 32, model.transformer_spatial_patch_size, model.transformer_temporal_patch_size) # pylint: disable=protected-access latents = model._denormalize_latents(latents, model.vae.latents_mean, model.vae.latents_std, model.vae.config.scaling_factor) # pylint: disable=protected-access - if hasattr(model, '_unpack_latents') and hasattr(model, "vae_scale_factor") and width is not None and height is not None and latents.ndim == 3: # FLUX + elif hasattr(model, '_unpack_latents') and hasattr(model, "vae_scale_factor") and width is not None and height is not None and latents.ndim == 3: # FLUX latents = model._unpack_latents(latents, height, width, model.vae_scale_factor) # pylint: disable=protected-access + if latents.ndim == 3: # lost a batch dim in hires latents = latents.unsqueeze(0) if latents.shape[-1] <= 4: # not a latent, likely an image diff --git a/modules/taesd/taehv.py b/modules/taesd/taehv.py index bfeced7a7..a8ba17469 100644 --- a/modules/taesd/taehv.py +++ b/modules/taesd/taehv.py @@ -62,6 +62,8 @@ def apply_model_with_memblocks(model, x, parallel, show_progress_bar): if x.ndim == 4: x = x.unsqueeze(0) assert x.ndim == 5, f"TAEHV operates on NTCHW tensors, but got {x.ndim}-dim tensor" + if x.shape[1] == 16 and x.shape[2] != 16: + x = x.transpose(1,2) # NCTHW to NTCHW N, T, C, H, W = x.shape if parallel: x = x.reshape(N*T, C, H, W) From 0f785880eebcec5c190e40fd65e7ac84b73cec44 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 02:38:49 +0300 Subject: [PATCH 197/230] SDNQ fix a singular bias not getting offloaded --- modules/sdnq/quantizer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index d39523e5b..b069d470b 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -230,8 +230,11 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz use_quantized_matmul=use_quantized_matmul, re_quantize_for_matmul=re_quantize_for_matmul, ) + layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) + if layer.bias is not None and layer.bias.device != "meta": + layer.bias.data = layer.bias.to(return_device, non_blocking=non_blocking) layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) layer.forward = layer.forward.__get__(layer, layer.__class__) From 6bc83bc29606b18b2c4ca548c779962d91ea7fc0 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 03:19:30 +0300 Subject: [PATCH 198/230] Prevent accelerate from splitting Linear and Conv layers and causing device mismatch errors --- modules/sd_offload.py | 11 ++++++----- modules/sdnq/quantizer.py | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/sd_offload.py b/modules/sd_offload.py index c52220ccb..d20fb0371 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -12,11 +12,13 @@ from modules.timer import process as process_timer debug = os.environ.get('SD_MOVE_DEBUG', None) is not None +verbose = os.environ.get('SD_MOVE_VERBOSE', None) is not None debug_move = log.trace if debug else lambda *args, **kwargs: None offload_warn = ['sc', 'sd3', 'f1', 'h1', 'hunyuandit', 'auraflow', 'omnigen', 'omnigen2', 'cogview4', 'cosmos', 'chroma', 'x-omni'] offload_post = ['h1'] offload_hook_instance = None balanced_offload_exclude = ['CogView4Pipeline', 'MeissonicPipeline'] +no_split_module_classes = ["Linear", "Conv1d", "Conv2d", "Conv3d", "ConvTranspose1d", "ConvTranspose2d", "ConvTranspose3d"] accelerate_dtype_byte_size = None move_stream = None @@ -237,13 +239,12 @@ class OffloadHook(accelerate.hooks.ModelHook): max_memory = { device_index: self.gpu, "cpu": self.cpu } device_map = getattr(module, "balanced_offload_device_map", None) if (device_map is None) or (max_memory != getattr(module, "balanced_offload_max_memory", None)): - device_map = accelerate.infer_auto_device_map(module, max_memory=max_memory) + device_map = accelerate.infer_auto_device_map(module, max_memory=max_memory, no_split_module_classes=no_split_module_classes, verbose=verbose) offload_dir = getattr(module, "offload_dir", os.path.join(shared.opts.accelerate_offload_path, module.__class__.__name__)) if devices.backend == "directml": - keys = device_map.keys() - for v in keys: - if isinstance(device_map[v], int): - device_map[v] = f"{devices.device.type}:{device_map[v]}" # int implies CUDA or XPU device, but it will break DirectML backend so we add type + for k, v in device_map.items(): + if isinstance(v, int): + device_map[k] = f"{devices.device.type}:{v}" # int implies CUDA or XPU device, but it will break DirectML backend so we add type if device_map is not None: module = accelerate.dispatch_model(module, device_map=device_map, offload_dir=offload_dir) module._hf_hook.execution_device = torch.device(devices.device) # pylint: disable=protected-access diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index b069d470b..58083079a 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -233,8 +233,6 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) - if layer.bias is not None and layer.bias.device != "meta": - layer.bias.data = layer.bias.to(return_device, non_blocking=non_blocking) layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) layer.forward = layer.forward.__get__(layer, layer.__class__) From f7286c90d57a0f06aa3bdd09bd1334c9391be32c Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 16:19:11 +0300 Subject: [PATCH 199/230] SDNQ add native pre-quant loader support to from_pretrained --- modules/sdnq/quantizer.py | 171 ++++++++++++++++++++++++++++---------- 1 file changed, 129 insertions(+), 42 deletions(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 58083079a..501f70c62 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -1,6 +1,6 @@ # pylint: disable=redefined-builtin,no-member,protected-access -from typing import Dict, List, Tuple, Optional, Union +from typing import Any, Dict, List, Tuple, Optional, Union from dataclasses import dataclass from enum import Enum @@ -230,9 +230,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz use_quantized_matmul=use_quantized_matmul, re_quantize_for_matmul=re_quantize_for_matmul, ) - layer.weight.data = layer.sdnq_dequantizer.pack_weight(layer.weight).to(return_device, non_blocking=non_blocking) - layer.sdnq_dequantizer = layer.sdnq_dequantizer.to(return_device, non_blocking=non_blocking) layer.forward = get_forward_func(layer_class_name, use_quantized_matmul, dtype_dict[weights_dtype]["is_integer"], use_tensorwise_fp8_matmul) layer.forward = layer.forward.__get__(layer, layer.__class__) @@ -425,6 +423,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): def __init__(self, quantization_config, **kwargs): super().__init__(quantization_config, **kwargs) self.modules_to_not_convert = [] + self.updated_expected_keys = False def check_if_quantized_param( self, @@ -433,6 +432,8 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): param_name: str, *args, **kwargs, # pylint: disable=unused-argument ): + if self.pre_quantized and self.updated_expected_keys and (param_name.endswith(".scale") or param_name.endswith(".zero_point") or param_name.endswith(".svd_up") or param_name.endswith(".svd_down")): + return True if param_name.endswith(".weight"): split_param_name = param_name.split(".") if ( @@ -471,11 +472,22 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): param_value: torch.FloatTensor, param_name: str, target_device: torch.device, + state_dict: Dict[str, Any], *args, **kwargs, # pylint: disable=unused-argument ): - weights_dtype = self.quantization_config.weights_dtype - torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype + if self.pre_quantized and self.updated_expected_keys and (param_name.endswith(".scale") or param_name.endswith(".zero_point") or param_name.endswith(".svd_up") or param_name.endswith(".svd_down")): + layer, tensor_name = get_module_from_name(model, param_name) + return_dtype = torch.float32 if self.quantization_config.dequantize_fp32 else self.torch_dtype if self.torch_dtype is not None else param_value.dtype + if param_value is not None: + if param_value.dtype == return_dtype and devices.same_device(param_value.device, target_device): + param_value = param_value.clone() + else: + param_value = param_value.to(target_device, dtype=return_dtype) + param_value = torch.nn.Parameter(param_value, requires_grad=False) + setattr(layer, tensor_name, param_value) + return + weights_dtype = self.quantization_config.weights_dtype if len(self.quantization_config.modules_dtype_dict.keys()) > 0: split_param_name = param_name.split(".") for key, value in self.quantization_config.modules_dtype_dict.items(): @@ -506,29 +518,88 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): if self.quantization_config.quantization_device is not None: target_device = self.quantization_config.quantization_device - if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): - param_value = param_value.clone() - else: - param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) + if not self.pre_quantized: + torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype + if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): + param_value = param_value.clone() + else: + param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) - layer, _ = get_module_from_name(model, param_name) - layer.weight = torch.nn.Parameter(param_value, requires_grad=False) - layer = sdnq_quantize_layer( - layer, - weights_dtype=weights_dtype, - torch_dtype=torch_dtype, - group_size=self.quantization_config.group_size, - svd_rank=self.quantization_config.svd_rank, - use_svd=self.quantization_config.use_svd, - quant_conv=self.quantization_config.quant_conv, - use_quantized_matmul=self.quantization_config.use_quantized_matmul, - use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, - dequantize_fp32=self.quantization_config.dequantize_fp32, - non_blocking=self.quantization_config.non_blocking, - quantization_device=None, - return_device=return_device, - param_name=param_name, - ) + layer, _ = get_module_from_name(model, param_name) + layer.weight = torch.nn.Parameter(param_value, requires_grad=False) + layer = sdnq_quantize_layer( + layer, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=self.quantization_config.group_size, + svd_rank=self.quantization_config.svd_rank, + use_svd=self.quantization_config.use_svd, + quant_conv=self.quantization_config.quant_conv, + use_quantized_matmul=self.quantization_config.use_quantized_matmul, + use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, + dequantize_fp32=self.quantization_config.dequantize_fp32, + non_blocking=self.quantization_config.non_blocking, + quantization_device=None, + return_device=return_device, + param_name=param_name, + ) + else: + from accelerate import init_empty_weights + layer, _ = get_module_from_name(model, param_name) + torch_dtype = layer.weight.dtype if self.torch_dtype is None else self.torch_dtype + + if self.updated_expected_keys: # prevent overwrite to meta + scale, zero_point, svd_up, svd_down = None, None, None, None + if hasattr(layer, "scale") and layer.scale.device.type != "meta": + scale = layer.scale + del layer.scale + if hasattr(layer, "zero_point") and layer.zero_point.device.type != "meta": + zero_point = layer.zero_point + del layer.zero_point + if hasattr(layer, "svd_up") and layer.svd_up.device.type != "meta": + svd_up = layer.svd_up + del layer.svd_up + if hasattr(layer, "svd_down") and layer.svd_down.device.type != "meta": + svd_down = layer.svd_down + del layer.svd_down + + with init_empty_weights(): + # add sdnq_dequantizer + layer = sdnq_quantize_layer( + layer, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=self.quantization_config.group_size, + svd_rank=self.quantization_config.svd_rank, + use_svd=self.quantization_config.use_svd, + quant_conv=self.quantization_config.quant_conv, + use_quantized_matmul=self.quantization_config.use_quantized_matmul, + use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, + dequantize_fp32=self.quantization_config.dequantize_fp32, + non_blocking=self.quantization_config.non_blocking, + quantization_device="meta", + return_device="meta", + param_name=param_name, + ) + + layer.weight = torch.nn.Parameter(param_value.clone().to(target_device), requires_grad=False) + if self.updated_expected_keys: # Transformers + if scale is not None: + layer.scale = torch.nn.Parameter(scale, requires_grad=False) + if zero_point is not None: + layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) + if svd_up is not None: + layer.svd_up = torch.nn.Parameter(svd_up, requires_grad=False) + if svd_down is not None: + layer.svd_down = torch.nn.Parameter(svd_down, requires_grad=False) + else: # Diffusers doesn't have the API for updating expected keys + layer_key = param_name.removesuffix(".weight") + layer.scale = torch.nn.Parameter(state_dict[layer_key + ".scale"].clone().to(target_device), requires_grad=False) + if layer.zero_point is not None: + layer.zero_point = torch.nn.Parameter(state_dict[layer_key + ".zero_point"].clone().to(target_device), requires_grad=False) + if layer.svd_up is not None: + layer.svd_up = torch.nn.Parameter(state_dict[layer_key + ".svd_up"].clone().to(target_device), requires_grad=False) + layer.svd_down = torch.nn.Parameter(state_dict[layer_key + ".svd_down"].clone().to(target_device), requires_grad=False) def adjust_max_memory(self, max_memory: Dict[str, Union[int, str]]) -> Dict[str, Union[int, str]]: max_memory = {key: val * 0.80 for key, val in max_memory.items()} @@ -560,6 +631,19 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): model.config.quantization_config = self.quantization_config model.quantization_config = self.quantization_config + if self.pre_quantized and hasattr(model, "get_parameter_or_buffer"): + from functools import wraps + @wraps(model.get_parameter_or_buffer) + def get_parameter_or_buffer(self, target: str): + try: + return self.original_get_parameter_or_buffer(target) + except Exception as e: + if target.endswith(".scale") or target.endswith(".zero_point") or target.endswith(".svd_up") or target.endswith(".svd_down"): + return None + raise e + model.original_get_parameter_or_buffer = model.get_parameter_or_buffer + model.get_parameter_or_buffer = get_parameter_or_buffer.__get__(model, model.__class__) + def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument if shared.opts.diffusers_offload_mode != "none": model = model.to(devices.cpu) @@ -575,6 +659,24 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): """ return self.get_accelerator_warm_up_factor() + def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument + if not self.pre_quantized: + return unexpected_keys + new_unexpected_keys = [] + for key in unexpected_keys: + if not (key.endswith(".scale") or key.endswith(".zero_point") or key.endswith(".svd_up") or key.endswith(".svd_down")): + new_unexpected_keys.append(key) + return new_unexpected_keys + + def update_expected_keys(self, model, expected_keys: List[str], loaded_keys: list[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument + if not self.pre_quantized: + return expected_keys + self.updated_expected_keys = True + for key in loaded_keys: + if key.endswith(".scale") or key.endswith(".zero_point") or key.endswith(".svd_up") or key.endswith(".svd_down"): + expected_keys.append(key) + return expected_keys + def update_tp_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function @@ -587,12 +689,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): """ return config - def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return unexpected_keys - def update_missing_keys_after_loading(self, model, missing_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function @@ -605,12 +701,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): """ return state_dict - def update_expected_keys(self, model, expected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return expected_keys - def update_param_name(self, param_name: str, *args, **kwargs) -> str: # pylint: disable=unused-argument """ needed for transformers compatibilty, no-op function @@ -624,9 +714,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): return dtype def is_serializable(self, *args, **kwargs) -> bool: # pylint: disable=unused-argument, invalid-overridden-method - """ - needed for transformers compatibilty, returns True - """ return True @property From c0600ae9609878a762a33b08379e89432c9c06c7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 11 Oct 2025 09:32:20 -0400 Subject: [PATCH 200/230] update seq method Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/images_namegen.py | 15 ++++++++++++++- wiki | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16faa4108..88b39bdf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-09 +## Update for 2025-10-11 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -102,6 +102,7 @@ - **preview** implement configurable layers for WAN, Qwen, HV - update swagger `/docs` endpoint style - add `[epoch]` to filename template + - starting `[seq]` for filename template is now higher of largest previous sequence or number of files in folder - **Video** - use shared **T5** text encoder for video models when possible - use shared **LLama** text encoder for video models when possible diff --git a/modules/images_namegen.py b/modules/images_namegen.py index b50d2ae97..849450d5b 100644 --- a/modules/images_namegen.py +++ b/modules/images_namegen.py @@ -16,6 +16,7 @@ re_pattern_arg = re.compile(r"(.*)<([^>]*)>$") re_attention = re.compile(r'[\(*\[*](\w+)(:\d+(\.\d+))?[\)*\]*]|') re_network = re.compile(r'\<\w+:(\w+)(:\d+(\.\d+))?\>|') re_brackets = re.compile(r'[\([{})\]]') +re_leading_seq = re.compile(r'^(0*\d+)(?=[-_.\s]|$)') seq = 0 NOTHING = object() @@ -185,12 +186,24 @@ class FilenameGenerator: debug(f'Filename sanitize: input="{filename}" parts={parts} output="{fn}" ext={ext} max={max_length} len={len(fn)}') return fn + def safe_int(self, s): + try: + return int(s) + except (ValueError, TypeError): + return 0 + def sequence(self, fn): global seq # pylint: disable=global-statement x = fn dirname = os.path.dirname(fn) if seq == 0: - seq = len(os.listdir(dirname)) if os.path.exists(dirname) and os.path.isdir(dirname) else 0 + files = os.listdir(dirname) if os.path.exists(dirname) and os.path.isdir(dirname) else [] + files = [f for f in files if os.path.isfile(os.path.join(dirname, f))] + seq_files = len(files) + seq_nums = [re_leading_seq.match(f) for f in files] + seq_nums = [self.safe_int(m.group(1)) for m in seq_nums if m is not None] + seq_num = max(seq_nums) if len(seq_nums) > 0 else 0 + seq = max(seq_files, seq_num) if shared.opts.save_images_add_number or '[seq]' in fn: if '[seq]' not in fn: fn = os.path.join(os.path.dirname(fn), f"[seq]-{os.path.basename(fn)}") diff --git a/wiki b/wiki index c5321049f..be337fb3e 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit c5321049fbab6169c0ffa10accde4ad139639f2a +Subproject commit be337fb3e02048113e97515aceced6b3c67eb3d9 From 0ae4decadc859297888b3d690ace8b330b4ca8dd Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 11 Oct 2025 11:15:15 -0400 Subject: [PATCH 201/230] hidream-e1.1 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 ++-- TODO.md | 1 - html/reference.json | 3 +-- modules/sd_models.py | 14 +++++--------- pipelines/model_hidream.py | 4 ++++ 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88b39bdf2..2e429d98d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,10 @@ impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models + - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) + updated version of E1 image editing model - [X-Omni SFT](https://x-omni-team.github.io/) *experimental*: X-omni is a transformer-only discrete autoregressive image generative model trained with reinforcement learning - - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) - *experimental*: updated version of E1 image editing model - **Features** - **Model save**: ability to save currently loaded model as a new standalone model why? SD.Next always prefers to start with full model and quantize on-demand during load diff --git a/TODO.md b/TODO.md index adb84fbd8..5bdc45124 100644 --- a/TODO.md +++ b/TODO.md @@ -22,7 +22,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - [STG](https://github.com/huggingface/diffusers/blob/main/examples/community/README.md#spatiotemporal-skip-guidance) - [SmoothCache](https://github.com/huggingface/diffusers/issues/11135) - [MagCache](https://github.com/lllyasviel/FramePack/pull/673/files) -- [Nunchaku PulID](https://github.com/mit-han-lab/nunchaku/pull/274) - [Dream0 guidance](https://huggingface.co/ByteDance/DreamO) - [SUPIR upscaler](https://github.com/Fanghua-Yu/SUPIR) - [ByteDance OneReward](https://github.com/bytedance/OneReward) diff --git a/html/reference.json b/html/reference.json index 8202631a2..fced58542 100644 --- a/html/reference.json +++ b/html/reference.json @@ -700,8 +700,7 @@ "desc": "HiDream-E1 is an image editing model built on HiDream-I1.", "preview": "HiDream-ai--HiDream-E1-Full.jpg", "skip": true, - "extras": "sampler: Default", - "experimental": true + "extras": "sampler: Default" }, "Kwai Kolors": { diff --git a/modules/sd_models.py b/modules/sd_models.py index 4400a0aa6..8a133599e 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -37,12 +37,10 @@ pipe_switch_task_exclude = [ 'FluxFillPipeline', 'InstantIRPipeline', 'LTXConditionPipeline', - 'OmniGenPipeline', - 'OmniGen2Pipeline', + 'OmniGenPipeline', 'OmniGen2Pipeline', 'PhotoMakerStableDiffusionXLPipeline', 'PixelSmithXLPipeline', 'StableDiffusion3ControlNetPipeline', - 'StableDiffusionAdapterPipeline', 'StableDiffusionAdapterPipeline', 'StableDiffusionXLAdapterPipeline', 'StableDiffusionControlNetXSPipeline', 'StableDiffusionXLControlNetXSPipeline', 'StableDiffusionReferencePipeline', @@ -50,10 +48,8 @@ pipe_switch_task_exclude = [ 'XOmniPipeline', ] i2i_pipes = [ - 'LEditsPPPipelineStableDiffusion', - 'LEditsPPPipelineStableDiffusionXL', - 'OmniGenPipeline', - 'OmniGen2Pipeline', + 'LEditsPPPipelineStableDiffusion', 'LEditsPPPipelineStableDiffusionXL', + 'OmniGenPipeline', 'OmniGen2Pipeline', 'StableDiffusionAdapterPipeline', 'StableDiffusionXLAdapterPipeline', 'StableDiffusionControlNetXSPipeline', 'StableDiffusionXLControlNetXSPipeline', ] @@ -548,12 +544,12 @@ def load_sdnq_model(checkpoint_info, pipeline, diffusers_load_config, op): quantization_config_path = os.path.join(checkpoint_info.path, module_name, 'quantization_config.json') if not os.path.exists(quantization_config_path): continue - model_path = os.path.join(checkpoint_info.path, module_name) + model_name = os.path.join(checkpoint_info.path, module_name) quantization_config = shared.readfile(quantization_config_path, silent=True) shared.log.debug(f'Load {op}: model="{checkpoint_info.name}" module="{module_name}" direct={shared.opts.diffusers_to_gpu} prequant=sdnq') try: modules[module_name] = sdnq.load_sdnq_model( - model_path=model_path, + model_path=model_name, quantization_config=quantization_config, device=devices.device if shared.opts.diffusers_to_gpu else devices.cpu, dtype=devices.dtype, diff --git a/pipelines/model_hidream.py b/pipelines/model_hidream.py index 7f49997fc..120a89479 100644 --- a/pipelines/model_hidream.py +++ b/pipelines/model_hidream.py @@ -52,6 +52,10 @@ def load_hidream(checkpoint_info, diffusers_load_config={}): diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["hidream-e1"] = diffusers.HiDreamImagePipeline diffusers.pipelines.auto_pipeline.AUTO_IMAGE2IMAGE_PIPELINES_MAPPING["hidream-e1"] = HiDreamImageEditingPipeline diffusers.pipelines.auto_pipeline.AUTO_INPAINT_PIPELINES_MAPPING["hidream-e1"] = HiDreamImageEditingPipeline + if transformer and 'E1-1' in repo_id: + transformer.max_seq = 8192 + elif transformer and 'E1' in repo_id: + transformer.max_seq = 4608 else: shared.log.error(f'Load model: type=HiDream model="{checkpoint_info.name}" repo="{repo_id}" not recognized') return False From 9a8ba0fc908924670debaf9b0d6c91131191f527 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 11 Oct 2025 19:24:09 +0300 Subject: [PATCH 202/230] SDNQ unset device specific configs on save --- modules/sdnq/loader.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 04fc5e9a5..e2ecce092 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -17,10 +17,39 @@ def get_module_names(model: ModelMixin) -> list: def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", is_pipeline: bool = False, sdnq_config: SDNQConfig = None) -> None: + if is_pipeline: + for module_name in get_module_names(model): + module = getattr(model, module_name, None) + if hasattr(module, "config") and hasattr(module.config, "quantization_config") and isinstance(module.config.quantization_config, SDNQConfig): + module.config.quantization_config.quantization_device = None + module.config.quantization_config.return_device = None + module.config.quantization_config.non_blocking = False + module.config.quantization_config.add_skip_keys = False + if hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): + module.quantization_config.quantization_device = None + module.quantization_config.return_device = None + module.quantization_config.non_blocking = False + module.quantization_config.add_skip_keys = False + else: + if hasattr(model, "config") and hasattr(model.config, "quantization_config") and isinstance(model.config.quantization_config, SDNQConfig): + model.config.quantization_config.quantization_device = None + model.config.quantization_config.return_device = None + model.config.quantization_config.non_blocking = False + model.config.quantization_config.add_skip_keys = False + if hasattr(model, "quantization_config") and isinstance(model.quantization_config, SDNQConfig): + model.quantization_config.quantization_device = None + model.quantization_config.return_device = None + model.quantization_config.non_blocking = False + model.quantization_config.add_skip_keys = False + model.save_pretrained(model_path, max_shard_size=max_shard_size) # actual save quantization_config_path = os.path.join(model_path, "quantization_config.json") if sdnq_config is not None: # if provided, save global config + sdnq_config.quantization_device = None + sdnq_config.return_device = None + sdnq_config.non_blocking = False + sdnq_config.add_skip_keys = False sdnq_config.to_json_file(quantization_config_path) if is_pipeline: From 9206d9443e68b8a6fc91ac487533e81a48c02a6c Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 12 Oct 2025 00:00:53 +0300 Subject: [PATCH 203/230] SDNQ add dequantize model --- modules/sdnq/dequantizer.py | 17 +++++++++++++++++ modules/sdnq/quantizer.py | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/sdnq/dequantizer.py b/modules/sdnq/dequantizer.py index 1181776c8..2b9998adb 100644 --- a/modules/sdnq/dequantizer.py +++ b/modules/sdnq/dequantizer.py @@ -103,6 +103,23 @@ def re_quantize_matmul_packed_int_symmetric(weight: torch.ByteTensor, scale: tor return re_quantize_matmul_symmetric(unpack_int_symetric(weight, shape, weights_dtype, dtype=scale.dtype), scale, result_shape, svd_up=svd_up, svd_down=svd_down) +def dequantize_sdnq_model(model): + if hasattr(model, "sdnq_dequantizer"): + model.weight = torch.nn.Parameter(model.sdnq_dequantizer(model.weight, model.scale, model.zero_point, model.svd_up, model.svd_down)) + del model.sdnq_dequantizer, model.scale, model.zero_point, model.svd_up, model.svd_down + return model + has_children = list(model.children()) + if not has_children: + return model + for module in model.children(): + if hasattr(module, "sdnq_dequantizer"): + module.weight = torch.nn.Parameter(module.sdnq_dequantizer(module.weight, module.scale, module.zero_point, module.svd_up, module.svd_down)) + del module.sdnq_dequantizer, module.scale, module.zero_point, module.svd_up, module.svd_down + else: + module = dequantize_sdnq_model(module) + return model + + class AsymmetricWeightsDequantizer(torch.nn.Module): def __init__( self, diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 501f70c62..e56ecb43c 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -13,7 +13,7 @@ from diffusers.utils import get_module_from_name from modules import devices, shared from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm -from .dequantizer import dequantizer_dict +from .dequantizer import dequantizer_dict, dequantize_sdnq_model from .forward import get_forward_func @@ -713,6 +713,16 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): """ return dtype + def _dequantize(self, model): + model = dequantize_sdnq_model(model) + if hasattr(model, "quantization_method"): + del model.quantization_method + if hasattr(model, "quantization_config"): + del model.quantization_config + if hasattr(model, "config") and hasattr(model.config, "quantization_config"): + del model.config.quantization_config + return model + def is_serializable(self, *args, **kwargs) -> bool: # pylint: disable=unused-argument, invalid-overridden-method return True From a376f89fd62258f2af60010002e1b0cf9a550b4b Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 12 Oct 2025 01:02:47 +0300 Subject: [PATCH 204/230] Add type checking to SDNQConfig --- modules/sdnq/common.py | 1 + modules/sdnq/quantizer.py | 27 +++++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 8d0114e3e..57a4f0aaf 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -35,6 +35,7 @@ linear_types = {"Linear"} conv_types = {"Conv1d", "Conv2d", "Conv3d"} conv_transpose_types = {"ConvTranspose1d", "ConvTranspose2d", "ConvTranspose3d"} allowed_types = set.union(linear_types, conv_types, conv_transpose_types) +accepted_weights = set(dtype_dict.keys()) use_torch_compile = shared.opts.sdnq_dequantize_compile # this setting requires a full restart of the webui to apply is_rdna2 = bool(devices.backend == "rocm" and int(getattr(torch.cuda.get_device_properties(devices.device), "gcnArchName", "gfx0000")[3:]) < 1100) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index e56ecb43c..56c6c6d7f 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -12,7 +12,7 @@ from diffusers.quantizers.quantization_config import QuantizationConfigMixin from diffusers.utils import get_module_from_name from modules import devices, shared -from .common import dtype_dict, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm +from .common import dtype_dict, accepted_weights, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm from .dequantizer import dequantizer_dict, dequantize_sdnq_model from .forward import get_forward_func @@ -411,7 +411,7 @@ def sdnq_post_load_quant( class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): r""" - Diffusers Quantizer for SDNQ + Diffusers and Transformers Quantizer for SDNQ """ requires_parameters_quantization = True @@ -751,7 +751,7 @@ class SDNQConfig(QuantizationConfigMixin): svd_rank (`int`, *optional*, defaults to `32`): The rank size used for the SVDQuant algorithm. use_svd (`bool`, *optional*, defaults to `False`): - Enabling this option will use SVDQuant algorithm. + Enabling this option will use SVDQuant algorithm on top of SDNQ quantization. quant_conv (`bool`, *optional*, defaults to `False`): Enabling this option will quantize the convolutional layers in UNet models too. use_quantized_matmul (`bool`, *optional*, defaults to `False`): @@ -815,17 +815,32 @@ class SDNQConfig(QuantizationConfigMixin): r""" Safety checker that arguments are correct """ - accepted_weights = ["int8", "int7", "int6", "int5", "int4", "int3", "int2", "uint8", "uint7", "uint6", "uint5", "uint4", "uint3", "uint2", "uint1", "bool", "float8_e4m3fn", "float8_e4m3fnuz", "float8_e5m2", "float8_e5m2fnuz"] if self.weights_dtype not in accepted_weights: - raise ValueError(f"Only support weights in {accepted_weights} but found {self.weights_dtype}") + raise ValueError(f"SDNQ only support weights in {accepted_weights} but found {self.weights_dtype}") if self.modules_to_not_convert is None: self.modules_to_not_convert = [] - elif not isinstance(self.modules_to_not_convert, list): + elif isinstance(self.modules_to_not_convert, str): self.modules_to_not_convert = [self.modules_to_not_convert] + elif isinstance(self.modules_to_not_convert, tuple): + self.modules_to_not_convert = list(self.modules_to_not_convert) + elif not isinstance(self.modules_to_not_convert, list): + raise ValueError(f"modules_to_not_convert must be a list but got {type(self.modules_to_not_convert)}") if self.modules_dtype_dict is None: self.modules_dtype_dict = {} + elif not isinstance(self.modules_dtype_dict, dict): + raise ValueError(f"modules_dtype_dict must be a dict but got {type(self.modules_dtype_dict)}") + elif len(self.modules_dtype_dict.keys()) > 0: + for key, value in self.modules_dtype_dict.items(): + if isinstance(value, str): + value = [value] + self.modules_dtype_dict[key] = value + elif isinstance(value, tuple): + value = list(value) + self.modules_dtype_dict[key] = value + if not isinstance(key, str) or not isinstance(value, list): + raise ValueError(f"modules_dtype_dict must be a dictionary of strings and lists but got {type(key)} and {type(value)}") def to_dict(self): dct = self.__dict__.copy() # make serializable From eaa7dc119bd7d7598acf00cb98f934aeb66646e6 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 11 Oct 2025 18:35:40 -0400 Subject: [PATCH 205/230] prototype seedvr Signed-off-by: Vladimir Mandic --- .pylintrc | 1 + .ruff.toml | 1 + CHANGELOG.md | 7 +- installer.py | 1 + modules/postprocess/seedvr_model.py | 76 + modules/seedvr/__init__.py | 0 modules/seedvr/config_3b.yaml | 97 ++ modules/seedvr/config_7b.yaml | 94 ++ modules/seedvr/src/__init__.py | 37 + modules/seedvr/src/common/__init__.py | 0 modules/seedvr/src/common/cache.py | 33 + modules/seedvr/src/common/config.py | 128 ++ modules/seedvr/src/common/decorators.py | 126 ++ .../seedvr/src/common/diffusion/__init__.py | 56 + modules/seedvr/src/common/diffusion/config.py | 71 + .../src/common/diffusion/samplers/base.py | 108 ++ .../src/common/diffusion/samplers/euler.py | 107 ++ .../src/common/diffusion/schedules/base.py | 131 ++ .../src/common/diffusion/schedules/lerp.py | 55 + .../src/common/diffusion/timesteps/base.py | 72 + .../diffusion/timesteps/sampling/trailing.py | 49 + modules/seedvr/src/common/diffusion/types.py | 59 + modules/seedvr/src/common/diffusion/utils.py | 84 + .../seedvr/src/common/distributed/__init__.py | 35 + .../seedvr/src/common/distributed/advanced.py | 208 +++ .../seedvr/src/common/distributed/basic.py | 67 + .../src/common/distributed/meta_init_utils.py | 41 + modules/seedvr/src/common/distributed/ops.py | 494 ++++++ .../seedvr/src/common/half_precision_fixes.py | 61 + modules/seedvr/src/common/logger.py | 44 + modules/seedvr/src/common/partition.py | 59 + modules/seedvr/src/common/seed.py | 30 + modules/seedvr/src/core/__init__.py | 47 + modules/seedvr/src/core/generation.py | 365 +++++ modules/seedvr/src/core/infer.py | 357 +++++ modules/seedvr/src/core/model_manager.py | 61 + .../src/data/image/transforms/area_resize.py | 131 ++ .../data/image/transforms/divisible_crop.py | 40 + .../src/data/image/transforms/na_resize.py | 50 + .../src/data/image/transforms/side_resize.py | 54 + modules/seedvr/src/models/dit/attention.py | 94 ++ .../seedvr/src/models/dit/blocks/__init__.py | 25 + .../models/dit/blocks/mmdit_window_block.py | 233 +++ modules/seedvr/src/models/dit/embedding.py | 62 + modules/seedvr/src/models/dit/mlp.py | 62 + modules/seedvr/src/models/dit/mm.py | 67 + modules/seedvr/src/models/dit/modulation.py | 97 ++ modules/seedvr/src/models/dit/na.py | 241 +++ .../src/models/dit/nablocks/__init__.py | 25 + .../src/models/dit/nablocks/mmsr_block.py | 248 +++ modules/seedvr/src/models/dit/nadit.py | 350 +++++ .../seedvr/src/models/dit/normalization.py | 131 ++ modules/seedvr/src/models/dit/patch.py | 112 ++ modules/seedvr/src/models/dit/rope.py | 102 ++ modules/seedvr/src/models/dit/window.py | 83 + modules/seedvr/src/models/dit_v2/attention.py | 93 ++ modules/seedvr/src/models/dit_v2/embedding.py | 62 + modules/seedvr/src/models/dit_v2/mlp.py | 62 + modules/seedvr/src/models/dit_v2/mm.py | 74 + .../seedvr/src/models/dit_v2/modulation.py | 118 ++ modules/seedvr/src/models/dit_v2/na.py | 241 +++ .../src/models/dit_v2/nablocks/__init__.py | 26 + .../dit_v2/nablocks/attention/__init__.py | 25 + .../dit_v2/nablocks/attention/mmattn.py | 267 ++++ .../src/models/dit_v2/nablocks/mmsr_block.py | 126 ++ modules/seedvr/src/models/dit_v2/nadit.py | 246 +++ .../seedvr/src/models/dit_v2/normalization.py | 147 ++ .../src/models/dit_v2/patch/__init__.py | 19 + .../src/models/dit_v2/patch/patch_v1.py | 127 ++ modules/seedvr/src/models/dit_v2/rope.py | 155 ++ modules/seedvr/src/models/dit_v2/window.py | 83 + .../video_vae_v3/modules/attn_video_vae.py | 1345 +++++++++++++++++ .../modules/causal_inflation_lib.py | 437 ++++++ .../modules/context_parallel_lib.py | 66 + .../video_vae_v3/modules/global_config.py | 28 + .../video_vae_v3/modules/inflated_layers.py | 106 ++ .../video_vae_v3/modules/inflated_lib.py | 156 ++ .../src/models/video_vae_v3/modules/types.py | 76 + .../models/video_vae_v3/modules/video_vae.py | 956 ++++++++++++ .../video_vae_v3/s8_c16_t4_inflation_sd3.yaml | 28 + modules/seedvr/src/optimization/__init__.py | 0 .../seedvr/src/optimization/memory_manager.py | 131 ++ .../seedvr/src/optimization/performance.py | 160 ++ modules/seedvr/src/utils/__init__.py | 0 modules/seedvr/src/utils/color_fix.py | 138 ++ modules/seedvr/test.py | 58 + modules/upscaler.py | 4 +- 87 files changed, 11024 insertions(+), 5 deletions(-) create mode 100644 modules/postprocess/seedvr_model.py create mode 100644 modules/seedvr/__init__.py create mode 100644 modules/seedvr/config_3b.yaml create mode 100644 modules/seedvr/config_7b.yaml create mode 100644 modules/seedvr/src/__init__.py create mode 100644 modules/seedvr/src/common/__init__.py create mode 100644 modules/seedvr/src/common/cache.py create mode 100644 modules/seedvr/src/common/config.py create mode 100644 modules/seedvr/src/common/decorators.py create mode 100644 modules/seedvr/src/common/diffusion/__init__.py create mode 100644 modules/seedvr/src/common/diffusion/config.py create mode 100644 modules/seedvr/src/common/diffusion/samplers/base.py create mode 100644 modules/seedvr/src/common/diffusion/samplers/euler.py create mode 100644 modules/seedvr/src/common/diffusion/schedules/base.py create mode 100644 modules/seedvr/src/common/diffusion/schedules/lerp.py create mode 100644 modules/seedvr/src/common/diffusion/timesteps/base.py create mode 100644 modules/seedvr/src/common/diffusion/timesteps/sampling/trailing.py create mode 100644 modules/seedvr/src/common/diffusion/types.py create mode 100644 modules/seedvr/src/common/diffusion/utils.py create mode 100644 modules/seedvr/src/common/distributed/__init__.py create mode 100644 modules/seedvr/src/common/distributed/advanced.py create mode 100644 modules/seedvr/src/common/distributed/basic.py create mode 100644 modules/seedvr/src/common/distributed/meta_init_utils.py create mode 100644 modules/seedvr/src/common/distributed/ops.py create mode 100644 modules/seedvr/src/common/half_precision_fixes.py create mode 100644 modules/seedvr/src/common/logger.py create mode 100644 modules/seedvr/src/common/partition.py create mode 100644 modules/seedvr/src/common/seed.py create mode 100644 modules/seedvr/src/core/__init__.py create mode 100644 modules/seedvr/src/core/generation.py create mode 100644 modules/seedvr/src/core/infer.py create mode 100644 modules/seedvr/src/core/model_manager.py create mode 100644 modules/seedvr/src/data/image/transforms/area_resize.py create mode 100644 modules/seedvr/src/data/image/transforms/divisible_crop.py create mode 100644 modules/seedvr/src/data/image/transforms/na_resize.py create mode 100644 modules/seedvr/src/data/image/transforms/side_resize.py create mode 100644 modules/seedvr/src/models/dit/attention.py create mode 100644 modules/seedvr/src/models/dit/blocks/__init__.py create mode 100644 modules/seedvr/src/models/dit/blocks/mmdit_window_block.py create mode 100644 modules/seedvr/src/models/dit/embedding.py create mode 100644 modules/seedvr/src/models/dit/mlp.py create mode 100644 modules/seedvr/src/models/dit/mm.py create mode 100644 modules/seedvr/src/models/dit/modulation.py create mode 100644 modules/seedvr/src/models/dit/na.py create mode 100644 modules/seedvr/src/models/dit/nablocks/__init__.py create mode 100644 modules/seedvr/src/models/dit/nablocks/mmsr_block.py create mode 100644 modules/seedvr/src/models/dit/nadit.py create mode 100644 modules/seedvr/src/models/dit/normalization.py create mode 100644 modules/seedvr/src/models/dit/patch.py create mode 100644 modules/seedvr/src/models/dit/rope.py create mode 100644 modules/seedvr/src/models/dit/window.py create mode 100644 modules/seedvr/src/models/dit_v2/attention.py create mode 100644 modules/seedvr/src/models/dit_v2/embedding.py create mode 100644 modules/seedvr/src/models/dit_v2/mlp.py create mode 100644 modules/seedvr/src/models/dit_v2/mm.py create mode 100644 modules/seedvr/src/models/dit_v2/modulation.py create mode 100644 modules/seedvr/src/models/dit_v2/na.py create mode 100644 modules/seedvr/src/models/dit_v2/nablocks/__init__.py create mode 100644 modules/seedvr/src/models/dit_v2/nablocks/attention/__init__.py create mode 100644 modules/seedvr/src/models/dit_v2/nablocks/attention/mmattn.py create mode 100644 modules/seedvr/src/models/dit_v2/nablocks/mmsr_block.py create mode 100644 modules/seedvr/src/models/dit_v2/nadit.py create mode 100644 modules/seedvr/src/models/dit_v2/normalization.py create mode 100644 modules/seedvr/src/models/dit_v2/patch/__init__.py create mode 100644 modules/seedvr/src/models/dit_v2/patch/patch_v1.py create mode 100644 modules/seedvr/src/models/dit_v2/rope.py create mode 100644 modules/seedvr/src/models/dit_v2/window.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/global_config.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/types.py create mode 100644 modules/seedvr/src/models/video_vae_v3/modules/video_vae.py create mode 100644 modules/seedvr/src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml create mode 100644 modules/seedvr/src/optimization/__init__.py create mode 100644 modules/seedvr/src/optimization/memory_manager.py create mode 100644 modules/seedvr/src/optimization/performance.py create mode 100644 modules/seedvr/src/utils/__init__.py create mode 100644 modules/seedvr/src/utils/color_fix.py create mode 100644 modules/seedvr/test.py diff --git a/.pylintrc b/.pylintrc index 5b4e398dc..ff0af298f 100644 --- a/.pylintrc +++ b/.pylintrc @@ -29,6 +29,7 @@ ignore-paths=/usr/lib/.*$, modules/postprocess/aurasr_arch.py, modules/prompt_parser_xhinker.py, modules/ras, + modules/seedvr, modules/rife, modules/schedulers, modules/taesd, diff --git a/.ruff.toml b/.ruff.toml index 7433d76da..de4e0f7a5 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -12,6 +12,7 @@ exclude = [ "modules/pag", "modules/schedulers", "modules/teacache", + "modules/seedvr", "modules/control/proc", "modules/control/units", diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e429d98d..4f06fff89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,12 +42,13 @@ - **ROCm** for Windows support for both official torch preview release of `torch-rocm` for windows and **TheRock** unoffical `torch-rocm` builds for windows note that rocm for windows is still in preview and has limited gpu support, please check rocm docs for details - - **DirectML** warn as end-of-life + - **DirectML** warn as *end-of-life* `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` - command line params `--use-zluda` and `--use-rocm` will attempt desired operation or fail if not possible previously sdnext was performing a fallback to `torch-cpu` which is not desired - - if `--use-cuda` or `--use-rocm` are specified and `torch-cpu` is installed, installer will attempt to reinstall correct torch package - - **installer**: warn if cuda or rocm are available and `torch-cpu` is installed + - **installer** if `--use-cuda` or `--use-rocm` are specified and `torch-cpu` is installed, installer will attempt to reinstall correct torch package + - **installer** warn if *cuda* or *rocm* are available and `torch-cpu` is installed + - support for `torch==2.10-nightly` with `cuda==13.0` - **Extensions** - [Agent-Scheduler](https://github.com/SipherAGI/sd-webui-agent-scheduler) was a high-value built-in extension, but it has not been maintained for 1.5 years diff --git a/installer.py b/installer.py index 9129d2620..e668f3c1a 100644 --- a/installer.py +++ b/installer.py @@ -1353,6 +1353,7 @@ def set_environment(): allocator += ',backend:cudaMallocAsync' if opts.get("torch_expandable_segments", False): allocator += ',expandable_segments:True' + os.environ.setdefault('PYTORCH_ALLOC_CONF', allocator) os.environ.setdefault('PYTORCH_CUDA_ALLOC_CONF', allocator) os.environ.setdefault('PYTORCH_HIP_ALLOC_CONF', allocator) log.debug(f'Torch allocator: "{allocator}"') diff --git a/modules/postprocess/seedvr_model.py b/modules/postprocess/seedvr_model.py new file mode 100644 index 000000000..1f833cbd5 --- /dev/null +++ b/modules/postprocess/seedvr_model.py @@ -0,0 +1,76 @@ +import time +import numpy as np +import torch +from PIL import Image +from torchvision.transforms import ToPILImage +from rich.progress import Progress, TextColumn, BarColumn, TaskProgressColumn, TimeRemainingColumn, TimeElapsedColumn +from modules import devices +from modules.shared import opts, log +from modules.upscaler import Upscaler, UpscalerData + + +MODELS_MAP = { + "SeedVR2 3B": "seedvr2_ema_3b_fp16.safetensors", + "SeedVR2 7B": "seedvr2_ema_7b_fp16.safetensors", + "SeedVR2 7B Sharp": "seedvr2_ema_7b_sharp_fp16.safetensors", +} +to_pil = ToPILImage() + + +class UpscalerSeedVR(Upscaler): + def __init__(self, dirname=None): + self.name = "SeedVR" + super().__init__() + self.scalers = [ + UpscalerData(name="SeedVR2 3B", path=None, upscaler=self, model=None, scale=1), + UpscalerData(name="SeedVR2 7B", path=None, upscaler=self, model=None, scale=1), + UpscalerData(name="SeedVR2 7B Sharp", path=None, upscaler=self, model=None, scale=1), + ] + self.model = None + self.model_loaded = None + + def load_model(self, path: str): + model_name = MODELS_MAP.get(path, None) + if (self.model is None) or (self.model_loaded != model_name): + log.debug(f'Upscaler load: name="{self.name}" model="{model_name}"') + from modules.seedvr.src.core.model_manager import configure_runner + self.model = configure_runner( + model_name=model_name, + cache_dir=opts.hfcache_dir, + device=devices.device, + dtype=devices.dtype, + ) + + def do_upscale(self, img: Image.Image, selected_file): + devices.torch_gc() + self.load_model(selected_file) + if self.model is None: + return img + + from modules.seedvr.src.core.generation import generation_loop + + width = int(self.scale * img.width) // 8 * 8 + image_tensor = np.array(img) + image_tensor = torch.from_numpy(image_tensor).to(device=devices.device, dtype=devices.dtype).unsqueeze(0) / 255.0 + + t0 = time.time() + result_tensor = generation_loop( + runner=self.model, + images=image_tensor, + cfg_scale=1.0, + seed=42, + res_w=width, + batch_size=1, + temporal_overlap=0, + device=devices.device, + ) + t1 = time.time() + log.info(f'Upscaler: type="{self.name}" model="{selected_file}" scale={self.scale} time={t1 - t0:.2f}') + img = to_pil(result_tensor.squeeze().permute((2, 0, 1))) + devices.torch_gc() + + if opts.upscaler_unload: + self.model = None + log.debug(f'Upscaler unload: type="{self.name}" model="{selected_file}"') + devices.torch_gc(force=True) + return img diff --git a/modules/seedvr/__init__.py b/modules/seedvr/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/seedvr/config_3b.yaml b/modules/seedvr/config_3b.yaml new file mode 100644 index 000000000..d2ffda469 --- /dev/null +++ b/modules/seedvr/config_3b.yaml @@ -0,0 +1,97 @@ +__object__: + path: projects.video_diffusion_sr.train + name: VideoDiffusionTrainer + +dit: + model: + __object__: + path: + - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" + - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" + - "src.models.dit_v2.nadit" + name: "NaDiT" + args: "as_params" + vid_in_channels: 33 + vid_out_channels: 16 + vid_dim: 2560 + vid_out_norm: fusedrms + txt_in_dim: 5120 + txt_in_norm: fusedln + txt_dim: ${.vid_dim} + emb_dim: ${eval:'6 * ${.vid_dim}'} + heads: 20 + head_dim: 128 # llm-like + expand_ratio: 4 + norm: fusedrms + norm_eps: 1.0e-05 + ada: single + qk_bias: False + qk_norm: fusedrms + patch_size: [1, 2, 2] + num_layers: 32 # llm-like + mm_layers: 10 + mlp_type: swiglu + msa_type: None + block_type: ${eval:'${.num_layers} * ["mmdit_sr"]'} # space-full + window: ${eval:'${.num_layers} * [(4,3,3)]'} # space-full + window_method: ${eval:'${.num_layers} // 2 * ["720pwin_by_size_bysize","720pswin_by_size_bysize"]'} # space-full + rope_type: mmrope3d + rope_dim: 128 + compile: False + gradient_checkpoint: True + fsdp: + sharding_strategy: _HYBRID_SHARD_ZERO2 + +ema: + decay: 0.9998 + +vae: + model: + __object__: + path: + - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "src.models.video_vae_v3.modules.attn_video_vae" + name: "VideoAutoencoderKLWrapper" + args: "as_params" + freeze_encoder: False + gradient_checkpoint: True # Disabled to prevent VRAM leaks in inference + slicing: + split_size: 4 + memory_device: same + memory_limit: + conv_max_mem: 0.5 + norm_max_mem: 0.5 + checkpoint: ema_vae_fp16.safetensors + scaling_factor: 0.9152 + compile: False + grouping: False + dtype: float16 + +diffusion: + schedule: + type: lerp + T: 1000.0 + sampler: + type: euler + prediction_type: v_lerp + timesteps: + training: + type: logitnormal + loc: 0.0 + scale: 1.0 + sampling: + type: uniform_trailing + steps: 50 + transform: True + loss: + type: v_lerp + cfg: + scale: 7.5 + rescale: 0 + +condition: + i2v: 0.0 + v2v: 0.0 + sr: 1.0 + noise_scale: 0.25 diff --git a/modules/seedvr/config_7b.yaml b/modules/seedvr/config_7b.yaml new file mode 100644 index 000000000..3f80813d9 --- /dev/null +++ b/modules/seedvr/config_7b.yaml @@ -0,0 +1,94 @@ +__object__: + path: projects.video_diffusion_sr.train + name: VideoDiffusionTrainer + +dit: + model: + __object__: + path: + - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit.nadit" + - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit.nadit" + - "src.models.dit.nadit" + name: "NaDiT" + args: "as_params" + vid_in_channels: 33 + vid_out_channels: 16 + vid_dim: 3072 + txt_in_dim: 5120 + txt_dim: ${.vid_dim} + emb_dim: ${eval:'6 * ${.vid_dim}'} + heads: 24 + head_dim: 128 # llm-like + expand_ratio: 4 + norm: fusedrms + norm_eps: 1e-5 + ada: single + qk_bias: False + qk_rope: True + qk_norm: fusedrms + patch_size: [1, 2, 2] + num_layers: 36 # llm-like + shared_mlp: False + shared_qkv: False + mlp_type: normal + block_type: ${eval:'${.num_layers} * ["mmdit_sr"]'} # space-full + window: ${eval:'${.num_layers} * [(4,3,3)]'} # space-full + window_method: ${eval:'${.num_layers} // 2 * ["720pwin_by_size_bysize","720pswin_by_size_bysize"]'} # space-full + compile: False + gradient_checkpoint: True + fsdp: + sharding_strategy: _HYBRID_SHARD_ZERO2 + +ema: + decay: 0.9998 + +vae: + model: + __object__: + path: + - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "src.models.video_vae_v3.modules.attn_video_vae" + name: "VideoAutoencoderKLWrapper" + args: "as_params" + freeze_encoder: False + # gradient_checkpoint: True + slicing: + split_size: 4 + memory_device: same + memory_limit: + conv_max_mem: 0.5 + norm_max_mem: 0.5 + checkpoint: ema_vae_fp16.safetensors + scaling_factor: 0.9152 + compile: False + grouping: False + dtype: float16 + +diffusion: + schedule: + type: lerp + T: 1000.0 + sampler: + type: euler + prediction_type: v_lerp + timesteps: + training: + type: logitnormal + loc: 0.0 + scale: 1.0 + sampling: + type: uniform_trailing + steps: 50 + transform: True + loss: + type: v_lerp + cfg: + scale: 7.5 + rescale: 0 + +condition: + i2v: 0.0 + v2v: 0.0 + sr: 1.0 + noise_scale: 0.25 diff --git a/modules/seedvr/src/__init__.py b/modules/seedvr/src/__init__.py new file mode 100644 index 000000000..ebff00ffb --- /dev/null +++ b/modules/seedvr/src/__init__.py @@ -0,0 +1,37 @@ +""" +SeedVR2 Video Upscaler - Modular Architecture +Refactored from monolithic seedvr2.py for better maintainability + +Author: Refactored codebase +Version: 2.0.0 - Modular + +Available Modules: +- utils: Download and path utilities +- optimization: Memory, performance, and compatibility optimizations +- core: Model management and generation pipeline (NEW) +- processing: Video and tensor processing (coming next) +- interfaces: ComfyUI integration +""" +''' +# Track which modules are available for progressive migration +MODULES_AVAILABLE = { + 'downloads': True, # ✅ Module 1 - Downloads and model management + 'memory_manager': True, # ✅ Module 2 - Memory optimization + 'performance': True, # ✅ Module 3 - Performance optimizations + 'compatibility': True, # ✅ Module 4 - FP8/FP16 compatibility + 'model_manager': True, # ✅ Module 5 - Model configuration and loading + 'generation': True, # ✅ Module 6 - Generation loop and inference + 'video_transforms': True, # ✅ Module 7 - Video processing and transforms + 'comfyui_node': True, # ✅ Module 8 - ComfyUI node interface (COMPLETE!) + 'infer': True, # ✅ Module 9 - Infer +} +''' +# Core imports (always available) +import os +import sys + +# Add current directory to path for fallback imports +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(current_dir) +if parent_dir not in sys.path: + sys.path.insert(0, parent_dir) diff --git a/modules/seedvr/src/common/__init__.py b/modules/seedvr/src/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/seedvr/src/common/cache.py b/modules/seedvr/src/common/cache.py new file mode 100644 index 000000000..3566852ba --- /dev/null +++ b/modules/seedvr/src/common/cache.py @@ -0,0 +1,33 @@ +from typing import Callable + + +class Cache: + """Caching reusable args for faster inference""" + + def __init__(self, disable=False, prefix="", cache=None): + self.cache = cache if cache is not None else {} + self.disable = disable + self.prefix = prefix + + def __call__(self, key: str, fn: Callable): + if self.disable: + return fn() + + key = self.prefix + key + try: + result = self.cache[key] + except KeyError: + result = fn() + self.cache[key] = result + return result + + def namespace(self, namespace: str): + return Cache( + disable=self.disable, + prefix=self.prefix + namespace + ".", + cache=self.cache, + ) + + def get(self, key: str): + key = self.prefix + key + return self.cache[key] diff --git a/modules/seedvr/src/common/config.py b/modules/seedvr/src/common/config.py new file mode 100644 index 000000000..3667b4d2b --- /dev/null +++ b/modules/seedvr/src/common/config.py @@ -0,0 +1,128 @@ +import importlib +from typing import Any, Callable, List, Union +from omegaconf import DictConfig, ListConfig, OmegaConf + +try: + OmegaConf.register_new_resolver("eval", eval) +except Exception as e: + if "already registered" not in str(e): + raise + + + +def load_config(path: str, argv: List[str] = None) -> Union[DictConfig, ListConfig]: + """ + Load a configuration. Will resolve inheritance. + """ + + config = OmegaConf.load(path) + if argv is not None: + config_argv = OmegaConf.from_dotlist(argv) + config = OmegaConf.merge(config, config_argv) + config = resolve_recursive(config, resolve_inheritance) + return config + + +def resolve_recursive( + config: Any, + resolver: Callable[[Union[DictConfig, ListConfig]], Union[DictConfig, ListConfig]], +) -> Any: + config = resolver(config) + if isinstance(config, DictConfig): + for k in config.keys(): + v = config.get(k) + if isinstance(v, (DictConfig, ListConfig)): + config[k] = resolve_recursive(v, resolver) + if isinstance(config, ListConfig): + for i in range(len(config)): + v = config.get(i) + if isinstance(v, (DictConfig, ListConfig)): + config[i] = resolve_recursive(v, resolver) + return config + + +def resolve_inheritance(config: Union[DictConfig, ListConfig]) -> Any: + """ + Recursively resolve inheritance if the config contains: + __inherit__: path/to/parent.yaml or a ListConfig of such paths. + """ + if isinstance(config, DictConfig): + inherit = config.pop("__inherit__", None) + + if inherit: + inherit_list = inherit if isinstance(inherit, ListConfig) else [inherit] + + parent_config = None + for parent_path in inherit_list: + assert isinstance(parent_path, str) + parent_config = ( + load_config(parent_path) + if parent_config is None + else OmegaConf.merge(parent_config, load_config(parent_path)) + ) + + if len(config.keys()) > 0: + config = OmegaConf.merge(parent_config, config) + else: + config = parent_config + return config + + +def import_item(path: Union[str, List[str]], name: str) -> Any: + """ + Import a python item with fallback support. + + Args: + path: Single path string or list of paths to try (fallback order) + name: Class/function name to import + + Returns: + Imported object + + Example: + import_item("path.to.file", "MyClass") -> MyClass + import_item(["path1.to.file", "path2.to.file"], "MyClass") -> MyClass (first working path) + """ + if isinstance(path, str): + # Single path - original behavior + return getattr(importlib.import_module(path), name) + + elif isinstance(path, (list, ListConfig)): + # Multiple paths - try each until one works + last_error = None + for single_path in path: + try: + return getattr(importlib.import_module(single_path), name) + except ImportError as e: + last_error = e + continue + + # If we get here, none of the paths worked + raise ImportError(f"Could not import '{name}' from any of the paths: {path}. Last error: {last_error}") + + else: + raise ValueError(f"Path must be string or list of strings, got: {type(path)}") + + +def create_object(config: DictConfig) -> Any: + """ + Create an object from config. + The config is expected to contains the following: + __object__: + path: path.to.module + name: MyClass + args: as_config | as_params (default to as_config) + """ + + item = import_item( + path=config.__object__.path, + name=config.__object__.name, + ) + args = config.__object__.get("args", "as_config") + if args == "as_config": + return item(config) + if args == "as_params": + config = OmegaConf.to_object(config) + config.pop("__object__") + return item(**config) + raise NotImplementedError(f"Unknown args type: {args}") diff --git a/modules/seedvr/src/common/decorators.py b/modules/seedvr/src/common/decorators.py new file mode 100644 index 000000000..6eacf8bd5 --- /dev/null +++ b/modules/seedvr/src/common/decorators.py @@ -0,0 +1,126 @@ +import functools +import threading +from typing import Callable +import torch + +from .distributed import barrier_if_distributed, get_global_rank, get_local_rank +from .logger import get_logger + +logger = get_logger(__name__) + + +def log_on_entry(func: Callable) -> Callable: + """ + Functions with this decorator will log the function name at entry. + When using multiple decorators, this must be applied innermost to properly capture the name. + """ + + def log_on_entry_wrapper(*args, **kwargs): + logger.info(f"Entering {func.__name__}") + return func(*args, **kwargs) + + return log_on_entry_wrapper + + +def barrier_on_entry(func: Callable) -> Callable: + """ + Functions with this decorator will start executing when all ranks are ready to enter. + """ + + def barrier_on_entry_wrapper(*args, **kwargs): + barrier_if_distributed() + return func(*args, **kwargs) + + return barrier_on_entry_wrapper + + +def _conditional_execute_wrapper_factory(execute: bool, func: Callable) -> Callable: + """ + Helper function for local_rank_zero_only and global_rank_zero_only. + """ + + def conditional_execute_wrapper(*args, **kwargs): + # Only execute if needed. + result = func(*args, **kwargs) if execute else None + # All GPUs must wait. + barrier_if_distributed() + # Return results. + return result + + return conditional_execute_wrapper + + +def _asserted_wrapper_factory(condition: bool, func: Callable, err_msg: str = "") -> Callable: + """ + Helper function for some functions with special constraints, + especially functions called by other global_rank_zero_only / local_rank_zero_only ones, + in case they are wrongly invoked in other scenarios. + """ + + def asserted_execute_wrapper(*args, **kwargs): + assert condition, err_msg + result = func(*args, **kwargs) + return result + + return asserted_execute_wrapper + + +def local_rank_zero_only(func: Callable) -> Callable: + """ + Functions with this decorator will only execute on local rank zero. + """ + return _conditional_execute_wrapper_factory(get_local_rank() == 0, func) + + +def global_rank_zero_only(func: Callable) -> Callable: + """ + Functions with this decorator will only execute on global rank zero. + """ + return _conditional_execute_wrapper_factory(get_global_rank() == 0, func) + + +def assert_only_global_rank_zero(func: Callable) -> Callable: + """ + Functions with this decorator are only accessible to processes with global rank zero. + """ + return _asserted_wrapper_factory( + get_global_rank() == 0, func, err_msg="Not accessible to processes with global_rank != 0" + ) + + +def assert_only_local_rank_zero(func: Callable) -> Callable: + """ + Functions with this decorator are only accessible to processes with local rank zero. + """ + return _asserted_wrapper_factory( + get_local_rank() == 0, func, err_msg="Not accessible to processes with local_rank != 0" + ) + + +def new_thread(func: Callable) -> Callable: + """ + Functions with this decorator will run in a new thread. + The function will return the thread, which can be joined to wait for completion. + """ + + def new_thread_wrapper(*args, **kwargs): + thread = threading.Thread(target=func, args=args, kwargs=kwargs) + thread.start() + return thread + + return new_thread_wrapper + + +def log_runtime(func: Callable) -> Callable: + """ + Functions with this decorator will logging the runtime. + """ + + @functools.wraps(func) + def wrapped(*args, **kwargs): + torch.distributed.barrier() + result = func(*args, **kwargs) + torch.distributed.barrier() + return result + + return wrapped diff --git a/modules/seedvr/src/common/diffusion/__init__.py b/modules/seedvr/src/common/diffusion/__init__.py new file mode 100644 index 000000000..034e36ef7 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/__init__.py @@ -0,0 +1,56 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Diffusion package. +""" + +from .config import ( + create_sampler_from_config, + create_sampling_timesteps_from_config, + create_schedule_from_config, +) +from .samplers.base import Sampler +from .samplers.euler import EulerSampler +from .schedules.base import Schedule +from .schedules.lerp import LinearInterpolationSchedule +from .timesteps.base import SamplingTimesteps, Timesteps +from .timesteps.sampling.trailing import UniformTrailingSamplingTimesteps +from .types import PredictionType, SamplingDirection +from .utils import classifier_free_guidance, classifier_free_guidance_dispatcher, expand_dims + +__all__ = [ + # Configs + "create_sampler_from_config", + "create_sampling_timesteps_from_config", + "create_schedule_from_config", + # Schedules + "Schedule", + "DiscreteVariancePreservingSchedule", + "LinearInterpolationSchedule", + # Samplers + "Sampler", + "EulerSampler", + # Timesteps + "Timesteps", + "SamplingTimesteps", + # Types + "PredictionType", + "SamplingDirection", + "UniformTrailingSamplingTimesteps", + # Utils + "classifier_free_guidance", + "classifier_free_guidance_dispatcher", + "expand_dims", +] diff --git a/modules/seedvr/src/common/diffusion/config.py b/modules/seedvr/src/common/diffusion/config.py new file mode 100644 index 000000000..0a7183584 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/config.py @@ -0,0 +1,71 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Utility functions for creating schedules and samplers from config. +""" + +import torch +from omegaconf import DictConfig + +from .samplers.base import Sampler +from .samplers.euler import EulerSampler +from .schedules.base import Schedule +from .schedules.lerp import LinearInterpolationSchedule +from .timesteps.base import SamplingTimesteps +from .timesteps.sampling.trailing import UniformTrailingSamplingTimesteps + + +def create_schedule_from_config( + config: DictConfig, +) -> Schedule: + """ + Create a schedule from configuration. + """ + if config.type == "lerp": + return LinearInterpolationSchedule(T=config.get("T", 1.0)) + + raise NotImplementedError + + +def create_sampler_from_config( + config: DictConfig, + schedule: Schedule, + timesteps: SamplingTimesteps, +) -> Sampler: + """ + Create a sampler from configuration. + """ + if config.type == "euler": + return EulerSampler( + schedule=schedule, + timesteps=timesteps, + prediction_type=config.prediction_type, + ) + raise NotImplementedError + + +def create_sampling_timesteps_from_config( + config: DictConfig, + schedule: Schedule, + device: torch.device, +) -> SamplingTimesteps: + if config.type == "uniform_trailing": + return UniformTrailingSamplingTimesteps( + T=schedule.T, + steps=config.steps, + shift=config.get("shift", 1.0), + device=device, + ) + raise NotImplementedError diff --git a/modules/seedvr/src/common/diffusion/samplers/base.py b/modules/seedvr/src/common/diffusion/samplers/base.py new file mode 100644 index 000000000..8e65f1989 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/samplers/base.py @@ -0,0 +1,108 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Sampler base class. +""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Callable +import torch +from tqdm import tqdm + +from ..schedules.base import Schedule +from ..timesteps.base import SamplingTimesteps +from ..types import PredictionType, SamplingDirection +from ..utils import assert_schedule_timesteps_compatible + + +@dataclass +class SamplerModelArgs: + x_t: torch.Tensor + t: torch.Tensor + i: int + + +class Sampler(ABC): + """ + Samplers are ODE/SDE solvers. + """ + + def __init__( + self, + schedule: Schedule, + timesteps: SamplingTimesteps, + prediction_type: PredictionType, + return_endpoint: bool = True, + ): + assert_schedule_timesteps_compatible( + schedule=schedule, + timesteps=timesteps, + ) + self.schedule = schedule + self.timesteps = timesteps + self.prediction_type = prediction_type + self.return_endpoint = return_endpoint + + @abstractmethod + def sample( + self, + x: torch.Tensor, + f: Callable[[SamplerModelArgs], torch.Tensor], + ) -> torch.Tensor: + """ + Generate a new sample given the the intial sample x and score function f. + """ + + def get_next_timestep( + self, + t: torch.Tensor, + ) -> torch.Tensor: + """ + Get the next sample timestep. + Support multiple different timesteps t in a batch. + If no more steps, return out of bound value -1 or T+1. + """ + T = self.timesteps.T + steps = len(self.timesteps) + curr_idx = self.timesteps.index(t) + next_idx = curr_idx + 1 + bound = -1 if self.timesteps.direction == SamplingDirection.backward else T + 1 + + s = self.timesteps[next_idx.clamp_max(steps - 1)] + s = s.where(next_idx < steps, bound) + return s + + def get_endpoint( + self, + pred: torch.Tensor, + x_t: torch.Tensor, + t: torch.Tensor, + ) -> torch.Tensor: + """ + Get to the endpoint of the probability flow. + """ + x_0, x_T = self.schedule.convert_from_pred(pred, self.prediction_type, x_t, t) + return x_0 if self.timesteps.direction == SamplingDirection.backward else x_T + + def get_progress_bar(self): + """ + Get progress bar for sampling. + """ + return tqdm( + iterable=range(len(self.timesteps) - (0 if self.return_endpoint else 1)), + dynamic_ncols=True, + desc=self.__class__.__name__, + ) diff --git a/modules/seedvr/src/common/diffusion/samplers/euler.py b/modules/seedvr/src/common/diffusion/samplers/euler.py new file mode 100644 index 000000000..185669acb --- /dev/null +++ b/modules/seedvr/src/common/diffusion/samplers/euler.py @@ -0,0 +1,107 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + + +""" +Euler ODE solver. +""" + +from typing import Callable +import torch +from einops import rearrange +from torch.nn import functional as F + +#from ....models.dit_v2 import na + +from ..types import PredictionType +from ..utils import expand_dims +from .base import Sampler, SamplerModelArgs + + +class EulerSampler(Sampler): + """ + The Euler method is the simplest ODE solver. + + """ + + def sample( + self, + x: torch.Tensor, + f: Callable[[SamplerModelArgs], torch.Tensor], + ) -> torch.Tensor: + timesteps = self.timesteps.timesteps + #progress = self.get_progress_bar() + i = 0 + + # Optimisations VRAM + original_dtype = x.dtype + device = x.device + + for t, s in zip(timesteps[:-1], timesteps[1:]): + # Appel du modèle avec monitoring + pred = f(SamplerModelArgs(x, t, i)) + + # Étape suivante + x = self.step_to(pred, x, t, s) + + # Nettoyer les tenseurs temporaires + del pred + + i += 1 + #progress.update() + + if self.return_endpoint: + t = timesteps[-1] + pred = f(SamplerModelArgs(x, t, i)) + x = self.get_endpoint(pred, x, t) + del pred + #progress.update() + + # Restaurer le dtype original si nécessaire + if original_dtype != torch.float16: + x = x.to(original_dtype) + + return x + + def step( + self, + pred: torch.Tensor, + x_t: torch.Tensor, + t: torch.Tensor, + ) -> torch.Tensor: + """ + Step to the next timestep. + """ + return self.step_to(pred, x_t, t, self.get_next_timestep(t)) + + def step_to( + self, + pred: torch.Tensor, + x_t: torch.Tensor, + t: torch.Tensor, + s: torch.Tensor, + ) -> torch.Tensor: + """ + Steps from x_t at timestep t to x_s at timestep s. Returns x_s. + """ + t = expand_dims(t, x_t.ndim) + s = expand_dims(s, x_t.ndim) + T = self.schedule.T + # Step from x_t to x_s. + pred_x_0, pred_x_T = self.schedule.convert_from_pred(pred, self.prediction_type, x_t, t) + pred_x_s = self.schedule.forward(pred_x_0, pred_x_T, s.clamp(0, T)) + # Clamp x_s to x_0 and x_T if s is out of bound. + pred_x_s = pred_x_s.where(s >= 0, pred_x_0) + pred_x_s = pred_x_s.where(s <= T, pred_x_T) + return pred_x_s diff --git a/modules/seedvr/src/common/diffusion/schedules/base.py b/modules/seedvr/src/common/diffusion/schedules/base.py new file mode 100644 index 000000000..bcf6c6b64 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/schedules/base.py @@ -0,0 +1,131 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Schedule base class. +""" + +from abc import ABC, abstractmethod, abstractproperty +from typing import Tuple, Union +import torch + +from ..types import PredictionType +from ..utils import expand_dims + + +class Schedule(ABC): + """ + Diffusion schedules are uniquely defined by T, A, B: + + x_t = A(t) * x_0 + B(t) * x_T, where t in [0, T] + + Schedules can be continuous or discrete. + """ + + @abstractproperty + def T(self) -> Union[int, float]: + """ + Maximum timestep inclusive. + Schedule is continuous if float, discrete if int. + """ + + @abstractmethod + def A(self, t: torch.Tensor) -> torch.Tensor: + """ + Interpolation coefficient A. + Returns tensor with the same shape as t. + """ + + @abstractmethod + def B(self, t: torch.Tensor) -> torch.Tensor: + """ + Interpolation coefficient B. + Returns tensor with the same shape as t. + """ + + # ---------------------------------------------------- + + def snr(self, t: torch.Tensor) -> torch.Tensor: + """ + Signal to noise ratio. + Returns tensor with the same shape as t. + """ + return (self.A(t) ** 2) / (self.B(t) ** 2) + + def isnr(self, snr: torch.Tensor) -> torch.Tensor: + """ + Inverse signal to noise ratio. + Returns tensor with the same shape as snr. + Subclass may implement. + """ + raise NotImplementedError + + # ---------------------------------------------------- + + def is_continuous(self) -> bool: + """ + Whether the schedule is continuous. + """ + return isinstance(self.T, float) + + def forward(self, x_0: torch.Tensor, x_T: torch.Tensor, t: torch.Tensor) -> torch.Tensor: + """ + Diffusion forward function. + """ + t = expand_dims(t, x_0.ndim) + return self.A(t) * x_0 + self.B(t) * x_T + + def convert_from_pred( + self, pred: torch.Tensor, pred_type: PredictionType, x_t: torch.Tensor, t: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Convert from prediction. Return predicted x_0 and x_T. + """ + t = expand_dims(t, x_t.ndim) + A_t = self.A(t) + B_t = self.B(t) + + if pred_type == PredictionType.x_T: + pred_x_T = pred + pred_x_0 = (x_t - B_t * pred_x_T) / A_t + elif pred_type == PredictionType.x_0: + pred_x_0 = pred + pred_x_T = (x_t - A_t * pred_x_0) / B_t + elif pred_type == PredictionType.v_cos: + pred_x_0 = A_t * x_t - B_t * pred + pred_x_T = A_t * pred + B_t * x_t + elif pred_type == PredictionType.v_lerp: + pred_x_0 = (x_t - B_t * pred) / (A_t + B_t) + pred_x_T = (x_t + A_t * pred) / (A_t + B_t) + else: + raise NotImplementedError + + return pred_x_0, pred_x_T + + def convert_to_pred( + self, x_0: torch.Tensor, x_T: torch.Tensor, t: torch.Tensor, pred_type: PredictionType + ) -> torch.FloatTensor: + """ + Convert to prediction target given x_0 and x_T. + """ + if pred_type == PredictionType.x_T: + return x_T + if pred_type == PredictionType.x_0: + return x_0 + if pred_type == PredictionType.v_cos: + t = expand_dims(t, x_0.ndim) + return self.A(t) * x_T - self.B(t) * x_0 + if pred_type == PredictionType.v_lerp: + return x_T - x_0 + raise NotImplementedError diff --git a/modules/seedvr/src/common/diffusion/schedules/lerp.py b/modules/seedvr/src/common/diffusion/schedules/lerp.py new file mode 100644 index 000000000..56b42bc17 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/schedules/lerp.py @@ -0,0 +1,55 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Linear interpolation schedule (lerp). +""" + +from typing import Union +import torch + +from .base import Schedule + + +class LinearInterpolationSchedule(Schedule): + """ + Linear interpolation schedule (lerp) is proposed by flow matching and rectified flow. + It leads to straighter probability flow theoretically. It is also used by Stable Diffusion 3. + + + + x_t = (1 - t) * x_0 + t * x_T + + Can be either continuous or discrete. + """ + + def __init__(self, T: Union[int, float] = 1.0): + self._T = T + + @property + def T(self) -> Union[int, float]: + return self._T + + def A(self, t: torch.Tensor) -> torch.Tensor: + return 1 - (t / self.T) + + def B(self, t: torch.Tensor) -> torch.Tensor: + return t / self.T + + # ---------------------------------------------------- + + def isnr(self, snr: torch.Tensor) -> torch.Tensor: + t = self.T / (1 + snr**0.5) + t = t if self.is_continuous() else t.round().int() + return t diff --git a/modules/seedvr/src/common/diffusion/timesteps/base.py b/modules/seedvr/src/common/diffusion/timesteps/base.py new file mode 100644 index 000000000..d1a598103 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/timesteps/base.py @@ -0,0 +1,72 @@ +from abc import ABC, abstractmethod +from typing import Sequence, Union +import torch + +from ..types import SamplingDirection + + +class Timesteps(ABC): + """ + Timesteps base class. + """ + + def __init__(self, T: Union[int, float]): + assert T > 0 + self._T = T + + @property + def T(self) -> Union[int, float]: + """ + Maximum timestep inclusive. + int if discrete, float if continuous. + """ + return self._T + + def is_continuous(self) -> bool: + """ + Whether the schedule is continuous. + """ + return isinstance(self.T, float) + + +class SamplingTimesteps(Timesteps): + """ + Sampling timesteps. + It defines the discretization of sampling steps. + """ + + def __init__( + self, + T: Union[int, float], + timesteps: torch.Tensor, + direction: SamplingDirection, + ): + assert timesteps.ndim == 1 + super().__init__(T) + self.timesteps = timesteps + self.direction = direction + + def __len__(self) -> int: + """ + Number of sampling steps. + """ + return len(self.timesteps) + + def __getitem__(self, idx: Union[int, torch.IntTensor]) -> torch.Tensor: + """ + The timestep at the sampling step. + Returns a scalar tensor if idx is int, + or tensor of the same size if idx is a tensor. + """ + return self.timesteps[idx] + + def index(self, t: torch.Tensor) -> torch.Tensor: + """ + Find index by t. + Return index of the same shape as t. + Index is -1 if t not found in timesteps. + """ + i, j = t.reshape(-1, 1).eq(self.timesteps).nonzero(as_tuple=True) + idx = torch.full_like(t, fill_value=-1, dtype=torch.int) + idx.view(-1)[i] = j.int() + return idx diff --git a/modules/seedvr/src/common/diffusion/timesteps/sampling/trailing.py b/modules/seedvr/src/common/diffusion/timesteps/sampling/trailing.py new file mode 100644 index 000000000..248d986ae --- /dev/null +++ b/modules/seedvr/src/common/diffusion/timesteps/sampling/trailing.py @@ -0,0 +1,49 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import torch + +from ...types import SamplingDirection +from ..base import SamplingTimesteps + + +class UniformTrailingSamplingTimesteps(SamplingTimesteps): + """ + Uniform trailing sampling timesteps. + Defined in (https://arxiv.org/abs/2305.08891) + + Shift is proposed in SD3 for RF schedule. + Defined in (https://arxiv.org/pdf/2403.03206) eq.23 + """ + + def __init__( + self, + T: int, + steps: int, + shift: float = 1.0, + device: torch.device = "cpu", + ): + # Create trailing timesteps. + timesteps = torch.arange(1.0, 0.0, -1.0 / steps, device=device) + + # Shift timesteps. + timesteps = shift * timesteps / (1 + (shift - 1) * timesteps) + + # Scale to T range. + if isinstance(T, float): + timesteps = timesteps * T + else: + timesteps = timesteps.mul(T + 1).sub(1).round().int() + + super().__init__(T=T, timesteps=timesteps, direction=SamplingDirection.backward) diff --git a/modules/seedvr/src/common/diffusion/types.py b/modules/seedvr/src/common/diffusion/types.py new file mode 100644 index 000000000..076295f2b --- /dev/null +++ b/modules/seedvr/src/common/diffusion/types.py @@ -0,0 +1,59 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Type definitions. +""" + +from enum import Enum + + +class PredictionType(str, Enum): + """ + x_0: + Predict data sample. + x_T: + Predict noise sample. + Proposed by DDPM (https://arxiv.org/abs/2006.11239) + Proved problematic by zsnr paper (https://arxiv.org/abs/2305.08891) + v_cos: + Predict velocity dx/dt based on the cosine schedule (A_t * x_T - B_t * x_0). + Proposed by progressive distillation (https://arxiv.org/abs/2202.00512) + v_lerp: + Predict velocity dx/dt based on the lerp schedule (x_T - x_0). + Proposed by rectified flow (https://arxiv.org/abs/2209.03003) + """ + + x_0 = "x_0" + x_T = "x_T" + v_cos = "v_cos" + v_lerp = "v_lerp" + + +class SamplingDirection(str, Enum): + """ + backward: Sample from x_T to x_0 for data generation. + forward: Sample from x_0 to x_T for noise inversion. + """ + + backward = "backward" + forward = "forward" + + @staticmethod + def reverse(direction): + if direction == SamplingDirection.backward: + return SamplingDirection.forward + if direction == SamplingDirection.forward: + return SamplingDirection.backward + raise NotImplementedError diff --git a/modules/seedvr/src/common/diffusion/utils.py b/modules/seedvr/src/common/diffusion/utils.py new file mode 100644 index 000000000..69d4aec34 --- /dev/null +++ b/modules/seedvr/src/common/diffusion/utils.py @@ -0,0 +1,84 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Utility functions. +""" + +from typing import Callable +import torch + + +def expand_dims(tensor: torch.Tensor, ndim: int): + """ + Expand tensor to target ndim. New dims are added to the right. + For example, if the tensor shape was (8,), target ndim is 4, return (8, 1, 1, 1). + """ + shape = tensor.shape + (1,) * (ndim - tensor.ndim) + return tensor.reshape(shape) + + +def assert_schedule_timesteps_compatible(schedule, timesteps): + """ + Check if schedule and timesteps are compatible. + """ + if schedule.T != timesteps.T: + raise ValueError("Schedule and timesteps must have the same T.") + if schedule.is_continuous() != timesteps.is_continuous(): + raise ValueError("Schedule and timesteps must have the same continuity.") + + +def classifier_free_guidance( + pos: torch.Tensor, + neg: torch.Tensor, + scale: float, + rescale: float = 0.0, +): + """ + Apply classifier-free guidance. + """ + # Classifier-free guidance (https://arxiv.org/abs/2207.12598) + cfg = neg + scale * (pos - neg) + + # Classifier-free guidance rescale (https://arxiv.org/pdf/2305.08891.pdf) + if rescale != 0.0: + pos_std = pos.std(dim=list(range(1, pos.ndim)), keepdim=True) + cfg_std = cfg.std(dim=list(range(1, cfg.ndim)), keepdim=True) + factor = pos_std / cfg_std + factor = rescale * factor + (1 - rescale) + cfg *= factor + + return cfg + + +def classifier_free_guidance_dispatcher( + pos: Callable, + neg: Callable, + scale: float, + rescale: float = 0.0, +): + """ + Optionally execute models depending on classifer-free guidance scale. + """ + # If scale is 1, no need to execute neg model. + if scale == 1.0: + return pos() + + # Otherwise, execute both pos nad neg models and apply cfg. + return classifier_free_guidance( + pos=pos(), + neg=neg(), + scale=scale, + rescale=rescale, + ) diff --git a/modules/seedvr/src/common/distributed/__init__.py b/modules/seedvr/src/common/distributed/__init__.py new file mode 100644 index 000000000..9f53a78eb --- /dev/null +++ b/modules/seedvr/src/common/distributed/__init__.py @@ -0,0 +1,35 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Distributed package. +""" + +from .basic import ( + barrier_if_distributed, + convert_to_ddp, + get_device, + get_global_rank, + get_local_rank, + get_world_size, +) + +__all__ = [ + "barrier_if_distributed", + "convert_to_ddp", + "get_device", + "get_global_rank", + "get_local_rank", + "get_world_size", +] diff --git a/modules/seedvr/src/common/distributed/advanced.py b/modules/seedvr/src/common/distributed/advanced.py new file mode 100644 index 000000000..d2479bebf --- /dev/null +++ b/modules/seedvr/src/common/distributed/advanced.py @@ -0,0 +1,208 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Advanced distributed functions for sequence parallel. +""" + +from typing import Optional, List +import torch +import torch.distributed as dist +from torch.distributed.device_mesh import DeviceMesh, init_device_mesh +from torch.distributed.fsdp import ShardingStrategy + +from .basic import get_global_rank, get_world_size + + +_DATA_PARALLEL_GROUP = None +_SEQUENCE_PARALLEL_GROUP = None +_SEQUENCE_PARALLEL_CPU_GROUP = None +_MODEL_SHARD_CPU_INTER_GROUP = None +_MODEL_SHARD_CPU_INTRA_GROUP = None +_MODEL_SHARD_INTER_GROUP = None +_MODEL_SHARD_INTRA_GROUP = None +_SEQUENCE_PARALLEL_GLOBAL_RANKS = None + + +def get_data_parallel_group() -> Optional[dist.ProcessGroup]: + """ + Get data parallel process group. + """ + return _DATA_PARALLEL_GROUP + + +def get_sequence_parallel_group() -> Optional[dist.ProcessGroup]: + """ + Get sequence parallel process group. + """ + return _SEQUENCE_PARALLEL_GROUP + + +def get_sequence_parallel_cpu_group() -> Optional[dist.ProcessGroup]: + """ + Get sequence parallel CPU process group. + """ + return _SEQUENCE_PARALLEL_CPU_GROUP + + +def get_data_parallel_rank() -> int: + """ + Get data parallel rank. + """ + group = get_data_parallel_group() + return dist.get_rank(group) if group else get_global_rank() + + +def get_data_parallel_world_size() -> int: + """ + Get data parallel world size. + """ + group = get_data_parallel_group() + return dist.get_world_size(group) if group else get_world_size() + + +def get_sequence_parallel_rank() -> int: + """ + Get sequence parallel rank. + """ + group = get_sequence_parallel_group() + return dist.get_rank(group) if group else 0 + + +def get_sequence_parallel_world_size() -> int: + """ + Get sequence parallel world size. + """ + group = get_sequence_parallel_group() + return dist.get_world_size(group) if group else 1 + + +def get_model_shard_cpu_intra_group() -> Optional[dist.ProcessGroup]: + """ + Get the CPU intra process group of model sharding. + """ + return _MODEL_SHARD_CPU_INTRA_GROUP + + +def get_model_shard_cpu_inter_group() -> Optional[dist.ProcessGroup]: + """ + Get the CPU inter process group of model sharding. + """ + return _MODEL_SHARD_CPU_INTER_GROUP + + +def get_model_shard_intra_group() -> Optional[dist.ProcessGroup]: + """ + Get the GPU intra process group of model sharding. + """ + return _MODEL_SHARD_INTRA_GROUP + + +def get_model_shard_inter_group() -> Optional[dist.ProcessGroup]: + """ + Get the GPU inter process group of model sharding. + """ + return _MODEL_SHARD_INTER_GROUP + + +def init_sequence_parallel(sequence_parallel_size: int): + """ + Initialize sequence parallel. + """ + global _DATA_PARALLEL_GROUP + global _SEQUENCE_PARALLEL_GROUP + global _SEQUENCE_PARALLEL_CPU_GROUP + global _SEQUENCE_PARALLEL_GLOBAL_RANKS + assert dist.is_initialized() + world_size = dist.get_world_size() + rank = dist.get_rank() + data_parallel_size = world_size // sequence_parallel_size + for i in range(data_parallel_size): + start_rank = i * sequence_parallel_size + end_rank = (i + 1) * sequence_parallel_size + ranks = range(start_rank, end_rank) + group = dist.new_group(ranks) + cpu_group = dist.new_group(ranks, backend="gloo") + if rank in ranks: + _SEQUENCE_PARALLEL_GROUP = group + _SEQUENCE_PARALLEL_CPU_GROUP = cpu_group + _SEQUENCE_PARALLEL_GLOBAL_RANKS = list(ranks) + + +def init_model_shard_group( + *, + sharding_strategy: ShardingStrategy, + device_mesh: Optional[DeviceMesh] = None, +): + """ + Initialize process group of model sharding. + """ + global _MODEL_SHARD_INTER_GROUP + global _MODEL_SHARD_INTRA_GROUP + global _MODEL_SHARD_CPU_INTER_GROUP + global _MODEL_SHARD_CPU_INTRA_GROUP + assert dist.is_initialized() + world_size = dist.get_world_size() + if device_mesh is not None: + num_shards_per_group = device_mesh.shape[1] + elif sharding_strategy == ShardingStrategy.NO_SHARD: + num_shards_per_group = 1 + elif sharding_strategy in [ + ShardingStrategy.HYBRID_SHARD, + ShardingStrategy._HYBRID_SHARD_ZERO2, + ]: + num_shards_per_group = torch.cuda.device_count() + else: + num_shards_per_group = world_size + num_groups = world_size // num_shards_per_group + device_mesh = (num_groups, num_shards_per_group) + + gpu_mesh_2d = init_device_mesh("cuda", device_mesh, mesh_dim_names=("inter", "intra")) + cpu_mesh_2d = init_device_mesh("cpu", device_mesh, mesh_dim_names=("inter", "intra")) + + _MODEL_SHARD_INTER_GROUP = gpu_mesh_2d.get_group("inter") + _MODEL_SHARD_INTRA_GROUP = gpu_mesh_2d.get_group("intra") + _MODEL_SHARD_CPU_INTER_GROUP = cpu_mesh_2d.get_group("inter") + _MODEL_SHARD_CPU_INTRA_GROUP = cpu_mesh_2d.get_group("intra") + +def get_sequence_parallel_global_ranks() -> List[int]: + """ + Get all global ranks of the sequence parallel process group + that the caller rank belongs to. + """ + if _SEQUENCE_PARALLEL_GLOBAL_RANKS is None: + return [dist.get_rank()] + return _SEQUENCE_PARALLEL_GLOBAL_RANKS + + +def get_next_sequence_parallel_rank() -> int: + """ + Get the next global rank of the sequence parallel process group + that the caller rank belongs to. + """ + sp_global_ranks = get_sequence_parallel_global_ranks() + sp_rank = get_sequence_parallel_rank() + sp_size = get_sequence_parallel_world_size() + return sp_global_ranks[(sp_rank + 1) % sp_size] + + +def get_prev_sequence_parallel_rank() -> int: + """ + Get the previous global rank of the sequence parallel process group + that the caller rank belongs to. + """ + sp_global_ranks = get_sequence_parallel_global_ranks() + sp_rank = get_sequence_parallel_rank() + sp_size = get_sequence_parallel_world_size() + return sp_global_ranks[(sp_rank + sp_size - 1) % sp_size] diff --git a/modules/seedvr/src/common/distributed/basic.py b/modules/seedvr/src/common/distributed/basic.py new file mode 100644 index 000000000..d880009c9 --- /dev/null +++ b/modules/seedvr/src/common/distributed/basic.py @@ -0,0 +1,67 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Distributed basic functions. +""" + +import os +import torch + + +def get_global_rank() -> int: + """ + Get the global rank, the global index of the GPU. + """ + return int(os.environ.get("RANK", "0")) + + +def get_local_rank() -> int: + """ + Get the local rank, the local index of the GPU. + """ + return int(os.environ.get("LOCAL_RANK", "0")) + + +def get_world_size() -> int: + """ + Get the world size, the total amount of GPUs. + """ + return int(os.environ.get("WORLD_SIZE", "1")) + + +def get_device() -> torch.device: + """ + Get current rank device. + """ + return torch.device("cuda", get_local_rank()) + + +def barrier_if_distributed(*args, **kwargs): + """ + Synchronizes all processes if under distributed context. + """ + import torch.distributed as dist + if dist.is_initialized(): + return dist.barrier(*args, **kwargs) + + +def convert_to_ddp(module: torch.nn.Module, **kwargs): + from torch.nn.parallel import DistributedDataParallel + return DistributedDataParallel( + module=module, + device_ids=[get_local_rank()], + output_device=get_local_rank(), + **kwargs, + ) diff --git a/modules/seedvr/src/common/distributed/meta_init_utils.py b/modules/seedvr/src/common/distributed/meta_init_utils.py new file mode 100644 index 000000000..794cd0b81 --- /dev/null +++ b/modules/seedvr/src/common/distributed/meta_init_utils.py @@ -0,0 +1,41 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import torch +from rotary_embedding_torch import RotaryEmbedding +from torch import nn +from torch.distributed.fsdp._common_utils import _is_fsdp_flattened + +__all__ = ["meta_non_persistent_buffer_init_fn"] + + +def meta_non_persistent_buffer_init_fn(module: nn.Module) -> nn.Module: + """ + Used for materializing `non-persistent tensor buffers` while model resuming. + + Since non-persistent tensor buffers are not saved in state_dict, + when initializing model with meta device, user should materialize those buffers manually. + + Currently, only `rope.dummy` is this special case. + """ + with torch.no_grad(): + for submodule in module.modules(): + if not isinstance(submodule, RotaryEmbedding): + continue + for buffer_name, buffer in submodule.named_buffers(recurse=False): + if buffer.is_meta and "dummy" in buffer_name: + materialized_buffer = torch.zeros_like(buffer, device="cpu") + setattr(submodule, buffer_name, materialized_buffer) + assert not any(b.is_meta for n, b in module.named_buffers()) + return module diff --git a/modules/seedvr/src/common/distributed/ops.py b/modules/seedvr/src/common/distributed/ops.py new file mode 100644 index 000000000..7c9256706 --- /dev/null +++ b/modules/seedvr/src/common/distributed/ops.py @@ -0,0 +1,494 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Distributed ops for supporting sequence parallel. +""" + +from collections import defaultdict +from typing import Any, Callable, Dict, List, Optional, Tuple, Union +import torch +import torch.distributed as dist +from torch import Tensor + +from ..cache import Cache +from .advanced import ( + get_sequence_parallel_group, + get_sequence_parallel_rank, + get_sequence_parallel_world_size, +) + +from .basic import get_device + +_SEQ_DATA_BUF = defaultdict(lambda: [None, None, None]) +_SEQ_DATA_META_SHAPES = defaultdict() +_SEQ_DATA_META_DTYPES = defaultdict() +_SEQ_DATA_ASYNC_COMMS = defaultdict(list) +_SYNC_BUFFER = defaultdict(dict) + + +def single_all_to_all( + local_input: Tensor, + scatter_dim: int, + gather_dim: int, + group: dist.ProcessGroup, + async_op: bool = False, +): + """ + A function to do all-to-all on a tensor + """ + seq_world_size = dist.get_world_size(group) + prev_scatter_dim = scatter_dim + if scatter_dim != 0: + local_input = local_input.transpose(0, scatter_dim) + if gather_dim == 0: + gather_dim = scatter_dim + scatter_dim = 0 + + inp_shape = list(local_input.shape) + inp_shape[scatter_dim] = inp_shape[scatter_dim] // seq_world_size + input_t = local_input.reshape( + [seq_world_size, inp_shape[scatter_dim]] + inp_shape[scatter_dim + 1 :] + ).contiguous() + output = torch.empty_like(input_t) + comm = dist.all_to_all_single(output, input_t, group=group, async_op=async_op) + if async_op: + # let user's code transpose & reshape + return output, comm, prev_scatter_dim + + # first dim is seq_world_size, so we can split it directly + output = torch.cat(output.split(1), dim=gather_dim + 1).squeeze(0) + if prev_scatter_dim: + output = output.transpose(0, prev_scatter_dim).contiguous() + return output + + +def _all_to_all( + local_input: Tensor, + scatter_dim: int, + gather_dim: int, + group: dist.ProcessGroup, +): + seq_world_size = dist.get_world_size(group) + input_list = [ + t.contiguous() for t in torch.tensor_split(local_input, seq_world_size, scatter_dim) + ] + output_list = [torch.empty_like(input_list[0]) for _ in range(seq_world_size)] + dist.all_to_all(output_list, input_list, group=group) + return torch.cat(output_list, dim=gather_dim).contiguous() + + +class SeqAllToAll(torch.autograd.Function): + @staticmethod + def forward( + ctx: Any, + group: dist.ProcessGroup, + local_input: Tensor, + scatter_dim: int, + gather_dim: int, + async_op: bool, + ) -> Tensor: + ctx.group = group + ctx.scatter_dim = scatter_dim + ctx.gather_dim = gather_dim + ctx.async_op = async_op + if async_op: + output, comm, prev_scatter_dim = single_all_to_all( + local_input, scatter_dim, gather_dim, group, async_op=async_op + ) + ctx.prev_scatter_dim = prev_scatter_dim + return output, comm + + return _all_to_all(local_input, scatter_dim, gather_dim, group) + + @staticmethod + def backward(ctx: Any, *grad_output: Tensor) -> Tuple[None, Tensor, None, None]: + if ctx.async_op: + input_t = torch.cat(grad_output[0].split(1), dim=ctx.gather_dim + 1).squeeze(0) + if ctx.prev_scatter_dim: + input_t = input_t.transpose(0, ctx.prev_scatter_dim) + else: + input_t = grad_output[0] + return ( + None, + _all_to_all(input_t, ctx.gather_dim, ctx.scatter_dim, ctx.group), + None, + None, + None, + ) + + +class Slice(torch.autograd.Function): + @staticmethod + def forward(ctx: Any, group: dist.ProcessGroup, local_input: Tensor, dim: int) -> Tensor: + ctx.group = group + ctx.rank = dist.get_rank(group) + seq_world_size = dist.get_world_size(group) + ctx.seq_world_size = seq_world_size + ctx.dim = dim + dim_size = local_input.shape[dim] + return local_input.split(dim_size // seq_world_size, dim=dim)[ctx.rank].contiguous() + + @staticmethod + def backward(ctx: Any, grad_output: Tensor) -> Tuple[None, Tensor, None]: + dim_size = list(grad_output.size()) + split_size = dim_size[0] + dim_size[0] = dim_size[0] * ctx.seq_world_size + output = torch.empty(dim_size, dtype=grad_output.dtype, device=torch.cuda.current_device()) + dist._all_gather_base(output, grad_output, group=ctx.group) + return (None, torch.cat(output.split(split_size), dim=ctx.dim), None) + + +class Gather(torch.autograd.Function): + @staticmethod + def forward( + ctx: Any, + group: dist.ProcessGroup, + local_input: Tensor, + dim: int, + grad_scale: Optional[bool] = False, + ) -> Tensor: + ctx.group = group + ctx.rank = dist.get_rank(group) + ctx.dim = dim + ctx.grad_scale = grad_scale + seq_world_size = dist.get_world_size(group) + ctx.seq_world_size = seq_world_size + dim_size = list(local_input.size()) + split_size = dim_size[0] + ctx.part_size = dim_size[dim] + dim_size[0] = dim_size[0] * seq_world_size + output = torch.empty(dim_size, dtype=local_input.dtype, device=torch.cuda.current_device()) + dist._all_gather_base(output, local_input.contiguous(), group=ctx.group) + return torch.cat(output.split(split_size), dim=dim) + + @staticmethod + def backward(ctx: Any, grad_output: Tensor) -> Tuple[None, Tensor]: + if ctx.grad_scale: + grad_output = grad_output * ctx.seq_world_size + return ( + None, + grad_output.split(ctx.part_size, dim=ctx.dim)[ctx.rank].contiguous(), + None, + None, + ) + + +def gather_seq_scatter_heads_qkv( + qkv_tensor: Tensor, + *, + seq_dim: int, + qkv_shape: Optional[Tensor] = None, + cache: Cache = Cache(disable=True), + restore_shape: bool = True, +): + """ + A func to sync splited qkv tensor + qkv_tensor: the tensor we want to do alltoall with. The last dim must + be the projection_idx, which we will split into 3 part. After + spliting, the gather idx will be projecttion_idx + 1 + seq_dim: gather_dim for all2all comm + restore_shape: if True, output will has the same shape length as input + """ + group = get_sequence_parallel_group() + if not group: + return qkv_tensor + world = get_sequence_parallel_world_size() + orig_shape = qkv_tensor.shape + scatter_dim = qkv_tensor.dim() + bef_all2all_shape = list(orig_shape) + qkv_proj_dim = bef_all2all_shape[-1] + bef_all2all_shape = bef_all2all_shape[:-1] + [3, qkv_proj_dim // 3] + qkv_tensor = qkv_tensor.view(bef_all2all_shape) + qkv_tensor = SeqAllToAll.apply(group, qkv_tensor, scatter_dim, seq_dim, False) + if restore_shape: + out_shape = list(orig_shape) + out_shape[seq_dim] *= world + out_shape[-1] = qkv_proj_dim // world + qkv_tensor = qkv_tensor.view(out_shape) + + # remove padding + if qkv_shape is not None: + unpad_dim_size = cache( + "unpad_dim_size", lambda: torch.sum(torch.prod(qkv_shape, dim=-1)).item() + ) + if unpad_dim_size % world != 0: + padding_size = qkv_tensor.size(seq_dim) - unpad_dim_size + qkv_tensor = _unpad_tensor(qkv_tensor, seq_dim, padding_size) + return qkv_tensor + + +def slice_inputs(x: Tensor, dim: int, padding: bool = True): + """ + A func to slice the input sequence in sequence parallel + """ + group = get_sequence_parallel_group() + if group is None: + return x + sp_rank = get_sequence_parallel_rank() + sp_world = get_sequence_parallel_world_size() + dim_size = x.shape[dim] + unit = (dim_size + sp_world - 1) // sp_world + if padding and dim_size % sp_world: + padding_size = sp_world - (dim_size % sp_world) + x = _pad_tensor(x, dim, padding_size) + slc = [slice(None)] * len(x.shape) + slc[dim] = slice(unit * sp_rank, unit * (sp_rank + 1)) + return x[slc] + + +def remove_seqeunce_parallel_padding(x: Tensor, dim: int, unpad_dim_size: int): + """ + A func to remove the padding part of the tensor based on its original shape + """ + group = get_sequence_parallel_group() + if group is None: + return x + sp_world = get_sequence_parallel_world_size() + if unpad_dim_size % sp_world == 0: + return x + padding_size = sp_world - (unpad_dim_size % sp_world) + assert (padding_size + unpad_dim_size) % sp_world == 0 + return _unpad_tensor(x, dim=dim, padding_size=padding_size) + + +def gather_heads_scatter_seq(x: Tensor, head_dim: int, seq_dim: int) -> Tensor: + """ + A func to sync attention result with alltoall in sequence parallel + """ + group = get_sequence_parallel_group() + if not group: + return x + dim_size = x.size(seq_dim) + sp_world = get_sequence_parallel_world_size() + if dim_size % sp_world != 0: + padding_size = sp_world - (dim_size % sp_world) + x = _pad_tensor(x, seq_dim, padding_size) + return SeqAllToAll.apply(group, x, seq_dim, head_dim, False) + + +def gather_seq_scatter_heads(x: Tensor, seq_dim: int, head_dim: int) -> Tensor: + """ + A func to sync embedding input with alltoall in sequence parallel + """ + group = get_sequence_parallel_group() + if not group: + return x + return SeqAllToAll.apply(group, x, head_dim, seq_dim, False) + + +def scatter_heads(x: Tensor, dim: int) -> Tensor: + """ + A func to split heads before attention in sequence parallel + """ + group = get_sequence_parallel_group() + if not group: + return x + return Slice.apply(group, x, dim) + + +def gather_heads(x: Tensor, dim: int, grad_scale: Optional[bool] = False) -> Tensor: + """ + A func to gather heads for the attention result in sequence parallel + """ + group = get_sequence_parallel_group() + if not group: + return x + return Gather.apply(group, x, dim, grad_scale) + + +def gather_outputs( + x: Tensor, + *, + gather_dim: int, + padding_dim: Optional[int] = None, + unpad_shape: Optional[Tensor] = None, + cache: Cache = Cache(disable=True), + scale_grad=True, +): + """ + A func to gather the outputs for the model result in sequence parallel + """ + group = get_sequence_parallel_group() + if not group: + return x + x = Gather.apply(group, x, gather_dim, scale_grad) + if padding_dim is not None: + unpad_dim_size = cache( + "unpad_dim_size", lambda: torch.sum(torch.prod(unpad_shape, dim=1)).item() + ) + x = remove_seqeunce_parallel_padding(x, padding_dim, unpad_dim_size) + return x + + +def _pad_tensor(x: Tensor, dim: int, padding_size: int): + shape = list(x.shape) + shape[dim] = padding_size + pad = torch.zeros(shape, dtype=x.dtype, device=x.device) + return torch.cat([x, pad], dim=dim) + + +def _unpad_tensor(x: Tensor, dim: int, padding_size): + slc = [slice(None)] * len(x.shape) + slc[dim] = slice(0, -padding_size) + return x[slc] + + +def _broadcast_data(data, shape, dtype, src, group, async_op): + comms = [] + if isinstance(data, (list, tuple)): + for i, sub_shape in enumerate(shape): + comms += _broadcast_data(data[i], sub_shape, dtype[i], src, group, async_op) + elif isinstance(data, dict): + for key, sub_data in data.items(): + comms += _broadcast_data(sub_data, shape[key], dtype[key], src, group, async_op) + elif isinstance(data, Tensor): + comms.append(dist.broadcast(data, src=src, group=group, async_op=async_op)) + return comms + + +def _traverse(data: Any, op: Callable) -> Union[None, List, Dict, Any]: + if isinstance(data, (list, tuple)): + return [_traverse(sub_data, op) for sub_data in data] + elif isinstance(data, dict): + return {key: _traverse(sub_data, op) for key, sub_data in data.items()} + elif isinstance(data, Tensor): + return op(data) + else: + return None + + +def _get_shapes(data): + return _traverse(data, op=lambda x: x.shape) + + +def _get_dtypes(data): + return _traverse(data, op=lambda x: x.dtype) + + +def _construct_broadcast_buffer(shapes, dtypes, device): + if isinstance(shapes, torch.Size): + return torch.empty(shapes, dtype=dtypes, device=device) + + if isinstance(shapes, (list, tuple)): + buffer = [] + for i, sub_shape in enumerate(shapes): + buffer.append(_construct_broadcast_buffer(sub_shape, dtypes[i], device)) + elif isinstance(shapes, dict): + buffer = {} + for key, sub_shape in shapes.items(): + buffer[key] = _construct_broadcast_buffer(sub_shape, dtypes[key], device) + else: + return None + return buffer + + +class SPDistForward: + """A forward tool to sync different result across sp group + + Args: + module: a function or module to process users input + sp_step: current training step to judge which rank to broadcast its result to all + name: a distinct str to save meta and async comm + comm_shape: if different ranks have different shape, mark this arg to True + device: the device for current rank, can be empty + """ + + def __init__( + self, + name: str, + comm_shape: bool, + device: torch.device = None, + ): + self.name = name + self.comm_shape = comm_shape + if device: + self.device = device + else: + self.device = get_device() + + def __call__(self, inputs) -> Any: + group = get_sequence_parallel_group() + if not group: + yield inputs + else: + device = self.device + sp_world = get_sequence_parallel_world_size() + sp_rank = get_sequence_parallel_rank() + for local_step in range(sp_world): + src_rank = dist.get_global_rank(group, local_step) + is_src = sp_rank == local_step + local_shapes = [] + local_dtypes = [] + if local_step == 0: + local_result = inputs + _SEQ_DATA_BUF[self.name][-1] = local_result + local_shapes = _get_shapes(local_result) + local_dtypes = _get_dtypes(local_result) + if self.comm_shape: + group_shapes_lists = [None] * sp_world + dist.all_gather_object(group_shapes_lists, local_shapes, group=group) + _SEQ_DATA_META_SHAPES[self.name] = group_shapes_lists + else: + _SEQ_DATA_META_SHAPES[self.name] = [local_shapes] * sp_world + _SEQ_DATA_META_DTYPES[self.name] = local_dtypes + shapes = _SEQ_DATA_META_SHAPES[self.name][local_step] + dtypes = _SEQ_DATA_META_DTYPES[self.name] + buf_id = local_step % 2 + if local_step == 0: + sync_data = ( + local_result + if is_src + else _construct_broadcast_buffer(shapes, dtypes, device) + ) + _broadcast_data(sync_data, shapes, dtypes, src_rank, group, False) + _SEQ_DATA_BUF[self.name][buf_id] = sync_data + + # wait for async comm ops + if _SEQ_DATA_ASYNC_COMMS[self.name]: + for comm in _SEQ_DATA_ASYNC_COMMS[self.name]: + comm.wait() + # before return the sync result, do async broadcast for next batch + if local_step < sp_world - 1: + next_buf_id = 1 - buf_id + shapes = _SEQ_DATA_META_SHAPES[self.name][local_step + 1] + src_rank = dist.get_global_rank(group, local_step + 1) + is_src = sp_rank == local_step + 1 + next_sync_data = ( + _SEQ_DATA_BUF[self.name][-1] + if is_src + else _construct_broadcast_buffer(shapes, dtypes, device) + ) + _SEQ_DATA_ASYNC_COMMS[self.name] = _broadcast_data( + next_sync_data, shapes, dtypes, src_rank, group, True + ) + _SEQ_DATA_BUF[self.name][next_buf_id] = next_sync_data + yield _SEQ_DATA_BUF[self.name][buf_id] + + +sync_inputs = SPDistForward(name="bef_fwd", comm_shape=True) + + +def sync_data(data, sp_idx, name="tmp"): + group = get_sequence_parallel_group() + if group is None: + return data + # if sp_idx in _SYNC_BUFFER[name]: + # return _SYNC_BUFFER[name][sp_idx] + sp_rank = get_sequence_parallel_rank() + src_rank = dist.get_global_rank(group, sp_idx) + objects = [data] if sp_rank == sp_idx else [None] + dist.broadcast_object_list(objects, src=src_rank, group=group) + # _SYNC_BUFFER[name] = {sp_idx: objects[0]} + return objects[0] diff --git a/modules/seedvr/src/common/half_precision_fixes.py b/modules/seedvr/src/common/half_precision_fixes.py new file mode 100644 index 000000000..285f336c7 --- /dev/null +++ b/modules/seedvr/src/common/half_precision_fixes.py @@ -0,0 +1,61 @@ +import torch.nn.functional as F + + +def safe_pad_operation(x, padding, mode='constant', value=0.0): + """Safe padding operation that handles Half precision only for problematic modes""" + # Modes qui nécessitent le fix Half precision + problematic_modes = ['replicate', 'reflect', 'circular'] + + if mode in problematic_modes: + try: + return F.pad(x, padding, mode=mode, value=value) + except RuntimeError as e: + if "not implemented for 'Half'" in str(e): + original_dtype = x.dtype + return F.pad(x.float(), padding, mode=mode, value=value).to(original_dtype) + else: + raise e + else: + # Pour 'constant' et autres modes compatibles, pas de fix nécessaire + return F.pad(x, padding, mode=mode, value=value) + + +def safe_interpolate_operation(x, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None): + """Safe interpolate operation that handles Half precision for problematic modes""" + # Modes qui peuvent causer des problèmes avec Half precision + problematic_modes = ['bilinear', 'bicubic', 'trilinear'] + + if mode in problematic_modes: + try: + return F.interpolate( + x, + size=size, + scale_factor=scale_factor, + mode=mode, + align_corners=align_corners, + recompute_scale_factor=recompute_scale_factor + ) + except RuntimeError as e: + if ("not implemented for 'Half'" in str(e) or + "compute_indices_weights" in str(e)): + original_dtype = x.dtype + return F.interpolate( + x.float(), + size=size, + scale_factor=scale_factor, + mode=mode, + align_corners=align_corners, + recompute_scale_factor=recompute_scale_factor + ).to(original_dtype) + else: + raise e + else: + # Pour 'nearest' et autres modes compatibles, pas de fix nécessaire + return F.interpolate( + x, + size=size, + scale_factor=scale_factor, + mode=mode, + align_corners=align_corners, + recompute_scale_factor=recompute_scale_factor + ) diff --git a/modules/seedvr/src/common/logger.py b/modules/seedvr/src/common/logger.py new file mode 100644 index 000000000..ada368e79 --- /dev/null +++ b/modules/seedvr/src/common/logger.py @@ -0,0 +1,44 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Logging utility functions. +""" + +import logging +import sys +from typing import Optional + +from .distributed import get_global_rank, get_local_rank, get_world_size + +_default_handler = logging.StreamHandler(sys.stdout) +_default_handler.setFormatter( + logging.Formatter( + "%(asctime)s " + + (f"[Rank:{get_global_rank()}]" if get_world_size() > 1 else "") + + (f"[LocalRank:{get_local_rank()}]" if get_world_size() > 1 else "") + + "[%(threadName).12s][%(name)s][%(levelname).5s] " + + "%(message)s" + ) +) + + +def get_logger(name: Optional[str] = None) -> logging.Logger: + """ + Get a logger. + """ + logger = logging.getLogger(name) + logger.addHandler(_default_handler) + logger.setLevel(logging.INFO) + return logger diff --git a/modules/seedvr/src/common/partition.py b/modules/seedvr/src/common/partition.py new file mode 100644 index 000000000..648c87fe2 --- /dev/null +++ b/modules/seedvr/src/common/partition.py @@ -0,0 +1,59 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +""" +Partition utility functions. +""" + +from typing import Any, List + + +def partition_by_size(data: List[Any], size: int) -> List[List[Any]]: + """ + Partition a list by size. + When indivisible, the last group contains fewer items than the target size. + + Examples: + - data: [1,2,3,4,5] + - size: 2 + - return: [[1,2], [3,4], [5]] + """ + assert size > 0 + return [data[i : (i + size)] for i in range(0, len(data), size)] + + +def partition_by_groups(data: List[Any], groups: int) -> List[List[Any]]: + """ + Partition a list by groups. + When indivisible, some groups may have more items than others. + + Examples: + - data: [1,2,3,4,5] + - groups: 2 + - return: [[1,3,5], [2,4]] + """ + assert groups > 0 + return [data[i::groups] for i in range(groups)] + + +def shift_list(data: List[Any], n: int) -> List[Any]: + """ + Rotate a list by n elements. + + Examples: + - data: [1,2,3,4,5] + - n: 3 + - return: [4,5,1,2,3] + """ + return data[(n % len(data)) :] + data[: (n % len(data))] diff --git a/modules/seedvr/src/common/seed.py b/modules/seedvr/src/common/seed.py new file mode 100644 index 000000000..f00e33db6 --- /dev/null +++ b/modules/seedvr/src/common/seed.py @@ -0,0 +1,30 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import random +from typing import Optional +import numpy as np +import torch + +from .distributed import get_global_rank + + +def set_seed(seed: Optional[int], same_across_ranks: bool = False): + """Function that sets the seed for pseudo-random number generators.""" + if seed is not None: + seed += get_global_rank() if not same_across_ranks else 0 + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + diff --git a/modules/seedvr/src/core/__init__.py b/modules/seedvr/src/core/__init__.py new file mode 100644 index 000000000..271ba39b8 --- /dev/null +++ b/modules/seedvr/src/core/__init__.py @@ -0,0 +1,47 @@ +""" +Core Module for SeedVR2 + +Contains the main business logic and model management functionality: +- Model configuration and loading +- Architecture detection and memory estimation +- Runner creation and management +- Generation pipeline and logic +""" +''' +from .model_manager import ( + configure_runner, + load_quantized_state_dict, + configure_dit_model_inference, + configure_vae_model_inference, +) + +from .generation import ( + generation_step, + generation_loop, + cut_videos, + prepare_video_transforms, + load_text_embeddings, + calculate_optimal_batch_params +) + +from .infer import VideoDiffusionInfer + +__all__ = [ + # Model management + 'configure_runner', + 'load_quantized_state_dict', + 'configure_dit_model_inference', + 'configure_vae_model_inference', + + # Generation logic + 'generation_step', + 'generation_loop', + 'cut_videos', + 'prepare_video_transforms', + 'load_text_embeddings', + 'calculate_optimal_batch_params', + + # Infer + 'VideoDiffusionInfer' +] +''' diff --git a/modules/seedvr/src/core/generation.py b/modules/seedvr/src/core/generation.py new file mode 100644 index 000000000..daac4020f --- /dev/null +++ b/modules/seedvr/src/core/generation.py @@ -0,0 +1,365 @@ +import torch +from torchvision.transforms import Compose, Lambda, Normalize + +from src.optimization.performance import optimized_video_rearrange, optimized_single_video_rearrange, optimized_sample_to_image_format +from src.common.seed import set_seed +from src.data.image.transforms.divisible_crop import DivisibleCrop +from src.data.image.transforms.na_resize import NaResize +from src.utils.color_fix import wavelet_reconstruction + + + +def generation_step(runner, text_embeds_dict, cond_latents, temporal_overlap, device): + """ + Execute a single generation step with adaptive dtype handling + + Args: + runner: VideoDiffusionInfer instance + text_embeds_dict (dict): Text embeddings for positive and negative prompts + cond_latents (list): Conditional latents for generation + temporal_overlap (int): Number of frames for temporal overlap + + Returns: + tuple: (samples, last_latents) for potential temporal continuation + + Features: + - Adaptive dtype detection (FP8/FP16/BFloat16) + - Optimal autocast configuration for each model type + - Memory-efficient noise generation and reuse + - Automatic device placement with dtype preservation + - Advanced inference optimization + """ + # Adaptive dtype detection for optimal performance + model_dtype = next(runner.dit.parameters()).dtype + + # Configure dtypes according to model architecture + if model_dtype in (torch.float8_e4m3fn, torch.float8_e5m2): + # FP8 native: use BFloat16 for intermediate calculations (optimal compatibility) + dtype = torch.bfloat16 + elif model_dtype == torch.float16: + dtype = torch.float16 + else: + dtype = torch.bfloat16 + + def _move_to_cuda(x): + """Move tensors to CUDA with adaptive optimal dtype""" + return [i.to(device, dtype=dtype) for i in x] + + # Memory optimization: Generate noise once and reuse to save VRAM + with torch.cuda.device(device): + base_noise = torch.randn_like(cond_latents[0], dtype=dtype) + noises = [base_noise] + aug_noises = [base_noise * 0.1 + torch.randn_like(base_noise) * 0.05] + + # Move tensors with adaptive dtype (optimized for FP8/FP16/BFloat16) + noises, aug_noises, cond_latents = _move_to_cuda(noises), _move_to_cuda(aug_noises), _move_to_cuda(cond_latents) + + cond_noise_scale = 0.0 + + def _add_noise(x, aug_noise): + # Use adaptive optimal dtype + t = ( + torch.tensor([1000.0], device=device, dtype=dtype) + * cond_noise_scale + ) + shape = torch.tensor(x.shape[1:], device=device)[None] + t = runner.timestep_transform(t, shape) + x = runner.schedule.forward(x, aug_noise, t) + return x + + # Generate conditions with memory optimization + runner.dit.to(device=device) + condition = runner.get_condition( + noises[0], + task="sr", + latent_blur=_add_noise(cond_latents[0], aug_noises[0]), + ) + conditions = [condition] + + # Use adaptive autocast for optimal performance + with torch.no_grad(): + video_tensors = runner.inference( + noises=noises, + conditions=conditions, + temporal_overlap=temporal_overlap, + **text_embeds_dict, + ) + + # Process samples with advanced optimization + samples = optimized_video_rearrange(video_tensors) + noises = noises[0].to("cpu") + aug_noises = aug_noises[0].to("cpu") + cond_latents = cond_latents[0].to("cpu") + conditions = conditions[0].to("cpu") + condition = condition.to("cpu") + + return samples #, last_latents + + +def cut_videos(videos): + t = videos.size(1) + + if t % 4 == 1: + return videos + + padding_needed = (4 - (t % 4)) % 4 + 1 + last_frame = videos[:, -1:].expand(-1, padding_needed, -1, -1).contiguous() + result = torch.cat([videos, last_frame], dim=1) + return result + + +def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_size=90, temporal_overlap=0, progress_callback=None, device:str='cpu'): + """ + Main generation loop with context-aware temporal processing + + Args: + runner: VideoDiffusionInfer instance + images (torch.Tensor): Input images for upscaling + cfg_scale (float): Classifier-free guidance scale + seed (int): Random seed for reproducibility + res_w (int): Target resolution width + batch_size (int): Batch size for processing + temporal_overlap (int): Frames for temporal continuity + progress_callback (callable): Optional callback for progress reporting + + Returns: + torch.Tensor: Generated video frames + + Features: + - Context-aware generation with temporal overlap + - Adaptive dtype pipeline (FP8/FP16/BFloat16) + - Memory-optimized batch processing + - Advanced video transformation pipeline + - Intelligent VRAM management throughout process + - Real-time progress reporting + """ + + model_dtype = None + model_dtype = next(runner.dit.parameters()).dtype + compute_dtype = model_dtype + + # Configure classifier-free guidance + runner.config.diffusion.cfg.scale = cfg_scale + runner.config.diffusion.cfg.rescale = 0.0 + # Configure sampling steps + runner.config.diffusion.timesteps.sampling.steps = 1 + runner.configure_diffusion() + + # Set random seed + set_seed(seed) + + # Advanced video transformation pipeline + video_transform = Compose([ + NaResize( + resolution=(res_w), + mode="side", + downsample_only=False, + ), + Lambda(lambda x: torch.clamp(x, 0.0, 1.0)), + DivisibleCrop((16, 16)), + Normalize(0.5, 0.5), + Lambda(lambda x: x.permute(1, 0, 2, 3)), # t c h w -> c t h w (faster than Rearrange) + ]) + + # Initialize generation state + batch_samples = [] + + # Load text embeddings with adaptive dtype + text_embeds = {"texts_pos": [runner.text_pos_embeds], "texts_neg": [runner.text_neg_embeds]} + + # Calculate processing parameters + step = batch_size - temporal_overlap + if step <= 0: + step = batch_size + temporal_overlap = 0 + + # Calculate total batches for progress reporting + total_batches = len(range(0, len(images), step)) + + # Main processing loop with context awareness + for batch_count, batch_idx in enumerate(range(0, len(images), step)): + # Calculate batch indices with overlap + if batch_idx == 0: + # First batch: no overlap + start_idx = 0 + end_idx = min(batch_size, len(images)) + effective_batch_size = end_idx - start_idx + else: + # Subsequent batches: temporal overlap + start_idx = batch_idx + end_idx = min(start_idx + batch_size, len(images)) + effective_batch_size = end_idx - start_idx + if effective_batch_size <= temporal_overlap: + break # Not enough new frames, stop + + current_frames = end_idx - start_idx + + # Process current batch + video = images[start_idx:end_idx] + # Use adaptive computation dtype + video = video.permute(0, 3, 1, 2).to(device, dtype=compute_dtype) + + # Apply video transformations with memory optimization + transformed_video = video_transform(video) + del video + #video = video.to("cpu") + #del video + ori_lengths = [transformed_video.size(1)] + + # Handle correct format: frames % 4 == 1 + t = transformed_video.size(1) + + if len(images) >= 5 and t % 4 != 1: + transformed_video = cut_videos(transformed_video) + + # Context-aware temporal strategy + # First batch: standard complete diffusion + cond_latents = runner.vae_encode([transformed_video]) + + # Normal generation + samples = generation_step(runner, text_embeds, cond_latents=cond_latents, temporal_overlap=temporal_overlap, device=device) + #del cond_latents + del cond_latents + + # Post-process samples + sample = samples[0] + del samples + #del samples + if ori_lengths[0] < sample.shape[0]: + sample = sample[:ori_lengths[0]] + + # Apply color correction if available + transformed_video = transformed_video.to(device) + + input_video = [optimized_single_video_rearrange(transformed_video)] + del transformed_video + sample = wavelet_reconstruction(sample, input_video[0][:sample.size(0)]) + del input_video + + # Convert to final image format + sample = optimized_sample_to_image_format(sample) + sample = sample.clip(-1, 1).mul_(0.5).add_(0.5) + sample_cpu = sample.to(torch.float16).to("cpu") + del sample + batch_samples.append(sample_cpu) + #del sample + + # Aggressive cleanup after each batch + # Progress callback - batch start + if progress_callback: + progress_callback(batch_count+1, total_batches, current_frames, "Processing batch...") + + runner.vae.to(device="cpu") + runner.dit.to(device="cpu") + # OPTIMISATION ULTIME : Pré-allocation et copie directe (évite les torch.cat multiples) + + # 1. Calculer la taille totale finale + total_frames = sum(batch.shape[0] for batch in batch_samples) + if len(batch_samples) > 0: + sample_shape = batch_samples[0].shape + H, W, C = sample_shape[1], sample_shape[2], sample_shape[3] + + # 2. Pré-allouer le tensor final directement sur CPU (évite concatenations) + final_video_images = torch.empty((total_frames, H, W, C), dtype=torch.float16) + + # 3. Copier par blocs directement dans le tensor final + block_size = 500 + current_idx = 0 + + for block_start in range(0, len(batch_samples), block_size): + block_end = min(block_start + block_size, len(batch_samples)) + + # Charger le bloc en VRAM + current_block = [] + for i in range(block_start, block_end): + current_block.append(batch_samples[i].to(device)) + + # Concatener en VRAM (rapide) + block_result = torch.cat(current_block, dim=0) + + # Convertir en Float16 sur GPU + #if block_result.dtype != torch.float16: + # block_result = block_result.to(torch.float16) + + # Copier directement dans le tensor final (pas de concatenation!) + block_frames = block_result.shape[0] + final_video_images[current_idx:current_idx + block_frames] = block_result.to("cpu") + current_idx += block_frames + + # Nettoyage immédiat VRAM + del current_block, block_result + else: + print("SeedVR2: No batch_samples to process") + final_video_images = torch.empty((0, 0, 0, 0), dtype=torch.float16) + + # Cleanup batch_samples + #del batch_samples + return final_video_images + + +def prepare_video_transforms(res_w): + """ + Prepare optimized video transformation pipeline + + Args: + res_w (int): Target resolution width + + Returns: + Compose: Configured transformation pipeline + + Features: + - Resolution-aware upscaling (no downsampling) + - Proper normalization for model compatibility + - Memory-efficient tensor operations + """ + return Compose([ + NaResize( + resolution=(res_w), + mode="side", + downsample_only=False, # Model trained for high resolution + ), + Lambda(lambda x: torch.clamp(x, 0.0, 1.0)), + DivisibleCrop((16, 16)), + Normalize(0.5, 0.5), + Lambda(lambda x: x.permute(1, 0, 2, 3)), # t c h w -> c t h w + ]) + + +def calculate_optimal_batch_params(total_frames, batch_size, temporal_overlap): + """ + Calculate optimal batch processing parameters + + Args: + total_frames (int): Total number of frames + batch_size (int): Desired batch size + temporal_overlap (int): Temporal overlap frames + + Returns: + dict: Optimized parameters and recommendations + + Features: + - 4n+1 constraint optimization + - Padding waste calculation + - Performance recommendations + """ + step = batch_size - temporal_overlap + if step <= 0: + step = batch_size + temporal_overlap = 0 + + # Find optimal batch sizes (4n+1 constraint) + optimal_batches = [x for x in [i for i in range(1, 200) if i % 4 == 1] if x <= total_frames] + best_batch = max(optimal_batches) if optimal_batches else 1 + + # Calculate potential padding waste + padding_waste = 0 + if batch_size not in optimal_batches: + padding_waste = sum(((i // 4) + 1) * 4 + 1 - i for i in range(batch_size, total_frames, batch_size)) + + return { + 'step': step, + 'temporal_overlap': temporal_overlap, + 'best_batch': best_batch, + 'padding_waste': padding_waste, + 'is_optimal': batch_size in optimal_batches + } diff --git a/modules/seedvr/src/core/infer.py b/modules/seedvr/src/core/infer.py new file mode 100644 index 000000000..fd8a595a2 --- /dev/null +++ b/modules/seedvr/src/core/infer.py @@ -0,0 +1,357 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import List, Optional, Tuple, Union +import torch +from einops import rearrange +from omegaconf import DictConfig, ListConfig +from torch import Tensor +from src.common.diffusion import ( + classifier_free_guidance_dispatcher, + create_sampler_from_config, + create_sampling_timesteps_from_config, + create_schedule_from_config, +) +from src.common.distributed import ( + get_device, +) + +# from common.fs import download + +from src.models.dit_v2 import na + + +def optimized_channels_to_last(tensor): + """🚀 Optimized replacement for rearrange(tensor, 'b c ... -> b ... c') + Moves channels from position 1 to last position using PyTorch native operations. + """ + if tensor.ndim == 3: # [batch, channels, spatial] + return tensor.permute(0, 2, 1) + elif tensor.ndim == 4: # [batch, channels, height, width] + return tensor.permute(0, 2, 3, 1) + elif tensor.ndim == 5: # [batch, channels, depth, height, width] + return tensor.permute(0, 2, 3, 4, 1) + else: + # Fallback for other dimensions - move channel (dim=1) to last + dims = list(range(tensor.ndim)) + dims = [dims[0]] + dims[2:] + [dims[1]] # [0, 2, 3, ..., 1] + return tensor.permute(*dims) + +def optimized_channels_to_second(tensor): + """🚀 Optimized replacement for rearrange(tensor, 'b ... c -> b c ...') + Moves channels from last position to position 1 using PyTorch native operations. + """ + if tensor.ndim == 3: # [batch, spatial, channels] + return tensor.permute(0, 2, 1) + elif tensor.ndim == 4: # [batch, height, width, channels] + return tensor.permute(0, 3, 1, 2) + elif tensor.ndim == 5: # [batch, depth, height, width, channels] + return tensor.permute(0, 4, 1, 2, 3) + else: + # Fallback for other dimensions - move last dim to position 1 + dims = list(range(tensor.ndim)) + dims = [dims[0], dims[-1]] + dims[1:-1] # [0, -1, 1, 2, ..., -2] + return tensor.permute(*dims) + + +class VideoDiffusionInfer(): + def __init__(self, config: DictConfig, device: str, dtype: torch.dtype): + self.config = config + self.device = device + self.dtype = dtype + self.vae = None + self.dit = None + self.sampler = None + self.schedule = None + def get_condition(self, latent: Tensor, latent_blur: Tensor, task: str) -> Tensor: + t, h, w, c = latent.shape + cond = torch.zeros([t, h, w, c + 1], device=latent.device, dtype=latent.dtype) + if task == "t2v" or t == 1: + # t2i or t2v generation. + if task == "sr": + cond[:, ..., :-1] = latent_blur[:] + cond[:, ..., -1:] = 1.0 + return cond + if task == "i2v": + # i2v generation. + cond[:1, ..., :-1] = latent[:1] + cond[:1, ..., -1:] = 1.0 + return cond + if task == "v2v": + # v2v frame extension. + cond[:2, ..., :-1] = latent[:2] + cond[:2, ..., -1:] = 1.0 + return cond + if task == "sr": + # sr generation. + cond[:, ..., :-1] = latent_blur[:] + cond[:, ..., -1:] = 1.0 + return cond + raise NotImplementedError + + def configure_diffusion(self): + self.schedule = create_schedule_from_config( + config=self.config.diffusion.schedule, + ) + self.sampling_timesteps = create_sampling_timesteps_from_config( # pylint: disable=attribute-defined-outside-init + config=self.config.diffusion.timesteps.sampling, + schedule=self.schedule, + device=self.device, + ) + self.sampler = create_sampler_from_config( + config=self.config.diffusion.sampler, + schedule=self.schedule, + timesteps=self.sampling_timesteps, + ) + + # -------------------------------- Helper ------------------------------- # + + @torch.no_grad() + def vae_encode(self, samples: List[Tensor]) -> List[Tensor]: + self.dit.to(device="cpu") + self.vae.to(device=self.device) + + use_sample = self.config.vae.get("use_sample", True) + latents = [] + if len(samples) > 0: + device = get_device() + dtype = self.vae.dtype + scale = self.config.vae.scaling_factor + shift = self.config.vae.get("shifting_factor", 0.0) + + if isinstance(scale, ListConfig): + scale = torch.tensor(scale, device=device, dtype=dtype) + if isinstance(shift, ListConfig): + shift = torch.tensor(shift, device=device, dtype=dtype) + + # Group samples of the same shape to batches if enabled. + if self.config.vae.grouping: + batches, indices = na.pack(samples) + else: + batches = [sample.unsqueeze(0) for sample in samples] + + # Vae process by each group. + for sample in batches: + sample = sample.to(device, dtype) + if hasattr(self.vae, "preprocess"): + sample = self.vae.preprocess(sample) + if use_sample: + latent = self.vae.encode(sample).latent + else: + # Deterministic vae encode, only used for i2v inference (optionally) + latent = self.vae.encode(sample).posterior.mode().squeeze(2) + latent = latent.unsqueeze(2) if latent.ndim == 4 else latent + latent = rearrange(latent, "b c ... -> b ... c") + #latent = optimized_channels_to_last(latent) + latent = (latent - shift) * scale + latents.append(latent) + + # Ungroup back to individual latent with the original order. + if self.config.vae.grouping: + latents = na.unpack(latents, indices) + else: + latents = [latent.squeeze(0) for latent in latents] + + self.vae.to(device="cpu") + return latents + + + @torch.no_grad() + def vae_decode(self, latents: List[Tensor], target_dtype: torch.dtype = None) -> List[Tensor]: + """🚀 VAE decode optimisé - décodage direct sans chunking, compatible avec autocast externe""" + self.dit.to(device="cpu") + self.vae.to(device=self.device) + samples = [] + if len(latents) > 0: + device = get_device() + dtype = self.vae.dtype + scale = self.config.vae.scaling_factor + shift = self.config.vae.get("shifting_factor", 0.0) + + if isinstance(scale, ListConfig): + scale = torch.tensor(scale, device=device, dtype=dtype) + if isinstance(shift, ListConfig): + shift = torch.tensor(shift, device=device, dtype=dtype) + + + # 🚀 OPTIMISATION 1: Group latents intelligemment pour batch processing + if self.config.vae.grouping: + latents, indices = na.pack(latents) + else: + latents = [latent.unsqueeze(0) for latent in latents] + + # 🚀 OPTIMISATION 2: Traitement batch optimisé avec dtype adaptatif + for _i, latent in enumerate(latents): + # Préparation optimisée du latent + # Utiliser target_dtype si fourni (évite double autocast) + effective_dtype = target_dtype if target_dtype is not None else dtype + latent = latent.to(device, effective_dtype, non_blocking=True) + latent = latent / scale + shift + latent = rearrange(latent, "b ... c -> b c ...") + #latent = optimized_channels_to_second(latent) + latent = latent.squeeze(2) + + # 🚀 OPTIMISATION 3: Décodage direct SANS autocast (utilise l'autocast externe) + sample = self.vae.decode(latent).sample + #sample = self.vae.decode(latent).sample + #sample = self.vae.decode(latent).sample + + # 🚀 OPTIMISATION 4: Post-processing conditionnel + if hasattr(self.vae, "postprocess"): + sample = self.vae.postprocess(sample) + + samples.append(sample) + + # Ungroup back to individual sample with the original order. + if self.config.vae.grouping: + samples = na.unpack(samples, indices) + else: + samples = [sample.squeeze(0) for sample in samples] + self.vae.to(device="cpu") + return samples + + def timestep_transform(self, timesteps: Tensor, latents_shapes: Tensor): + # Skip if not needed. + if not self.config.diffusion.timesteps.get("transform", False): + return timesteps + + # Compute resolution. + vt = self.config.vae.model.get("temporal_downsample_factor", 4) + vs = self.config.vae.model.get("spatial_downsample_factor", 8) + frames = (latents_shapes[:, 0] - 1) * vt + 1 + heights = latents_shapes[:, 1] * vs + widths = latents_shapes[:, 2] * vs + + # Compute shift factor. + def get_lin_function(x1, y1, x2, y2): + m = (y2 - y1) / (x2 - x1) + b = y1 - m * x1 + return lambda x: m * x + b + + img_shift_fn = get_lin_function(x1=256 * 256, y1=1.0, x2=1024 * 1024, y2=3.2) + vid_shift_fn = get_lin_function(x1=256 * 256 * 37, y1=1.0, x2=1280 * 720 * 145, y2=5.0) + shift = torch.where( + frames > 1, + vid_shift_fn(heights * widths * frames), + img_shift_fn(heights * widths), + ) + + # Shift timesteps. + timesteps = timesteps / self.schedule.T + timesteps = shift * timesteps / (1 + (shift - 1) * timesteps) + timesteps = timesteps * self.schedule.T + return timesteps + + @torch.no_grad() + def inference( + self, + noises: List[Tensor], + conditions: List[Tensor], + texts_pos: Union[List[str], List[Tensor], List[Tuple[Tensor]]], + texts_neg: Union[List[str], List[Tensor], List[Tuple[Tensor]]], + cfg_scale: Optional[float] = None, + temporal_overlap: int = 0, # pylint: disable=unused-argument + ) -> List[Tensor]: + assert len(noises) == len(conditions) == len(texts_pos) == len(texts_neg) + batch_size = len(noises) + + # Return if empty. + if batch_size == 0: + return [] + + # Set cfg scale + if cfg_scale is None: + cfg_scale = self.config.diffusion.cfg.scale + + # 🚀 OPTIMISATION: Détecter le dtype du modèle pour performance optimale + model_dtype = next(self.dit.parameters()).dtype + # Adapter les dtypes selon le modèle + if model_dtype in (torch.float8_e4m3fn, torch.float8_e5m2): + target_dtype = torch.float16 + elif model_dtype == torch.float16: + target_dtype = torch.float16 + else: + target_dtype = torch.bfloat16 + # Text embeddings. + assert type(texts_pos[0]) is type(texts_neg[0]) + if isinstance(texts_pos[0], str): + text_pos_embeds, text_pos_shapes = self.text_encode(texts_pos) # pylint: disable=no-member + text_neg_embeds, text_neg_shapes = self.text_encode(texts_neg) # pylint: disable=no-member + elif isinstance(texts_pos[0], tuple): + text_pos_embeds, text_pos_shapes = [], [] + text_neg_embeds, text_neg_shapes = [], [] + for pos in zip(*texts_pos): + emb, shape = na.flatten(pos) + text_pos_embeds.append(emb) + text_pos_shapes.append(shape) + for neg in zip(*texts_neg): + emb, shape = na.flatten(neg) + text_neg_embeds.append(emb) + text_neg_shapes.append(shape) + else: + text_pos_embeds, text_pos_shapes = na.flatten(texts_pos) + text_neg_embeds, text_neg_shapes = na.flatten(texts_neg) + + # Adapter les embeddings texte au dtype cible (compatible avec FP8) + if isinstance(text_pos_embeds, torch.Tensor): + text_pos_embeds = text_pos_embeds.to(target_dtype) + if isinstance(text_neg_embeds, torch.Tensor): + text_neg_embeds = text_neg_embeds.to(target_dtype) + + # Flatten. + latents, latents_shapes = na.flatten(noises) + latents_cond, _ = na.flatten(conditions) + + # Adapter les latents au dtype cible (compatible avec FP8) + latents = latents.to(target_dtype) if latents.dtype != target_dtype else latents + latents_cond = latents_cond.to(target_dtype) if latents_cond.dtype != target_dtype else latents_cond + + latents = self.sampler.sample( + x=latents, + f=lambda args: classifier_free_guidance_dispatcher( + pos=lambda: self.dit( + vid=torch.cat([args.x_t, latents_cond], dim=-1), + txt=text_pos_embeds, + vid_shape=latents_shapes, + txt_shape=text_pos_shapes, + timestep=args.t.repeat(batch_size), + ).vid_sample, + neg=lambda: self.dit( + vid=torch.cat([args.x_t, latents_cond], dim=-1), + txt=text_neg_embeds, + vid_shape=latents_shapes, + txt_shape=text_neg_shapes, + timestep=args.t.repeat(batch_size), + ).vid_sample, + scale=( + cfg_scale + if (args.i + 1) / len(self.sampler.timesteps) + <= self.config.diffusion.cfg.get("partial", 1) + else 1.0 + ), + rescale=self.config.diffusion.cfg.rescale, + ), + ) + + latents = na.unflatten(latents, latents_shapes) + + # 🎯 Pré-calcul des dtypes (une seule fois) + vae_dtype = self.vae.dtype + decode_dtype = torch.float16 if (vae_dtype == torch.float16 or target_dtype == torch.float16) else vae_dtype + samples = self.vae_decode(latents, target_dtype=decode_dtype) + + if samples and len(samples) > 0 and samples[0].dtype != torch.float16: + samples = [sample.to(torch.float16, non_blocking=True) for sample in samples] + + return samples diff --git a/modules/seedvr/src/core/model_manager.py b/modules/seedvr/src/core/model_manager.py new file mode 100644 index 000000000..043e5ac61 --- /dev/null +++ b/modules/seedvr/src/core/model_manager.py @@ -0,0 +1,61 @@ +import os +import torch +from omegaconf import OmegaConf +from safetensors.torch import load_file as load_safetensors_file +from huggingface_hub import hf_hub_download + +from src.optimization.memory_manager import preinitialize_rope_cache +from src.common.config import load_config, create_object +from src.core.infer import VideoDiffusionInfer + + +def configure_runner(model_name, cache_dir, device:str='cpu', dtype:torch.dtype=None): + repo_id = "vladmandic/SeedVR2" + script_directory = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + config_path = os.path.join(script_directory, './config_7b.yaml') if "7b" in model_name else os.path.join(script_directory, './config_3b.yaml') + config = load_config(config_path) + + vae_config_path = os.path.join(script_directory, 'src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml') + vae_config = OmegaConf.load(vae_config_path) + vae_config.spatial_downsample_factor = vae_config.get('spatial_downsample_factor', 8) + vae_config.temporal_downsample_factor = vae_config.get('temporal_downsample_factor', 4) + config.vae.model = OmegaConf.merge(config.vae.model, vae_config) + + runner = VideoDiffusionInfer(config, device=device, dtype=dtype) + OmegaConf.set_readonly(runner.config, False) + + # load dit + with torch.device("meta"): + runner.dit = create_object(config.dit.model) + runner.dit.eval().to(dtype) + runner.dit.to_empty(device="cpu") + + model_file = hf_hub_download(repo_id=repo_id, filename=model_name, cache_dir=cache_dir) + state_dict = load_safetensors_file(model_file) + runner.dit.load_state_dict(state_dict, assign=True) + del state_dict + runner.dit = runner.dit.to(device=device, dtype=dtype) + + # load vae + vae_file = hf_hub_download(repo_id=repo_id, filename=config.vae.checkpoint, cache_dir=cache_dir) + with torch.device("meta"): + runner.vae = create_object(config.vae.model) + runner.vae.requires_grad_(False).eval() + runner.vae.to_empty(device="cpu") + + state_dict = load_safetensors_file(vae_file) + runner.vae.load_state_dict(state_dict) + del state_dict + runner.vae = runner.vae.to(device=device, dtype=dtype) + runner.config.vae.dtype = str(dtype) + runner.vae.set_causal_slicing(**config.vae.slicing) + runner.vae.set_memory_limit(**runner.config.vae.memory_limit) + + # load embeds + pos_embeds_file = hf_hub_download(repo_id=repo_id, filename='pos_emb.pt', cache_dir=cache_dir) + neg_embeds_file = hf_hub_download(repo_id=repo_id, filename='neg_emb.pt', cache_dir=cache_dir) + runner.text_pos_embeds = torch.load(pos_embeds_file).to(device=device, dtype=dtype) + runner.text_neg_embeds = torch.load(neg_embeds_file).to(device=device, dtype=dtype) + + preinitialize_rope_cache(runner) + return runner diff --git a/modules/seedvr/src/data/image/transforms/area_resize.py b/modules/seedvr/src/data/image/transforms/area_resize.py new file mode 100644 index 000000000..dd3ca9d4b --- /dev/null +++ b/modules/seedvr/src/data/image/transforms/area_resize.py @@ -0,0 +1,131 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import math +import random +from typing import Union +import torch +from PIL import Image +from torchvision.transforms import functional as TVF +from torchvision.transforms.functional import InterpolationMode + + +class AreaResize: + def __init__( + self, + max_area: float, + downsample_only: bool = False, + interpolation: InterpolationMode = InterpolationMode.BICUBIC, + ): + self.max_area = max_area + self.downsample_only = downsample_only + self.interpolation = interpolation + + def __call__(self, image: Union[torch.Tensor, Image.Image]): + + if isinstance(image, torch.Tensor): + height, width = image.shape[-2:] + elif isinstance(image, Image.Image): + width, height = image.size + else: + raise NotImplementedError + + scale = math.sqrt(self.max_area / (height * width)) + + # keep original height and width for small pictures. + scale = 1 if scale >= 1 and self.downsample_only else scale + + resized_height, resized_width = round(height * scale), round(width * scale) + + return TVF.resize( + image, + size=(resized_height, resized_width), + interpolation=self.interpolation, + ) + + +class AreaRandomCrop: + def __init__( + self, + max_area: float, + ): + self.max_area = max_area + + def get_params(self, input_size, output_size): + """Get parameters for ``crop`` for a random crop. + + Args: + img (PIL Image): Image to be cropped. + output_size (tuple): Expected output size of the crop. + + Returns: + tuple: params (i, j, h, w) to be passed to ``crop`` for random crop. + """ + # w, h = _get_image_size(img) + h, w = input_size + th, tw = output_size + if w <= tw and h <= th: + return 0, 0, h, w + + i = random.randint(0, h - th) + j = random.randint(0, w - tw) + return i, j, th, tw + + def __call__(self, image: Union[torch.Tensor, Image.Image]): + if isinstance(image, torch.Tensor): + height, width = image.shape[-2:] + elif isinstance(image, Image.Image): + width, height = image.size + else: + raise NotImplementedError + + resized_height = math.sqrt(self.max_area / (width / height)) + resized_width = (width / height) * resized_height + + resized_height, resized_width = round(resized_height), round(resized_width) + i, j, h, w = self.get_params((height, width), (resized_height, resized_width)) + image = TVF.crop(image, i, j, h, w) + return image + +class ScaleResize: + def __init__( + self, + scale: float, + ): + self.scale = scale + + def __call__(self, image: Union[torch.Tensor, Image.Image]): + if isinstance(image, torch.Tensor): + height, width = image.shape[-2:] + interpolation_mode = InterpolationMode.BILINEAR + antialias = True if image.ndim == 4 else "warn" + elif isinstance(image, Image.Image): + width, height = image.size + interpolation_mode = InterpolationMode.LANCZOS + antialias = "warn" + else: + raise NotImplementedError + + scale = self.scale + + # keep original height and width for small pictures + + resized_height, resized_width = round(height * scale), round(width * scale) + image = TVF.resize( + image, + size=(resized_height, resized_width), + interpolation=interpolation_mode, + antialias=antialias, + ) + return image diff --git a/modules/seedvr/src/data/image/transforms/divisible_crop.py b/modules/seedvr/src/data/image/transforms/divisible_crop.py new file mode 100644 index 000000000..d1815b03e --- /dev/null +++ b/modules/seedvr/src/data/image/transforms/divisible_crop.py @@ -0,0 +1,40 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Union +import torch +from PIL import Image +from torchvision.transforms import functional as TVF + + +class DivisibleCrop: + def __init__(self, factor): + if not isinstance(factor, tuple): + factor = (factor, factor) + + self.height_factor, self.width_factor = factor[0], factor[1] + + def __call__(self, image: Union[torch.Tensor, Image.Image]): + if isinstance(image, torch.Tensor): + height, width = image.shape[-2:] + elif isinstance(image, Image.Image): + width, height = image.size + else: + raise NotImplementedError + + cropped_height = height - (height % self.height_factor) + cropped_width = width - (width % self.width_factor) + + image = TVF.center_crop(img=image, output_size=(cropped_height, cropped_width)) + return image diff --git a/modules/seedvr/src/data/image/transforms/na_resize.py b/modules/seedvr/src/data/image/transforms/na_resize.py new file mode 100644 index 000000000..d230e25e3 --- /dev/null +++ b/modules/seedvr/src/data/image/transforms/na_resize.py @@ -0,0 +1,50 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Literal +from torchvision.transforms import CenterCrop, Compose, InterpolationMode, Resize + +from .area_resize import AreaResize +from .side_resize import SideResize + + +def NaResize( + resolution: int, + mode: Literal["area", "side"], + downsample_only: bool, + interpolation: InterpolationMode = InterpolationMode.BICUBIC, +): + if mode == "area": + return AreaResize( + max_area=resolution**2, + downsample_only=downsample_only, + interpolation=interpolation, + ) + if mode == "side": + return SideResize( + size=resolution, + downsample_only=downsample_only, + interpolation=interpolation, + ) + if mode == "square": + return Compose( + [ + Resize( + size=resolution, + interpolation=interpolation, + ), + CenterCrop(resolution), + ] + ) + raise ValueError(f"Unknown resize mode: {mode}") diff --git a/modules/seedvr/src/data/image/transforms/side_resize.py b/modules/seedvr/src/data/image/transforms/side_resize.py new file mode 100644 index 000000000..6e07402b2 --- /dev/null +++ b/modules/seedvr/src/data/image/transforms/side_resize.py @@ -0,0 +1,54 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Union +import torch +from PIL import Image +from torchvision.transforms import InterpolationMode +from torchvision.transforms import functional as TVF + + +class SideResize: + def __init__( + self, + size: int, + downsample_only: bool = False, + interpolation: InterpolationMode = InterpolationMode.BICUBIC, + ): + self.size = size + self.downsample_only = downsample_only + self.interpolation = interpolation + + def __call__(self, image: Union[torch.Tensor, Image.Image]): + """ + Args: + image (PIL Image or Tensor): Image to be scaled. + + Returns: + PIL Image or Tensor: Rescaled image. + """ + if isinstance(image, torch.Tensor): + height, width = image.shape[-2:] + elif isinstance(image, Image.Image): + width, height = image.size + else: + raise NotImplementedError + + if self.downsample_only and min(width, height) < self.size: + # keep original height and width for small pictures. + size = min(width, height) + else: + size = self.size + + return TVF.resize(image, size, self.interpolation) diff --git a/modules/seedvr/src/models/dit/attention.py b/modules/seedvr/src/models/dit/attention.py new file mode 100644 index 000000000..b0dda518a --- /dev/null +++ b/modules/seedvr/src/models/dit/attention.py @@ -0,0 +1,94 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import torch +import torch.nn.functional as F + +#from flash_attn import flash_attn_varlen_func + +from torch import nn + + +def pytorch_varlen_attention(q, k, v, cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k, dropout_p=0.0, softmax_scale=None, causal=False, deterministic=False): + """ + A PyTorch-based implementation of variable-length attention to replace flash_attn_varlen_func. + It processes each sequence in the batch individually. + """ + # Create an empty tensor to store the output. + output = torch.empty_like(q) + + # Iterate over each sequence in the batch. The batch size is the number of sequences. + for i in range(len(cu_seqlens_q) - 1): + # Determine the start and end indices for the current sequence. + start_q, end_q = cu_seqlens_q[i], cu_seqlens_q[i+1] + start_k, end_k = cu_seqlens_k[i], cu_seqlens_k[i+1] + + # Slice the q, k, and v tensors to get the data for the current sequence. + # The shape is (seq_len, heads, head_dim). + q_i = q[start_q:end_q] + k_i = k[start_k:end_k] + v_i = v[start_k:end_k] + + # Reshape for torch's scaled_dot_product_attention which expects (batch, heads, seq, dim). + # Here, we treat each sequence as a batch of 1. + q_i = q_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_q, head_dim) + k_i = k_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_k, head_dim) + v_i = v_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_k, head_dim) + + # Use PyTorch's built-in scaled dot-product attention. + output_i = F.scaled_dot_product_attention( + q_i, k_i, v_i, + dropout_p=dropout_p if not deterministic else 0.0, + is_causal=causal + ) + + # Reshape the output back to the original format (seq_len, heads, head_dim) + output_i = output_i.squeeze(0).permute(1, 0, 2) + + # Place the result for the current sequence into the main output tensor. + output[start_q:end_q] = output_i + + return output + + +class TorchAttention(nn.Module): + def tflops(self, args, kwargs, output) -> float: + assert len(args) == 0 or len(args) > 2, "query, key should both provided by args / kwargs" + q = kwargs.get("query") or args[0] + k = kwargs.get("key") or args[1] + b, h, sq, d = q.shape + b, h, sk, d = k.shape + return b * h * (4 * d * (sq / 1e6) * (sk / 1e6)) + + def forward(self, *args, **kwargs): + #return pytorch_varlen_attention(*args, **kwargs) + return F.scaled_dot_product_attention(*args, **kwargs) + + +class FlashAttentionVarlen(nn.Module): + def tflops(self, args, kwargs, output) -> float: + cu_seqlens_q = kwargs["cu_seqlens_q"] + cu_seqlens_k = kwargs["cu_seqlens_k"] + _, h, d = output.shape + seqlens_q = (cu_seqlens_q[1:] - cu_seqlens_q[:-1]) / 1e6 + seqlens_k = (cu_seqlens_k[1:] - cu_seqlens_k[:-1]) / 1e6 + return h * (4 * d * (seqlens_q * seqlens_k).sum()) + + def forward(self, *args, **kwargs): + kwargs["deterministic"] = torch.are_deterministic_algorithms_enabled() + try: + from flash_attn import flash_attn_varlen_func + return flash_attn_varlen_func(*args, **kwargs) + except ImportError: + return pytorch_varlen_attention(*args, **kwargs) diff --git a/modules/seedvr/src/models/dit/blocks/__init__.py b/modules/seedvr/src/models/dit/blocks/__init__.py new file mode 100644 index 000000000..3195b400a --- /dev/null +++ b/modules/seedvr/src/models/dit/blocks/__init__.py @@ -0,0 +1,25 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from .mmdit_window_block import MMWindowTransformerBlock + +dit_blocks = { + "mmdit_window": MMWindowTransformerBlock, +} + + +def get_block(block_type: str): + if block_type in dit_blocks: + return dit_blocks[block_type] + raise NotImplementedError(f"{block_type} is not supported") diff --git a/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py b/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py new file mode 100644 index 000000000..ee9ae9ae8 --- /dev/null +++ b/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py @@ -0,0 +1,233 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Tuple, Union +import torch +from einops import rearrange +from torch import nn +from torch.nn import functional as F +from torch.nn.modules.utils import _triple +from ....common.half_precision_fixes import safe_pad_operation +from ....common.distributed.ops import ( + gather_heads, + gather_heads_scatter_seq, + gather_seq_scatter_heads_qkv, + scatter_heads, +) + +from ..attention import TorchAttention +from ..mlp import get_mlp +from ..mm import MMArg, MMModule +from ..modulation import ada_layer_type +from ..normalization import norm_layer_type +from ..rope import RotaryEmbedding3d + + +class MMWindowAttention(nn.Module): + def __init__( + self, + vid_dim: int, + txt_dim: int, + heads: int, + head_dim: int, + qk_bias: bool, + qk_rope: bool, + qk_norm: norm_layer_type, + qk_norm_eps: float, + window: Union[int, Tuple[int, int, int]], + window_method: str, + shared_qkv: bool, + ): + super().__init__() + dim = MMArg(vid_dim, txt_dim) + inner_dim = heads * head_dim + qkv_dim = inner_dim * 3 + + self.window = _triple(window) + self.window_method = window_method + assert all(map(lambda v: isinstance(v, int) and v >= 0, self.window)) + + self.head_dim = head_dim + self.proj_qkv = MMModule(nn.Linear, dim, qkv_dim, bias=qk_bias, shared_weights=shared_qkv) + self.proj_out = MMModule(nn.Linear, inner_dim, dim, shared_weights=shared_qkv) + self.norm_q = MMModule(qk_norm, dim=head_dim, eps=qk_norm_eps, elementwise_affine=True) + self.norm_k = MMModule(qk_norm, dim=head_dim, eps=qk_norm_eps, elementwise_affine=True) + self.rope = RotaryEmbedding3d(dim=head_dim // 2) if qk_rope else None + self.attn = TorchAttention() + + def forward( + self, + vid: torch.FloatTensor, # b T H W c + txt: torch.FloatTensor, # b L c + txt_mask: torch.BoolTensor, # b L + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + # Project q, k, v. + vid_qkv, txt_qkv = self.proj_qkv(vid, txt) + vid_qkv = gather_seq_scatter_heads_qkv(vid_qkv, seq_dim=2) + _, T, H, W, _ = vid_qkv.shape + _, L, _ = txt.shape + + if self.window_method == "win": + nt, nh, nw = self.window + tt, hh, ww = T // nt, H // nh, W // nw + elif self.window_method == "win_by_size": + tt, hh, ww = self.window + tt, hh, ww = ( + tt if tt > 0 else T, + hh if hh > 0 else H, + ww if ww > 0 else W, + ) + nt, nh, nw = T // tt, H // hh, W // ww + else: + raise NotImplementedError + + vid_qkv = rearrange(vid_qkv, "b T H W (o h d) -> o b h (T H W) d", o=3, d=self.head_dim) + txt_qkv = rearrange(txt_qkv, "b L (o h d) -> o b h L d", o=3, d=self.head_dim) + txt_qkv = scatter_heads(txt_qkv, dim=2) + + vid_q, vid_k, vid_v = vid_qkv.unbind() + txt_q, txt_k, txt_v = txt_qkv.unbind() + + vid_q, txt_q = self.norm_q(vid_q, txt_q) + vid_k, txt_k = self.norm_k(vid_k, txt_k) + + if self.rope: + vid_q, vid_k = self.rope(vid_q, vid_k, (T, H, W)) + + def vid_window(v): + return rearrange( + v, + "b h (nt tt nh hh nw ww) d -> b h (nt nh nw) (tt hh ww) d", + hh=hh, + ww=ww, + tt=tt, + nh=nh, + nw=nw, + nt=nt, + ) + + def txt_window(t): + return rearrange(t, "b h L d -> b h 1 L d").expand(-1, -1, nt * nh * nw, -1, -1) + + # Process video attention. + vid_msk = safe_pad_operation(txt_mask, (tt * hh * ww, 0), value=True) + vid_msk = rearrange(vid_msk, "b l -> b 1 1 1 l").expand(-1, 1, 1, tt * hh * ww, -1) + vid_out = self.attn( + vid_window(vid_q), + torch.cat([vid_window(vid_k), txt_window(txt_k)], dim=-2), + torch.cat([vid_window(vid_v), txt_window(txt_v)], dim=-2), + vid_msk, + ) + vid_out = rearrange( + vid_out, + "b h (nt nh nw) (tt hh ww) d -> b (nt tt) (nh hh) (nw ww) (h d)", + hh=hh, + ww=ww, + tt=tt, + nh=nh, + nw=nw, + ) + vid_out = gather_heads_scatter_seq(vid_out, head_dim=4, seq_dim=2) + + # Process text attention. + txt_msk = safe_pad_operation(txt_mask, (T * H * W, 0), value=True) + txt_msk = rearrange(txt_msk, "b l -> b 1 1 l").expand(-1, 1, L, -1) + txt_out = self.attn( + txt_q, + torch.cat([vid_k, txt_k], dim=-2), + torch.cat([vid_v, txt_v], dim=-2), + txt_msk, + ) + txt_out = rearrange(txt_out, "b h L d -> b L (h d)") + txt_out = gather_heads(txt_out, dim=2) + + # Project output. + vid_out, txt_out = self.proj_out(vid_out, txt_out) + return vid_out, txt_out + + +class MMWindowTransformerBlock(nn.Module): + def __init__( + self, + *, + vid_dim: int, + txt_dim: int, + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: norm_layer_type, + norm_eps: float, + ada: ada_layer_type, + qk_bias: bool, + qk_rope: bool, + qk_norm: norm_layer_type, + window: Union[int, Tuple[int, int, int]], + window_method: str, + shared_qkv: bool, + shared_mlp: bool, + mlp_type: str, + **kwargs, + ): + super().__init__() + dim = MMArg(vid_dim, txt_dim) + self.attn_norm = MMModule(norm, dim=dim, eps=norm_eps, elementwise_affine=False) + self.attn = MMWindowAttention( + vid_dim=vid_dim, + txt_dim=txt_dim, + heads=heads, + head_dim=head_dim, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + qk_norm_eps=norm_eps, + window=window, + window_method=window_method, + shared_qkv=shared_qkv, + ) + self.mlp_norm = MMModule(norm, dim=dim, eps=norm_eps, elementwise_affine=False) + self.mlp = MMModule( + get_mlp(mlp_type), + dim=dim, + expand_ratio=expand_ratio, + shared_weights=shared_mlp, + ) + self.ada = MMModule(ada, dim=dim, emb_dim=emb_dim, layers=["attn", "mlp"]) + + def forward( + self, + vid: torch.FloatTensor, + txt: torch.FloatTensor, + txt_mask: torch.BoolTensor, + emb: torch.FloatTensor, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + vid_attn, txt_attn = self.attn_norm(vid, txt) + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, emb=emb, layer="attn", mode="in") + vid_attn, txt_attn = self.attn(vid_attn, txt_attn, txt_mask=txt_mask) + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, emb=emb, layer="attn", mode="out") + vid_attn, txt_attn = (vid_attn + vid), (txt_attn + txt) + + vid_mlp, txt_mlp = self.mlp_norm(vid_attn, txt_attn) + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, emb=emb, layer="mlp", mode="in") + vid_mlp, txt_mlp = self.mlp(vid_mlp, txt_mlp) + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, emb=emb, layer="mlp", mode="out") + vid_mlp, txt_mlp = (vid_mlp + vid_attn), (txt_mlp + txt_attn) + + return vid_mlp, txt_mlp diff --git a/modules/seedvr/src/models/dit/embedding.py b/modules/seedvr/src/models/dit/embedding.py new file mode 100644 index 000000000..e972244f5 --- /dev/null +++ b/modules/seedvr/src/models/dit/embedding.py @@ -0,0 +1,62 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional, Union +import torch +from diffusers.models.embeddings import get_timestep_embedding +from torch import nn + + +def emb_add(emb1: torch.Tensor, emb2: Optional[torch.Tensor]): + return emb1 if emb2 is None else emb1 + emb2 + + +class TimeEmbedding(nn.Module): + def __init__( + self, + sinusoidal_dim: int, + hidden_dim: int, + output_dim: int, + ): + super().__init__() + self.sinusoidal_dim = sinusoidal_dim + self.proj_in = nn.Linear(sinusoidal_dim, hidden_dim) + self.proj_hid = nn.Linear(hidden_dim, hidden_dim) + self.proj_out = nn.Linear(hidden_dim, output_dim) + self.act = nn.SiLU() + + def forward( + self, + timestep: Union[int, float, torch.IntTensor, torch.FloatTensor], + device: torch.device, + dtype: torch.dtype, + ) -> torch.FloatTensor: + if not torch.is_tensor(timestep): + timestep = torch.tensor([timestep], device=device, dtype=dtype) + if timestep.ndim == 0: + timestep = timestep[None] + + emb = get_timestep_embedding( + timesteps=timestep, + embedding_dim=self.sinusoidal_dim, + flip_sin_to_cos=False, + downscale_freq_shift=0, + ) + emb = emb.to(dtype) + emb = self.proj_in(emb) + emb = self.act(emb) + emb = self.proj_hid(emb) + emb = self.act(emb) + emb = self.proj_out(emb) + return emb diff --git a/modules/seedvr/src/models/dit/mlp.py b/modules/seedvr/src/models/dit/mlp.py new file mode 100644 index 000000000..2d05cb021 --- /dev/null +++ b/modules/seedvr/src/models/dit/mlp.py @@ -0,0 +1,62 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional +import torch +import torch.nn.functional as F +from torch import nn + + +def get_mlp(mlp_type: Optional[str] = "normal"): + if mlp_type == "normal": + return MLP + elif mlp_type == "swiglu": + return SwiGLUMLP + + +class MLP(nn.Module): + def __init__( + self, + dim: int, + expand_ratio: int, + ): + super().__init__() + self.proj_in = nn.Linear(dim, dim * expand_ratio) + self.act = nn.GELU("tanh") + self.proj_out = nn.Linear(dim * expand_ratio, dim) + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + x = self.proj_in(x) + x = self.act(x) + x = self.proj_out(x) + return x + + +class SwiGLUMLP(nn.Module): + def __init__( + self, + dim: int, + expand_ratio: int, + multiple_of: int = 256, + ): + super().__init__() + hidden_dim = int(2 * dim * expand_ratio / 3) + hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + self.proj_in_gate = nn.Linear(dim, hidden_dim, bias=False) + self.proj_out = nn.Linear(hidden_dim, dim, bias=False) + self.proj_in = nn.Linear(dim, hidden_dim, bias=False) + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + x = self.proj_out(F.silu(self.proj_in_gate(x)) * self.proj_in(x)) + return x diff --git a/modules/seedvr/src/models/dit/mm.py b/modules/seedvr/src/models/dit/mm.py new file mode 100644 index 000000000..49be1f591 --- /dev/null +++ b/modules/seedvr/src/models/dit/mm.py @@ -0,0 +1,67 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Tuple +import torch +from torch import nn + + +@dataclass +class MMArg: + vid: Any + txt: Any + + +def get_args(key: str, args: List[Any]) -> List[Any]: + return [getattr(v, key) if isinstance(v, MMArg) else v for v in args] + + +def get_kwargs(key: str, kwargs: Dict[str, Any]) -> Dict[str, Any]: + return {k: getattr(v, key) if isinstance(v, MMArg) else v for k, v in kwargs.items()} + + +class MMModule(nn.Module): + def __init__( + self, + module: Callable[..., nn.Module], + *args, + shared_weights: bool = False, + **kwargs, + ): + super().__init__() + self.shared_weights = shared_weights + if self.shared_weights: + assert get_args("vid", args) == get_args("txt", args) + assert get_kwargs("vid", kwargs) == get_kwargs("txt", kwargs) + self.all = module(*get_args("vid", args), **get_kwargs("vid", kwargs)) + else: + self.vid = module(*get_args("vid", args), **get_kwargs("vid", kwargs)) + self.txt = module(*get_args("txt", args), **get_kwargs("txt", kwargs)) + + def forward( + self, + vid: torch.FloatTensor, + txt: torch.FloatTensor, + *args, + **kwargs, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + vid_module = self.vid if not self.shared_weights else self.all + txt_module = self.txt if not self.shared_weights else self.all + vid = vid_module(vid, *get_args("vid", args), **get_kwargs("vid", kwargs)) + txt = txt_module(txt, *get_args("txt", args), **get_kwargs("txt", kwargs)) + return vid, txt diff --git a/modules/seedvr/src/models/dit/modulation.py b/modules/seedvr/src/models/dit/modulation.py new file mode 100644 index 000000000..7a4975646 --- /dev/null +++ b/modules/seedvr/src/models/dit/modulation.py @@ -0,0 +1,97 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Callable, List, Optional +import torch +from einops import rearrange +from torch import nn + +from ...common.cache import Cache +from ...common.distributed.ops import slice_inputs + +# (dim: int, emb_dim: int) +ada_layer_type = Callable[[int, int], nn.Module] + + +def get_ada_layer(ada_layer: str) -> ada_layer_type: + if ada_layer == "single": + return AdaSingle + raise NotImplementedError(f"{ada_layer} is not supported") + + +def expand_dims(x: torch.Tensor, dim: int, ndim: int): + """ + Expand tensor "x" to "ndim" by adding empty dims at "dim". + Example: x is (b d), target ndim is 5, add dim at 1, return (b 1 1 1 d). + """ + shape = x.shape + shape = shape[:dim] + (1,) * (ndim - len(shape)) + shape[dim:] + return x.reshape(shape) + + +class AdaSingle(nn.Module): + def __init__( + self, + dim: int, + emb_dim: int, + layers: List[str], + ): + assert emb_dim == 6 * dim, "AdaSingle requires emb_dim == 6 * dim" + super().__init__() + self.dim = dim + self.emb_dim = emb_dim + self.layers = layers + for l in layers: + self.register_parameter(f"{l}_shift", nn.Parameter(torch.randn(dim) / dim**0.5)) + self.register_parameter(f"{l}_scale", nn.Parameter(torch.randn(dim) / dim**0.5 + 1)) + self.register_parameter(f"{l}_gate", nn.Parameter(torch.randn(dim) / dim**0.5)) + + def forward( + self, + hid: torch.FloatTensor, # b ... c + emb: torch.FloatTensor, # b d + layer: str, + mode: str, + cache: Cache = Cache(disable=True), + branch_tag: str = "", + hid_len: Optional[torch.LongTensor] = None, # b + ) -> torch.FloatTensor: + idx = self.layers.index(layer) + emb = rearrange(emb, "b (d l g) -> b d l g", l=len(self.layers), g=3)[..., idx, :] + emb = expand_dims(emb, 1, hid.ndim + 1) + + if hid_len is not None: + emb = cache( + f"emb_repeat_{idx}_{branch_tag}", + lambda: slice_inputs( + torch.cat([e.repeat(l, *([1] * e.ndim)) for e, l in zip(emb, hid_len)]), + dim=0, + ), + ) + + shiftA, scaleA, gateA = emb.unbind(-1) + shiftB, scaleB, gateB = ( + getattr(self, f"{layer}_shift"), + getattr(self, f"{layer}_scale"), + getattr(self, f"{layer}_gate"), + ) + + if mode == "in": + return hid.mul_(scaleA + scaleB).add_(shiftA + shiftB) + if mode == "out": + return hid.mul_(gateA + gateB) + raise NotImplementedError + + def extra_repr(self) -> str: + return f"dim={self.dim}, emb_dim={self.emb_dim}, layers={self.layers}" diff --git a/modules/seedvr/src/models/dit/na.py b/modules/seedvr/src/models/dit/na.py new file mode 100644 index 000000000..0dbd546c4 --- /dev/null +++ b/modules/seedvr/src/models/dit/na.py @@ -0,0 +1,241 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from itertools import chain +from typing import Callable, Dict, List, Tuple +import einops +import torch + + +def flatten( + hid: List[torch.FloatTensor], # List of (*** c) +) -> Tuple[ + torch.FloatTensor, # (L c) + torch.LongTensor, # (b n) +]: + assert len(hid) > 0 + shape = torch.stack([torch.tensor(x.shape[:-1], device=hid[0].device) for x in hid]) + hid = torch.cat([x.flatten(0, -2) for x in hid]) + return hid, shape + + +def unflatten( + hid: torch.FloatTensor, # (L c) or (L ... c) + hid_shape: torch.LongTensor, # (b n) +) -> List[torch.Tensor]: # List of (*** c) or (*** ... c) + hid_len = hid_shape.prod(-1) + hid = hid.split(hid_len.tolist()) + hid = [x.unflatten(0, s.tolist()) for x, s in zip(hid, hid_shape)] + return hid + + +def concat( + vid: torch.FloatTensor, # (VL ... c) + txt: torch.FloatTensor, # (TL ... c) + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> torch.FloatTensor: # (L ... c) + vid = torch.split(vid, vid_len.tolist()) + txt = torch.split(txt, txt_len.tolist()) + return torch.cat(list(chain(*zip(vid, txt)))) + + +def concat_idx( + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> Tuple[ + Callable, + Callable, +]: + device = vid_len.device + vid_idx = torch.arange(vid_len.sum(), device=device) + txt_idx = torch.arange(len(vid_idx), len(vid_idx) + txt_len.sum(), device=device) + tgt_idx = concat(vid_idx, txt_idx, vid_len, txt_len) + src_idx = torch.argsort(tgt_idx) + return ( + lambda vid, txt: torch.index_select(torch.cat([vid, txt]), 0, tgt_idx), + lambda all: torch.index_select(all, 0, src_idx).split([len(vid_idx), len(txt_idx)]), + ) + + +def unconcat( + all: torch.FloatTensor, # (L ... c) + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> Tuple[ + torch.FloatTensor, # (VL ... c) + torch.FloatTensor, # (TL ... c) +]: + interleave_len = list(chain(*zip(vid_len.tolist(), txt_len.tolist()))) + all = all.split(interleave_len) + vid = torch.cat(all[0::2]) + txt = torch.cat(all[1::2]) + return vid, txt + + +def repeat_concat( + vid: torch.FloatTensor, # (VL ... c) + txt: torch.FloatTensor, # (TL ... c) + vid_len: torch.LongTensor, # (n*b) + txt_len: torch.LongTensor, # (b) + txt_repeat: List, # (n) +) -> torch.FloatTensor: # (L ... c) + vid = torch.split(vid, vid_len.tolist()) + txt = torch.split(txt, txt_len.tolist()) + txt = [[x] * n for x, n in zip(txt, txt_repeat)] + txt = list(chain(*txt)) + return torch.cat(list(chain(*zip(vid, txt)))) + + +def repeat_concat_idx( + vid_len: torch.LongTensor, # (n*b) + txt_len: torch.LongTensor, # (b) + txt_repeat: torch.LongTensor, # (n) +) -> Tuple[ + Callable, + Callable, +]: + device = vid_len.device + vid_idx = torch.arange(vid_len.sum(), device=device) + txt_idx = torch.arange(len(vid_idx), len(vid_idx) + txt_len.sum(), device=device) + txt_repeat_list = txt_repeat.tolist() + tgt_idx = repeat_concat(vid_idx, txt_idx, vid_len, txt_len, txt_repeat) + src_idx = torch.argsort(tgt_idx) + txt_idx_len = len(tgt_idx) - len(vid_idx) + repeat_txt_len = (txt_len * txt_repeat).tolist() + + def unconcat_coalesce(all): + """ + Un-concat vid & txt, and coalesce the repeated txt. + e.g. vid [0 1 2 3 4 5 6 7 8] -> 3 splits -> [0 1 2] [3 4 5] [6 7 8] + txt [9 10] + repeat_concat ==> [0 1 2 9 10 3 4 5 9 10 6 7 8 9 10] + 1. argsort re-index ==> [0 1 2 3 4 5 6 7 8 9 9 9 10 10 10] + split ==> vid_out [0 1 2 3 4 5 6 7 8] txt_out [9 9 9 10 10 10] + 2. reshape & mean for each sample to coalesce the repeated txt. + """ + vid_out, txt_out = all[src_idx].split([len(vid_idx), txt_idx_len]) + txt_out_coalesced = [] + for txt, repeat_time in zip(txt_out.split(repeat_txt_len), txt_repeat_list): + txt = txt.reshape(-1, repeat_time, *txt.shape[1:]).mean(1) + txt_out_coalesced.append(txt) + return vid_out, torch.cat(txt_out_coalesced) + + # Note: Backward of torch.index_select is non-deterministic when existing repeated index, + # the difference may cumulative like torch.repeat_interleave, so we use vanilla index here. + return ( + lambda vid, txt: torch.cat([vid, txt])[tgt_idx], + lambda all: unconcat_coalesce(all), + ) + + +def rearrange( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, int], +) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, +]: + return flatten([einops.rearrange(h, pattern, **kwargs) for h in unflatten(hid, hid_shape)]) + + +def rearrange_idx( + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, int], +) -> Tuple[Callable, Callable, torch.LongTensor]: + hid_idx = torch.arange(hid_shape.prod(-1).sum(), device=hid_shape.device).unsqueeze(-1) + tgt_idx, tgt_shape = rearrange(hid_idx, hid_shape, pattern, **kwargs) + tgt_idx = tgt_idx.squeeze(-1) + src_idx = torch.argsort(tgt_idx) + return ( + lambda hid: torch.index_select(hid, 0, tgt_idx), + lambda hid: torch.index_select(hid, 0, src_idx), + tgt_shape, + ) + + +def repeat( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, torch.LongTensor], # (b) +) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, +]: + hid = unflatten(hid, hid_shape) + kwargs = [{k: v[i].item() for k, v in kwargs.items()} for i in range(len(hid))] + return flatten([einops.repeat(h, pattern, **a) for h, a in zip(hid, kwargs)]) + + +def pack( + samples: List[torch.Tensor], # List of (h w c). +) -> Tuple[ + List[torch.Tensor], # groups [(b1 h1 w1 c1), (b2 h2 w2 c2)] + List[List[int]], # reversal indices. +]: + batches = {} + indices = {} + for i, sample in enumerate(samples): + shape = sample.shape + batches[shape] = batches.get(shape, []) + indices[shape] = indices.get(shape, []) + batches[shape].append(sample) + indices[shape].append(i) + + batches = list(map(torch.stack, batches.values())) + indices = list(indices.values()) + return batches, indices + + +def unpack( + batches: List[torch.Tensor], + indices: List[List[int]], +) -> List[torch.Tensor]: + samples = [None] * (max(chain(*indices)) + 1) + for batch, index in zip(batches, indices): + for sample, i in zip(batch.unbind(), index): + samples[i] = sample + return samples + + +def window( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + window_fn: Callable[[torch.Tensor], List[torch.Tensor]], +): + hid = unflatten(hid, hid_shape) + hid = list(map(window_fn, hid)) + hid_windows = torch.tensor(list(map(len, hid)), device=hid_shape.device) + hid, hid_shape = flatten(list(chain(*hid))) + return hid, hid_shape, hid_windows + + +def window_idx( + hid_shape: torch.LongTensor, # (b n) + window_fn: Callable[[torch.Tensor], List[torch.Tensor]], +): + hid_idx = torch.arange(hid_shape.prod(-1).sum(), device=hid_shape.device).unsqueeze(-1) + tgt_idx, tgt_shape, tgt_windows = window(hid_idx, hid_shape, window_fn) + tgt_idx = tgt_idx.squeeze(-1) + src_idx = torch.argsort(tgt_idx) + return ( + lambda hid: torch.index_select(hid, 0, tgt_idx), + lambda hid: torch.index_select(hid, 0, src_idx), + tgt_shape, + tgt_windows, + ) diff --git a/modules/seedvr/src/models/dit/nablocks/__init__.py b/modules/seedvr/src/models/dit/nablocks/__init__.py new file mode 100644 index 000000000..afa206db1 --- /dev/null +++ b/modules/seedvr/src/models/dit/nablocks/__init__.py @@ -0,0 +1,25 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from .mmsr_block import NaMMSRTransformerBlock + +nadit_blocks = { + "mmdit_sr": NaMMSRTransformerBlock, +} + + +def get_nablock(block_type: str): + if block_type in nadit_blocks: + return nadit_blocks[block_type] + raise NotImplementedError(f"{block_type} is not supported") diff --git a/modules/seedvr/src/models/dit/nablocks/mmsr_block.py b/modules/seedvr/src/models/dit/nablocks/mmsr_block.py new file mode 100644 index 000000000..48e548262 --- /dev/null +++ b/modules/seedvr/src/models/dit/nablocks/mmsr_block.py @@ -0,0 +1,248 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Tuple, Union +import torch +from einops import rearrange +from torch.nn import functional as F + +# from ..cache import Cache +from ....common.cache import Cache +from ....common.distributed.ops import gather_heads_scatter_seq, gather_seq_scatter_heads_qkv + +from .. import na +from ..attention import FlashAttentionVarlen +from ..blocks.mmdit_window_block import MMWindowAttention, MMWindowTransformerBlock +from ..mm import MMArg +from ..modulation import ada_layer_type +from ..normalization import norm_layer_type +from ..rope import NaRotaryEmbedding3d +from ..window import get_window_op +from ....common.half_precision_fixes import safe_pad_operation + +class NaSwinAttention(MMWindowAttention): + def __init__( + self, + vid_dim: int, + txt_dim: int, + heads: int, + head_dim: int, + qk_bias: bool, + qk_rope: bool, + qk_norm: norm_layer_type, + qk_norm_eps: float, + window: Union[int, Tuple[int, int, int]], + window_method: str, + shared_qkv: bool, + **kwargs, + ): + super().__init__( + vid_dim=vid_dim, + txt_dim=txt_dim, + heads=heads, + head_dim=head_dim, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + qk_norm_eps=qk_norm_eps, + window=window, + window_method=window_method, + shared_qkv=shared_qkv, + ) + self.rope = NaRotaryEmbedding3d(dim=head_dim // 2) if qk_rope else None + self.attn = FlashAttentionVarlen() + self.window_op = get_window_op(window_method) + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + + vid_qkv, txt_qkv = self.proj_qkv(vid, txt) + vid_qkv = gather_seq_scatter_heads_qkv( + vid_qkv, + seq_dim=0, + qkv_shape=vid_shape, + cache=cache.namespace("vid"), + ) + txt_qkv = gather_seq_scatter_heads_qkv( + txt_qkv, + seq_dim=0, + qkv_shape=txt_shape, + cache=cache.namespace("txt"), + ) + + # re-org the input seq for window attn + cache_win = cache.namespace(f"{self.window_method}_{self.window}_sd3") + + def make_window(x: torch.Tensor): + t, h, w, _ = x.shape + window_slices = self.window_op((t, h, w), self.window) + return [x[st, sh, sw] for (st, sh, sw) in window_slices] + + window_partition, window_reverse, window_shape, window_count = cache_win( + "win_transform", + lambda: na.window_idx(vid_shape, make_window), + ) + vid_qkv_win = window_partition(vid_qkv) + + vid_qkv_win = rearrange(vid_qkv_win, "l (o h d) -> l o h d", o=3, d=self.head_dim) + txt_qkv = rearrange(txt_qkv, "l (o h d) -> l o h d", o=3, d=self.head_dim) + + vid_q, vid_k, vid_v = vid_qkv_win.unbind(1) + txt_q, txt_k, txt_v = txt_qkv.unbind(1) + + vid_q, txt_q = self.norm_q(vid_q, txt_q) + vid_k, txt_k = self.norm_k(vid_k, txt_k) + + txt_len = cache("txt_len", lambda: txt_shape.prod(-1)) + + vid_len_win = cache_win("vid_len", lambda: window_shape.prod(-1)) + txt_len_win = cache_win("txt_len", lambda: txt_len.repeat_interleave(window_count)) + all_len_win = cache_win("all_len", lambda: vid_len_win + txt_len_win) + concat_win, unconcat_win = cache_win( + "mm_pnp", lambda: na.repeat_concat_idx(vid_len_win, txt_len, window_count) + ) + + # window rope + if self.rope: + vid_q, vid_k = self.rope(vid_q, vid_k, window_shape, cache_win) + + out = self.attn( + q=concat_win(vid_q, txt_q).bfloat16(), + k=concat_win(vid_k, txt_k).bfloat16(), + v=concat_win(vid_v, txt_v).bfloat16(), + cu_seqlens_q=cache_win( + "vid_seqlens_q", lambda: safe_pad_operation(all_len_win.cumsum(0), (1, 0)).int() + ), + cu_seqlens_k=cache_win( + "vid_seqlens_k", lambda: safe_pad_operation(all_len_win.cumsum(0), (1, 0)).int() + ), + max_seqlen_q=cache_win("vid_max_seqlen_q", lambda: all_len_win.max().item()), + max_seqlen_k=cache_win("vid_max_seqlen_k", lambda: all_len_win.max().item()), + ).type_as(vid_q) + + # text pooling + vid_out, txt_out = unconcat_win(out) + + vid_out = rearrange(vid_out, "l h d -> l (h d)") + txt_out = rearrange(txt_out, "l h d -> l (h d)") + vid_out = window_reverse(vid_out) + + vid_out = gather_heads_scatter_seq(vid_out, head_dim=1, seq_dim=0) + txt_out = gather_heads_scatter_seq(txt_out, head_dim=1, seq_dim=0) + + vid_out, txt_out = self.proj_out(vid_out, txt_out) + + return vid_out, txt_out + + +class NaMMSRTransformerBlock(MMWindowTransformerBlock): + def __init__( + self, + *, + vid_dim: int, + txt_dim: int, + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: norm_layer_type, + norm_eps: float, + ada: ada_layer_type, + qk_bias: bool, + qk_rope: bool, + qk_norm: norm_layer_type, + shared_qkv: bool, + shared_mlp: bool, + mlp_type: str, + **kwargs, + ): + super().__init__( + vid_dim=vid_dim, + txt_dim=txt_dim, + emb_dim=emb_dim, + heads=heads, + head_dim=head_dim, + expand_ratio=expand_ratio, + norm=norm, + norm_eps=norm_eps, + ada=ada, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + shared_qkv=shared_qkv, + shared_mlp=shared_mlp, + mlp_type=mlp_type, + **kwargs, + ) + + self.attn = NaSwinAttention( + vid_dim=vid_dim, + txt_dim=txt_dim, + heads=heads, + head_dim=head_dim, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + qk_norm_eps=norm_eps, + shared_qkv=shared_qkv, + **kwargs, + ) + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + emb: torch.FloatTensor, + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + torch.LongTensor, + torch.LongTensor, + ]: + hid_len = MMArg( + cache("vid_len", lambda: vid_shape.prod(-1)), + cache("txt_len", lambda: txt_shape.prod(-1)), + ) + ada_kwargs = { + "emb": emb, + "hid_len": hid_len, + "cache": cache, + "branch_tag": MMArg("vid", "txt"), + } + + vid_attn, txt_attn = self.attn_norm(vid, txt) + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, layer="attn", mode="in", **ada_kwargs) + vid_attn, txt_attn = self.attn(vid_attn, txt_attn, vid_shape, txt_shape, cache) + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, layer="attn", mode="out", **ada_kwargs) + vid_attn, txt_attn = (vid_attn + vid), (txt_attn + txt) + + vid_mlp, txt_mlp = self.mlp_norm(vid_attn, txt_attn) + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, layer="mlp", mode="in", **ada_kwargs) + vid_mlp, txt_mlp = self.mlp(vid_mlp, txt_mlp) + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, layer="mlp", mode="out", **ada_kwargs) + vid_mlp, txt_mlp = (vid_mlp + vid_attn), (txt_mlp + txt_attn) + + return vid_mlp, txt_mlp, vid_shape, txt_shape diff --git a/modules/seedvr/src/models/dit/nadit.py b/modules/seedvr/src/models/dit/nadit.py new file mode 100644 index 000000000..a67695206 --- /dev/null +++ b/modules/seedvr/src/models/dit/nadit.py @@ -0,0 +1,350 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from dataclasses import dataclass +from typing import Optional, Tuple, Union, Callable +import torch +from torch import nn + +from ...common.cache import Cache +from ...common.distributed.ops import slice_inputs + +from . import na +from .embedding import TimeEmbedding +from .modulation import get_ada_layer +from .nablocks import get_nablock +from .normalization import get_norm_layer +from .patch import NaPatchIn, NaPatchOut + +# Fake func, no checkpointing is required for inference +def gradient_checkpointing(module: Union[Callable, nn.Module], *args, enabled: bool, **kwargs): + return module(*args, **kwargs) + +@dataclass +class NaDiTOutput: + vid_sample: torch.Tensor + + +class NaDiT(nn.Module): + """ + Native Resolution Diffusion Transformer (NaDiT) + """ + + gradient_checkpointing = False + + def __init__( + self, + vid_in_channels: int, + vid_out_channels: int, + vid_dim: int, + txt_in_dim: Optional[int], + txt_dim: Optional[int], + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: Optional[str], + norm_eps: float, + ada: str, + qk_bias: bool, + qk_rope: bool, + qk_norm: Optional[str], + patch_size: Union[int, Tuple[int, int, int]], + num_layers: int, + block_type: Union[str, Tuple[str]], + shared_qkv: bool = False, + shared_mlp: bool = False, + mlp_type: str = "normal", + window: Optional[Tuple] = None, + window_method: Optional[Tuple[str]] = None, + temporal_window_size: int = None, + temporal_shifted: bool = False, + **kwargs, + ): + ada = get_ada_layer(ada) + norm = get_norm_layer(norm) + qk_norm = get_norm_layer(qk_norm) + if isinstance(block_type, str): + block_type = [block_type] * num_layers + elif len(block_type) != num_layers: + raise ValueError("The ``block_type`` list should equal to ``num_layers``.") + super().__init__() + self.vid_in = NaPatchIn( + in_channels=vid_in_channels, + patch_size=patch_size, + dim=vid_dim, + ) + self.txt_in = ( + nn.Linear(txt_in_dim, txt_dim) + if txt_in_dim and txt_in_dim != txt_dim + else nn.Identity() + ) + self.emb_in = TimeEmbedding( + sinusoidal_dim=256, + hidden_dim=max(vid_dim, txt_dim), + output_dim=emb_dim, + ) + + if window is None or isinstance(window[0], int): + window = [window] * num_layers + if window_method is None or isinstance(window_method, str): + window_method = [window_method] * num_layers + if temporal_window_size is None or isinstance(temporal_window_size, int): + temporal_window_size = [temporal_window_size] * num_layers + if temporal_shifted is None or isinstance(temporal_shifted, bool): + temporal_shifted = [temporal_shifted] * num_layers + + self.blocks = nn.ModuleList( + [ + get_nablock(block_type[i])( + vid_dim=vid_dim, + txt_dim=txt_dim, + emb_dim=emb_dim, + heads=heads, + head_dim=head_dim, + expand_ratio=expand_ratio, + norm=norm, + norm_eps=norm_eps, + ada=ada, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + shared_qkv=shared_qkv, + shared_mlp=shared_mlp, + mlp_type=mlp_type, + window=window[i], + window_method=window_method[i], + temporal_window_size=temporal_window_size[i], + temporal_shifted=temporal_shifted[i], + **kwargs, + ) + for i in range(num_layers) + ] + ) + self.vid_out = NaPatchOut( + out_channels=vid_out_channels, + patch_size=patch_size, + dim=vid_dim, + ) + + self.need_txt_repeat = block_type[0] in [ + "mmdit_stwin", + "mmdit_stwin_spatial", + "mmdit_stwin_3d_spatial", + ] + + def set_gradient_checkpointing(self, enable: bool): + self.gradient_checkpointing = enable + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + timestep: Union[int, float, torch.IntTensor, torch.FloatTensor], # b + disable_cache: bool = True, # for test + ): + # Text input. + if txt_shape.size(-1) == 1 and self.need_txt_repeat: + txt, txt_shape = na.repeat(txt, txt_shape, "l c -> t l c", t=vid_shape[:, 0]) + # slice vid after patching in when using sequence parallelism + txt = slice_inputs(txt, dim=0) + txt = self.txt_in(txt) + + # Video input. + # Sequence parallel slicing is done inside patching class. + vid, vid_shape = self.vid_in(vid, vid_shape) + + # Embedding input. + emb = self.emb_in(timestep, device=vid.device, dtype=vid.dtype) + + # Body + cache = Cache(disable=disable_cache) + for i, block in enumerate(self.blocks): + vid, txt, vid_shape, txt_shape = gradient_checkpointing( + enabled=(self.gradient_checkpointing and self.training), + module=block, + vid=vid, + txt=txt, + vid_shape=vid_shape, + txt_shape=txt_shape, + emb=emb, + cache=cache, + ) + + vid, vid_shape = self.vid_out(vid, vid_shape, cache) + return NaDiTOutput(vid_sample=vid) + + +class NaDiTUpscaler(nn.Module): + """ + Native Resolution Diffusion Transformer (NaDiT) + """ + + gradient_checkpointing = False + + def __init__( + self, + vid_in_channels: int, + vid_out_channels: int, + vid_dim: int, + txt_in_dim: Optional[int], + txt_dim: Optional[int], + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: Optional[str], + norm_eps: float, + ada: str, + qk_bias: bool, + qk_rope: bool, + qk_norm: Optional[str], + patch_size: Union[int, Tuple[int, int, int]], + num_layers: int, + block_type: Union[str, Tuple[str]], + shared_qkv: bool = False, + shared_mlp: bool = False, + mlp_type: str = "normal", + window: Optional[Tuple] = None, + window_method: Optional[Tuple[str]] = None, + temporal_window_size: int = None, + temporal_shifted: bool = False, + **kwargs, + ): + ada = get_ada_layer(ada) + norm = get_norm_layer(norm) + qk_norm = get_norm_layer(qk_norm) + if isinstance(block_type, str): + block_type = [block_type] * num_layers + elif len(block_type) != num_layers: + raise ValueError("The ``block_type`` list should equal to ``num_layers``.") + super().__init__() + self.vid_in = NaPatchIn( + in_channels=vid_in_channels, + patch_size=patch_size, + dim=vid_dim, + ) + self.txt_in = ( + nn.Linear(txt_in_dim, txt_dim) + if txt_in_dim and txt_in_dim != txt_dim + else nn.Identity() + ) + self.emb_in = TimeEmbedding( + sinusoidal_dim=256, + hidden_dim=max(vid_dim, txt_dim), + output_dim=emb_dim, + ) + + self.emb_scale = TimeEmbedding( + sinusoidal_dim=256, + hidden_dim=max(vid_dim, txt_dim), + output_dim=emb_dim, + ) + + if window is None or isinstance(window[0], int): + window = [window] * num_layers + if window_method is None or isinstance(window_method, str): + window_method = [window_method] * num_layers + if temporal_window_size is None or isinstance(temporal_window_size, int): + temporal_window_size = [temporal_window_size] * num_layers + if temporal_shifted is None or isinstance(temporal_shifted, bool): + temporal_shifted = [temporal_shifted] * num_layers + + self.blocks = nn.ModuleList( + [ + get_nablock(block_type[i])( + vid_dim=vid_dim, + txt_dim=txt_dim, + emb_dim=emb_dim, + heads=heads, + head_dim=head_dim, + expand_ratio=expand_ratio, + norm=norm, + norm_eps=norm_eps, + ada=ada, + qk_bias=qk_bias, + qk_rope=qk_rope, + qk_norm=qk_norm, + shared_qkv=shared_qkv, + shared_mlp=shared_mlp, + mlp_type=mlp_type, + window=window[i], + window_method=window_method[i], + temporal_window_size=temporal_window_size[i], + temporal_shifted=temporal_shifted[i], + **kwargs, + ) + for i in range(num_layers) + ] + ) + self.vid_out = NaPatchOut( + out_channels=vid_out_channels, + patch_size=patch_size, + dim=vid_dim, + ) + + self.need_txt_repeat = block_type[0] in [ + "mmdit_stwin", + "mmdit_stwin_spatial", + "mmdit_stwin_3d_spatial", + ] + + def set_gradient_checkpointing(self, enable: bool): + self.gradient_checkpointing = enable + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + timestep: Union[int, float, torch.IntTensor, torch.FloatTensor], # b + downscale: Union[int, float, torch.IntTensor, torch.FloatTensor], # b + disable_cache: bool = False, # for test + ): + + # Text input. + if txt_shape.size(-1) == 1 and self.need_txt_repeat: + txt, txt_shape = na.repeat(txt, txt_shape, "l c -> t l c", t=vid_shape[:, 0]) + # slice vid after patching in when using sequence parallelism + txt = slice_inputs(txt, dim=0) + txt = self.txt_in(txt) + + # Video input. + # Sequence parallel slicing is done inside patching class. + vid, vid_shape = self.vid_in(vid, vid_shape) + + # Embedding input. + emb = self.emb_in(timestep, device=vid.device, dtype=vid.dtype) + emb_scale = self.emb_scale(downscale, device=vid.device, dtype=vid.dtype) + emb = emb + emb_scale + + # Body + cache = Cache(disable=disable_cache) + for i, block in enumerate(self.blocks): + vid, txt, vid_shape, txt_shape = gradient_checkpointing( + enabled=(self.gradient_checkpointing and self.training), + module=block, + vid=vid, + txt=txt, + vid_shape=vid_shape, + txt_shape=txt_shape, + emb=emb, + cache=cache, + ) + + vid, vid_shape = self.vid_out(vid, vid_shape, cache) + return NaDiTOutput(vid_sample=vid) diff --git a/modules/seedvr/src/models/dit/normalization.py b/modules/seedvr/src/models/dit/normalization.py new file mode 100644 index 000000000..faa2d0d88 --- /dev/null +++ b/modules/seedvr/src/models/dit/normalization.py @@ -0,0 +1,131 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Callable, Optional +from diffusers.models.normalization import RMSNorm +from torch import nn +import torch +import torch.nn.functional as F +import numbers +from torch.nn.parameter import Parameter +from torch.nn import init + +# (dim: int, eps: float, elementwise_affine: bool) +norm_layer_type = Callable[[int, float, bool], nn.Module] + + +class CustomLayerNorm(nn.Module): + """ + Custom LayerNorm implementation to replace Apex FusedLayerNorm + """ + def __init__(self, normalized_shape, eps=1e-5, elementwise_affine=True): + super(CustomLayerNorm, self).__init__() + + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape,) + self.normalized_shape = torch.Size(normalized_shape) + self.eps = eps + self.elementwise_affine = elementwise_affine + + if self.elementwise_affine: + self.weight = Parameter(torch.Tensor(*normalized_shape)) + self.bias = Parameter(torch.Tensor(*normalized_shape)) + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + self.reset_parameters() + + def reset_parameters(self): + if self.elementwise_affine: + init.ones_(self.weight) + init.zeros_(self.bias) + + def forward(self, input): + return F.layer_norm( + input, self.normalized_shape, self.weight, self.bias, self.eps) + + +class CustomRMSNorm(nn.Module): + """ + Custom RMSNorm implementation to replace Apex FusedRMSNorm + """ + def __init__(self, normalized_shape, eps=1e-5, elementwise_affine=True): + super(CustomRMSNorm, self).__init__() + + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape,) + self.normalized_shape = torch.Size(normalized_shape) + self.eps = eps + self.elementwise_affine = elementwise_affine + + if self.elementwise_affine: + self.weight = Parameter(torch.ones(*normalized_shape)) + else: + self.register_parameter('weight', None) + + def forward(self, input): + # RMS normalization: x / sqrt(mean(x^2) + eps) * weight + dims = tuple(range(-len(self.normalized_shape), 0)) + + # Calculate RMS: sqrt(mean(x^2)) + variance = input.pow(2).mean(dim=dims, keepdim=True) + rms = torch.sqrt(variance + self.eps) + + # Normalize + normalized = input / rms + + if self.elementwise_affine: + return normalized * self.weight + return normalized + + +def get_norm_layer(norm_type: Optional[str]) -> norm_layer_type: + + def _norm_layer(dim: int, eps: float, elementwise_affine: bool): + if norm_type is None: + return nn.Identity() + + if norm_type == "layer": + return nn.LayerNorm( + normalized_shape=dim, + eps=eps, + elementwise_affine=elementwise_affine, + ) + + if norm_type == "rms": + return RMSNorm( + dim=dim, + eps=eps, + elementwise_affine=elementwise_affine, + ) + + if norm_type == "fusedln": + # Use custom LayerNorm instead of Apex FusedLayerNorm + return CustomLayerNorm( + normalized_shape=dim, + elementwise_affine=elementwise_affine, + eps=eps, + ) + + if norm_type == "fusedrms": + # Use custom RMSNorm instead of Apex FusedRMSNorm + return CustomRMSNorm( + normalized_shape=dim, + elementwise_affine=elementwise_affine, + eps=eps, + ) + + raise NotImplementedError(f"{norm_type} is not supported") + + return _norm_layer diff --git a/modules/seedvr/src/models/dit/patch.py b/modules/seedvr/src/models/dit/patch.py new file mode 100644 index 000000000..570e3ae40 --- /dev/null +++ b/modules/seedvr/src/models/dit/patch.py @@ -0,0 +1,112 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Tuple, Union +import torch +from einops import rearrange +from torch import nn +from torch.nn.modules.utils import _triple + +from ...common.cache import Cache +from ...common.distributed.ops import gather_outputs, slice_inputs + +from . import na + + +class PatchIn(nn.Module): + def __init__( + self, + in_channels: int, + patch_size: Union[int, Tuple[int, int, int]], + dim: int, + ): + super().__init__() + t, h, w = _triple(patch_size) + self.patch_size = t, h, w + self.proj = nn.Linear(in_channels * t * h * w, dim) + + def forward( + self, + vid: torch.Tensor, + ) -> torch.Tensor: + t, h, w = self.patch_size + vid = rearrange(vid, "b c (T t) (H h) (W w) -> b T H W (t h w c)", t=t, h=h, w=w) + vid = self.proj(vid) + return vid + + +class PatchOut(nn.Module): + def __init__( + self, + out_channels: int, + patch_size: Union[int, Tuple[int, int, int]], + dim: int, + ): + super().__init__() + t, h, w = _triple(patch_size) + self.patch_size = t, h, w + self.proj = nn.Linear(dim, out_channels * t * h * w) + + def forward( + self, + vid: torch.Tensor, + ) -> torch.Tensor: + t, h, w = self.patch_size + vid = self.proj(vid) + vid = rearrange(vid, "b T H W (t h w c) -> b c (T t) (H h) (W w)", t=t, h=h, w=w) + return vid + + +class NaPatchIn(PatchIn): + def forward( + self, + vid: torch.Tensor, # l c + vid_shape: torch.LongTensor, + ) -> torch.Tensor: + t, h, w = self.patch_size + if not (t == h == w == 1): + vid, vid_shape = na.rearrange( + vid, vid_shape, "(T t) (H h) (W w) c -> T H W (t h w c)", t=t, h=h, w=w + ) + # slice vid after patching in when using sequence parallelism + vid = slice_inputs(vid, dim=0) + vid = self.proj(vid) + return vid, vid_shape + + +class NaPatchOut(PatchOut): + def forward( + self, + vid: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, + cache: Cache = Cache(disable=True), + ) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, + ]: + t, h, w = self.patch_size + vid = self.proj(vid) + # gather vid before patching out when enabling sequence parallelism + vid = gather_outputs( + vid, + gather_dim=0, + padding_dim=0, + unpad_shape=vid_shape, + cache=cache.namespace("vid"), + ) + if not (t == h == w == 1): + vid, vid_shape = na.rearrange( + vid, vid_shape, "T H W (t h w c) -> (T t) (H h) (W w) c", t=t, h=h, w=w + ) + return vid, vid_shape diff --git a/modules/seedvr/src/models/dit/rope.py b/modules/seedvr/src/models/dit/rope.py new file mode 100644 index 000000000..3aded8fed --- /dev/null +++ b/modules/seedvr/src/models/dit/rope.py @@ -0,0 +1,102 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from functools import lru_cache +from typing import Tuple +import torch +from einops import rearrange +from rotary_embedding_torch import RotaryEmbedding, apply_rotary_emb +from torch import nn + +from ...common.cache import Cache + + +class RotaryEmbeddingBase(nn.Module): + def __init__(self, dim: int, rope_dim: int): + super().__init__() + self.rope = RotaryEmbedding( + dim=dim // rope_dim, + freqs_for="pixel", + max_freq=256, + ) + # 1. Set model.requires_grad_(True) after model creation will make + # the `requires_grad=False` for rope freqs no longer hold. + # 2. Even if we don't set requires_grad_(True) explicitly, + # FSDP is not memory efficient when handling fsdp_wrap + # with mixed requires_grad=True/False. + # With above consideration, it is easier just remove the freqs + # out of nn.Parameters when `learned_freq=False` + freqs = self.rope.freqs + del self.rope.freqs + self.rope.register_buffer("freqs", freqs.data) + + @lru_cache(maxsize=128) + def get_axial_freqs(self, *dims): + return self.rope.get_axial_freqs(*dims) + + +class RotaryEmbedding3d(RotaryEmbeddingBase): + def __init__(self, dim: int): + super().__init__(dim, rope_dim=3) + + def forward( + self, + q: torch.FloatTensor, # b h l d + k: torch.FloatTensor, # b h l d + size: Tuple[int, int, int], + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + T, H, W = size + freqs = self.get_axial_freqs(T, H, W) + q = rearrange(q, "b h (T H W) d -> b h T H W d", T=T, H=H, W=W) + k = rearrange(k, "b h (T H W) d -> b h T H W d", T=T, H=H, W=W) + q = apply_rotary_emb(freqs, q) + k = apply_rotary_emb(freqs, k) + q = rearrange(q, "b h T H W d -> b h (T H W) d") + k = rearrange(k, "b h T H W d -> b h (T H W) d") + return q, k + + +class NaRotaryEmbedding3d(RotaryEmbedding3d): + def forward( + self, + q: torch.FloatTensor, # L h d + k: torch.FloatTensor, # L h d + shape: torch.LongTensor, + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + freqs = cache("rope_freqs_3d", lambda: self.get_freqs(shape)) + freqs = freqs.to(device=q.device, dtype=q.dtype) + q = rearrange(q, "L h d -> h L d") + k = rearrange(k, "L h d -> h L d") + q = apply_rotary_emb(freqs, q.float()).to(q.dtype) + k = apply_rotary_emb(freqs, k.float()).to(k.dtype) + q = rearrange(q, "h L d -> L h d") + k = rearrange(k, "h L d -> L h d") + return q, k + + def get_freqs( + self, + shape: torch.LongTensor, + ) -> torch.Tensor: + freq_list = [] + for f, h, w in shape.tolist(): + freqs = self.get_axial_freqs(f, h, w) + freq_list.append(freqs.view(-1, freqs.size(-1))) + return torch.cat(freq_list, dim=0) diff --git a/modules/seedvr/src/models/dit/window.py b/modules/seedvr/src/models/dit/window.py new file mode 100644 index 000000000..f77ea57d7 --- /dev/null +++ b/modules/seedvr/src/models/dit/window.py @@ -0,0 +1,83 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from math import ceil +from typing import Tuple +import math + +def get_window_op(name: str): + if name == "720pwin_by_size_bysize": + return make_720Pwindows_bysize + if name == "720pswin_by_size_bysize": + return make_shifted_720Pwindows_bysize + raise ValueError(f"Unknown windowing method: {name}") + + +# -------------------------------- Windowing -------------------------------- # +def make_720Pwindows_bysize(size: Tuple[int, int, int], num_windows: Tuple[int, int, int]): + t, h, w = size + resized_nt, resized_nh, resized_nw = num_windows + #cal windows under 720p + scale = math.sqrt((45 * 80) / (h * w)) + resized_h, resized_w = round(h * scale), round(w * scale) + wh, ww = ceil(resized_h / resized_nh), ceil(resized_w / resized_nw) # window size. + wt = ceil(min(t, 30) / resized_nt) # window size. + nt, nh, nw = ceil(t / wt), ceil(h / wh), ceil(w / ww) # window size. + return [ + ( + slice(it * wt, min((it + 1) * wt, t)), + slice(ih * wh, min((ih + 1) * wh, h)), + slice(iw * ww, min((iw + 1) * ww, w)), + ) + for iw in range(nw) + if min((iw + 1) * ww, w) > iw * ww + for ih in range(nh) + if min((ih + 1) * wh, h) > ih * wh + for it in range(nt) + if min((it + 1) * wt, t) > it * wt + ] + +def make_shifted_720Pwindows_bysize(size: Tuple[int, int, int], num_windows: Tuple[int, int, int]): + t, h, w = size + resized_nt, resized_nh, resized_nw = num_windows + #cal windows under 720p + scale = math.sqrt((45 * 80) / (h * w)) + resized_h, resized_w = round(h * scale), round(w * scale) + wh, ww = ceil(resized_h / resized_nh), ceil(resized_w / resized_nw) # window size. + wt = ceil(min(t, 30) / resized_nt) # window size. + + st, sh, sw = ( # shift size. + 0.5 if wt < t else 0, + 0.5 if wh < h else 0, + 0.5 if ww < w else 0, + ) + nt, nh, nw = ceil((t - st) / wt), ceil((h - sh) / wh), ceil((w - sw) / ww) # window size. + nt, nh, nw = ( # number of window. + nt + 1 if st > 0 else 1, + nh + 1 if sh > 0 else 1, + nw + 1 if sw > 0 else 1, + ) + return [ + ( + slice(max(int((it - st) * wt), 0), min(int((it - st + 1) * wt), t)), + slice(max(int((ih - sh) * wh), 0), min(int((ih - sh + 1) * wh), h)), + slice(max(int((iw - sw) * ww), 0), min(int((iw - sw + 1) * ww), w)), + ) + for iw in range(nw) + if min(int((iw - sw + 1) * ww), w) > max(int((iw - sw) * ww), 0) + for ih in range(nh) + if min(int((ih - sh + 1) * wh), h) > max(int((ih - sh) * wh), 0) + for it in range(nt) + if min(int((it - st + 1) * wt), t) > max(int((it - st) * wt), 0) + ] diff --git a/modules/seedvr/src/models/dit_v2/attention.py b/modules/seedvr/src/models/dit_v2/attention.py new file mode 100644 index 000000000..5a93ba30a --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/attention.py @@ -0,0 +1,93 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import torch +import torch.nn.functional as F + +#from flash_attn import flash_attn_varlen_func + +from torch import nn + + +def pytorch_varlen_attention(q, k, v, cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k, dropout_p=0.0, softmax_scale=None, causal=False, deterministic=False): + """ + A PyTorch-based implementation of variable-length attention to replace flash_attn_varlen_func. + It processes each sequence in the batch individually. + """ + # Create an empty tensor to store the output. + output = torch.empty_like(q) + + # Iterate over each sequence in the batch. The batch size is the number of sequences. + for i in range(len(cu_seqlens_q) - 1): + # Determine the start and end indices for the current sequence. + start_q, end_q = cu_seqlens_q[i], cu_seqlens_q[i+1] + start_k, end_k = cu_seqlens_k[i], cu_seqlens_k[i+1] + + # Slice the q, k, and v tensors to get the data for the current sequence. + # The shape is (seq_len, heads, head_dim). + q_i = q[start_q:end_q] + k_i = k[start_k:end_k] + v_i = v[start_k:end_k] + + # Reshape for torch's scaled_dot_product_attention which expects (batch, heads, seq, dim). + # Here, we treat each sequence as a batch of 1. + q_i = q_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_q, head_dim) + k_i = k_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_k, head_dim) + v_i = v_i.permute(1, 0, 2).unsqueeze(0) # (1, heads, seq_len_k, head_dim) + + # Use PyTorch's built-in scaled dot-product attention. + output_i = F.scaled_dot_product_attention( + q_i, k_i, v_i, + dropout_p=dropout_p if not deterministic else 0.0, + is_causal=causal + ) + + # Reshape the output back to the original format (seq_len, heads, head_dim) + output_i = output_i.squeeze(0).permute(1, 0, 2) + + # Place the result for the current sequence into the main output tensor. + output[start_q:end_q] = output_i + + return output + +class TorchAttention(nn.Module): + def tflops(self, args, kwargs, output) -> float: + assert len(args) == 0 or len(args) > 2, "query, key should both provided by args / kwargs" + q = kwargs.get("query") or args[0] + k = kwargs.get("key") or args[1] + b, h, sq, d = q.shape + b, h, sk, d = k.shape + return b * h * (4 * d * (sq / 1e6) * (sk / 1e6)) + + def forward(self, *args, **kwargs): + return F.scaled_dot_product_attention(*args, **kwargs) + + +class FlashAttentionVarlen(nn.Module): + def tflops(self, args, kwargs, output) -> float: + cu_seqlens_q = kwargs["cu_seqlens_q"] + cu_seqlens_k = kwargs["cu_seqlens_k"] + _, h, d = output.shape + seqlens_q = (cu_seqlens_q[1:] - cu_seqlens_q[:-1]) / 1e6 + seqlens_k = (cu_seqlens_k[1:] - cu_seqlens_k[:-1]) / 1e6 + return h * (4 * d * (seqlens_q * seqlens_k).sum()) + + def forward(self, *args, **kwargs): + kwargs["deterministic"] = torch.are_deterministic_algorithms_enabled() + try: + from flash_attn import flash_attn_varlen_func + return flash_attn_varlen_func(*args, **kwargs) + except ImportError: + return pytorch_varlen_attention(*args, **kwargs) + diff --git a/modules/seedvr/src/models/dit_v2/embedding.py b/modules/seedvr/src/models/dit_v2/embedding.py new file mode 100644 index 000000000..e972244f5 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/embedding.py @@ -0,0 +1,62 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional, Union +import torch +from diffusers.models.embeddings import get_timestep_embedding +from torch import nn + + +def emb_add(emb1: torch.Tensor, emb2: Optional[torch.Tensor]): + return emb1 if emb2 is None else emb1 + emb2 + + +class TimeEmbedding(nn.Module): + def __init__( + self, + sinusoidal_dim: int, + hidden_dim: int, + output_dim: int, + ): + super().__init__() + self.sinusoidal_dim = sinusoidal_dim + self.proj_in = nn.Linear(sinusoidal_dim, hidden_dim) + self.proj_hid = nn.Linear(hidden_dim, hidden_dim) + self.proj_out = nn.Linear(hidden_dim, output_dim) + self.act = nn.SiLU() + + def forward( + self, + timestep: Union[int, float, torch.IntTensor, torch.FloatTensor], + device: torch.device, + dtype: torch.dtype, + ) -> torch.FloatTensor: + if not torch.is_tensor(timestep): + timestep = torch.tensor([timestep], device=device, dtype=dtype) + if timestep.ndim == 0: + timestep = timestep[None] + + emb = get_timestep_embedding( + timesteps=timestep, + embedding_dim=self.sinusoidal_dim, + flip_sin_to_cos=False, + downscale_freq_shift=0, + ) + emb = emb.to(dtype) + emb = self.proj_in(emb) + emb = self.act(emb) + emb = self.proj_hid(emb) + emb = self.act(emb) + emb = self.proj_out(emb) + return emb diff --git a/modules/seedvr/src/models/dit_v2/mlp.py b/modules/seedvr/src/models/dit_v2/mlp.py new file mode 100644 index 000000000..2d05cb021 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/mlp.py @@ -0,0 +1,62 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional +import torch +import torch.nn.functional as F +from torch import nn + + +def get_mlp(mlp_type: Optional[str] = "normal"): + if mlp_type == "normal": + return MLP + elif mlp_type == "swiglu": + return SwiGLUMLP + + +class MLP(nn.Module): + def __init__( + self, + dim: int, + expand_ratio: int, + ): + super().__init__() + self.proj_in = nn.Linear(dim, dim * expand_ratio) + self.act = nn.GELU("tanh") + self.proj_out = nn.Linear(dim * expand_ratio, dim) + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + x = self.proj_in(x) + x = self.act(x) + x = self.proj_out(x) + return x + + +class SwiGLUMLP(nn.Module): + def __init__( + self, + dim: int, + expand_ratio: int, + multiple_of: int = 256, + ): + super().__init__() + hidden_dim = int(2 * dim * expand_ratio / 3) + hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + self.proj_in_gate = nn.Linear(dim, hidden_dim, bias=False) + self.proj_out = nn.Linear(hidden_dim, dim, bias=False) + self.proj_in = nn.Linear(dim, hidden_dim, bias=False) + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + x = self.proj_out(F.silu(self.proj_in_gate(x)) * self.proj_in(x)) + return x diff --git a/modules/seedvr/src/models/dit_v2/mm.py b/modules/seedvr/src/models/dit_v2/mm.py new file mode 100644 index 000000000..344f89a8f --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/mm.py @@ -0,0 +1,74 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Tuple +import torch +from torch import nn + + +@dataclass +class MMArg: + vid: Any + txt: Any + + +def get_args(key: str, args: List[Any]) -> List[Any]: + return [getattr(v, key) if isinstance(v, MMArg) else v for v in args] + + +def get_kwargs(key: str, kwargs: Dict[str, Any]) -> Dict[str, Any]: + return {k: getattr(v, key) if isinstance(v, MMArg) else v for k, v in kwargs.items()} + + +class MMModule(nn.Module): + def __init__( + self, + module: Callable[..., nn.Module], + *args, + shared_weights: bool = False, + vid_only: bool = False, + **kwargs, + ): + super().__init__() + self.shared_weights = shared_weights + self.vid_only = vid_only + if self.shared_weights: + assert get_args("vid", args) == get_args("txt", args) + assert get_kwargs("vid", kwargs) == get_kwargs("txt", kwargs) + self.all = module(*get_args("vid", args), **get_kwargs("vid", kwargs)) + else: + self.vid = module(*get_args("vid", args), **get_kwargs("vid", kwargs)) + self.txt = ( + module(*get_args("txt", args), **get_kwargs("txt", kwargs)) + if not vid_only + else None + ) + + def forward( + self, + vid: torch.FloatTensor, + txt: torch.FloatTensor, + *args, + **kwargs, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + vid_module = self.vid if not self.shared_weights else self.all + vid = vid_module(vid, *get_args("vid", args), **get_kwargs("vid", kwargs)) + if not self.vid_only: + txt_module = self.txt if not self.shared_weights else self.all + txt = txt_module(txt, *get_args("txt", args), **get_kwargs("txt", kwargs)) + return vid, txt diff --git a/modules/seedvr/src/models/dit_v2/modulation.py b/modules/seedvr/src/models/dit_v2/modulation.py new file mode 100644 index 000000000..a10c49f3e --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/modulation.py @@ -0,0 +1,118 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Callable, List, Optional +import torch +from einops import rearrange +from torch import nn + +from ...common.cache import Cache +from ...common.distributed.ops import slice_inputs + +# (dim: int, emb_dim: int) +ada_layer_type = Callable[[int, int], nn.Module] + + +def get_ada_layer(ada_layer: str) -> ada_layer_type: + if ada_layer == "single": + return AdaSingle + raise NotImplementedError(f"{ada_layer} is not supported") + + +def expand_dims(x: torch.Tensor, dim: int, ndim: int): + """ + Expand tensor "x" to "ndim" by adding empty dims at "dim". + Example: x is (b d), target ndim is 5, add dim at 1, return (b 1 1 1 d). + """ + shape = x.shape + shape = shape[:dim] + (1,) * (ndim - len(shape)) + shape[dim:] + return x.reshape(shape) + + +class AdaSingle(nn.Module): + def __init__( + self, + dim: int, + emb_dim: int, + layers: List[str], + modes: List[str] = ["in", "out"], + ): + assert emb_dim == 6 * dim, "AdaSingle requires emb_dim == 6 * dim" + super().__init__() + self.dim = dim + self.emb_dim = emb_dim + self.layers = layers + for l in layers: + if "in" in modes: + self.register_parameter(f"{l}_shift", nn.Parameter(torch.randn(dim) / dim**0.5)) + self.register_parameter( + f"{l}_scale", nn.Parameter(torch.randn(dim) / dim**0.5 + 1) + ) + if "out" in modes: + self.register_parameter(f"{l}_gate", nn.Parameter(torch.randn(dim) / dim**0.5)) + + def forward( + self, + hid: torch.FloatTensor, # b ... c + emb: torch.FloatTensor, # b d + layer: str, + mode: str, + cache: Cache = Cache(disable=True), + branch_tag: str = "", + hid_len: Optional[torch.LongTensor] = None, # b + ) -> torch.FloatTensor: + idx = self.layers.index(layer) + emb = rearrange(emb, "b (d l g) -> b d l g", l=len(self.layers), g=3)[..., idx, :] + emb = expand_dims(emb, 1, hid.ndim + 1) + + if hid_len is not None: + emb = cache( + f"emb_repeat_{idx}_{branch_tag}", + lambda: slice_inputs( + torch.cat([e.repeat(l, *([1] * e.ndim)) for e, l in zip(emb, hid_len)]), + dim=0, + ), + ) + + shiftA, scaleA, gateA = emb.unbind(-1) + shiftB, scaleB, gateB = ( + getattr(self, f"{layer}_shift", None), + getattr(self, f"{layer}_scale", None), + getattr(self, f"{layer}_gate", None), + ) + + # 🚀 FP8 COMPATIBILITY: Convert parameters to match embedding dtype + # This prevents "Promotion for Float8 Types is not supported" errors + target_dtype = shiftA.dtype + + if mode == "in": + # Convert parameters to match embedding dtype for FP8 compatibility + if scaleB is not None and scaleB.dtype != target_dtype: + scaleB = scaleB.to(target_dtype) + if shiftB is not None and shiftB.dtype != target_dtype: + shiftB = shiftB.to(target_dtype) + + return hid.mul_(scaleA + scaleB).add_(shiftA + shiftB) + + if mode == "out": + # Convert gate parameter to match embedding dtype for FP8 compatibility + if gateB is not None and gateB.dtype != target_dtype: + gateB = gateB.to(target_dtype) + + return hid.mul_(gateA + gateB) + + raise NotImplementedError + + def extra_repr(self) -> str: + return f"dim={self.dim}, emb_dim={self.emb_dim}, layers={self.layers}" diff --git a/modules/seedvr/src/models/dit_v2/na.py b/modules/seedvr/src/models/dit_v2/na.py new file mode 100644 index 000000000..0dbd546c4 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/na.py @@ -0,0 +1,241 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from itertools import chain +from typing import Callable, Dict, List, Tuple +import einops +import torch + + +def flatten( + hid: List[torch.FloatTensor], # List of (*** c) +) -> Tuple[ + torch.FloatTensor, # (L c) + torch.LongTensor, # (b n) +]: + assert len(hid) > 0 + shape = torch.stack([torch.tensor(x.shape[:-1], device=hid[0].device) for x in hid]) + hid = torch.cat([x.flatten(0, -2) for x in hid]) + return hid, shape + + +def unflatten( + hid: torch.FloatTensor, # (L c) or (L ... c) + hid_shape: torch.LongTensor, # (b n) +) -> List[torch.Tensor]: # List of (*** c) or (*** ... c) + hid_len = hid_shape.prod(-1) + hid = hid.split(hid_len.tolist()) + hid = [x.unflatten(0, s.tolist()) for x, s in zip(hid, hid_shape)] + return hid + + +def concat( + vid: torch.FloatTensor, # (VL ... c) + txt: torch.FloatTensor, # (TL ... c) + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> torch.FloatTensor: # (L ... c) + vid = torch.split(vid, vid_len.tolist()) + txt = torch.split(txt, txt_len.tolist()) + return torch.cat(list(chain(*zip(vid, txt)))) + + +def concat_idx( + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> Tuple[ + Callable, + Callable, +]: + device = vid_len.device + vid_idx = torch.arange(vid_len.sum(), device=device) + txt_idx = torch.arange(len(vid_idx), len(vid_idx) + txt_len.sum(), device=device) + tgt_idx = concat(vid_idx, txt_idx, vid_len, txt_len) + src_idx = torch.argsort(tgt_idx) + return ( + lambda vid, txt: torch.index_select(torch.cat([vid, txt]), 0, tgt_idx), + lambda all: torch.index_select(all, 0, src_idx).split([len(vid_idx), len(txt_idx)]), + ) + + +def unconcat( + all: torch.FloatTensor, # (L ... c) + vid_len: torch.LongTensor, # (b) + txt_len: torch.LongTensor, # (b) +) -> Tuple[ + torch.FloatTensor, # (VL ... c) + torch.FloatTensor, # (TL ... c) +]: + interleave_len = list(chain(*zip(vid_len.tolist(), txt_len.tolist()))) + all = all.split(interleave_len) + vid = torch.cat(all[0::2]) + txt = torch.cat(all[1::2]) + return vid, txt + + +def repeat_concat( + vid: torch.FloatTensor, # (VL ... c) + txt: torch.FloatTensor, # (TL ... c) + vid_len: torch.LongTensor, # (n*b) + txt_len: torch.LongTensor, # (b) + txt_repeat: List, # (n) +) -> torch.FloatTensor: # (L ... c) + vid = torch.split(vid, vid_len.tolist()) + txt = torch.split(txt, txt_len.tolist()) + txt = [[x] * n for x, n in zip(txt, txt_repeat)] + txt = list(chain(*txt)) + return torch.cat(list(chain(*zip(vid, txt)))) + + +def repeat_concat_idx( + vid_len: torch.LongTensor, # (n*b) + txt_len: torch.LongTensor, # (b) + txt_repeat: torch.LongTensor, # (n) +) -> Tuple[ + Callable, + Callable, +]: + device = vid_len.device + vid_idx = torch.arange(vid_len.sum(), device=device) + txt_idx = torch.arange(len(vid_idx), len(vid_idx) + txt_len.sum(), device=device) + txt_repeat_list = txt_repeat.tolist() + tgt_idx = repeat_concat(vid_idx, txt_idx, vid_len, txt_len, txt_repeat) + src_idx = torch.argsort(tgt_idx) + txt_idx_len = len(tgt_idx) - len(vid_idx) + repeat_txt_len = (txt_len * txt_repeat).tolist() + + def unconcat_coalesce(all): + """ + Un-concat vid & txt, and coalesce the repeated txt. + e.g. vid [0 1 2 3 4 5 6 7 8] -> 3 splits -> [0 1 2] [3 4 5] [6 7 8] + txt [9 10] + repeat_concat ==> [0 1 2 9 10 3 4 5 9 10 6 7 8 9 10] + 1. argsort re-index ==> [0 1 2 3 4 5 6 7 8 9 9 9 10 10 10] + split ==> vid_out [0 1 2 3 4 5 6 7 8] txt_out [9 9 9 10 10 10] + 2. reshape & mean for each sample to coalesce the repeated txt. + """ + vid_out, txt_out = all[src_idx].split([len(vid_idx), txt_idx_len]) + txt_out_coalesced = [] + for txt, repeat_time in zip(txt_out.split(repeat_txt_len), txt_repeat_list): + txt = txt.reshape(-1, repeat_time, *txt.shape[1:]).mean(1) + txt_out_coalesced.append(txt) + return vid_out, torch.cat(txt_out_coalesced) + + # Note: Backward of torch.index_select is non-deterministic when existing repeated index, + # the difference may cumulative like torch.repeat_interleave, so we use vanilla index here. + return ( + lambda vid, txt: torch.cat([vid, txt])[tgt_idx], + lambda all: unconcat_coalesce(all), + ) + + +def rearrange( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, int], +) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, +]: + return flatten([einops.rearrange(h, pattern, **kwargs) for h in unflatten(hid, hid_shape)]) + + +def rearrange_idx( + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, int], +) -> Tuple[Callable, Callable, torch.LongTensor]: + hid_idx = torch.arange(hid_shape.prod(-1).sum(), device=hid_shape.device).unsqueeze(-1) + tgt_idx, tgt_shape = rearrange(hid_idx, hid_shape, pattern, **kwargs) + tgt_idx = tgt_idx.squeeze(-1) + src_idx = torch.argsort(tgt_idx) + return ( + lambda hid: torch.index_select(hid, 0, tgt_idx), + lambda hid: torch.index_select(hid, 0, src_idx), + tgt_shape, + ) + + +def repeat( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + pattern: str, + **kwargs: Dict[str, torch.LongTensor], # (b) +) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, +]: + hid = unflatten(hid, hid_shape) + kwargs = [{k: v[i].item() for k, v in kwargs.items()} for i in range(len(hid))] + return flatten([einops.repeat(h, pattern, **a) for h, a in zip(hid, kwargs)]) + + +def pack( + samples: List[torch.Tensor], # List of (h w c). +) -> Tuple[ + List[torch.Tensor], # groups [(b1 h1 w1 c1), (b2 h2 w2 c2)] + List[List[int]], # reversal indices. +]: + batches = {} + indices = {} + for i, sample in enumerate(samples): + shape = sample.shape + batches[shape] = batches.get(shape, []) + indices[shape] = indices.get(shape, []) + batches[shape].append(sample) + indices[shape].append(i) + + batches = list(map(torch.stack, batches.values())) + indices = list(indices.values()) + return batches, indices + + +def unpack( + batches: List[torch.Tensor], + indices: List[List[int]], +) -> List[torch.Tensor]: + samples = [None] * (max(chain(*indices)) + 1) + for batch, index in zip(batches, indices): + for sample, i in zip(batch.unbind(), index): + samples[i] = sample + return samples + + +def window( + hid: torch.FloatTensor, # (L c) + hid_shape: torch.LongTensor, # (b n) + window_fn: Callable[[torch.Tensor], List[torch.Tensor]], +): + hid = unflatten(hid, hid_shape) + hid = list(map(window_fn, hid)) + hid_windows = torch.tensor(list(map(len, hid)), device=hid_shape.device) + hid, hid_shape = flatten(list(chain(*hid))) + return hid, hid_shape, hid_windows + + +def window_idx( + hid_shape: torch.LongTensor, # (b n) + window_fn: Callable[[torch.Tensor], List[torch.Tensor]], +): + hid_idx = torch.arange(hid_shape.prod(-1).sum(), device=hid_shape.device).unsqueeze(-1) + tgt_idx, tgt_shape, tgt_windows = window(hid_idx, hid_shape, window_fn) + tgt_idx = tgt_idx.squeeze(-1) + src_idx = torch.argsort(tgt_idx) + return ( + lambda hid: torch.index_select(hid, 0, tgt_idx), + lambda hid: torch.index_select(hid, 0, src_idx), + tgt_shape, + tgt_windows, + ) diff --git a/modules/seedvr/src/models/dit_v2/nablocks/__init__.py b/modules/seedvr/src/models/dit_v2/nablocks/__init__.py new file mode 100644 index 000000000..c1a9da26e --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/nablocks/__init__.py @@ -0,0 +1,26 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from .mmsr_block import NaMMSRTransformerBlock + + +nadit_blocks = { + "mmdit_sr": NaMMSRTransformerBlock, +} + + +def get_nablock(block_type: str): + if block_type in nadit_blocks: + return nadit_blocks[block_type] + raise NotImplementedError(f"{block_type} is not supported") diff --git a/modules/seedvr/src/models/dit_v2/nablocks/attention/__init__.py b/modules/seedvr/src/models/dit_v2/nablocks/attention/__init__.py new file mode 100644 index 000000000..a75610252 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/nablocks/attention/__init__.py @@ -0,0 +1,25 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from .mmattn import NaMMAttention + +attns = { + "mm_full": NaMMAttention, +} + + +def get_attn(attn_type: str): + if attn_type in attns: + return attns[attn_type] + raise NotImplementedError(f"{attn_type} is not supported") diff --git a/modules/seedvr/src/models/dit_v2/nablocks/attention/mmattn.py b/modules/seedvr/src/models/dit_v2/nablocks/attention/mmattn.py new file mode 100644 index 000000000..70f3bb90d --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/nablocks/attention/mmattn.py @@ -0,0 +1,267 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional, Tuple, Union +import torch +from einops import rearrange +from torch import nn +from torch.nn import functional as F +from torch.nn.modules.utils import _triple + +from .....common.cache import Cache +from .....common.distributed.ops import gather_heads_scatter_seq, gather_seq_scatter_heads_qkv +from .....common.half_precision_fixes import safe_pad_operation + +from ... import na +from ...attention import FlashAttentionVarlen +from ...mm import MMArg, MMModule +from ...normalization import norm_layer_type +from ...rope import get_na_rope +from ...window import get_window_op +from itertools import chain + + +class NaMMAttention(nn.Module): + def __init__( + self, + vid_dim: int, + txt_dim: int, + heads: int, + head_dim: int, + qk_bias: bool, + qk_norm: norm_layer_type, + qk_norm_eps: float, + rope_type: Optional[str], + rope_dim: int, + shared_weights: bool, + **kwargs, + ): + super().__init__() + dim = MMArg(vid_dim, txt_dim) + inner_dim = heads * head_dim + qkv_dim = inner_dim * 3 + self.head_dim = head_dim + self.proj_qkv = MMModule( + nn.Linear, dim, qkv_dim, bias=qk_bias, shared_weights=shared_weights + ) + self.proj_out = MMModule(nn.Linear, inner_dim, dim, shared_weights=shared_weights) + self.norm_q = MMModule( + qk_norm, + dim=head_dim, + eps=qk_norm_eps, + elementwise_affine=True, + shared_weights=shared_weights, + ) + self.norm_k = MMModule( + qk_norm, + dim=head_dim, + eps=qk_norm_eps, + elementwise_affine=True, + shared_weights=shared_weights, + ) + + self.rope = get_na_rope(rope_type=rope_type, dim=rope_dim) + self.attn = FlashAttentionVarlen() + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + vid_qkv, txt_qkv = self.proj_qkv(vid, txt) + vid_qkv = gather_seq_scatter_heads_qkv( + vid_qkv, + seq_dim=0, + qkv_shape=vid_shape, + cache=cache.namespace("vid"), + ) + txt_qkv = gather_seq_scatter_heads_qkv( + txt_qkv, + seq_dim=0, + qkv_shape=txt_shape, + cache=cache.namespace("txt"), + ) + vid_qkv = rearrange(vid_qkv, "l (o h d) -> l o h d", o=3, d=self.head_dim) + txt_qkv = rearrange(txt_qkv, "l (o h d) -> l o h d", o=3, d=self.head_dim) + + vid_q, vid_k, vid_v = vid_qkv.unbind(1) + txt_q, txt_k, txt_v = txt_qkv.unbind(1) + + vid_q, txt_q = self.norm_q(vid_q, txt_q) + vid_k, txt_k = self.norm_k(vid_k, txt_k) + + if self.rope: + if self.rope.mm: + vid_q, vid_k, txt_q, txt_k = self.rope( + vid_q, vid_k, vid_shape, txt_q, txt_k, txt_shape, cache + ) + else: + vid_q, vid_k = self.rope(vid_q, vid_k, vid_shape, cache) + + vid_len = cache("vid_len", lambda: vid_shape.prod(-1)) + txt_len = cache("txt_len", lambda: txt_shape.prod(-1)) + all_len = cache("all_len", lambda: vid_len + txt_len) + + concat, unconcat = cache("mm_pnp", lambda: na.concat_idx(vid_len, txt_len)) + + attn = self.attn( + q=concat(vid_q, txt_q).bfloat16(), + k=concat(vid_k, txt_k).bfloat16(), + v=concat(vid_v, txt_v).bfloat16(), + cu_seqlens_q=cache("mm_seqlens", lambda: safe_pad_operation(all_len.cumsum(0), (1, 0)).int()), + cu_seqlens_k=cache("mm_seqlens", lambda: safe_pad_operation(all_len.cumsum(0), (1, 0)).int()), + max_seqlen_q=cache("mm_maxlen", lambda: all_len.max().item()), + max_seqlen_k=cache("mm_maxlen", lambda: all_len.max().item()), + ).type_as(vid_q) + + attn = rearrange(attn, "l h d -> l (h d)") + vid_out, txt_out = unconcat(attn) + vid_out = gather_heads_scatter_seq(vid_out, head_dim=1, seq_dim=0) + txt_out = gather_heads_scatter_seq(txt_out, head_dim=1, seq_dim=0) + + vid_out, txt_out = self.proj_out(vid_out, txt_out) + return vid_out, txt_out + + +class NaSwinAttention(NaMMAttention): + def __init__( + self, + *args, + window: Union[int, Tuple[int, int, int]], + window_method: str, + **kwargs, + ): + super().__init__(*args, **kwargs) + self.window = _triple(window) + self.window_method = window_method + assert all(map(lambda v: isinstance(v, int) and v >= 0, self.window)) + + self.window_op = get_window_op(window_method) + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + + vid_qkv, txt_qkv = self.proj_qkv(vid, txt) + vid_qkv = gather_seq_scatter_heads_qkv( + vid_qkv, + seq_dim=0, + qkv_shape=vid_shape, + cache=cache.namespace("vid"), + ) + txt_qkv = gather_seq_scatter_heads_qkv( + txt_qkv, + seq_dim=0, + qkv_shape=txt_shape, + cache=cache.namespace("txt"), + ) + + # re-org the input seq for window attn + cache_win = cache.namespace(f"{self.window_method}_{self.window}_sd3") + + def make_window(x: torch.Tensor): + t, h, w, _ = x.shape + window_slices = self.window_op((t, h, w), self.window) + return [x[st, sh, sw] for (st, sh, sw) in window_slices] + + window_partition, window_reverse, window_shape, window_count = cache_win( + "win_transform", + lambda: na.window_idx(vid_shape, make_window), + ) + vid_qkv_win = window_partition(vid_qkv) + + vid_qkv_win = rearrange(vid_qkv_win, "l (o h d) -> l o h d", o=3, d=self.head_dim) + txt_qkv = rearrange(txt_qkv, "l (o h d) -> l o h d", o=3, d=self.head_dim) + + vid_q, vid_k, vid_v = vid_qkv_win.unbind(1) + txt_q, txt_k, txt_v = txt_qkv.unbind(1) + + vid_q, txt_q = self.norm_q(vid_q, txt_q) + vid_k, txt_k = self.norm_k(vid_k, txt_k) + + txt_len = cache("txt_len", lambda: txt_shape.prod(-1)) + + vid_len_win = cache_win("vid_len", lambda: window_shape.prod(-1)) + txt_len_win = cache_win("txt_len", lambda: txt_len.repeat_interleave(window_count)) + all_len_win = cache_win("all_len", lambda: vid_len_win + txt_len_win) + concat_win, unconcat_win = cache_win( + "mm_pnp", lambda: na.repeat_concat_idx(vid_len_win, txt_len, window_count) + ) + + # window rope + if self.rope: + if self.rope.mm: + # repeat text q and k for window mmrope + _, num_h, _ = txt_q.shape + txt_q_repeat = rearrange(txt_q, "l h d -> l (h d)") + txt_q_repeat = na.unflatten(txt_q_repeat, txt_shape) + txt_q_repeat = [[x] * n for x, n in zip(txt_q_repeat, window_count)] + txt_q_repeat = list(chain(*txt_q_repeat)) + txt_q_repeat, txt_shape_repeat = na.flatten(txt_q_repeat) + txt_q_repeat = rearrange(txt_q_repeat, "l (h d) -> l h d", h=num_h) + + txt_k_repeat = rearrange(txt_k, "l h d -> l (h d)") + txt_k_repeat = na.unflatten(txt_k_repeat, txt_shape) + txt_k_repeat = [[x] * n for x, n in zip(txt_k_repeat, window_count)] + txt_k_repeat = list(chain(*txt_k_repeat)) + txt_k_repeat, _ = na.flatten(txt_k_repeat) + txt_k_repeat = rearrange(txt_k_repeat, "l (h d) -> l h d", h=num_h) + + vid_q, vid_k, txt_q, txt_k = self.rope( + vid_q, vid_k, window_shape, txt_q_repeat, txt_k_repeat, txt_shape_repeat, cache_win + ) + else: + vid_q, vid_k = self.rope(vid_q, vid_k, window_shape, cache_win) + + out = self.attn( + q=concat_win(vid_q, txt_q).bfloat16(), + k=concat_win(vid_k, txt_k).bfloat16(), + v=concat_win(vid_v, txt_v).bfloat16(), + cu_seqlens_q=cache_win( + "vid_seqlens_q", lambda: safe_pad_operation(all_len_win.cumsum(0), (1, 0)).int() + ), + cu_seqlens_k=cache_win( + "vid_seqlens_k", lambda: safe_pad_operation(all_len_win.cumsum(0), (1, 0)).int() + ), + max_seqlen_q=cache_win("vid_max_seqlen_q", lambda: all_len_win.max().item()), + max_seqlen_k=cache_win("vid_max_seqlen_k", lambda: all_len_win.max().item()), + ).type_as(vid_q) + + # text pooling + vid_out, txt_out = unconcat_win(out) + + vid_out = rearrange(vid_out, "l h d -> l (h d)") + txt_out = rearrange(txt_out, "l h d -> l (h d)") + vid_out = window_reverse(vid_out) + + vid_out = gather_heads_scatter_seq(vid_out, head_dim=1, seq_dim=0) + txt_out = gather_heads_scatter_seq(txt_out, head_dim=1, seq_dim=0) + + vid_out, txt_out = self.proj_out(vid_out, txt_out) + + return vid_out, txt_out diff --git a/modules/seedvr/src/models/dit_v2/nablocks/mmsr_block.py b/modules/seedvr/src/models/dit_v2/nablocks/mmsr_block.py new file mode 100644 index 000000000..52cb67e1f --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/nablocks/mmsr_block.py @@ -0,0 +1,126 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Tuple +import torch +import torch.nn as nn + +# from ..cache import Cache +from ....common.cache import Cache + +from .attention.mmattn import NaSwinAttention +from ..mm import MMArg +from ..modulation import ada_layer_type +from ..normalization import norm_layer_type +from ..mm import MMModule +from ..mlp import get_mlp + + +class NaMMSRTransformerBlock(nn.Module): + def __init__( + self, + *, + vid_dim: int, + txt_dim: int, + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: norm_layer_type, + norm_eps: float, + ada: ada_layer_type, + qk_bias: bool, + qk_norm: norm_layer_type, + mlp_type: str, + shared_weights: bool, + rope_type: str, + rope_dim: int, + is_last_layer: bool, + **kwargs, + ): + super().__init__() + dim = MMArg(vid_dim, txt_dim) + self.attn_norm = MMModule(norm, dim=dim, eps=norm_eps, elementwise_affine=False, shared_weights=shared_weights,) + + self.attn = NaSwinAttention( + vid_dim=vid_dim, + txt_dim=txt_dim, + heads=heads, + head_dim=head_dim, + qk_bias=qk_bias, + qk_norm=qk_norm, + qk_norm_eps=norm_eps, + rope_type=rope_type, + rope_dim=rope_dim, + shared_weights=shared_weights, + window=kwargs.pop("window", None), + window_method=kwargs.pop("window_method", None), + ) + + self.mlp_norm = MMModule(norm, dim=dim, eps=norm_eps, elementwise_affine=False, shared_weights=shared_weights, vid_only=is_last_layer) + self.mlp = MMModule( + get_mlp(mlp_type), + dim=dim, + expand_ratio=expand_ratio, + shared_weights=shared_weights, + vid_only=is_last_layer + ) + self.ada = MMModule(ada, dim=dim, emb_dim=emb_dim, layers=["attn", "mlp"], shared_weights=shared_weights, vid_only=is_last_layer) + self.is_last_layer = is_last_layer + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: torch.LongTensor, # b 1 + emb: torch.FloatTensor, + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + torch.LongTensor, + torch.LongTensor, + ]: + hid_len = MMArg( + cache("vid_len", lambda: vid_shape.prod(-1)), + cache("txt_len", lambda: txt_shape.prod(-1)), + ) + ada_kwargs = { + "emb": emb, + "hid_len": hid_len, + "cache": cache, + "branch_tag": MMArg("vid", "txt"), + } + + vid_attn, txt_attn = self.attn_norm(vid, txt) + + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, layer="attn", mode="in", **ada_kwargs) + vid_attn, txt_attn = self.attn(vid_attn, txt_attn, vid_shape, txt_shape, cache) + vid_attn, txt_attn = self.ada(vid_attn, txt_attn, layer="attn", mode="out", **ada_kwargs) + vid_attn, txt_attn = (vid_attn + vid), (txt_attn + txt) + + vid_mlp, txt_mlp = self.mlp_norm(vid_attn, txt_attn) + # ADD BY NUMZ + if vid_mlp.dtype != vid_attn.dtype: + vid_mlp = vid_mlp.to(vid_attn.dtype) + if txt_mlp.dtype != txt_attn.dtype: + txt_mlp = txt_mlp.to(txt_attn.dtype) + # END BY NUMZ + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, layer="mlp", mode="in", **ada_kwargs) + vid_mlp, txt_mlp = self.mlp(vid_mlp, txt_mlp) + vid_mlp, txt_mlp = self.ada(vid_mlp, txt_mlp, layer="mlp", mode="out", **ada_kwargs) + vid_mlp, txt_mlp = (vid_mlp + vid_attn), (txt_mlp + txt_attn) + + return vid_mlp, txt_mlp, vid_shape, txt_shape diff --git a/modules/seedvr/src/models/dit_v2/nadit.py b/modules/seedvr/src/models/dit_v2/nadit.py new file mode 100644 index 000000000..1f37ef8c3 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/nadit.py @@ -0,0 +1,246 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from dataclasses import dataclass +from typing import List, Optional, Tuple, Union, Callable +import torch +from torch import nn + +from ...common.cache import Cache +from ...common.distributed.ops import slice_inputs + +from . import na +from .embedding import TimeEmbedding +from .modulation import get_ada_layer +from .nablocks import get_nablock +from .normalization import get_norm_layer +from .patch import get_na_patch_layers + +# Fake func, no checkpointing is required for inference +def gradient_checkpointing(module: Union[Callable, nn.Module], *args, enabled: bool, **kwargs): + return module(*args, **kwargs) + +@dataclass +class NaDiTOutput: + vid_sample: torch.Tensor + + +class NaDiT(nn.Module): + """ + Native Resolution Diffusion Transformer (NaDiT) + """ + + gradient_checkpointing = False + + def __init__( + self, + vid_in_channels: int, + vid_out_channels: int, + vid_dim: int, + txt_in_dim: Union[int, List[int]], + txt_dim: Optional[int], + emb_dim: int, + heads: int, + head_dim: int, + expand_ratio: int, + norm: Optional[str], + norm_eps: float, + ada: str, + qk_bias: bool, + qk_norm: Optional[str], + patch_size: Union[int, Tuple[int, int, int]], + num_layers: int, + block_type: Union[str, Tuple[str]], + mm_layers: Union[int, Tuple[bool]], + mlp_type: str = "normal", + patch_type: str = "v1", + rope_type: Optional[str] = "rope3d", + rope_dim: Optional[int] = None, + window: Optional[Tuple] = None, + window_method: Optional[Tuple[str]] = None, + msa_type: Optional[Tuple[str]] = None, + mca_type: Optional[Tuple[str]] = None, + txt_in_norm: Optional[str] = None, + txt_in_norm_scale_factor: int = 0.01, + txt_proj_type: Optional[str] = "linear", + vid_out_norm: Optional[str] = None, + **kwargs, + ): + ada = get_ada_layer(ada) + norm = get_norm_layer(norm) + qk_norm = get_norm_layer(qk_norm) + rope_dim = rope_dim if rope_dim is not None else head_dim // 2 + if isinstance(block_type, str): + block_type = [block_type] * num_layers + elif len(block_type) != num_layers: + raise ValueError("The ``block_type`` list should equal to ``num_layers``.") + super().__init__() + NaPatchIn, NaPatchOut = get_na_patch_layers(patch_type) + self.vid_in = NaPatchIn( + in_channels=vid_in_channels, + patch_size=patch_size, + dim=vid_dim, + ) + if not isinstance(txt_in_dim, int): + self.txt_in = nn.ModuleList([]) + for in_dim in txt_in_dim: + txt_norm_layer = get_norm_layer(txt_in_norm)(txt_dim, norm_eps, True) + if txt_proj_type == "linear": + txt_proj_layer = nn.Linear(in_dim, txt_dim) + else: + txt_proj_layer = nn.Sequential( + nn.Linear(in_dim, in_dim), nn.GELU("tanh"), nn.Linear(in_dim, txt_dim) + ) + torch.nn.init.constant_(txt_norm_layer.weight, txt_in_norm_scale_factor) + self.txt_in.append( + nn.Sequential( + txt_proj_layer, + txt_norm_layer, + ) + ) + else: + self.txt_in = ( + nn.Linear(txt_in_dim, txt_dim) + if txt_in_dim and txt_in_dim != txt_dim + else nn.Identity() + ) + self.emb_in = TimeEmbedding( + sinusoidal_dim=256, + hidden_dim=max(vid_dim, txt_dim), + output_dim=emb_dim, + ) + + if window is None or isinstance(window[0], int): + window = [window] * num_layers + if window_method is None or isinstance(window_method, str): + window_method = [window_method] * num_layers + + if msa_type is None or isinstance(msa_type, str): + msa_type = [msa_type] * num_layers + if mca_type is None or isinstance(mca_type, str): + mca_type = [mca_type] * num_layers + + self.blocks = nn.ModuleList( + [ + get_nablock(block_type[i])( + vid_dim=vid_dim, + txt_dim=txt_dim, + emb_dim=emb_dim, + heads=heads, + head_dim=head_dim, + expand_ratio=expand_ratio, + norm=norm, + norm_eps=norm_eps, + ada=ada, + qk_bias=qk_bias, + qk_norm=qk_norm, + shared_weights=not ( + (i < mm_layers) if isinstance(mm_layers, int) else mm_layers[i] + ), + mlp_type=mlp_type, + window=window[i], + window_method=window_method[i], + msa_type=msa_type[i], + mca_type=mca_type[i], + rope_type=rope_type, + rope_dim=rope_dim, + is_last_layer=(i == num_layers - 1), + **kwargs, + ) + for i in range(num_layers) + ] + ) + + self.vid_out_norm = None + if vid_out_norm is not None: + self.vid_out_norm = get_norm_layer(vid_out_norm)( + dim=vid_dim, + eps=norm_eps, + elementwise_affine=True, + ) + self.vid_out_ada = ada( + dim=vid_dim, + emb_dim=emb_dim, + layers=["out"], + modes=["in"], + ) + + self.vid_out = NaPatchOut( + out_channels=vid_out_channels, + patch_size=patch_size, + dim=vid_dim, + ) + + def set_gradient_checkpointing(self, enable: bool): + self.gradient_checkpointing = enable + + def forward( + self, + vid: torch.FloatTensor, # l c + txt: Union[torch.FloatTensor, List[torch.FloatTensor]], # l c + vid_shape: torch.LongTensor, # b 3 + txt_shape: Union[torch.LongTensor, List[torch.LongTensor]], # b 1 + timestep: Union[int, float, torch.IntTensor, torch.FloatTensor], # b + disable_cache: bool = False, # for test + ): + cache = Cache(disable=disable_cache) + + # slice vid after patching in when using sequence parallelism + if isinstance(txt, list): + assert isinstance(self.txt_in, nn.ModuleList) + txt = [ + na.unflatten(fc(i), s) for fc, i, s in zip(self.txt_in, txt, txt_shape) + ] # B L D + txt, txt_shape = na.flatten([torch.cat(t, dim=0) for t in zip(*txt)]) + txt = slice_inputs(txt, dim=0) + else: + txt = slice_inputs(txt, dim=0) + txt = self.txt_in(txt) + + # Video input. + # Sequence parallel slicing is done inside patching class. + vid, vid_shape = self.vid_in(vid, vid_shape, cache) + + # Embedding input. + emb = self.emb_in(timestep, device=vid.device, dtype=vid.dtype) + + # Body + for i, block in enumerate(self.blocks): + vid, txt, vid_shape, txt_shape = gradient_checkpointing( + enabled=(self.gradient_checkpointing and self.training), + module=block, + vid=vid, + txt=txt, + vid_shape=vid_shape, + txt_shape=txt_shape, + emb=emb, + cache=cache, + ) + + # Video output norm. + if self.vid_out_norm: + vid = self.vid_out_norm(vid) + vid = self.vid_out_ada( + vid, + emb=emb, + layer="out", + mode="in", + hid_len=cache("vid_len", lambda: vid_shape.prod(-1)), + cache=cache, + branch_tag="vid", + ) + + # Video output. + vid, vid_shape = self.vid_out(vid, vid_shape, cache) + return NaDiTOutput(vid_sample=vid) diff --git a/modules/seedvr/src/models/dit_v2/normalization.py b/modules/seedvr/src/models/dit_v2/normalization.py new file mode 100644 index 000000000..41ba35a39 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/normalization.py @@ -0,0 +1,147 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Callable, Optional +from diffusers.models.normalization import RMSNorm +from torch import nn +import torch +import torch.nn.functional as F +import numbers +from torch.nn.parameter import Parameter +from torch.nn import init + +# (dim: int, eps: float, elementwise_affine: bool) +norm_layer_type = Callable[[int, float, bool], nn.Module] + + +class CustomLayerNorm(nn.Module): + """ + Custom LayerNorm implementation to replace Apex FusedLayerNorm + """ + def __init__(self, normalized_shape, eps=1e-5, elementwise_affine=True): + super(CustomLayerNorm, self).__init__() + + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape,) + self.normalized_shape = torch.Size(normalized_shape) + self.eps = eps + self.elementwise_affine = elementwise_affine + + if self.elementwise_affine: + self.weight = Parameter(torch.Tensor(*normalized_shape)) + self.bias = Parameter(torch.Tensor(*normalized_shape)) + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + self.reset_parameters() + + def reset_parameters(self): + if self.elementwise_affine: + init.ones_(self.weight) + init.zeros_(self.bias) + + def forward(self, input): + # 🚀 FP8 COMPATIBILITY: Convert parameters to match input dtype + # This prevents "Promotion for Float8 Types is not supported" errors + weight = self.weight + bias = self.bias + + if self.elementwise_affine and weight is not None: + if weight.dtype != input.dtype: + weight = weight.to(input.dtype) + if bias is not None and bias.dtype != input.dtype: + bias = bias.to(input.dtype) + + return F.layer_norm( + input, self.normalized_shape, weight, bias, self.eps) + + +class CustomRMSNorm(nn.Module): + """ + Custom RMSNorm implementation to replace Apex FusedRMSNorm + """ + def __init__(self, normalized_shape, eps=1e-5, elementwise_affine=True): + super(CustomRMSNorm, self).__init__() + + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape,) + self.normalized_shape = torch.Size(normalized_shape) + self.eps = eps + self.elementwise_affine = elementwise_affine + + if self.elementwise_affine: + self.weight = Parameter(torch.ones(*normalized_shape)) + else: + self.register_parameter('weight', None) + + def forward(self, input): + # RMS normalization: x / sqrt(mean(x^2) + eps) * weight + dims = tuple(range(-len(self.normalized_shape), 0)) + + # Calculate RMS: sqrt(mean(x^2)) + variance = input.pow(2).mean(dim=dims, keepdim=True) + rms = torch.sqrt(variance + self.eps) + + # Normalize + normalized = input / rms + + if self.elementwise_affine: + # 🚀 FP8 COMPATIBILITY: Convert weight to match normalized dtype + # This prevents "Promotion for Float8 Types is not supported" errors + weight = self.weight + if weight.dtype != normalized.dtype: + weight = weight.to(normalized.dtype) + return normalized * weight + return normalized + + +def get_norm_layer(norm_type: Optional[str]) -> norm_layer_type: + + def _norm_layer(dim: int, eps: float, elementwise_affine: bool): + if norm_type is None: + return nn.Identity() + + if norm_type == "layer": + return nn.LayerNorm( + normalized_shape=dim, + eps=eps, + elementwise_affine=elementwise_affine, + ) + + if norm_type == "rms": + return RMSNorm( + dim=dim, + eps=eps, + elementwise_affine=elementwise_affine, + ) + + if norm_type == "fusedln": + # Use custom LayerNorm instead of Apex FusedLayerNorm + return CustomLayerNorm( + normalized_shape=dim, + elementwise_affine=elementwise_affine, + eps=eps, + ) + + if norm_type == "fusedrms": + # Use custom RMSNorm instead of Apex FusedRMSNorm + return CustomRMSNorm( + normalized_shape=dim, + elementwise_affine=elementwise_affine, + eps=eps, + ) + + raise NotImplementedError(f"{norm_type} is not supported") + + return _norm_layer diff --git a/modules/seedvr/src/models/dit_v2/patch/__init__.py b/modules/seedvr/src/models/dit_v2/patch/__init__.py new file mode 100644 index 000000000..4e3c97831 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/patch/__init__.py @@ -0,0 +1,19 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +def get_na_patch_layers(patch_type="v1"): + assert patch_type in ["v1"] + if patch_type == "v1": + from .patch_v1 import NaPatchIn, NaPatchOut + return NaPatchIn, NaPatchOut diff --git a/modules/seedvr/src/models/dit_v2/patch/patch_v1.py b/modules/seedvr/src/models/dit_v2/patch/patch_v1.py new file mode 100644 index 000000000..14b5a62d5 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/patch/patch_v1.py @@ -0,0 +1,127 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Tuple, Union +import torch +from einops import rearrange +from torch import nn +from torch.nn.modules.utils import _triple + +from ....common.cache import Cache +from ....common.distributed.ops import gather_outputs, slice_inputs + +from .. import na + + +class PatchIn(nn.Module): + def __init__( + self, + in_channels: int, + patch_size: Union[int, Tuple[int, int, int]], + dim: int, + ): + super().__init__() + t, h, w = _triple(patch_size) + self.patch_size = t, h, w + self.proj = nn.Linear(in_channels * t * h * w, dim) + + def forward( + self, + vid: torch.Tensor, + ) -> torch.Tensor: + t, h, w = self.patch_size + if t > 1: + assert vid.size(2) % t == 1 + vid = torch.cat([vid[:, :, :1]] * (t - 1) + [vid], dim=2) + vid = rearrange(vid, "b c (T t) (H h) (W w) -> b T H W (t h w c)", t=t, h=h, w=w) + vid = self.proj(vid) + return vid + + +class PatchOut(nn.Module): + def __init__( + self, + out_channels: int, + patch_size: Union[int, Tuple[int, int, int]], + dim: int, + ): + super().__init__() + t, h, w = _triple(patch_size) + self.patch_size = t, h, w + self.proj = nn.Linear(dim, out_channels * t * h * w) + + def forward( + self, + vid: torch.Tensor, + ) -> torch.Tensor: + t, h, w = self.patch_size + vid = self.proj(vid) + vid = rearrange(vid, "b T H W (t h w c) -> b c (T t) (H h) (W w)", t=t, h=h, w=w) + if t > 1: + vid = vid[:, :, (t - 1) :] + return vid + + +class NaPatchIn(PatchIn): + def forward( + self, + vid: torch.Tensor, # l c + vid_shape: torch.LongTensor, + cache: Cache = Cache(disable=True), # for test + ) -> torch.Tensor: + cache = cache.namespace("patch") + vid_shape_before_patchify = cache("vid_shape_before_patchify", lambda: vid_shape) + t, h, w = self.patch_size + if not (t == h == w == 1): + vid = na.unflatten(vid, vid_shape) + for i in range(len(vid)): + if t > 1 and vid_shape_before_patchify[i, 0] % t != 0: + vid[i] = torch.cat([vid[i][:1]] * (t - vid[i].size(0) % t) + [vid[i]], dim=0) + vid[i] = rearrange(vid[i], "(T t) (H h) (W w) c -> T H W (t h w c)", t=t, h=h, w=w) + vid, vid_shape = na.flatten(vid) + + # slice vid after patching in when using sequence parallelism + vid = slice_inputs(vid, dim=0) + vid = self.proj(vid) + return vid, vid_shape + + +class NaPatchOut(PatchOut): + def forward( + self, + vid: torch.FloatTensor, # l c + vid_shape: torch.LongTensor, + cache: Cache = Cache(disable=True), # for test + ) -> Tuple[ + torch.FloatTensor, + torch.LongTensor, + ]: + cache = cache.namespace("patch") + vid_shape_before_patchify = cache.get("vid_shape_before_patchify") + + t, h, w = self.patch_size + vid = self.proj(vid) + # gather vid before patching out when enabling sequence parallelism + vid = gather_outputs( + vid, gather_dim=0, padding_dim=0, unpad_shape=vid_shape, cache=cache.namespace("vid") + ) + if not (t == h == w == 1): + vid = na.unflatten(vid, vid_shape) + for i in range(len(vid)): + vid[i] = rearrange(vid[i], "T H W (t h w c) -> (T t) (H h) (W w) c", t=t, h=h, w=w) + if t > 1 and vid_shape_before_patchify[i, 0] % t != 0: + vid[i] = vid[i][(t - vid_shape_before_patchify[i, 0] % t) :] + vid, vid_shape = na.flatten(vid) + + return vid, vid_shape diff --git a/modules/seedvr/src/models/dit_v2/rope.py b/modules/seedvr/src/models/dit_v2/rope.py new file mode 100644 index 000000000..dde5b4756 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/rope.py @@ -0,0 +1,155 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from functools import lru_cache +from typing import Optional, Tuple +import torch +from einops import rearrange +from rotary_embedding_torch import RotaryEmbedding, apply_rotary_emb +from torch import nn + +from src.common.cache import Cache + + +class RotaryEmbeddingBase(nn.Module): + def __init__(self, dim: int, rope_dim: int): + super().__init__() + self.rope = RotaryEmbedding( + dim=dim // rope_dim, + freqs_for="pixel", + max_freq=256, + ) + # 1. Set model.requires_grad_(True) after model creation will make + # the `requires_grad=False` for rope freqs no longer hold. + # 2. Even if we don't set requires_grad_(True) explicitly, + # FSDP is not memory efficient when handling fsdp_wrap + # with mixed requires_grad=True/False. + # With above consideration, it is easier just remove the freqs + # out of nn.Parameters when `learned_freq=False` + freqs = self.rope.freqs + del self.rope.freqs + self.rope.register_buffer("freqs", freqs.data) + + @lru_cache(maxsize=128) + def get_axial_freqs(self, *dims): + return self.rope.get_axial_freqs(*dims) + + +class RotaryEmbedding3d(RotaryEmbeddingBase): + def __init__(self, dim: int): + super().__init__(dim, rope_dim=3) + self.mm = False + + def forward( + self, + q: torch.FloatTensor, # b h l d + k: torch.FloatTensor, # b h l d + size: Tuple[int, int, int], + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + ]: + T, H, W = size + freqs = self.get_axial_freqs(T, H, W) + q = rearrange(q, "b h (T H W) d -> b h T H W d", T=T, H=H, W=W) + k = rearrange(k, "b h (T H W) d -> b h T H W d", T=T, H=H, W=W) + q = apply_rotary_emb(freqs, q.float()).to(q.dtype) + k = apply_rotary_emb(freqs, k.float()).to(k.dtype) + q = rearrange(q, "b h T H W d -> b h (T H W) d") + k = rearrange(k, "b h T H W d -> b h (T H W) d") + return q, k + + +class MMRotaryEmbeddingBase(RotaryEmbeddingBase): + def __init__(self, dim: int, rope_dim: int): + super().__init__(dim, rope_dim) + self.rope = RotaryEmbedding( + dim=dim // rope_dim, + freqs_for="lang", + theta=10000, + ) + freqs = self.rope.freqs + del self.rope.freqs + self.rope.register_buffer("freqs", freqs.data) + self.mm = True + + +class NaMMRotaryEmbedding3d(MMRotaryEmbeddingBase): + def __init__(self, dim: int): + super().__init__(dim, rope_dim=3) + + def forward( + self, + vid_q: torch.FloatTensor, # L h d + vid_k: torch.FloatTensor, # L h d + vid_shape: torch.LongTensor, # B 3 + txt_q: torch.FloatTensor, # L h d + txt_k: torch.FloatTensor, # L h d + txt_shape: torch.LongTensor, # B 1 + cache: Cache, + ) -> Tuple[ + torch.FloatTensor, + torch.FloatTensor, + torch.FloatTensor, + torch.FloatTensor, + ]: + vid_freqs, txt_freqs = cache( + "mmrope_freqs_3d", + lambda: self.get_freqs(vid_shape, txt_shape), + ) + target_device = vid_q.device + if vid_freqs.device != target_device: + vid_freqs = vid_freqs.to(target_device) + if txt_freqs.device != target_device: + txt_freqs = txt_freqs.to(target_device) + vid_q = rearrange(vid_q, "L h d -> h L d") + vid_k = rearrange(vid_k, "L h d -> h L d") + vid_q = apply_rotary_emb(vid_freqs, vid_q.float()).to(vid_q.dtype) + vid_k = apply_rotary_emb(vid_freqs, vid_k.float()).to(vid_k.dtype) + vid_q = rearrange(vid_q, "h L d -> L h d") + vid_k = rearrange(vid_k, "h L d -> L h d") + + txt_q = rearrange(txt_q, "L h d -> h L d") + txt_k = rearrange(txt_k, "L h d -> h L d") + txt_q = apply_rotary_emb(txt_freqs, txt_q.float()).to(txt_q.dtype) + txt_k = apply_rotary_emb(txt_freqs, txt_k.float()).to(txt_k.dtype) + txt_q = rearrange(txt_q, "h L d -> L h d") + txt_k = rearrange(txt_k, "h L d -> L h d") + return vid_q, vid_k, txt_q, txt_k + + def get_freqs( + self, + vid_shape: torch.LongTensor, + txt_shape: torch.LongTensor, + ) -> Tuple[ + torch.Tensor, + torch.Tensor, + ]: + vid_freqs = self.get_axial_freqs(1024, 128, 128) + txt_freqs = self.get_axial_freqs(1024) + vid_freq_list, txt_freq_list = [], [] + for (f, h, w), l in zip(vid_shape.tolist(), txt_shape[:, 0].tolist()): + vid_freq = vid_freqs[l : l + f, :h, :w].reshape(-1, vid_freqs.size(-1)) + txt_freq = txt_freqs[:l].repeat(1, 3).reshape(-1, vid_freqs.size(-1)) + vid_freq_list.append(vid_freq) + txt_freq_list.append(txt_freq) + return torch.cat(vid_freq_list, dim=0), torch.cat(txt_freq_list, dim=0) + + +def get_na_rope(rope_type: Optional[str], dim: int): + if rope_type is None: + return None + if rope_type == "mmrope3d": + return NaMMRotaryEmbedding3d(dim=dim) + raise NotImplementedError(f"{rope_type} is not supported.") diff --git a/modules/seedvr/src/models/dit_v2/window.py b/modules/seedvr/src/models/dit_v2/window.py new file mode 100644 index 000000000..f77ea57d7 --- /dev/null +++ b/modules/seedvr/src/models/dit_v2/window.py @@ -0,0 +1,83 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from math import ceil +from typing import Tuple +import math + +def get_window_op(name: str): + if name == "720pwin_by_size_bysize": + return make_720Pwindows_bysize + if name == "720pswin_by_size_bysize": + return make_shifted_720Pwindows_bysize + raise ValueError(f"Unknown windowing method: {name}") + + +# -------------------------------- Windowing -------------------------------- # +def make_720Pwindows_bysize(size: Tuple[int, int, int], num_windows: Tuple[int, int, int]): + t, h, w = size + resized_nt, resized_nh, resized_nw = num_windows + #cal windows under 720p + scale = math.sqrt((45 * 80) / (h * w)) + resized_h, resized_w = round(h * scale), round(w * scale) + wh, ww = ceil(resized_h / resized_nh), ceil(resized_w / resized_nw) # window size. + wt = ceil(min(t, 30) / resized_nt) # window size. + nt, nh, nw = ceil(t / wt), ceil(h / wh), ceil(w / ww) # window size. + return [ + ( + slice(it * wt, min((it + 1) * wt, t)), + slice(ih * wh, min((ih + 1) * wh, h)), + slice(iw * ww, min((iw + 1) * ww, w)), + ) + for iw in range(nw) + if min((iw + 1) * ww, w) > iw * ww + for ih in range(nh) + if min((ih + 1) * wh, h) > ih * wh + for it in range(nt) + if min((it + 1) * wt, t) > it * wt + ] + +def make_shifted_720Pwindows_bysize(size: Tuple[int, int, int], num_windows: Tuple[int, int, int]): + t, h, w = size + resized_nt, resized_nh, resized_nw = num_windows + #cal windows under 720p + scale = math.sqrt((45 * 80) / (h * w)) + resized_h, resized_w = round(h * scale), round(w * scale) + wh, ww = ceil(resized_h / resized_nh), ceil(resized_w / resized_nw) # window size. + wt = ceil(min(t, 30) / resized_nt) # window size. + + st, sh, sw = ( # shift size. + 0.5 if wt < t else 0, + 0.5 if wh < h else 0, + 0.5 if ww < w else 0, + ) + nt, nh, nw = ceil((t - st) / wt), ceil((h - sh) / wh), ceil((w - sw) / ww) # window size. + nt, nh, nw = ( # number of window. + nt + 1 if st > 0 else 1, + nh + 1 if sh > 0 else 1, + nw + 1 if sw > 0 else 1, + ) + return [ + ( + slice(max(int((it - st) * wt), 0), min(int((it - st + 1) * wt), t)), + slice(max(int((ih - sh) * wh), 0), min(int((ih - sh + 1) * wh), h)), + slice(max(int((iw - sw) * ww), 0), min(int((iw - sw + 1) * ww), w)), + ) + for iw in range(nw) + if min(int((iw - sw + 1) * ww), w) > max(int((iw - sw) * ww), 0) + for ih in range(nh) + if min(int((ih - sh + 1) * wh), h) > max(int((ih - sh) * wh), 0) + for it in range(nt) + if min(int((it - st + 1) * wt), t) > max(int((it - st) * wt), 0) + ] diff --git a/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py new file mode 100644 index 000000000..1f282dfa1 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py @@ -0,0 +1,1345 @@ +# Copyright (c) 2023 HuggingFace Team +# Copyright (c) 2025 ByteDance Ltd. and/or its affiliates. +# SPDX-License-Identifier: Apache License, Version 2.0 (the "License") +# +# This file has been modified by ByteDance Ltd. and/or its affiliates. on 1st June 2025 +# +# Original file was released under Apache License, Version 2.0 (the "License"), with the full license text +# available at http://www.apache.org/licenses/LICENSE-2.0. +# +# This modified file is released under the same license. + + +from contextlib import nullcontext +from typing import Literal, Optional, Tuple, Union +import diffusers +import torch +import torch.nn as nn +import torch.nn.functional as F +from diffusers.models.attention_processor import Attention, SpatialNorm +from diffusers.models.autoencoders.vae import DecoderOutput, DiagonalGaussianDistribution +from diffusers.models.downsampling import Downsample2D +from diffusers.models.lora import LoRACompatibleConv +from diffusers.models.modeling_outputs import AutoencoderKLOutput +from diffusers.models.resnet import ResnetBlock2D +from diffusers.models.unets.unet_2d_blocks import DownEncoderBlock2D, UpDecoderBlock2D +from diffusers.models.upsampling import Upsample2D +from diffusers.utils import is_torch_version +from diffusers.utils.accelerate_utils import apply_forward_hook +from einops import rearrange +from ....common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation + +from ....common.distributed.advanced import get_sequence_parallel_world_size +from ....common.logger import get_logger +from .causal_inflation_lib import ( + InflatedCausalConv3d, + causal_norm_wrapper, + init_causal_conv3d, + remove_head, +) +from .context_parallel_lib import ( + causal_conv_gather_outputs, + causal_conv_slice_inputs, +) +from .global_config import set_norm_limit +from .types import ( + CausalAutoencoderOutput, + CausalDecoderOutput, + CausalEncoderOutput, + MemoryState, + _inflation_mode_t, + _memory_device_t, + _receptive_field_t, +) + +logger = get_logger(__name__) # pylint: disable=invalid-name + + +class Upsample3D(Upsample2D): + """A 3D upsampling layer with an optional convolution.""" + + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t = "tail", + temporal_up: bool = False, + spatial_up: bool = True, + slicing: bool = False, + **kwargs, + ): + super().__init__(*args, **kwargs) + conv = self.conv if self.name == "conv" else self.Conv2d_0 + + assert type(conv) is not nn.ConvTranspose2d + # Note: lora_layer is not passed into constructor in the original implementation. + # So we make a simplification. + conv = init_causal_conv3d( + self.channels, + self.out_channels, + 3, + padding=1, + inflation_mode=inflation_mode, + ) + + self.temporal_up = temporal_up + self.spatial_up = spatial_up + self.temporal_ratio = 2 if temporal_up else 1 + self.spatial_ratio = 2 if spatial_up else 1 + self.slicing = slicing + + assert not self.interpolate + # [Override] MAGViT v2 implementation + if not self.interpolate: + upscale_ratio = (self.spatial_ratio**2) * self.temporal_ratio + self.upscale_conv = nn.Conv3d( + self.channels, self.channels * upscale_ratio, kernel_size=1, padding=0 + ) + identity = ( + torch.eye(self.channels) + .repeat(upscale_ratio, 1) + .reshape_as(self.upscale_conv.weight) + ) + self.upscale_conv.weight.data.copy_(identity) + nn.init.zeros_(self.upscale_conv.bias) + + if self.name == "conv": + self.conv = conv + else: + self.Conv2d_0 = conv + + def forward( + self, + hidden_states: torch.FloatTensor, + output_size: Optional[int] = None, + memory_state: MemoryState = MemoryState.DISABLED, + **kwargs, + ) -> torch.FloatTensor: + assert hidden_states.shape[1] == self.channels + + if hasattr(self, "norm") and self.norm is not None: + # [Overridden] change to causal norm. + hidden_states = causal_norm_wrapper(self.norm, hidden_states) + + if self.use_conv_transpose: + return self.conv(hidden_states) + + if self.slicing: + split_size = hidden_states.size(2) // 2 + hidden_states = list( + hidden_states.split([split_size, hidden_states.size(2) - split_size], dim=2) + ) + else: + hidden_states = [hidden_states] + # ADD BY NUMZ + for i in range(len(hidden_states)): + hidden_states[i] = self.upscale_conv(hidden_states[i]) + hidden_states[i] = rearrange( + hidden_states[i], + "b (x y z c) f h w -> b c (f z) (h x) (w y)", + x=self.spatial_ratio, + y=self.spatial_ratio, + z=self.temporal_ratio, + ) + + # [Overridden] For causal temporal conv + if self.temporal_up and memory_state != MemoryState.ACTIVE: + hidden_states[0] = remove_head(hidden_states[0]) + + if not self.slicing: + hidden_states = hidden_states[0] + # ADD BY NUMZ + if self.use_conv: + if self.name == "conv": + hidden_states = self.conv(hidden_states, memory_state=memory_state) + else: + hidden_states = self.Conv2d_0(hidden_states, memory_state=memory_state) + + if not self.slicing: + return hidden_states + else: + return torch.cat(hidden_states, dim=2) + + +class Downsample3D(Downsample2D): + """A 3D downsampling layer with an optional convolution.""" + + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t = "tail", + spatial_down: bool = False, + temporal_down: bool = False, + **kwargs, + ): + super().__init__(*args, **kwargs) + conv = self.conv + self.temporal_down = temporal_down + self.spatial_down = spatial_down + + self.temporal_ratio = 2 if temporal_down else 1 + self.spatial_ratio = 2 if spatial_down else 1 + + self.temporal_kernel = 3 if temporal_down else 1 + self.spatial_kernel = 3 if spatial_down else 1 + + if type(conv) in [nn.Conv2d, LoRACompatibleConv]: + # Note: lora_layer is not passed into constructor in the original implementation. + # So we make a simplification. + conv = init_causal_conv3d( + self.channels, + self.out_channels, + kernel_size=(self.temporal_kernel, self.spatial_kernel, self.spatial_kernel), + stride=(self.temporal_ratio, self.spatial_ratio, self.spatial_ratio), + padding=( + 1 if self.temporal_down else 0, + self.padding if self.spatial_down else 0, + self.padding if self.spatial_down else 0, + ), + inflation_mode=inflation_mode, + ) + elif type(conv) is nn.AvgPool2d: + assert self.channels == self.out_channels + conv = nn.AvgPool3d( + kernel_size=(self.temporal_ratio, self.spatial_ratio, self.spatial_ratio), + stride=(self.temporal_ratio, self.spatial_ratio, self.spatial_ratio), + ) + else: + raise NotImplementedError + + if self.name == "conv": + self.Conv2d_0 = conv + self.conv = conv + else: + self.conv = conv + + def forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState = MemoryState.DISABLED, + **kwargs, + ) -> torch.FloatTensor: + + assert hidden_states.shape[1] == self.channels + + if hasattr(self, "norm") and self.norm is not None: + # [Overridden] change to causal norm. + hidden_states = causal_norm_wrapper(self.norm, hidden_states) + + if self.use_conv and self.padding == 0 and self.spatial_down: + pad = (0, 1, 0, 1) + hidden_states = safe_pad_operation(hidden_states, pad, mode="constant", value=0) + + assert hidden_states.shape[1] == self.channels + + hidden_states = self.conv(hidden_states, memory_state=memory_state) + + return hidden_states + + +class ResnetBlock3D(ResnetBlock2D): + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + slicing: bool = False, + **kwargs, + ): + super().__init__(*args, **kwargs) + self.conv1 = init_causal_conv3d( + self.in_channels, + self.out_channels, + kernel_size=(1, 3, 3) if time_receptive_field == "half" else (3, 3, 3), + stride=1, + padding=(0, 1, 1) if time_receptive_field == "half" else (1, 1, 1), + inflation_mode=inflation_mode, + ) + + self.conv2 = init_causal_conv3d( + self.out_channels, + self.conv2.out_channels, + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + if self.up: + assert type(self.upsample) is Upsample2D + self.upsample = Upsample3D( + self.in_channels, + use_conv=False, + inflation_mode=inflation_mode, + slicing=slicing, + ) + elif self.down: + assert type(self.downsample) is Downsample2D + self.downsample = Downsample3D( + self.in_channels, + use_conv=False, + padding=1, + name="op", + inflation_mode=inflation_mode, + ) + + if self.use_in_shortcut: + self.conv_shortcut = init_causal_conv3d( + self.in_channels, + self.conv_shortcut.out_channels, + kernel_size=1, + stride=1, + padding=0, + bias=(self.conv_shortcut.bias is not None), + inflation_mode=inflation_mode, + ) + + def forward( + self, input_tensor, temb, memory_state: MemoryState = MemoryState.DISABLED, **kwargs + ): + hidden_states = input_tensor + + hidden_states = causal_norm_wrapper(self.norm1, hidden_states) + hidden_states = self.nonlinearity(hidden_states) + + if self.upsample is not None: + # upsample_nearest_nhwc fails with large batch sizes. + # see https://github.com/huggingface/diffusers/issues/984 + if hidden_states.shape[0] >= 64: + input_tensor = input_tensor.contiguous() + hidden_states = hidden_states.contiguous() + input_tensor = self.upsample(input_tensor, memory_state=memory_state) + hidden_states = self.upsample(hidden_states, memory_state=memory_state) + elif self.downsample is not None: + input_tensor = self.downsample(input_tensor, memory_state=memory_state) + hidden_states = self.downsample(hidden_states, memory_state=memory_state) + + hidden_states = self.conv1(hidden_states, memory_state=memory_state) + + if self.time_emb_proj is not None: + if not self.skip_time_act: + temb = self.nonlinearity(temb) + temb = self.time_emb_proj(temb)[:, :, None, None] + + if temb is not None and self.time_embedding_norm == "default": + hidden_states = hidden_states + temb + + hidden_states = causal_norm_wrapper(self.norm2, hidden_states) + + if temb is not None and self.time_embedding_norm == "scale_shift": + scale, shift = torch.chunk(temb, 2, dim=1) + hidden_states = hidden_states * (1 + scale) + shift + + hidden_states = self.nonlinearity(hidden_states) + + hidden_states = self.dropout(hidden_states) + hidden_states = self.conv2(hidden_states, memory_state=memory_state) + + if self.conv_shortcut is not None: + input_tensor = self.conv_shortcut(input_tensor, memory_state=memory_state) + + output_tensor = (input_tensor + hidden_states) / self.output_scale_factor + + return output_tensor + + +class DownEncoderBlock3D(DownEncoderBlock2D): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_down: bool = True, + spatial_down: bool = True, + ): + super().__init__( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + num_layers=num_layers, + resnet_eps=resnet_eps, + resnet_time_scale_shift=resnet_time_scale_shift, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_pre_norm=resnet_pre_norm, + output_scale_factor=output_scale_factor, + add_downsample=add_downsample, + downsample_padding=downsample_padding, + ) + resnets = [] + temporal_modules = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + # [Override] Replace module. + ResnetBlock3D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + ) + temporal_modules.append(nn.Identity()) + + self.resnets = nn.ModuleList(resnets) + self.temporal_modules = nn.ModuleList(temporal_modules) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + # [Override] Replace module. + Downsample3D( + out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + name="op", + temporal_down=temporal_down, + spatial_down=spatial_down, + inflation_mode=inflation_mode, + ) + ] + ) + else: + self.downsamplers = None + + def forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState = MemoryState.DISABLED, + **kwargs, + ) -> torch.FloatTensor: + for resnet, temporal in zip(self.resnets, self.temporal_modules): + hidden_states = resnet(hidden_states, temb=None, memory_state=memory_state) + hidden_states = temporal(hidden_states) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, memory_state=memory_state) + + return hidden_states + + +class UpDecoderBlock3D(UpDecoderBlock2D): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + temb_channels: Optional[int] = None, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_up: bool = True, + spatial_up: bool = True, + slicing: bool = False, + ): + super().__init__( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + num_layers=num_layers, + resnet_eps=resnet_eps, + resnet_time_scale_shift=resnet_time_scale_shift, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_pre_norm=resnet_pre_norm, + output_scale_factor=output_scale_factor, + add_upsample=add_upsample, + temb_channels=temb_channels, + ) + resnets = [] + temporal_modules = [] + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + # [Override] Replace module. + ResnetBlock3D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + slicing=slicing, + ) + ) + + temporal_modules.append(nn.Identity()) + + self.resnets = nn.ModuleList(resnets) + self.temporal_modules = nn.ModuleList(temporal_modules) + + if add_upsample: + # [Override] Replace module & use learnable upsample + self.upsamplers = nn.ModuleList( + [ + Upsample3D( + out_channels, + use_conv=True, + out_channels=out_channels, + temporal_up=temporal_up, + spatial_up=spatial_up, + interpolate=False, + inflation_mode=inflation_mode, + slicing=slicing, + ) + ] + ) + else: + self.upsamplers = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + memory_state: MemoryState = MemoryState.DISABLED, + ) -> torch.FloatTensor: + for resnet, temporal in zip(self.resnets, self.temporal_modules): + hidden_states = resnet(hidden_states, temb=None, memory_state=memory_state) + hidden_states = temporal(hidden_states) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, memory_state=memory_state) + + return hidden_states + + +class UNetMidBlock3D(nn.Module): + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + add_attention: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + ): + super().__init__() + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + self.add_attention = add_attention + + # there is always at least one resnet + resnets = [ + # [Override] Replace module. + ResnetBlock3D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + ] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. " + f"Defaulting `attention_head_dim` to `in_channels`: {in_channels}." + ) + attention_head_dim = in_channels + + for _ in range(num_layers): + if self.add_attention: + attentions.append( + Attention( + in_channels, + heads=in_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=( + resnet_groups if resnet_time_scale_shift == "default" else None + ), + spatial_norm_dim=( + temb_channels if resnet_time_scale_shift == "spatial" else None + ), + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + else: + attentions.append(None) + + resnets.append( + ResnetBlock3D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward(self, hidden_states, temb=None, memory_state: MemoryState = MemoryState.DISABLED): + video_length, frame_height, frame_width = hidden_states.size()[-3:] + hidden_states = self.resnets[0](hidden_states, temb, memory_state=memory_state) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if attn is not None: + hidden_states = rearrange(hidden_states, "b c f h w -> (b f) c h w") + hidden_states = attn(hidden_states, temb=temb) + hidden_states = rearrange( + hidden_states, "(b f) c h w -> b c f h w", f=video_length + ) + hidden_states = resnet(hidden_states, temb, memory_state=memory_state) + + return hidden_states + + +class Encoder3D(nn.Module): + r""" + [Override] override most logics to support extra condition input and causal conv + + The `Encoder` layer of a variational autoencoder that encodes + its input into a latent representation. + + Args: + in_channels (`int`, *optional*, defaults to 3): + The number of input channels. + out_channels (`int`, *optional*, defaults to 3): + The number of output channels. + down_block_types (`Tuple[str, ...]`, *optional*, defaults to `("DownEncoderBlock2D",)`): + The types of down blocks to use. + See `~diffusers.models.unet_2d_blocks.get_down_block` + for available options. + block_out_channels (`Tuple[int, ...]`, *optional*, defaults to `(64,)`): + The number of output channels for each block. + layers_per_block (`int`, *optional*, defaults to 2): + The number of layers per block. + norm_num_groups (`int`, *optional*, defaults to 32): + The number of groups for normalization. + act_fn (`str`, *optional*, defaults to `"silu"`): + The activation function to use. + See `~diffusers.models.activations.get_activation` for available options. + double_z (`bool`, *optional*, defaults to `True`): + Whether to double the number of output channels for the last block. + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + down_block_types: Tuple[str, ...] = ("DownEncoderBlock3D",), + block_out_channels: Tuple[int, ...] = (64,), + layers_per_block: int = 2, + norm_num_groups: int = 32, + act_fn: str = "silu", + double_z: bool = True, + mid_block_add_attention=True, + # [Override] add extra_cond_dim, temporal down num + temporal_down_num: int = 2, + extra_cond_dim: int = None, + gradient_checkpoint: bool = False, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + ): + super().__init__() + self.layers_per_block = layers_per_block + self.temporal_down_num = temporal_down_num + + self.conv_in = init_causal_conv3d( + in_channels, + block_out_channels[0], + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + self.mid_block = None + self.down_blocks = nn.ModuleList([]) + self.extra_cond_dim = extra_cond_dim + + self.conv_extra_cond = nn.ModuleList([]) + + # down + output_channel = block_out_channels[0] + for i, down_block_type in enumerate(down_block_types): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + # [Override] to support temporal down block design + is_temporal_down_block = i >= len(block_out_channels) - self.temporal_down_num - 1 + # Note: take the last ones + + assert down_block_type == "DownEncoderBlock3D" + + down_block = DownEncoderBlock3D( + num_layers=self.layers_per_block, + in_channels=input_channel, + out_channels=output_channel, + add_downsample=not is_final_block, + resnet_eps=1e-6, + downsample_padding=0, + # Note: Don't know why set it as 0 + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + temporal_down=is_temporal_down_block, + spatial_down=True, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + self.down_blocks.append(down_block) + + def zero_module(module): + # Zero out the parameters of a module and return it. + for p in module.parameters(): + p.detach().zero_() + return module + + self.conv_extra_cond.append( + zero_module( + nn.Conv3d(extra_cond_dim, output_channel, kernel_size=1, stride=1, padding=0) + ) + if self.extra_cond_dim is not None and self.extra_cond_dim > 0 + else None + ) + + # mid + self.mid_block = UNetMidBlock3D( + in_channels=block_out_channels[-1], + resnet_eps=1e-6, + resnet_act_fn=act_fn, + output_scale_factor=1, + resnet_time_scale_shift="default", + attention_head_dim=block_out_channels[-1], + resnet_groups=norm_num_groups, + temb_channels=None, + add_attention=mid_block_add_attention, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[-1], num_groups=norm_num_groups, eps=1e-6 + ) + self.conv_act = nn.SiLU() + + conv_out_channels = 2 * out_channels if double_z else out_channels + self.conv_out = init_causal_conv3d( + block_out_channels[-1], conv_out_channels, 3, padding=1, inflation_mode=inflation_mode + ) + + self.gradient_checkpointing = gradient_checkpoint + + def forward( + self, + sample: torch.FloatTensor, + extra_cond=None, + memory_state: MemoryState = MemoryState.DISABLED, + ) -> torch.FloatTensor: + r"""The forward method of the `Encoder` class.""" + sample = self.conv_in(sample, memory_state=memory_state) + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + # down + # [Override] add extra block and extra cond + for down_block, extra_block in zip(self.down_blocks, self.conv_extra_cond): + sample = torch.utils.checkpoint.checkpoint( + create_custom_forward(down_block), sample, memory_state, use_reentrant=False + ) + if extra_block is not None: + sample = sample + safe_interpolate_operation(extra_block(extra_cond), size=sample.shape[2:]) + + # middle + sample = self.mid_block(sample, memory_state=memory_state) + + # sample = torch.utils.checkpoint.checkpoint( + # create_custom_forward(self.mid_block), sample, use_reentrant=False + # ) + + else: + # down + # [Override] add extra block and extra cond + for down_block, extra_block in zip(self.down_blocks, self.conv_extra_cond): + sample = down_block(sample, memory_state=memory_state) + if extra_block is not None: + sample = sample + safe_interpolate_operation(extra_block(extra_cond), size=sample.shape[2:]) + + # middle + sample = self.mid_block(sample, memory_state=memory_state) + + # post-process + sample = causal_norm_wrapper(self.conv_norm_out, sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample, memory_state=memory_state) + + return sample + + +class Decoder3D(nn.Module): + r""" + The `Decoder` layer of a variational autoencoder that + decodes its latent representation into an output sample. + + Args: + in_channels (`int`, *optional*, defaults to 3): + The number of input channels. + out_channels (`int`, *optional*, defaults to 3): + The number of output channels. + up_block_types (`Tuple[str, ...]`, *optional*, defaults to `("UpDecoderBlock2D",)`): + The types of up blocks to use. + See `~diffusers.models.unet_2d_blocks.get_up_block` for available options. + block_out_channels (`Tuple[int, ...]`, *optional*, defaults to `(64,)`): + The number of output channels for each block. + layers_per_block (`int`, *optional*, defaults to 2): + The number of layers per block. + norm_num_groups (`int`, *optional*, defaults to 32): + The number of groups for normalization. + act_fn (`str`, *optional*, defaults to `"silu"`): + The activation function to use. + See `~diffusers.models.activations.get_activation` for available options. + norm_type (`str`, *optional*, defaults to `"group"`): + The normalization type to use. Can be either `"group"` or `"spatial"`. + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + up_block_types: Tuple[str, ...] = ("UpDecoderBlock3D",), + block_out_channels: Tuple[int, ...] = (64,), + layers_per_block: int = 2, + norm_num_groups: int = 32, + act_fn: str = "silu", + norm_type: str = "group", # group, spatial + mid_block_add_attention=True, + # [Override] add temporal up block + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_up_num: int = 2, + slicing_up_num: int = 0, + gradient_checkpoint: bool = False, + ): + super().__init__() + self.layers_per_block = layers_per_block + self.temporal_up_num = temporal_up_num + + self.conv_in = init_causal_conv3d( + in_channels, + block_out_channels[-1], + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + self.mid_block = None + self.up_blocks = nn.ModuleList([]) + + temb_channels = in_channels if norm_type == "spatial" else None + + # mid + self.mid_block = UNetMidBlock3D( + in_channels=block_out_channels[-1], + resnet_eps=1e-6, + resnet_act_fn=act_fn, + output_scale_factor=1, + resnet_time_scale_shift="default" if norm_type == "group" else norm_type, + attention_head_dim=block_out_channels[-1], + resnet_groups=norm_num_groups, + temb_channels=temb_channels, + add_attention=mid_block_add_attention, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # up + reversed_block_out_channels = list(reversed(block_out_channels)) + output_channel = reversed_block_out_channels[0] + for i, up_block_type in enumerate(up_block_types): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + + is_final_block = i == len(block_out_channels) - 1 + is_temporal_up_block = i < self.temporal_up_num + is_slicing_up_block = i >= len(block_out_channels) - slicing_up_num + # Note: Keep symmetric + + assert up_block_type == "UpDecoderBlock3D" + up_block = UpDecoderBlock3D( + num_layers=self.layers_per_block + 1, + in_channels=prev_output_channel, + out_channels=output_channel, + add_upsample=not is_final_block, + resnet_eps=1e-6, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + resnet_time_scale_shift=norm_type, + temb_channels=temb_channels, + temporal_up=is_temporal_up_block, + slicing=is_slicing_up_block, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + self.up_blocks.append(up_block) + prev_output_channel = output_channel + + # out + if norm_type == "spatial": + self.conv_norm_out = SpatialNorm(block_out_channels[0], temb_channels) + else: + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], num_groups=norm_num_groups, eps=1e-6 + ) + self.conv_act = nn.SiLU() + self.conv_out = init_causal_conv3d( + block_out_channels[0], out_channels, 3, padding=1, inflation_mode=inflation_mode + ) + + self.gradient_checkpointing = gradient_checkpoint + + # Note: Just copy from Decoder. + def forward( + self, + sample: torch.FloatTensor, + latent_embeds: Optional[torch.FloatTensor] = None, + memory_state: MemoryState = MemoryState.DISABLED, + ) -> torch.FloatTensor: + r"""The forward method of the `Decoder` class.""" + + sample = self.conv_in(sample, memory_state=memory_state) + + #upscale_dtype = next(iter(self.up_blocks.parameters())).dtype + upscale_dtype = sample.dtype + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + sample = self.mid_block(sample, latent_embeds, memory_state=memory_state) + sample = sample.to(upscale_dtype) + + # up + for up_block in self.up_blocks: + sample = torch.utils.checkpoint.checkpoint( + create_custom_forward(up_block), + sample, + latent_embeds, + memory_state, + use_reentrant=False, + ) + else: + # middle + sample = self.mid_block(sample, latent_embeds, memory_state=memory_state) + sample = sample.to(upscale_dtype) + + # up + for up_block in self.up_blocks: + sample = torch.utils.checkpoint.checkpoint( + create_custom_forward(up_block), sample, latent_embeds, memory_state + ) + else: + # middle + sample = self.mid_block(sample, latent_embeds, memory_state=memory_state) + sample = sample.to(upscale_dtype) + + # up + for up_block in self.up_blocks: + sample = up_block(sample, latent_embeds, memory_state=memory_state) + + # post-process + sample = causal_norm_wrapper(self.conv_norm_out, sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample, memory_state=memory_state) + + return sample + + +class AutoencoderKL(diffusers.AutoencoderKL): + """ + We simply inherit the model code from diffusers + """ + + def __init__(self, attention: bool = True, *args, **kwargs): + super().__init__(*args, **kwargs) + + # A hacky way to remove attention. + if not attention: + self.encoder.mid_block.attentions = torch.nn.ModuleList([None]) + self.decoder.mid_block.attentions = torch.nn.ModuleList([None]) + + def load_state_dict(self, state_dict, strict=True): + # Newer version of diffusers changed the model keys, + # causing incompatibility with old checkpoints. + # They provided a method for conversion. We call conversion before loading state_dict. + convert_deprecated_attention_blocks = getattr( + self, "_convert_deprecated_attention_blocks", None + ) + if callable(convert_deprecated_attention_blocks): + convert_deprecated_attention_blocks(state_dict) + return super().load_state_dict(state_dict, strict) + + +class VideoAutoencoderKL(diffusers.AutoencoderKL): + """ + We simply inherit the model code from diffusers + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + down_block_types: Tuple[str] = ("DownEncoderBlock3D",), + up_block_types: Tuple[str] = ("UpDecoderBlock3D",), + block_out_channels: Tuple[int] = (64,), + layers_per_block: int = 1, + act_fn: str = "silu", + latent_channels: int = 4, + norm_num_groups: int = 32, + sample_size: int = 32, + scaling_factor: float = 0.18215, + force_upcast: float = True, + attention: bool = True, + temporal_scale_num: int = 2, + slicing_up_num: int = 0, + gradient_checkpoint: bool = False, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "full", + slicing_sample_min_size: int = 32, + use_quant_conv: bool = True, + use_post_quant_conv: bool = True, + *args, + **kwargs, + ): + extra_cond_dim = kwargs.pop("extra_cond_dim") if "extra_cond_dim" in kwargs else None + self.slicing_sample_min_size = slicing_sample_min_size + self.slicing_latent_min_size = slicing_sample_min_size // (2**temporal_scale_num) + + super().__init__( + in_channels=in_channels, + out_channels=out_channels, + # [Override] make sure it can be normally initialized + down_block_types=tuple( + [down_block_type.replace("3D", "2D") for down_block_type in down_block_types] + ), + up_block_types=tuple( + [up_block_type.replace("3D", "2D") for up_block_type in up_block_types] + ), + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + act_fn=act_fn, + latent_channels=latent_channels, + norm_num_groups=norm_num_groups, + sample_size=sample_size, + scaling_factor=scaling_factor, + force_upcast=force_upcast, + *args, + **kwargs, + ) + + # pass init params to Encoder + self.encoder = Encoder3D( + in_channels=in_channels, + out_channels=latent_channels, + down_block_types=down_block_types, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + act_fn=act_fn, + norm_num_groups=norm_num_groups, + double_z=True, + extra_cond_dim=extra_cond_dim, + # [Override] add temporal_down_num parameter + temporal_down_num=temporal_scale_num, + gradient_checkpoint=gradient_checkpoint, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # pass init params to Decoder + self.decoder = Decoder3D( + in_channels=latent_channels, + out_channels=out_channels, + up_block_types=up_block_types, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + norm_num_groups=norm_num_groups, + act_fn=act_fn, + # [Override] add temporal_up_num parameter + temporal_up_num=temporal_scale_num, + slicing_up_num=slicing_up_num, + gradient_checkpoint=gradient_checkpoint, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + self.quant_conv = ( + init_causal_conv3d( + in_channels=2 * latent_channels, + out_channels=2 * latent_channels, + kernel_size=1, + inflation_mode=inflation_mode, + ) + if use_quant_conv + else None + ) + self.post_quant_conv = ( + init_causal_conv3d( + in_channels=latent_channels, + out_channels=latent_channels, + kernel_size=1, + inflation_mode=inflation_mode, + ) + if use_post_quant_conv + else None + ) + + # A hacky way to remove attention. + if not attention: + self.encoder.mid_block.attentions = torch.nn.ModuleList([None]) + self.decoder.mid_block.attentions = torch.nn.ModuleList([None]) + + @apply_forward_hook + def encode(self, x: torch.FloatTensor, return_dict: bool = True) -> AutoencoderKLOutput: + h = self.slicing_encode(x) + posterior = DiagonalGaussianDistribution(h) + + if not return_dict: + return (posterior,) + + return AutoencoderKLOutput(latent_dist=posterior) + + @apply_forward_hook + def decode( + self, z: torch.Tensor, return_dict: bool = True + ) -> Union[DecoderOutput, torch.Tensor]: + decoded = self.slicing_decode(z) + + if not return_dict: + return (decoded,) + + return DecoderOutput(sample=decoded) + + def _encode( + self, x: torch.Tensor, memory_state: MemoryState = MemoryState.DISABLED + ) -> torch.Tensor: + _x = x.to(self.device) + _x = causal_conv_slice_inputs(_x, self.slicing_sample_min_size, memory_state=memory_state) + h = self.encoder(_x, memory_state=memory_state) + if self.quant_conv is not None: + output = self.quant_conv(h, memory_state=memory_state) + else: + output = h + output = causal_conv_gather_outputs(output) + return output.to(x.device) + + def _decode( + self, z: torch.Tensor, memory_state: MemoryState = MemoryState.DISABLED + ) -> torch.Tensor: + _z = z.to(self.device) + _z = causal_conv_slice_inputs(_z, self.slicing_latent_min_size, memory_state=memory_state) + if self.post_quant_conv is not None: + _z = self.post_quant_conv(_z, memory_state=memory_state) + output = self.decoder(_z, memory_state=memory_state) + output = causal_conv_gather_outputs(output) + return output.to(z.device) + + def slicing_encode(self, x: torch.Tensor) -> torch.Tensor: + sp_size = get_sequence_parallel_world_size() + if self.use_slicing and (x.shape[2] - 1) > self.slicing_sample_min_size * sp_size: + x_slices = x[:, :, 1:].split(split_size=self.slicing_sample_min_size * sp_size, dim=2) + encoded_slices = [ + self._encode( + torch.cat((x[:, :, :1], x_slices[0]), dim=2), + memory_state=MemoryState.INITIALIZING, + ) + ] + for x_idx in range(1, len(x_slices)): + encoded_slices.append( + self._encode(x_slices[x_idx], memory_state=MemoryState.ACTIVE) + ) + return torch.cat(encoded_slices, dim=2) + else: + return self._encode(x) + + def slicing_decode(self, z: torch.Tensor) -> torch.Tensor: + sp_size = get_sequence_parallel_world_size() + if self.use_slicing and (z.shape[2] - 1) > self.slicing_latent_min_size * sp_size: + z_slices = z[:, :, 1:].split(split_size=self.slicing_latent_min_size * sp_size, dim=2) + decoded_slices = [ + self._decode( + torch.cat((z[:, :, :1], z_slices[0]), dim=2), + memory_state=MemoryState.INITIALIZING, + ) + ] + for z_idx in range(1, len(z_slices)): + decoded_slices.append( + self._decode(z_slices[z_idx], memory_state=MemoryState.ACTIVE) + ) + return torch.cat(decoded_slices, dim=2) + else: + return self._decode(z) + + def tiled_encode(self, x: torch.Tensor, **kwargs) -> torch.Tensor: + raise NotImplementedError + + def tiled_decode(self, z: torch.Tensor, **kwargs) -> torch.Tensor: + raise NotImplementedError + + def forward( + self, x: torch.FloatTensor, mode: Literal["encode", "decode", "all"] = "all", **kwargs + ): + # x: [b c t h w] + if mode == "encode": + h = self.encode(x) + return h.latent_dist + elif mode == "decode": + h = self.decode(x) + return h.sample + else: + h = self.encode(x) + h = self.decode(h.latent_dist.mode()) + return h.sample + + def load_state_dict(self, state_dict, strict=False): + # Newer version of diffusers changed the model keys, + # causing incompatibility with old checkpoints. + # They provided a method for conversion. + # We call conversion before loading state_dict. + convert_deprecated_attention_blocks = getattr( + self, "_convert_deprecated_attention_blocks", None + ) + if callable(convert_deprecated_attention_blocks): + convert_deprecated_attention_blocks(state_dict) + return super().load_state_dict(state_dict, strict) + + +class VideoAutoencoderKLWrapper(VideoAutoencoderKL): + def __init__( + self, + *args, + spatial_downsample_factor: int, + temporal_downsample_factor: int, + freeze_encoder: bool, + **kwargs, + ): + self.spatial_downsample_factor = spatial_downsample_factor + self.temporal_downsample_factor = temporal_downsample_factor + self.freeze_encoder = freeze_encoder + super().__init__(*args, **kwargs) + + def forward(self, x: torch.FloatTensor) -> CausalAutoencoderOutput: + with torch.no_grad() if self.freeze_encoder else nullcontext(): + z, p = self.encode(x) + x = self.decode(z).sample + return CausalAutoencoderOutput(x, z, p) + + def encode(self, x: torch.FloatTensor) -> CausalEncoderOutput: + if x.ndim == 4: + x = x.unsqueeze(2) + p = super().encode(x).latent_dist + z = p.sample().squeeze(2) + return CausalEncoderOutput(z, p) + + def decode(self, z: torch.FloatTensor) -> CausalDecoderOutput: + if z.ndim == 4: + z = z.unsqueeze(2) + x = super().decode(z).sample.squeeze(2) + return CausalDecoderOutput(x) + + def preprocess(self, x: torch.Tensor): + # x should in [B, C, T, H, W], [B, C, H, W] + assert x.ndim == 4 or x.size(2) % 4 == 1 + return x + + def postprocess(self, x: torch.Tensor): + # x should in [B, C, T, H, W], [B, C, H, W] + return x + + def set_causal_slicing( + self, + *, + split_size: Optional[int], + memory_device: _memory_device_t, + ): + assert ( + split_size is None or memory_device is not None + ), "if split_size is set, memory_device must not be None." + if split_size is not None: + self.enable_slicing() + self.slicing_sample_min_size = split_size + self.slicing_latent_min_size = split_size // self.temporal_downsample_factor + else: + self.disable_slicing() + for module in self.modules(): + if isinstance(module, InflatedCausalConv3d): + module.set_memory_device(memory_device) + + def set_memory_limit(self, conv_max_mem: Optional[float], norm_max_mem: Optional[float]): + set_norm_limit(norm_max_mem) + for m in self.modules(): + if isinstance(m, InflatedCausalConv3d): + m.set_memory_limit(conv_max_mem if conv_max_mem is not None else float("inf")) diff --git a/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py new file mode 100644 index 000000000..26f14739e --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py @@ -0,0 +1,437 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +import math +from contextlib import contextmanager +from typing import List, Optional, Union +import torch +import torch.nn.functional as F +from diffusers.models.normalization import RMSNorm +from einops import rearrange +from torch import Tensor, nn +from torch.nn import Conv3d + +from .context_parallel_lib import cache_send_recv, get_cache_size +from .global_config import get_norm_limit +from .types import MemoryState, _inflation_mode_t, _memory_device_t +from ....common.half_precision_fixes import safe_pad_operation + +# Single GPU inference - no distributed processing needed + +# Mock distributed functions for single GPU inference +def get_sequence_parallel_group(): + return None + +def get_sequence_parallel_rank(): + return 0 + +def get_sequence_parallel_world_size(): + return 1 + +def get_next_sequence_parallel_rank(): + return 0 + +def get_prev_sequence_parallel_rank(): + return 0 + + +@contextmanager +def ignore_padding(model): + orig_padding = model.padding + model.padding = (0, 0, 0) + try: + yield + finally: + model.padding = orig_padding + + +class InflatedCausalConv3d(Conv3d): + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t, + memory_device: _memory_device_t = "same", + **kwargs, + ): + self.inflation_mode = inflation_mode + self.memory = None + super().__init__(*args, **kwargs) + self.temporal_padding = self.padding[0] + self.memory_device = memory_device + self.padding = (0, *self.padding[1:]) # Remove temporal pad to keep causal. + self.memory_limit = float("inf") + + def set_memory_limit(self, value: float): + self.memory_limit = value + + def set_memory_device(self, memory_device: _memory_device_t): + self.memory_device = memory_device + + def memory_limit_conv( + self, + x, + *, + split_dim=3, + padding=(0, 0, 0, 0, 0, 0), + prev_cache=None, + ): + # Compatible with no limit. + if math.isinf(self.memory_limit): + if prev_cache is not None: + x = torch.cat([prev_cache, x], dim=split_dim - 1) + return super().forward(x) + + # Compute tensor shape after concat & padding. + shape = torch.tensor(x.size()) + if prev_cache is not None: + shape[split_dim - 1] += prev_cache.size(split_dim - 1) + shape[-3:] += torch.tensor(padding).view(3, 2).sum(-1).flip(0) + memory_occupy = shape.prod() * x.element_size() / 1024**3 # GiB + if memory_occupy < self.memory_limit or split_dim == x.ndim: + if prev_cache is not None: + x = torch.cat([prev_cache, x], dim=split_dim - 1) + x = safe_pad_operation(x, padding, mode='constant', value=0.0) + with ignore_padding(self): + return super().forward(x) + + # Exceed memory limit, splitting tensor + + # Split input (& prev_cache). + num_splits = math.ceil(memory_occupy / self.memory_limit) + size_per_split = x.size(split_dim) // num_splits + split_sizes = [size_per_split] * (num_splits - 1) + split_sizes += [x.size(split_dim) - sum(split_sizes)] + + x = list(x.split(split_sizes, dim=split_dim)) + if prev_cache is not None: + prev_cache = list(prev_cache.split(split_sizes, dim=split_dim)) + # Loop Fwd. + cache = None + for idx in range(len(x)): + # Concat prev cache from last dim + if prev_cache is not None: + x[idx] = torch.cat([prev_cache[idx], x[idx]], dim=split_dim - 1) + + # Get padding pattern. + lpad_dim = (x[idx].ndim - split_dim - 1) * 2 + rpad_dim = lpad_dim + 1 + padding = list(padding) + padding[lpad_dim] = self.padding[split_dim - 2] if idx == 0 else 0 + padding[rpad_dim] = self.padding[split_dim - 2] if idx == len(x) - 1 else 0 + pad_len = padding[lpad_dim] + padding[rpad_dim] + padding = tuple(padding) + + # Prepare cache for next slice (this dim). + next_cache = None + cache_len = cache.size(split_dim) if cache is not None else 0 + next_catch_size = get_cache_size( + conv_module=self, + input_len=x[idx].size(split_dim) + cache_len, + pad_len=pad_len, + dim=split_dim - 2, + ) + if next_catch_size != 0: + assert next_catch_size <= x[idx].size(split_dim) + next_cache = ( + x[idx].transpose(0, split_dim)[-next_catch_size:].transpose(0, split_dim) + ) + + # Recursive. + x[idx] = self.memory_limit_conv( + x[idx], + split_dim=split_dim + 1, + padding=padding, + prev_cache=cache, + ) + + # Update cache. + cache = next_cache + + output = torch.cat(x, split_dim) + return output + + def forward( + self, + input: Union[Tensor, List[Tensor]], + memory_state: MemoryState = MemoryState.UNSET, + ) -> Tensor: + assert memory_state != MemoryState.UNSET + if memory_state != MemoryState.ACTIVE: + self.memory = None + if ( + math.isinf(self.memory_limit) + and torch.is_tensor(input) + and get_sequence_parallel_group() is None + ): + return self.basic_forward(input, memory_state) + return self.slicing_forward(input, memory_state) + + def basic_forward(self, input: Tensor, memory_state: MemoryState = MemoryState.UNSET): + mem_size = self.stride[0] - self.kernel_size[0] + if (self.memory is not None) and (memory_state == MemoryState.ACTIVE): + input = extend_head(input, memory=self.memory, times=-1) + else: + input = extend_head(input, times=self.temporal_padding * 2) + memory = ( + input[:, :, mem_size:].detach() + if (mem_size != 0 and memory_state != MemoryState.DISABLED) + else None + ) + if ( + memory_state != MemoryState.DISABLED + and not self.training + and (self.memory_device is not None) + ): + self.memory = memory + if self.memory_device == "cpu" and self.memory is not None: + self.memory = self.memory.to("cpu") + return super().forward(input) + + def slicing_forward( + self, + input: Union[Tensor, List[Tensor]], + memory_state: MemoryState = MemoryState.UNSET, + ) -> Tensor: + squeeze_out = False + if torch.is_tensor(input): + input = [input] + squeeze_out = True + + cache_size = self.kernel_size[0] - self.stride[0] + cache = cache_send_recv( + input, cache_size=cache_size, memory=self.memory, times=self.temporal_padding * 2 + ) + + # Single GPU inference - simplified memory management + if ( + memory_state in [MemoryState.INITIALIZING, MemoryState.ACTIVE] # use_slicing + and not self.training + and (self.memory_device is not None) + and cache_size != 0 + ): + if cache_size > input[-1].size(2) and cache is not None and len(input) == 1: + input[0] = torch.cat([cache, input[0]], dim=2) + cache = None + if cache_size <= input[-1].size(2): + self.memory = input[-1][:, :, -cache_size:].detach().contiguous() + if self.memory_device == "cpu" and self.memory is not None: + self.memory = self.memory.to("cpu") + + padding = tuple(x for x in reversed(self.padding) for _ in range(2)) + for i in range(len(input)): + # Prepare cache for next input slice. + next_cache = None + cache_size = 0 + if i < len(input) - 1: + cache_len = cache.size(2) if cache is not None else 0 + cache_size = get_cache_size(self, input[i].size(2) + cache_len, pad_len=0) + if cache_size != 0: + if cache_size > input[i].size(2) and cache is not None: + input[i] = torch.cat([cache, input[i]], dim=2) + cache = None + assert cache_size <= input[i].size(2), f"{cache_size} > {input[i].size(2)}" + next_cache = input[i][:, :, -cache_size:] + + # Conv forward for this input slice. + input[i] = self.memory_limit_conv( + input[i], + padding=padding, + prev_cache=cache, + ) + + # Update cache. + cache = next_cache + + return input[0] if squeeze_out else input + + def tflops(self, args, kwargs, output) -> float: + if torch.is_tensor(output): + output_numel = output.numel() + elif isinstance(output, list): + output_numel = sum(o.numel() for o in output) + else: + raise NotImplementedError + return (2 * math.prod(self.kernel_size) * self.in_channels * (output_numel / 1e6)) / 1e6 + + def _load_from_state_dict( + self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ): + if self.inflation_mode != "none": + state_dict = modify_state_dict( + self, + state_dict, + prefix, + inflate_weight_fn=inflate_weight, + inflate_bias_fn=inflate_bias, + ) + super()._load_from_state_dict( + state_dict, + prefix, + local_metadata, + (strict and self.inflation_mode == "none"), + missing_keys, + unexpected_keys, + error_msgs, + ) + + +def init_causal_conv3d( + *args, + inflation_mode: _inflation_mode_t, + **kwargs, +): + """ + Initialize a Causal-3D convolution layer. + Parameters: + inflation_mode: Listed as below. It's compatible with all the 3D-VAE checkpoints we have. + - none: No inflation will be conducted. + The loading logic of state dict will fall back to default. + - tail / replicate: Refer to the definition of `InflatedCausalConv3d`. + """ + return InflatedCausalConv3d(*args, inflation_mode=inflation_mode, **kwargs) + + +def causal_norm_wrapper(norm_layer: nn.Module, x: torch.Tensor) -> torch.Tensor: + input_dtype = x.dtype + if isinstance(norm_layer, (nn.LayerNorm, RMSNorm)): + if x.ndim == 4: + x = rearrange(x, "b c h w -> b h w c") + x = norm_layer(x) + x = rearrange(x, "b h w c -> b c h w") + return x.to(input_dtype) + if x.ndim == 5: + x = rearrange(x, "b c t h w -> b t h w c") + x = norm_layer(x) + x = rearrange(x, "b t h w c -> b c t h w") + return x.to(input_dtype) + if isinstance(norm_layer, (nn.GroupNorm, nn.BatchNorm2d, nn.SyncBatchNorm)): + if x.ndim <= 4: + return norm_layer(x).to(input_dtype) + if x.ndim == 5: + t = x.size(2) + x = rearrange(x, "b c t h w -> (b t) c h w") + memory_occupy = x.numel() * x.element_size() / 1024**3 + if isinstance(norm_layer, nn.GroupNorm) and memory_occupy > get_norm_limit(): + num_chunks = min(4 if x.element_size() == 2 else 2, norm_layer.num_groups) + assert norm_layer.num_groups % num_chunks == 0 + num_groups_per_chunk = norm_layer.num_groups // num_chunks + + x = list(x.chunk(num_chunks, dim=1)) + weights = norm_layer.weight.chunk(num_chunks, dim=0) + biases = norm_layer.bias.chunk(num_chunks, dim=0) + for i, (w, b) in enumerate(zip(weights, biases)): + x[i] = F.group_norm(x[i], num_groups_per_chunk, w, b, norm_layer.eps) + x[i] = x[i].to(input_dtype) + # ADD BY NUMZ + # ADD BY NUMZ + x = torch.cat(x, dim=1) + else: + x = norm_layer(x) + x = rearrange(x, "(b t) c h w -> b c t h w", t=t) + return x.to(input_dtype) + raise NotImplementedError + + +def remove_head(tensor: Tensor, times: int = 1) -> Tensor: + """ + Remove duplicated first frame features in the up-sampling process. + """ + # Single GPU inference - always process + if times == 0: + return tensor + return torch.cat(tensors=(tensor[:, :, :1], tensor[:, :, times + 1 :]), dim=2) + + +def extend_head(tensor: Tensor, times: int = 2, memory: Optional[Tensor] = None) -> Tensor: + """ + When memory is None: + - Duplicate first frame features in the down-sampling process. + When memory is not None: + - Concatenate memory features with the input features to keep temporal consistency. + """ + if memory is not None: + return torch.cat((memory.to(tensor), tensor), dim=2) + assert times >= 0, "Invalid input for function 'extend_head'!" + if times == 0: + return tensor + else: + tile_repeat = [1] * tensor.ndim + tile_repeat[2] = times + return torch.cat(tensors=(torch.tile(tensor[:, :, :1], tile_repeat), tensor), dim=2) + + +def inflate_weight(weight_2d: torch.Tensor, weight_3d: torch.Tensor, inflation_mode: str): + """ + Inflate a 2D convolution weight matrix to a 3D one. + Parameters: + weight_2d: The weight matrix of 2D conv to be inflated. + weight_3d: The weight matrix of 3D conv to be initialized. + inflation_mode: the mode of inflation + """ + assert inflation_mode in ["tail", "replicate"] + assert weight_3d.shape[:2] == weight_2d.shape[:2] + with torch.no_grad(): + if inflation_mode == "replicate": + depth = weight_3d.size(2) + weight_3d.copy_(weight_2d.unsqueeze(2).repeat(1, 1, depth, 1, 1) / depth) + else: + weight_3d.fill_(0.0) + weight_3d[:, :, -1].copy_(weight_2d) + return weight_3d + + +def inflate_bias(bias_2d: torch.Tensor, bias_3d: torch.Tensor, inflation_mode: str): + """ + Inflate a 2D convolution bias tensor to a 3D one + Parameters: + bias_2d: The bias tensor of 2D conv to be inflated. + bias_3d: The bias tensor of 3D conv to be initialized. + inflation_mode: Placeholder to align `inflate_weight`. + """ + assert bias_3d.shape == bias_2d.shape + with torch.no_grad(): + bias_3d.copy_(bias_2d) + return bias_3d + + +def modify_state_dict(layer, state_dict, prefix, inflate_weight_fn, inflate_bias_fn): + """ + the main function to inflated 2D parameters to 3D. + """ + weight_name = prefix + "weight" + bias_name = prefix + "bias" + if weight_name in state_dict: + weight_2d = state_dict[weight_name] + if weight_2d.dim() == 4: + # Assuming the 2D weights are 4D tensors (out_channels, in_channels, h, w) + weight_3d = inflate_weight_fn( + weight_2d=weight_2d, + weight_3d=layer.weight, + inflation_mode=layer.inflation_mode, + ) + state_dict[weight_name] = weight_3d + else: + return state_dict + # It's a 3d state dict, should not do inflation on both bias and weight. + if bias_name in state_dict: + bias_2d = state_dict[bias_name] + if bias_2d.dim() == 1: + # Assuming the 2D biases are 1D tensors (out_channels,) + bias_3d = inflate_bias_fn( + bias_2d=bias_2d, + bias_3d=layer.bias, + inflation_mode=layer.inflation_mode, + ) + state_dict[bias_name] = bias_3d + return state_dict diff --git a/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py new file mode 100644 index 000000000..ffc16938a --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py @@ -0,0 +1,66 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import List +import torch +import torch.nn.functional as F +from torch import Tensor + +from .types import MemoryState + +# Single GPU inference - no distributed processing needed + + +def causal_conv_slice_inputs(x, split_size, memory_state): + # Single GPU inference - no slicing needed, return full tensor + return x + + +def causal_conv_gather_outputs(x): + # Single GPU inference - no gathering needed, return tensor as is + return x + + +def get_output_len(conv_module, input_len, pad_len, dim=0): + dilated_kernerl_size = conv_module.dilation[dim] * (conv_module.kernel_size[dim] - 1) + 1 + output_len = (input_len + pad_len - dilated_kernerl_size) // conv_module.stride[dim] + 1 + return output_len + + +def get_cache_size(conv_module, input_len, pad_len, dim=0): + dilated_kernerl_size = conv_module.dilation[dim] * (conv_module.kernel_size[dim] - 1) + 1 + output_len = (input_len + pad_len - dilated_kernerl_size) // conv_module.stride[dim] + 1 + remain_len = ( + input_len + pad_len - ((output_len - 1) * conv_module.stride[dim] + dilated_kernerl_size) + ) + overlap_len = dilated_kernerl_size - conv_module.stride[dim] + cache_len = overlap_len + remain_len # >= 0 + + assert output_len > 0 + return cache_len + + +def cache_send_recv(tensor: List[Tensor], cache_size, times, memory=None): + # Single GPU inference - simplified cache handling + recv_buffer = None + + # Handle memory buffer for single GPU case + if memory is not None: + recv_buffer = memory.to(tensor[0]) + elif times > 0: + tile_repeat = [1] * tensor[0].ndim + tile_repeat[2] = times + recv_buffer = torch.tile(tensor[0][:, :, :1], tile_repeat) + + return recv_buffer diff --git a/modules/seedvr/src/models/video_vae_v3/modules/global_config.py b/modules/seedvr/src/models/video_vae_v3/modules/global_config.py new file mode 100644 index 000000000..863117570 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/global_config.py @@ -0,0 +1,28 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from typing import Optional + +_NORM_LIMIT = float("inf") + + +def get_norm_limit(): + return _NORM_LIMIT + + +def set_norm_limit(value: Optional[float] = None): + global _NORM_LIMIT + if value is None: + value = float("inf") + _NORM_LIMIT = value diff --git a/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py b/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py new file mode 100644 index 000000000..4b8e6dfb6 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py @@ -0,0 +1,106 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from functools import partial +from typing import Literal, Optional +from torch import Tensor +from torch.nn import Conv3d + +from .inflated_lib import ( + MemoryState, + extend_head, + inflate_bias, + inflate_weight, + modify_state_dict, +) + +_inflation_mode_t = Literal["none", "tail", "replicate"] +_memory_device_t = Optional[Literal["cpu", "same"]] + + +class InflatedCausalConv3d(Conv3d): + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t, + memory_device: _memory_device_t = "same", + **kwargs, + ): + self.inflation_mode = inflation_mode + self.memory = None + super().__init__(*args, **kwargs) + self.temporal_padding = self.padding[0] + self.memory_device = memory_device + self.padding = (0, *self.padding[1:]) # Remove temporal pad to keep causal. + + def set_memory_device(self, memory_device: _memory_device_t): + self.memory_device = memory_device + + def forward(self, input: Tensor, memory_state: MemoryState = MemoryState.DISABLED) -> Tensor: + mem_size = self.stride[0] - self.kernel_size[0] + if (self.memory is not None) and (memory_state == MemoryState.ACTIVE): + input = extend_head(input, memory=self.memory) + else: + input = extend_head(input, times=self.temporal_padding * 2) + memory = ( + input[:, :, mem_size:].detach() + if (mem_size != 0 and memory_state != MemoryState.DISABLED) + else None + ) + if ( + memory_state != MemoryState.DISABLED + and not self.training + and (self.memory_device is not None) + ): + self.memory = memory + if self.memory_device == "cpu" and self.memory is not None: + self.memory = self.memory.to("cpu") + return super().forward(input) + + def _load_from_state_dict( + self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ): + if self.inflation_mode != "none": + state_dict = modify_state_dict( + self, + state_dict, + prefix, + inflate_weight_fn=partial(inflate_weight, position="tail"), + inflate_bias_fn=partial(inflate_bias, position="tail"), + ) + super()._load_from_state_dict( + state_dict, + prefix, + local_metadata, + (strict and self.inflation_mode == "none"), + missing_keys, + unexpected_keys, + error_msgs, + ) + + +def init_causal_conv3d( + *args, + inflation_mode: _inflation_mode_t, + **kwargs, +): + """ + Initialize a Causal-3D convolution layer. + Parameters: + inflation_mode: Listed as below. It's compatible with all the 3D-VAE checkpoints we have. + - none: No inflation will be conducted. + The loading logic of state dict will fall back to default. + - tail / replicate: Refer to the definition of `InflatedCausalConv3d`. + """ + return InflatedCausalConv3d(*args, inflation_mode=inflation_mode, **kwargs) diff --git a/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py new file mode 100644 index 000000000..486c63ca1 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py @@ -0,0 +1,156 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from enum import Enum +from typing import Optional +import numpy as np +import torch +from diffusers.models.normalization import RMSNorm +from einops import rearrange +from torch import Tensor, nn + +from ....common.logger import get_logger + +logger = get_logger(__name__) + + +class MemoryState(Enum): + """ + State[Disabled]: No memory bank will be enabled. + State[Initializing]: The model is handling the first clip, + need to reset / initialize the memory bank. + State[Active]: There has been some data in the memory bank. + """ + + DISABLED = 0 + INITIALIZING = 1 + ACTIVE = 2 + + +def causal_norm_wrapper(norm_layer: nn.Module, x: torch.Tensor) -> torch.Tensor: + if isinstance(norm_layer, (nn.LayerNorm, RMSNorm)): + if x.ndim == 4: + x = rearrange(x, "b c h w -> b h w c") + x = norm_layer(x) + x = rearrange(x, "b h w c -> b c h w") + return x + if x.ndim == 5: + x = rearrange(x, "b c t h w -> b t h w c") + x = norm_layer(x) + x = rearrange(x, "b t h w c -> b c t h w") + return x + if isinstance(norm_layer, (nn.GroupNorm, nn.BatchNorm2d, nn.SyncBatchNorm)): + if x.ndim <= 4: + return norm_layer(x) + if x.ndim == 5: + t = x.size(2) + x = rearrange(x, "b c t h w -> (b t) c h w") + x = norm_layer(x) + x = rearrange(x, "(b t) c h w -> b c t h w", t=t) + return x + raise NotImplementedError + + +def remove_head(tensor: Tensor, times: int = 1) -> Tensor: + """ + Remove duplicated first frame features in the up-sampling process. + """ + if times == 0: + return tensor + return torch.cat(tensors=(tensor[:, :, :1], tensor[:, :, times + 1 :]), dim=2) + + +def extend_head( + tensor: Tensor, times: Optional[int] = 2, memory: Optional[Tensor] = None +) -> Tensor: + """ + When memory is None: + - Duplicate first frame features in the down-sampling process. + When memory is not None: + - Concatenate memory features with the input features to keep temporal consistency. + """ + if times == 0: + return tensor + if memory is not None: + return torch.cat((memory.to(tensor), tensor), dim=2) + else: + tile_repeat = np.ones(tensor.ndim).astype(int) + tile_repeat[2] = times + return torch.cat(tensors=(torch.tile(tensor[:, :, :1], list(tile_repeat)), tensor), dim=2) + + +def inflate_weight(weight_2d: torch.Tensor, weight_3d: torch.Tensor, inflation_mode: str): + """ + Inflate a 2D convolution weight matrix to a 3D one. + Parameters: + weight_2d: The weight matrix of 2D conv to be inflated. + weight_3d: The weight matrix of 3D conv to be initialized. + inflation_mode: the mode of inflation + """ + assert inflation_mode in ["constant", "replicate"] + assert weight_3d.shape[:2] == weight_2d.shape[:2] + with torch.no_grad(): + if inflation_mode == "replicate": + depth = weight_3d.size(2) + weight_3d.copy_(weight_2d.unsqueeze(2).repeat(1, 1, depth, 1, 1) / depth) + else: + weight_3d.fill_(0.0) + weight_3d[:, :, -1].copy_(weight_2d) + return weight_3d + + +def inflate_bias(bias_2d: torch.Tensor, bias_3d: torch.Tensor, inflation_mode: str): + """ + Inflate a 2D convolution bias tensor to a 3D one + Parameters: + bias_2d: The bias tensor of 2D conv to be inflated. + bias_3d: The bias tensor of 3D conv to be initialized. + inflation_mode: Placeholder to align `inflate_weight`. + """ + assert bias_3d.shape == bias_2d.shape + with torch.no_grad(): + bias_3d.copy_(bias_2d) + return bias_3d + + +def modify_state_dict(layer, state_dict, prefix, inflate_weight_fn, inflate_bias_fn): + """ + the main function to inflated 2D parameters to 3D. + """ + weight_name = prefix + "weight" + bias_name = prefix + "bias" + if weight_name in state_dict: + weight_2d = state_dict[weight_name] + if weight_2d.dim() == 4: + # Assuming the 2D weights are 4D tensors (out_channels, in_channels, h, w) + weight_3d = inflate_weight_fn( + weight_2d=weight_2d, + weight_3d=layer.weight, + inflation_mode=layer.inflation_mode, + ) + state_dict[weight_name] = weight_3d + else: + return state_dict + # It's a 3d state dict, should not do inflation on both bias and weight. + if bias_name in state_dict: + bias_2d = state_dict[bias_name] + if bias_2d.dim() == 1: + # Assuming the 2D biases are 1D tensors (out_channels,) + bias_3d = inflate_bias_fn( + bias_2d=bias_2d, + bias_3d=layer.bias, + inflation_mode=layer.inflation_mode, + ) + state_dict[bias_name] = bias_3d + return state_dict diff --git a/modules/seedvr/src/models/video_vae_v3/modules/types.py b/modules/seedvr/src/models/video_vae_v3/modules/types.py new file mode 100644 index 000000000..5a030d2d2 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/types.py @@ -0,0 +1,76 @@ +# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates +# // +# // Licensed under the Apache License, Version 2.0 (the "License"); +# // you may not use this file except in compliance with the License. +# // You may obtain a copy of the License at +# // +# // http://www.apache.org/licenses/LICENSE-2.0 +# // +# // Unless required by applicable law or agreed to in writing, software +# // distributed under the License is distributed on an "AS IS" BASIS, +# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# // See the License for the specific language governing permissions and +# // limitations under the License. + +from enum import Enum +from typing import Dict, Literal, NamedTuple, Optional +import torch + +_receptive_field_t = Literal["half", "full"] +_inflation_mode_t = Literal["none", "tail", "replicate"] +_memory_device_t = Optional[Literal["cpu", "same"]] +_gradient_checkpointing_t = Optional[Literal["half", "full"]] +_selective_checkpointing_t = Optional[Literal["coarse", "fine"]] + +class DiagonalGaussianDistribution: + def __init__(self, mean: torch.Tensor, logvar: torch.Tensor): + self.mean = mean + self.logvar = torch.clamp(logvar, -30.0, 20.0) + self.std = torch.exp(0.5 * self.logvar) + self.var = torch.exp(self.logvar) + + def mode(self) -> torch.Tensor: + return self.mean + + def sample(self) -> torch.FloatTensor: + return self.mean + self.std * torch.randn_like(self.mean) + + def kl(self) -> torch.Tensor: + return 0.5 * torch.sum( + self.mean**2 + self.var - 1.0 - self.logvar, + dim=list(range(1, self.mean.ndim)), + ) + +class MemoryState(Enum): + """ + State[Disabled]: No memory bank will be enabled. + State[Initializing]: The model is handling the first clip, need to reset the memory bank. + State[Active]: There has been some data in the memory bank. + State[Unset]: Error state, indicating users didn't pass correct memory state in. + """ + + DISABLED = 0 + INITIALIZING = 1 + ACTIVE = 2 + UNSET = 3 + + +class QuantizerOutput(NamedTuple): + latent: torch.Tensor + extra_loss: torch.Tensor + statistics: Dict[str, torch.Tensor] + + +class CausalAutoencoderOutput(NamedTuple): + sample: torch.Tensor + latent: torch.Tensor + posterior: Optional[DiagonalGaussianDistribution] + + +class CausalEncoderOutput(NamedTuple): + latent: torch.Tensor + posterior: Optional[DiagonalGaussianDistribution] + + +class CausalDecoderOutput(NamedTuple): + sample: torch.Tensor diff --git a/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py b/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py new file mode 100644 index 000000000..98147e82f --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py @@ -0,0 +1,956 @@ +# Copyright (c) 2023 HuggingFace Team +# Copyright (c) 2025 ByteDance Ltd. and/or its affiliates. +# SPDX-License-Identifier: Apache License, Version 2.0 (the "License") +# +# This file has been modified by ByteDance Ltd. and/or its affiliates. on 1st June 2025 +# +# Original file was released under Apache License, Version 2.0 (the "License"), with the full license text +# available at http://www.apache.org/licenses/LICENSE-2.0. +# +# This modified file is released under the same license. + +from contextlib import nullcontext +from typing import Optional, Tuple, Literal, Callable, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from diffusers.models.autoencoders.vae import DiagonalGaussianDistribution +from einops import rearrange +from ....common.half_precision_fixes import safe_pad_operation + +from ....common.distributed.advanced import get_sequence_parallel_world_size +from ....common.logger import get_logger +from .causal_inflation_lib import ( + InflatedCausalConv3d, + causal_norm_wrapper, + init_causal_conv3d, + remove_head, +) +from .context_parallel_lib import ( + causal_conv_gather_outputs, + causal_conv_slice_inputs, +) +from .global_config import set_norm_limit +from .types import ( + CausalAutoencoderOutput, + CausalDecoderOutput, + CausalEncoderOutput, + MemoryState, + _inflation_mode_t, + _memory_device_t, + _receptive_field_t, + _selective_checkpointing_t, +) + +logger = get_logger(__name__) # pylint: disable=invalid-name + +# Fake func, no checkpointing is required for inference +def gradient_checkpointing(module: Union[Callable, nn.Module], *args, enabled: bool, **kwargs): + return module(*args, **kwargs) + +class ResnetBlock2D(nn.Module): + r""" + A Resnet block. + + Parameters: + in_channels (`int`): The number of channels in the input. + out_channels (`int`, *optional*, default to be `None`): + The number of output channels for the first conv2d layer. + If None, same as `in_channels`. + dropout (`float`, *optional*, defaults to `0.0`): The dropout probability to use. + """ + + def __init__( + self, *, in_channels: int, out_channels: Optional[int] = None, dropout: float = 0.0 + ): + super().__init__() + self.in_channels = in_channels + out_channels = in_channels if out_channels is None else out_channels + self.out_channels = out_channels + + self.nonlinearity = nn.SiLU() + + self.norm1 = torch.nn.GroupNorm( + num_groups=32, num_channels=in_channels, eps=1e-6, affine=True + ) + + self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1) + + self.norm2 = torch.nn.GroupNorm( + num_groups=32, num_channels=out_channels, eps=1e-6, affine=True + ) + + self.dropout = torch.nn.Dropout(dropout) + self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1) + + self.use_in_shortcut = self.in_channels != out_channels + + self.conv_shortcut = None + if self.use_in_shortcut: + self.conv_shortcut = nn.Conv2d( + in_channels, out_channels, kernel_size=1, stride=1, padding=0 + ) + + def forward(self, input_tensor: torch.Tensor) -> torch.Tensor: + hidden = input_tensor + + hidden = self.norm1(hidden) + hidden = self.nonlinearity(hidden) + hidden = self.conv1(hidden) + + hidden = self.norm2(hidden) + hidden = self.nonlinearity(hidden) + hidden = self.dropout(hidden) + hidden = self.conv2(hidden) + + if self.conv_shortcut is not None: + input_tensor = self.conv_shortcut(input_tensor) + + output_tensor = input_tensor + hidden + + return output_tensor + +class Upsample3D(nn.Module): + """A 3D upsampling layer.""" + + def __init__( + self, + channels: int, + inflation_mode: _inflation_mode_t = "tail", + temporal_up: bool = False, + spatial_up: bool = True, + slicing: bool = False, + ): + super().__init__() + self.channels = channels + self.conv = init_causal_conv3d( + self.channels, self.channels, kernel_size=3, padding=1, inflation_mode=inflation_mode + ) + + self.temporal_up = temporal_up + self.spatial_up = spatial_up + self.temporal_ratio = 2 if temporal_up else 1 + self.spatial_ratio = 2 if spatial_up else 1 + self.slicing = slicing + + upscale_ratio = (self.spatial_ratio**2) * self.temporal_ratio + self.upscale_conv = nn.Conv3d( + self.channels, self.channels * upscale_ratio, kernel_size=1, padding=0 + ) + identity = ( + torch.eye(self.channels).repeat(upscale_ratio, 1).reshape_as(self.upscale_conv.weight) + ) + + self.upscale_conv.weight.data.copy_(identity) + nn.init.zeros_(self.upscale_conv.bias) + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState, + ) -> torch.FloatTensor: + return gradient_checkpointing( + self.custom_forward, + hidden_states, + memory_state, + enabled=self.training and self.gradient_checkpointing, + ) + + def custom_forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState, + ) -> torch.FloatTensor: + assert hidden_states.shape[1] == self.channels + + if self.slicing: + split_size = hidden_states.size(2) // 2 + hidden_states = list( + hidden_states.split([split_size, hidden_states.size(2) - split_size], dim=2) + ) + else: + hidden_states = [hidden_states] + + for i in range(len(hidden_states)): + hidden_states[i] = self.upscale_conv(hidden_states[i]) + hidden_states[i] = rearrange( + hidden_states[i], + "b (x y z c) f h w -> b c (f z) (h x) (w y)", + x=self.spatial_ratio, + y=self.spatial_ratio, + z=self.temporal_ratio, + ) + + # [Overridden] For causal temporal conv + if self.temporal_up and memory_state != MemoryState.ACTIVE: + hidden_states[0] = remove_head(hidden_states[0]) + + if self.slicing: + hidden_states = self.conv(hidden_states, memory_state=memory_state) + return torch.cat(hidden_states, dim=2) + else: + return self.conv(hidden_states[0], memory_state=memory_state) + + +class Downsample3D(nn.Module): + """A 3D downsampling layer.""" + + def __init__( + self, + channels: int, + inflation_mode: _inflation_mode_t = "tail", + temporal_down: bool = False, + spatial_down: bool = True, + ): + super().__init__() + self.channels = channels + self.temporal_down = temporal_down + self.spatial_down = spatial_down + + self.temporal_ratio = 2 if temporal_down else 1 + self.spatial_ratio = 2 if spatial_down else 1 + + self.temporal_kernel = 3 if temporal_down else 1 + self.spatial_kernel = 3 if spatial_down else 1 + + self.conv = init_causal_conv3d( + self.channels, + self.channels, + kernel_size=(self.temporal_kernel, self.spatial_kernel, self.spatial_kernel), + stride=(self.temporal_ratio, self.spatial_ratio, self.spatial_ratio), + padding=((1 if self.temporal_down else 0), 0, 0), + inflation_mode=inflation_mode, + ) + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState, + ) -> torch.FloatTensor: + return gradient_checkpointing( + self.custom_forward, + hidden_states, + memory_state, + enabled=self.training and self.gradient_checkpointing, + ) + + def custom_forward( + self, + hidden_states: torch.FloatTensor, + memory_state: MemoryState, + ) -> torch.FloatTensor: + + assert hidden_states.shape[1] == self.channels + + if self.spatial_down: + hidden_states = safe_pad_operation(hidden_states, (0, 1, 0, 1), mode="constant", value=0) + + hidden_states = self.conv(hidden_states, memory_state=memory_state) + return hidden_states + + +class ResnetBlock3D(ResnetBlock2D): + def __init__( + self, + *args, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + **kwargs, + ): + super().__init__(*args, **kwargs) + self.conv1 = init_causal_conv3d( + self.in_channels, + self.out_channels, + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + self.conv2 = init_causal_conv3d( + self.out_channels, + self.out_channels, + kernel_size=(1, 3, 3) if time_receptive_field == "half" else (3, 3, 3), + stride=1, + padding=(0, 1, 1) if time_receptive_field == "half" else (1, 1, 1), + inflation_mode=inflation_mode, + ) + + if self.use_in_shortcut: + self.conv_shortcut = init_causal_conv3d( + self.in_channels, + self.out_channels, + kernel_size=1, + stride=1, + padding=0, + bias=(self.conv_shortcut.bias is not None), + inflation_mode=inflation_mode, + ) + self.gradient_checkpointing = False + + def forward(self, input_tensor: torch.Tensor, memory_state: MemoryState = MemoryState.UNSET): + return gradient_checkpointing( + self.custom_forward, + input_tensor, + memory_state, + enabled=self.training and self.gradient_checkpointing, + ) + + def custom_forward( + self, input_tensor: torch.Tensor, memory_state: MemoryState = MemoryState.UNSET + ): + assert memory_state != MemoryState.UNSET + hidden_states = input_tensor + + hidden_states = causal_norm_wrapper(self.norm1, hidden_states) + hidden_states = self.nonlinearity(hidden_states) + hidden_states = self.conv1(hidden_states, memory_state=memory_state) + + hidden_states = causal_norm_wrapper(self.norm2, hidden_states) + hidden_states = self.nonlinearity(hidden_states) + hidden_states = self.dropout(hidden_states) + hidden_states = self.conv2(hidden_states, memory_state=memory_state) + + if self.conv_shortcut is not None: + input_tensor = self.conv_shortcut(input_tensor, memory_state=memory_state) + + output_tensor = input_tensor + hidden_states + + return output_tensor + + +class DownEncoderBlock3D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + add_downsample: bool = True, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_down: bool = True, + spatial_down: bool = True, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock3D( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + self.downsamplers = None + if add_downsample: + # Todo: Refactor this line before V5 Image VAE Training. + self.downsamplers = nn.ModuleList( + [ + Downsample3D( + channels=out_channels, + inflation_mode=inflation_mode, + temporal_down=temporal_down, + spatial_down=spatial_down, + ) + ] + ) + + def forward( + self, hidden_states: torch.FloatTensor, memory_state: MemoryState + ) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, memory_state=memory_state) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, memory_state=memory_state) + + return hidden_states + + +class UpDecoderBlock3D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + add_upsample: bool = True, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_up: bool = True, + spatial_up: bool = True, + slicing: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock3D( + in_channels=input_channels, + out_channels=out_channels, + dropout=dropout, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + self.upsamplers = None + # Todo: Refactor this line before V5 Image VAE Training. + if add_upsample: + self.upsamplers = nn.ModuleList( + [ + Upsample3D( + channels=out_channels, + inflation_mode=inflation_mode, + temporal_up=temporal_up, + spatial_up=spatial_up, + slicing=slicing, + ) + ] + ) + + def forward( + self, hidden_states: torch.FloatTensor, memory_state: MemoryState + ) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, memory_state=memory_state) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, memory_state=memory_state) + + return hidden_states + + +class UNetMidBlock3D(nn.Module): + def __init__( + self, + channels: int, + dropout: float = 0.0, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + ): + super().__init__() + self.resnets = nn.ModuleList( + [ + ResnetBlock3D( + in_channels=channels, + out_channels=channels, + dropout=dropout, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ), + ResnetBlock3D( + in_channels=channels, + out_channels=channels, + dropout=dropout, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ), + ] + ) + + def forward(self, hidden_states: torch.Tensor, memory_state: MemoryState): + for resnet in self.resnets: + hidden_states = resnet(hidden_states, memory_state) + return hidden_states + + +class Encoder3D(nn.Module): + r""" + The `Encoder` layer of a variational autoencoder that encodes + its input into a latent representation. + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + block_out_channels: Tuple[int, ...] = (64,), + layers_per_block: int = 2, + double_z: bool = True, + temporal_down_num: int = 2, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), + ): + super().__init__() + self.layers_per_block = layers_per_block + + self.temporal_down_num = temporal_down_num + + self.conv_in = init_causal_conv3d( + in_channels, + block_out_channels[0], + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + self.down_blocks = nn.ModuleList([]) + + # down + output_channel = block_out_channels[0] + for i in range(len(block_out_channels)): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + is_temporal_down_block = i >= len(block_out_channels) - self.temporal_down_num - 1 + # Note: take the last one + + down_block = DownEncoderBlock3D( + num_layers=self.layers_per_block, + in_channels=input_channel, + out_channels=output_channel, + add_downsample=not is_final_block, + temporal_down=is_temporal_down_block, + spatial_down=True, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + self.down_blocks.append(down_block) + + # mid + self.mid_block = UNetMidBlock3D( + channels=block_out_channels[-1], + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[-1], num_groups=32, eps=1e-6 + ) + self.conv_act = nn.SiLU() + + conv_out_channels = 2 * out_channels if double_z else out_channels + self.conv_out = init_causal_conv3d( + block_out_channels[-1], conv_out_channels, 3, padding=1, inflation_mode=inflation_mode + ) + + assert len(selective_checkpointing) == len(self.down_blocks) + self.set_gradient_checkpointing(selective_checkpointing) + + def set_gradient_checkpointing(self, checkpointing_types): + gradient_checkpointing = [] + for down_block, sac_type in zip(self.down_blocks, checkpointing_types): + if sac_type == "coarse": + gradient_checkpointing.append(True) + elif sac_type == "fine": + for n, m in down_block.named_modules(): + if hasattr(m, "gradient_checkpointing"): + m.gradient_checkpointing = True + logger.debug(f"set gradient_checkpointing: {n}") + gradient_checkpointing.append(False) + else: + gradient_checkpointing.append(False) + self.gradient_checkpointing = gradient_checkpointing + logger.info(f"[Encoder3D] gradient_checkpointing: {checkpointing_types}") + + def forward(self, sample: torch.FloatTensor, memory_state: MemoryState) -> torch.FloatTensor: + r"""The forward method of the `Encoder` class.""" + sample = self.conv_in(sample, memory_state=memory_state) + # down + for down_block, sac in zip(self.down_blocks, self.gradient_checkpointing): + sample = gradient_checkpointing( + down_block, + sample, + memory_state=memory_state, + enabled=self.training and sac, + ) + + # middle + sample = self.mid_block(sample, memory_state=memory_state) + + # post-process + sample = causal_norm_wrapper(self.conv_norm_out, sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample, memory_state=memory_state) + + return sample + + +class Decoder3D(nn.Module): + r""" + The `Decoder` layer of a variational autoencoder that + decodes its latent representation into an output sample. + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + block_out_channels: Tuple[int, ...] = (64,), + layers_per_block: int = 2, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + temporal_up_num: int = 2, + slicing_up_num: int = 0, + selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), + ): + super().__init__() + self.layers_per_block = layers_per_block + self.temporal_up_num = temporal_up_num + + self.conv_in = init_causal_conv3d( + in_channels, + block_out_channels[-1], + kernel_size=3, + stride=1, + padding=1, + inflation_mode=inflation_mode, + ) + + self.up_blocks = nn.ModuleList([]) + + # mid + self.mid_block = UNetMidBlock3D( + channels=block_out_channels[-1], + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # up + reversed_block_out_channels = list(reversed(block_out_channels)) + output_channel = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + + is_final_block = i == len(block_out_channels) - 1 + is_temporal_up_block = i < self.temporal_up_num + is_slicing_up_block = i >= len(block_out_channels) - slicing_up_num + # Note: Keep symmetric + + up_block = UpDecoderBlock3D( + num_layers=self.layers_per_block + 1, + in_channels=prev_output_channel, + out_channels=output_channel, + add_upsample=not is_final_block, + temporal_up=is_temporal_up_block, + slicing=is_slicing_up_block, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + self.up_blocks.append(up_block) + + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], num_groups=32, eps=1e-6 + ) + self.conv_act = nn.SiLU() + self.conv_out = init_causal_conv3d( + block_out_channels[0], out_channels, 3, padding=1, inflation_mode=inflation_mode + ) + + assert len(selective_checkpointing) == len(self.up_blocks) + self.set_gradient_checkpointing(selective_checkpointing) + + def set_gradient_checkpointing(self, checkpointing_types): + gradient_checkpointing = [] + for up_block, sac_type in zip(self.up_blocks, checkpointing_types): + if sac_type == "coarse": + gradient_checkpointing.append(True) + elif sac_type == "fine": + for n, m in up_block.named_modules(): + if hasattr(m, "gradient_checkpointing"): + m.gradient_checkpointing = True + logger.debug(f"set gradient_checkpointing: {n}") + gradient_checkpointing.append(False) + else: + gradient_checkpointing.append(False) + self.gradient_checkpointing = gradient_checkpointing + logger.info(f"[Decoder3D] gradient_checkpointing: {checkpointing_types}") + + def forward(self, sample: torch.FloatTensor, memory_state: MemoryState) -> torch.FloatTensor: + r"""The forward method of the `Decoder` class.""" + + sample = self.conv_in(sample, memory_state=memory_state) + + # middle + sample = self.mid_block(sample, memory_state=memory_state) + + # up + for up_block, sac in zip(self.up_blocks, self.gradient_checkpointing): + sample = gradient_checkpointing( + up_block, + sample, + memory_state=memory_state, + enabled=self.training and sac, + ) + + # post-process + sample = causal_norm_wrapper(self.conv_norm_out, sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample, memory_state=memory_state) + + return sample + + +class VideoAutoencoderKL(nn.Module): + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + block_out_channels: Tuple[int] = (64,), + layers_per_block: int = 1, + latent_channels: int = 4, + use_quant_conv: bool = True, + use_post_quant_conv: bool = True, + enc_selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), + dec_selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), + temporal_scale_num: int = 3, + slicing_up_num: int = 0, + inflation_mode: _inflation_mode_t = "tail", + time_receptive_field: _receptive_field_t = "half", + slicing_sample_min_size: int = None, + spatial_downsample_factor: int = 16, + temporal_downsample_factor: int = 8, + freeze_encoder: bool = False, + ): + super().__init__() + self.spatial_downsample_factor = spatial_downsample_factor + self.temporal_downsample_factor = temporal_downsample_factor + self.freeze_encoder = freeze_encoder + if slicing_sample_min_size is None: + slicing_sample_min_size = temporal_downsample_factor + self.slicing_sample_min_size = slicing_sample_min_size + self.slicing_latent_min_size = slicing_sample_min_size // (2**temporal_scale_num) + + # pass init params to Encoder + self.encoder = Encoder3D( + in_channels=in_channels, + out_channels=latent_channels, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + double_z=True, + temporal_down_num=temporal_scale_num, + selective_checkpointing=enc_selective_checkpointing, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + # pass init params to Decoder + self.decoder = Decoder3D( + in_channels=latent_channels, + out_channels=out_channels, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + # [Override] add temporal_up_num parameter + temporal_up_num=temporal_scale_num, + slicing_up_num=slicing_up_num, + selective_checkpointing=dec_selective_checkpointing, + inflation_mode=inflation_mode, + time_receptive_field=time_receptive_field, + ) + + self.quant_conv = ( + init_causal_conv3d( + in_channels=2 * latent_channels, + out_channels=2 * latent_channels, + kernel_size=1, + inflation_mode=inflation_mode, + ) + if use_quant_conv + else None + ) + self.post_quant_conv = ( + init_causal_conv3d( + in_channels=latent_channels, + out_channels=latent_channels, + kernel_size=1, + inflation_mode=inflation_mode, + ) + if use_post_quant_conv + else None + ) + + self.use_slicing = False + + def enable_slicing(self): + self.use_slicing = True + + def disable_slicing(self): + self.use_slicing = False + + def encode(self, x: torch.FloatTensor) -> CausalEncoderOutput: + if x.ndim == 4: + x = x.unsqueeze(2) + h = self.slicing_encode(x) + p = DiagonalGaussianDistribution(h) + z = p.sample() + return CausalEncoderOutput(z, p) + + def decode(self, z: torch.FloatTensor) -> CausalDecoderOutput: + if z.ndim == 4: + z = z.unsqueeze(2) + x = self.slicing_decode(z) + return CausalDecoderOutput(x) + + def _encode(self, x: torch.Tensor, memory_state: MemoryState) -> torch.Tensor: + x = causal_conv_slice_inputs(x, self.slicing_sample_min_size, memory_state=memory_state) + h = self.encoder(x, memory_state=memory_state) + h = self.quant_conv(h, memory_state=memory_state) if self.quant_conv is not None else h + h = causal_conv_gather_outputs(h) + return h + + def _decode(self, z: torch.Tensor, memory_state: MemoryState) -> torch.Tensor: + z = causal_conv_slice_inputs(z, self.slicing_latent_min_size, memory_state=memory_state) + z = ( + self.post_quant_conv(z, memory_state=memory_state) + if self.post_quant_conv is not None + else z + ) + x = self.decoder(z, memory_state=memory_state) + x = causal_conv_gather_outputs(x) + return x + + def slicing_encode(self, x: torch.Tensor) -> torch.Tensor: + sp_size = get_sequence_parallel_world_size() + if self.use_slicing and (x.shape[2] - 1) > self.slicing_sample_min_size * sp_size: + x_slices = x[:, :, 1:].split(split_size=self.slicing_sample_min_size * sp_size, dim=2) + encoded_slices = [ + self._encode( + torch.cat((x[:, :, :1], x_slices[0]), dim=2), + memory_state=MemoryState.INITIALIZING, + ) + ] + for x_idx in range(1, len(x_slices)): + encoded_slices.append( + self._encode(x_slices[x_idx], memory_state=MemoryState.ACTIVE) + ) + return torch.cat(encoded_slices, dim=2) + else: + return self._encode(x, memory_state=MemoryState.DISABLED) + + def slicing_decode(self, z: torch.Tensor) -> torch.Tensor: + sp_size = get_sequence_parallel_world_size() + if self.use_slicing and (z.shape[2] - 1) > self.slicing_latent_min_size * sp_size: + z_slices = z[:, :, 1:].split(split_size=self.slicing_latent_min_size * sp_size, dim=2) + decoded_slices = [ + self._decode( + torch.cat((z[:, :, :1], z_slices[0]), dim=2), + memory_state=MemoryState.INITIALIZING, + ) + ] + for z_idx in range(1, len(z_slices)): + decoded_slices.append( + self._decode(z_slices[z_idx], memory_state=MemoryState.ACTIVE) + ) + return torch.cat(decoded_slices, dim=2) + else: + return self._decode(z, memory_state=MemoryState.DISABLED) + + def forward(self, x: torch.FloatTensor) -> CausalAutoencoderOutput: + with torch.no_grad() if self.freeze_encoder else nullcontext(): + z, p = self.encode(x) + x = self.decode(z).sample + return CausalAutoencoderOutput(x, z, p) + + def preprocess(self, x: torch.Tensor): + # x should in [B, C, T, H, W], [B, C, H, W] + assert x.ndim == 4 or x.size(2) % self.temporal_downsample_factor == 1 + return x + + def postprocess(self, x: torch.Tensor): + # x should in [B, C, T, H, W], [B, C, H, W] + return x + + def set_causal_slicing( + self, + *, + split_size: Optional[int], + memory_device: _memory_device_t, + ): + assert ( + split_size is None or memory_device is not None + ), "if split_size is set, memory_device must not be None." + if split_size is not None: + self.enable_slicing() + self.slicing_sample_min_size = split_size + self.slicing_latent_min_size = split_size // self.temporal_downsample_factor + else: + self.disable_slicing() + for module in self.modules(): + if isinstance(module, InflatedCausalConv3d): + module.set_memory_device(memory_device) + + def set_memory_limit(self, conv_max_mem: Optional[float], norm_max_mem: Optional[float]): + set_norm_limit(norm_max_mem) + for m in self.modules(): + if isinstance(m, InflatedCausalConv3d): + m.set_memory_limit(conv_max_mem if conv_max_mem is not None else float("inf")) + + +class VideoAutoencoderKLWrapper(VideoAutoencoderKL): + def __init__( + self, *args, spatial_downsample_factor: int, temporal_downsample_factor: int, **kwargs + ): + self.spatial_downsample_factor = spatial_downsample_factor + self.temporal_downsample_factor = temporal_downsample_factor + super().__init__(*args, **kwargs) + + def forward(self, x) -> CausalAutoencoderOutput: + z, _, p = self.encode(x) + x, _ = self.decode(z) + return CausalAutoencoderOutput(x, z, None, p) + + def encode(self, x) -> CausalEncoderOutput: + if x.ndim == 4: + x = x.unsqueeze(2) + p = super().encode(x).latent_dist + z = p.sample().squeeze(2) + return CausalEncoderOutput(z, None, p) + + def decode(self, z) -> CausalDecoderOutput: + if z.ndim == 4: + z = z.unsqueeze(2) + x = super().decode(z).sample.squeeze(2) + return CausalDecoderOutput(x, None) + + def preprocess(self, x): + # x should in [B, C, T, H, W], [B, C, H, W] + assert x.ndim == 4 or x.size(2) % 4 == 1 + return x + + def postprocess(self, x): + # x should in [B, C, T, H, W], [B, C, H, W] + return x + + def set_causal_slicing( + self, + *, + split_size: Optional[int], + memory_device: Optional[Literal["cpu", "same"]], + ): + assert ( + split_size is None or memory_device is not None + ), "if split_size is set, memory_device must not be None." + if split_size is not None: + self.enable_slicing() + else: + self.disable_slicing() + self.slicing_sample_min_size = split_size + if split_size is not None: + self.slicing_latent_min_size = split_size // self.temporal_downsample_factor + for module in self.modules(): + if isinstance(module, InflatedCausalConv3d): + module.set_memory_device(memory_device) diff --git a/modules/seedvr/src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml b/modules/seedvr/src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml new file mode 100644 index 000000000..949122667 --- /dev/null +++ b/modules/seedvr/src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml @@ -0,0 +1,28 @@ +act_fn: silu +block_out_channels: + - 128 + - 256 + - 512 + - 512 +down_block_types: + - DownEncoderBlock3D + - DownEncoderBlock3D + - DownEncoderBlock3D + - DownEncoderBlock3D +in_channels: 3 +latent_channels: 16 +layers_per_block: 2 +norm_num_groups: 32 +out_channels: 3 +slicing_sample_min_size: 4 +temporal_scale_num: 2 +inflation_mode: pad +up_block_types: + - UpDecoderBlock3D + - UpDecoderBlock3D + - UpDecoderBlock3D + - UpDecoderBlock3D +spatial_downsample_factor: 8 +temporal_downsample_factor: 4 +use_quant_conv: False +use_post_quant_conv: False diff --git a/modules/seedvr/src/optimization/__init__.py b/modules/seedvr/src/optimization/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/seedvr/src/optimization/memory_manager.py b/modules/seedvr/src/optimization/memory_manager.py new file mode 100644 index 000000000..47bc52101 --- /dev/null +++ b/modules/seedvr/src/optimization/memory_manager.py @@ -0,0 +1,131 @@ +""" +Memory management module for SeedVR2 +Handles VRAM usage, cache management, and memory optimization + +Extracted from: seedvr2.py (lines 373-405, 607-626, 1016-1044) +""" + +import os +import torch +import gc +from typing import Tuple, Optional +from src.common.cache import Cache +from src.models.dit_v2.rope import RotaryEmbeddingBase + + +def preinitialize_rope_cache(runner) -> None: + """ + 🚀 Pre-initialize RoPE cache to avoid OOM at first launch + + Args: + runner: The model runner containing DiT and VAE models + """ + + try: + # Create dummy tensors to simulate common shapes + # Format: [batch, channels, frames, height, width] for vid_shape + # Format: [batch, seq_len] for txt_shape + common_shapes = [ + # Common video resolutions + (torch.tensor([[1, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 1 frame, 77 tokens + (torch.tensor([[4, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 4 frames + (torch.tensor([[5, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 5 frames (4n+1 format) + (torch.tensor([[1, 4, 4]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # Higher resolution + ] + + # Create mock cache for pre-initialization + + temp_cache = Cache() + + # Access RoPE modules in DiT (recursive search) + def find_rope_modules(module): + rope_modules = [] + for name, child in module.named_modules(): + if hasattr(child, 'get_freqs') and callable(child.get_freqs): + rope_modules.append((name, child)) + return rope_modules + + rope_modules = find_rope_modules(runner.dit) + + # Pre-calculate for each RoPE module found + for name, rope_module in rope_modules: + # Temporarily move module to CPU if necessary + original_device = next(rope_module.parameters()).device if list(rope_module.parameters()) else torch.device('cpu') + rope_module.to('cpu') + + try: + for vid_shape, txt_shape in common_shapes: + cache_key = f"720pswin_by_size_bysize_{tuple(vid_shape[0].tolist())}_sd3.mmrope_freqs_3d" + + def compute_freqs(): + # Calculate with reduced dimensions to avoid OOM + with torch.no_grad(): + # Detect RoPE module type + module_type = type(rope_module).__name__ + + if module_type == 'NaRotaryEmbedding3d': + # NaRotaryEmbedding3d: only takes shape (vid_shape) + return rope_module.get_freqs(vid_shape.cpu()) + else: + # Standard RoPE: takes vid_shape and txt_shape + return rope_module.get_freqs(vid_shape.cpu(), txt_shape.cpu()) + + # Store in cache + temp_cache(cache_key, compute_freqs) + + except Exception as e: + print(f" ❌ Error in module {name}: {e}") + finally: + # Restore to original device + rope_module.to(original_device) + + # Copy temporary cache to runner cache + if hasattr(runner, 'cache'): + runner.cache.cache.update(temp_cache.cache) + else: + runner.cache = temp_cache + + except Exception as e: + print(f" ⚠️ Error during RoPE pre-init: {e}") + print(" 🔄 Model will work but could have OOM at first launch") + + +def clear_rope_cache(runner) -> None: + """ + 🧹 Clear RoPE cache to free VRAM + + Args: + runner: The model runner containing the cache + """ + print("🧹 Cleaning RoPE cache...") + + if hasattr(runner, 'cache') and hasattr(runner.cache, 'cache'): + # Count entries before cleanup + cache_size = len(runner.cache.cache) + + # Free all tensors from cache + for key, value in runner.cache.cache.items(): + if isinstance(value, (tuple, list)): + for item in value: + if hasattr(item, 'cpu'): + item.cpu() + del item + elif hasattr(value, 'cpu'): + value.cpu() + del value + + # Clear the cache + runner.cache.cache.clear() + print(f" ✅ RoPE cache cleared ({cache_size} entries removed)") + + if hasattr(runner, 'dit'): + cleared_lru_count = 0 + for module in runner.dit.modules(): + if isinstance(module, RotaryEmbeddingBase): + if hasattr(module.get_axial_freqs, 'cache_clear'): + module.get_axial_freqs.cache_clear() + cleared_lru_count += 1 + if cleared_lru_count > 0: + print(f" ✅ Cleared {cleared_lru_count} LRU caches from RoPE modules.") + + print("🎯 RoPE cache cleanup completed!") diff --git a/modules/seedvr/src/optimization/performance.py b/modules/seedvr/src/optimization/performance.py new file mode 100644 index 000000000..73a95fe4d --- /dev/null +++ b/modules/seedvr/src/optimization/performance.py @@ -0,0 +1,160 @@ +""" +Performance optimization module for SeedVR2 +Contains optimized tensor operations and video processing functions + +Extracted from: seedvr2.py (lines 1633-1730) +""" + +import torch +from typing import List, Union + + +def optimized_video_rearrange(video_tensors: List[torch.Tensor]) -> List[torch.Tensor]: + """ + 🚀 OPTIMIZED version of video rearrangement + Replaces slow loops with vectorized operations + + Transforms: + - 3D: c h w -> t c h w (with t=1) + - 4D: c t h w -> t c h w + + Expected gains: 5-10x faster than naive loops + + Args: + video_tensors: List of video tensors to rearrange + + Returns: + List of rearranged tensors in t c h w format + """ + if not video_tensors: + return [] + + # 🔍 Analyze dimensions to optimize processing + videos_3d = [] + videos_4d = [] + indices_3d = [] + indices_4d = [] + + for i, video in enumerate(video_tensors): + if video.ndim == 3: + videos_3d.append(video) + indices_3d.append(i) + else: # ndim == 4 + videos_4d.append(video) + indices_4d.append(i) + + # 🎯 Prepare final result + samples = [None] * len(video_tensors) + + # 🚀 BATCH PROCESSING for 3D videos (c h w -> 1 c h w) + if videos_3d: + # Method 1: Stack + permute (faster than rearrange) + # c h w -> c 1 h w -> 1 c h w + batch_3d = torch.stack([v.unsqueeze(1) for v in videos_3d]) # [batch, c, 1, h, w] + batch_3d = batch_3d.permute(0, 2, 1, 3, 4) # [batch, 1, c, h, w] + + for i, idx in enumerate(indices_3d): + samples[idx] = batch_3d[i] # [1, c, h, w] + + # 🚀 BATCH PROCESSING for 4D videos (c t h w -> t c h w) + if videos_4d: + # Check if all 4D videos have the same shape for maximum optimization + shapes = [v.shape for v in videos_4d] + if len(set(shapes)) == 1: + # 🎯 MAXIMUM OPTIMIZATION: All shapes identical + # Stack + permute in single operation + batch_4d = torch.stack(videos_4d) # [batch, c, t, h, w] + batch_4d = batch_4d.permute(0, 2, 1, 3, 4) # [batch, t, c, h, w] + + for i, idx in enumerate(indices_4d): + samples[idx] = batch_4d[i] # [t, c, h, w] + else: + # 🔄 FALLBACK: Different shapes, optimized individual processing + for i, idx in enumerate(indices_4d): + # Use permute instead of rearrange (faster) + samples[idx] = videos_4d[i].permute(1, 0, 2, 3) # c t h w -> t c h w + + return samples + + +def optimized_single_video_rearrange(video: torch.Tensor) -> torch.Tensor: + """ + 🚀 OPTIMIZED version for single video tensor + Replaces rearrange() with native PyTorch operations + + Transforms: + - 3D: c h w -> 1 c h w (add temporal dimension) + - 4D: c t h w -> t c h w (permute dimensions) + + Expected gains: 2-5x faster than rearrange() + + Args: + video: Input video tensor + + Returns: + Rearranged tensor with temporal dimension first + """ + if video.ndim == 3: + # c h w -> 1 c h w (add temporal dimension t=1) + return video.unsqueeze(0) + else: # ndim == 4 + # c t h w -> t c h w (permute channels and temporal) + return video.permute(1, 0, 2, 3) + + +def optimized_sample_to_image_format(sample: torch.Tensor) -> torch.Tensor: + """ + 🚀 OPTIMIZED version to convert sample to image format + Replaces rearrange() with native PyTorch operations + + Transforms: + - 3D: c h w -> 1 h w c (add temporal dimension + permute to image format) + - 4D: t c h w -> t h w c (permute to image format) + + Expected gains: 2-5x faster than rearrange() + + Args: + sample: Input sample tensor + + Returns: + Tensor in image format (channels last) + """ + if sample.ndim == 3: + # c h w -> 1 h w c (add temporal dimension then permute) + return sample.unsqueeze(0).permute(0, 2, 3, 1) + else: # ndim == 4 + # t c h w -> t h w c (permute channels to last) + return sample.permute(0, 2, 3, 1) + + +def temporal_latent_blending(latents1: torch.Tensor, latents2: torch.Tensor, blend_frames: int) -> torch.Tensor: + """ + 🎨 Temporal blending in latent space to avoid discontinuities + + Args: + latents1: Latents from previous batch (end frames) + latents2: Latents from current batch (start frames) + blend_frames: Number of frames to blend + + Returns: + Blended latents for smooth transition + """ + if latents1.shape[0] != latents2.shape[0]: + # Adjust dimensions if necessary + min_frames = min(latents1.shape[0], latents2.shape[0]) + latents1 = latents1[:min_frames] + latents2 = latents2[:min_frames] + + # Create linear blending weights + # Frame 0: 100% latents1, 0% latents2 + # Frame n: 0% latents1, 100% latents2 + weights1 = torch.linspace(1.0, 0.0, blend_frames).view(-1, 1, 1, 1).to(latents1.device) + weights2 = torch.linspace(0.0, 1.0, blend_frames).view(-1, 1, 1, 1).to(latents2.device) + + # Apply blending + blended_latents = weights1 * latents1 + weights2 * latents2 + + return blended_latents + + + diff --git a/modules/seedvr/src/utils/__init__.py b/modules/seedvr/src/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/seedvr/src/utils/color_fix.py b/modules/seedvr/src/utils/color_fix.py new file mode 100644 index 000000000..8a042892b --- /dev/null +++ b/modules/seedvr/src/utils/color_fix.py @@ -0,0 +1,138 @@ +import torch +from PIL import Image +from torch import Tensor +from torch.nn import functional as F +from src.common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation +from torchvision.transforms import ToTensor, ToPILImage + +def adain_color_fix(target: Image, source: Image): + # Convert images to tensors + to_tensor = ToTensor() + target_tensor = to_tensor(target).unsqueeze(0) + source_tensor = to_tensor(source).unsqueeze(0) + + # Apply adaptive instance normalization + result_tensor = adaptive_instance_normalization(target_tensor, source_tensor) + + # Convert tensor back to image + to_image = ToPILImage() + result_image = to_image(result_tensor.squeeze(0).clamp_(0.0, 1.0)) + + return result_image + +def wavelet_color_fix(target: Image, source: Image): + # Convert images to tensors + to_tensor = ToTensor() + target_tensor = to_tensor(target).unsqueeze(0) + source_tensor = to_tensor(source).unsqueeze(0) + + # Apply wavelet reconstruction + result_tensor = wavelet_reconstruction(target_tensor, source_tensor) + + # Convert tensor back to image + to_image = ToPILImage() + result_image = to_image(result_tensor.squeeze(0).clamp_(0.0, 1.0)) + + return result_image + +def calc_mean_std(feat: Tensor, eps=1e-5): + """Calculate mean and std for adaptive_instance_normalization. + Args: + feat (Tensor): 4D tensor. + eps (float): A small value added to the variance to avoid + divide-by-zero. Default: 1e-5. + """ + size = feat.size() + assert len(size) == 4, 'The input feature should be 4D tensor.' + b, c = size[:2] + feat_var = feat.view(b, c, -1).var(dim=2) + eps + feat_std = feat_var.sqrt().view(b, c, 1, 1) + feat_mean = feat.view(b, c, -1).mean(dim=2).view(b, c, 1, 1) + return feat_mean, feat_std + +def adaptive_instance_normalization(content_feat:Tensor, style_feat:Tensor): + """Adaptive instance normalization. + Adjust the reference features to have the similar color and illuminations + as those in the degradate features. + Args: + content_feat (Tensor): The reference feature. + style_feat (Tensor): The degradate features. + """ + size = content_feat.size() + style_mean, style_std = calc_mean_std(style_feat) + content_mean, content_std = calc_mean_std(content_feat) + normalized_feat = (content_feat - content_mean.expand(size)) / content_std.expand(size) + return normalized_feat * style_std.expand(size) + style_mean.expand(size) + +def wavelet_blur(image: Tensor, radius: int): + """ + Apply wavelet blur to the input tensor. + """ + # input shape: (1, 3, H, W) + # convolution kernel + kernel_vals = [ + [0.0625, 0.125, 0.0625], + [0.125, 0.25, 0.125], + [0.0625, 0.125, 0.0625], + ] + kernel = torch.tensor(kernel_vals, dtype=image.dtype, device=image.device) + # add channel dimensions to the kernel to make it a 4D tensor + kernel = kernel[None, None] + # repeat the kernel across all input channels + kernel = kernel.repeat(3, 1, 1, 1) + image = safe_pad_operation(image, (radius, radius, radius, radius), mode='replicate') + # apply convolution + output = F.conv2d(image, kernel, groups=3, dilation=radius) + return output + +def wavelet_decomposition(image: Tensor, levels=5): + """ + Apply wavelet decomposition to the input tensor. + This function only returns the low frequency & the high frequency. + """ + high_freq = torch.zeros_like(image) + for i in range(levels): + radius = 2 ** i + low_freq = wavelet_blur(image, radius) + high_freq += (image - low_freq) + image = low_freq + + return high_freq, low_freq + + + +def wavelet_reconstruction(content_feat:Tensor, style_feat:Tensor): + """ + Apply wavelet decomposition, so that the content will have the same color as the style. + """ + # Vérifier et ajuster les dimensions si nécessaire + if content_feat.shape != style_feat.shape: + # Redimensionner style_feat pour correspondre à content_feat + target_shape = content_feat.shape + if len(target_shape) >= 3: # Au moins 3 dimensions + # Utiliser interpolation pour ajuster les dimensions spatiales + style_feat = safe_interpolate_operation( + style_feat, + size=target_shape[-2:], # Dernières 2 dimensions (H, W) + mode='bilinear', + align_corners=False + ) + + # calculate the wavelet decomposition of the content feature + content_high_freq, content_low_freq = wavelet_decomposition(content_feat) + del content_low_freq + # calculate the wavelet decomposition of the style feature + style_high_freq, style_low_freq = wavelet_decomposition(style_feat) + del style_high_freq + + # Vérification finale avant addition + if content_high_freq.shape != style_low_freq.shape: + style_low_freq = safe_interpolate_operation( + style_low_freq, + size=content_high_freq.shape[-2:], + mode='bilinear', + align_corners=False + ) + + # reconstruct the content feature with the style's high frequency + return content_high_freq + style_low_freq diff --git a/modules/seedvr/test.py b/modules/seedvr/test.py new file mode 100644 index 000000000..6ecf022ab --- /dev/null +++ b/modules/seedvr/test.py @@ -0,0 +1,58 @@ +import os +import argparse +import numpy as np +import torch +from PIL import Image +from huggingface_hub import snapshot_download +from torchvision.transforms import ToPILImage +from src.core.generation import generation_loop +from src.core.model_manager import configure_runner + + + +device = 'cuda' +dtype = torch.bfloat16 +model_dir = 'seedvr2_models' +model = 'seedvr2_ema_3b_fp16.safetensors' +resolution = 1024 +seed = 100 +cfg = 1.0 +input_image = '/home/vlado/generative/Samples/cutie-512.png' + +to_pil = ToPILImage() +runner = None +loaded_model = None + + +def upscale_image(model_name:str, image_path:str): + global runner, loaded_model + if (runner is None) or (loaded_model != model_name): + runner = configure_runner(model_name, model_dir, device=device, dtype=dtype) + loaded_model = model_name + + image = Image.open(image_path).convert("RGB") + image_tensor = np.array(image) + image_tensor = torch.from_numpy(image_tensor).to(device=device, dtype=dtype).unsqueeze(0) / 255.0 + + result_tensor = generation_loop( + runner=runner, + images=image_tensor, + cfg_scale=cfg, + seed=seed, + res_w=resolution, + batch_size=1, + temporal_overlap=0, + device=device, + ) + image = to_pil(result_tensor.squeeze().permute((2, 0, 1))) + + output_path = os.path.join('/tmp', os.path.basename(image_path)) + + image.save(output_path, quality=95) + return image + + +if __name__ == "__main__": + output_image = upscale_image(model, input_image) + print('input:', input_image) + print('output:', output_image) diff --git a/modules/upscaler.py b/modules/upscaler.py index 3494742e8..ec907ad8a 100644 --- a/modules/upscaler.py +++ b/modules/upscaler.py @@ -79,7 +79,7 @@ class Upscaler: scalers.append(scaler) loaded.append(model_path) # shared.log.debug(f'Upscaler type={self.name} folder="{self.user_path}" model="{model[0]}" path="{model_path}"') - if not os.path.exists(self.user_path): + if self.user_path is None or not os.path.exists(self.user_path): return scalers self.find_folder(self.user_path, scalers, loaded) return scalers @@ -148,7 +148,7 @@ class UpscalerData: scaler: Upscaler = None model: None - def __init__(self, name: str, path: str, upscaler: Upscaler = None, scale: int = 4, model=None): + def __init__(self, name: str, path: str = None, upscaler: Upscaler = None, scale: int = 4, model=None): self.name = name self.data_path = path self.local_data_path = path From 8d36a5aebb5fdf8db71982b4d584cebd4dfbb744 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 11 Oct 2025 18:51:07 -0400 Subject: [PATCH 206/230] lint Signed-off-by: Vladimir Mandic --- modules/sd_detect.py | 2 +- modules/seedvr/src/__init__.py | 4 +-- modules/seedvr/src/common/config.py | 8 ++--- modules/seedvr/src/common/seed.py | 1 - modules/seedvr/src/core/__init__.py | 8 ++--- modules/seedvr/src/core/generation.py | 24 +++++++------- modules/seedvr/src/models/dit_v2/attention.py | 1 - .../seedvr/src/optimization/memory_manager.py | 4 +-- .../seedvr/src/optimization/performance.py | 33 +++++++++---------- 9 files changed, 40 insertions(+), 45 deletions(-) diff --git a/modules/sd_detect.py b/modules/sd_detect.py index 9996537c1..0b2d3d19c 100644 --- a/modules/sd_detect.py +++ b/modules/sd_detect.py @@ -146,7 +146,7 @@ def guess_by_diffusers(fn, current_guess): if folder.endswith('quantization_config.json'): is_quant = True break - elif os.path.isdir(folder): + if os.path.isdir(folder): for f in os.listdir(folder): if f.endswith('quantization_config.json'): is_quant = True diff --git a/modules/seedvr/src/__init__.py b/modules/seedvr/src/__init__.py index ebff00ffb..a374bbd24 100644 --- a/modules/seedvr/src/__init__.py +++ b/modules/seedvr/src/__init__.py @@ -7,7 +7,7 @@ Version: 2.0.0 - Modular Available Modules: - utils: Download and path utilities -- optimization: Memory, performance, and compatibility optimizations +- optimization: Memory, performance, and compatibility optimizations - core: Model management and generation pipeline (NEW) - processing: Video and tensor processing (coming next) - interfaces: ComfyUI integration @@ -17,7 +17,7 @@ Available Modules: MODULES_AVAILABLE = { 'downloads': True, # ✅ Module 1 - Downloads and model management 'memory_manager': True, # ✅ Module 2 - Memory optimization - 'performance': True, # ✅ Module 3 - Performance optimizations + 'performance': True, # ✅ Module 3 - Performance optimizations 'compatibility': True, # ✅ Module 4 - FP8/FP16 compatibility 'model_manager': True, # ✅ Module 5 - Model configuration and loading 'generation': True, # ✅ Module 6 - Generation loop and inference diff --git a/modules/seedvr/src/common/config.py b/modules/seedvr/src/common/config.py index 3667b4d2b..653685ccd 100644 --- a/modules/seedvr/src/common/config.py +++ b/modules/seedvr/src/common/config.py @@ -71,15 +71,15 @@ def resolve_inheritance(config: Union[DictConfig, ListConfig]) -> Any: def import_item(path: Union[str, List[str]], name: str) -> Any: """ Import a python item with fallback support. - + Args: path: Single path string or list of paths to try (fallback order) name: Class/function name to import - + Returns: Imported object - - Example: + + Example: import_item("path.to.file", "MyClass") -> MyClass import_item(["path1.to.file", "path2.to.file"], "MyClass") -> MyClass (first working path) """ diff --git a/modules/seedvr/src/common/seed.py b/modules/seedvr/src/common/seed.py index f00e33db6..f3e77f2bf 100644 --- a/modules/seedvr/src/common/seed.py +++ b/modules/seedvr/src/common/seed.py @@ -27,4 +27,3 @@ def set_seed(seed: Optional[int], same_across_ranks: bool = False): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) - diff --git a/modules/seedvr/src/core/__init__.py b/modules/seedvr/src/core/__init__.py index 271ba39b8..e284d32ed 100644 --- a/modules/seedvr/src/core/__init__.py +++ b/modules/seedvr/src/core/__init__.py @@ -29,13 +29,13 @@ from .infer import VideoDiffusionInfer __all__ = [ # Model management 'configure_runner', - 'load_quantized_state_dict', + 'load_quantized_state_dict', 'configure_dit_model_inference', 'configure_vae_model_inference', - + # Generation logic 'generation_step', - 'generation_loop', + 'generation_loop', 'cut_videos', 'prepare_video_transforms', 'load_text_embeddings', @@ -43,5 +43,5 @@ __all__ = [ # Infer 'VideoDiffusionInfer' -] +] ''' diff --git a/modules/seedvr/src/core/generation.py b/modules/seedvr/src/core/generation.py index daac4020f..5f871cfe7 100644 --- a/modules/seedvr/src/core/generation.py +++ b/modules/seedvr/src/core/generation.py @@ -12,16 +12,16 @@ from src.utils.color_fix import wavelet_reconstruction def generation_step(runner, text_embeds_dict, cond_latents, temporal_overlap, device): """ Execute a single generation step with adaptive dtype handling - + Args: runner: VideoDiffusionInfer instance text_embeds_dict (dict): Text embeddings for positive and negative prompts cond_latents (list): Conditional latents for generation temporal_overlap (int): Number of frames for temporal overlap - + Returns: tuple: (samples, last_latents) for potential temporal continuation - + Features: - Adaptive dtype detection (FP8/FP16/BFloat16) - Optimal autocast configuration for each model type @@ -111,7 +111,7 @@ def cut_videos(videos): def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_size=90, temporal_overlap=0, progress_callback=None, device:str='cpu'): """ Main generation loop with context-aware temporal processing - + Args: runner: VideoDiffusionInfer instance images (torch.Tensor): Input images for upscaling @@ -121,10 +121,10 @@ def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_si batch_size (int): Batch size for processing temporal_overlap (int): Frames for temporal continuity progress_callback (callable): Optional callback for progress reporting - + Returns: torch.Tensor: Generated video frames - + Features: - Context-aware generation with temporal overlap - Adaptive dtype pipeline (FP8/FP16/BFloat16) @@ -300,13 +300,13 @@ def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_si def prepare_video_transforms(res_w): """ Prepare optimized video transformation pipeline - + Args: res_w (int): Target resolution width - + Returns: Compose: Configured transformation pipeline - + Features: - Resolution-aware upscaling (no downsampling) - Proper normalization for model compatibility @@ -328,15 +328,15 @@ def prepare_video_transforms(res_w): def calculate_optimal_batch_params(total_frames, batch_size, temporal_overlap): """ Calculate optimal batch processing parameters - + Args: total_frames (int): Total number of frames batch_size (int): Desired batch size temporal_overlap (int): Temporal overlap frames - + Returns: dict: Optimized parameters and recommendations - + Features: - 4n+1 constraint optimization - Padding waste calculation diff --git a/modules/seedvr/src/models/dit_v2/attention.py b/modules/seedvr/src/models/dit_v2/attention.py index 5a93ba30a..a88fd7d13 100644 --- a/modules/seedvr/src/models/dit_v2/attention.py +++ b/modules/seedvr/src/models/dit_v2/attention.py @@ -90,4 +90,3 @@ class FlashAttentionVarlen(nn.Module): return flash_attn_varlen_func(*args, **kwargs) except ImportError: return pytorch_varlen_attention(*args, **kwargs) - diff --git a/modules/seedvr/src/optimization/memory_manager.py b/modules/seedvr/src/optimization/memory_manager.py index 47bc52101..3be323f67 100644 --- a/modules/seedvr/src/optimization/memory_manager.py +++ b/modules/seedvr/src/optimization/memory_manager.py @@ -16,7 +16,7 @@ from src.models.dit_v2.rope import RotaryEmbeddingBase def preinitialize_rope_cache(runner) -> None: """ 🚀 Pre-initialize RoPE cache to avoid OOM at first launch - + Args: runner: The model runner containing DiT and VAE models """ @@ -93,7 +93,7 @@ def preinitialize_rope_cache(runner) -> None: def clear_rope_cache(runner) -> None: """ 🧹 Clear RoPE cache to free VRAM - + Args: runner: The model runner containing the cache """ diff --git a/modules/seedvr/src/optimization/performance.py b/modules/seedvr/src/optimization/performance.py index 73a95fe4d..83cba0462 100644 --- a/modules/seedvr/src/optimization/performance.py +++ b/modules/seedvr/src/optimization/performance.py @@ -13,16 +13,16 @@ def optimized_video_rearrange(video_tensors: List[torch.Tensor]) -> List[torch.T """ 🚀 OPTIMIZED version of video rearrangement Replaces slow loops with vectorized operations - + Transforms: - - 3D: c h w -> t c h w (with t=1) + - 3D: c h w -> t c h w (with t=1) - 4D: c t h w -> t c h w - + Expected gains: 5-10x faster than naive loops - + Args: video_tensors: List of video tensors to rearrange - + Returns: List of rearranged tensors in t c h w format """ @@ -81,16 +81,16 @@ def optimized_single_video_rearrange(video: torch.Tensor) -> torch.Tensor: """ 🚀 OPTIMIZED version for single video tensor Replaces rearrange() with native PyTorch operations - + Transforms: - 3D: c h w -> 1 c h w (add temporal dimension) - 4D: c t h w -> t c h w (permute dimensions) - + Expected gains: 2-5x faster than rearrange() - + Args: video: Input video tensor - + Returns: Rearranged tensor with temporal dimension first """ @@ -106,16 +106,16 @@ def optimized_sample_to_image_format(sample: torch.Tensor) -> torch.Tensor: """ 🚀 OPTIMIZED version to convert sample to image format Replaces rearrange() with native PyTorch operations - + Transforms: - 3D: c h w -> 1 h w c (add temporal dimension + permute to image format) - 4D: t c h w -> t h w c (permute to image format) - + Expected gains: 2-5x faster than rearrange() - + Args: sample: Input sample tensor - + Returns: Tensor in image format (channels last) """ @@ -130,12 +130,12 @@ def optimized_sample_to_image_format(sample: torch.Tensor) -> torch.Tensor: def temporal_latent_blending(latents1: torch.Tensor, latents2: torch.Tensor, blend_frames: int) -> torch.Tensor: """ 🎨 Temporal blending in latent space to avoid discontinuities - + Args: latents1: Latents from previous batch (end frames) latents2: Latents from current batch (start frames) blend_frames: Number of frames to blend - + Returns: Blended latents for smooth transition """ @@ -155,6 +155,3 @@ def temporal_latent_blending(latents1: torch.Tensor, latents2: torch.Tensor, ble blended_latents = weights1 * latents1 + weights2 * latents2 return blended_latents - - - From 2e4e741d47c61730d34e79ae8dae4f7995f7b4a7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 12 Oct 2025 15:35:08 -0400 Subject: [PATCH 207/230] seedvt2 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 9 +- modules/model_quant.py | 4 +- modules/postprocess/seedvr_model.py | 131 +++++++++++++++--- modules/sd_models_utils.py | 2 + modules/sd_offload.py | 10 +- modules/sdnq/quantizer.py | 5 +- modules/seedvr/config_3b.yaml | 12 +- modules/seedvr/config_7b.yaml | 8 +- modules/seedvr/src/__init__.py | 28 +--- modules/seedvr/src/common/config.py | 2 +- modules/seedvr/src/common/decorators.py | 2 +- modules/seedvr/src/common/distributed/ops.py | 19 ++- modules/seedvr/src/common/logger.py | 2 +- modules/seedvr/src/common/seed.py | 1 - modules/seedvr/src/core/generation.py | 41 +----- modules/seedvr/src/core/infer.py | 68 +++------ modules/seedvr/src/core/model_manager.py | 32 ++--- .../models/dit/blocks/mmdit_window_block.py | 8 +- modules/seedvr/src/models/dit_v2/rope.py | 3 +- .../video_vae_v3/modules/attn_video_vae.py | 102 +++++++++----- .../modules/causal_inflation_lib.py | 20 --- .../modules/context_parallel_lib.py | 3 - .../video_vae_v3/modules/inflated_layers.py | 8 +- .../video_vae_v3/modules/inflated_lib.py | 2 +- .../{video_vae.py => video_vae.py.old} | 34 +---- .../seedvr/src/optimization/memory_manager.py | 116 +++++++--------- modules/seedvr/src/utils/color_fix.py | 2 +- modules/seedvr/test.py | 6 +- modules/shared.py | 4 +- modules/ui_settings.py | 2 +- 30 files changed, 335 insertions(+), 351 deletions(-) rename modules/seedvr/src/models/video_vae_v3/modules/{video_vae.py => video_vae.py.old} (97%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f06fff89..860ba0038 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-11 +## Update for 2025-10-12 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -17,6 +17,13 @@ *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) updated version of E1 image editing model + - [SeedVR2](https://iceclear.github.io/projects/seedvr/) + originally designed for video restoration, seedvr works great for image detailing and upscaling! + available in 3B, 7B and 7B-sharp variants + use as any other upscaler! + note: seedvr is a very large model (6.4GB and 16GB respectively) and not designed for lower-end hardware + note: seedvr is highly sensitive to its cfg scale (set in settings -> postprocessing), + lower values will result in smoother output while higher values add details - [X-Omni SFT](https://x-omni-team.github.io/) *experimental*: X-omni is a transformer-only discrete autoregressive image generative model trained with reinforcement learning - **Features** diff --git a/modules/model_quant.py b/modules/model_quant.py index c3d2439ec..5f88d3174 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -482,7 +482,7 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh from modules.sdnq import sdnq_post_load_quant if weights_dtype is None: - if op is not None and ("text_encoder" in op or op in {"TE", "LLM"}) and shared.opts.sdnq_quantize_weights_mode_te not in {"Same as model", "default"}: + if (op is not None) and ("text_encoder" in op or op in {"TE", "LLM"}) and (shared.opts.sdnq_quantize_weights_mode_te not in {"Same as model", "default"}): weights_dtype = shared.opts.sdnq_quantize_weights_mode_te else: weights_dtype = shared.opts.sdnq_quantize_weights_mode @@ -588,6 +588,8 @@ def sdnq_quantize_weights(sd_model): log.info(f"Quantization: type=SDNQ time={t1-t0:.2f}") except Exception as e: log.warning(f"Quantization: type=SDNQ {e}") + from modules import errors + errors.display(e, 'Quantization') return sd_model diff --git a/modules/postprocess/seedvr_model.py b/modules/postprocess/seedvr_model.py index 1f833cbd5..fddeff557 100644 --- a/modules/postprocess/seedvr_model.py +++ b/modules/postprocess/seedvr_model.py @@ -1,9 +1,9 @@ import time +import random import numpy as np import torch from PIL import Image from torchvision.transforms import ToPILImage -from rich.progress import Progress, TextColumn, BarColumn, TaskProgressColumn, TimeRemainingColumn, TimeElapsedColumn from modules import devices from modules.shared import opts, log from modules.upscaler import Upscaler, UpscalerData @@ -19,7 +19,7 @@ to_pil = ToPILImage() class UpscalerSeedVR(Upscaler): def __init__(self, dirname=None): - self.name = "SeedVR" + self.name = "SeedVR2" super().__init__() self.scalers = [ UpscalerData(name="SeedVR2 3B", path=None, upscaler=self, model=None, scale=1), @@ -32,45 +32,140 @@ class UpscalerSeedVR(Upscaler): def load_model(self, path: str): model_name = MODELS_MAP.get(path, None) if (self.model is None) or (self.model_loaded != model_name): - log.debug(f'Upscaler load: name="{self.name}" model="{model_name}"') + log.debug(f'Upscaler loading: name="{self.name}" model="{model_name}"') + t0 = time.time() from modules.seedvr.src.core.model_manager import configure_runner + from modules.seedvr.src.core import generation self.model = configure_runner( model_name=model_name, cache_dir=opts.hfcache_dir, device=devices.device, dtype=devices.dtype, ) + self.model_loaded = model_name + self.model.dit.device = devices.device + self.model.dit.dtype = devices.dtype + self.model.vae_encode = self.vae_encode + self.model.vae_decode = self.vae_decode + self.model.model_step = generation.generation_step + generation.generation_step = self.model_step + self.model._internal_dict = { + 'dit': self.model.dit, + 'vae': self.model.vae, + } + t1 = time.time() + self.model.dit.config = self.model.config.dit + self.model.vae.tile_sample_min_size = 1024 + self.model.vae.tile_latent_min_size = 128 + # from modules.model_quant import do_post_load_quant + # from modules.sd_offload import set_diffuser_offload + # self.model = do_post_load_quant(self.model, allow=True) + # set_diffuser_offload(self.model) + log.info(f'Upscaler loaded: name="{self.name}" model="{model_name}" time={t1 - t0:.2f}') + + def vae_encode(self, samples): + log.debug(f'Upscaler encode: samples={samples[0].shape if len(samples) > 0 else None} tile={self.model.vae.tile_sample_min_size} overlap={self.model.vae.tile_overlap_factor}') + latents = [] + if len(samples) == 0: + return latents + self.model.dit = self.model.dit.to(device="cpu") + self.model.vae = self.model.vae.to(device=self.device) + devices.torch_gc() + from einops import rearrange + from modules.seedvr.src.optimization import memory_manager + memory_manager.clear_rope_cache(self.model) + scale = self.model.config.vae.scaling_factor + shift = self.model.config.vae.get("shifting_factor", 0.0) + batches = [sample.unsqueeze(0) for sample in samples] + for sample in batches: + sample = sample.to(self.device, self.model.vae.dtype) + sample = self.model.vae.preprocess(sample) + latent = self.model.vae.encode(sample).latent + latent = latent.unsqueeze(2) if latent.ndim == 4 else latent + latent = rearrange(latent, "b c ... -> b ... c") + latent = (latent - shift) * scale + latents.append(latent) + latents = [latent.squeeze(0) for latent in latents] + self.model.vae = self.model.vae.to(device="cpu") + devices.torch_gc() + return latents + + def vae_decode(self, latents, target_dtype: torch.dtype = None): + log.debug(f'Upscaler decode: latents={latents[0].shape if len(latents) > 0 else None} tile={self.model.vae.tile_latent_min_size} overlap={self.model.vae.tile_overlap_factor}') + samples = [] + if len(latents) == 0: + return samples + from einops import rearrange + from modules.seedvr.src.optimization import memory_manager + memory_manager.clear_rope_cache(self.model) + self.model.dit = self.model.dit.to(device="cpu") + self.model.vae = self.model.vae.to(device=self.device) + devices.torch_gc() + scale = self.model.config.vae.scaling_factor + shift = self.model.config.vae.get("shifting_factor", 0.0) + latents = [latent.unsqueeze(0) for latent in latents] + with devices.inference_context(): + for _i, latent in enumerate(latents): + latent = latent.to(self.device, self.model.vae.dtype) + latent = latent / scale + shift + latent = rearrange(latent, "b ... c -> b c ...") + latent = latent.squeeze(2) + sample = self.model.vae.decode(latent).sample + sample = self.model.vae.postprocess(sample) + samples.append(sample) + samples = [sample.squeeze(0) for sample in samples] + self.model.vae = self.model.vae.to(device="cpu") + devices.torch_gc() + return samples + + def model_step(self, *args, **kwargs): + from modules.seedvr.src.optimization import memory_manager + self.model.vae = self.model.vae.to(device="cpu") + self.model.dit = self.model.dit.to(device=self.device) + devices.torch_gc() + log.debug(f'Upscaler inference: args={len(args)} kwargs={list(kwargs.keys())}') + memory_manager.preinitialize_rope_cache(self.model) + with devices.inference_context(): + result = self.model.model_step(*args, **kwargs) + self.model.dit = self.model.dit.to(device="cpu") + devices.torch_gc() + return result def do_upscale(self, img: Image.Image, selected_file): - devices.torch_gc() self.load_model(selected_file) if self.model is None: return img - from modules.seedvr.src.core.generation import generation_loop + from modules.seedvr.src.core import generation width = int(self.scale * img.width) // 8 * 8 image_tensor = np.array(img) image_tensor = torch.from_numpy(image_tensor).to(device=devices.device, dtype=devices.dtype).unsqueeze(0) / 255.0 + random.seed() + seed = int(random.randrange(4294967294)) + t0 = time.time() - result_tensor = generation_loop( - runner=self.model, - images=image_tensor, - cfg_scale=1.0, - seed=42, - res_w=width, - batch_size=1, - temporal_overlap=0, - device=devices.device, - ) + with devices.inference_context(): + result_tensor = generation.generation_loop( + runner=self.model, + images=image_tensor, + cfg_scale=opts.seedvt_cfg_scale, + seed=seed, + res_w=width, + batch_size=1, + temporal_overlap=0, + device=devices.device, + ) t1 = time.time() - log.info(f'Upscaler: type="{self.name}" model="{selected_file}" scale={self.scale} time={t1 - t0:.2f}') + log.info(f'Upscaler: type="{self.name}" model="{selected_file}" scale={self.scale} cfg={opts.seedvt_cfg_scale} seed={seed} time={t1 - t0:.2f}') img = to_pil(result_tensor.squeeze().permute((2, 0, 1))) - devices.torch_gc() if opts.upscaler_unload: + self.model.dit = None + self.model.vae = None + self.model.cache = None self.model = None log.debug(f'Upscaler unload: type="{self.name}" model="{selected_file}"') - devices.torch_gc(force=True) + devices.torch_gc(force=True) return img diff --git a/modules/sd_models_utils.py b/modules/sd_models_utils.py index 637f8c585..05f44ef6c 100644 --- a/modules/sd_models_utils.py +++ b/modules/sd_models_utils.py @@ -164,6 +164,8 @@ def apply_function_to_model(sd_model, function, options, op=None): sd_model.unet = function(sd_model.unet, op="unet", sd_model=sd_model) if hasattr(sd_model, 'transformer') and hasattr(sd_model.transformer, 'config'): sd_model.transformer = function(sd_model.transformer, op="transformer", sd_model=sd_model) + if hasattr(sd_model, 'dit') and hasattr(sd_model.dit, 'config'): + sd_model.dit = function(sd_model.dit, op="dit", sd_model=sd_model) if hasattr(sd_model, 'transformer_2') and hasattr(sd_model.transformer_2, 'config'): sd_model.transformer_2 = function(sd_model.transformer_2, op="transformer_2", sd_model=sd_model) if hasattr(sd_model, 'transformer_3') and hasattr(sd_model.transformer_3, 'config'): diff --git a/modules/sd_offload.py b/modules/sd_offload.py index d20fb0371..0d9defd5d 100644 --- a/modules/sd_offload.py +++ b/modules/sd_offload.py @@ -274,7 +274,10 @@ class OffloadHook(accelerate.hooks.ModelHook): def get_pipe_variants(pipe=None): if pipe is None: - pipe = shared.sd_model + if shared.sd_loaded: + pipe = shared.sd_model + else: + return [pipe] variants = [pipe] if hasattr(pipe, "pipe"): variants.append(pipe.pipe) @@ -287,7 +290,10 @@ def get_pipe_variants(pipe=None): def get_module_names(pipe=None, exclude=[]): if pipe is None: - pipe = shared.sd_model + if shared.sd_loaded: + pipe = shared.sd_model + else: + return [] if hasattr(pipe, "_internal_dict"): modules_names = pipe._internal_dict.keys() # pylint: disable=protected-access else: diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 56c6c6d7f..499bc02b8 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -385,7 +385,6 @@ def sdnq_post_load_quant( modules_dtype_dict=modules_dtype_dict.copy(), op=op, ) - model.quantization_config = SDNQConfig( weights_dtype=weights_dtype, group_size=group_size, @@ -402,8 +401,10 @@ def sdnq_post_load_quant( modules_dtype_dict=modules_dtype_dict.copy(), ) - if hasattr(model, "config"): + try: model.config.quantization_config = model.quantization_config + except Exception: + pass model.quantization_method = QuantizationMethod.SDNQ return model diff --git a/modules/seedvr/config_3b.yaml b/modules/seedvr/config_3b.yaml index d2ffda469..711d4ec71 100644 --- a/modules/seedvr/config_3b.yaml +++ b/modules/seedvr/config_3b.yaml @@ -6,9 +6,9 @@ dit: model: __object__: path: - - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" - - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" - - "src.models.dit_v2.nadit" + - "SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" + - "SeedVR2_VideoUpscaler.src.models.dit_v2.nadit" + - "modules.seedvr.src.models.dit_v2.nadit" name: "NaDiT" args: "as_params" vid_in_channels: 33 @@ -49,9 +49,9 @@ vae: model: __object__: path: - - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - - "src.models.video_vae_v3.modules.attn_video_vae" + - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "modules.seedvr.src.models.video_vae_v3.modules.attn_video_vae" name: "VideoAutoencoderKLWrapper" args: "as_params" freeze_encoder: False diff --git a/modules/seedvr/config_7b.yaml b/modules/seedvr/config_7b.yaml index 3f80813d9..d3097c43a 100644 --- a/modules/seedvr/config_7b.yaml +++ b/modules/seedvr/config_7b.yaml @@ -6,8 +6,8 @@ dit: model: __object__: path: - - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit.nadit" - - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.dit.nadit" + - "SeedVR2_VideoUpscaler.src.models.dit.nadit" + - "SeedVR2_VideoUpscaler.src.models.dit.nadit" - "src.models.dit.nadit" name: "NaDiT" args: "as_params" @@ -46,8 +46,8 @@ vae: model: __object__: path: - - "custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - - "ComfyUI.custom_nodes.ComfyUI-SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" + - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - "src.models.video_vae_v3.modules.attn_video_vae" name: "VideoAutoencoderKLWrapper" args: "as_params" diff --git a/modules/seedvr/src/__init__.py b/modules/seedvr/src/__init__.py index a374bbd24..d9e24b028 100644 --- a/modules/seedvr/src/__init__.py +++ b/modules/seedvr/src/__init__.py @@ -1,31 +1,4 @@ """ -SeedVR2 Video Upscaler - Modular Architecture -Refactored from monolithic seedvr2.py for better maintainability - -Author: Refactored codebase -Version: 2.0.0 - Modular - -Available Modules: -- utils: Download and path utilities -- optimization: Memory, performance, and compatibility optimizations -- core: Model management and generation pipeline (NEW) -- processing: Video and tensor processing (coming next) -- interfaces: ComfyUI integration -""" -''' -# Track which modules are available for progressive migration -MODULES_AVAILABLE = { - 'downloads': True, # ✅ Module 1 - Downloads and model management - 'memory_manager': True, # ✅ Module 2 - Memory optimization - 'performance': True, # ✅ Module 3 - Performance optimizations - 'compatibility': True, # ✅ Module 4 - FP8/FP16 compatibility - 'model_manager': True, # ✅ Module 5 - Model configuration and loading - 'generation': True, # ✅ Module 6 - Generation loop and inference - 'video_transforms': True, # ✅ Module 7 - Video processing and transforms - 'comfyui_node': True, # ✅ Module 8 - ComfyUI node interface (COMPLETE!) - 'infer': True, # ✅ Module 9 - Infer -} -''' # Core imports (always available) import os import sys @@ -35,3 +8,4 @@ current_dir = os.path.dirname(os.path.abspath(__file__)) parent_dir = os.path.dirname(current_dir) if parent_dir not in sys.path: sys.path.insert(0, parent_dir) +""" \ No newline at end of file diff --git a/modules/seedvr/src/common/config.py b/modules/seedvr/src/common/config.py index 653685ccd..58c4e71f8 100644 --- a/modules/seedvr/src/common/config.py +++ b/modules/seedvr/src/common/config.py @@ -2,6 +2,7 @@ import importlib from typing import Any, Callable, List, Union from omegaconf import DictConfig, ListConfig, OmegaConf + try: OmegaConf.register_new_resolver("eval", eval) except Exception as e: @@ -9,7 +10,6 @@ except Exception as e: raise - def load_config(path: str, argv: List[str] = None) -> Union[DictConfig, ListConfig]: """ Load a configuration. Will resolve inheritance. diff --git a/modules/seedvr/src/common/decorators.py b/modules/seedvr/src/common/decorators.py index 6eacf8bd5..cf504b3bf 100644 --- a/modules/seedvr/src/common/decorators.py +++ b/modules/seedvr/src/common/decorators.py @@ -2,10 +2,10 @@ import functools import threading from typing import Callable import torch - from .distributed import barrier_if_distributed, get_global_rank, get_local_rank from .logger import get_logger + logger = get_logger(__name__) diff --git a/modules/seedvr/src/common/distributed/ops.py b/modules/seedvr/src/common/distributed/ops.py index 7c9256706..bba121b85 100644 --- a/modules/seedvr/src/common/distributed/ops.py +++ b/modules/seedvr/src/common/distributed/ops.py @@ -26,7 +26,6 @@ from ..cache import Cache from .advanced import ( get_sequence_parallel_group, get_sequence_parallel_rank, - get_sequence_parallel_world_size, ) from .basic import get_device @@ -48,7 +47,7 @@ def single_all_to_all( """ A function to do all-to-all on a tensor """ - seq_world_size = dist.get_world_size(group) + seq_world_size = 1 prev_scatter_dim = scatter_dim if scatter_dim != 0: local_input = local_input.transpose(0, scatter_dim) @@ -80,7 +79,7 @@ def _all_to_all( gather_dim: int, group: dist.ProcessGroup, ): - seq_world_size = dist.get_world_size(group) + seq_world_size = 1 input_list = [ t.contiguous() for t in torch.tensor_split(local_input, seq_world_size, scatter_dim) ] @@ -134,7 +133,7 @@ class Slice(torch.autograd.Function): def forward(ctx: Any, group: dist.ProcessGroup, local_input: Tensor, dim: int) -> Tensor: ctx.group = group ctx.rank = dist.get_rank(group) - seq_world_size = dist.get_world_size(group) + seq_world_size = 1 ctx.seq_world_size = seq_world_size ctx.dim = dim dim_size = local_input.shape[dim] @@ -163,7 +162,7 @@ class Gather(torch.autograd.Function): ctx.rank = dist.get_rank(group) ctx.dim = dim ctx.grad_scale = grad_scale - seq_world_size = dist.get_world_size(group) + seq_world_size = 1 ctx.seq_world_size = seq_world_size dim_size = list(local_input.size()) split_size = dim_size[0] @@ -204,7 +203,7 @@ def gather_seq_scatter_heads_qkv( group = get_sequence_parallel_group() if not group: return qkv_tensor - world = get_sequence_parallel_world_size() + world = 1 orig_shape = qkv_tensor.shape scatter_dim = qkv_tensor.dim() bef_all2all_shape = list(orig_shape) @@ -237,7 +236,7 @@ def slice_inputs(x: Tensor, dim: int, padding: bool = True): if group is None: return x sp_rank = get_sequence_parallel_rank() - sp_world = get_sequence_parallel_world_size() + sp_world = 1 dim_size = x.shape[dim] unit = (dim_size + sp_world - 1) // sp_world if padding and dim_size % sp_world: @@ -255,7 +254,7 @@ def remove_seqeunce_parallel_padding(x: Tensor, dim: int, unpad_dim_size: int): group = get_sequence_parallel_group() if group is None: return x - sp_world = get_sequence_parallel_world_size() + sp_world = 1 if unpad_dim_size % sp_world == 0: return x padding_size = sp_world - (unpad_dim_size % sp_world) @@ -271,7 +270,7 @@ def gather_heads_scatter_seq(x: Tensor, head_dim: int, seq_dim: int) -> Tensor: if not group: return x dim_size = x.size(seq_dim) - sp_world = get_sequence_parallel_world_size() + sp_world = 1 if dim_size % sp_world != 0: padding_size = sp_world - (dim_size % sp_world) x = _pad_tensor(x, seq_dim, padding_size) @@ -424,7 +423,7 @@ class SPDistForward: yield inputs else: device = self.device - sp_world = get_sequence_parallel_world_size() + sp_world = 1 sp_rank = get_sequence_parallel_rank() for local_step in range(sp_world): src_rank = dist.get_global_rank(group, local_step) diff --git a/modules/seedvr/src/common/logger.py b/modules/seedvr/src/common/logger.py index ada368e79..48b6eab67 100644 --- a/modules/seedvr/src/common/logger.py +++ b/modules/seedvr/src/common/logger.py @@ -19,9 +19,9 @@ Logging utility functions. import logging import sys from typing import Optional - from .distributed import get_global_rank, get_local_rank, get_world_size + _default_handler = logging.StreamHandler(sys.stdout) _default_handler.setFormatter( logging.Formatter( diff --git a/modules/seedvr/src/common/seed.py b/modules/seedvr/src/common/seed.py index f3e77f2bf..2469ad944 100644 --- a/modules/seedvr/src/common/seed.py +++ b/modules/seedvr/src/common/seed.py @@ -16,7 +16,6 @@ import random from typing import Optional import numpy as np import torch - from .distributed import get_global_rank diff --git a/modules/seedvr/src/core/generation.py b/modules/seedvr/src/core/generation.py index 5f871cfe7..401d8b874 100644 --- a/modules/seedvr/src/core/generation.py +++ b/modules/seedvr/src/core/generation.py @@ -1,11 +1,10 @@ import torch from torchvision.transforms import Compose, Lambda, Normalize - -from src.optimization.performance import optimized_video_rearrange, optimized_single_video_rearrange, optimized_sample_to_image_format -from src.common.seed import set_seed -from src.data.image.transforms.divisible_crop import DivisibleCrop -from src.data.image.transforms.na_resize import NaResize -from src.utils.color_fix import wavelet_reconstruction +from ..optimization.performance import optimized_video_rearrange, optimized_single_video_rearrange, optimized_sample_to_image_format +from ..common.seed import set_seed +from ..data.image.transforms.divisible_crop import DivisibleCrop +from ..data.image.transforms.na_resize import NaResize +from ..utils.color_fix import wavelet_reconstruction @@ -67,8 +66,6 @@ def generation_step(runner, text_embeds_dict, cond_latents, temporal_overlap, de x = runner.schedule.forward(x, aug_noise, t) return x - # Generate conditions with memory optimization - runner.dit.to(device=device) condition = runner.get_condition( noises[0], task="sr", @@ -76,8 +73,8 @@ def generation_step(runner, text_embeds_dict, cond_latents, temporal_overlap, de ) conditions = [condition] - # Use adaptive autocast for optimal performance with torch.no_grad(): + # Use adaptive autocast for optimal performance video_tensors = runner.inference( noises=noises, conditions=conditions, @@ -92,6 +89,7 @@ def generation_step(runner, text_embeds_dict, cond_latents, temporal_overlap, de cond_latents = cond_latents[0].to("cpu") conditions = conditions[0].to("cpu") condition = condition.to("cpu") + del noises, aug_noises, cond_latents, conditions, condition return samples #, last_latents @@ -133,7 +131,6 @@ def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_si - Intelligent VRAM management throughout process - Real-time progress reporting """ - model_dtype = None model_dtype = next(runner.dit.parameters()).dtype compute_dtype = model_dtype @@ -230,7 +227,6 @@ def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_si # Apply color correction if available transformed_video = transformed_video.to(device) - input_video = [optimized_single_video_rearrange(transformed_video)] del transformed_video sample = wavelet_reconstruction(sample, input_video[0][:sample.size(0)]) @@ -244,56 +240,33 @@ def generation_loop(runner, images, cfg_scale=1.0, seed=666, res_w=720, batch_si batch_samples.append(sample_cpu) #del sample - # Aggressive cleanup after each batch - # Progress callback - batch start if progress_callback: progress_callback(batch_count+1, total_batches, current_frames, "Processing batch...") - runner.vae.to(device="cpu") - runner.dit.to(device="cpu") - # OPTIMISATION ULTIME : Pré-allocation et copie directe (évite les torch.cat multiples) # 1. Calculer la taille totale finale total_frames = sum(batch.shape[0] for batch in batch_samples) if len(batch_samples) > 0: sample_shape = batch_samples[0].shape H, W, C = sample_shape[1], sample_shape[2], sample_shape[3] - - # 2. Pré-allouer le tensor final directement sur CPU (évite concatenations) final_video_images = torch.empty((total_frames, H, W, C), dtype=torch.float16) - - # 3. Copier par blocs directement dans le tensor final block_size = 500 current_idx = 0 for block_start in range(0, len(batch_samples), block_size): block_end = min(block_start + block_size, len(batch_samples)) - - # Charger le bloc en VRAM current_block = [] for i in range(block_start, block_end): current_block.append(batch_samples[i].to(device)) - - # Concatener en VRAM (rapide) block_result = torch.cat(current_block, dim=0) - - # Convertir en Float16 sur GPU - #if block_result.dtype != torch.float16: - # block_result = block_result.to(torch.float16) - - # Copier directement dans le tensor final (pas de concatenation!) block_frames = block_result.shape[0] final_video_images[current_idx:current_idx + block_frames] = block_result.to("cpu") current_idx += block_frames - - # Nettoyage immédiat VRAM del current_block, block_result else: print("SeedVR2: No batch_samples to process") final_video_images = torch.empty((0, 0, 0, 0), dtype=torch.float16) - # Cleanup batch_samples - #del batch_samples return final_video_images diff --git a/modules/seedvr/src/core/infer.py b/modules/seedvr/src/core/infer.py index fd8a595a2..7882d3a61 100644 --- a/modules/seedvr/src/core/infer.py +++ b/modules/seedvr/src/core/infer.py @@ -1,38 +1,12 @@ -# // Copyright (c) 2025 Bytedance Ltd. and/or its affiliates -# // -# // Licensed under the Apache License, Version 2.0 (the "License"); -# // you may not use this file except in compliance with the License. -# // You may obtain a copy of the License at -# // -# // http://www.apache.org/licenses/LICENSE-2.0 -# // -# // Unless required by applicable law or agreed to in writing, software -# // distributed under the License is distributed on an "AS IS" BASIS, -# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# // See the License for the specific language governing permissions and -# // limitations under the License. - from typing import List, Optional, Tuple, Union import torch from einops import rearrange from omegaconf import DictConfig, ListConfig -from torch import Tensor -from src.common.diffusion import ( - classifier_free_guidance_dispatcher, - create_sampler_from_config, - create_sampling_timesteps_from_config, - create_schedule_from_config, -) -from src.common.distributed import ( - get_device, -) - -# from common.fs import download - -from src.models.dit_v2 import na +from ..common.diffusion import classifier_free_guidance_dispatcher, create_sampler_from_config, create_sampling_timesteps_from_config, create_schedule_from_config +from ..models.dit_v2 import na -def optimized_channels_to_last(tensor): +def optimized_channels_to_last(tensor: torch.Tensor) -> torch.Tensor: """🚀 Optimized replacement for rearrange(tensor, 'b c ... -> b ... c') Moves channels from position 1 to last position using PyTorch native operations. """ @@ -74,7 +48,7 @@ class VideoDiffusionInfer(): self.dit = None self.sampler = None self.schedule = None - def get_condition(self, latent: Tensor, latent_blur: Tensor, task: str) -> Tensor: + def get_condition(self, latent: torch.Tensor, latent_blur: torch.Tensor, task: str) -> torch.Tensor: t, h, w, c = latent.shape cond = torch.zeros([t, h, w, c + 1], device=latent.device, dtype=latent.dtype) if task == "t2v" or t == 1: @@ -118,22 +92,18 @@ class VideoDiffusionInfer(): # -------------------------------- Helper ------------------------------- # @torch.no_grad() - def vae_encode(self, samples: List[Tensor]) -> List[Tensor]: - self.dit.to(device="cpu") - self.vae.to(device=self.device) - + def vae_encode(self, samples: List[torch.Tensor]) -> List[torch.Tensor]: use_sample = self.config.vae.get("use_sample", True) latents = [] if len(samples) > 0: - device = get_device() dtype = self.vae.dtype scale = self.config.vae.scaling_factor shift = self.config.vae.get("shifting_factor", 0.0) if isinstance(scale, ListConfig): - scale = torch.tensor(scale, device=device, dtype=dtype) + scale = torch.tensor(scale, device=self.device, dtype=dtype) if isinstance(shift, ListConfig): - shift = torch.tensor(shift, device=device, dtype=dtype) + shift = torch.tensor(shift, device=self.device, dtype=dtype) # Group samples of the same shape to batches if enabled. if self.config.vae.grouping: @@ -143,7 +113,7 @@ class VideoDiffusionInfer(): # Vae process by each group. for sample in batches: - sample = sample.to(device, dtype) + sample = sample.to(self.device, dtype) if hasattr(self.vae, "preprocess"): sample = self.vae.preprocess(sample) if use_sample: @@ -162,19 +132,15 @@ class VideoDiffusionInfer(): latents = na.unpack(latents, indices) else: latents = [latent.squeeze(0) for latent in latents] - - self.vae.to(device="cpu") return latents @torch.no_grad() - def vae_decode(self, latents: List[Tensor], target_dtype: torch.dtype = None) -> List[Tensor]: + def vae_decode(self, latents: List[torch.Tensor], target_dtype: torch.dtype = None) -> List[torch.Tensor]: """🚀 VAE decode optimisé - décodage direct sans chunking, compatible avec autocast externe""" - self.dit.to(device="cpu") - self.vae.to(device=self.device) samples = [] if len(latents) > 0: - device = get_device() + device = self.device dtype = self.vae.dtype scale = self.config.vae.scaling_factor shift = self.config.vae.get("shifting_factor", 0.0) @@ -218,10 +184,9 @@ class VideoDiffusionInfer(): samples = na.unpack(samples, indices) else: samples = [sample.squeeze(0) for sample in samples] - self.vae.to(device="cpu") return samples - def timestep_transform(self, timesteps: Tensor, latents_shapes: Tensor): + def timestep_transform(self, timesteps: torch.Tensor, latents_shapes: torch.Tensor): # Skip if not needed. if not self.config.diffusion.timesteps.get("transform", False): return timesteps @@ -256,13 +221,13 @@ class VideoDiffusionInfer(): @torch.no_grad() def inference( self, - noises: List[Tensor], - conditions: List[Tensor], - texts_pos: Union[List[str], List[Tensor], List[Tuple[Tensor]]], - texts_neg: Union[List[str], List[Tensor], List[Tuple[Tensor]]], + noises: List[torch.Tensor], + conditions: List[torch.Tensor], + texts_pos: Union[List[str], List[torch.Tensor], List[Tuple[torch.Tensor]]], + texts_neg: Union[List[str], List[torch.Tensor], List[Tuple[torch.Tensor]]], cfg_scale: Optional[float] = None, temporal_overlap: int = 0, # pylint: disable=unused-argument - ) -> List[Tensor]: + ) -> List[torch.Tensor]: assert len(noises) == len(conditions) == len(texts_pos) == len(texts_neg) batch_size = len(noises) @@ -316,6 +281,7 @@ class VideoDiffusionInfer(): # Adapter les latents au dtype cible (compatible avec FP8) latents = latents.to(target_dtype) if latents.dtype != target_dtype else latents latents_cond = latents_cond.to(target_dtype) if latents_cond.dtype != target_dtype else latents_cond + self.dit = self.dit.to(device=self.device, dtype=target_dtype) latents = self.sampler.sample( x=latents, diff --git a/modules/seedvr/src/core/model_manager.py b/modules/seedvr/src/core/model_manager.py index 043e5ac61..3abade938 100644 --- a/modules/seedvr/src/core/model_manager.py +++ b/modules/seedvr/src/core/model_manager.py @@ -3,10 +3,9 @@ import torch from omegaconf import OmegaConf from safetensors.torch import load_file as load_safetensors_file from huggingface_hub import hf_hub_download - -from src.optimization.memory_manager import preinitialize_rope_cache -from src.common.config import load_config, create_object -from src.core.infer import VideoDiffusionInfer +from ..optimization.memory_manager import preinitialize_rope_cache +from ..common.config import load_config, create_object +from ..core.infer import VideoDiffusionInfer def configure_runner(model_name, cache_dir, device:str='cpu', dtype:torch.dtype=None): @@ -15,41 +14,39 @@ def configure_runner(model_name, cache_dir, device:str='cpu', dtype:torch.dtype= config_path = os.path.join(script_directory, './config_7b.yaml') if "7b" in model_name else os.path.join(script_directory, './config_3b.yaml') config = load_config(config_path) - vae_config_path = os.path.join(script_directory, 'src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml') - vae_config = OmegaConf.load(vae_config_path) - vae_config.spatial_downsample_factor = vae_config.get('spatial_downsample_factor', 8) - vae_config.temporal_downsample_factor = vae_config.get('temporal_downsample_factor', 4) - config.vae.model = OmegaConf.merge(config.vae.model, vae_config) - runner = VideoDiffusionInfer(config, device=device, dtype=dtype) OmegaConf.set_readonly(runner.config, False) # load dit with torch.device("meta"): runner.dit = create_object(config.dit.model) - runner.dit.eval().to(dtype) + runner.dit.requires_grad_(False).eval() runner.dit.to_empty(device="cpu") - model_file = hf_hub_download(repo_id=repo_id, filename=model_name, cache_dir=cache_dir) state_dict = load_safetensors_file(model_file) runner.dit.load_state_dict(state_dict, assign=True) + runner.dit = runner.dit.to(device="cpu", dtype=dtype) del state_dict - runner.dit = runner.dit.to(device=device, dtype=dtype) # load vae + vae_config_path = os.path.join(script_directory, 'src/models/video_vae_v3/s8_c16_t4_inflation_sd3.yaml') + vae_config = OmegaConf.load(vae_config_path) + config.vae.model = OmegaConf.merge(config.vae.model, vae_config) + vae_file = hf_hub_download(repo_id=repo_id, filename=config.vae.checkpoint, cache_dir=cache_dir) with torch.device("meta"): runner.vae = create_object(config.vae.model) runner.vae.requires_grad_(False).eval() runner.vae.to_empty(device="cpu") - state_dict = load_safetensors_file(vae_file) runner.vae.load_state_dict(state_dict) - del state_dict - runner.vae = runner.vae.to(device=device, dtype=dtype) + runner.vae = runner.vae.to(device="cpu", dtype=dtype) runner.config.vae.dtype = str(dtype) - runner.vae.set_causal_slicing(**config.vae.slicing) + runner.config.vae.slicing = {'split_size': 8, 'memory_device': 'same'} + runner.config.vae.memory_limit = {'conv_max_mem': 0.2, 'norm_max_mem': 0.2} + runner.vae.set_causal_slicing(**runner.config.vae.slicing) runner.vae.set_memory_limit(**runner.config.vae.memory_limit) + del state_dict # load embeds pos_embeds_file = hf_hub_download(repo_id=repo_id, filename='pos_emb.pt', cache_dir=cache_dir) @@ -57,5 +54,4 @@ def configure_runner(model_name, cache_dir, device:str='cpu', dtype:torch.dtype= runner.text_pos_embeds = torch.load(pos_embeds_file).to(device=device, dtype=dtype) runner.text_neg_embeds = torch.load(neg_embeds_file).to(device=device, dtype=dtype) - preinitialize_rope_cache(runner) return runner diff --git a/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py b/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py index ee9ae9ae8..eb551aacc 100644 --- a/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py +++ b/modules/seedvr/src/models/dit/blocks/mmdit_window_block.py @@ -19,13 +19,7 @@ from torch import nn from torch.nn import functional as F from torch.nn.modules.utils import _triple from ....common.half_precision_fixes import safe_pad_operation -from ....common.distributed.ops import ( - gather_heads, - gather_heads_scatter_seq, - gather_seq_scatter_heads_qkv, - scatter_heads, -) - +from ....common.distributed.ops import gather_heads, gather_heads_scatter_seq, gather_seq_scatter_heads_qkv, scatter_heads from ..attention import TorchAttention from ..mlp import get_mlp from ..mm import MMArg, MMModule diff --git a/modules/seedvr/src/models/dit_v2/rope.py b/modules/seedvr/src/models/dit_v2/rope.py index dde5b4756..89d851792 100644 --- a/modules/seedvr/src/models/dit_v2/rope.py +++ b/modules/seedvr/src/models/dit_v2/rope.py @@ -18,8 +18,7 @@ import torch from einops import rearrange from rotary_embedding_torch import RotaryEmbedding, apply_rotary_emb from torch import nn - -from src.common.cache import Cache +from ...common.cache import Cache class RotaryEmbeddingBase(nn.Module): diff --git a/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py index 1f282dfa1..3aba37b66 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py @@ -15,7 +15,6 @@ from typing import Literal, Optional, Tuple, Union import diffusers import torch import torch.nn as nn -import torch.nn.functional as F from diffusers.models.attention_processor import Attention, SpatialNorm from diffusers.models.autoencoders.vae import DecoderOutput, DiagonalGaussianDistribution from diffusers.models.downsampling import Downsample2D @@ -28,29 +27,12 @@ from diffusers.utils import is_torch_version from diffusers.utils.accelerate_utils import apply_forward_hook from einops import rearrange from ....common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation - -from ....common.distributed.advanced import get_sequence_parallel_world_size from ....common.logger import get_logger -from .causal_inflation_lib import ( - InflatedCausalConv3d, - causal_norm_wrapper, - init_causal_conv3d, - remove_head, -) -from .context_parallel_lib import ( - causal_conv_gather_outputs, - causal_conv_slice_inputs, -) +from .causal_inflation_lib import InflatedCausalConv3d, causal_norm_wrapper, init_causal_conv3d, remove_head +from .context_parallel_lib import causal_conv_gather_outputs, causal_conv_slice_inputs from .global_config import set_norm_limit -from .types import ( - CausalAutoencoderOutput, - CausalDecoderOutput, - CausalEncoderOutput, - MemoryState, - _inflation_mode_t, - _memory_device_t, - _receptive_field_t, -) +from .types import CausalAutoencoderOutput, CausalDecoderOutput, CausalEncoderOutput, MemoryState, _inflation_mode_t, _memory_device_t, _receptive_field_t + logger = get_logger(__name__) # pylint: disable=invalid-name @@ -1064,7 +1046,7 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): scaling_factor: float = 0.18215, force_upcast: float = True, attention: bool = True, - temporal_scale_num: int = 2, + temporal_scale_num: int = 0, slicing_up_num: int = 0, gradient_checkpoint: bool = False, inflation_mode: _inflation_mode_t = "tail", @@ -1164,7 +1146,8 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): @apply_forward_hook def encode(self, x: torch.FloatTensor, return_dict: bool = True) -> AutoencoderKLOutput: - h = self.slicing_encode(x) + # h = self.slicing_encode(x) + h = self.tiled_encode(x) posterior = DiagonalGaussianDistribution(h) if not return_dict: @@ -1176,7 +1159,8 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): def decode( self, z: torch.Tensor, return_dict: bool = True ) -> Union[DecoderOutput, torch.Tensor]: - decoded = self.slicing_decode(z) + # decoded = self.slicing_decode(z) + decoded = self.tiled_decode(z) if not return_dict: return (decoded,) @@ -1208,7 +1192,7 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): return output.to(z.device) def slicing_encode(self, x: torch.Tensor) -> torch.Tensor: - sp_size = get_sequence_parallel_world_size() + sp_size = 1 if self.use_slicing and (x.shape[2] - 1) > self.slicing_sample_min_size * sp_size: x_slices = x[:, :, 1:].split(split_size=self.slicing_sample_min_size * sp_size, dim=2) encoded_slices = [ @@ -1226,7 +1210,7 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): return self._encode(x) def slicing_decode(self, z: torch.Tensor) -> torch.Tensor: - sp_size = get_sequence_parallel_world_size() + sp_size = 1 if self.use_slicing and (z.shape[2] - 1) > self.slicing_latent_min_size * sp_size: z_slices = z[:, :, 1:].split(split_size=self.slicing_latent_min_size * sp_size, dim=2) decoded_slices = [ @@ -1243,12 +1227,68 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): else: return self._decode(z) - def tiled_encode(self, x: torch.Tensor, **kwargs) -> torch.Tensor: - raise NotImplementedError + def blend_v(self, a: torch.Tensor, b: torch.Tensor, blend_extent: int) -> torch.Tensor: + blend_extent = min(a.shape[3], b.shape[3], blend_extent) + for y in range(blend_extent): + b[:, :, :, y, :] = a[:, :, :, -blend_extent + y, :] * (1 - y / blend_extent) + b[:, :, :, y, :] * (y / blend_extent) + return b - def tiled_decode(self, z: torch.Tensor, **kwargs) -> torch.Tensor: - raise NotImplementedError + def blend_h(self, a: torch.Tensor, b: torch.Tensor, blend_extent: int) -> torch.Tensor: + blend_extent = min(a.shape[4], b.shape[4], blend_extent) + for x in range(blend_extent): + b[:, :, :, :, x] = a[:, :, :, :, -blend_extent + x] * (1 - x / blend_extent) + b[:, :, :, :, x] * (x / blend_extent) + return b + def tiled_encode(self, x: torch.Tensor) -> torch.Tensor: + overlap_size = int(self.tile_sample_min_size * (1 - self.tile_overlap_factor)) + blend_extent = int(self.tile_latent_min_size * self.tile_overlap_factor) + row_limit = self.tile_latent_min_size - blend_extent + rows = [] + for i in range(0, x.shape[3], overlap_size): + row = [] + for j in range(0, x.shape[4], overlap_size): + tile = x[:, :, :, i : i + self.tile_sample_min_size, j : j + self.tile_sample_min_size] + tile = self._encode(tile) + row.append(tile) + rows.append(row) + result_rows = [] + for i, row in enumerate(rows): + result_row = [] + for j, tile in enumerate(row): + if i > 0: + tile = self.blend_v(rows[i - 1][j], tile, blend_extent) + if j > 0: + tile = self.blend_h(row[j - 1], tile, blend_extent) + result_row.append(tile[:, :, :, :row_limit, :row_limit]) + result_rows.append(torch.cat(result_row, dim=4)) + enc = torch.cat(result_rows, dim=3) + return enc + + def tiled_decode(self, z: torch.Tensor) -> torch.Tensor: + overlap_size = int(self.tile_latent_min_size * (1 - self.tile_overlap_factor)) + blend_extent = int(self.tile_sample_min_size * self.tile_overlap_factor) + row_limit = self.tile_sample_min_size - blend_extent + rows = [] + for i in range(0, z.shape[3], overlap_size): + row = [] + for j in range(0, z.shape[4], overlap_size): + tile = z[:, :, :, i : i + self.tile_latent_min_size, j : j + self.tile_latent_min_size] + decoded = self.decoder(tile) + row.append(decoded) + rows.append(row) + result_rows = [] + for i, row in enumerate(rows): + result_row = [] + for j, tile in enumerate(row): + if i > 0: + tile = self.blend_v(rows[i - 1][j], tile, blend_extent) + if j > 0: + tile = self.blend_h(row[j - 1], tile, blend_extent) + result_row.append(tile[:, :, :, :row_limit, :row_limit]) + result_rows.append(torch.cat(result_row, dim=4)) + dec = torch.cat(result_rows, dim=3) + return dec + def forward( self, x: torch.FloatTensor, mode: Literal["encode", "decode", "all"] = "all", **kwargs ): diff --git a/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py index 26f14739e..c6d35f0cb 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/causal_inflation_lib.py @@ -21,30 +21,11 @@ from diffusers.models.normalization import RMSNorm from einops import rearrange from torch import Tensor, nn from torch.nn import Conv3d - from .context_parallel_lib import cache_send_recv, get_cache_size from .global_config import get_norm_limit from .types import MemoryState, _inflation_mode_t, _memory_device_t from ....common.half_precision_fixes import safe_pad_operation -# Single GPU inference - no distributed processing needed - -# Mock distributed functions for single GPU inference -def get_sequence_parallel_group(): - return None - -def get_sequence_parallel_rank(): - return 0 - -def get_sequence_parallel_world_size(): - return 1 - -def get_next_sequence_parallel_rank(): - return 0 - -def get_prev_sequence_parallel_rank(): - return 0 - @contextmanager def ignore_padding(model): @@ -172,7 +153,6 @@ class InflatedCausalConv3d(Conv3d): if ( math.isinf(self.memory_limit) and torch.is_tensor(input) - and get_sequence_parallel_group() is None ): return self.basic_forward(input, memory_state) return self.slicing_forward(input, memory_state) diff --git a/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py index ffc16938a..830d18b87 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/context_parallel_lib.py @@ -14,11 +14,8 @@ from typing import List import torch -import torch.nn.functional as F from torch import Tensor -from .types import MemoryState - # Single GPU inference - no distributed processing needed diff --git a/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py b/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py index 4b8e6dfb6..da8c1304f 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/inflated_layers.py @@ -16,14 +16,8 @@ from functools import partial from typing import Literal, Optional from torch import Tensor from torch.nn import Conv3d +from .inflated_lib import MemoryState, extend_head, inflate_bias, inflate_weight, modify_state_dict -from .inflated_lib import ( - MemoryState, - extend_head, - inflate_bias, - inflate_weight, - modify_state_dict, -) _inflation_mode_t = Literal["none", "tail", "replicate"] _memory_device_t = Optional[Literal["cpu", "same"]] diff --git a/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py b/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py index 486c63ca1..6feda1751 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/inflated_lib.py @@ -19,9 +19,9 @@ import torch from diffusers.models.normalization import RMSNorm from einops import rearrange from torch import Tensor, nn - from ....common.logger import get_logger + logger = get_logger(__name__) diff --git a/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py b/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py.old similarity index 97% rename from modules/seedvr/src/models/video_vae_v3/modules/video_vae.py rename to modules/seedvr/src/models/video_vae_v3/modules/video_vae.py.old index 98147e82f..2696c32ca 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/video_vae.py.old @@ -11,37 +11,17 @@ from contextlib import nullcontext from typing import Optional, Tuple, Literal, Callable, Union - import torch import torch.nn as nn -import torch.nn.functional as F from diffusers.models.autoencoders.vae import DiagonalGaussianDistribution from einops import rearrange from ....common.half_precision_fixes import safe_pad_operation - -from ....common.distributed.advanced import get_sequence_parallel_world_size from ....common.logger import get_logger -from .causal_inflation_lib import ( - InflatedCausalConv3d, - causal_norm_wrapper, - init_causal_conv3d, - remove_head, -) -from .context_parallel_lib import ( - causal_conv_gather_outputs, - causal_conv_slice_inputs, -) +from .causal_inflation_lib import InflatedCausalConv3d, causal_norm_wrapper, init_causal_conv3d, remove_head +from .context_parallel_lib import causal_conv_gather_outputs, causal_conv_slice_inputs from .global_config import set_norm_limit -from .types import ( - CausalAutoencoderOutput, - CausalDecoderOutput, - CausalEncoderOutput, - MemoryState, - _inflation_mode_t, - _memory_device_t, - _receptive_field_t, - _selective_checkpointing_t, -) +from .types import CausalAutoencoderOutput, CausalDecoderOutput, CausalEncoderOutput, MemoryState, _inflation_mode_t, _memory_device_t, _receptive_field_t, _selective_checkpointing_t + logger = get_logger(__name__) # pylint: disable=invalid-name @@ -717,7 +697,7 @@ class VideoAutoencoderKL(nn.Module): use_post_quant_conv: bool = True, enc_selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), dec_selective_checkpointing: Tuple[_selective_checkpointing_t] = ("none",), - temporal_scale_num: int = 3, + temporal_scale_num: int = 0, slicing_up_num: int = 0, inflation_mode: _inflation_mode_t = "tail", time_receptive_field: _receptive_field_t = "half", @@ -824,7 +804,7 @@ class VideoAutoencoderKL(nn.Module): return x def slicing_encode(self, x: torch.Tensor) -> torch.Tensor: - sp_size = get_sequence_parallel_world_size() + sp_size = 1 if self.use_slicing and (x.shape[2] - 1) > self.slicing_sample_min_size * sp_size: x_slices = x[:, :, 1:].split(split_size=self.slicing_sample_min_size * sp_size, dim=2) encoded_slices = [ @@ -842,7 +822,7 @@ class VideoAutoencoderKL(nn.Module): return self._encode(x, memory_state=MemoryState.DISABLED) def slicing_decode(self, z: torch.Tensor) -> torch.Tensor: - sp_size = get_sequence_parallel_world_size() + sp_size = 1 if self.use_slicing and (z.shape[2] - 1) > self.slicing_latent_min_size * sp_size: z_slices = z[:, :, 1:].split(split_size=self.slicing_latent_min_size * sp_size, dim=2) decoded_slices = [ diff --git a/modules/seedvr/src/optimization/memory_manager.py b/modules/seedvr/src/optimization/memory_manager.py index 3be323f67..39feada97 100644 --- a/modules/seedvr/src/optimization/memory_manager.py +++ b/modules/seedvr/src/optimization/memory_manager.py @@ -5,12 +5,9 @@ Handles VRAM usage, cache management, and memory optimization Extracted from: seedvr2.py (lines 373-405, 607-626, 1016-1044) """ -import os import torch -import gc -from typing import Tuple, Optional -from src.common.cache import Cache -from src.models.dit_v2.rope import RotaryEmbeddingBase +from ..common.cache import Cache +from ..models.dit_v2.rope import RotaryEmbeddingBase def preinitialize_rope_cache(runner) -> None: @@ -21,73 +18,63 @@ def preinitialize_rope_cache(runner) -> None: runner: The model runner containing DiT and VAE models """ - try: - # Create dummy tensors to simulate common shapes - # Format: [batch, channels, frames, height, width] for vid_shape - # Format: [batch, seq_len] for txt_shape - common_shapes = [ - # Common video resolutions - (torch.tensor([[1, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 1 frame, 77 tokens - (torch.tensor([[4, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 4 frames - (torch.tensor([[5, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 5 frames (4n+1 format) - (torch.tensor([[1, 4, 4]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # Higher resolution - ] + # Create dummy tensors to simulate common shapes + # Format: [batch, channels, frames, height, width] for vid_shape + # Format: [batch, seq_len] for txt_shape + common_shapes = [ + # Common video resolutions + (torch.tensor([[1, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 1 frame, 77 tokens + (torch.tensor([[4, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 4 frames + (torch.tensor([[5, 3, 3]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # 5 frames (4n+1 format) + (torch.tensor([[1, 4, 4]], dtype=torch.long), torch.tensor([[77]], dtype=torch.long)), # Higher resolution + ] - # Create mock cache for pre-initialization + # Create mock cache for pre-initialization - temp_cache = Cache() + temp_cache = Cache() - # Access RoPE modules in DiT (recursive search) - def find_rope_modules(module): - rope_modules = [] - for name, child in module.named_modules(): - if hasattr(child, 'get_freqs') and callable(child.get_freqs): - rope_modules.append((name, child)) - return rope_modules + # Access RoPE modules in DiT (recursive search) + def find_rope_modules(module): + rope_modules = [] + for name, child in module.named_modules(): + if hasattr(child, 'get_freqs') and callable(child.get_freqs): + rope_modules.append((name, child)) + return rope_modules - rope_modules = find_rope_modules(runner.dit) + rope_modules = find_rope_modules(runner.dit) - # Pre-calculate for each RoPE module found - for name, rope_module in rope_modules: - # Temporarily move module to CPU if necessary - original_device = next(rope_module.parameters()).device if list(rope_module.parameters()) else torch.device('cpu') - rope_module.to('cpu') + # Pre-calculate for each RoPE module found + for _name, rope_module in rope_modules: + # Temporarily move module to CPU if necessary + original_device = next(rope_module.parameters()).device if list(rope_module.parameters()) else torch.device('cpu') + rope_module.to('cpu') - try: - for vid_shape, txt_shape in common_shapes: - cache_key = f"720pswin_by_size_bysize_{tuple(vid_shape[0].tolist())}_sd3.mmrope_freqs_3d" + for vid_shape, txt_shape in common_shapes: + cache_key = f"720pswin_by_size_bysize_{tuple(vid_shape[0].tolist())}_sd3.mmrope_freqs_3d" - def compute_freqs(): - # Calculate with reduced dimensions to avoid OOM - with torch.no_grad(): - # Detect RoPE module type - module_type = type(rope_module).__name__ + def compute_freqs(): + # Calculate with reduced dimensions to avoid OOM + with torch.no_grad(): + # Detect RoPE module type + module_type = type(rope_module).__name__ - if module_type == 'NaRotaryEmbedding3d': - # NaRotaryEmbedding3d: only takes shape (vid_shape) - return rope_module.get_freqs(vid_shape.cpu()) - else: - # Standard RoPE: takes vid_shape and txt_shape - return rope_module.get_freqs(vid_shape.cpu(), txt_shape.cpu()) + if module_type == 'NaRotaryEmbedding3d': + # NaRotaryEmbedding3d: only takes shape (vid_shape) + return rope_module.get_freqs(vid_shape.cpu()) + else: + # Standard RoPE: takes vid_shape and txt_shape + return rope_module.get_freqs(vid_shape.cpu(), txt_shape.cpu()) - # Store in cache - temp_cache(cache_key, compute_freqs) + # Store in cache + temp_cache(cache_key, compute_freqs) - except Exception as e: - print(f" ❌ Error in module {name}: {e}") - finally: - # Restore to original device - rope_module.to(original_device) + rope_module.to(original_device) - # Copy temporary cache to runner cache - if hasattr(runner, 'cache'): - runner.cache.cache.update(temp_cache.cache) - else: - runner.cache = temp_cache - - except Exception as e: - print(f" ⚠️ Error during RoPE pre-init: {e}") - print(" 🔄 Model will work but could have OOM at first launch") + # Copy temporary cache to runner cache + if hasattr(runner, 'cache'): + runner.cache.cache.update(temp_cache.cache) + else: + runner.cache = temp_cache def clear_rope_cache(runner) -> None: @@ -97,8 +84,6 @@ def clear_rope_cache(runner) -> None: Args: runner: The model runner containing the cache """ - print("🧹 Cleaning RoPE cache...") - if hasattr(runner, 'cache') and hasattr(runner.cache, 'cache'): # Count entries before cleanup cache_size = len(runner.cache.cache) @@ -116,7 +101,6 @@ def clear_rope_cache(runner) -> None: # Clear the cache runner.cache.cache.clear() - print(f" ✅ RoPE cache cleared ({cache_size} entries removed)") if hasattr(runner, 'dit'): cleared_lru_count = 0 @@ -125,7 +109,3 @@ def clear_rope_cache(runner) -> None: if hasattr(module.get_axial_freqs, 'cache_clear'): module.get_axial_freqs.cache_clear() cleared_lru_count += 1 - if cleared_lru_count > 0: - print(f" ✅ Cleared {cleared_lru_count} LRU caches from RoPE modules.") - - print("🎯 RoPE cache cleanup completed!") diff --git a/modules/seedvr/src/utils/color_fix.py b/modules/seedvr/src/utils/color_fix.py index 8a042892b..a8b0da509 100644 --- a/modules/seedvr/src/utils/color_fix.py +++ b/modules/seedvr/src/utils/color_fix.py @@ -2,7 +2,7 @@ import torch from PIL import Image from torch import Tensor from torch.nn import functional as F -from src.common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation +from ..common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation from torchvision.transforms import ToTensor, ToPILImage def adain_color_fix(target: Image, source: Image): diff --git a/modules/seedvr/test.py b/modules/seedvr/test.py index 6ecf022ab..b8c53f874 100644 --- a/modules/seedvr/test.py +++ b/modules/seedvr/test.py @@ -1,12 +1,10 @@ import os -import argparse import numpy as np import torch from PIL import Image -from huggingface_hub import snapshot_download from torchvision.transforms import ToPILImage -from src.core.generation import generation_loop -from src.core.model_manager import configure_runner +from .src.core.generation import generation_loop +from .src.core.model_manager import configure_runner diff --git a/modules/shared.py b/modules/shared.py index 16009b1e0..f987cdeb8 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -620,7 +620,6 @@ options_templates.update(options_section(('postprocessing', "Postprocessing"), { "detailer_iou": OptionInfo(0.5, "Max overlap", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_sigma_adjust": OptionInfo(1.0, "Detailer sigma adjust", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_sigma_adjust_max": OptionInfo(1.0, "Detailer sigma end", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), - # "detailer_resolution": OptionInfo(1024, "Detailer resolution", gr.Slider, {"minimum": 256, "maximum": 4096, "step": 8, "visible": False}), "detailer_min_size": OptionInfo(0.0, "Min object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_max_size": OptionInfo(1.0, "Max object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_padding": OptionInfo(20, "Item padding", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}), @@ -631,6 +630,9 @@ options_templates.update(options_section(('postprocessing', "Postprocessing"), { "detailer_unload": OptionInfo(False, "Move detailer model to CPU when complete"), "detailer_augment": OptionInfo(True, "Detailer use model augment"), + "postprocessing_sep_seedvt": OptionInfo("

    SeedVT

    ", "", gr.HTML), + "seedvt_cfg_scale": OptionInfo(3.5, "SeedVR CFG Scale", gr.Slider, {"minimum": 1, "maximum": 15, "step": 1}), + "postprocessing_sep_face_restore": OptionInfo("

    Face Restore

    ", "", gr.HTML), "face_restoration_model": OptionInfo("None", "Face restoration", gr.Radio, lambda: {"choices": ['None'] + [x.name() for x in face_restorers]}), "code_former_weight": OptionInfo(0.2, "CodeFormer weight parameter", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.01}), diff --git a/modules/ui_settings.py b/modules/ui_settings.py index 926b31762..673e45941 100644 --- a/modules/ui_settings.py +++ b/modules/ui_settings.py @@ -227,7 +227,7 @@ def create_ui(): quicksettings_list.append((key, item)) components.append(dummy_component) else: - with gr.Row(elem_id=f"settings_section_row_{section_id}"): # only so we can add dirty indicator at the start of the row + with gr.Row(elem_id=f"settings_section_row_{section_id}", elem_classes=["settings_section"]): # only so we can add dirty indicator at the start of the row component = create_setting_component(key) shared.settings_components[key] = component current_items.append(key) From d4d24214b359256bffc29405932ffdffa5f4016a Mon Sep 17 00:00:00 2001 From: Disty0 Date: Mon, 13 Oct 2025 14:06:13 +0300 Subject: [PATCH 208/230] SDNQ use a better way of loading pre quants and cleanup --- modules/sdnq/quantizer.py | 219 +++++++++----------------------------- 1 file changed, 53 insertions(+), 166 deletions(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 499bc02b8..68d1c355a 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -421,11 +421,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): required_packages = None torch_dtype = None - def __init__(self, quantization_config, **kwargs): - super().__init__(quantization_config, **kwargs) - self.modules_to_not_convert = [] - self.updated_expected_keys = False - def check_if_quantized_param( self, model, @@ -433,14 +428,16 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): param_name: str, *args, **kwargs, # pylint: disable=unused-argument ): - if self.pre_quantized and self.updated_expected_keys and (param_name.endswith(".scale") or param_name.endswith(".zero_point") or param_name.endswith(".svd_up") or param_name.endswith(".svd_down")): - return True - if param_name.endswith(".weight"): + if self.pre_quantized: + layer, tensor_name = get_module_from_name(model, param_name) + if hasattr(layer, "sdnq_dequantizer"): + return True + elif param_name.endswith(".weight"): split_param_name = param_name.split(".") if ( - param_name not in self.modules_to_not_convert - and not any(param in split_param_name for param in self.modules_to_not_convert) - and not any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in self.modules_to_not_convert) + param_name not in self.quantization_config.modules_to_not_convert + and not any(param in split_param_name for param in self.quantization_config.modules_to_not_convert) + and not any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in self.quantization_config.modules_to_not_convert) ): layer_class_name = get_module_from_name(model, param_name)[0].__class__.__name__ if layer_class_name in allowed_types: @@ -449,7 +446,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): return True else: return True - if param_value is not None: + if param_value is not None and param_value.device.type == "cpu": with devices.inference_context(): param_value.data = param_value.clone() # safetensors is unable to release the cpu memory without this return False @@ -476,10 +473,10 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): state_dict: Dict[str, Any], *args, **kwargs, # pylint: disable=unused-argument ): - if self.pre_quantized and self.updated_expected_keys and (param_name.endswith(".scale") or param_name.endswith(".zero_point") or param_name.endswith(".svd_up") or param_name.endswith(".svd_down")): + if self.pre_quantized: layer, tensor_name = get_module_from_name(model, param_name) - return_dtype = torch.float32 if self.quantization_config.dequantize_fp32 else self.torch_dtype if self.torch_dtype is not None else param_value.dtype if param_value is not None: + return_dtype = param_value.dtype if tensor_name == "weight" else torch.float32 if self.quantization_config.dequantize_fp32 else self.torch_dtype if self.torch_dtype is not None else param_value.dtype if param_value.dtype == return_dtype and devices.same_device(param_value.device, target_device): param_value = param_value.clone() else: @@ -519,88 +516,30 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): if self.quantization_config.quantization_device is not None: target_device = self.quantization_config.quantization_device - if not self.pre_quantized: - torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype - if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): - param_value = param_value.clone() - else: - param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) - - layer, _ = get_module_from_name(model, param_name) - layer.weight = torch.nn.Parameter(param_value, requires_grad=False) - layer = sdnq_quantize_layer( - layer, - weights_dtype=weights_dtype, - torch_dtype=torch_dtype, - group_size=self.quantization_config.group_size, - svd_rank=self.quantization_config.svd_rank, - use_svd=self.quantization_config.use_svd, - quant_conv=self.quantization_config.quant_conv, - use_quantized_matmul=self.quantization_config.use_quantized_matmul, - use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, - dequantize_fp32=self.quantization_config.dequantize_fp32, - non_blocking=self.quantization_config.non_blocking, - quantization_device=None, - return_device=return_device, - param_name=param_name, - ) + torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype + if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): + param_value = param_value.clone() else: - from accelerate import init_empty_weights - layer, _ = get_module_from_name(model, param_name) - torch_dtype = layer.weight.dtype if self.torch_dtype is None else self.torch_dtype + param_value = param_value.to(target_device, non_blocking=self.quantization_config.non_blocking).to(dtype=torch.float32) - if self.updated_expected_keys: # prevent overwrite to meta - scale, zero_point, svd_up, svd_down = None, None, None, None - if hasattr(layer, "scale") and layer.scale.device.type != "meta": - scale = layer.scale - del layer.scale - if hasattr(layer, "zero_point") and layer.zero_point.device.type != "meta": - zero_point = layer.zero_point - del layer.zero_point - if hasattr(layer, "svd_up") and layer.svd_up.device.type != "meta": - svd_up = layer.svd_up - del layer.svd_up - if hasattr(layer, "svd_down") and layer.svd_down.device.type != "meta": - svd_down = layer.svd_down - del layer.svd_down - - with init_empty_weights(): - # add sdnq_dequantizer - layer = sdnq_quantize_layer( - layer, - weights_dtype=weights_dtype, - torch_dtype=torch_dtype, - group_size=self.quantization_config.group_size, - svd_rank=self.quantization_config.svd_rank, - use_svd=self.quantization_config.use_svd, - quant_conv=self.quantization_config.quant_conv, - use_quantized_matmul=self.quantization_config.use_quantized_matmul, - use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, - dequantize_fp32=self.quantization_config.dequantize_fp32, - non_blocking=self.quantization_config.non_blocking, - quantization_device="meta", - return_device="meta", - param_name=param_name, - ) - - layer.weight = torch.nn.Parameter(param_value.clone().to(target_device), requires_grad=False) - if self.updated_expected_keys: # Transformers - if scale is not None: - layer.scale = torch.nn.Parameter(scale, requires_grad=False) - if zero_point is not None: - layer.zero_point = torch.nn.Parameter(zero_point, requires_grad=False) - if svd_up is not None: - layer.svd_up = torch.nn.Parameter(svd_up, requires_grad=False) - if svd_down is not None: - layer.svd_down = torch.nn.Parameter(svd_down, requires_grad=False) - else: # Diffusers doesn't have the API for updating expected keys - layer_key = param_name.removesuffix(".weight") - layer.scale = torch.nn.Parameter(state_dict[layer_key + ".scale"].clone().to(target_device), requires_grad=False) - if layer.zero_point is not None: - layer.zero_point = torch.nn.Parameter(state_dict[layer_key + ".zero_point"].clone().to(target_device), requires_grad=False) - if layer.svd_up is not None: - layer.svd_up = torch.nn.Parameter(state_dict[layer_key + ".svd_up"].clone().to(target_device), requires_grad=False) - layer.svd_down = torch.nn.Parameter(state_dict[layer_key + ".svd_down"].clone().to(target_device), requires_grad=False) + layer, _ = get_module_from_name(model, param_name) + layer.weight = torch.nn.Parameter(param_value, requires_grad=False) + layer = sdnq_quantize_layer( + layer, + weights_dtype=weights_dtype, + torch_dtype=torch_dtype, + group_size=self.quantization_config.group_size, + svd_rank=self.quantization_config.svd_rank, + use_svd=self.quantization_config.use_svd, + quant_conv=self.quantization_config.quant_conv, + use_quantized_matmul=self.quantization_config.use_quantized_matmul, + use_quantized_matmul_conv=self.quantization_config.use_quantized_matmul_conv, + dequantize_fp32=self.quantization_config.dequantize_fp32, + non_blocking=self.quantization_config.non_blocking, + quantization_device=None, + return_device=return_device, + param_name=param_name, + ) def adjust_max_memory(self, max_memory: Dict[str, Union[int, str]]) -> Dict[str, Union[int, str]]: max_memory = {key: val * 0.80 for key, val in max_memory.items()} @@ -620,31 +559,33 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): keep_in_fp32_modules: List[str] = None, **kwargs, # pylint: disable=unused-argument ): + if self.pre_quantized: + from accelerate import init_empty_weights + self.quantization_config.quantization_device = None + self.quantization_config.return_device = None + self.quantization_config.non_blocking = False + self.quantization_config.add_skip_keys = False + + quantization_config_dict = self.quantization_config.to_dict() + quantization_config_dict.pop("is_integer", None) + quantization_config_dict.pop("quant_method", None) + quantization_config_dict.pop("quantization_device", None) + quantization_config_dict.pop("return_device", None) + quantization_config_dict.pop("non_blocking", None) + quantization_config_dict.pop("add_skip_keys", None) + with init_empty_weights(): + model = sdnq_post_load_quant(model, add_skip_keys=False, **quantization_config_dict) + if self.quantization_config.add_skip_keys: if keep_in_fp32_modules is not None: - self.modules_to_not_convert.extend(keep_in_fp32_modules) - model, self.modules_to_not_convert, self.quantization_config.modules_dtype_dict = add_module_skip_keys( - model, self.modules_to_not_convert, self.quantization_config.modules_dtype_dict + self.quantization_config.modules_to_not_convert.extend(keep_in_fp32_modules) + model, self.quantization_config.modules_to_not_convert, self.quantization_config.modules_dtype_dict = add_module_skip_keys( + model, self.quantization_config.modules_to_not_convert, self.quantization_config.modules_dtype_dict ) - self.modules_to_not_convert.extend(self.quantization_config.modules_to_not_convert) - self.quantization_config.modules_to_not_convert = self.modules_to_not_convert if hasattr(model, "config"): model.config.quantization_config = self.quantization_config model.quantization_config = self.quantization_config - if self.pre_quantized and hasattr(model, "get_parameter_or_buffer"): - from functools import wraps - @wraps(model.get_parameter_or_buffer) - def get_parameter_or_buffer(self, target: str): - try: - return self.original_get_parameter_or_buffer(target) - except Exception as e: - if target.endswith(".scale") or target.endswith(".zero_point") or target.endswith(".svd_up") or target.endswith(".svd_down"): - return None - raise e - model.original_get_parameter_or_buffer = model.get_parameter_or_buffer - model.get_parameter_or_buffer = get_parameter_or_buffer.__get__(model, model.__class__) - def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument if shared.opts.diffusers_offload_mode != "none": model = model.to(devices.cpu) @@ -660,60 +601,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): """ return self.get_accelerator_warm_up_factor() - def update_unexpected_keys(self, model, unexpected_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - if not self.pre_quantized: - return unexpected_keys - new_unexpected_keys = [] - for key in unexpected_keys: - if not (key.endswith(".scale") or key.endswith(".zero_point") or key.endswith(".svd_up") or key.endswith(".svd_down")): - new_unexpected_keys.append(key) - return new_unexpected_keys - - def update_expected_keys(self, model, expected_keys: List[str], loaded_keys: list[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - if not self.pre_quantized: - return expected_keys - self.updated_expected_keys = True - for key in loaded_keys: - if key.endswith(".scale") or key.endswith(".zero_point") or key.endswith(".svd_up") or key.endswith(".svd_down"): - expected_keys.append(key) - return expected_keys - - def update_tp_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return config - - def update_ep_plan(self, config, *args, **kwargs): # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return config - - def update_missing_keys_after_loading(self, model, missing_keys: List[str], *args, **kwargs) -> List[str]: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return missing_keys - - def update_state_dict_with_metadata(self, state_dict: dict, *args, **kwargs) -> dict: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return state_dict - - def update_param_name(self, param_name: str, *args, **kwargs) -> str: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return param_name - - def update_dtype(self, dtype: torch.dtype, *args, **kwargs) -> torch.dtype: # pylint: disable=unused-argument - """ - needed for transformers compatibilty, no-op function - """ - return dtype - def _dequantize(self, model): model = dequantize_sdnq_model(model) if hasattr(model, "quantization_method"): From 32014fbb9d12f24685fcc52281a5d1271a560503 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 13 Oct 2025 10:03:59 -0400 Subject: [PATCH 209/230] seedvr requirements Signed-off-by: Vladimir Mandic --- modules/postprocess/seedvr_model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/postprocess/seedvr_model.py b/modules/postprocess/seedvr_model.py index fddeff557..84a49c22b 100644 --- a/modules/postprocess/seedvr_model.py +++ b/modules/postprocess/seedvr_model.py @@ -4,6 +4,7 @@ import numpy as np import torch from PIL import Image from torchvision.transforms import ToPILImage +from installer import install from modules import devices from modules.shared import opts, log from modules.upscaler import Upscaler, UpscalerData @@ -32,6 +33,7 @@ class UpscalerSeedVR(Upscaler): def load_model(self, path: str): model_name = MODELS_MAP.get(path, None) if (self.model is None) or (self.model_loaded != model_name): + install('rotary_embedding_torch') log.debug(f'Upscaler loading: name="{self.name}" model="{model_name}"') t0 = time.time() from modules.seedvr.src.core.model_manager import configure_runner From f3b4ef2551b3bb3cb21a604c20da5a49b478f4a3 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 13 Oct 2025 10:20:42 -0400 Subject: [PATCH 210/230] simplify seedvr depedencies Signed-off-by: Vladimir Mandic --- modules/postprocess/seedvr_model.py | 2 - modules/seedvr/rotary_embedding.py | 346 ++++++++++++++++++ .../src/common/distributed/meta_init_utils.py | 3 +- modules/seedvr/src/models/dit/rope.py | 3 +- modules/seedvr/src/models/dit_v2/rope.py | 2 +- 5 files changed, 349 insertions(+), 7 deletions(-) create mode 100644 modules/seedvr/rotary_embedding.py diff --git a/modules/postprocess/seedvr_model.py b/modules/postprocess/seedvr_model.py index 84a49c22b..fddeff557 100644 --- a/modules/postprocess/seedvr_model.py +++ b/modules/postprocess/seedvr_model.py @@ -4,7 +4,6 @@ import numpy as np import torch from PIL import Image from torchvision.transforms import ToPILImage -from installer import install from modules import devices from modules.shared import opts, log from modules.upscaler import Upscaler, UpscalerData @@ -33,7 +32,6 @@ class UpscalerSeedVR(Upscaler): def load_model(self, path: str): model_name = MODELS_MAP.get(path, None) if (self.model is None) or (self.model_loaded != model_name): - install('rotary_embedding_torch') log.debug(f'Upscaler loading: name="{self.name}" model="{model_name}"') t0 = time.time() from modules.seedvr.src.core.model_manager import configure_runner diff --git a/modules/seedvr/rotary_embedding.py b/modules/seedvr/rotary_embedding.py new file mode 100644 index 000000000..021ae9e52 --- /dev/null +++ b/modules/seedvr/rotary_embedding.py @@ -0,0 +1,346 @@ +from __future__ import annotations +from typing import Literal +from math import pi +import torch +from torch.amp import autocast +from torch.nn import Module +from torch import nn, einsum, broadcast_tensors, is_tensor, Tensor +from einops import rearrange, repeat + +# helper functions + +def exists(val): + return val is not None + +def default(val, d): + return val if exists(val) else d + +# broadcat, as tortoise-tts was using it + +def broadcat(tensors, dim = -1): + broadcasted_tensors = broadcast_tensors(*tensors) + return torch.cat(broadcasted_tensors, dim = dim) + +def slice_at_dim(t, dim_slice: slice, *, dim): + dim += (t.ndim if dim < 0 else 0) + colons = [slice(None)] * t.ndim + colons[dim] = dim_slice + return t[tuple(colons)] + +# rotary embedding helper functions + +def rotate_half(x): + x = rearrange(x, '... (d r) -> ... d r', r = 2) + x1, x2 = x.unbind(dim = -1) + x = torch.stack((-x2, x1), dim = -1) + return rearrange(x, '... d r -> ... (d r)') + +@autocast('cuda', enabled = False) +def apply_rotary_emb( + freqs, + t, + start_index = 0, + scale = 1., + seq_dim = -2, + freqs_seq_dim = None +): + dtype = t.dtype + + if not exists(freqs_seq_dim): + if freqs.ndim == 2 or t.ndim == 3: + freqs_seq_dim = 0 + + if t.ndim == 3 or exists(freqs_seq_dim): + seq_len = t.shape[seq_dim] + freqs = slice_at_dim(freqs, slice(-seq_len, None), dim = freqs_seq_dim) + + rot_dim = freqs.shape[-1] + end_index = start_index + rot_dim + + assert rot_dim <= t.shape[-1], f'feature dimension {t.shape[-1]} is not of sufficient size to rotate in all the positions {rot_dim}' + + # Split t into three parts: left, middle (to be transformed), and right + t_left = t[..., :start_index] + t_middle = t[..., start_index:end_index] + t_right = t[..., end_index:] + + # Apply rotary embeddings without modifying t in place + t_transformed = (t_middle * freqs.cos() * scale) + (rotate_half(t_middle) * freqs.sin() * scale) + out = torch.cat((t_left, t_transformed, t_right), dim=-1) + + return out.type(dtype) + +# learned rotation helpers + +def apply_learned_rotations(rotations, t, start_index = 0, freq_ranges = None): + if exists(freq_ranges): + rotations = einsum('..., f -> ... f', rotations, freq_ranges) + rotations = rearrange(rotations, '... r f -> ... (r f)') + + rotations = repeat(rotations, '... n -> ... (n r)', r = 2) + return apply_rotary_emb(rotations, t, start_index = start_index) + +# classes + +class RotaryEmbedding(Module): + def __init__( + self, + dim, + custom_freqs: Tensor | None = None, + freqs_for: Literal['lang', 'pixel', 'constant'] = 'lang', + theta = 10000, + max_freq = 10, + num_freqs = 1, + learned_freq = False, + use_xpos = False, + xpos_scale_base = 512, + interpolate_factor = 1., + theta_rescale_factor = 1., + seq_before_head_dim = False, + cache_if_possible = True, + cache_max_seq_len = 8192 + ): + super().__init__() + # proposed by reddit user bloc97, to rescale rotary embeddings to longer sequence length without fine-tuning + # has some connection to NTK literature + # https://www.reddit.com/r/LocalLLaMA/comments/14lz7j5/ntkaware_scaled_rope_allows_llama_models_to_have/ + + theta *= theta_rescale_factor ** (dim / (dim - 2)) + + self.freqs_for = freqs_for + + if exists(custom_freqs): + freqs = custom_freqs + elif freqs_for == 'lang': + freqs = 1. / (theta ** (torch.arange(0, dim, 2)[:(dim // 2)].float() / dim)) + elif freqs_for == 'pixel': + freqs = torch.linspace(1., max_freq / 2, dim // 2) * pi + elif freqs_for == 'constant': + freqs = torch.ones(num_freqs).float() + + self.cache_if_possible = cache_if_possible + self.cache_max_seq_len = cache_max_seq_len + + self.register_buffer('cached_freqs', torch.zeros(cache_max_seq_len, dim), persistent = False) + self.cached_freqs_seq_len = 0 + + self.freqs = nn.Parameter(freqs, requires_grad = learned_freq) # pylint: disable=possibly-used-before-assignment + + self.learned_freq = learned_freq + + # dummy for device + + self.register_buffer('dummy', torch.tensor(0), persistent = False) + + # default sequence dimension + + self.seq_before_head_dim = seq_before_head_dim + self.default_seq_dim = -3 if seq_before_head_dim else -2 + + # interpolation factors + + assert interpolate_factor >= 1. + self.interpolate_factor = interpolate_factor + + # xpos + + self.use_xpos = use_xpos + + if not use_xpos: + return + + scale = (torch.arange(0, dim, 2) + 0.4 * dim) / (1.4 * dim) + self.scale_base = xpos_scale_base + + self.register_buffer('scale', scale, persistent = False) + self.register_buffer('cached_scales', torch.zeros(cache_max_seq_len, dim), persistent = False) + self.cached_scales_seq_len = 0 + + # add apply_rotary_emb as static method + + self.apply_rotary_emb = staticmethod(apply_rotary_emb) + + @property + def device(self): + return self.dummy.device + + def get_seq_pos(self, seq_len, device = None, dtype = None, offset = 0): + device = default(device, self.device) + dtype = default(dtype, self.cached_freqs.dtype) + + return (torch.arange(seq_len, device = device, dtype = dtype) + offset) / self.interpolate_factor + + def rotate_queries_or_keys(self, t, seq_dim = None, offset = 0, scale = None): + seq_dim = default(seq_dim, self.default_seq_dim) + + assert not self.use_xpos or exists(scale), 'you must use `.rotate_queries_and_keys` method instead and pass in both queries and keys, for length extrapolatable rotary embeddings' + + device, dtype, seq_len = t.device, t.dtype, t.shape[seq_dim] + + seq = self.get_seq_pos(seq_len, device = device, dtype = dtype, offset = offset) + + freqs = self.forward(seq, seq_len = seq_len, offset = offset) + + if seq_dim == -3: + freqs = rearrange(freqs, 'n d -> n 1 d') + + return apply_rotary_emb(freqs, t, scale = default(scale, 1.), seq_dim = seq_dim) + + def rotate_queries_with_cached_keys(self, q, k, seq_dim = None, offset = 0): + dtype, device, seq_dim = q.dtype, q.device, default(seq_dim, self.default_seq_dim) + + q_len, k_len = q.shape[seq_dim], k.shape[seq_dim] + assert q_len <= k_len + + q_scale = k_scale = 1. + + if self.use_xpos: + seq = self.get_seq_pos(k_len, dtype = dtype, device = device) + + q_scale = self.get_scale(seq[-q_len:]).type(dtype) + k_scale = self.get_scale(seq).type(dtype) + + rotated_q = self.rotate_queries_or_keys(q, seq_dim = seq_dim, scale = q_scale, offset = k_len - q_len + offset) + rotated_k = self.rotate_queries_or_keys(k, seq_dim = seq_dim, scale = k_scale ** -1) + + rotated_q = rotated_q.type(q.dtype) + rotated_k = rotated_k.type(k.dtype) + + return rotated_q, rotated_k + + def rotate_queries_and_keys(self, q, k, seq_dim = None): + seq_dim = default(seq_dim, self.default_seq_dim) + + assert self.use_xpos + device, dtype, seq_len = q.device, q.dtype, q.shape[seq_dim] + + seq = self.get_seq_pos(seq_len, dtype = dtype, device = device) + + freqs = self.forward(seq, seq_len = seq_len) + scale = self.get_scale(seq, seq_len = seq_len).to(dtype) + + if seq_dim == -3: + freqs = rearrange(freqs, 'n d -> n 1 d') + scale = rearrange(scale, 'n d -> n 1 d') + + rotated_q = apply_rotary_emb(freqs, q, scale = scale, seq_dim = seq_dim) + rotated_k = apply_rotary_emb(freqs, k, scale = scale ** -1, seq_dim = seq_dim) + + rotated_q = rotated_q.type(q.dtype) + rotated_k = rotated_k.type(k.dtype) + + return rotated_q, rotated_k + + def get_scale( + self, + t: Tensor, + seq_len: int | None = None, + offset = 0 + ): + assert self.use_xpos + + should_cache = ( + self.cache_if_possible and + exists(seq_len) and + (offset + seq_len) <= self.cache_max_seq_len + ) + + if ( + should_cache and \ + exists(self.cached_scales) and \ + (seq_len + offset) <= self.cached_scales_seq_len + ): + return self.cached_scales[offset:(offset + seq_len)] + + scale = 1. + if self.use_xpos: + power = (t - len(t) // 2) / self.scale_base + scale = self.scale ** rearrange(power, 'n -> n 1') + scale = repeat(scale, 'n d -> n (d r)', r = 2) + + if should_cache and offset == 0: + self.cached_scales[:seq_len] = scale.detach() + self.cached_scales_seq_len = seq_len + + return scale + + def get_axial_freqs( + self, + *dims, + offsets: ( + tuple[int | float, ...] | + Tensor | + None + ) = None + ): + Colon = slice(None) + all_freqs = [] + + # handle offset + + if exists(offsets): + if not is_tensor(offsets): + offsets = torch.tensor(offsets) + + assert len(offsets) == len(dims) + + # get frequencies for each axis + + for ind, dim in enumerate(dims): + + offset = 0 + if exists(offsets): + offset = offsets[ind] + + if self.freqs_for == 'pixel': + pos = torch.linspace(-1, 1, steps = dim, device = self.device) + else: + pos = torch.arange(dim, device = self.device) + + pos = pos + offset + + freqs = self.forward(pos, seq_len = dim) + + all_axis = [None] * len(dims) + all_axis[ind] = Colon + + new_axis_slice = (Ellipsis, *all_axis, Colon) + all_freqs.append(freqs[new_axis_slice]) + + # concat all freqs + + all_freqs = broadcast_tensors(*all_freqs) + return torch.cat(all_freqs, dim = -1) + + @autocast('cuda', enabled = False) + def forward( + self, + t: Tensor, + seq_len: int | None = None, + offset = 0 + ): + should_cache = ( + self.cache_if_possible and + not self.learned_freq and + exists(seq_len) and + self.freqs_for != 'pixel' and + (offset + seq_len) <= self.cache_max_seq_len + ) + + if ( + should_cache and \ + exists(self.cached_freqs) and \ + (offset + seq_len) <= self.cached_freqs_seq_len + ): + return self.cached_freqs[offset:(offset + seq_len)].detach() + + freqs = self.freqs + + freqs = einsum('..., f -> ... f', t.type(freqs.dtype), freqs) + freqs = repeat(freqs, '... n -> ... (n r)', r = 2) + + if should_cache and offset == 0: + self.cached_freqs[:seq_len] = freqs.detach() + self.cached_freqs_seq_len = seq_len + + return freqs diff --git a/modules/seedvr/src/common/distributed/meta_init_utils.py b/modules/seedvr/src/common/distributed/meta_init_utils.py index 794cd0b81..9a6570646 100644 --- a/modules/seedvr/src/common/distributed/meta_init_utils.py +++ b/modules/seedvr/src/common/distributed/meta_init_utils.py @@ -13,9 +13,8 @@ # // limitations under the License. import torch -from rotary_embedding_torch import RotaryEmbedding from torch import nn -from torch.distributed.fsdp._common_utils import _is_fsdp_flattened +from ....rotary_embedding import RotaryEmbedding __all__ = ["meta_non_persistent_buffer_init_fn"] diff --git a/modules/seedvr/src/models/dit/rope.py b/modules/seedvr/src/models/dit/rope.py index 3aded8fed..35b91ea8b 100644 --- a/modules/seedvr/src/models/dit/rope.py +++ b/modules/seedvr/src/models/dit/rope.py @@ -16,10 +16,9 @@ from functools import lru_cache from typing import Tuple import torch from einops import rearrange -from rotary_embedding_torch import RotaryEmbedding, apply_rotary_emb from torch import nn - from ...common.cache import Cache +from ....rotary_embedding import RotaryEmbedding class RotaryEmbeddingBase(nn.Module): diff --git a/modules/seedvr/src/models/dit_v2/rope.py b/modules/seedvr/src/models/dit_v2/rope.py index 89d851792..3d294621c 100644 --- a/modules/seedvr/src/models/dit_v2/rope.py +++ b/modules/seedvr/src/models/dit_v2/rope.py @@ -16,9 +16,9 @@ from functools import lru_cache from typing import Optional, Tuple import torch from einops import rearrange -from rotary_embedding_torch import RotaryEmbedding, apply_rotary_emb from torch import nn from ...common.cache import Cache +from ....rotary_embedding import RotaryEmbedding, apply_rotary_emb class RotaryEmbeddingBase(nn.Module): From b601f0d402ec3838e03f9980e3bcb6db16daa2c2 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Oct 2025 00:15:09 +0300 Subject: [PATCH 211/230] SDNQ expose svd_steps and update module skip keys --- modules/lora/lora_apply.py | 1 + modules/model_quant.py | 8 +- modules/sdnq/common.py | 16 ++++ modules/sdnq/loader.py | 39 ++++----- modules/sdnq/quantizer.py | 173 ++++++++++++++++++++----------------- modules/shared.py | 1 + pipelines/model_qwen.py | 3 +- 7 files changed, 132 insertions(+), 109 deletions(-) diff --git a/modules/lora/lora_apply.py b/modules/lora/lora_apply.py index 2221fbf3e..f18922040 100644 --- a/modules/lora/lora_apply.py +++ b/modules/lora/lora_apply.py @@ -196,6 +196,7 @@ def network_add_weights(self: Union[torch.nn.Conv2d, torch.nn.Linear, torch.nn.G torch_dtype=devices.dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, svd_rank=shared.opts.sdnq_svd_rank, + svd_steps=shared.opts.sdnq_svd_steps, use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, diff --git a/modules/model_quant.py b/modules/model_quant.py index 5f88d3174..0bb72a75a 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -206,6 +206,7 @@ def create_sdnq_config(kwargs = None, allow: bool = True, module: str = 'Model', weights_dtype=weights_dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, svd_rank=shared.opts.sdnq_svd_rank, + svd_steps=shared.opts.sdnq_svd_steps, use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, @@ -217,7 +218,7 @@ def create_sdnq_config(kwargs = None, allow: bool = True, module: str = 'Model', modules_to_not_convert=modules_to_not_convert, modules_dtype_dict=modules_dtype_dict.copy(), ) - log.debug(f'Quantization: module="{module}" type=sdnq mode=pre dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') + log.debug(f'Quantization: module="{module}" type=sdnq mode=pre dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} svd_steps={shared.opts.sdnq_svd_steps} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') if kwargs is None: return sdnq_config else: @@ -525,6 +526,7 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh torch_dtype=devices.dtype, group_size=shared.opts.sdnq_quantize_weights_group_size, svd_rank=shared.opts.sdnq_svd_rank, + svd_steps=shared.opts.sdnq_svd_steps, use_svd=shared.opts.sdnq_use_svd, quant_conv=shared.opts.sdnq_quantize_conv_layers, use_quantized_matmul=shared.opts.sdnq_use_quantized_matmul, @@ -562,7 +564,7 @@ def sdnq_quantize_model(model, op=None, sd_model=None, do_gc: bool = True, weigh if do_gc: devices.torch_gc(force=True, reason='sdnq') - log.debug(f'Quantization: module="{op if op is not None else model.__class__}" type=sdnq mode=post dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') + log.debug(f'Quantization: module="{op if op is not None else model.__class__}" type=sdnq mode=post dtype={weights_dtype} matmul={shared.opts.sdnq_use_quantized_matmul} group_size={shared.opts.sdnq_quantize_weights_group_size} svd_rank={shared.opts.sdnq_svd_rank} svd_steps={shared.opts.sdnq_svd_steps} use_svd={shared.opts.sdnq_use_svd} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} quantization_device={quantization_device} return_device={return_device} device_map={shared.opts.device_map} offload_mode={shared.opts.diffusers_offload_mode} non_blocking={shared.opts.diffusers_offload_nonblocking} modules_to_not_convert={modules_to_not_convert} modules_dtype_dict={modules_dtype_dict}') return model @@ -570,7 +572,7 @@ def sdnq_quantize_weights(sd_model): try: t0 = time.time() from modules import shared, devices, sd_models - log.debug(f"Quantization: type=SDNQ modules={shared.opts.sdnq_quantize_weights} dtype={shared.opts.sdnq_quantize_weights_mode} dtype_te={shared.opts.sdnq_quantize_weights_mode_te} matmul={shared.opts.sdnq_use_quantized_matmul} svd_rank={shared.opts.sdnq_svd_rank} use_svd={shared.opts.sdnq_use_svd} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} pre_forward={shared.opts.diffusers_offload_pre}") + log.debug(f"Quantization: type=SDNQ modules={shared.opts.sdnq_quantize_weights} dtype={shared.opts.sdnq_quantize_weights_mode} dtype_te={shared.opts.sdnq_quantize_weights_mode_te} matmul={shared.opts.sdnq_use_quantized_matmul} svd_rank={shared.opts.sdnq_svd_rank} svd_steps={shared.opts.sdnq_svd_steps} use_svd={shared.opts.sdnq_use_svd} group_size={shared.opts.sdnq_quantize_weights_group_size} quant_conv={shared.opts.sdnq_quantize_conv_layers} matmul_conv={shared.opts.sdnq_use_quantized_matmul_conv} quantize_with_gpu={shared.opts.sdnq_quantize_with_gpu} dequantize_fp32={shared.opts.sdnq_dequantize_fp32} pre_forward={shared.opts.diffusers_offload_pre}") global quant_last_model_name, quant_last_model_device # pylint: disable=global-statement sd_model = sd_models.apply_function_to_model(sd_model, sdnq_quantize_model, shared.opts.sdnq_quantize_weights, op="sdnq") diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 57a4f0aaf..698a35633 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -80,3 +80,19 @@ if use_torch_compile: else: def compile_func(fn, **kwargs): # pylint: disable=unused-argument return fn + + +module_skip_keys_dict = { + "FluxTransformer2DModel": [ + ["single_transformer_blocks.0.norm.linear.weight", ".time_text_embed", ".context_embedder", ".x_embedder", ".proj_out", ".norm_out", "pos_embed"], + {} + ], + "ChromaTransformer2DModel": [ + ["distilled_guidance_layer", ".time_text_embed", ".context_embedder", ".x_embedder", ".proj_out", ".norm_out", "pos_embed"], + {} + ], + "QwenImageTransformer2DModel": [ + ["transformer_blocks.0.img_mod.1.weight", ".time_text_embed", ".txt_in", ".img_in", ".proj_out", ".norm_out", "pos_embed"], + {} + ], +} diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index e2ecce092..30a23dc70 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -10,46 +10,39 @@ from .dequantizer import dequantize_symmetric, re_quantize_int8, re_quantize_fp8 def get_module_names(model: ModelMixin) -> list: modules_names = model._internal_dict.keys() # pylint: disable=protected-access - modules_names = [m for m in modules_names if not m.startswith('_')] + modules_names = [m for m in modules_names if not m.startswith("_")] modules_names = [m for m in modules_names if isinstance(getattr(model, m, None), torch.nn.Module)] modules_names = sorted(set(modules_names)) return modules_names +def unset_config_on_save(config: SDNQConfig) -> SDNQConfig: + config.quantization_config.quantization_device = None + config.quantization_config.return_device = None + config.quantization_config.non_blocking = False + config.quantization_config.add_skip_keys = False + return config + + def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", is_pipeline: bool = False, sdnq_config: SDNQConfig = None) -> None: if is_pipeline: for module_name in get_module_names(model): module = getattr(model, module_name, None) if hasattr(module, "config") and hasattr(module.config, "quantization_config") and isinstance(module.config.quantization_config, SDNQConfig): - module.config.quantization_config.quantization_device = None - module.config.quantization_config.return_device = None - module.config.quantization_config.non_blocking = False - module.config.quantization_config.add_skip_keys = False + module.config.quantization_config = unset_config_on_save(module.config.quantization_config) if hasattr(module, "quantization_config") and isinstance(module.quantization_config, SDNQConfig): - module.quantization_config.quantization_device = None - module.quantization_config.return_device = None - module.quantization_config.non_blocking = False - module.quantization_config.add_skip_keys = False + module.quantization_config = unset_config_on_save(module.quantization_config) else: if hasattr(model, "config") and hasattr(model.config, "quantization_config") and isinstance(model.config.quantization_config, SDNQConfig): - model.config.quantization_config.quantization_device = None - model.config.quantization_config.return_device = None - model.config.quantization_config.non_blocking = False - model.config.quantization_config.add_skip_keys = False + model.config.quantization_config = unset_config_on_save(model.config.quantization_config) if hasattr(model, "quantization_config") and isinstance(model.quantization_config, SDNQConfig): - model.quantization_config.quantization_device = None - model.quantization_config.return_device = None - model.quantization_config.non_blocking = False - model.quantization_config.add_skip_keys = False + model.quantization_config = unset_config_on_save(model.quantization_config) model.save_pretrained(model_path, max_shard_size=max_shard_size) # actual save quantization_config_path = os.path.join(model_path, "quantization_config.json") if sdnq_config is not None: # if provided, save global config - sdnq_config.quantization_device = None - sdnq_config.return_device = None - sdnq_config.non_blocking = False - sdnq_config.add_skip_keys = False + sdnq_config = unset_config_on_save(sdnq_config) sdnq_config.to_json_file(quantization_config_path) if is_pipeline: @@ -69,7 +62,7 @@ def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "1 model.config.quantization_config.to_json_file(quantization_config_path) -def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = 'cpu', dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: +def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: str = None, dtype: torch.dtype = None, device: torch.device = "cpu", dequantize_fp32: bool = None, use_quantized_matmul: bool = None, model_config: dict = None, quantization_config: dict = None) -> ModelMixin: from accelerate import init_empty_weights from safetensors.torch import safe_open @@ -83,7 +76,7 @@ def load_sdnq_model(model_path: str, model_cls: ModelMixin = None, file_name: st if model_config is None: try: - with open(os.path.join(model_path, 'config.json'), "r", encoding="utf-8") as f: + with open(os.path.join(model_path, "config.json"), "r", encoding="utf-8") as f: model_config = json.load(f) except Exception: model_config = {} diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 68d1c355a..b4e60a704 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -12,7 +12,7 @@ from diffusers.quantizers.quantization_config import QuantizationConfigMixin from diffusers.utils import get_module_from_name from modules import devices, shared -from .common import dtype_dict, accepted_weights, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm +from .common import dtype_dict, module_skip_keys_dict, accepted_weights, use_tensorwise_fp8_matmul, allowed_types, conv_types, conv_transpose_types, use_contiguous_mm from .dequantizer import dequantizer_dict, dequantize_sdnq_model from .forward import get_forward_func @@ -49,13 +49,13 @@ def quantize_weight(weight: torch.FloatTensor, reduction_axes: Union[int, List[i return quantized_weight, scale, zero_point -def apply_svdquant(weight: torch.FloatTensor, rank: int = 32) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: +def apply_svdquant(weight: torch.FloatTensor, rank: int = 32, niter: int = 8) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]: reshape_weight = False if weight.ndim > 2: # convs reshape_weight = True weight_shape = weight.shape weight = weight.flatten(1,-1) - U, S, svd_down = torch.svd_lowrank(weight, q=rank) + U, S, svd_down = torch.svd_lowrank(weight, q=rank, niter=niter) svd_up = torch.mul(U, S.unsqueeze(0)) svd_down = svd_down.t_() weight = weight.sub_(torch.mm(svd_up, svd_down)) @@ -64,8 +64,79 @@ def apply_svdquant(weight: torch.FloatTensor, rank: int = 32) -> Tuple[torch.Flo return weight, svd_up, svd_down +def check_param_name_in(param_name: str, param_list: List[str]) -> bool: + split_param_name = param_name.split(".") + for param in param_list: + if param.startswith("."): + if param_name.startswith(param[1:]): + return True + else: + continue + if ( + param_name == param + or param in split_param_name + or ("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name)) + ): + return True + return False + + +def get_minimum_dtype(weights_dtype: str, param_name: str, modules_dtype_dict: Dict[str, List[str]]): + if len(modules_dtype_dict.keys()) > 0: + for key, value in modules_dtype_dict.items(): + if check_param_name_in(param_name, value): + key = key.lower() + if key in {"8bit", "8bits"}: + if dtype_dict[weights_dtype]["num_bits"] != 8: + return "int8" + elif key.startswith("minimum_"): + minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") + if minimum_bits_str.startswith("uint"): + is_unsigned = True + minimum_bits_str = minimum_bits_str.removeprefix("uint") + else: + is_unsigned = False + minimum_bits_str = minimum_bits_str.removeprefix("int") + minimum_bits = int(minimum_bits_str) + if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: + if is_unsigned or minimum_bits <= 4: + return "uint" + minimum_bits_str + else: + return "int" + minimum_bits_str + else: + return key + return weights_dtype + + +def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None): + if modules_to_not_convert is None: + modules_to_not_convert = [] + if modules_dtype_dict is None: + modules_dtype_dict = {} + if getattr(model, "_keep_in_fp32_modules", None) is not None: + modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access + + skip_key_list = module_skip_keys_dict.get(model.__class__.__name__, None) + if skip_key_list is not None: + modules_to_not_convert.extend(skip_key_list[0]) + for key, value in skip_key_list[1].items(): + if key in modules_dtype_dict.keys(): + modules_dtype_dict[key].extend(value) + else: + modules_dtype_dict[key] = value + elif getattr(model, "_skip_layerwise_casting_patterns", None) is not None: + modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access + + # dedupe + modules_to_not_convert = list(set(modules_to_not_convert)) + for key, value in modules_dtype_dict.items(): + modules_dtype_dict[key] = list(set(value)) + + return model, modules_to_not_convert, modules_dtype_dict + + @devices.inference_context() -def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument +def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, svd_steps=8, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, param_name=None): # pylint: disable=unused-argument layer_class_name = layer.__class__.__name__ if layer_class_name in allowed_types: num_of_groups = 1 @@ -128,7 +199,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz layer.weight.data = layer.weight.to(dtype=torch.float32) if use_svd: - layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank) + layer.weight.data, svd_up, svd_down = apply_svdquant(layer.weight, rank=svd_rank, niter=svd_steps) if use_quantized_matmul: svd_up = svd_up.t_() svd_down = svd_down.t_() @@ -237,7 +308,7 @@ def sdnq_quantize_layer(layer, weights_dtype="int8", torch_dtype=None, group_siz return layer -def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, full_param_name="", op=None): # pylint: disable=unused-argument +def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_size=0, svd_rank=32, svd_steps=8, use_svd=False, quant_conv=False, use_quantized_matmul=False, use_quantized_matmul_conv=False, dequantize_fp32=False, non_blocking=False, quantization_device=None, return_device=None, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None, full_param_name="", op=None): # pylint: disable=unused-argument has_children = list(model.children()) if not has_children: return model @@ -252,12 +323,7 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si param_name = full_param_name + "." + param_name if hasattr(module, "weight") and module.weight is not None: param_name = param_name + ".weight" - split_param_name = param_name.split(".") - if ( - param_name in modules_to_not_convert - or any(param in split_param_name for param in modules_to_not_convert) - or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in modules_to_not_convert) - ): + if check_param_name_in(param_name, modules_to_not_convert): continue layer_class_name = module.__class__.__name__ if layer_class_name in allowed_types: @@ -265,33 +331,15 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si continue else: continue - if len(modules_dtype_dict.keys()) > 0: - for key, value in modules_dtype_dict.items(): - if ( - param_name in value - or any(param in split_param_name for param in value) - or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in value) - ): - key = key.lower() - if key in {"8bit", "8bits"}: - if dtype_dict[weights_dtype]["num_bits"] != 8: - weights_dtype = "int8" - elif key.startswith("minimum_"): - minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") - minimum_bits = int(minimum_bits_str) - if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: - weights_dtype = "int" + minimum_bits_str - if minimum_bits <= 4: - weights_dtype = "u" + weights_dtype - else: - weights_dtype = key + weights_dtype = get_minimum_dtype(weights_dtype, param_name, modules_dtype_dict) module = sdnq_quantize_layer( module, weights_dtype=weights_dtype, torch_dtype=torch_dtype, group_size=group_size, svd_rank=svd_rank, + svd_steps=svd_steps, use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, @@ -308,6 +356,7 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si torch_dtype=torch_dtype, group_size=group_size, svd_rank=svd_rank, + svd_steps=svd_steps, use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, @@ -324,32 +373,13 @@ def apply_sdnq_to_module(model, weights_dtype="int8", torch_dtype=None, group_si return model -def add_module_skip_keys(model, modules_to_not_convert: List[str] = None, modules_dtype_dict: Dict[str, List[str]] = None): - if modules_to_not_convert is None: - modules_to_not_convert = [] - if modules_dtype_dict is None: - modules_dtype_dict = {} - if getattr(model, "_keep_in_fp32_modules", None) is not None: - modules_to_not_convert.extend(model._keep_in_fp32_modules) # pylint: disable=protected-access - if getattr(model, "_skip_layerwise_casting_patterns", None) is not None: - modules_to_not_convert.extend(model._skip_layerwise_casting_patterns) # pylint: disable=protected-access - if model.__class__.__name__ == "ChromaTransformer2DModel": - modules_to_not_convert.append("distilled_guidance_layer") - elif model.__class__.__name__ == "QwenImageTransformer2DModel": - modules_to_not_convert.extend(["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"]) - if "minimum_6bit" not in modules_dtype_dict.keys(): - modules_dtype_dict["minimum_6bit"] = ["img_mod"] - else: - modules_dtype_dict["minimum_6bit"].append("img_mod") - return model, modules_to_not_convert, modules_dtype_dict - - def sdnq_post_load_quant( model, weights_dtype="int8", torch_dtype: torch.dtype = None, group_size: int = 0, svd_rank: int = 32, + svd_steps: int = 8, use_svd: bool = False, quant_conv: bool = False, use_quantized_matmul: bool = False, @@ -373,6 +403,7 @@ def sdnq_post_load_quant( torch_dtype=torch_dtype, group_size=group_size, svd_rank=svd_rank, + svd_steps=svd_steps, use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, @@ -389,6 +420,7 @@ def sdnq_post_load_quant( weights_dtype=weights_dtype, group_size=group_size, svd_rank=svd_rank, + svd_steps=svd_steps, use_svd=use_svd, quant_conv=quant_conv, use_quantized_matmul=use_quantized_matmul, @@ -433,12 +465,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): if hasattr(layer, "sdnq_dequantizer"): return True elif param_name.endswith(".weight"): - split_param_name = param_name.split(".") - if ( - param_name not in self.quantization_config.modules_to_not_convert - and not any(param in split_param_name for param in self.quantization_config.modules_to_not_convert) - and not any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in self.quantization_config.modules_to_not_convert) - ): + if not check_param_name_in(param_name, self.quantization_config.modules_to_not_convert): layer_class_name = get_module_from_name(model, param_name)[0].__class__.__name__ if layer_class_name in allowed_types: if layer_class_name in conv_types or layer_class_name in conv_transpose_types: @@ -485,28 +512,8 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): setattr(layer, tensor_name, param_value) return - weights_dtype = self.quantization_config.weights_dtype - if len(self.quantization_config.modules_dtype_dict.keys()) > 0: - split_param_name = param_name.split(".") - for key, value in self.quantization_config.modules_dtype_dict.items(): - if ( - param_name in value - or any(param in split_param_name for param in value) - or any("*" in param and re.match(param.replace(".*", "\\.*").replace("*", ".*"), param_name) for param in value) - ): - key = key.lower() - if key in {"8bit", "8bits"}: - if dtype_dict[weights_dtype]["num_bits"] != 8: - weights_dtype = "int8" - elif key.startswith("minimum_"): - minimum_bits_str = key.removeprefix("minimum_").removesuffix("bits").removesuffix("bit") - minimum_bits = int(minimum_bits_str) - if dtype_dict[weights_dtype]["num_bits"] < minimum_bits: - weights_dtype = "int" + minimum_bits_str - if minimum_bits <= 4: - weights_dtype = "u" + weights_dtype - else: - weights_dtype = key + torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype + weights_dtype = get_minimum_dtype(self.quantization_config.weights_dtype, param_name, self.quantization_config.modules_dtype_dict) if self.quantization_config.return_device is not None: return_device = self.quantization_config.return_device @@ -516,7 +523,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): if self.quantization_config.quantization_device is not None: target_device = self.quantization_config.quantization_device - torch_dtype = param_value.dtype if self.torch_dtype is None else self.torch_dtype if param_value.dtype == torch.float32 and devices.same_device(param_value.device, target_device): param_value = param_value.clone() else: @@ -530,6 +536,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): torch_dtype=torch_dtype, group_size=self.quantization_config.group_size, svd_rank=self.quantization_config.svd_rank, + svd_steps=self.quantization_config.svd_steps, use_svd=self.quantization_config.use_svd, quant_conv=self.quantization_config.quant_conv, use_quantized_matmul=self.quantization_config.use_quantized_matmul, @@ -638,6 +645,8 @@ class SDNQConfig(QuantizationConfigMixin): group_size = 0 will automatically select a group size based on weights_dtype. svd_rank (`int`, *optional*, defaults to `32`): The rank size used for the SVDQuant algorithm. + svd_steps (`int`, *optional*, defaults to `8`): + The number of iterations to use in svd lowrank estimation. use_svd (`bool`, *optional*, defaults to `False`): Enabling this option will use SVDQuant algorithm on top of SDNQ quantization. quant_conv (`bool`, *optional*, defaults to `False`): @@ -668,6 +677,7 @@ class SDNQConfig(QuantizationConfigMixin): weights_dtype: str = "int8", group_size: int = 0, svd_rank: int = 32, + svd_steps: int = 8, use_svd: bool = False, quant_conv: bool = False, use_quantized_matmul: bool = False, @@ -685,6 +695,7 @@ class SDNQConfig(QuantizationConfigMixin): self.quant_method = QuantizationMethod.SDNQ self.group_size = group_size self.svd_rank = svd_rank + self.svd_steps = svd_steps self.use_svd = use_svd self.quant_conv = quant_conv self.use_quantized_matmul = use_quantized_matmul diff --git a/modules/shared.py b/modules/shared.py index f987cdeb8..0c3315f26 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -202,6 +202,7 @@ options_templates.update(options_section(("quantization", "Model Quantization"), "sdnq_modules_dtype_dict": OptionInfo("{}", "Modules dtype dict"), "sdnq_quantize_weights_group_size": OptionInfo(0, "Group size", gr.Slider, {"minimum": -1, "maximum": 4096, "step": 1}), "sdnq_svd_rank": OptionInfo(32, "SVDQuant Rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), + "sdnq_svd_steps": OptionInfo(8, "SVDQuant quantization steps", gr.Slider, {"minimum": 1, "maximum": 128, "step": 1}), "sdnq_use_svd": OptionInfo(False, "Use SVDQuant quantization", gr.Checkbox), "sdnq_quantize_conv_layers": OptionInfo(False, "Quantize convolutional layers", gr.Checkbox), "sdnq_dequantize_compile": OptionInfo(devices.has_triton(), "Dequantize using torch.compile", gr.Checkbox), diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index d9a98d9be..08faf5624 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -49,8 +49,7 @@ def load_qwen(checkpoint_info, diffusers_load_config={}): subfolder=transformer_subfolder, cls_name=diffusers.QwenImageTransformer2DModel, load_config=diffusers_load_config, - modules_dtype_dict={"minimum_6bit": ["img_mod"]}, - modules_to_not_convert=["transformer_blocks.0.img_mod.1.weight", "time_text_embed", "img_in", "txt_in", "proj_out", "norm_out", "pos_embed"], + modules_to_not_convert=["transformer_blocks.0.img_mod.1.weight"], ) repo_te = 'Qwen/Qwen-Image' From db9297244c52bf54ff9f07fbf283eb2cd7edb980 Mon Sep 17 00:00:00 2001 From: Nolan GILBERT <115945238+nolbert82@users.noreply.github.com> Date: Tue, 14 Oct 2025 01:07:48 +0200 Subject: [PATCH 212/230] Fixed prompt scheduling + uses TE once per batch --- modules/prompt_parser_diffusers.py | 68 ++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/modules/prompt_parser_diffusers.py b/modules/prompt_parser_diffusers.py index 31947ee7b..738737443 100644 --- a/modules/prompt_parser_diffusers.py +++ b/modules/prompt_parser_diffusers.py @@ -59,12 +59,12 @@ class PromptEmbedder: self.steps = steps self.clip_skip = clip_skip # All embeds are nested lists, outer list batch length, inner schedule length - self.prompt_embeds = [[]] * self.batchsize - self.positive_pooleds = [[]] * self.batchsize - self.negative_prompt_embeds = [[]] * self.batchsize - self.negative_pooleds = [[]] * self.batchsize - self.prompt_attention_masks = [[]] * self.batchsize - self.negative_prompt_attention_masks = [[]] * self.batchsize + self.prompt_embeds = [[] for _ in range(self.batchsize)] + self.positive_pooleds = [[] for _ in range(self.batchsize)] + self.negative_prompt_embeds = [[] for _ in range(self.batchsize)] + self.negative_pooleds = [[] for _ in range(self.batchsize)] + self.prompt_attention_masks = [[] for _ in range(self.batchsize)] + self.negative_prompt_attention_masks = [[] for _ in range(self.batchsize)] self.positive_schedule = None self.negative_schedule = None self.scheduled_prompt = False @@ -77,13 +77,25 @@ class PromptEmbedder: if self.pipe is None: shared.log.error("Prompt encode: cannot find text encoder in model") return + seen_prompts = {} # per prompt in batch for batchidx, (prompt, negative_prompt) in enumerate(zip(self.prompts, self.negative_prompts)): self.prepare_schedule(prompt, negative_prompt) + schedule_key = ( + tuple(self.positive_schedule) if self.positive_schedule is not None else None, + tuple(self.negative_schedule) if self.negative_schedule is not None else None, + self.scheduled_prompt, + ) + cache_key = (prompt, negative_prompt, schedule_key) + cached_idx = seen_prompts.get(cache_key) + if cached_idx is not None: + self.clone_embeds(batchidx, cached_idx) + continue if self.scheduled_prompt: self.scheduled_encode(self.pipe, batchidx) else: self.encode(self.pipe, prompt, negative_prompt, batchidx) + seen_prompts[cache_key] = batchidx self.checkcache(p) debug(f"Prompt encode: time={(time.time() - t0):.3f}") @@ -207,22 +219,42 @@ class PromptEmbedder: negative_pooled, negative_prompt_attention_mask ) = get_weighted_text_embeddings(pipe, positive_prompt, negative_prompt, self.clip_skip) - if prompt_embed is not None: - self.prompt_embeds[batchidx] = [prompt_embed] - if negative_embed is not None: - self.negative_prompt_embeds[batchidx] = [negative_embed] - if positive_pooled is not None: - self.positive_pooleds[batchidx] = [positive_pooled] - if negative_pooled is not None: - self.negative_pooleds[batchidx] = [negative_pooled] - if prompt_attention_mask is not None: - self.prompt_attention_masks[batchidx] = [prompt_attention_mask] - if negative_prompt_attention_mask is not None: - self.negative_prompt_attention_masks[batchidx] = [negative_prompt_attention_mask] + def _store(target, value): + if value is None: + return + # scheduled prompts need to keep all slices, unscheduled can overwrite + if self.scheduled_prompt and len(target[batchidx]) > 0: + target[batchidx].append(value) + else: + target[batchidx] = [value] + + _store(self.prompt_embeds, prompt_embed) + _store(self.negative_prompt_embeds, negative_embed) + _store(self.positive_pooleds, positive_pooled) + _store(self.negative_pooleds, negative_pooled) + _store(self.prompt_attention_masks, prompt_attention_mask) + _store(self.negative_prompt_attention_masks, negative_prompt_attention_mask) if debug_enabled: get_tokens(pipe, 'positive', positive_prompt) get_tokens(pipe, 'negative', negative_prompt) + def clone_embeds(self, batchidx, idx): + def _clone(target): + if len(target) <= idx: + return + src = target[idx] + if isinstance(src, list): + target[batchidx] = [item if not isinstance(item, list) else list(item) for item in src] + else: + target[batchidx] = src + + _clone(self.prompt_embeds) + _clone(self.negative_prompt_embeds) + _clone(self.positive_pooleds) + _clone(self.negative_pooleds) + _clone(self.prompt_attention_masks) + _clone(self.negative_prompt_attention_masks) + def __call__(self, key, step=0): batch = getattr(self, key) res = [] From b626ce059e99001917a7007f21df434a8a4fa298 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 14 Oct 2025 09:24:18 -0400 Subject: [PATCH 213/230] update chainner Signed-off-by: Vladimir Mandic --- extensions-builtin/sd-extension-chainner | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sd-extension-chainner b/extensions-builtin/sd-extension-chainner index 3e0108fed..da7a2bd55 160000 --- a/extensions-builtin/sd-extension-chainner +++ b/extensions-builtin/sd-extension-chainner @@ -1 +1 @@ -Subproject commit 3e0108fedbec300f72c3ca6e06236419d45eb660 +Subproject commit da7a2bd553b81d66fab21c2f12559439a36e844c From a0e8b04ec67b2021c99fea3f06ce6ee5ecf94f30 Mon Sep 17 00:00:00 2001 From: Nolan GILBERT <115945238+nolbert82@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:25:28 +0200 Subject: [PATCH 214/230] Fix empty prompt overriding --- modules/generation_parameters_copypaste.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/generation_parameters_copypaste.py b/modules/generation_parameters_copypaste.py index a2f38b94e..1427e53cc 100644 --- a/modules/generation_parameters_copypaste.py +++ b/modules/generation_parameters_copypaste.py @@ -229,6 +229,11 @@ def connect_paste(button, local_paste_fields, input_comp, override_settings_comp res.append(v) applied[key] = v else: + if isinstance(v, str) and v.strip() == '' and key in {'Prompt', 'Negative prompt'}: + debug(f'Paste skip empty: "{key}"') + res.append(gr.update()) + skipped[key] = v + continue if should_skip(key): debug(f'Paste skip: "{key}"="{v}"') res.append(gr.update()) From 57230bbf3a3e711cdab07aefbb91cc2d6b36d937 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 14 Oct 2025 09:35:00 -0400 Subject: [PATCH 215/230] update seedvr-7b config Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- modules/seedvr/config_7b.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 860ba0038..e2dd66d08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-10-12 +## Update for 2025-10-14 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -134,6 +134,7 @@ - **Microsoft Florence 2** both base and large variants *note* this will trigger download of the new variant of the model, feel free to delete older variant in `huggingface` folder - **MiaoshouAI PromptGen** 1.5/2.0 in both base and large variants + - fix prompt scheduling, thanks @nolbert82 - ui: fix image metadata display when switching selected image in control tab - framepack: add explicit hf-login before framepack load - framepack: patch solver for unsupported gpus diff --git a/modules/seedvr/config_7b.yaml b/modules/seedvr/config_7b.yaml index d3097c43a..61803415d 100644 --- a/modules/seedvr/config_7b.yaml +++ b/modules/seedvr/config_7b.yaml @@ -48,7 +48,7 @@ vae: path: - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - "SeedVR2_VideoUpscaler.src.models.video_vae_v3.modules.attn_video_vae" - - "src.models.video_vae_v3.modules.attn_video_vae" + - "modules.seedvr.src.models.video_vae_v3.modules.attn_video_vae" name: "VideoAutoencoderKLWrapper" args: "as_params" freeze_encoder: False From 4aee524ddfebfd280ba22484a3d283e40c8c31de Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Oct 2025 17:18:58 +0300 Subject: [PATCH 216/230] SDNQ add NaDiT keys --- modules/sdnq/common.py | 6 ++++++ modules/seedvr/config_7b.yaml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 698a35633..c5ff8ab9a 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -95,4 +95,10 @@ module_skip_keys_dict = { ["transformer_blocks.0.img_mod.1.weight", ".time_text_embed", ".txt_in", ".img_in", ".proj_out", ".norm_out", "pos_embed"], {} ], + "NaDiT": [ + [".emb_in", ".txt_in", ".vid_in", ".emb_scale", ".vid_out", ".vid_out_norm", ".vid_out_ada"], + {} + ], } + +module_skip_keys_dict["NaDiTUpscaler"] = module_skip_keys_dict["NaDiT"] diff --git a/modules/seedvr/config_7b.yaml b/modules/seedvr/config_7b.yaml index 61803415d..0e5cb146c 100644 --- a/modules/seedvr/config_7b.yaml +++ b/modules/seedvr/config_7b.yaml @@ -8,7 +8,7 @@ dit: path: - "SeedVR2_VideoUpscaler.src.models.dit.nadit" - "SeedVR2_VideoUpscaler.src.models.dit.nadit" - - "src.models.dit.nadit" + - "modules.seedvr.src.models.dit.nadit" name: "NaDiT" args: "as_params" vid_in_channels: 33 From 85a58ed5bf1d9854dd24f969cb4b72a69afc7b8a Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 14 Oct 2025 10:23:12 -0400 Subject: [PATCH 217/230] seedvr enable quant Signed-off-by: Vladimir Mandic --- modules/postprocess/seedvr_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/postprocess/seedvr_model.py b/modules/postprocess/seedvr_model.py index fddeff557..577d8609f 100644 --- a/modules/postprocess/seedvr_model.py +++ b/modules/postprocess/seedvr_model.py @@ -57,9 +57,9 @@ class UpscalerSeedVR(Upscaler): self.model.dit.config = self.model.config.dit self.model.vae.tile_sample_min_size = 1024 self.model.vae.tile_latent_min_size = 128 - # from modules.model_quant import do_post_load_quant + from modules.model_quant import do_post_load_quant + self.model = do_post_load_quant(self.model, allow=True) # from modules.sd_offload import set_diffuser_offload - # self.model = do_post_load_quant(self.model, allow=True) # set_diffuser_offload(self.model) log.info(f'Upscaler loaded: name="{self.name}" model="{model_name}" time={t1 - t0:.2f}') From ac4c607d2952f04d2610436b430ec89290d03705 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 14 Oct 2025 10:35:15 -0400 Subject: [PATCH 218/230] update changelog Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2dd66d08..2a0af3ba9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ ## Update for 2025-10-14 +### Highlights for 2025-10-14 + +It's been a month since the last release and number of changes is yet again massive with over 250 commits! +Highlight are: +- **Torch**: ROCm on Windows for AMD GPUs + if you have a compatible GPU, performance gains are significant! +- **Models**: + new WAN variants, a lot of new stuff with Qwen Image Edit including multi-image edits, expanded Nunchaku support and new SOTA upscaler with SeedVR2 + plus improved video support in general, including new methods of video encoding +- **Quantization**: + new **SVD**-style quantization using SDNQ ofers almost zero loss even with **4bit** quantization + and now you can also test your favorite quantization on-the-fly and then save/load model for future use + +### Details for 2025-10-14 + - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) available for *text-to-image* and *text-to-video* and *image-to-video* workflows @@ -19,10 +34,9 @@ updated version of E1 image editing model - [SeedVR2](https://iceclear.github.io/projects/seedvr/) originally designed for video restoration, seedvr works great for image detailing and upscaling! - available in 3B, 7B and 7B-sharp variants - use as any other upscaler! - note: seedvr is a very large model (6.4GB and 16GB respectively) and not designed for lower-end hardware - note: seedvr is highly sensitive to its cfg scale (set in settings -> postprocessing), + available in 3B, 7B and 7B-sharp variants, use as any other upscaler! + note: seedvr is a very large model (6.4GB and 16GB respectively) and not designed for lower-end hardware, quantization is highly recommended + note: seedvr is highly sensitive to its cfg scale, set in *settings -> postprocessing* lower values will result in smoother output while higher values add details - [X-Omni SFT](https://x-omni-team.github.io/) *experimental*: X-omni is a transformer-only discrete autoregressive image generative model trained with reinforcement learning @@ -101,7 +115,7 @@ - **video** new LTX model selection - replace `pynvml` with `nvidia-ml-py` for gpu monitoring - update **loopback** script with radon seed option, thanks @rabanti - - **vae** slicing enable for lowvram/medvram, tiling for lowvram, both disabled otherwise + - **vae** slicing enable for *lowvram/medvram*, tiling for *lowvram*, both disabled otherwise - **attention** remove split-attention and add explicitly attention slicing enable/disable option enable in *settings -> compute settings* can be combined with sdp, enabling may improve stability when used on iGPU or shared memory systems From 6d64f4a2fde7da3a546d6b6629cb279a1fcc6763 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Oct 2025 17:48:01 +0300 Subject: [PATCH 219/230] rename svd options --- modules/shared.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index 0c3315f26..3cca72294 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -201,9 +201,9 @@ options_templates.update(options_section(("quantization", "Model Quantization"), "sdnq_modules_to_not_convert": OptionInfo("", "Modules to not convert"), "sdnq_modules_dtype_dict": OptionInfo("{}", "Modules dtype dict"), "sdnq_quantize_weights_group_size": OptionInfo(0, "Group size", gr.Slider, {"minimum": -1, "maximum": 4096, "step": 1}), - "sdnq_svd_rank": OptionInfo(32, "SVDQuant Rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), - "sdnq_svd_steps": OptionInfo(8, "SVDQuant quantization steps", gr.Slider, {"minimum": 1, "maximum": 128, "step": 1}), - "sdnq_use_svd": OptionInfo(False, "Use SVDQuant quantization", gr.Checkbox), + "sdnq_svd_rank": OptionInfo(32, "SVD rank size", gr.Slider, {"minimum": 1, "maximum": 512, "step": 1}), + "sdnq_svd_steps": OptionInfo(8, "SVD steps", gr.Slider, {"minimum": 1, "maximum": 128, "step": 1}), + "sdnq_use_svd": OptionInfo(False, "Use SVD quantization", gr.Checkbox), "sdnq_quantize_conv_layers": OptionInfo(False, "Quantize convolutional layers", gr.Checkbox), "sdnq_dequantize_compile": OptionInfo(devices.has_triton(), "Dequantize using torch.compile", gr.Checkbox), "sdnq_use_quantized_matmul": OptionInfo(False, "Use quantized MatMul", gr.Checkbox), From 845869079d9ab56e3d3bff68e260ac2f0e86d2f1 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Tue, 14 Oct 2025 17:58:09 +0300 Subject: [PATCH 220/230] Fix sdnq unset config --- modules/sdnq/loader.py | 12 ++++++------ wiki | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/sdnq/loader.py b/modules/sdnq/loader.py index 30a23dc70..88d8140a7 100644 --- a/modules/sdnq/loader.py +++ b/modules/sdnq/loader.py @@ -16,12 +16,12 @@ def get_module_names(model: ModelMixin) -> list: return modules_names -def unset_config_on_save(config: SDNQConfig) -> SDNQConfig: - config.quantization_config.quantization_device = None - config.quantization_config.return_device = None - config.quantization_config.non_blocking = False - config.quantization_config.add_skip_keys = False - return config +def unset_config_on_save(quantization_config: SDNQConfig) -> SDNQConfig: + quantization_config.quantization_device = None + quantization_config.return_device = None + quantization_config.non_blocking = False + quantization_config.add_skip_keys = False + return quantization_config def save_sdnq_model(model: ModelMixin, model_path: str, max_shard_size: str = "10GB", is_pipeline: bool = False, sdnq_config: SDNQConfig = None) -> None: diff --git a/wiki b/wiki index be337fb3e..bf77a802d 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit be337fb3e02048113e97515aceced6b3c67eb3d9 +Subproject commit bf77a802db032e2f5a48c379088f35cdadd76a8b From 61f8f32cb3261651a5c20ef331bfb6fabdd694de Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 15 Oct 2025 11:09:36 -0400 Subject: [PATCH 221/230] update changelog and readme Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 48 +++++++++++++++++++++++++----------------------- README.md | 10 +++++----- wiki | 2 +- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a0af3ba9..0b41b3816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,22 @@ # Change Log for SD.Next -## Update for 2025-10-14 +## Update for 2025-10-15 -### Highlights for 2025-10-14 +### Highlights for 2025-10-15 -It's been a month since the last release and number of changes is yet again massive with over 250 commits! +It's been a month since the last release and number of changes is yet again massive with over 300 commits! Highlight are: - **Torch**: ROCm on Windows for AMD GPUs if you have a compatible GPU, performance gains are significant! - **Models**: - new WAN variants, a lot of new stuff with Qwen Image Edit including multi-image edits, expanded Nunchaku support and new SOTA upscaler with SeedVR2 + a lot of new stuff with **Qwen-Image-Edit** including multi-image edits and distilled variants, + new **Flux**, **WAN**, **HiDream** variants, expanded **Nunchaku** support and new SOTA upscaler with **SeedVR2** plus improved video support in general, including new methods of video encoding - **Quantization**: - new **SVD**-style quantization using SDNQ ofers almost zero loss even with **4bit** quantization + new **SVD**-style quantization using SDNQ offers almost zero-loss even with **4bit** quantization and now you can also test your favorite quantization on-the-fly and then save/load model for future use -### Details for 2025-10-14 +### Details for 2025-10-15 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -28,7 +29,7 @@ Highlight are: SRPO is trained by Tencent with specific technique: directly aligning the full diffusion trajectory with fine-grained human preference - [Nunchaku SDXL](https://huggingface.co/nunchaku-tech/nunchaku-sdxl) and [Nunchaku SDXL Turbo](https://huggingface.co/nunchaku-tech/nunchaku-sdxl-turbo) impact of nunchaku engine on unet-based model such as sdxl is much less than on a dit-based models, but its still significantly faster than baseline - note that nunchaku optimized and prequantized unet is replacement for base unet, so its only applicable to base models, not any of finetunes + note that nunchaku optimized and pre-quantized unet is replacement for base unet, so its only applicable to base models, not any of fine-tunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) updated version of E1 image editing model @@ -39,13 +40,13 @@ Highlight are: note: seedvr is highly sensitive to its cfg scale, set in *settings -> postprocessing* lower values will result in smoother output while higher values add details - [X-Omni SFT](https://x-omni-team.github.io/) - *experimental*: X-omni is a transformer-only discrete autoregressive image generative model trained with reinforcement learning + *experimental*: X-omni is a transformer-only discrete auto-regressive image generative model trained with reinforcement learning - **Features** - **Model save**: ability to save currently loaded model as a new standalone model why? SD.Next always prefers to start with full model and quantize on-demand during load however, when you find your exact preferred quantization settings that work well for you, saving such model as a new model allows for faster loads and reduced disk space usage - so its best of both worlds: you can experiment and test different quantizations and once you find the one that works for you, save it as a new model + so its best of both worlds: you can experiment and test different quantization methods and once you find the one that works for you, save it as a new model saved models appear in network tab as normal models and can be loaded as such available in *models* tab - [Qwen Image-Edit](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) multi-image editing @@ -56,15 +57,15 @@ Highlight are: - [Cache-DiT](https://github.com/vipshop/cache-dit) cache-dit is a unified, flexible and training-free cache acceleration framework compatible with many dit-based models such as FLUX.1, Qwen, HunyuanImage, Wan2.2, Chroma, etc. - enable in *settings -> pipeline modifers -> cache-dit* + enable in *settings -> pipeline modifiers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled - **Compute** - **ROCm** for Windows - support for both official torch preview release of `torch-rocm` for windows and **TheRock** unoffical `torch-rocm` builds for windows + support for both official torch preview release of `torch-rocm` for windows and **TheRock** unofficial `torch-rocm` builds for windows note that rocm for windows is still in preview and has limited gpu support, please check rocm docs for details - **DirectML** warn as *end-of-life* - `torch-directml` received no updates in over 1 year and its currently superceded by `rocm` or `zluda` + `torch-directml` received no updates in over 1 year and its currently superseded by `rocm` or `zluda` - command line params `--use-zluda` and `--use-rocm` will attempt desired operation or fail if not possible previously sdnext was performing a fallback to `torch-cpu` which is not desired - **installer** if `--use-cuda` or `--use-rocm` are specified and `torch-cpu` is installed, installer will attempt to reinstall correct torch package @@ -95,11 +96,11 @@ Highlight are: - **SDNQ** - add `SVDQuant` quantization method support - make sdnq scales compatible with balanced offload - - add int8 matmul support for RDNA2 GPUs via triton - - improve int8 mamtul performance on Intel GPUs + - add int8 `matmul` support for RDNA2 GPUs via triton + - improve int8 `matmul` performance on Intel GPUs - **Other** - server will note when restart is recommended due to package updates - - **interrrupt** will now show last known preview image + - **interrupt** will now show last known preview image *keep incomplete* setting is now *save interrupted* - **logging** enable `debug`, `docs` and `api-docs` by default - **logging** add detailed ram/vram utilization info to log @@ -143,7 +144,8 @@ Highlight are: allows for using many different guidance methods: *CFG, CFGZero, PAG, APG, SLG, SEG, TCFG, FDG* - **Wiki** - - updates to *AMD-ROCm, ZLUDA, LoRA, DirectML, SDNQ* pages + - updates to *AMD-ROCm, ZLUDA, LoRA, DirectML, SDNQ, Quantization, Prompting, LoRA* pages + - new *Stability-Matrix* page - **Fixes** - **Microsoft Florence 2** both base and large variants *note* this will trigger download of the new variant of the model, feel free to delete older variant in `huggingface` folder @@ -168,7 +170,7 @@ Highlight are: **StandardUI** is still available and can be selected in settings, but ModernUI is now the default for new installs *What's else*? **Chroma** is in its final form, there are several new **Qwen-Image** variants and **Nunchaku** hit version 1.0! -Also, there are quite a few offloading improvements and many quality-of-life changes to UI and overal workflows +Also, there are quite a few offloading improvements and many quality-of-life changes to UI and overall workflows And check out new **history** tab in the right panel, it now shows visualization of entire processing timeline! ![Screenshot](https://github.com/user-attachments/assets/d6119a63-6ee5-4597-95f6-29ed0701d3b5) @@ -182,13 +184,13 @@ And check out new **history** tab in the right panel, it now shows visualization - **Qwen-Image** [InstantX ControlNet Union](https://huggingface.co/InstantX/Qwen-Image-ControlNet-Union) support *note* qwen-image is already a very large model and controlnet adds 3.5GB on top of that so quantization and offloading are highly recommended! - [Qwen-Lightning-Edit](https://huggingface.co/vladmandic/Qwen-Lightning-Edit) and [Qwen-Image-Distill](https://huggingface.co/SahilCarterr/Qwen-Image-Distill-Full) variants - - **Nuchaku** variants of [Qwen-Image-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image), [Qwen-Image-Edit](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit), [Nunchaku-Qwen-Image-Edit-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit) + - **Nunchaku** variants of [Qwen-Image-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image), [Qwen-Image-Edit](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit), [Nunchaku-Qwen-Image-Edit-Lightning](https://huggingface.co/nunchaku-tech/nunchaku-qwen-image-edit) - **Nunchaku** variant of [Flux.1-Krea-Dev](https://huggingface.co/nunchaku-tech/nunchaku-flux.1-krea-dev) if you have a compatible nVidia GPU, Nunchaku is the fastest quantization & inference engine - [HunyuanDiT ControlNet](https://huggingface.co/Tencent-Hunyuan/HYDiT-ControlNet-v1.2) Canny, Depth, Pose - [KBlueLeaf/HDM-xut-340M-anime](https://huggingface.co/KBlueLeaf/HDM-xut-340M-anime) highly experimental: HDM *Home-made-Diffusion-Model* is a project to investigate specialized training recipe/scheme - for pretraining T2I model at home based on super-light architecture + for pre-training T2I model at home based on super-light architecture *requires*: generator=cpu, dtype=float16, offload=none, both positive and negative prompts are required and must be long & detailed - [Apple FastVLM](https://huggingface.co/apple/FastVLM-0.5B) in 0.5B, 1.5B and 7B variants available in captioning tab @@ -207,13 +209,13 @@ And check out new **history** tab in the right panel, it now shows visualization - additional artwork for reference models in networks, thanks @liutyi - improve ui hints display - restyled all toolbuttons to be modernui native - - reodered system settings + - reordered system settings - dynamic direction of dropdowns - improve process tab layout - improve detection of active tab - configurable horizontal vs vertical panel layout in settings -> user interface -> panel min width - *example*: if panel width is less than specified value, layout switches to verical + *example*: if panel width is less than specified value, layout switches to vertical - configurable grid images size in *settings -> user interface -> grid image size* - gallery now includes reference model images @@ -224,10 +226,10 @@ And check out new **history** tab in the right panel, it now shows visualization - improve offloading of models with multiple dits - improve offloading of models with impliciy vae processing - improve offloading of models with controlnet - - more aggressive offloading of controlnets with lowvram flag + - more aggressive offloading of controlnet with lowvram flag - **group** - new offloading method, using *type=leaf* works on a similar level as sequential offloading - and can present siginificant savings on low-vram gpus, but comes at the higher performace cost + and can present significant savings on low-vram gpus, but comes at the higher performance cost - **Quantization** - option to specify models types not to quantize: *settings -> quantization* allows for having quantization enabled, but skipping specific model types that do not need it diff --git a/README.md b/README.md index f57feb916..b81f1a8aa 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,12 @@ All individual features are not listed here, instead check [ChangeLog](CHANGELOG ▹ **Standard | Modern** - Multiple [diffusion models](https://vladmandic.github.io/sdnext-docs/Model-Support/)! - Built-in Control for Text, Image, Batch and Video processing! -- Multiplatform! +- Multi-platform! ▹ **Windows | Linux | MacOS | nVidia CUDA | AMD ROCm | Intel Arc / IPEX XPU | DirectML | OpenVINO | ONNX+Olive | ZLUDA** -- Platform specific autodetection and tuning performed on install +- Platform specific auto-detection and tuning performed on install - Optimized processing with latest `torch` developments with built-in support for model compile and quantize Compile backends: *Triton | StableFast | DeepCache | OneDiff | TeaCache | etc.* - Quantization methods: *SDNQ | BitsAndBytes | Optimum-Quanto | TorchAO* + Quantization methods: *SDNQ | BitsAndBytes | Optimum-Quanto | TorchAO / LayerWise* - **Interrogate/Captioning** with 150+ **OpenCLiP** models and 20+ built-in **VLMs** - Built-in queue management - Built in installer with automatic updates and dependency management @@ -54,7 +54,7 @@ All individual features are not listed here, instead check [ChangeLog](CHANGELOG screenshot-modernui-mobile -For screenshots and informations on other available themes, see [Themes](https://vladmandic.github.io/sdnext-docs/Themes/) +For screenshots and information on other available themes, see [Themes](https://vladmandic.github.io/sdnext-docs/Themes/)
    @@ -75,7 +75,7 @@ SD.Next supports broad range of models: [supported models](https://vladmandic.gi - *ONNX/Olive* - *AMD* GPUs on Windows using **ZLUDA** libraries -Plus Docker container receipes for: [CUDA, ROCm, Intel IPEX and OpenVINO](https://vladmandic.github.io/sdnext-docs/Docker/) +Plus Docker container recipes for: [CUDA, ROCm, Intel IPEX and OpenVINO](https://vladmandic.github.io/sdnext-docs/Docker/) ## Getting started diff --git a/wiki b/wiki index bf77a802d..ae55ef9b4 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit bf77a802db032e2f5a48c379088f35cdadd76a8b +Subproject commit ae55ef9b423918e096d516ee1646c0b59fbc9528 From 4452e03221f3ccdc939d0aa3e9c6322330864af7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 15 Oct 2025 13:39:56 -0400 Subject: [PATCH 222/230] cleanup Signed-off-by: Vladimir Mandic --- modules/sd_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sd_models.py b/modules/sd_models.py index 8a133599e..7c9ea0953 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -528,7 +528,7 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con diffusers_load_config.pop('local_files_only', None) shared.log.debug(f'Setting {op}: pipeline={sd_model.__class__.__name__} config={diffusers_load_config}') # pylint: disable=protected-access except Exception as e: - shared.log.error(f'Load {op}: file="{checkpoint_info.path}" pipeline={shared.opts.diffusers_pipeline}/{sd_model.__class__.__name__} config={diffusers_load_config} {e}') + shared.log.error(f'Load {op}: file="{checkpoint_info.path}" pipeline={shared.opts.diffusers_pipeline} config={diffusers_load_config} {e}') if 'Weights for this component appear to be missing in the checkpoint' in str(e): shared.log.error(f'Load {op}: file="{checkpoint_info.path}" is not a complete model') else: From ffe2a9d1480ba31939d9892a1062a5e5a78103ca Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 15 Oct 2025 14:49:31 -0400 Subject: [PATCH 223/230] add ltxvideo-0.9.8 Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 ++++-- installer.py | 2 +- modules/video_models/models_def.py | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b41b3816..a4159fa5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ Highlight are: if you have a compatible GPU, performance gains are significant! - **Models**: a lot of new stuff with **Qwen-Image-Edit** including multi-image edits and distilled variants, - new **Flux**, **WAN**, **HiDream** variants, expanded **Nunchaku** support and new SOTA upscaler with **SeedVR2** + new **Flux**, **WAN**, **LTX**, **HiDream** variants, expanded **Nunchaku** support and new SOTA upscaler with **SeedVR2** plus improved video support in general, including new methods of video encoding - **Quantization**: new **SVD**-style quantization using SDNQ offers almost zero-loss even with **4bit** quantization @@ -32,7 +32,9 @@ Highlight are: note that nunchaku optimized and pre-quantized unet is replacement for base unet, so its only applicable to base models, not any of fine-tunes *how to use*: enable nunchaku in settings -> quantization and then load either sdxl-base or sdxl-base-turbo reference models - [HiDream E1.1](https://huggingface.co/HiDream-ai/HiDream-E1-1) - updated version of E1 image editing model + updated version of HiDream-E1 image editing model + - [LTXVideo 0.9.8](https://huggingface.co/Lightricks/LTX-Video-0.9.8-13B-distilled) + updated version of LTXVideo t2v/i2iv model - [SeedVR2](https://iceclear.github.io/projects/seedvr/) originally designed for video restoration, seedvr works great for image detailing and upscaling! available in 3B, 7B and 7B-sharp variants, use as any other upscaler! diff --git a/installer.py b/installer.py index e668f3c1a..3e2c06e72 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = 'a9df12ab451be65060f6f69e201e3a6cb2ee15e8' # diffusers commit hash + sha = 'f072c64bf22c6a259d38435b19a8ef3eb67c96a8' # diffusers commit hash # if args.use_rocm or args.use_zluda or args.use_directml: # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index e2605ae50..e1cc76f71 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -74,6 +74,12 @@ models = { ], 'LTX Video': [ Model(name='None'), + Model(name='LTXVideo 0.9.8 13B', + url='https://huggingface.co/Lightricks/LTX-Video-0.9.8-13B-distilled', + repo='Lightricks/LTX-Video-0.9.8-13B-distilled', + repo_cls=diffusers.LTXConditionPipeline, + te_cls=transformers.T5EncoderModel, + dit_cls=diffusers.LTXVideoTransformer3DModel), Model(name='LTXVideo 0.9.7 13B', url='https://huggingface.co/Lightricks/LTX-Video-0.9.7-dev', repo='a-r-r-o-w/LTX-Video-0.9.7-diffusers', From 070edb20b07b98bb9c188ba17fb40514a6ee5f77 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 16 Oct 2025 09:21:20 -0400 Subject: [PATCH 224/230] update transformers and fix quant params Signed-off-by: Vladimir Mandic --- installer.py | 2 +- modules/ltx/ltx_process.py | 9 ++++++++- modules/ltx/ltx_util.py | 6 ++++++ modules/sdnq/quantizer.py | 2 +- modules/video_models/video_load.py | 2 +- requirements.txt | 4 ++-- 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/installer.py b/installer.py index 3e2c06e72..8b87eafa9 100644 --- a/installer.py +++ b/installer.py @@ -637,7 +637,7 @@ def check_transformers(): target_transformers = '4.52.4' target_tokenizers = '0.21.4' else: - target_transformers = '4.56.2' + target_transformers = '4.57.1' target_tokenizers = '0.22.1' if (pkg_transformers is None) or ((pkg_transformers.version != target_transformers) or (pkg_tokenizers is None) or ((pkg_tokenizers.version != target_tokenizers) and (not args.experimental))): if pkg_transformers is None: diff --git a/modules/ltx/ltx_process.py b/modules/ltx/ltx_process.py index 46374d77d..7d9e6ae84 100644 --- a/modules/ltx/ltx_process.py +++ b/modules/ltx/ltx_process.py @@ -66,7 +66,10 @@ def run_ltx(task_id, progress.finish_task(task_id) yield None, f'LTX Error: {str(e)}' - from diffusers import LTXConditionPipeline # pylint: disable=unused-import + if model is None or len(model) == 0: + yield from abort('Video: no model selected', ok=True) + return + # from diffusers import LTXConditionPipeline # pylint: disable=unused-import check_av() progress.add_task_to_queue(task_id) with queue_lock: @@ -76,6 +79,10 @@ def run_ltx(task_id, yield None, 'LTX: Loading...' engine = 'LTX Video' load_model(engine, model) + debug(f'Video: cls={shared.sd_model.__class__.__name__} op=init model="{model}"') + if not shared.sd_model.__class__.__name__.startswith("LTX"): + yield from abort(f'Video: cls={shared.sd_model.__class__.__name__} selected model is not LTX model', ok=True) + return videojob = shared.state.begin('Video', task_id=task_id) shared.state.job_count = 1 diff --git a/modules/ltx/ltx_util.py b/modules/ltx/ltx_util.py index 9cca59306..ddc53a323 100644 --- a/modules/ltx/ltx_util.py +++ b/modules/ltx/ltx_util.py @@ -8,6 +8,8 @@ loaded_model: str = None def get_bucket(size: int): + if not hasattr(shared.sd_model, 'vae_temporal_compression_ratio'): + return int(size) - (int(size) % 16) return int(size) - (int(size) % shared.sd_model.vae_temporal_compression_ratio) @@ -19,6 +21,10 @@ def load_model(engine: str, model: str): global loaded_model # pylint: disable=global-statement if loaded_model == model: return + if model is None or model == '' or model=='None': + loaded_model = None + shared.sd_model = None + return t0 = time.time() from modules.video_models import models_def, video_load selected: models_def.Model = [m for m in models_def.models[engine] if m.name == model][0] diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index b4e60a704..78eb7d333 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -497,7 +497,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): param_value: torch.FloatTensor, param_name: str, target_device: torch.device, - state_dict: Dict[str, Any], + # state_dict: Dict[str, Any], # removed in transformers==4.57 *args, **kwargs, # pylint: disable=unused-argument ): if self.pre_quantized: diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index e8d616c69..d7f47d5f2 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -8,7 +8,7 @@ loaded_model = None def load_model(selected: models_def.Model): - if selected is None: + if selected is None or selected.te_cls is None or selected.dit_cls is None: return '' global loaded_model # pylint: disable=global-statement if loaded_model == selected.name: diff --git a/requirements.txt b/requirements.txt index f41e599e2..66803df33 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,8 +35,8 @@ rich==14.1.0 safetensors==0.6.2 tensordict==0.8.3 peft==0.17.1 -httpx==0.24.1 -compel==2.1.1 +httpx==0.28.1 +compel==2.2.1 torchsde==0.2.6 antlr4-python3-runtime==4.9.3 requests==2.32.4 From 63aad89676c7d02163a39ce28066359e0b6c1407 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Thu, 16 Oct 2025 16:29:23 +0300 Subject: [PATCH 225/230] remove the unused state_dict arg --- modules/sdnq/quantizer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 78eb7d333..d56dafea0 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -497,7 +497,6 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): param_value: torch.FloatTensor, param_name: str, target_device: torch.device, - # state_dict: Dict[str, Any], # removed in transformers==4.57 *args, **kwargs, # pylint: disable=unused-argument ): if self.pre_quantized: From 45c5091aa9859f41f9ef0b42e5f880e39f705654 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 16 Oct 2025 11:23:29 -0400 Subject: [PATCH 226/230] fix wan and add hf mirror setting Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 10 +++++++--- modules/modelloader.py | 2 ++ modules/shared.py | 1 + modules/video_models/models_def.py | 24 ++++++++++++------------ modules/video_models/video_load.py | 4 ++++ modules/video_models/video_save.py | 9 ++++----- modules/video_models/video_utils.py | 3 +++ 7 files changed, 33 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4159fa5f..be679abcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2025-10-15 +## Update for 2025-10-16 -### Highlights for 2025-10-15 +### Highlights for 2025-10-16 It's been a month since the last release and number of changes is yet again massive with over 300 commits! Highlight are: @@ -15,8 +15,9 @@ Highlight are: - **Quantization**: new **SVD**-style quantization using SDNQ offers almost zero-loss even with **4bit** quantization and now you can also test your favorite quantization on-the-fly and then save/load model for future use +- Other: support for **Huggingface** mirrors, changes to installer to prevent unwanted `torch-cpu` operations, improved previews, etc. -### Details for 2025-10-15 +### Details for 2025-10-16 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -62,6 +63,9 @@ Highlight are: enable in *settings -> pipeline modifiers -> cache-dit* - [Nunchaku Flux.1 PulID](https://nunchaku.tech/docs/nunchaku/python_api/nunchaku.pipeline.pipeline_flux_pulid.html) automatically enabled if loaded model is FLUX.1 with Nunchaku engine enabled and when PulID script is enabled + - **Huggingface mirror** in *settings -> huggingface* + if you're working from location with limited access to huggingface, you can now specify a mirror site + for example enter, `https://hf-mirror.com` - **Compute** - **ROCm** for Windows support for both official torch preview release of `torch-rocm` for windows and **TheRock** unofficial `torch-rocm` builds for windows diff --git a/modules/modelloader.py b/modules/modelloader.py index 5018d5cb9..0f8c502c3 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -27,6 +27,8 @@ def hf_login(token=None): if token is None or len(token) <= 4: log.debug('HF login: no token provided') return False + if len(shared.opts.huggingface_mirror.strip()) > 0 and os.environ.get('HF_ENDPOINT', None) is None: + os.environ['HF_ENDPOINT'] = shared.opts.huggingface_mirror.strip() if os.environ.get('HUGGING_FACE_HUB_TOKEN', None) is not None: os.environ.pop('HUGGING_FACE_HUB_TOKEN', None) os.unsetenv('HUGGING_FACE_HUB_TOKEN') diff --git a/modules/shared.py b/modules/shared.py index 3cca72294..fcaa05f1b 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -688,6 +688,7 @@ options_templates.update(options_section(('huggingface', "Huggingface"), { "diffuser_cache_config": OptionInfo(True, "Use cached model config when available"), "huggingface_token": OptionInfo('', 'HuggingFace token', gr.Textbox, {"lines": 2}), "hf_transfer_mode": OptionInfo("rust", "HuggingFace download method", gr.Radio, {"choices": ['requests', 'rust', 'xet']}), + "huggingface_mirror": OptionInfo('', 'HuggingFace mirror', gr.Textbox), "diffusers_model_load_variant": OptionInfo("default", "Preferred Model variant", gr.Radio, {"choices": ['default', 'fp32', 'fp16']}), "diffusers_vae_load_variant": OptionInfo("default", "Preferred VAE variant", gr.Radio, {"choices": ['default', 'fp32', 'fp16']}), diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index e1cc76f71..14f0eb8e0 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -153,76 +153,76 @@ models = { url='https://huggingface.co/Wan-AI/Wan2.2-TI2V-5B-Diffusers', repo='Wan-AI/Wan2.2-TI2V-5B-Diffusers', repo_cls=diffusers.WanPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.2 5B I2V', url='https://huggingface.co/Wan-AI/Wan2.2-TI2V-5B-Diffusers', repo='Wan-AI/Wan2.2-TI2V-5B-Diffusers', repo_cls=diffusers.WanImageToVideoPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.2 A14B T2V', url='https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B-Diffusers', repo='Wan-AI/Wan2.2-T2V-A14B-Diffusers', repo_cls=diffusers.WanPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel, dit_folder=("transformer", "transformer_2")), Model(name='WAN 2.2 A14B I2V', url='https://huggingface.co/Wan-AI/Wan2.2-I2V-A14B-Diffusers', repo='Wan-AI/Wan2.2-I2V-A14B-Diffusers', repo_cls=diffusers.WanImageToVideoPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel, dit_folder=("transformer", "transformer_2")), Model(name='WAN 2.2 14B VACE', url='https://huggingface.co/linoyts/Wan2.2-VACE-Fun-14B-diffusers', repo='linoyts/Wan2.2-VACE-Fun-14B-diffusers', repo_cls=diffusers.WanVACEPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanVACETransformer3DModel, dit_folder=("transformer", "transformer_2")), Model(name='WAN 2.1 1.3B T2V', url='https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers', repo='Wan-AI/Wan2.1-T2V-1.3B-Diffusers', repo_cls=diffusers.WanPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.1 14B T2V', url='https://huggingface.co/Wan-AI/Wan2.1-T2V-14B-Diffusers', repo='Wan-AI/Wan2.1-T2V-14B-Diffusers', repo_cls=diffusers.WanPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.1 14B I2V 480p', url='https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-480P-Diffusers', repo='Wan-AI/Wan2.1-I2V-14B-480P-Diffusers', repo_cls=diffusers.WanImageToVideoPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.1 14B I2V 720p', url='https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-720P-Diffusers', repo='Wan-AI/Wan2.1-I2V-14B-720P-Diffusers', repo_cls=diffusers.WanImageToVideoPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.1 14B FLF2V 720p', url='https://huggingface.co/Wan-AI/Wan2.1-FLF2V-14B-720P', repo='Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers', repo_cls=diffusers.WanImageToVideoPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanTransformer3DModel), Model(name='WAN 2.1 VACE 1.3B', url='https://huggingface.co/Wan-AI/Wan2.1-VACE-1.3B-diffusers', repo='Wan-AI/Wan2.1-VACE-1.3B-diffusers', repo_cls=diffusers.WanVACEPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanVACETransformer3DModel), Model(name='WAN 2.1 VACE 14B', url='https://huggingface.co/Wan-AI/Wan2.1-VACE-14B-diffusers', repo='Wan-AI/Wan2.1-VACE-14B-diffusers', repo_cls=diffusers.WanVACEPipeline, - te_cls=transformers.T5EncoderModel, + te_cls=transformers.UMT5EncoderModel, dit_cls=diffusers.WanVACETransformer3DModel), ], 'SkyReels V2': [ diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index d7f47d5f2..d41e3d463 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -31,6 +31,10 @@ def load_model(selected: models_def.Model): selected.te = 'Disty0/t5-xxl' selected.te_folder = '' selected.te_revision = None + if selected.te_cls.__name__ == 'UMT5EncoderModel' and shared.opts.te_shared_t5: + selected.te = 'Wan-AI/Wan2.2-TI2V-5B-Diffusers' + selected.te_folder = 'text_encoder' + selected.te_revision = None if selected.te_cls.__name__ == 'LlamaModel' and shared.opts.te_shared_t5: selected.te = 'hunyuanvideo-community/HunyuanVideo' selected.te_folder = 'text_encoder' diff --git a/modules/video_models/video_save.py b/modules/video_models/video_save.py index 41095922f..24775c5a1 100644 --- a/modules/video_models/video_save.py +++ b/modules/video_models/video_save.py @@ -6,6 +6,7 @@ import numpy as np import torch import einops from modules import shared, errors ,timer, rife +from modules.video_models.video_utils import check_av def get_video_filename(frames:int, codec:str): @@ -27,11 +28,9 @@ def images_to_tensor(images): def atomic_save_video(filename, tensor:torch.Tensor, fps:float=24, codec:str='libx264', pix_fmt:str='yuv420p', options:str='', metadata:dict={}, pbar=None): - try: - import av - av.logging.set_level(av.logging.ERROR) # pylint: disable=c-extension-no-member - except Exception as e: - shared.log.error(f'Video: {e}') + av = check_av() + if av is None or av is False: + shared.log.error('Video: ffmpeg/av not available') return savejob = shared.state.begin('Save video') diff --git a/modules/video_models/video_utils.py b/modules/video_models/video_utils.py index 47faeac13..f29c43906 100644 --- a/modules/video_models/video_utils.py +++ b/modules/video_models/video_utils.py @@ -2,6 +2,7 @@ import os import sys import time from PIL import Image +from installer import install from modules import shared, sd_models, timer, errors, devices @@ -18,8 +19,10 @@ def get_url(url): def check_av(): + install('av') try: import av + av.logging.set_level(av.logging.ERROR) # pylint: disable=c-extension-no-member except Exception as e: shared.log.error(f'av package: {e}') return False From 2cf9938d97549a28f5010746ad5edea843af859c Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 17 Oct 2025 00:08:12 +0300 Subject: [PATCH 227/230] SDNQ fix sdxl unet quant config not getting saved --- modules/sdnq/quantizer.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index d56dafea0..87239aa19 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -433,10 +433,12 @@ def sdnq_post_load_quant( modules_dtype_dict=modules_dtype_dict.copy(), ) - try: - model.config.quantization_config = model.quantization_config - except Exception: - pass + if hasattr(model, "config"): + try: + model.config.quantization_config = model.quantization_config + model.config["quantization_config"] = model.quantization_config.to_dict() + except Exception: + pass model.quantization_method = QuantizationMethod.SDNQ return model @@ -589,7 +591,11 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): model, self.quantization_config.modules_to_not_convert, self.quantization_config.modules_dtype_dict ) if hasattr(model, "config"): - model.config.quantization_config = self.quantization_config + try: + model.config.quantization_config = self.quantization_config + model.config["quantization_config"] = self.quantization_config.to_dict() + except Exception: + pass model.quantization_config = self.quantization_config def _process_model_after_weight_loading(self, model, **kwargs): # pylint: disable=unused-argument From a4bc61919d78d6c696b369d086eae66f02f0bac6 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 16 Oct 2025 19:25:12 -0400 Subject: [PATCH 228/230] add explicit sync for vae preview Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + modules/processing_callbacks.py | 2 +- wiki | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be679abcc..29ae7a851 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -167,6 +167,7 @@ Highlight are: - fix hf token with extra chars - image viewer refocus on gallery after returning from full screen mode - fix attention guidance metadata save/restore + - vae preview add explicity cuda.sync ## Update for 2025-09-15 diff --git a/modules/processing_callbacks.py b/modules/processing_callbacks.py index 46067e0c2..1fce953ee 100644 --- a/modules/processing_callbacks.py +++ b/modules/processing_callbacks.py @@ -56,7 +56,7 @@ def diffusers_callback(pipe, step: int = 0, timestep: int = 0, kwargs: dict = {} t0 = time.time() if devices.backend == "ipex": # xe driver on linux needs this torch.xpu.synchronize(devices.device) - elif devices.backend == "zluda" or (devices.backend == "rocm" and sys.platform == "win32"): + elif (devices.backend == "zluda") or (devices.backend == "rocm") or (devices.backend == "cuda"): torch.cuda.synchronize(devices.device) latents = kwargs.get('latents', None) if debug: diff --git a/wiki b/wiki index ae55ef9b4..78e4e6b94 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit ae55ef9b423918e096d516ee1646c0b59fbc9528 +Subproject commit 78e4e6b94adac848c118b85d7a4c552babcb1acd From 4f336d3aab8f95809cc8a5007598a03043362d2a Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 16 Oct 2025 19:39:05 -0400 Subject: [PATCH 229/230] linting Signed-off-by: Vladimir Mandic --- .pylintrc | 1 - launch.py | 2 +- modules/modelloader.py | 2 +- modules/processing_callbacks.py | 1 - modules/safe.py | 4 ++-- modules/sdnq/quantizer.py | 4 ++-- modules/seedvr/src/__init__.py | 2 +- .../seedvr/src/models/video_vae_v3/modules/attn_video_vae.py | 2 +- pipelines/model_stablecascade.py | 4 ++-- 9 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.pylintrc b/.pylintrc index ff0af298f..5dc22b99c 100644 --- a/.pylintrc +++ b/.pylintrc @@ -76,7 +76,6 @@ persistent=yes py-version=3.9 recursive=no source-roots= -suggestion-mode=yes unsafe-load-any-extension=no [BASIC] diff --git a/launch.py b/launch.py index 1f55a848d..40e1946fc 100755 --- a/launch.py +++ b/launch.py @@ -133,7 +133,7 @@ def run_pip(pkg, desc=None): # compatbility function desc = pkg for f in forbidden: if f in pkg: - debug_install('Blocked package installation: package={f}') + debug_install(f'Blocked package installation: package={f}') return True index_url_line = f' --index-url {index_url}' if index_url != '' else '' return run(f'"{sys.executable}" -m pip {pkg} --prefer-binary{index_url_line}', desc=f"Installing {desc}", errdesc=f"Couldn't install {desc}") diff --git a/modules/modelloader.py b/modules/modelloader.py index 0f8c502c3..c448caad2 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -306,7 +306,7 @@ def download_url_to_file(url: str, dst: str): continue break else: - shared.log.error('Error downloading: url={url} no usable temporary filename found') + shared.log.error(f'Error downloading: url={url} no usable temporary filename found') return try: with Progress(TextColumn('[cyan]{task.description}'), BarColumn(), TaskProgressColumn(), TimeRemainingColumn(), TimeElapsedColumn(), console=shared.console) as progress: diff --git a/modules/processing_callbacks.py b/modules/processing_callbacks.py index 1fce953ee..62f9b624b 100644 --- a/modules/processing_callbacks.py +++ b/modules/processing_callbacks.py @@ -1,6 +1,5 @@ import typing import os -import sys import time import torch import numpy as np diff --git a/modules/safe.py b/modules/safe.py index 21b8c08b2..82d4ae77a 100644 --- a/modules/safe.py +++ b/modules/safe.py @@ -21,8 +21,8 @@ def encode(*args): class RestrictedUnpickler(pickle.Unpickler): extra_handler = None - def persistent_load(self, saved_id): - assert saved_id[0] == 'storage' + def persistent_load(self, pid): + assert pid[0] == 'storage' try: return TypedStorage(_internal=True) except TypeError: diff --git a/modules/sdnq/quantizer.py b/modules/sdnq/quantizer.py index 87239aa19..29f3b61d8 100644 --- a/modules/sdnq/quantizer.py +++ b/modules/sdnq/quantizer.py @@ -1,6 +1,6 @@ # pylint: disable=redefined-builtin,no-member,protected-access -from typing import Any, Dict, List, Tuple, Optional, Union +from typing import Dict, List, Tuple, Optional, Union from dataclasses import dataclass from enum import Enum @@ -463,7 +463,7 @@ class SDNQQuantizer(DiffusersQuantizer, HfQuantizer): *args, **kwargs, # pylint: disable=unused-argument ): if self.pre_quantized: - layer, tensor_name = get_module_from_name(model, param_name) + layer, _tensor_name = get_module_from_name(model, param_name) if hasattr(layer, "sdnq_dequantizer"): return True elif param_name.endswith(".weight"): diff --git a/modules/seedvr/src/__init__.py b/modules/seedvr/src/__init__.py index d9e24b028..e2a119280 100644 --- a/modules/seedvr/src/__init__.py +++ b/modules/seedvr/src/__init__.py @@ -8,4 +8,4 @@ current_dir = os.path.dirname(os.path.abspath(__file__)) parent_dir = os.path.dirname(current_dir) if parent_dir not in sys.path: sys.path.insert(0, parent_dir) -""" \ No newline at end of file +""" diff --git a/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py index 3aba37b66..2b07fb1d3 100644 --- a/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py +++ b/modules/seedvr/src/models/video_vae_v3/modules/attn_video_vae.py @@ -1288,7 +1288,7 @@ class VideoAutoencoderKL(diffusers.AutoencoderKL): result_rows.append(torch.cat(result_row, dim=4)) dec = torch.cat(result_rows, dim=3) return dec - + def forward( self, x: torch.FloatTensor, mode: Literal["encode", "decode", "all"] = "all", **kwargs ): diff --git a/pipelines/model_stablecascade.py b/pipelines/model_stablecascade.py index 60d8ca87c..40d141364 100644 --- a/pipelines/model_stablecascade.py +++ b/pipelines/model_stablecascade.py @@ -162,10 +162,10 @@ def load_cascade_combined(checkpoint_info, diffusers_load_config): # Balanced offload hooks: class StableCascadeDecoderPipelineFixed(diffusers.StableCascadeDecoderPipeline): - def guidance_scale(self): + def guidance_scale(self): # pylint: disable=invalid-overridden-method return self._guidance_scale - def do_classifier_free_guidance(self): + def do_classifier_free_guidance(self): # pylint: disable=invalid-overridden-method return self._guidance_scale > 1 @torch.no_grad() From e66d78f5563f69d9b047810e9db97b36d23d4d58 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 17 Oct 2025 08:53:26 -0400 Subject: [PATCH 230/230] pre-merge cleanup Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 +++--- extensions-builtin/sd-extension-chainner | 2 +- extensions-builtin/sdnext-modernui | 2 +- installer.py | 2 +- modules/processing.py | 2 +- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29ae7a851..a175bfdb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2025-10-16 +## Update for 2025-10-17 -### Highlights for 2025-10-16 +### Highlights for 2025-10-17 It's been a month since the last release and number of changes is yet again massive with over 300 commits! Highlight are: @@ -17,7 +17,7 @@ Highlight are: and now you can also test your favorite quantization on-the-fly and then save/load model for future use - Other: support for **Huggingface** mirrors, changes to installer to prevent unwanted `torch-cpu` operations, improved previews, etc. -### Details for 2025-10-16 +### Details for 2025-10-17 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) diff --git a/extensions-builtin/sd-extension-chainner b/extensions-builtin/sd-extension-chainner index da7a2bd55..c6dc85eb2 160000 --- a/extensions-builtin/sd-extension-chainner +++ b/extensions-builtin/sd-extension-chainner @@ -1 +1 @@ -Subproject commit da7a2bd553b81d66fab21c2f12559439a36e844c +Subproject commit c6dc85eb28a02bc7af268497b7a5a596770c5d7b diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 638a07d70..db79b18f6 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 638a07d70998cc4ffc1fd9fe8a51de180c1c9e08 +Subproject commit db79b18f6f3f5a247e710b507d10cb39b01cc371 diff --git a/installer.py b/installer.py index 8b87eafa9..835478690 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = 'f072c64bf22c6a259d38435b19a8ef3eb67c96a8' # diffusers commit hash + sha = 'af769881d37fe916afef2c47279f66c79f5f2714' # diffusers commit hash # if args.use_rocm or args.use_zluda or args.use_directml: # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = pkg_resources.working_set.by_key.get('diffusers', None) diff --git a/modules/processing.py b/modules/processing.py index d42929b23..aaf681840 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -46,7 +46,7 @@ class Processed: self.sampler_name = p.sampler_name or '' self.cfg_scale = p.cfg_scale if p.cfg_scale > 1 else None - self.cfg_end = p.cfg_end if p.cfg_end < 0 else None + self.cfg_end = p.cfg_end if p.cfg_end < 1 else None self.image_cfg_scale = p.image_cfg_scale or 0 self.steps = p.steps or 0 self.batch_size = max(1, p.batch_size) diff --git a/package.json b/package.json index 1b0b95bca..e42d5a2fd 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "venv": ". venv/bin/activate", "start": ". venv/bin/activate; python launch.py --debug", "localize": "node cli/localize.js", - "packages": ". venv/bin/activate && pip install --upgrade transformers accelerate huggingface_hub safetensors tokenizers peft compel pytorch_lightning pylint ruff", + "packages": ". venv/bin/activate && pip install --upgrade transformers accelerate huggingface_hub safetensors tokenizers peft pytorch_lightning pylint ruff", "eslint": "eslint . javascript/ extensions-builtin/sdnext-modernui/javascript/", "ruff": ". venv/bin/activate && ruff check", "pylint": ". venv/bin/activate && pylint *.py modules/ pipelines/ scripts/ extensions-builtin/ | grep -v '^*'",

u@pmYGNd0U&|3jc`EPIm;!lp1{6_Y_ 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�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�rvMK^# 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