diff options
author | hako-mikan <122196982+hako-mikan@users.noreply.github.com> | 2023-11-09 12:57:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-09 12:57:57 +0000 |
commit | 816096e642187a18b11e2729c42c0b5f677f047d (patch) | |
tree | 8127b07b946b376d4276e2169ceffb7c2e64ba09 /extensions-builtin/Lora/network_glora.py | |
parent | 6b9795849d497b41514aa9462690cf7c2802e4f6 (diff) | |
parent | 5e80d9ee99c5899e5e2b130408ffb65a0585a62a (diff) | |
download | stable-diffusion-webui-gfx803-816096e642187a18b11e2729c42c0b5f677f047d.tar.gz stable-diffusion-webui-gfx803-816096e642187a18b11e2729c42c0b5f677f047d.tar.bz2 stable-diffusion-webui-gfx803-816096e642187a18b11e2729c42c0b5f677f047d.zip |
Merge branch 'dev' into master
Diffstat (limited to 'extensions-builtin/Lora/network_glora.py')
-rw-r--r-- | extensions-builtin/Lora/network_glora.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/extensions-builtin/Lora/network_glora.py b/extensions-builtin/Lora/network_glora.py new file mode 100644 index 00000000..492d4870 --- /dev/null +++ b/extensions-builtin/Lora/network_glora.py @@ -0,0 +1,33 @@ + +import network + +class ModuleTypeGLora(network.ModuleType): + def create_module(self, net: network.Network, weights: network.NetworkWeights): + if all(x in weights.w for x in ["a1.weight", "a2.weight", "alpha", "b1.weight", "b2.weight"]): + return NetworkModuleGLora(net, weights) + + return None + +# adapted from https://github.com/KohakuBlueleaf/LyCORIS +class NetworkModuleGLora(network.NetworkModule): + def __init__(self, net: network.Network, weights: network.NetworkWeights): + super().__init__(net, weights) + + if hasattr(self.sd_module, 'weight'): + self.shape = self.sd_module.weight.shape + + self.w1a = weights.w["a1.weight"] + self.w1b = weights.w["b1.weight"] + self.w2a = weights.w["a2.weight"] + self.w2b = weights.w["b2.weight"] + + def calc_updown(self, orig_weight): + w1a = self.w1a.to(orig_weight.device, dtype=orig_weight.dtype) + w1b = self.w1b.to(orig_weight.device, dtype=orig_weight.dtype) + w2a = self.w2a.to(orig_weight.device, dtype=orig_weight.dtype) + w2b = self.w2b.to(orig_weight.device, dtype=orig_weight.dtype) + + output_shape = [w1a.size(0), w1b.size(1)] + updown = ((w2b @ w1b) + ((orig_weight @ w2a) @ w1a)) + + return self.finalize_updown(updown, orig_weight, output_shape) |