Klein LoRA Checkpoint XY Plot
XY-plot your Flux Klein LoRAs
- model
- clip
- vae
- noise
- sampler
- sigmas
- latent
- images
- x_labels
- y_labels
- columns
So you trained a Flux Klein LoRA, and your trainer saved checkpoints at step 250, 500, 750 and 1000. Now the question is which one is the one - and if you're like most people, "answering" that means rebuilding the same sampler a dozen times, swapping the LoRA each run, and eyeballing screenshots from a folder. This node kills that ritual. It loops over every LoRA checkpoint × prompt combination in a single run and hands you a flat, labelled batch ready for the pack's grid assembler. Rows are your checkpoints, columns are your prompts, done in one queue.
Be honest about what you're getting, though. This is a small single-author pack - one commit, MIT, a few hundred lines - with essentially no community footprint. It's a purpose-built tool for one narrow job: evaluating training progress on Flux Klein. It does that job well, but it isn't a famous name, so treat it like any niche custom node and glance at the source before you trust it with anything precious.
The clever bit
The sampler doesn't just return images. It also returns the column labels, the row labels, and the column count as separate outputs, so the partner node (XYGridAssembler) can draw your grid without you retyping a single label. Most generic XY-plot nodes make you fill the axis text in by hand; this one carries the labels along for the ride. That's the design that makes the whole pack worth two nodes instead of one.
Wiring it up
Mechanically it's a loop around SamplerCustomAdvanced's guts - the code even says so in the docstring. Instead of hardcoding steps or a scheduler, it accepts the same noise, sampler, sigmas and latent inputs, so you wire it exactly the way you'd wire the advanced sampler: RandomNoise into noise, KSamplerSelect into sampler, the Flux2 scheduler node into sigmas, EmptyFlux2LatentImage into latent, plus your model, clip and vae. The bundled example workflow loads flux2-klein-base-9b, a qwen_3_8b_fp8mixed CLIP and the flux2 VAE at 1024×1024.
For each checkpoint it loads the LoRA weights, encodes each prompt, builds a CFG guider and samples with your noise/sampler/sigmas, then decodes through the VAE. The negative prompt is hardcoded to an empty string - which is correct for Flux, since it doesn't use one. Each image fires a live preview as it finishes, and the LoRA is freed right after its row (del m, c), so VRAM doesn't accumulate across checkpoints. The whole decoded batch does stay in memory until the run ends, which is why really large grids can get heavy.
The inputs that actually matter
lora_names- one per line, no extension:my-trainresolves tomy-train.safetensorsin ComfyUI'slorasfolder. Subfolders use forward slashes (my-person/step-1000). If the name doesn't resolve, it raises a clearFileNotFoundError.prompts- one per line. This is where your trigger word goes; it's literally the test of whether the LoRA learned it.cfg- defaults to 5.0. A fair warning: the distilled Klein template everyone runs sits near CFG 1, and the author's default targets the base model checkpoints you're actually comparing. The example workflow uses 4 with 50 steps. If your grid looks overcooked or contrasty, this is the knob.sample_base_model- prepends a "Base Model" row with no LoRA applied. Turn this on first; without a baseline you can't tell whether a checkpoint learned something or just changed the image.lora_strength_model/lora_strength_clip- applied uniformly to every checkpoint. Handy for re-checking the whole sweep at 0.8.save_individual_images+filename_prefix- writes each cell tooutput/{prefix}/{lora_name}_00001_.pngwith full workflow metadata, which is a tidy way to keep the winner as a standalone file.
Outputs and installation
It returns images (the flat, row-major batch), x_labels, y_labels and columns (the prompt count) - feed all four straight into XYGridAssembler.
Install via ComfyUI Manager (search comfyui-lora-helpers) or:
cd ComfyUI/custom_nodes
git clone https://github.com/shommey/comfyui-lora-helpers
Then restart ComfyUI. Dependencies are just Pillow, torch and numpy - already in any working ComfyUI, and there's nothing to download from the pack itself; the Klein base model, Qwen3 CLIP and VAE are yours. If you hit FileNotFoundError, the name is byte-for-byte wrong against your loras folder - and don't mix 4B and 9B Klein LoRAs in one grid, because Klein LoRAs don't cross sizes.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| noise | NOISE | — | |
| sampler | SAMPLER | — | |
| sigmas | SIGMAS | — | |
| latent | LATENT | — | |
| lora_names | STRING | One LoRA checkpoint per line — blank lines are ignored. Each entry becomes a row (Y axis) in the grid. Type the name without extension: 'my-train' resolves to my-train.safetensors in ComfyUI's loras folder. Use forward slashes for subfolders: 'my-person/step-1000' resolves to my-person/step-1000.safetensors. | |
| prompts | STRING | a photo of a sks person smiling a close-up portrait of a sks person a sks person in a park, golden hour | One prompt per line — blank lines are ignored. Each prompt becomes a column (X axis) in the output grid. Use your trigger word here to test how well the LoRA has learned it. |
| cfg | FLOAT | 5.00–100 | CFG scale passed to the guider. 5.0 is a solid default for Flux Klein. |
| lora_strength_model | FLOAT | 1.00-10–10 | How strongly the LoRA modifies the diffusion model weights. Applied uniformly to every checkpoint. |
| lora_strength_clip | FLOAT | 1.00-10–10 | How strongly the LoRA modifies the CLIP/text encoder weights. Applied uniformly to every checkpoint. |
| sample_base_model | BOOLEAN | false | When enabled, prepends a 'Base Model' row to the grid where every prompt is sampled with no LoRA applied. Useful for comparing LoRA outputs against the unmodified model to judge how much each checkpoint has changed generation. |
| save_individual_images | BOOLEAN | false | When enabled, saves each generated image individually to ComfyUI's output folder with full workflow metadata. Files are organised as output/{filename_prefix}/{lora_name}_00001_.png. |
| filename_prefix | STRING | klein_xy | Output subfolder and filename prefix used when 'Save individual images' is enabled. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| x_labels | STRING | — |
| y_labels | STRING | — |
| columns | INT | — |