feat: implement merge_lora function
parent
11b962da06
commit
9faf7a6fea
|
|
@ -2,3 +2,4 @@ model/__pycache__
|
||||||
out
|
out
|
||||||
website/
|
website/
|
||||||
docs-minimind/
|
docs-minimind/
|
||||||
|
MiniMind2
|
||||||
|
|
@ -22,8 +22,7 @@ def init_model(args):
|
||||||
ckp = f'./{args.save_dir}/{args.weight}_{args.hidden_size}{moe_suffix}.pth'
|
ckp = f'./{args.save_dir}/{args.weight}_{args.hidden_size}{moe_suffix}.pth'
|
||||||
model.load_state_dict(torch.load(ckp, map_location=args.device), strict=True)
|
model.load_state_dict(torch.load(ckp, map_location=args.device), strict=True)
|
||||||
if args.lora_weight != 'None':
|
if args.lora_weight != 'None':
|
||||||
apply_lora(model)
|
merge_lora(model, f'./{args.save_dir}/lora/{args.lora_weight}_{args.hidden_size}.pth')
|
||||||
load_lora(model, f'./{args.save_dir}/lora/{args.lora_weight}_{args.hidden_size}.pth')
|
|
||||||
else:
|
else:
|
||||||
model = AutoModelForCausalLM.from_pretrained(args.load_from, trust_remote_code=True)
|
model = AutoModelForCausalLM.from_pretrained(args.load_from, trust_remote_code=True)
|
||||||
print(f'MiniMind模型参数: {sum(p.numel() for p in model.parameters()) / 1e6:.2f} M(illion)')
|
print(f'MiniMind模型参数: {sum(p.numel() for p in model.parameters()) / 1e6:.2f} M(illion)')
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,22 @@ def load_lora(model, path):
|
||||||
module.lora.load_state_dict(lora_state)
|
module.lora.load_state_dict(lora_state)
|
||||||
|
|
||||||
|
|
||||||
|
def merge_lora(model, path):
|
||||||
|
state_dict = torch.load(path, map_location=model.device)
|
||||||
|
# 移除可能的module前缀,确保key与模型层级名称一致
|
||||||
|
state_dict = {(k[7:] if k.startswith('module.') else k): v for k, v in state_dict.items()}
|
||||||
|
|
||||||
|
for name, module in model.named_modules():
|
||||||
|
if isinstance(module, nn.Linear):
|
||||||
|
key_A = f"{name}.lora.A.weight"
|
||||||
|
key_B = f"{name}.lora.B.weight"
|
||||||
|
if key_A in state_dict and key_B in state_dict:
|
||||||
|
# 直接合并权重: W_new = W_old + B @ A
|
||||||
|
module.weight.data += state_dict[key_B] @ state_dict[key_A]
|
||||||
|
|
||||||
|
return model
|
||||||
|
|
||||||
|
|
||||||
def save_lora(model, path):
|
def save_lora(model, path):
|
||||||
state_dict = {}
|
state_dict = {}
|
||||||
for name, module in model.named_modules():
|
for name, module in model.named_modules():
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Reference in New Issue