Nodes/Comfyui-ZiT-Lora-loader/Z-Image Turbo LoRA Loader
ComfyUI Node

Z-Image Turbo LoRA Loader

Your Z-Image LoRAs Have Been Half-Dead — This Loader Fixes the Quiet Killer

By capitan01R·Created 6 months ago·Updated 5 months ago· 36
Z-Image Turbo LoRA Loader
  • model
  • MODEL
lora_name
strength_model1.00
auto_convert_qkvtrue
layer_strengths{}
lora_name_override

Z-Image Turbo is a joy to run - 6B params, ~30 seconds an image on a 3060, LoRAs that train on a potato. But if you've been loading those LoRAs with ComfyUI's stock LoraLoader and something feels slightly off - face not quite right, style only half there - it's not your imagination. It's your attention weights getting thrown away.

Here's the problem, and it's architectural. Z-Image Turbo (Lumina2) stores attention as a single fused QKV matrix. Most trainers export LoRAs in the standard diffusers format with separate to_q / to_k / to_v keys. ComfyUI's generic loader looks for the fused qkv keys, can't find them, and quietly skips them - same story for the output projection, where the LoRA says to_out.0 but Z-Image expects out. The result is partial patches: the LoRA loads, logs no error, and does maybe half of what it should. The pack author hit exactly this on his own LoRAs and built this loader as the fix. His phrasing in the release thread is perfect: results that "felt off but not completely broken."

How it works

Run the node and it does three things you can verify in the console log:

  • Builds an architecture-aware key map using ComfyUI's own comfy.utils.z_image_to_diffusers(), with a fallback for older ComfyUI builds.
  • Detects separate Q/K/V keys in the LoRA and fuses them into Z-Image's fused qkv format at load time - concatenating the A and B matrices and averaging the alpha scales.
  • Remaps to_out.0out.

Then it patches a clone of your model like any loader would. MODEL in, patched MODEL out.

The inputs that actually matter

  • model - your Z-Image Turbo model. The node warns if the model isn't Lumina2.
  • lora_name - dropdown of everything in models/loras.
  • strength_model - global strength, −20 to 20, default 1. Forget the SDXL 0.5–0.8 habit: on Z-Image people run 1.0 and above, because dropping it costs likeness.
  • auto_convert_qkv - the toggle that does the fusion. Leave it on.
  • lora_name_override (optional) - wire a string in to bypass the dropdown.
  • layer_strengths (optional, hidden) - written by the built-in graph widget.

That graph widget is the sleeper feature. It shows 30 columns, one per transformer layer, split between attention (purple, top) and feed-forward (teal, bottom). Drag a bar to set that layer's strength, click to toggle a layer off, shift-drag to move all active layers together. It serializes into the hidden layer_strengths input, so you can rescue a LoRA that over- or under-trained specific layers without touching a JSON file.

Installing it

Via ComfyUI Manager, search for the pack title Comfyui-ZiT-Lora-loader (or just "Z-Image Turbo LoRA"). Or the old-fashioned way:

cd ComfyUI/custom_nodes
git clone https://github.com/capitan01R/Comfyui-ZiT-Lora-loader

Restart ComfyUI. That's it - there's no requirements.txt, no model files to download, and the only Python dependency is numpy, which ships with ComfyUI anyway. It's pure loader logic. Just make sure your ComfyUI is recent enough to have native Z-Image support; on an old build the node logs "not Lumina2" and falls back to a generic key map that won't fix the QKV problem.

Where people get burned

  • Trust but verify. Check the console for [Z-Image LoRA] Applied N patches. If you want proof the fix matters, render the same seed and prompt once through the stock loader and once through this one - the difference is usually obvious.
  • strength_model = 0 returns the model untouched. That's a bypass, not a bug.
  • Turbo LoRAs don't work on Z-Image Base at all - that's a model-level incompatibility, not a loader bug. Don't blame this node.
  • Single-LoRA only. Stacking multiple is what the sibling Z-Image Turbo LoRA Stack node is for, and stacking has its own caveats.

Drop-in replacement is the whole pitch: swap the node, keep the wiring, and suddenly the LoRA you thought was weak is the LoRA you actually trained.

Categoryloaders/Z-Image

Inputs (6)

NameTypeDefaultDescription
modelMODEL
lora_nameCOMBO0 options:
strength_modelFLOAT1.00-20–20
auto_convert_qkvBOOLEANtrue
layer_strengthsoptSTRING{}
lora_name_overrideoptSTRING

Outputs (1)

NameTypeDescription
MODELMODEL