🛡️ Easy LoRA Studio
Your LoRA Speaks a Different Trainer Dialect. This Node Translates.
- model
- clip
- lora_data
- lora
- model
- clip
- output_path
- forensic_report
LoRAs look like one thing, but they're really several dialects of the same idea. A kohya/Musubi-trained LoRA stores its weights as lora_down / lora_up with underscores; ComfyUI-native training writes lora_A / lora_B with dots; Forge has its own prefix mapping for Flux. They all encode the same low-rank delta, and they refuse to talk to each other.
Easy LoRA Studio (class name MusubiLoraConverter - a nod to the author's origin story, more on that below) is the translator. It detects what a LoRA actually is, converts it to the format you want, and can shrink it with SVD compression along the way. It's the "universal" LoRA node in this pack, and it also doubles as an analyzer - every run spits out a forensic report of what's in the file.
How it works
The node sniffs both the tensor keys and the embedded training metadata to figure out what it's looking at - double_blocks means Flux.1, lora_unet means SDXL, diffusion_model.layers means Z-Image, and so on. Then, given target_format, it remaps the keys into the destination dialect: Standard WebUI (lora_down/lora_up), Comfy Native (lora_A/lora_B), or Forge-Optimized (underscore + prefix mapping for Flux). Leave target_format on auto and it picks based on the detected structure.
Compression is where it gets useful. compression_mode original leaves the file alone; auto-fast runs a randomized SVD that keeps 95% of the energy; auto-full does the same more carefully and slower; manual lets you set target_rank directly. For a rank-64 Flux LoRA you're rarely going to notice the compression, and you'll enjoy the smaller file.
bake_custom_scale multiplies the up-weight tensors by a factor before baking - 0.5 weakens the LoRA, 2.0 strengthens it. Note it deliberately does not touch the down-weights, so you don't get a double-strength effect.
Inputs that matter
lora- the source file (orlora_datachained from a merger).target_format-autounless you specifically need one dialect.compression_mode-originalto start; tryauto-fastwhen you want a smaller file.te_mode- text encoder handling:original,remove(strip TE keys entirely), orscalebyte_weight. Handy when you want a vision-only adapter or to boost the prompt side.precision-auto, or forcefloat32/bfloat16/float16.save_trigger- preview vs. write. The saved file gets_convertedappended.
Outputs: lora (the converted adapter), model and clip (optional - connect them to preview the converted LoRA applied), output_path, and forensic_report.
Installing it
The pack installs through Manager (search "Easy LoRA Merger") or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Terpentinas/EasyLoRAMerger
Restart ComfyUI. No models to download; it processes whatever LoRAs you already have.
Gotchas
The author built this pack specifically because a Musubi-trained Klein 4B LoRA wouldn't merge with an AI-Toolkit one - so cross-trainer conversions are the sweet spot here, and same-trainer round-trips are easy. One honest caveat from the community: converting is reliable, but "perfect 1:1 fidelity across trainers" is a moving target, so test the converted file at your usual strengths before you overwrite the original. And if you hit auto-fast compression doubt, run the same conversion once with auto-full and compare - the file is bigger, but you'll know what the fast path cost you.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| lora | COMBO | 1 options: None | |
| target_format | COMBO | auto | Auto‑select optimal format based on LoRA structure; otherwise choose manually. Standard (WebUI/Neo) = underscore + lora_down/up; Comfy Native = dot + lora_A/B; Forge‑Optimized = underscore + prefix mapping for Flux |
| compression_mode | COMBO | original | Original: no compression. Auto-fast: fast randomized SVD preserving 95% energy. Auto-full: full precision SVD preserving 95% energy (slower). Manual: use target rank slider. |
| target_rank | INT | 1281–320 | Target rank for manual compression (1‑320). Ignored if compression_mode is not manual. |
| bake_custom_scale | FLOAT | 1.00-10–10 | Multiply up‑weight tensors (lora_up.weight/lora_B.weight) by this factor before baking (e.g., 0.5 weakens the LoRA, 2.0 strengthens). Note: down‑weights are not scaled to avoid double‑strength effect. |
| save_trigger | BOOLEAN | false | — |
| filename | STRING | converted_lora | — |
| modelopt | MODEL | — | |
| clipopt | CLIP | — | |
| lora_dataopt | LORA | — | |
| te_modeopt | COMBO | original | Control Text Encoder weights: original (keep as‑is), remove (strip TE keys), scale (multiply by te_weight) |
| te_weightopt | FLOAT | 1.000–5 | Multiplier for TE weights when te_mode is 'scale' |
| precisionopt | COMBO | auto | 4 options: auto, float32, bfloat16, float16 |
| deviceopt | COMBO | auto | 3 options: auto, cuda, cpu |
| save_folderopt | STRING | /tmp/ComfyUI/models/loras | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| lora | LORA | — |
| model | MODEL | — |
| clip | CLIP | — |
| output_path | STRING | — |
| forensic_report | STRING | — |