network_hada.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import lyco_helpers
  2. import network
  3. class ModuleTypeHada(network.ModuleType):
  4. def create_module(self, net: network.Network, weights: network.NetworkWeights):
  5. if all(x in weights.w for x in ["hada_w1_a", "hada_w1_b", "hada_w2_a", "hada_w2_b"]):
  6. return NetworkModuleHada(net, weights)
  7. return None
  8. class NetworkModuleHada(network.NetworkModule):
  9. def __init__(self, net: network.Network, weights: network.NetworkWeights):
  10. super().__init__(net, weights)
  11. if hasattr(self.sd_module, 'weight'):
  12. self.shape = self.sd_module.weight.shape
  13. self.w1a = weights.w["hada_w1_a"]
  14. self.w1b = weights.w["hada_w1_b"]
  15. self.dim = self.w1b.shape[0]
  16. self.w2a = weights.w["hada_w2_a"]
  17. self.w2b = weights.w["hada_w2_b"]
  18. self.t1 = weights.w.get("hada_t1")
  19. self.t2 = weights.w.get("hada_t2")
  20. def calc_updown(self, orig_weight):
  21. w1a = self.w1a.to(orig_weight.device)
  22. w1b = self.w1b.to(orig_weight.device)
  23. w2a = self.w2a.to(orig_weight.device)
  24. w2b = self.w2b.to(orig_weight.device)
  25. output_shape = [w1a.size(0), w1b.size(1)]
  26. if self.t1 is not None:
  27. output_shape = [w1a.size(1), w1b.size(1)]
  28. t1 = self.t1.to(orig_weight.device)
  29. updown1 = lyco_helpers.make_weight_cp(t1, w1a, w1b)
  30. output_shape += t1.shape[2:]
  31. else:
  32. if len(w1b.shape) == 4:
  33. output_shape += w1b.shape[2:]
  34. updown1 = lyco_helpers.rebuild_conventional(w1a, w1b, output_shape)
  35. if self.t2 is not None:
  36. t2 = self.t2.to(orig_weight.device)
  37. updown2 = lyco_helpers.make_weight_cp(t2, w2a, w2b)
  38. else:
  39. updown2 = lyco_helpers.rebuild_conventional(w2a, w2b, output_shape)
  40. updown = updown1 * updown2
  41. return self.finalize_updown(updown, orig_weight, output_shape)