Nodes/LoRA Test Grid/LoRA Test Grid
ComfyUI Node

LoRA Test Grid

The fastest way to A/B test LoRAs without rebuilding your prompt

By muse-collective-26·Created 2 months ago·Updated 2 months ago· 1
LoRA Test Grid
  • model
  • clip
  • vae
  • grid
trigger
prompt
aspect_ratio1:1 (1024x1024)
seed0
steps8
cfg1.0
sampler_name
scheduler
use_master_strengthfalse
master_strength1.00
lora_1None
strength_11.00
lora_2None
strength_21.00
lora_3None
strength_31.00
lora_4None
strength_41.00
lora_5None
strength_51.00
lora_6None
strength_61.00

You know the drill. You've got a folder of six LoRAs that all claim to nail the same character, and you need to know which one actually does. The slow way is swapping the LoRA in, generating, saving, swapping again, and trying to remember what number 3 looked like by the time number 6 finishes. LoRA Test Grid does the whole comparison in one run: give it a base model, a CLIP, a VAE, one shared prompt, and up to six LoRAs, and it tiles a baseline (no-LoRA) render plus every LoRA variant into a single labeled grid. Same seed, same settings for every tile, so the only variable is the adapter. That's the whole pitch, and if you test adapters regularly it saves you an absurd amount of clicking.

How it works

It's not a wrapper around anything external - no API key, and it calls nothing but ComfyUI's own core nodes internally (LoraLoader, CLIPTextEncode, common_ksampler, VAEDecode). That's smart: as ComfyUI updates, the node rides along on core's compatibility instead of rotting.

The loop is simple. For each slot it loads the base model, optionally patches in the LoRA, encodes the prompt, samples with your shared settings, decodes, and stamps a label bar with the filename and strength. The first tile is always "Base (no LoRA)" so you have a reference point baked into the grid. Everything then gets pasted onto one canvas, three columns wide, with a gap between tiles.

Two implementation details are worth knowing because they shape what this node is for. First, the empty latent is built by VAE-encoding a mid-gray image rather than assuming a fixed latent channel count - so it isn't tied to one model architecture. Second, there's no negative-prompt widget: the negative conditioning is just the positive prompt zeroed out (ConditioningZeroOut). That's the standard setup for guidance-distilled models like Z-Image Turbo, which run at CFG 1 anyway. A hint about who this was built for: the defaults (8 steps, CFG 1.0, 1024x1024) are straight off a Z-Image-Turbo-style card.

The inputs that actually matter

You only touch a handful:

  • model, clip, vae - wire these up like any normal sampling graph.
  • trigger - prepended to the prompt automatically. Many LoRAs are dead without their trigger word, and this keeps it out of the shared prompt so you don't forget it between tests.
  • prompt - the one shared test prompt. Keep it simple; you're testing the adapter, not your prompt-writing.
  • use_master_strength / master_strength - when on, one value overrides every slot's individual strength. Great when you're comparing LoRAs at identical weight. The web UI hides the per-slot strength_1strength_6 widgets while it's on.

The lora_1lora_6 dropdowns list everything in your loras folder; the per-slot strengths tune each one independently when master strength is off. seed, steps, cfg, sampler_name, scheduler, and aspect_ratio are the shared sampling settings every tile inherits.

The output

grid (IMAGE) - the labeled comparison grid. Wire it into a Preview Image or Save Image node. Because it's a normal image you can feed it to an upscaler or face-detailer for a closer look at the winners.

Installing it

Easiest via ComfyUI Manager: search for lora-test-grid and install, then restart. Or clone it by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/muse-collective-26/lora-test-grid

Restart ComfyUI and you'll find LoRA Test Grid under testing/lora. Nothing heavy to download - no models, no pip deps beyond Pillow and numpy, which you already have. It ships an example workflow (workflows/LoRA Test Grid.json) built around a Z-Image-Turbo-style pipeline, with a Load Image node for dropping in a reference photo to eyeball against.

Where people get burned

The big one: the LoRA dropdown lists every file in your loras folder, regardless of architecture. An SDXL LoRA on a Z-Image model won't error - it'll just silently do nothing or produce garbage. Same trap as everywhere else in ComfyUI, but now you get to stare at a wrong-architecture file next to the baseline and wonder. Check the base model matches.

Second, remember the zeroed-out negative. This node is built for CFG-1 distilled models. If you point it at an undistilled base that wants CFG 3-5 and a real negative prompt, you're missing half the dials and results will look off. It's a test harness for turbo-style workflows, not a general-purpose sampler.

Finally, budget: seven tiles is seven full generations. On Z-Image Turbo that's fast enough to be painless; on a slower base or a 6 GB card it adds up. Lower your steps for screening, then do one proper render of the finalist. And if per-LoRA strength widgets look desynced after reloading a saved workflow, update the pack - the fix (hiding widgets in place rather than removing them) landed in a recent commit.

Categorytesting/lora

Inputs (25)

NameTypeDefaultDescription
modelMODELBase model. A baseline (no-LoRA) tile is always rendered from this.
clipCLIPBase CLIP.
vaeVAEVAE used to build the empty latent and decode results.
triggerSTRINGTrigger word(s), prepended before the prompt, e.g. zxq_marilyn
promptSTRING
aspect_ratioCOMBO1:1 (1024x1024)7 options: 1:1 (1024x1024), 4:3 (1152x896), 3:4 (896x1152), 3:2 (1216x832), 2:3 (832x1216), 16:9 (1344x768), +1
seedINT00–18446744073709550000
stepsINT81–10000
cfgFLOAT1.00–100
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
use_master_strengthoptBOOLEANfalseWhen on, master_strength overrides every LoRA's individual strength below.
master_strengthoptFLOAT1.00-5–5
lora_1optCOMBONone1 options: None
strength_1optFLOAT1.00-5–5
lora_2optCOMBONone1 options: None
strength_2optFLOAT1.00-5–5
lora_3optCOMBONone1 options: None
strength_3optFLOAT1.00-5–5
lora_4optCOMBONone1 options: None
strength_4optFLOAT1.00-5–5
lora_5optCOMBONone1 options: None
strength_5optFLOAT1.00-5–5
lora_6optCOMBONone1 options: None
strength_6optFLOAT1.00-5–5

Outputs (1)

NameTypeDescription
gridIMAGE