DPOTrainer训练后AutoPeftModelForCausalLM加载模型报错求助
解决DPOTrainer保存模型后AutoPeftModelForCausalLM加载报404的问题
问题根源
用DPOTrainer训练完直接调用model.save_pretrained()保存时,不会自动把基础模型(比如facebook/opt-350m)的路径写入adapter配置文件。这导致AutoPeftModelForCausalLM加载时找不到基础模型的关联信息,错误地去Hugging Face Hub拉取名为None的模型,自然触发404。而SFTTrainer会自动处理基础模型路径的关联,所以SFT的checkpoint加载正常。
修复方案
1. 正确保存DPO训练后的模型
别直接用dpo_trainer.model.save_pretrained(),改用DPOTrainer自带的save_model()方法,它会自动把基础模型路径写入配置:
dpo_trainer.save_model(path_save_dpo) tokenizer.save_pretrained(path_save_dpo)
如果一定要手动保存,需要显式给PeftModel指定基础模型路径:
from peft import PeftModel # 包装训练后的模型并设置基础模型路径 peft_model = PeftModel.from_pretrained(dpo_trainer.model, path_save_dpo) peft_model.base_model_name_or_path = "facebook/opt-350m" peft_model.save_pretrained(path_save_dpo) tokenizer.save_pretrained(path_save_dpo)
2. 加载时显式指定基础模型
如果已经用错误方式保存了模型,加载时直接指定基础模型路径,避免去Hub查找:
from peft import AutoPeftModelForCausalLM from transformers import AutoTokenizer model = AutoPeftModelForCausalLM.from_pretrained( path_save_dpo, base_model_name_or_path="facebook/opt-350m", token=你的HF_TOKEN # 替换成你的有效HF Token ) tokenizer = AutoTokenizer.from_pretrained(path_save_dpo)
3. 手动修改adapter配置文件
打开本地保存目录里的adapter_config.json,检查base_model_name_or_path字段,如果值是None,手动改成"facebook/opt-350m",再重新加载模型即可。
额外注意事项
- 训练和加载时要使用相同版本的
peft、transformers和trl,版本不兼容可能导致配置读取异常。 - 如果用了自定义LoRA配置,确保所有参数都正确保存到了adapter相关文件里。
内容的提问来源于stack exchange,提问作者naitsu
相关产品推荐
相关产品推荐

