From 71762d788f45efb012391e538c1240275a190384 Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Sun, 29 Jun 2025 23:57:50 +0800 Subject: [PATCH] Add Lora Loader node support for Nunchaku SVDQuant FLUX model architecture with template workflow. Fixes #255 --- example_workflows/nunchaku-flux.1-dev.jpg | Bin 0 -> 69166 bytes example_workflows/nunchaku-flux.1-dev.json | 1 + py/nodes/lora_loader.py | 46 +++++++++++--- py/nodes/utils.py | 69 ++++++++++++++++++++- pyproject.toml | 1 + 5 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 example_workflows/nunchaku-flux.1-dev.jpg create mode 100644 example_workflows/nunchaku-flux.1-dev.json diff --git a/example_workflows/nunchaku-flux.1-dev.jpg b/example_workflows/nunchaku-flux.1-dev.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e8dfaadd8b69b1205ff2b7ef328c8e7a4a436dd GIT binary patch literal 69166 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�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
    rKl(D7#>0Xm{J;=e4N0snEY$2>3{S2v8LJkg8 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 ",[{"name":"Mezzotint_Artstyle_for_Flux_-_by_Ethanar","strength":0.2,"active":true,"clipStrength":0.2,"expanded":false},{"name":"RetroAnimeFluxV1","strength":0.8,"active":true,"clipStrength":0.8,"expanded":false},{"name":"flux.1_lora_flyway_ink-dynamic","strength":0.8,"active":true,"clipStrength":0.8,"expanded":false},{"name":"ck-painterly-fantasy-000017","strength":0.2,"active":true,"clipStrength":0.2,"expanded":false},{"name":"FluxMythG0thicL1nes","strength":0.4,"active":true,"clipStrength":0.4,"expanded":false},{"name":"1","strength":0.75,"active":true,"clipStrength":0.75,"expanded":false}]],"color":"#323","bgcolor":"#535"},{"id":50,"type":"TriggerWord Toggle (LoraManager)","pos":[390.2729797363281,926.0449829101562],"size":[318.5542907714844,260],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"group_mode","name":"group_mode","type":"BOOLEAN","widget":{"name":"group_mode"},"link":null},{"localized_name":"default_active","name":"default_active","type":"BOOLEAN","widget":{"name":"default_active"},"link":null},{"name":"trigger_words","shape":7,"type":"string","link":136}],"outputs":[{"localized_name":"filtered_trigger_words","name":"filtered_trigger_words","type":"STRING","links":[137]}],"properties":{"cnr_id":"comfyui-lora-manager","ver":"4043846767d4339bcf6bbb2eb3407c7fac94615d","Node name for S&R":"TriggerWord Toggle (LoraManager)"},"widgets_values":[true,true,[{"text":"G0thicL1nes","active":true},{"text":"amanoer","active":true}],"G0thicL1nes,, amanoer"],"color":"#323","bgcolor":"#535"},{"id":55,"type":"Lora Stacker (LoraManager)","pos":[-573.553955078125,586.1253662109375],"size":[414.74151611328125,332],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null},{"name":"lora_stack","shape":7,"type":"LORA_STACK","link":null}],"outputs":[{"localized_name":"LORA_STACK","name":"LORA_STACK","type":"LORA_STACK","links":[144]},{"localized_name":"trigger_words","name":"trigger_words","type":"STRING","links":null},{"localized_name":"active_loras","name":"active_loras","type":"STRING","links":null}],"properties":{"cnr_id":"comfyui-lora-manager","ver":"4043846767d4339bcf6bbb2eb3407c7fac94615d","Node name for S&R":"Lora Stacker (LoraManager)"},"widgets_values":["",[{"name":"FLUX.1-Turbo-Alpha","strength":1,"active":true,"clipStrength":1,"expanded":false}]],"color":"#233","bgcolor":"#355"},{"id":56,"type":"StringConstantMultiline","pos":[-60.967350006103516,584.9976196289062],"size":[400,200],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"string","name":"string","type":"STRING","widget":{"name":"string"},"link":null},{"localized_name":"strip_newlines","name":"strip_newlines","type":"BOOLEAN","widget":{"name":"strip_newlines"},"link":null}],"outputs":[{"localized_name":"STRING","name":"STRING","type":"STRING","links":[146]}],"properties":{"cnr_id":"comfyui-kjnodes","ver":"1.1.2","Node name for S&R":"StringConstantMultiline"},"widgets_values":["a futuristic, cyberpunk-styled female warrior. She stands in the center of the image, exuding a commanding presence. Her skin is pale and her long, flowing white hair contrasts starkly with the dark, metallic armor that covers her body. The armor is intricately detailed with sharp, angular lines and glowing blue accents, particularly around her right arm, which emits a vibrant, ethereal blue light.\nShe wields a large, double-headed scythe that is almost as tall as she is. The scythe has a metallic sheen, with one blade being a sharp, white, almost crystalline material, and the other blade emitting a similar blue glow. Her expression is intense and focused, with piercing blue eyes that match the glow from her arm.\nBehind her, a massive, serpentine dragon with a similarly pale, almost white, scales is coiled protectively. The dragon's eyes are glowing blue, matching her arm and adding to the overall mystical and powerful aura of the scene. The background is a dark, industrial setting with blurred, metallic structures and neon lights, enhancing the cyberpunk feel. The artwork is highly detailed and rendered in a realistic yet fantastical style, typical of high-quality digital art.",false],"color":"#232","bgcolor":"#353"},{"id":51,"type":"JoinStrings","pos":[416.567138671875,598.2608032226562],"size":[270,78],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"string1","name":"string1","type":"STRING","link":137},{"localized_name":"string2","name":"string2","type":"STRING","link":146},{"localized_name":"delimiter","name":"delimiter","type":"STRING","widget":{"name":"delimiter"},"link":null}],"outputs":[{"localized_name":"STRING","name":"STRING","type":"STRING","links":[139]}],"properties":{"cnr_id":"comfyui-kjnodes","ver":"1.1.2","Node name for S&R":"JoinStrings"},"widgets_values":[", "],"color":"#232","bgcolor":"#353"},{"id":6,"type":"CLIPTextEncode","pos":[240.22817993164062,363.7594909667969],"size":[263.2095642089844,88],"flags":{"collapsed":false},"order":15,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":127},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":139}],"outputs":[{"localized_name":"CONDITIONING","name":"CONDITIONING","type":"CONDITIONING","slot_index":0,"links":[41]}],"title":"CLIP Text Encode (Positive Prompt)","properties":{"cnr_id":"comfy-core","ver":"0.3.24","Node name for S&R":"CLIPTextEncode"},"widgets_values":["a dynamic and dramatic digital artwork featuring a stylized anthropomorphic white tiger with striking yellow eyes. The tiger is depicted in a powerful stance, wielding a katana with one hand raised above its head. Its fur is detailed with black stripes, and its mane flows wildly, blending with the stormy background. The scene is set amidst swirling dark clouds and flashes of lightning, enhancing the sense of movement and energy. The composition is vertical, with the tiger positioned centrally, creating a sense of depth and intensity. The color palette is dominated by shades of blue, gray, and white, with bright highlights from the lightning. The overall style is reminiscent of fantasy or manga art, with a focus on dynamic action and dramatic lighting."],"color":"#232","bgcolor":"#353"}],"links":[[12,10,0,8,1,"VAE"],[19,16,0,13,2,"SAMPLER"],[20,17,0,13,3,"SIGMAS"],[24,13,0,8,0,"LATENT"],[30,22,0,13,1,"GUIDER"],[37,25,0,13,0,"NOISE"],[41,6,0,26,0,"CONDITIONING"],[42,26,0,22,1,"CONDITIONING"],[54,30,0,22,0,"MODEL"],[55,30,0,17,0,"MODEL"],[112,34,0,27,0,"INT"],[113,35,0,27,1,"INT"],[114,35,0,30,4,"INT"],[115,34,0,30,3,"INT"],[116,27,0,13,4,"LATENT"],[127,44,0,6,0,"CLIP"],[133,45,0,48,0,"MODEL"],[135,8,0,49,0,"IMAGE"],[136,48,2,50,2,"string"],[137,50,0,51,0,"STRING"],[139,51,0,6,1,"STRING"],[143,48,0,30,0,"MODEL"],[144,55,0,48,3,"LORA_STACK"],[146,56,0,51,1,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.9849732675807675,"offset":[486.518281834556,-142.01476750486412]},"groupNodes":{"EmptyLatentImage":{"nodes":[{"type":"PrimitiveNode","pos":[432,480],"size":{"0":210,"1":82},"flags":{},"order":6,"mode":0,"outputs":[{"name":"INT","type":"INT","links":[],"widget":{"name":"height"},"slot_index":0}],"title":"height","properties":{"Run widget replace on values":false},"color":"#323","bgcolor":"#535","index":0},{"type":"PrimitiveNode","pos":[672,480],"size":{"0":210,"1":82},"flags":{},"order":7,"mode":0,"outputs":[{"name":"INT","type":"INT","links":[],"slot_index":0,"widget":{"name":"width"}}],"title":"width","properties":{"Run widget replace on values":false},"color":"#323","bgcolor":"#535","index":1},{"type":"EmptySD3LatentImage","pos":[480,624],"size":{"0":315,"1":106},"flags":{},"order":10,"mode":0,"inputs":[{"name":"width","type":"INT","link":null,"widget":{"name":"width"}},{"name":"height","type":"INT","link":null,"widget":{"name":"height"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"EmptySD3LatentImage"},"widgets_values":[1024,1024,1],"index":2}],"links":[[1,0,2,0,34,"INT"],[0,0,2,1,35,"INT"]],"external":[[0,0,"INT"],[1,0,"INT"],[2,0,"LATENT"]],"config":{"0":{"output":{"0":{"name":"height"}},"input":{"value":{"visible":true}}},"1":{"output":{"0":{"name":"width"}},"input":{"value":{"visible":true}}},"2":{"input":{"width":{"visible":false},"height":{"visible":false}}}}}},"node_versions":{"comfy-core":"0.3.24"}},"version":0.4} \ No newline at end of file diff --git a/py/nodes/lora_loader.py b/py/nodes/lora_loader.py index 58a9aa89..8d45e19c 100644 --- a/py/nodes/lora_loader.py +++ b/py/nodes/lora_loader.py @@ -2,14 +2,14 @@ import logging from nodes import LoraLoader from comfy.comfy_types import IO # type: ignore import asyncio -from .utils import FlexibleOptionalInputType, any_type, get_lora_info, extract_lora_name, get_loras_list +from .utils import FlexibleOptionalInputType, any_type, get_lora_info, extract_lora_name, get_loras_list, nunchaku_load_lora logger = logging.getLogger(__name__) class LoraManagerLoader: NAME = "Lora Loader (LoraManager)" CATEGORY = "Lora Manager/loaders" - + @classmethod def INPUT_TYPES(cls): return { @@ -37,19 +37,39 @@ class LoraManagerLoader: clip = kwargs.get('clip', None) lora_stack = kwargs.get('lora_stack', None) + + # Check if model is a Nunchaku Flux model - simplified approach + is_nunchaku_model = False + + try: + model_wrapper = model.model.diffusion_model + # Check if model is a Nunchaku Flux model using only class name + if model_wrapper.__class__.__name__ == "ComfyFluxWrapper": + is_nunchaku_model = True + logger.info("Detected Nunchaku Flux model") + except (AttributeError, TypeError): + # Not a model with the expected structure + pass + # First process lora_stack if available if lora_stack: for lora_path, model_strength, clip_strength in lora_stack: - # Apply the LoRA using the provided path and strengths - model, clip = LoraLoader().load_lora(model, clip, lora_path, model_strength, clip_strength) + # Apply the LoRA using the appropriate loader + if is_nunchaku_model: + # Use our custom function for Flux models + model = nunchaku_load_lora(model, lora_path, model_strength) + # clip remains unchanged for Nunchaku models + else: + # Use default loader for standard models + model, clip = LoraLoader().load_lora(model, clip, lora_path, model_strength, clip_strength) # Extract lora name for trigger words lookup lora_name = extract_lora_name(lora_path) _, trigger_words = asyncio.run(get_lora_info(lora_name)) all_trigger_words.extend(trigger_words) - # Add clip strength to output if different from model strength - if abs(model_strength - clip_strength) > 0.001: + # Add clip strength to output if different from model strength (except for Nunchaku models) + if not is_nunchaku_model and abs(model_strength - clip_strength) > 0.001: loaded_loras.append(f"{lora_name}: {model_strength},{clip_strength}") else: loaded_loras.append(f"{lora_name}: {model_strength}") @@ -68,11 +88,17 @@ class LoraManagerLoader: # Get lora path and trigger words lora_path, trigger_words = asyncio.run(get_lora_info(lora_name)) - # Apply the LoRA using the resolved path with separate strengths - model, clip = LoraLoader().load_lora(model, clip, lora_path, model_strength, clip_strength) + # Apply the LoRA using the appropriate loader + if is_nunchaku_model: + # For Nunchaku models, use our custom function + model = nunchaku_load_lora(model, lora_path, model_strength) + # clip remains unchanged + else: + # Use default loader for standard models + model, clip = LoraLoader().load_lora(model, clip, lora_path, model_strength, clip_strength) - # Include clip strength in output if different from model strength - if abs(model_strength - clip_strength) > 0.001: + # Include clip strength in output if different from model strength and not a Nunchaku model + if not is_nunchaku_model and abs(model_strength - clip_strength) > 0.001: loaded_loras.append(f"{lora_name}: {model_strength},{clip_strength}") else: loaded_loras.append(f"{lora_name}: {model_strength}") diff --git a/py/nodes/utils.py b/py/nodes/utils.py index 1feb1a77..33a3c972 100644 --- a/py/nodes/utils.py +++ b/py/nodes/utils.py @@ -35,7 +35,12 @@ any_type = AnyType("*") # Common methods extracted from lora_loader.py and lora_stacker.py import os import logging -import asyncio +import copy +import folder_paths +import torch +import safetensors.torch +from diffusers.utils.state_dict_utils import convert_unet_state_dict_to_peft +from diffusers.loaders import FluxLoraLoaderMixin from ..services.lora_scanner import LoraScanner from ..config import config @@ -81,4 +86,64 @@ def get_loras_list(kwargs): # Unexpected format else: logger.warning(f"Unexpected loras format: {type(loras_data)}") - return [] \ No newline at end of file + return [] + +def load_state_dict_in_safetensors(path, device="cpu", filter_prefix=""): + """Simplified version of load_state_dict_in_safetensors that just loads from a local path""" + state_dict = {} + with safetensors.torch.safe_open(path, framework="pt", device=device) as f: + for k in f.keys(): + if filter_prefix and not k.startswith(filter_prefix): + continue + state_dict[k.removeprefix(filter_prefix)] = f.get_tensor(k) + return state_dict + +def to_diffusers(input_lora): + """Simplified version of to_diffusers for Flux LoRA conversion""" + if isinstance(input_lora, str): + tensors = load_state_dict_in_safetensors(input_lora, device="cpu") + else: + tensors = {k: v for k, v in input_lora.items()} + + # Convert FP8 tensors to BF16 + for k, v in tensors.items(): + if v.dtype not in [torch.float64, torch.float32, torch.bfloat16, torch.float16]: + tensors[k] = v.to(torch.bfloat16) + + new_tensors = FluxLoraLoaderMixin.lora_state_dict(tensors) + new_tensors = convert_unet_state_dict_to_peft(new_tensors) + + return new_tensors + +def nunchaku_load_lora(model, lora_name, lora_strength): + """Load a Flux LoRA for Nunchaku model""" + model_wrapper = model.model.diffusion_model + transformer = model_wrapper.model + + # Save the transformer temporarily + model_wrapper.model = None + ret_model = copy.deepcopy(model) # copy everything except the model + ret_model_wrapper = ret_model.model.diffusion_model + + # Restore the model and set it for the copy + model_wrapper.model = transformer + ret_model_wrapper.model = transformer + + # Get full path to the LoRA file + lora_path = folder_paths.get_full_path("loras", lora_name) + ret_model_wrapper.loras.append((lora_path, lora_strength)) + + # Convert the LoRA to diffusers format + sd = to_diffusers(lora_path) + + # Handle embedding adjustment if needed + if "transformer.x_embedder.lora_A.weight" in sd: + new_in_channels = sd["transformer.x_embedder.lora_A.weight"].shape[1] + assert new_in_channels % 4 == 0 + new_in_channels = new_in_channels // 4 + + old_in_channels = ret_model.model.model_config.unet_config["in_channels"] + if old_in_channels < new_in_channels: + ret_model.model.model_config.unet_config["in_channels"] = new_in_channels + + return ret_model \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index a586d61c..746ec8b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ dependencies = [ "aiohttp", "jinja2", "safetensors", + "diffusers", "watchdog", "beautifulsoup4", "piexif",