Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AUTOMATIC1111
GitHub Repository: AUTOMATIC1111/stable-diffusion-webui
Path: blob/master/extensions-builtin/Lora/network_hada.py
2447 views
1
import lyco_helpers
2
import network
3
4
5
class ModuleTypeHada(network.ModuleType):
6
def create_module(self, net: network.Network, weights: network.NetworkWeights):
7
if all(x in weights.w for x in ["hada_w1_a", "hada_w1_b", "hada_w2_a", "hada_w2_b"]):
8
return NetworkModuleHada(net, weights)
9
10
return None
11
12
13
class NetworkModuleHada(network.NetworkModule):
14
def __init__(self, net: network.Network, weights: network.NetworkWeights):
15
super().__init__(net, weights)
16
17
if hasattr(self.sd_module, 'weight'):
18
self.shape = self.sd_module.weight.shape
19
20
self.w1a = weights.w["hada_w1_a"]
21
self.w1b = weights.w["hada_w1_b"]
22
self.dim = self.w1b.shape[0]
23
self.w2a = weights.w["hada_w2_a"]
24
self.w2b = weights.w["hada_w2_b"]
25
26
self.t1 = weights.w.get("hada_t1")
27
self.t2 = weights.w.get("hada_t2")
28
29
def calc_updown(self, orig_weight):
30
w1a = self.w1a.to(orig_weight.device)
31
w1b = self.w1b.to(orig_weight.device)
32
w2a = self.w2a.to(orig_weight.device)
33
w2b = self.w2b.to(orig_weight.device)
34
35
output_shape = [w1a.size(0), w1b.size(1)]
36
37
if self.t1 is not None:
38
output_shape = [w1a.size(1), w1b.size(1)]
39
t1 = self.t1.to(orig_weight.device)
40
updown1 = lyco_helpers.make_weight_cp(t1, w1a, w1b)
41
output_shape += t1.shape[2:]
42
else:
43
if len(w1b.shape) == 4:
44
output_shape += w1b.shape[2:]
45
updown1 = lyco_helpers.rebuild_conventional(w1a, w1b, output_shape)
46
47
if self.t2 is not None:
48
t2 = self.t2.to(orig_weight.device)
49
updown2 = lyco_helpers.make_weight_cp(t2, w2a, w2b)
50
else:
51
updown2 = lyco_helpers.rebuild_conventional(w2a, w2b, output_shape)
52
53
updown = updown1 * updown2
54
55
return self.finalize_updown(updown, orig_weight, output_shape)
56
57