LC Krea2 LoRA Block Scan
Your Krea 2 LoRA Welded One Face Onto Everything — This Node Finds the Blocks to Blame
- model
- vae
- positive
- negative
- grid
- report
- blocks
The problem this exists for
You found a Krea 2 LoRA that nails the outfit, the palette, the look - and it also welded one specific face onto every image you generate with it. That isn't your prompt's fault. The LoRA's identity signal is baked into some subset of the model's 28 blocks, and where it sits changes from LoRA to LoRA.
You can hand-hunt those blocks, but with 28 uniform blocks and 8 layer rows inside each one, guessing is a bad strategy. This node does the experiment instead: it renders your prompt with the LoRA turned off one block group at a time, then measures which removal freed the face.
Reach for it when you've decided a LoRA is worth keeping but its face lock isn't. Krea 2's LoRA supply is enormous and mostly unvetted - a partner shipped 999 of them within three days of release, and at that volume you're going to hit a few that clobber identity. This is the tool that lets you keep the good part.
How it works
It's a render-and-score loop, not a clever analysis of the LoRA's weights - which is exactly why you should trust its answer over a pure weights inspection.
The node builds a plan of rows: No LoRA, Full LoRA, then one more row per group in groups, each with that group's blocks multiplied down to off_value. Every row renders the same seed batch, so the only variable is which blocks the LoRA is allowed to touch. Rows come back as one labeled grid.
Each row then gets scored twice over. The same-face score (0–1, lower = more variety) comes from the same InsightFace models the pack's LC Face Variety Scorer uses - SCRFD detect, ArcFace embed, straight through onnxruntime, no insightface package required. Whole-image change is LPIPS if you happen to have the lpips package installed, otherwise it falls back to 1 − SSIM on a 256px grey copy.
Finally the suggestion. It takes the group-removal row that frees the face most, and if it beats the Full LoRA row by 0.03 or more, sets that group to 0.3 in a 28-value curve. That threshold matters: 8 seeds wobble by about 0.02 on their own, so anything smaller is noise, and the report will tell you so rather than inventing a finding.
Inputs and outputs that matter
The ones to set deliberately:
model- Krea 2 without the LoRA. Feed it straight from your UNET loader; the scanning happens inside the node.positive- a prompt with one clear face and a scene, so it can score both face lock and whole-image change.groups- default0-3, 4-9, 10-15, 16-21, 22-27, fusion.fusionmeans the text fusion layers outside the 28 blocks. Each group is one more row of renders, so this is where your runtime goes.images- seeds per row, 8 by default. Fewer is faster and noisier.
The sampler settings default to 1024×1024, 8 steps, cfg 1, euler/simple - Krea 2 Turbo settings. Scanning on Krea 2 Raw instead? Bump to roughly 52 steps and cfg 3.5 or you're measuring a different model. negative is optional and unwired means a zeroed negative, which is right at cfg 1.
Outputs: grid (the labeled render grid), report (scores and what they suggest, as text), and blocks - the suggested 28-block curve. Wire blocks into LC Krea2 LoRA Editor's blocks_in (convert it to an input first), or just copy the numbers.
Installing it
ComfyUI Manager → search LC ModelBuilder → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_ModelBuilder_nodes
Check that __init__.py sits directly in the folder and isn't nested a level deeper, then restart and hard-refresh with Ctrl+Shift+R.
There's no requirements.txt - the merge and save nodes use only what ComfyUI core already ships. This node's scoring half needs onnxruntime, and install.py handles that: it installs plain CPU onnxruntime if you have none, and changes nothing if you already have any flavour. Cloned by hand? Run python install.py once with ComfyUI's own Python.
Two things outside the pack: you need a recent ComfyUI build with Krea 2 support (native support landed in 0.25.0), and you need the model's companions - the Krea 2 checkpoint plus the Qwen3-VL text encoder and Qwen-Image VAE. People miss those two constantly and then blame the node.
Where people get burned
The first run downloads ~280 MB. The face models are InsightFace's buffalo_l pack, fetched into ComfyUI/models/insightface/models/buffalo_l/. If IPAdapter FaceID or ReActor already put it there, nothing downloads. Those files are non-commercial research use only - check that before shipping the output commercially.
It is not cheap. Six groups plus the two baselines at 8 images is 64 renders. Drop images to 4 or narrow groups if you just want a rough answer.
"Not enough faces found to score face lock." Your prompt didn't produce a detectable face. Use one clear face.
"This LoRA barely locks the face." Then there's nothing to turn down - the report says this explicitly when the effect is inside the seed noise. Try spike_soften set to directions in the Editor instead.
No group frees the face enough. The report's other suggestion is real: if the best row is Fusion off, set outside_blocks down in the Editor instead of touching the bars. And if you want finer granularity than a 6-block window, split groups into smaller ranges - you'll pay in render time.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Krea 2 model, without the LoRA. | |
| vae | VAE | — | |
| positive | CONDITIONING | A prompt that shows a face (for face lock) and a scene (for whole-image change). | |
| lora_name | COMBO | LoRA to scan, from models/loras. | |
| strength | FLOAT | 1.00-4–4 | — |
| groups | STRING | 0-3, 4-9, 10-15, 16-21, 22-27, fusion | Block groups to turn off one at a time, comma separated. fusion = the text fusion layers outside the 28 blocks. Each group is one more row of renders. |
| off_value | FLOAT | 0.000–1 | What 'off' means for the group being tested. 0 = fully off. |
| seed | INT | 420–18446744073709550000 | — |
| images | INT | 82–16 | Seeds per row (one batch). 8 gives a steady same-face score; fewer is faster but noisier. |
| width | INT | 1024256–2048 | — |
| height | INT | 1024256–2048 | — |
| steps | INT | 81–100 | — |
| cfg | FLOAT | 1.00–30 | — |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| negativeopt | CONDITIONING | Optional. Unwired = an empty (zeroed) negative, right for cfg 1. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| grid | IMAGE | One row per render set: no LoRA, full LoRA, then each group off. |
| report | STRING | Scores per row and what they suggest. |
| blocks | STRING | Suggested 28-block curve. Wire into LC Krea2 LoRA Editor's blocks (convert it to an input) or copy it. |