如何将LLM2Vec模型保存为HuggingFace PreTrainedModel对象?
解决LLM2Vec模型合并后保存为HuggingFace预训练模型的UnboundLocalError问题
问题背景
合并LLM2Vec的基础模型与PEFT适配器后,调用save_pretrained时触发UnboundLocalError,提示active_adapters未定义,环境版本为:
- transformers==4.38.2
- peft==0.10.0
- accelerate==0.29.2
解决方案
方案1:调整依赖版本(推荐)
这个错误是transformers 4.38.x与peft 0.10.x的兼容bug,降级transformers到4.37.x或升级peft到0.11.x以上即可解决:
pip install transformers==4.37.2 peft==0.11.1 --upgrade
重新运行原代码,就能正常调用model.save_pretrained()完成保存。
方案2:手动绕开bug保存模型
如果不想调整版本,可以直接手动保存模型权重、配置和tokenizer,绕过transformers的peft集成模块bug:
import torch from transformers import AutoTokenizer, AutoModel, AutoConfig from peft import PeftModel # 加载并合并模型(原代码不变) tokenizer = AutoTokenizer.from_pretrained("McGill-NLP/LLM2Vec-Mistral-7B-Instruct-v2-mntp") config = AutoConfig.from_pretrained("McGill-NLP/LLM2Vec-Mistral-7B-Instruct-v2-mntp", trust_remote_code=True) model = AutoModel.from_pretrained( "McGill-NLP/LLM2Vec-Mistral-7B-Instruct-v2-mntp", trust_remote_code=True, config=config, torch_dtype=torch.bfloat16, device_map="cuda" if torch.cuda.is_available() else "cpu", ) model = PeftModel.from_pretrained(model, "McGill-NLP/LLM2Vec-Mistral-7B-Instruct-v2-mntp") model = model.merge_and_unload() # 手动保存模型组件 save_path = "LLM2Vec-Mistral-7B-Instruct-v2-mnt-merged" # 保存权重 torch.save(model.state_dict(), f"{save_path}/pytorch_model.bin") # 保存配置文件 config.save_pretrained(save_path) # 保存tokenizer tokenizer.save_pretrained(save_path)
这样生成的文件结构和save_pretrained输出的完全一致,后续可以正常用AutoModel.from_pretrained加载。
原因说明
这个错误源于transformers的peft集成模块中active_adapters方法的逻辑漏洞:在特定版本组合下,变量active_adapters未初始化就被判断类型,导致引用错误。调整版本或绕开该方法的调用即可解决。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

