Null Universal LoRA Loader
The Null Universal LoRA Loader wants a basis file first
- model
- clip
- MODEL
- CLIP
Let's get the trap out of the way first: this is not the node you reach for when you download a normal LoRA from CivitAI. Drop a regular rank-32 SDXL LoRA in here and you'll get a "Basis file not found" error and no idea why. This loader exists for one very specific, very experimental family of adapters - "universal" / null-space LoRAs plus EffiLoRA and ABM variants - where the LoRA file is only the tiny coefficients and a separate basis file supplies the shared structure. If you have one of those, this is the only practical way to run it in ComfyUI. If you don't, use the built-in LoraLoader and move on.
How it works
The idea, grounded in the actual source rather than the (one-line, Japanese) README: normal LoRAs patch the base weights directly. These formats instead build the adapter in the null space of each UNet weight - the low-signal directions you get from an SVD - plus a shared low-rank basis loaded from a separate file. Because the patch lives in directions the base model barely uses, the theory goes, adapters interfere less and stack more cleanly. That's the "universal" part.
Concretely, the loader:
- Reads the LoRA's safetensors header for
network_dim,use_dora,effilora, andnum_experts, so one node handles the whole family. - Loads the basis file (per-layer
.meanand.basistensors). - Runs an SVD over every target conv/linear weight in the UNet to get the frozen null-space paths, keeps only the small trainable
alpha_down/alpha_upcoefficient matrices (plus an MoE gate when there are multiple experts), and applies it throughset_model_unet_function_wrapper- patching during sampling and restoring afterward so the base model stays clean for everything else on the graph.
Two details worth knowing: it skips text-encoder keys entirely (anything with te1, te2, text_encoder), so CLIP passes through unchanged - the CLIP output on this node is just a passthrough. And the clip input/output are there for graph compatibility; the real work happens in the MODEL branch.
The inputs that matter
model,clip- wire in your checkpoint's MODEL and CLIP.lora_name- dropdown of files inComfyUI/models/loras.strength- 0 to 10, default 1.0. Same idea as any LoRA weight, just dial the influence.basis_file_path- this is the gotcha. Defaults touniversal_lora_64_all.safetensors, and the loader hunts for it in this order: exact path, then your loras folder, then the models folder. If it's not there, hard error.
Outputs are MODEL and CLIP. Wire the MODEL into your sampler; leave the CLIP chain alone.
Installing
No requirements.txt, no heavy dependencies - it only needs torch and safetensors, which ComfyUI already ships. (bitsandbytes is optional, only for dequantizing 4-bit models.) Through ComfyUI Manager, search the pack title, or:
cd ComfyUI/custom_nodes
git clone https://github.com/a-ru2016/ComfyUI-Universal-ABM-LoRA
Then restart ComfyUI. What the README doesn't tell you is where the basis file comes from - it's part of the training output from the author's related repos (there's a predecessor, ComfyUI_UniversalSubspace). Get it from whoever made your universal LoRA; without it, the node is a brick.
Troubleshooting
- "Basis file not found" - almost always you don't have
universal_lora_64_all.safetensors(or the custom basis your LoRA was trained against). Drop it inmodels/lorasor give the full path. - Load takes a while / spikes VRAM - the loader SVDs the whole UNet at load time. It tries GPU first, falls back to CPU if that fails. Expect a visible pause before sampling starts; that's normal.
- No CLIP-side effect - by design. Text encoder keys are skipped.
- The basics: this pack is 0 stars, one commit, from a Japanese hobbyist running an experiment. Treat it as bleeding-edge research plumbing, not a maintained product. It's the kind of thing you try because you found a specific model that needs it - and then you don't use it again.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| lora_name | COMBO | 0 options: | |
| strength | FLOAT | 1.000–10 | — |
| basis_file_path | STRING | universal_lora_64_all.safetensors | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |