查看: 67|回复: 3

PyTorch DataLoader报错worker exited unexpectedly: Windows下num_workers多进程解决

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Windows系统上使用PyTorch的DataLoader加载数据时,如果设置num_workers大于0,容易遇到RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly的报错。本文将结合具体案例分析错误原因,并给出两种可行的修复方案。

环境与问题复现

操作系统:Windows 10
PyTorch版本:1.5.1+cu101

以下代码来自莫烦Python教程,用于演示mini-batch训练:
  1. import torch
  2. import torch.utils.data as Data
  3. print(torch.__version__)
  4. BATCH_SIZE = 5
  5. x = torch.linspace(1, 10, 10)  # [1,2,3,4,5,6,7,8,9,10]
  6. y = torch.linspace(10, 1, 10)  # [10,9,8,7,6,5,4,3,2,1]
  7. torch_dataset = Data.TensorDataset(x, y)
  8. loader = Data.DataLoader(
  9.     dataset=torch_dataset,
  10.     batch_size=BATCH_SIZE,
  11.     shuffle=True,
  12.     num_workers=2,
  13. )
  14. for epoch in range(3):
  15.     for step, (batch_x, batch_y) in enumerate(loader):
  16.         print('Epoch:', epoch, '|Step', step, '|batch x:', batch_x.numpy(), '|batch y:', batch_y.numpy())
复制代码

直接运行以上脚本,会抛出如下异常:
  1. RuntimeError:
  2. An attempt has been made to start a new process before the
  3. current process has finished its bootstrapping phase.
  4. This probably means that you are not using fork to start your
  5. child processes and you have forgotten to use the proper idiom
  6. in the main module:
  7.     if __name__ == '__main__':
  8.         freeze_support()
  9.         ...
  10. ...
  11. RuntimeError: DataLoader worker (pid(s) 8528, 8488) exited unexpectedly
复制代码

错误定位与分析

从堆栈信息可以确定,异常发生在迭代loader的for循环语句处:
  1. for step, (batch_x, batch_y) in enumerate(loader):
复制代码

关键线索有两个:
1. 错误提示DataLoader worker的pid(s)异常,表明num_workers=2的设置可能有问题。
2. 错误信息明确建议使用标准写法:在main模块中先调用freeze_support(),并提醒Windows下需遵守此惯用法。

结合这两点可以判断,该错误源自Windows环境下使用多进程(num_workers > 0)时,没有以正确方式启动子进程。在Linux或类Unix系统上,使用fork方式启动子进程通常可以直接运行;但Windows不支持fork,PyTorch DataLoader在Windows上使用spawn方式创建进程,因此要求主模块的代码必须被保护在if __name__ == '__main__'块内,并在其中调用freeze_support()(如果程序会被打包成exe则需要,普通脚本可省略该行)。

解决方案

方案一:将num_workers设为0,完全禁用多进程加载。
  1. loader = Data.DataLoader(
  2.     dataset=torch_dataset,
  3.     batch_size=BATCH_SIZE,
  4.     shuffle=True,
  5.     num_workers=0,
  6. )
复制代码

修改后运行成功。此方案简单但会失去并行数据加载带来的性能提升,适用于数据量小或快速调试的场景。

方案二:采用标准的多进程写法,将迭代代码放入if __name__ == '__main__'块中。
  1. if __name__ == '__main__':
  2.     for epoch in range(3):
  3.         for step, (batch_x, batch_y) in enumerate(loader):
  4.             print('Epoch:', epoch, '|Step', step, '|batch x:', batch_x.numpy(), '|batch y:', batch_y.numpy())
复制代码

如果有freeze_support()的需求(如将脚本打包成exe),可以在main块开始处添加freeze_support(),但普通脚本中可省略。修改后num_workers=2即可正常工作。

原理说明

在Windows上,PyTorch DataLoader使用multiprocessing模块创建worker子进程,这些子进程会从头重新导入主模块。如果不加if __name__ == '__main__'保护,子进程在导入主模块时也会尝试执行创建DataLoader的代码,从而导致递归创建进程,引发错误。加上保护后,只有主进程会执行DataLoader初始化及迭代逻辑,子进程只负责加载数据。

总结

在Windows环境下使用PyTorch DataLoader且num_workers > 0时,必须将数据迭代代码包裹在if __name__ == '__main__'内。若不需要并行加载,可将num_workers设为0以快速解决问题。该规则同样适用于其他需要多进程支持的PyTorch功能(如torch.multiprocessing)。建议在编写训练脚本时始终采用标准主模块保护写法,以避免跨平台兼容性问题。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PyTorch DataLoader报错worker exited unexpectedly: Windows下num_workers多进程解决

感谢分享,在Windows上踩这个坑的人不少。你分析得很清楚——归根结底是Windows下进程启动方式(spawn)与Linux不同导致的,加`if __name__ == '__main__'`确实是标准解法。另外对于大项目,如果多进程加载不是硬需求,临时设`num_workers=0`调试效率也不错。建议新手写训练脚本时从一开始就养成加main保护的习惯,能省很多跨平台兼容的麻烦。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PyTorch DataLoader报错worker exited unexpectedly: Windows下num_workers多进程解决

谢谢分享,分析得很清晰!Windows下用`num_workers>0`时,确实很容易踩这个`if __name__ == '__main__'`的坑。两种方案都很实用:调试时直接用`num_workers=0`快速排除问题,正式跑数据量大时加上保护代码用多进程提速。建议以后写训练脚本时养成习惯,从一开始就把主逻辑包在`if __name__ == '__main__'`里面,这样在Windows和Linux之间迁移也不会出问题。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: PyTorch DataLoader报错worker exited unexpectedly: Windows下num_workers多进程解决

感谢楼主的详细分析,这个确实是 Windows 下使用 PyTorch DataLoader 的经典坑。尤其是刚接触 PyTorch 的新手,很容易忽略 `if __name__ == '__main__'` 的保护,然后被 `worker exited unexpectedly` 弄得一头雾水。你的两种方案都很实用:num_workers=0 适合调试或小数据集,而标准写法能保留多进程加速,推荐后者。另外补充一点,如果后续升级到 PyTorch 高版本(比如 2.x),`freeze_support()` 在普通脚本里通常不再是必须的,但 `__main__` 保护依然有效,这样跨平台也更安心。感谢分享,已收藏!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-27 20:26 , Processed in 0.038310 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部