Nodes/ComfyUI-T-LoRA/Load T-LoRA (Bypass)
ComfyUI Node

Load T-LoRA (Bypass)

Load T-LoRA (Bypass) in ComfyUI

By bghira·Created 7 months ago·Updated 7 months ago· 1
Load T-LoRA (Bypass)
  • model
  • clip
  • MODEL
  • CLIP
lora_name
strength_model1.00
strength_clip0.00
max_rank0
min_rank1
alpha1.00
max_timestep0
debugfalse
debug_every1

Most LoRA loaders are interchangeable: you pick a file, set a strength, and the adapter applies at one fixed rank for every denoise step. T-LoRA deliberately breaks that. It's a LoRA whose effective rank ramps up over the course of sampling - low while the image is mostly noise, climbing toward full rank as the fine detail gets pinned down. Load T-LoRA (Bypass) is the loader that reproduces that schedule at inference time, and it's the one to use when your checkpoint is in the official T-LoRA format rather than the LyCORIS flavor.

When you'd reach for it

If you grabbed a T-LoRA trained with the ControlGenAI reference implementation (or a SimpleTuner-flavored recipe), the file is full of keys like ...attn1.processor.to_q_lora.down.weight and ...up.weight. ComfyUI's normal LoRA loader doesn't know what to do with those - it'll silently miss them. This node speaks that key layout natively, supporting both the SDXL-style and Flux.1-dev-style official layouts. The "Bypass" in the name refers to the injection mechanism (ComfyUI bypass adapters), not to bypassing the LoRA.

How it works

At each denoise step the node computes an active rank:

r = int(((max_timestep - t) / max_timestep)^alpha * (max_rank - min_rank)) + min_rank

That rank is turned into a binary mask that activates the adapter's first r rank dimensions and suppresses the rest, applied right before the UNet forward. Early steps run at near-min_rank; later steps grow toward max_rank. The pack calls the pattern "timestep masking," and the math is the same as its LyCORIS sibling - the difference is only in how the checkpoint is parsed and the mask consumed.

The inputs that matter

  • lora_name - the T-LoRA file from models/loras.
  • strength_model - 1.0 is the recommended start.
  • max_rank - 0 infers from the checkpoint, which is the right default. If inference fails you'll see an error telling you to set it manually.
  • min_rank - the floor the mask never goes below (default 1).
  • alpha - 1.0 is a linear ramp; crank it higher to keep the effective rank low for longer in the schedule.
  • max_timestep - 0 auto-infers from the model's sampling. Leave it.
  • debug / debug_every - console logging of the computed active rank per step. Flip these on when results look wrong.

Outputs are MODEL and CLIP, wired straight into your existing sampler path - it replaces a normal LoRA loader one-for-one. And yes, strength_clip is there in the schema, but it's currently ignored. The pack says so outright; don't fight it.

Installing it

No LyCORIS dependency here - this node is self-contained. Install via ComfyUI Manager (search ComfyUI-T-LoRA) or:

cd ComfyUI/custom_nodes
git clone https://github.com/bghira/ComfyUI-T-LoRA

Restart ComfyUI. No extra pip installs, no model downloads beyond the checkpoint you already have.

Common issues

The classic failure is "No T-LoRA adapters were created from this checkpoint" - that means the file isn't in the official T-LoRA key layout this loader expects. If it's a LyCORIS-format T-LoRA (q_layer / p_layer / lambda_layer keys), switch to the LyCORIS variant of this loader instead. A related wrinkle: Flux single-transformer blocks serialize to_q_proj / to_k_proj / to_v_proj keys that don't map into ComfyUI, and the loader deliberately ignores those rather than erroring - so some "unmapped key" warnings in the console are expected and harmless on Flux. If you're not using a text encoder in the loop at all, the Model-Only variant drops the CLIP plumbing entirely.

Categoryloaders

Inputs (11)

NameTypeDefaultDescription
modelMODEL
clipCLIP
lora_nameCOMBO0 options:
strength_modelFLOAT1.00-100–100
strength_clipFLOAT0.00-100–100
max_rankINT00–40960 = infer from checkpoint
min_rankINT10–4096
alphaFLOAT1.000.05–8
max_timestepINT00–2000000 = infer from model sampling
debugBOOLEANfalse
debug_everyINT11–1000

Outputs (2)

NameTypeDescription
MODELMODEL
CLIPCLIP