Nodes/Iris-3B/Iris Sampler (Advanced)
ComfyUI Node

Iris Sampler (Advanced)

Every dial Iris actually has, including the two nobody uses

By bani4kaskashka·Created 23 days ago·Updated 22 days ago· 13
Iris Sampler (Advanced)
  • model
  • conditioning
  • image
  • IMAGE
◄steps50►
◄cfg3.0►
◄seed0►
◄batch_size1►
◄modetext to image►
◄denoise0.50►
◄shift4.0►
◄solver_order2►
◄cfg_start0.00►
◄cfg_end1.00►
◄width1024►
◄height1024►
◄keep_model_on_gpufalse►

Iris Sampler (Advanced) is the Simple sampler with the presets taken off. Same solver, same flow schedule, same pixel-space output - you just get to name the step count instead of picking "balanced", and you get real width and height fields instead of eleven fixed aspect ratios. If you're chasing a specific composition or reproducing someone else's settings, this is the one you want.

What it's running

DPM-Solver++ over a flow-matching schedule, with the flow shift exposed. Iris was trained with a shift of 4.0 and 100 steps, so those are the numbers the model card gives you and the defaults here sit near them (steps defaults to 50, which the author flags against the model card's 100).

The solver order is a real choice, and it's the one setting on this node that isn't just "copy the model card":

  • solver_order 2 - the second-order DPM-Solver++ step, which uses the previous step's prediction as well as the current one. Better quality per step, and the default.
  • solver_order 1 - plain first-order. Cheaper, noisier in the low-step regime, occasionally useful if you're doing a very low step count and seeing weirdness.

Internally the sampler falls back to first order on the first step and the last step regardless, because second order needs a previous sample to interpolate against. That's not a quirk of this pack; it's how multistep solvers work.

Two more mechanism notes that explain the UI. First, CFG here is not the same object as the Simple sampler's preset - it's a free float from 1 to 20, default 3.0, and with cfg_start / cfg_end you can window when guidance applies across the noise level, in flow time from 0 to 1. Leave them at 0 and 1 unless you're deliberately experimenting; guidance windows are a fiddly way to trade prompt adherence against blowout, and on a model already running at CFG 3 there isn't much blown-out to fix. Second, previews: because Iris predicts pixels, the sampler can show you the actual decoded preview as it goes, at no extra cost. If your ComfyUI has previews on, you get them.

The fields a beginner actually sets

model - from Load Iris-3B Model, optionally through a LoRA loader. Turbo LoRA attached will make this node error out by design.

conditioning - from Iris Text Encode.

width and height - 256 to 2048 in steps of 16. They have to be multiples of the model's patch size or the sampler raises rather than rounding for you. In image-to-image the connected image is scaled and centre-cropped to this size.

steps, cfg, seed, batch_size - the familiar four. Batch 1–8 images per run.

denoise - image-to-image only, 0.01 to 1. Here's the bit worth understanding: it doesn't shorten the run, it changes where the run starts. The sampler builds a steps / denoise grid and takes the last steps steps of it, noising your input image to that first level. So a 30-step run at denoise 0.5 is still 30 model passes, it just begins halfway along the trajectory. denoise at 1 ignores your image entirely.

shift - leave at 4.0. It's a training-time property of the flow schedule, not a taste dial, and moving it away from 4 gives you a model evaluating a schedule it never learned.

keep_model_on_gpu - off by default. Turning it on skips moving the 6 GB DiT back to system RAM after sampling, which saves a transfer per run if you're doing a long batch of single-image runs and nothing else needs the VRAM. The pack's whole memory strategy is that this model only occupies the GPU for its own step; this flag is the opt-out.

The output is a plain IMAGE and the optional image input takes the source for image-to-image.

Install

ComfyUI-Manager, search Iris-3B. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/bani4kaskashka/Iris-3B-Comfy-Nodes
pip install -r requirements.txt

Then restart, and open Iris-3B Text to Image (Advanced) from Templates - that workflow is this node with every setting exposed.

Where it goes wrong

"width and height must be multiples of 16" (or of the patch size, if it differs). Round your dimensions. This is a hard error, not a warning.

You set a size you like and the composition got worse. 1600x1600 is 2.5 megapixels - well past the ~1 MP region Iris was fine-tuned in. The eleven presets on the Simple sampler are all 1 MP for a reason. Generate at 1 MP and use Iris Upscale to get big.

Image-to-image is oddly strong or oddly weak at a given denoise. Remember the grid behaviour above, and remember it also interacts with steps: at 4 steps and denoise 0.3, the grid gets coarse. Bump steps if you're doing low-denoise img2img.

Cold start is slow, then it's fast. First run loads the weights off disk. Repeat runs on the same model are dramatically faster - the author's measured numbers on a 16 GB card were 1.8 s/step steady versus 16.4 s/step on a competing pack by its third run, because this one keeps each model in RAM between passes instead of letting things pile up on the card.

CategoryIris-3B

Inputs (16)

NameTypeDefaultDescription
modelIRIS_MODEL—
conditioningIRIS_CONDITIONING—
stepsINT501–500the model card default is 100
cfgFLOAT3.01–20—
seedINT00–18446744073709550000—
batch_sizeINT11–8images per run
modeCOMBOtext to imageimage to image starts from the connected image instead of pure noise
denoiseFLOAT0.500.01–1image to image only: 1 ignores the image content, lower values keep more of it
shiftFLOAT4.00.1–20flow shift (trained with 4.0)
solver_orderINT21–2DPM-Solver++ order
cfg_startFLOAT0.000–1CFG applies only for noise levels t in (cfg_start, cfg_end); 1 = pure noise
cfg_endFLOAT1.000–1—
widthINT1024256–2048in image to image the input is scaled and cropped to this size
heightINT1024256–2048—
keep_model_on_gpuBOOLEANfalseskip moving the 6 GB DiT back to RAM after sampling
imageoptIMAGEsource for image to image (ignored in text to image)

Outputs (1)

NameTypeDescription
IMAGEIMAGE—