@@ -87,3 +87,43 @@ def freeze_pretrained_weight(self, freeze: bool = True):
8787 if self .base_layer .b is not None :
8888 self .base_layer .b .requires_grad = not freeze
8989 self .base_layer .b .stores_grad = not freeze
90+
91+ def forward (self , x ):
92+ # forward
93+ if not self .merged :
94+ y1 = self .base_layer (x )
95+ y2 = autograd .dropout (x , self .lora_dropout )
96+ y2 = autograd .matmul (y2 , autograd .transpose (self .lora_A , (1 , 0 )))
97+ y2 = autograd .matmul (y2 , autograd .transpose (self .lora_B , (1 , 0 )))
98+ y2 = autograd .mul (y2 , self .scaling )
99+ y = autograd .add (y1 , y2 )
100+ return y
101+ else :
102+ y = self .base_layer (x )
103+ return y
104+
105+ def merge_weights (self , mode : bool = True ):
106+ # Merge the weights
107+ if mode :
108+ if not self .merged :
109+ # Merge the weights and mark it
110+ delta = tensor .mult (self .lora_A .transpose ((1 , 0 )), self .lora_B .transpose ((1 , 0 ))) * self .scaling
111+ self .base_layer .W .data += delta .data
112+ self .merged = True
113+ else :
114+ if self .merged :
115+ # Make sure that the weights are not merged
116+ delta = tensor .mult (self .lora_A .transpose ((1 , 0 )), self .lora_B .transpose ((1 , 0 ))) * self .scaling
117+ self .base_layer .W .data -= delta .data
118+ self .merged = False
119+
120+ def get_params (self ):
121+ params = self .base_layer .get_params ()
122+ params [self .lora_A .name ] = self .lora_A
123+ params [self .lora_B .name ] = self .lora_B
124+ return params
125+
126+ def set_params (self , parameters ):
127+ self .base_layer .set_params (parameters )
128+ self .lora_A .copy_from (parameters [self .lora_A .name ])
129+ self .lora_B .copy_from (parameters [self .lora_B .name ])
0 commit comments