训练结束调用 save_pretrained 时抛出 AttributeError: Can’t pickle local object,只存下了一个不完整的目录。
一开始怀疑是「多进程训练时只有主进程能写文件」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。量化模型的配置里带了不可序列化的对象。少数情况下是自定义回调函数定义在函数内部,无法序列化。
另外,保存路径被别的进程占用,写了一半中断。
只保存 adapter,不保存量化底模
model.save_pretrained('./adapter', safe_serialization=True)
再往下把自定义对象从配置里剔除后再保存
model.config.__dict__.pop('quantization_config', None)
只在主进程执行保存逻辑
if accelerator.is_main_process: model.save_pretrained('./adapter')
保存后核对文件是否齐全
python -c "import os;print(sorted(os.listdir('./adapter')))"
隔了一天再看,现象没变,说明不是偶发。
恢复的判定其实很直接。adapter 目录里有 adapter_model.safetensors 与配置文件,重新加载后能得到与训练结束时一致的输出。
提醒一点。量化底模本身不适合直接保存,正确做法是保存 adapter 并在部署时用相同的量化配置重新加载底模再套上去。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。