merge_and_unload()需手动校验适配器状态、多adapter须显式切换再合并、合并后需清理残留引用并注意safe tensors格式兼容性。

合并前必须确认适配器是否已正确加载
PEFT 的 merge_and_unload() 不会自动校验适配器状态,如果 PeftModel 初始化失败、或 load_adapter() 被跳过/出错,调用合并会静默失败,模型权重不变。常见现象是合并后推理结果和基座模型完全一致,毫无微调效果。
实操建议:
立即学习“Python免费学习笔记(深入)”;
Dbsite企业网站管理系统V1.5.0 秉承"大道至简 邦达天下"的设计理念,以灵巧、简单的架构模式构建本管理系统。可根据需求可配置多种类型数据库(当前压缩包支持Access).系统是对多年企业网站设计经验的总结。特别适合于中小型企业网站建设使用。压缩包内包含通用企业网站模板一套,可以用来了解系统标签和设计网站使用。QQ技术交流群:115197646 系统特点:1.数据与页
- 检查
model.active_adapters是否非空,且值为预期的 adapter 名(如["default"]) - 确认
model.base_model.model下存在lora_A/lora_B等子模块(对 LoRA);可用next(model.named_parameters())[0]快速看参数名是否含lora_ - 若从 checkpoint 加载,确保路径下有
adapter_config.json和adapter_model.bin,缺一不可
merge_and_unload() 不能直接用于多适配器切换场景
当一个 PeftModel 绑定了多个 adapter(比如用 set_adapter("lora_a") 切换),merge_and_unload() 只合并当前 active_adapters 中的那一个,其余 adapter 权重被丢弃——不是报错,而是悄无声息地“漏掉”。这在 A/B 实验或多任务微调中极易引发线上行为不一致。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 多 adapter 场景下,先显式调用
model.set_adapter("target_name"),再执行合并 - 若需保留多个 adapter 分别导出,应分别 clone 模型:用
PeftModel.from_pretrained(base_model, adapter_path)单独加载每个,再各自合并 -
merge_and_unload()后模型类型变为纯nn.Module,不再支持set_adapter(),这点和unload_adapter()有本质区别
合并后显存没降反升?注意 tokenizer 和 config 的残留引用
调用 merge_and_unload() 后,模型参数确实写回了 base model,但 PEFT 生成的临时对象(如 model.peft_config、绑定的 tokenizer)仍保留在内存里,尤其当 tokenizer 是从 AutoTokenizer.from_pretrained(peft_path) 加载时,它内部缓存了大量分词表映射,容易掩盖真正的内存释放效果。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 合并后手动删掉无用引用:
del model.peft_config、del model.tokenizer(如果 tokenizer 是独立加载的) - 用
torch.cuda.memory_allocated()对比前后,而非只看nvidia-smi,后者包含未及时回收的缓存 - 若后续只做推理,推荐用
model.save_pretrained("./merged")+ 重新AutoModel.from_pretrained("./merged"),这才是真正干净的轻量模型
HF Transformers >=4.37 后 merge_and_unload() 默认启用 safe tensors
新版本默认走 safetensors 格式保存,好处是加载快、防 pickle 注入,但如果你下游系统(比如旧版 vLLM 或自定义 C++ 推理引擎)只认 pytorch_model.bin,就会报 OSError: Unable to load weights...,错误信息里不提格式问题,只说文件不存在。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 明确关掉 safe tensors:
model.merge_and_unload(safe_merge=False),生成传统 bin 文件 - 或者改用
model.save_pretrained(..., safe_serialization=False)配合手动合并 - 注意
safetensors=True时,合并后的模型目录里没有pytorch_model.bin,只有model.safetensors,别按老习惯找错文件









