diff options
author | v0xie <28695009+v0xie@users.noreply.github.com> | 2023-10-12 04:26:58 +0000 |
---|---|---|
committer | v0xie <28695009+v0xie@users.noreply.github.com> | 2023-10-12 04:26:58 +0000 |
commit | 906d1179e9a333eeb0f12a95b592dd5b44eb0aaa (patch) | |
tree | c2a473a9dfc4e6cf92c3ec049c5a268ef81e187d | |
parent | 7d60076b8b275771a1aa98f017aff845ef68d964 (diff) | |
download | stable-diffusion-webui-gfx803-906d1179e9a333eeb0f12a95b592dd5b44eb0aaa.tar.gz stable-diffusion-webui-gfx803-906d1179e9a333eeb0f12a95b592dd5b44eb0aaa.tar.bz2 stable-diffusion-webui-gfx803-906d1179e9a333eeb0f12a95b592dd5b44eb0aaa.zip |
support inference with LyCORIS GLora networks
-rw-r--r-- | extensions-builtin/Lora/network_glora.py | 33 | ||||
-rw-r--r-- | extensions-builtin/Lora/networks.py | 2 |
2 files changed, 35 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) diff --git a/extensions-builtin/Lora/networks.py b/extensions-builtin/Lora/networks.py index 315682b3..ddab3c55 100644 --- a/extensions-builtin/Lora/networks.py +++ b/extensions-builtin/Lora/networks.py @@ -5,6 +5,7 @@ import re import lora_patches
import network
import network_lora
+import network_glora
import network_hada
import network_ia3
import network_lokr
@@ -23,6 +24,7 @@ module_types = [ network_lokr.ModuleTypeLokr(),
network_full.ModuleTypeFull(),
network_norm.ModuleTypeNorm(),
+ network_glora.ModuleTypeGLora(),
]
|