微调LLM后重加载模型出现参数尺寸不匹配错误求助
问题原因及解决办法
错误原因
- LoRA微调下权重保存不完整:如果微调时用了LoRA(低秩适配),DPOTrainer默认只保存LoRA适配器权重,而非完整模型参数。直接从
finetuned_model目录加载时,缺少基础模型的核心参数(包括embed_in和embed_out的权重),导致这两个参数被错误初始化为空张量(torch.Size([0])),和模型预期的(50304, 128)形状不匹配。 - 共享权重的保存/加载逻辑异常:Pythia模型的
embed_in(输入嵌入层)和embed_out(输出投影层)默认共享权重。微调过程中如果权重共享的处理出问题,会导致保存的checkpoint里该共享权重未被正确存储,加载时无法匹配模型预期形状。 - 模型配置文件损坏:保存模型时如果
config.json丢失或被修改,加载时模型会错误推断词汇表大小或隐藏层维度,引发嵌入层参数形状不匹配。
解决办法
针对LoRA微调场景
方法1:加载基础模型+LoRA适配器
先加载原始Pythia-14m基础模型,再加载保存的LoRA权重:
from peft import PeftModel from transformers import GPTNeoXForCausalLM # 加载基础模型 base_model = GPTNeoXForCausalLM.from_pretrained("EleutherAI/pythia-14m") # 加载LoRA适配器 finetuned_model = PeftModel.from_pretrained(base_model, "finetuned_model") # (可选)合并LoRA权重并保存完整模型,方便后续直接加载 merged_model = finetuned_model.merge_and_unload() merged_model.save_pretrained("merged_finetuned_model") # 合并后可直接加载 loaded_model = GPTNeoXForCausalLM.from_pretrained("merged_finetuned_model")
方法2:微调时直接保存完整模型
微调完成后先合并LoRA权重,再保存完整模型:
# 合并LoRA权重 trainer.model = trainer.model.merge_and_unload() # 保存完整模型 trainer.save_model("finetuned_full_model")
针对全参数微调场景
- 检查保存流程:确保保存模型时同时保存完整参数和配置文件:
# 保存模型 trainer.save_model("finetuned_model") # 同步保存tokenizer(可选但推荐) tokenizer.save_pretrained("finetuned_model")
- 正确加载模型:加载时指定完整模型目录,确保配置文件正常:
from transformers import GPTNeoXForCausalLM, AutoTokenizer model = GPTNeoXForCausalLM.from_pretrained( "finetuned_model", local_files_only=True, trust_remote_code=True # Pythia模型可能需要该参数 )
- 验证checkpoint文件:检查
finetuned_model目录下的pytorch_model.bin或model.safetensors,确认其中包含gpt_neox.embed_in.weight和gpt_neox.embed_out.weight参数。如果缺失,重新执行保存步骤,避免保存过程中断。
额外排查点
- 确保加载时使用的
transformers和peft版本与微调时一致,版本不兼容可能导致权重加载异常。 - 检查
config.json中的vocab_size是否为50304,hidden_size是否为128,若不符,替换为原始Pythia-14m的配置文件。
内容的提问来源于stack exchange,提问作者Refinath
相关产品推荐
相关产品推荐

