ComfyUI Node Runs on cloud

multiModelMerge

Blend three checkpoints in the graph with multiModelMerge

By TinyTerraΒ·Created 3 years agoΒ·Updated 3 months agoΒ· 604
multiModelMerge
  • model_A_override
  • model_B_override
  • model_C_override
  • clip_A_override
  • clip_B_override
  • clip_C_override
  • model
  • clip
β—„ckpt_A_nameβ–Ύβ–Ί
β—„config_A_nameDefaultβ–Ί
β—„ckpt_B_nameβ–Ύβ–Ί
β—„config_B_nameDefaultβ–Ί
β—„ckpt_C_nameβ–Ύβ–Ί
β—„config_C_nameDefaultβ–Ί
β—„model_interpolationβ–Ύβ–Ί
β—„model_multiplier1.00β–Ί
β—„clip_interpolationβ–Ύβ–Ί
β—„clip_multiplier1.00β–Ί

Merging checkpoints is normally a separate tool's job - you fire up a merge app, pick a formula, wait, and then load the result. tinyterra's multiModelMerge (ttN multiModelMerge) skips all of that: it loads up to three checkpoints and blends them in the graph, spitting out a model and a clip you can wire straight into a sampler.

The reason this is useful isn't the merge itself - it's the workflow. You can A/B test a 70/30 blend against the raw checkpoints by changing one slider and re-running, no round-trip through a merge utility and no 6 GB file sitting on disk. For "I wonder what happens if…" experiments it's genuinely the fastest path. If you want a permanent merged model you still want a real merge tool; this is for iterating live.

How the math works

The node takes checkpoints A, B and C and gives you two interpolation modes, selected with model_interpolation:

  • Weighted sum - A*(1-M) + B*M. The classic blend. At M=0 you get pure A, at M=1 pure B. This is what most people mean by "merge two models."
  • Add difference - A + (B-C)*M. Model arithmetic: apply the difference between B and C onto A. This is how you do "add this style, subtract that one" merges, and it's where the third checkpoint earns its keep.

model_multiplier is the M - a float from 0 to 1. C is optional (set ckpt_C_name to "None" if you're only doing a two-way weighted sum).

What's easy to miss: the CLIP gets its own interpolation controls. clip_interpolation defaults to "Follow model interp", but you can instead pick its own weighted sum, add-difference, or just force "A Only", "B Only" or "C Only" with a separate clip_multiplier. That split exists because you sometimes want the model weights blended one way and the text encoder another - a checkpoint's CLIP heavily colors its style, and being able to keep one model's CLIP while blending the UNet is a real trick.

Inputs and outputs

Required: ckpt_A_name plus config_A_name (a config dropdown if you need something other than "Default"), ckpt_B_name, ckpt_C_name, and the interpolation/multiplier fields above.

Optional: model_A_override / model_B_override / model_C_override and clip_A_override / clip_B_override / clip_C_override. These let you merge models that already exist in your graph instead of reloading from disk - handy when one of them is already inside a pipe or came out of a LoRA stack.

Outputs are exactly two: model and clip. Wire them into a tinyKSampler, pipeKSampler, or any plain KSampler.

Install and the gotcha

Same pack install as everything in tinyterraNodes - ComfyUI Manager, search ComfyUI_tinyterraNodes, or git clone https://github.com/TinyTerra/ComfyUI_tinyterraNodes.git into ComfyUI/custom_nodes, then restart. No extra dependencies, no downloads.

The gotcha is memory, and it's a doozy: the node loads every checkpoint you name into VRAM/RAM. Merge three 6 GB checkpoints plus your sampler's own model and you can watch your memory vanish. If you're only doing A and B, leave C at "None" so it's not loaded at all. And note this path is classic SD1.5/SDXL territory - the checkpoint+config model of loading assumes the old architectures, so don't expect it to merge GGUF or the newest Flux-format checkpoints.

Category🌏 tinyterra

Inputs (16)

NameTypeDefaultDescription
ckpt_A_nameCOMBO0 options:
config_A_nameCOMBODefault12 options: Default, anything_v3.yaml, v1-inference.yaml, v1-inference_clip_skip_2.yaml, v1-inference_clip_skip_2_fp16.yaml, v1-inference_fp16.yaml, +6
ckpt_B_nameCOMBO1 options: None
config_B_nameCOMBODefault12 options: Default, anything_v3.yaml, v1-inference.yaml, v1-inference_clip_skip_2.yaml, v1-inference_clip_skip_2_fp16.yaml, v1-inference_fp16.yaml, +6
ckpt_C_nameCOMBO1 options: None
config_C_nameCOMBODefault12 options: Default, anything_v3.yaml, v1-inference.yaml, v1-inference_clip_skip_2.yaml, v1-inference_clip_skip_2_fp16.yaml, v1-inference_fp16.yaml, +6
model_interpolationCOMBO3 options: Weighted sum = ( A*(1-M) + B*M ), Add difference = ( A + (B-C)*M ), A Only
model_multiplierFLOAT1.000–1β€”
clip_interpolationCOMBO6 options: Follow model interp, Weighted sum = ( A*(1-M) + B*M ), Add difference = ( A + (B-C)*M ), A Only, B Only, C Only
clip_multiplierFLOAT1.000–1β€”
model_A_overrideoptMODELβ€”
model_B_overrideoptMODELβ€”
model_C_overrideoptMODELβ€”
clip_A_overrideoptCLIPβ€”
clip_B_overrideoptCLIPβ€”
clip_C_overrideoptCLIPβ€”

Outputs (2)

NameTypeDescription
modelMODELβ€”
clipCLIPβ€”