diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d9bfdb1..104cbaa6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,15 @@ # Change Log for SD.Next -## Update for 2025-11-14 +## Update for 2025-11-16 ### TBD Merge commit: `f903a36d9` -### Highlights for 2025-11-14 +### Highlights for 2025-11-16 New native [kanvas](https://vladmandic.github.io/sdnext-docs/Kanvas/) module for image manipulation that fully replaces img2img, inpaint and outpaint controls -And a first cloud model with **Google's Nano Banana** +And a first cloud model with **Google's Nano Banana** plus new **Photoroom PRX** model ![Screenshot](https://github.com/user-attachments/assets/54b25586-b611-4d70-a28f-ee3360944034) @@ -35,7 +35,7 @@ And a first cloud model with **Google's Nano Banana** - **auth**: strong-enforce auth check on all api endpoints - **amdgpu**: prefer rocm-on-windows over zluda - **Internal** - - torch: update to `torch==2.9.1` for cuda, ipex, openvino, rocm backends + - torch: update to `torch==2.9.1` for *cuda, ipex, openvino, rocm* backends - attention: refactor attention handling - scripts: remove obsolete video scripts - lint: update global lint rules @@ -45,6 +45,7 @@ And a first cloud model with **Google's Nano Banana** - installer: reduce requirements - installer: auto-restart on self-update - server: set correct mime-types + - sdnq: unconditional register on startup - **Fixes** - hires: strength save/load in metadata, thanks @awsr - imgi2img: fix initial scale tab, thanks @awsr diff --git a/modules/sd_models.py b/modules/sd_models.py index 129cbb211..8a81aafc7 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -455,7 +455,6 @@ def load_diffuser_folder(model_type, pipeline, checkpoint_info, diffusers_load_c try: #0 - using detected model type and pipeline if (model_type is not None) and (pipeline is not None): if ('sdnq' in model_type.lower()) or ('sdnq' in checkpoint_info.path.lower()): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers global allow_post_quant # pylint: disable=global-statement allow_post_quant = False sd_model = pipeline.from_pretrained(checkpoint_info.path, cache_dir=shared.opts.diffusers_dir, **diffusers_load_config) @@ -572,7 +571,6 @@ def load_diffuser_file(model_type, pipeline, checkpoint_info, diffusers_load_con def load_sdnq_module(fn: str, module_name: str, load_method: str): - from modules import sdnq t0 = time.time() quantization_config = None quantization_config_path = os.path.join(fn, module_name, 'quantization_config.json') @@ -585,6 +583,7 @@ def load_sdnq_module(fn: str, module_name: str, load_method: str): return None, module_name, 0 model_name = os.path.join(fn, module_name) try: + from modules import sdnq module = sdnq.load_sdnq_model( model_path=model_name, quantization_config=quantization_config, diff --git a/modules/shared.py b/modules/shared.py index 8af5135e2..66cae0506 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -837,6 +837,9 @@ elif sys.platform == "win32" and (devices.backend == "zluda" or devices.backend if devices.backend == "zluda": from modules.zluda import initialize_zluda initialize_zluda() +from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers +log.debug('Quantization: registered=SDNQ') + try: log.info(f'Device: {print_dict(devices.get_gpu_info())}') except Exception as ex: diff --git a/modules/video_models/video_load.py b/modules/video_models/video_load.py index a1698e80b..4ad4a3925 100644 --- a/modules/video_models/video_load.py +++ b/modules/video_models/video_load.py @@ -60,9 +60,6 @@ def load_model(selected: models_def.Model): selected.te_folder = 'text_encoder' selected.te_revision = None - if 'sdnq-' in (selected.te or selected.repo).lower(): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers - 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, @@ -96,9 +93,6 @@ def load_model(selected: models_def.Model): 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 'sdnq-' in (selected.dit or selected.repo).lower(): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers - if selected.dit_folder is None: selected.dit_folder = ['transformer'] if isinstance(selected.dit_folder, list) or isinstance(selected.dit_folder, tuple): diff --git a/pipelines/generic.py b/pipelines/generic.py index 3ae0a154d..be59bd75e 100644 --- a/pipelines/generic.py +++ b/pipelines/generic.py @@ -18,8 +18,6 @@ def load_transformer(repo_id, cls_name, load_config=None, subfolder="transformer modules_dtype_dict = {} jobid = shared.state.begin('Load DiT') try: - if 'sdnq-' in repo_id.lower(): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers load_args, quant_args = model_quant.get_dit_args(load_config, module='Model', device_map=True, allow_quant=allow_quant, modules_to_not_convert=modules_to_not_convert, modules_dtype_dict=modules_dtype_dict) quant_type = model_quant.get_quant_type(quant_args) dtype = dtype or devices.dtype @@ -100,8 +98,6 @@ def load_text_encoder(repo_id, cls_name, load_config=None, subfolder="text_encod modules_dtype_dict = {} jobid = shared.state.begin('Load TE') try: - if 'sdnq-' in repo_id.lower(): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers load_args, quant_args = model_quant.get_dit_args(load_config, module='TE', device_map=True, allow_quant=allow_quant, modules_to_not_convert=modules_to_not_convert, modules_dtype_dict=modules_dtype_dict) quant_type = model_quant.get_quant_type(quant_args) load_args.pop('torch_dtype', None) diff --git a/pipelines/model_hyimage.py b/pipelines/model_hyimage.py index ec5dd967c..28458bc86 100644 --- a/pipelines/model_hyimage.py +++ b/pipelines/model_hyimage.py @@ -50,7 +50,6 @@ def load_hyimage3(checkpoint_info, diffusers_load_config=None): # pylint: disabl allow_quant = True if 'sdnq-' in repo_id.lower(): - from modules import sdnq # pylint: disable=unused-import # register to diffusers and transformers sd_models.allow_post_quant = False # we already handled it allow_quant = False diff --git a/wiki b/wiki index 21b5e921d..ead7aebf8 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 21b5e921d81c5dc31447f0869a785e367865b6ed +Subproject commit ead7aebf85fab212a6b9cd226b720d77213eaeee