Windows下Pytorch脚本运行报RuntimeError 控制台运行正常如何解决
问题根因
这是典型的Windows平台Python多进程启动机制导致的问题,和代码逻辑本身无关。
- Windows系统不支持Unix类系统的
fork系统调用,Python多进程在Windows上默认采用spawn模式启动子进程。该模式下新创建的子进程会重新导入整个主模块并执行代码,如果多进程相关逻辑(你这里的trainer.fit内部在划分验证集后默认调用了多进程加载数据的逻辑)没有放在主模块保护块中,就会触发子进程循环启动的问题,Python的安全校验会抛出你看到的报错。 - PyCharm控制台运行正常的原因是交互式控制台本身已经完成了主进程初始化,你在控制台中执行代码不会触发模块重新导入的流程,因此不会触发该报错。
解决方案
- 把所有入口执行逻辑,包括数据处理、trainer初始化、
trainer.fit()调用的相关代码,全部放到if __name__ == '__main__'的保护块中,参考示例:
import torch from multiprocessing import freeze_support # 其余导包、工具函数、模型类定义全部放在保护块外部 def run_training(): # 数据处理逻辑 X_tab = ... target = ... # trainer初始化逻辑 trainer = ... # 训练调用 trainer.fit( X_tab=X_tab, target=target, n_epochs=5, batch_size=256, val_split=0.1 ) if __name__ == '__main__': # 如果你不需要将代码打包为exe可执行文件,freeze_support()可以省略 freeze_support() run_training()
- 如果修改后仍有报错,可以临时将训练用到的DataLoader的
num_workers参数设置为0,禁用多进程数据加载,进一步排查是否存在其他配置问题。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

