使用PyTorch Lightning训练模型时遇pickle本地对象错误求助
问题原因与解决方案
这个AttributeError: Can't pickle local object错误本质是PyTorch Lightning在多进程训练场景下(默认启用),无法序列化局部定义的对象/函数——Python的pickle机制要求被序列化的对象必须是全局作用域可导入的,而局部对象不满足这个条件。
以下是针对性的排查和解决步骤:
- 检查你的
DataModule中train_dataloader/val_dataloader等方法里的num_workers参数,若设置为大于0,先临时改为0再运行。如果错误消失,说明问题出在多进程数据加载时的序列化环节。 - 确认你的模型类是在全局作用域定义的,不是嵌套在某个函数或其他类内部的局部类。
- 排查
DataModule的预处理逻辑,比如自定义的transform、collate_fn等,有没有使用局部定义的函数(比如在某个函数内部定义的嵌套函数),把这类函数移到全局作用域,或者改为类的成员方法。 - 若上述方法无效,尝试升级PyTorch Lightning到最新稳定版本,部分旧版本存在EvaluationLoop相关的pickle bug,升级后可修复。
内容的提问来源于stack exchange,提问作者Bucky
相关产品推荐
相关产品推荐

