Nodes/EasyLoRAMerger/🎨 Easy LoRA Merger
ComfyUI Node

🎨 Easy LoRA Merger

Merge Up to Three LoRAs in One Go

By Terpentinas·Created 7 months ago·Updated 4 months ago· 12
🎨 Easy LoRA Merger
  • model
  • clip
  • lora_data_a
  • lora_data_b
  • lora_data_c
  • lora
  • model
  • clip
  • output_path
  • forensic_report
methodlinear
density1.00
lora_a
lora_b
lora_c
weight_a1.00
weight_b1.00
weight_c1.00
blend_modeauto
energy_preservationtrue
balancing_modesafe
magnitude_scalingnone
active_thresholdtrue
uniqueness0.70
threshold0.00
blend0.50
deviceauto
precisionauto
batch_size32
streamingtrue
save_triggerfalse
filenametriple_merged
save_folder/tmp/ComfyUI/models/loras
metadata_modemerge_basic

This is the flagship - the display name, "Easy LoRA Merger," is the pack's name, and it's the node the author built the whole thing around. It merges two or three LoRAs into one and applies the result to a model in a single node. Instead of the usual "stack three LoRA Loaders at different weights and hope" approach, you get a merged adapter that behaves like one LoRA.

The origin story explains why it exists. The author (Terpentinas) built it after failing to merge a Musubi-tuner LoRA with an AI-Toolkit one for Flux Klein 4B - every existing merger choked on the trainer mismatch. So the whole pack is built around one hard problem: merging LoRAs that don't share a trainer, a rank, or even an architecture.

How it works

At the base, it's the same weighted-combination math as any merger - method defaults to linear, and for LoRAs the weights are genuinely independent (they're tiny deltas, not absolute weights, so 1.0 + 1.0 is fine). The difference is everything layered on top to make mismatched LoRAs play nice:

  • balancing_mode - the equalization brain. safe (default) hard-matches energy on shared layers only; creative is looser; intensity uses peak-energy detection for cross-concept merges; impact adds sparsity correction for sparse-vs-dense cases like Anima. This is why the weights don't behave like a simple 70/30 mix.
  • magnitude_scaling - scales LoRAs B and C to match A's energy using RMS or a top-X% percentile, so one loud LoRA doesn't drown the others.
  • energy_preservation - on by default; keep it that way. It stops the merge from pumping up overall magnitude.
  • active_threshold - only merges the "active" non-zero regions of each tensor.

The honest caveat, straight from the author's beta post: cross-trainer merges aren't 1:1. You may need 2–4x weight on one side to get the balance you want. That's the price of the compatibility.

Inputs that matter

  • model / clip - required; the merge is applied straight onto them. Wire the outputs into a sampler to see the result.
  • lora_a / lora_b / lora_c - dropdowns, or lora_data_a/b/c chained from another merge.
  • weight_a / weight_b / weight_c - start all at 1.0, then treat them as "loudness," not ratio. Tune in 0.1 steps.
  • method - linear first. Try magnitude or feature_mix later; the DARE/TIES family is mostly for when you know what you're doing.
  • save_trigger - off = preview through the live model/clip outputs; on = write the merged .safetensors to your loras folder.

Outputs: lora (the merged adapter - chain it into the Easy LoRA Baker to permanently bake it), model and clip (the applied result), output_path, and forensic_report.

Installing it

Manager (search "Easy LoRA Merger") or:

cd ComfyUI/custom_nodes
git clone https://github.com/Terpentinas/EasyLoRAMerger

Restart ComfyUI. No model downloads.

Gotchas

Community feedback on the beta: one tester got a genuinely nice stable blend of two character LoRAs but found it fiddly compared to stacking LoRAs in rgthree's Power Lora Loader - "body horror material" before it clicked. That's real: this node is more powerful than a simple mixer and less predictable. If you just want a 70/30 of two same-trainer LoRAs, a plain weighted stack is simpler. If your LoRAs come from different trainers or you want them as one permanent file, this is the tool. And if you merge a 9B and a 4B Klein LoRA together, the results are... an experience, per the author. Don't say you weren't warned.

CategoryLoRA/Experimental

Inputs (29)

NameTypeDefaultDescription
modelMODEL
clipCLIP
methodCOMBOlinear15 options: linear, ties_strict, ties_gentle, dare_lite, dare_rescale, subtract, +9
densityFLOAT1.000.1–1
lora_aoptCOMBO1 options: None
lora_boptCOMBO1 options: None
lora_coptCOMBO1 options: None
lora_data_aoptLORA
lora_data_boptLORA
lora_data_coptLORA
weight_aoptFLOAT1.00-5–5Strength of first LoRA
weight_boptFLOAT1.00-5–5Strength of second LoRA
weight_coptFLOAT1.00-5–5Strength of third LoRA
blend_modeoptCOMBOautoauto: Smart choice based on trainer metadata (match → dense, mismatch → active) | dense: Traditional weighted sum
energy_preservationoptBOOLEANtruePreserve energy distribution during merge (recommended). Disable for raw weighted sum.
balancing_modeoptCOMBOsafeAuto-weight-balancing: safe (hard-match energy on shared layers only, rank-independent), creative (preserve ratio with reduced magnitude), intensity (peak-energy detection for cross-concept merges), impact (intensity + sparsity correction for sparse-vs-dense merges like Anima), disabled (no adjustment).
magnitude_scalingoptCOMBOnoneSignal magnitude scaling before merging – scales LoRA B and C to match LoRA A's energy using RMS or top‑X% percentile.
active_thresholdoptBOOLEANtrueEnable active region detection (threshold value from config.py). Disable for dense-style behavior.
uniquenessoptFLOAT0.700.1–1For feature_mix: higher = preserve more unique features
thresholdoptFLOAT0.000–1For subtract: minimum magnitude to subtract
blendoptFLOAT0.500–1For magnitude: 0=strict, 1=blended
deviceoptCOMBOauto3 options: auto, cuda, cpu
precisionoptCOMBOauto4 options: auto, float32, bfloat16, float16
batch_sizeoptINT321–256Number of keys to process per batch. DeviceManager.suggest_batch_size() can auto-tune based on VRAM.
streamingoptBOOLEANtrueStream tensors to save VRAM
save_triggeroptBOOLEANfalse
filenameoptSTRINGtriple_merged
save_folderoptSTRING/tmp/ComfyUI/models/loras
metadata_modeoptCOMBOmerge_basicHow to handle metadata from source LoRAs

Outputs (5)

NameTypeDescription
loraLORA
modelMODEL
clipCLIP
output_pathSTRING
forensic_reportSTRING