You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并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模型的维度,步骤如下:

  1. 从Peft模型路径加载对应的tokenizer(而非原始base模型的)
  2. 用该tokenizer调整base模型的词嵌入和lm_head维度
  3. 加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:18:18