报错原因:

不能将局部对象worker_init_fn进行pickle序列化

当你使用 多进程 时,PyTorch 需要将某些对象通过 pickle 序列化,以便将其从主进程传递到工作进程。

然而worker_init_fn就是一个局部函数,不能被序列化

错误代码:

def create_dataloader():
    def worker_init_fn(worker_id):
        # 你的初始化代码
        pass

    dataloader = DataLoader(dataset, num_workers=4, worker_init_fn=worker_init_fn)

正确代码:

def worker_init_fn(worker_id):
    # 你的初始化代码
    pass

dataloader = DataLoader(dataset, num_workers=4, worker_init_fn=worker_init_fn)

解决方法:

①将worker_init_fn定义为全局函数

②将num_workers设置为0,使用单进程运行程序

dataloader = DataLoader(dataset, num_workers=0, worker_init_fn=worker_init_fn)

参考:报错: AttributeError: Can‘t pickle local object ‘trainer_synapse.<locals>.worker_init_fn‘_attributeerror: can't pickle local object 'train.<-CSDN博客

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐