关键词:
Data.DataLoader
、num_workers
、batch
Pytorch在开进行小批量数据下降时开多进程报错
报错内容
RuntimeError: DataLoader worker (pid(s) 9528, 8320) exited unexpectedly
去网上搜教程,说是在loader定义的时候多进程的参数指定的问题,我的loader定义如下
loader = Data.DataLoader(
dataset=torch_dataset, # torch TensorDataset format
batch_size=BATCH_SIZE, # mini batch size
shuffle=True, # 要不要打乱数据 (打乱比较好)
num_workers=2, # 多线程来读数据
)
其中num_workers
是用来指定开多进程的数量,默认值为0
,表示不启用多线程。
网上给出的解决方案是
设置 num_workers=0; 或者
删掉这个属性的设置(也就是取默认值0)
但是这终归是个意淫的解决方式,当遇到大量数据处理时,势必要采用并行的处理方式才是科学高效的。
最终在 这里 找到了解决方案,就是把含有多线程操作的部分放在if __name__ == '__main__'
的范围内,在我这里即
if __name__ == '__main__':
for epoch in range(3):
for step, (batch_x, batch_y) in enumerate(loader):
# 假设这里就是你训练的地方...
里面的loader就是上面定义的loader,指定了多进程的。另外只需要loader的执行部分放在main之内即可,定义部分可以在main内,也可以在main之外
后来我也恍悟,Python中多进程(multiprocessing这个模块包)的内容必须放在if __name__ == '__main__'
之内才可以。多线程(threading这个模块包)是没有这项限定的。
来源:CSDN
作者:BBJG_001
链接:https://blog.csdn.net/BBJG_001/article/details/104354990