训练结束调用 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 并在部署时用相同的量化配置重新加载底模再套上去。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189