Eric Krea2 Sweep Plan
One queue item, a whole grid of samplers and schedules
- sweep
Every fine-tune has a preferred sampler, scheduler, step count and mu - and all of them are really proxies for one thing: how far that model's training eroded the turbo distillation. Instead of guessing, this node measures. Wire Eric Krea2 Sweep Plan into Ultra V2's sweep input (the last socket), fill in the axes you want to test, and one queue item runs the whole grid against a fixed seed: per-cell PNGs with the full recipe embedded, a labeled contact sheet, sweep_summary.csv, and a JSON manifest. It turns sampler folklore into a spreadsheet.
Grid mode vs combos mode
There are two ways to tell it what to run, and mode picks between them.
Grid is the default: fill any axis field and the node takes the cross product. The ones you'll actually set first:
samplers- all 13 ship pre-populated (euler,res_2m,res_2s,deis_3m,abnorsett_3m/4m,lawson4_4s,etdrk4_4s,er_sde,rk6_7s,lcm, the hybrids). Delete what you don't want; blank = not swept.schedulers- built-in curves and saved ★ sigma-preset names mixed freely; each entry resolves as a schedule first, then as a sigmas preset. Unknown names are skipped with a console warning, never an abort.steps,windows(e.g.5-12, 6-12→ start/end step),etas,noise_types,cfgs,shift_modes/mus,hybrid_steps,megapixels.
pair_lock zips samplers+schedulers into fixed pairs for testing a known recipe; off = full cross product. max_combos (default 64) is a hard cap - over-cap plans refuse with an axis-size breakdown rather than silently truncating, which is the honest behavior you want.
Combos mode skips the grid: one JSON object per line in combos_json (or a file via combos_file), using the same widget keys as Ultra presets and PNG recipes. {"s2_sampler": "lcm_hybrid", "s2_steps": 12, "s2_start_step": 6} - copy-pasteable straight off a stamped image. Campaigns become versionable files.
The knobs that shape a sane sweep
stage_scope (s1 / s2 / s3 / all_stages) decides which stage the swept keys hit, and the workflow intent is spelled out in the tooltip: perfect Stage 1 first, then sweep s2/s3 refinement on the short list. quick_screen forces S1-only at screen_megapixels for cheap wide grids - and for s2/s3-only sweeps, the post-S1 latent is computed once and reused across cells, which is what makes a 40-cell refine sweep finish in minutes.
The newer axes are where this gets genuinely interesting for Krea 2's ecosystem: lora_mode=bakeoff tests each style LoRA against the bare checkpoint (the lora_triggers field even merges each LoRA's trigger words into its cell's prompt), prompts adds a prompt axis (slowest, deliberately), and sigma_profiles sweeps saved sigma shapes as full per-cell profiles. Failed cells never kill a sweep - red tile plus a manifest error - and interrupts finalize the files on disk before the queue stops.
Wiring and install
enabled (default on) means "off = the node outputs nothing and Ultra runs a normal single generation" - you can leave the sweep wired in and toggle it. sweep_preset backs onto sweep_presets.json; selecting one writes its values into the panel so you always see exactly what will run, and editing any field flips it back to custom.
It ships with the rest of the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Krea2_ComfyUI_Advanced
Restart, and remember the pack needs a diffusers build with Krea2Pipeline plus Krea 2 weights - see the pack README for the --force-reinstall install from the HF git repo.
Where people get burned
Watch out for axes that differ only by inert knobs - the plan dedupes cells where eta/noise don't apply (e.g. on euler/lcm), but it can't read your mind about whether sweeping megapixels is worth the VRAM. Resolution changes the noise grid, so composition shifts with size even at a fixed seed; that's part of what you're measuring, but it makes megapixels sweeps noisier to read. Start wide with quick_screen, narrow with stage_scope, and let Sweep → Preset promote the winners.
Inputs (37)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | grid | 2 options: grid, combos |
| stage_scope | COMBO | s1 | Which stage(s) the swept keys apply to. all_stages sets the same value on s1+s2+s3 together (NOT a per-stage cross product). Workflow intent: perfect S1 first (quick_screen), then sweep s2/s3 refinement on the short list. |
| samplersopt | STRING | euler, res_2m, res_2s, deis_3m, abnorsett_3m, abnorsett_4m, lawson4_4s, etdrk4_4s, er_sde, rk6_7s, lcm, lcm_hybrid, lcm_hybrid2 | Comma/newline-separated. Allowed: euler, res_2m, res_2s, deis_3m, abnorsett_3m, abnorsett_4m, lawson4_4s, etdrk4_4s, er_sde, rk6_7s, lcm, lcm_hybrid, lcm_hybrid2. Pre-populated with all of them - delete what you don't want. Blank = not swept. Crossed with hybrid_steps, only the hybrid samplers expand per split value; other samplers keep one cell (inert-split dedupe). |
| schedulersopt | STRING | linear, balanced, karras, beta57, beta, bong_tangent, exponential, linear_quadratic, simple, 4mp-lcm, Candidate 1, Claude-1, Claude-8mp, EXP1, EXP2, EXP3, EXP4, EXP5, EXP6, Kreamania3-2stage-4.5mp, OPT-AB412, OPT-DEIS12, kreamania3-2stage-8mp | Built-in schedules AND saved sigma-shape ★ preset names, mixed freely: each entry is tried as a schedule (linear, balanced, karras, beta57, beta, bong_tangent, exponential, linear_quadratic, simple) first, then as a sigmas preset (applied as a full profile for that cell); unknown names are SKIPPED with a console warning instead of aborting. Pre-populated with everything available - delete what you don't want. Blank = not swept. |
| pair_lockopt | BOOLEAN | false | ON: zip samplers+schedulers line-by-line into fixed pairs (lists must be equal length) - for testing known recipes. OFF: full cross product. |
| stepsopt | STRING | e.g. '8, 10, 12'. Maps to <stage>_steps. | |
| windowsopt | STRING | Refine windows 'start-end', e.g. '5-12, 6-12, 7-12'. Maps to <stage>_start_step/<stage>_end_step. Pair with matching steps or leave steps blank and window within the panel's step count. | |
| etasopt | STRING | e.g. '0, 0.3, 1.0' -> <stage>_eta. | |
| noise_typesopt | STRING | Allowed: white, low_freq, high_freq, pink. lcm-family samplers force white (per the 2026-07-23 rainbow fix); those cells are auto-coerced and labeled, never silently divergent. | |
| cfgsopt | STRING | e.g. '1.0, 1.5, 2.0' -> <stage>_cfg. Diagnostic for RAW-drifted fine tunes: tolerance of cfg>1 tracks how far training eroded the turbo distillation. | |
| shift_modesopt | STRING | distilled_shift values to sweep: fixed / resolution / manual. | |
| musopt | STRING | shift mu values for the scoped stage(s), e.g. '1.15, 2.1, 3.0'. Forces distilled_shift=manual on those cells (unless shift_modes is also swept, which then wins the cross). | |
| combos_fileopt | STRING | combos mode: path to a JSON file with the runs - either a JSON array of override objects, {"combos": [...]}, or JSON-lines. Takes precedence over combos_json below. Keeps sweep campaigns as versionable files. | |
| combos_jsonopt | STRING | combos mode: one JSON object per line using Ultra V2 widget keys (same keys as presets / PNG recipes), e.g. {"s2_sampler": "lcm_hybrid", "s2_steps": 12, "s2_start_step": 6} Copy-paste directly from a preset or a stamped PNG. | |
| seed_policyopt | COMBO | fixed | fixed: every cell uses the Ultra panel seed (required for fair comparison). seeds_axis: 'seeds' below becomes one more grid axis. |
| seedsopt | STRING | seeds_axis values, e.g. '1, 2, 3'. | |
| quick_screenopt | BOOLEAN | false | Force S1-only at screen_megapixels for every cell (upscale_to_stage2/3 = 0). Cheap wide screening; re-run the short list full-pipeline after. |
| screen_megapixelsopt | FLOAT | 1.000.25–8 | — |
| score_metricsopt | BOOLEAN | true | Compute technical metrics per cell (CPU, ms): Laplacian + Tenengrad sharpness, wavelet noise sigma, flat-region chroma variance (splotch detector), clip fraction. Scores annotate + can sort the sheet; they never hide a cell. |
| sort_byopt | COMBO | plan_order | Contact-sheet order. Metrics sort best-first; time_s fastest-first. Manifest keeps plan order + this ordering separately. |
| tile_pxopt | INT | 448128–1024 | — |
| max_combosopt | INT | 641–4096 | Hard cap. Over-cap plans REFUSE with an axis-size breakdown (no silent truncation). |
| output_folderopt | STRING | Where sweep folders are created. Blank = ComfyUI output/sweeps. An absolute path is used as-is; a relative path is created under the ComfyUI output directory. | |
| hybrid_stepsopt | STRING | Sweep the hybrids' handoff in EXACT lcm steps, e.g. '3, 4, 5, 6' -> <stage>_hybrid_steps for the scoped stage(s). Only lcm_hybrid / lcm_hybrid2 read it - pair with a hybrid in the samplers axis (or on the panel); inert cells are deduped. Values clamp inside each stage's window so both halves always run; sweeping values past window-1 collapses to the same cell. | |
| megapixelsopt | STRING | Sweep s1_megapixels, e.g. '0.5, 1.0, 2.0, 4.5'. Always targets Stage 1 regardless of stage_scope (stage 2/3 sizes chain from it via the upscale factors). Mixed cell sizes are fine: metrics and the contact sheet use each cell's native output; the IMAGE batch output center-pads smaller cells to the largest. quick_screen does NOT override a swept megapixels value. Note: resolution changes the noise grid, so composition shifts with size even at a fixed seed - that is part of what you are measuring. | |
| lora_modeopt | COMBO | none | bakeoff: each LoRA in lora_files at each lora_strengths value - by default the swept LoRA runs ALONE (panel stack replaced) so every style is measured against the bare checkpoint; keep_panel_stack layers it on top instead. strength_ladder: keep the panel-declared stack, step ONLY the lora_target entry through lora_strengths. Sweep-injected entries are ephemeral (fused per cell, cleaned per cell). |
| lora_filesopt | STRING | bakeoff: one LoRA per line - a name from the loras folder (same resolution as the LoRA Stack node) or a full path. | |
| lora_strengthsopt | STRING | e.g. '0.6, 0.8, 1.0'. One value drives all three stage weights (weight_s1=s2=s3). bakeoff: every file at every value; ladder: the target entry's values. | |
| lora_targetopt | STRING | 1 | strength_ladder: which panel-stack entry to vary - 1-based index, or a name substring (matches lora_name/filename). |
| include_baselineopt | BOOLEAN | true | Add one reference cell: bakeoff = no LoRA at all (or the panel stack alone when keep_panel_stack is ON); ladder = the panel stack exactly as declared. |
| keep_panel_stackopt | BOOLEAN | false | bakeoff only: append the swept LoRA ON TOP of the panel stack instead of replacing it. |
| promptsopt | STRING | One prompt per line = a prompt axis (slowest axis, so the sheet and CSV read in prompt-major blocks). Each prompt cell re-encodes (prompt_conditioning is cleared; ~seconds/cell). Metric comparisons are only meaningful WITHIN a prompt block. | |
| sigma_profilesopt | STRING | Comma/newline list of saved sigma-shape preset NAMES (the ★ presets of the Eric Krea2 Sigmas node). Each cell rebuilds the full bundle from that preset and it OVERRIDES any wired sigmas node for that cell. Blank = not swept. | |
| lora_triggersopt | COMBO | append | bakeoff: merge each cell's swept-LoRA trigger words into that cell's prompt (from the LoRA Stack node's cached trigger database; first-seen files may do one network lookup, non-fatal on failure). Only sweep-injected entries contribute - baseline and ladder cells are untouched. A cell whose prompt text changes re-encodes automatically. Effective prompt + triggers are recorded in the cell's metadata. |
| enabledopt | BOOLEAN | true | Off = the node outputs nothing and Ultra V2 runs a normal single generation - leave the sweep wired in the workflow and toggle it. |
| sweep_presetopt | COMBO | custom | Named sweep plans from sweep_presets.json. Selecting one WRITES its values into this panel (so you can see exactly what will run); editing any field flips back to 'custom'. Save the panel as a preset with the ★ button. Headless/API: the named preset applies fully. Ask Claude to author experiment presets. |
| preset_notesopt | STRING | One or two sentences: what this sweep preset is FOR and what it does. Saved and loaded with the ★ preset - so future-you remembers why it exists. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| sweep | KREA2_SWEEP | — |