这个坑值得记一笔。训练结束调用 save_pretrained,产物只有几百兆的 adapter_model.safetensors,想直接部署却发现加载后没有效果。
刚开始盯着「adapter_config.json 缺失,无法确定底模来源」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。PEFT 模型默认只保存增量权重;部署端没有先加载底模再套 adapter;推理框架不支持动态加载 adapter。
先确认产物里有哪些文件
python -c "import os;print(sorted(os.listdir('./adapter')))"
随后按标准方式加载底模再套 adapter
model = PeftModel.from_pretrained(base, './adapter')
需要独立部署时合并成完整权重
model = model.merge_and_unload(); model.save_pretrained('./merged')
末了确认合并后目录里有完整分片与索引
python -c "import glob;print(len(glob.glob('./merged/*.safetensors')))"
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
改完先别撤,确认这几项。合并目录里出现完整的权重分片和 index.json,脱离 adapter 直接加载也能得到训练后的效果。
这里还有个坑。adapter 体积小是优点也是坑,交付给别人时如果只发 adapter 不发底模版本信息,对方很可能加载到一个不匹配的模型上。报错文案容易误导,真正的原因往往在相邻那一层的日志里。