合并Peft模型与Base模型时遭遇维度不匹配错误求助
解决Peft模型与Llama-3-8B合并时的词表维度不匹配问题
你在合并Hugging Face上训练的Peft模型(sanduntg/ORPO_peft_llama3_8B)与meta-llama/Meta-Llama-3-8B时遇到词表维度不匹配错误,具体表现为Peft模型的embed_tokens.weight和lm_head.weight形状是[128258, 4096],而当前base模型的对应参数形状是[128256, 4096]。
问题原因
训练Peft模型时,你大概率在原始Llama-3-8B的基础上扩展了词表(添加了自定义token),但合并时使用的是原始base模型的tokenizer,导致base模型的词嵌入层和输出层维度与Peft模型不匹配。
解决方案
需要加载训练Peft模型时使用的扩展后tokenizer,再调整base模型的维度,步骤如下:
- 从Peft模型路径加载对应的tokenizer(而非原始base模型的)
- 用该tokenizer调整base模型的词嵌入和lm_head维度
- 加载Peft模型并完成合并
修改后的代码:
from peft import PeftModel, PeftConfig from transformers import AutoModelForCausalLM, AutoTokenizer # 加载Peft配置 peft_config = PeftConfig.from_pretrained("sanduntg/ORPO_peft_llama3_8B") base_model_name = peft_config.base_model_name_or_path # 直接从Peft配置获取base模型路径,避免手动输入错误 # 关键:加载训练Peft时使用的tokenizer(从Peft模型路径加载) tokenizer = AutoTokenizer.from_pretrained("sanduntg/ORPO_peft_llama3_8B") print("Tokenizer vocab size (训练时使用的):", len(tokenizer)) # 加载base模型 base_model = AutoModelForCausalLM.from_pretrained(base_model_name, device_map="auto") # 调整base模型的词嵌入和lm_head维度,匹配扩展后的tokenizer base_model.resize_token_embeddings(len(tokenizer)) # 加载Peft模型并合并 base_model = PeftModel.from_pretrained(model=base_model, model_id="sanduntg/ORPO_peft_llama3_8B") base_model = base_model.merge_and_unload() # 保存合并后的模型 base_model.save_pretrained("merged_adapters") # 同时保存对应的tokenizer tokenizer.save_pretrained("merged_adapters")
额外说明
- 之前的
resize_token_embeddings无效,是因为你用的是原始base模型的tokenizer(词表大小128256),调整后维度仍和Peft模型的128258不匹配。必须用训练时扩展后的tokenizer才能得到正确的词表大小。 - 保存合并模型时记得同时保存tokenizer,后续使用合并模型时需要配套这个扩展后的tokenizer。
内容的提问来源于stack exchange,提问作者Sandun Tharaka
相关产品推荐
相关产品推荐

