import torch from collections import OrderedDict def extract(ckpt): model = ckpt["model"] opt = OrderedDict() opt["weight"] = {key: value for key, value in model.items() if "enc_q" not in key} return opt def model_fusion(model_name, pth_path_1, pth_path_2): ckpt1 = torch.load(pth_path_1, map_location="cpu") ckpt2 = torch.load(pth_path_2, map_location="cpu") if "model" in ckpt1: ckpt1 = extract(ckpt1) else: ckpt1 = ckpt1["weight"] if "model" in ckpt2: ckpt2 = extract(ckpt2) else: ckpt2 = ckpt2["weight"] if sorted(ckpt1.keys()) != sorted(ckpt2.keys()): return "Fail to merge the models. The model architectures are not the same." opt = OrderedDict( weight={ key: 1 * value.float() + (1 - 1) * ckpt2[key].float() for key, value in ckpt1.items() } ) opt["info"] = f"Model fusion of {pth_path_1} and {pth_path_2}" torch.save(opt, f"logs/{model_name}.pth") print(f"Model fusion of {pth_path_1} and {pth_path_2} is done.")