LoRA Test Grid
The fastest way to A/B test LoRAs without rebuilding your prompt
- model
- clip
- vae
- grid
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-slotstrength_1…strength_6widgets while it's on.
The lora_1–lora_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.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Base model. A baseline (no-LoRA) tile is always rendered from this. | |
| clip | CLIP | Base CLIP. | |
| vae | VAE | VAE used to build the empty latent and decode results. | |
| trigger | STRING | Trigger word(s), prepended before the prompt, e.g. zxq_marilyn | |
| prompt | STRING | — | |
| aspect_ratio | COMBO | 1:1 (1024x1024) | 7 options: 1:1 (1024x1024), 4:3 (1152x896), 3:4 (896x1152), 3:2 (1216x832), 2:3 (832x1216), 16:9 (1344x768), +1 |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 81–10000 | — |
| cfg | FLOAT | 1.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| use_master_strengthopt | BOOLEAN | false | When on, master_strength overrides every LoRA's individual strength below. |
| master_strengthopt | FLOAT | 1.00-5–5 | — |
| lora_1opt | COMBO | None | 1 options: None |
| strength_1opt | FLOAT | 1.00-5–5 | — |
| lora_2opt | COMBO | None | 1 options: None |
| strength_2opt | FLOAT | 1.00-5–5 | — |
| lora_3opt | COMBO | None | 1 options: None |
| strength_3opt | FLOAT | 1.00-5–5 | — |
| lora_4opt | COMBO | None | 1 options: None |
| strength_4opt | FLOAT | 1.00-5–5 | — |
| lora_5opt | COMBO | None | 1 options: None |
| strength_5opt | FLOAT | 1.00-5–5 | — |
| lora_6opt | COMBO | None | 1 options: None |
| strength_6opt | FLOAT | 1.00-5–5 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| grid | IMAGE | — |