Spaces:
Running on Zero
Running on Zero
File size: 1,654 Bytes
80d1195 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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) |