Nodes/LoRA Optimizer/LoRA Extract from Model
ComfyUI Node

LoRA Extract from Model

Pull a LoRA back out of a baked-in finetune

By ethanfel·Created 5 months ago·Updated 23 days ago· 135
LoRA Extract from Model
  • base_model
  • finetuned_model
  • base_clip
  • finetuned_clip
  • lora_stack
  • lora_stack
  • lora_data
rank32
rank_modeauto
energy_threshold0.99
strength1.00

Sometimes a LoRA doesn't exist as a file - it's already baked into a merged checkpoint, and there's no separate .safetensors you can point at. That happens a lot: someone releases a finetuned checkpoint but not the LoRA it was built from, or you have an old full finetune you want to make portable again. LoRA Extraction is exactly the technique for this - take the difference between a base model and a finetune, decompose it, and get a LoRA back out. It's a known move in the wider ecosystem (extraction is how a lot of people turn a full finetune into something they can apply to other checkpoints at a fraction of the file size), and this node is this pack's implementation of it, wired directly into the rest of the optimizer suite.

How it works

You give it the clean base model and the finetuned model that started from it. It diffs the two, layer by layer, and SVD-decomposes each layer's delta into a low-rank approximation - the same math a LoRA is, just derived backward from two full checkpoints instead of trained forward from a dataset. rank_mode=auto (the default) picks how much rank each layer needs to retain a target fraction of the delta's "energy" (its signal, essentially); fixed forces every layer to the same rank regardless of how much detail that layer's delta actually contains.

The inputs and outputs that matter

  • base_model / finetuned_model (required) - the clean starting checkpoint and the finetune you're extracting from. These need to be from the same lineage; diffing unrelated models won't produce something meaningful.
  • rank (default 32) - used directly in fixed mode, or as an upper bound in auto mode.
  • rank_mode (default auto) - auto retains a quality target per layer (recommended); fixed forces uniform rank everywhere.
  • energy_threshold (default 0.99) - only matters in auto mode. Fraction of the delta's signal to keep; higher retains more accuracy at the cost of a larger effective rank.
  • strength (default 1.0) - the strength this extracted LoRA gets assigned in the output stack.
  • base_clip / finetuned_clip (optional, connect both together) - provide these if you also want to extract text-encoder changes, not just the UNet/diffusion side. Leave both disconnected to extract UNet components only.
  • lora_stack (optional) - connect another stack (or another extractor) here to append the extracted LoRA to it, rather than getting it on its own.

Outputs: lora_stack - feed this straight into LoRA Optimizer or LoRA AutoTuner to merge the extracted LoRA with others. lora_data - feed this into Save Merged LoRA to write the extracted LoRA out as a standalone .safetensors file.

How to install it

ComfyUI Manager: search "LoRA Optimizer", install, restart. Manually:

cd ComfyUI/custom_nodes/
git clone https://github.com/ethanfel/ComfyUI-LoRA-Optimizer.git

Restart - nodes appear under loaders. No extra downloads; you need the two checkpoints (base and finetuned) loaded already, which is the real prerequisite here.

Common issues & troubleshooting

You need the actual base model, not a guess. Extraction only works cleanly if base_model is genuinely the checkpoint the finetune started from - not a similar-looking model, not a different version of the same architecture family. A mismatched base will diff against noise instead of the real training delta, and the resulting "LoRA" won't reproduce the finetune's effect.

Output looks weaker or blurrier than the original finetune. That's the energy_threshold/rank tradeoff showing up. Raise energy_threshold toward 1.0 (or bump rank in fixed mode) to retain more of the original signal - the cost is a larger, heavier LoRA file.

Fully-baked checkpoints you didn't finetune yourself. The README is upfront about the ceiling here: this only works when you actually have both a base and a finetuned model to diff. A .safetensors checkpoint you downloaded with no separate base reference is indistinguishable from a model that was never a LoRA at all - there's nothing to extract from a single file with no comparison point.

CategoryLoRA Optimizer

Inputs (9)

NameTypeDefaultDescription
base_modelMODELThe original clean base model (e.g. the Flux or SDXL base checkpoint that was used as the starting point for finetuning).
finetuned_modelMODELThe finetuned model with a LoRA already baked into its weights.
rankINT321–512Maximum rank for SVD decomposition. Used directly in 'fixed' mode; acts as an upper bound in 'auto' mode.
rank_modeCOMBOauto'auto': choose rank to retain the given energy fraction (recommended). 'fixed': always use exactly the specified rank.
energy_thresholdFLOAT0.990.5–1Fraction of delta energy to retain when rank_mode='auto'. 0.99 = retain 99% of the signal. Higher = more accurate, higher rank.
strengthFLOAT1.00-10–10Strength to assign this extracted LoRA in the output stack.
base_clipoptCLIPThe CLIP encoder for the base model. Required to extract CLIP/text-encoder LoRA components (e.g. for SDXL). Leave disconnected to extract UNet components only.
finetuned_clipoptCLIPThe CLIP encoder for the finetuned model. Must be connected together with base_clip.
lora_stackoptLORA_STACKOptional. Connect a LoRA Stack (or another extractor) here to merge the extracted LoRA TOGETHER with those LoRAs. The extracted LoRA is appended to the incoming stack. Leave disconnected to output the extracted LoRA on its own.

Outputs (2)

NameTypeDescription
lora_stackLORA_STACK
lora_dataLORA_DATA