SCAIL-2 / wan /utils /lora.py
fffiloni's picture
Migrated files batch 2
80d1195 verified
Raw
History Blame Contribute Delete
1.65 kB
import torch
def fuse_lora_with_diff_b(
model: torch.nn.Module,
lora_state_dict: dict[str, torch.Tensor],
alpha: float = 1.0,
):
model_state = model.state_dict()
lora_keys = [k for k in lora_state_dict.keys() if k.endswith(".lora_down.weight")]
for lora_key in lora_keys:
prefix = lora_key[:-len(".lora_down.weight")]
lora_down_key = lora_key
lora_up_key = prefix + ".lora_up.weight"
lora_diff_b_key = prefix + ".diff_b"
if lora_up_key not in lora_state_dict:
print(f"[Warning] {lora_up_key} not in LoRA model")
continue
weight_key = prefix + ".weight"
bias_key = prefix + ".bias"
if weight_key.startswith("diffusion_model."):
weight_key = weight_key[len("diffusion_model."):]
if bias_key.startswith("diffusion_model."):
bias_key = bias_key[len("diffusion_model.")]
if weight_key not in model_state:
print(f"[Skip] {weight_key} not in model")
continue
W = model_state[weight_key]
W_down = lora_state_dict[lora_down_key]
W_up = lora_state_dict[lora_up_key]
delta_W = torch.matmul(W_up, W_down).to(W.dtype).to(W.device)
model_state[weight_key] = W + alpha * delta_W
if bias_key in model_state and lora_diff_b_key in lora_state_dict:
diff_b = lora_state_dict[lora_diff_b_key]
model_state[bias_key] = (
model_state[bias_key]
+ alpha * diff_b.to(model_state[bias_key].dtype).to(model_state[bias_key].device)
)
model.load_state_dict(model_state)