add support for nunchaku-lite models and engine

Signed-off-by: Vladimir Mandic <[email protected]>
This commit is contained in:
Vladimir Mandic
2026-08-04 15:31:05 +02:00
parent 9a7fa12218
commit a1df374773
11 changed files with 89 additions and 3 deletions
+6
View File
@@ -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
-1
View File
@@ -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
+1
View File
@@ -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,
+62
View File
@@ -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"
}
}
+1
View File
@@ -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')
+2 -2
View File
@@ -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__}')
+2
View File
@@ -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:
+4
View File
@@ -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,
+4
View File
@@ -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)
+4
View File
@@ -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
+3
View File
@@ -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)