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)