From a1df374773c55defcbef3c9aab85cb8d2e93dcdb Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 4 Aug 2026 15:30:45 +0200 Subject: [PATCH] add support for nunchaku-lite models and engine Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 6 ++++ TODO.md | 1 - cli/hf-info.py | 1 + data/reference-nunchaku.json | 62 ++++++++++++++++++++++++++++++++++++ installer.py | 1 + modules/attention.py | 4 +-- modules/model_quant.py | 2 ++ pipelines/model_ernie.py | 4 +++ pipelines/model_flux.py | 4 +++ pipelines/model_qwen.py | 4 +++ pipelines/model_z_image.py | 3 ++ 11 files changed, 89 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68e663c9f..037bea7b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,12 @@ - [Microsoft Mage-Flow](https://huggingface.co/mage-flow-community/Mage-Flow) in *Base* and *Turbo* (distilled) variants Mage-Flow is a 4B-scale generative stack for efficient text-to-image generation and instruction-based image editing *note*: Microsoft released and then unpublished the model, but we still have a mirror available for download + - [Nunchaku-Lite](https://huggingface.co/lite-infer) pre-quantized models + included: *Z-Image, Flux.1-Dev/Schnell/Krea/Kontex, Qwen-Image/Image-Edit, Ernie-Image* - **Features** + - add support for [Nunchaku-Lite](https://github.com/rootonchair/nunchaku-lite) inference engine + unlike Nunchaku, Nunchaku-Lite is based on Kernels and does not require any additional packages to be installed + but like original Nunchaku, it is only available for CUDA and right now only for `torch==2.11/2.12` - storage analyzer: new feature that analyzes your storage used by sdnext per type and location *system -> storage* - video: support for scripts/extensions @@ -30,6 +35,7 @@ - sdnq check contiguous - torch reset compile cache on reload - bypass sdna for caption/prompt-enhance calls + - skip sdnq for small weights ## Update for 2026-07-23 diff --git a/TODO.md b/TODO.md index 294d05efb..487f062f7 100644 --- a/TODO.md +++ b/TODO.md @@ -18,7 +18,6 @@ ### Unassigned -- [Nunchaku Lite](https://github.com/huggingface/diffusers/pull/14100) - [Object clear](https://huggingface.co/jixin0101/ObjectClear) remover for Kanvas - Video models: add to Reference - Video models: support custom entries, finetunes diff --git a/cli/hf-info.py b/cli/hf-info.py index d9dfd8ebd..0da4aae1f 100755 --- a/cli/hf-info.py +++ b/cli/hf-info.py @@ -702,6 +702,7 @@ def search(repo_id: str) -> int: "pipeline": pipeline_value, "gated": gated_value, "size": size_total_raw, + "size_gb": round(size_total_raw / (1024**3), 2) if isinstance(size_total_raw, int) else None, "class": model_class, "dit": ", ".join(main_dit_entries) if len(main_dit_entries) > 0 else None, "dit_params": model_params_raw, diff --git a/data/reference-nunchaku.json b/data/reference-nunchaku.json index 002a6bb46..cffe2ecd5 100644 --- a/data/reference-nunchaku.json +++ b/data/reference-nunchaku.json @@ -212,5 +212,67 @@ "extras": "sampler: Default, cfg_scale: 1.0, steps: 4", "size": 19.38, "date": "2023 November" + }, + "Z-Image-Turbo Nunchaku-Lite": { + "path": "lite-infer/z-image-turbo-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "Tongyi-MAI--Z-Image-Turbo.jpg", + "extras": "sampler: Default, cfg_scale: 1.0, steps: 9", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 6.17, + "date": "2026 July" + }, + "Baidu ERNIE-Image Nunchaku-Lite": { + "path": "lite-infer/ERNIE-Image-Turbo-nunchaku-lite-int4-bnb4-text-encoder", + "preview": "baidu--ERNIE-Image.jpg", + "extras": "sampler: Default, cfg_scale: 4.0, steps: 50", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 6.88, + "date": "2026 July" + }, + "BFL FLUX.1 Dev Nunchaku-Lite": { + "path": "lite-infer/flux.1-dev-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "black-forest-labs--FLUX.1-dev.jpg", + "extras": "sampler: Default, cfg_scale: 3.5", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 10.97, + "date": "2026 July" + }, + "BFL FLUX.1 Schnell Nunchaku-Lite": { + "path": "lite-infer/flux.1-schnell-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "black-forest-labs--FLUX.1-schnell.jpg", + "extras": "sampler: Default, cfg_scale: 3.5", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 10.95, + "date": "2026 July" + }, + "BFL FLUX.1 Kontext Nunchaku-Lite": { + "path": "lite-infer/flux.1-kontext-dev-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "black-forest-labs--FLUX.1-Kontext-dev.jpg", + "extras": "sampler: Default, cfg_scale: 3.5", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 10.97, + "date": "2026 July" + }, + "BFL FLUX.1 Krea Nunchaku-Lite": { + "path": "lite-infer/flux.1-krea-dev-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "black-forest-labs--FLUX.1-Krea-dev.jpg", + "extras": "sampler: Default, cfg_scale: 4.5", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 10.97, + "date": "2026 July" + }, + "Qwen-Image Nunchaku-Lite": { + "path": "lite-infer/Qwen-Image-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "Qwen--Qwen-Image.jpg", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 16.81, + "date": "2026 July" + }, + "Qwen-Image-Edit-2509 Nunchaku-Lite": { + "path": "lite-infer/qwen-image-edit-2509-nunchaku-lite-int4_r32-bnb4-text-encoder", + "preview": "Qwen--Qwen-Image-Edit-2509.jpg", + "desc": "Nunchaku-Lite quantization using precompiled Kernels", + "size": 16.81, + "date": "2026 July" } } diff --git a/installer.py b/installer.py index b021f3050..cef9feb63 100644 --- a/installer.py +++ b/installer.py @@ -1377,6 +1377,7 @@ def set_environment(): os.environ.setdefault('CUDA_MODULE_LOADING', 'LAZY') os.environ.setdefault('DO_NOT_TRACK', '1') os.environ.setdefault('FORCE_CUDA', '1') + os.environ.setdefault('DIFFUSERS_TRUST_REMOTE_KERNELS', 'true') os.environ.setdefault('GRADIO_ANALYTICS_ENABLED', 'False') os.environ.setdefault('K_DIFFUSION_USE_COMPILE', '0') os.environ.setdefault('KINETO_LOG_LEVEL', '3') diff --git a/modules/attention.py b/modules/attention.py index 5adc483ae..7380b5210 100644 --- a/modules/attention.py +++ b/modules/attention.py @@ -291,7 +291,7 @@ def set_diffusers_attention(pipe, quiet = False): orig_get_kernel = None def get_kernel_hijack(repo_id, revision=None, version=None, backend=None, user_agent=None, trust_remote_code: bool | list[str] = False): # pylint: disable=unused-argument log.debug(f'Attention dispatcher hub: repo="{repo_id}" revision={revision} version={version} backend={backend}') - user_agent = 'kernels/0.14.1' + user_agent = 'kernels/0.16.0' module = None try: module = orig_get_kernel(repo_id, revision=revision, version=version, backend=backend, user_agent=user_agent, trust_remote_code=True) @@ -309,7 +309,7 @@ def get_hf_api_hijack(user_agent = None): # pylint: disable=unused-argument def hijack_kernels(): global orig_get_kernel # pylint: disable=global-statement try: - install('kernels==0.14.1') + install('kernels==0.16.0') import kernels import kernels.utils log.debug(f'Attention dispatcher: kernels={kernels.__version__}') diff --git a/modules/model_quant.py b/modules/model_quant.py index c9733ed56..bd990bcc1 100644 --- a/modules/model_quant.py +++ b/modules/model_quant.py @@ -198,6 +198,8 @@ def check_nunchaku(module: str = ''): from modules import shared if 'nunchaku' not in shared.opts.sd_model_checkpoint.lower(): return False + if 'nunchaku-lite' in shared.opts.sd_model_checkpoint.lower(): + return False base_path = shared.opts.sd_model_checkpoint.split('+')[0] for v in shared.reference_models.values(): if v.get('path', '') != base_path: diff --git a/pipelines/model_ernie.py b/pipelines/model_ernie.py index 5f9e5a5a8..b739b7fce 100644 --- a/pipelines/model_ernie.py +++ b/pipelines/model_ernie.py @@ -14,6 +14,10 @@ def load_ernie_image(checkpoint_info, diffusers_load_config=None): load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, allow_quant=False) log.debug(f'Load model: type=ERNIE-Image repo="{repo_id}" offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args} pe={shared.opts.model_ernie_enable_pe}') + if 'nunchaku-lite' in repo_id.lower(): + from modules.attention import hijack_kernels + hijack_kernels() + from pipelines.ernie import ERNIE_SPEC transformer = generic.load_transformer( repo_id, diff --git a/pipelines/model_flux.py b/pipelines/model_flux.py index cc823163a..fcf4cc44b 100644 --- a/pipelines/model_flux.py +++ b/pipelines/model_flux.py @@ -46,6 +46,10 @@ def load_flux(checkpoint_info, diffusers_load_config=None): from pipelines.flux.flux_nunchaku import load_flux_nunchaku transformer = load_flux_nunchaku(repo_id) + if 'nunchaku-lite' in repo_id.lower(): + from modules.attention import hijack_kernels + hijack_kernels() + # finally load transformer and text encoder if not already loaded if transformer is None: transformer = generic.load_transformer(repo_id, cls_name=diffusers.FluxTransformer2DModel, load_config=diffusers_load_config) diff --git a/pipelines/model_qwen.py b/pipelines/model_qwen.py index 5dbdf8736..0e44c76d7 100644 --- a/pipelines/model_qwen.py +++ b/pipelines/model_qwen.py @@ -16,6 +16,10 @@ def load_qwen(checkpoint_info, diffusers_load_config=None): load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, module='Model') 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 'nunchaku-lite' in repo_id.lower(): + from modules.attention import hijack_kernels + hijack_kernels() + if '2509' in repo_id or '2511' in repo_id: cls_name = diffusers.QwenImageEditPlusPipeline diffusers.pipelines.auto_pipeline.AUTO_TEXT2IMAGE_PIPELINES_MAPPING["qwen-image"] = diffusers.QwenImageEditPlusPipeline diff --git a/pipelines/model_z_image.py b/pipelines/model_z_image.py index dab801f42..c5ada8492 100644 --- a/pipelines/model_z_image.py +++ b/pipelines/model_z_image.py @@ -43,6 +43,9 @@ def load_z_image(checkpoint_info, diffusers_load_config=None): transformer = None if model_quant.check_nunchaku('Model'): # only available model transformer = init_nunchaku() + if 'nunchaku-lite' in repo_id.lower(): + from modules.attention import hijack_kernels + hijack_kernels() if transformer is None: transformer = generic.load_transformer(repo_id, cls_name=diffusers.ZImageTransformer2DModel, load_config=diffusers_load_config)