报错原因:
不能将局部对象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)