Windows 系统下,使用 PyTorch 的 DataLoader 时,如果 num_workers 参数设置为大于 0 的值,报错

news/2025/2/22 16:42:35

在 Windows 系统下,使用 PyTorch 的 DataLoader 时,如果 num_workers 参数设置为大于 0 的值,可能会遇到以下错误:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

原因分析

这个错误是由于 Windows 系统不支持 fork 方式启动子进程,而 PyTorch 的 DataLoader 在多线程情况下默认使用 fork。因此,当 num_workers 大于 0 时,会触发这个错误。

解决方案

  1. num_workers 设置为 0 在 Windows 系统下,建议将 num_workers 设置为 0,这样 DataLoader 将不会使用额外的工作进程来加载数据,从而避免上述错误。代码如下:

    dataloader = DataLoader(dataset, batch_size=8, shuffle=True, num_workers=0)
  2. 使用 spawnforkserver 启动方式 如果需要使用多线程加载数据,可以指定 multiprocessing 的启动方式为 spawnforkserver。在代码的开头添加以下内容:

    import multiprocessing
    multiprocessing.set_start_method('spawn', force=True)

    然后再设置 num_workers 为大于 0 的值:

    dataloader = DataLoader(dataset, batch_size=8, shuffle=True, num_workers=4)
  3. 确保 if __name__ == '__main__': 保护 确保主程序入口被 if __name__ == '__main__': 保护,这样可以避免多进程启动时的冲突。示例如下:

  4. if __name__ == '__main__':
        import multiprocessing
        multiprocessing.set_start_method('spawn', force=True)
    
        # Your main code here
        dataloader = DataLoader(dataset, batch_size=8, shuffle=True, num_workers=4)

推荐解决方案

在 Windows 系统下,最简单的解决方案是将 num_workers 设置为 0。如果需要使用多线程加载数据,可以尝试指定 multiprocessing 的启动方式为 spawnforkserver,并确保主程序入口被 if __name__ == '__main__': 保护。


http://www.niftyadmin.cn/n/5862532.html

相关文章

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能,每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容,屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便,而…

什么是事务?并发事务引发的问题?什么是MVCC?

文章目录 什么是事务?并发事务引发的问题?什么是MVCC?1.事务的四大特性2.并发事务下产生的问题:脏读、不可重复读、幻读3.如何应对并发事务引发的问题?4.什么是MVCC?5.可见性规则?参考资料 什么…

两相四线步进电机的步距角为什么是1.8度

机缘 在CSDN查了好多文章,发现都是用公式来解释1.8的步距角(Q=360/MZ),因为转子是50齿,4拍一个循环,所以θ360度/(50x4)1.8度。估计第一次接触步进电机的什么…

SPRING10_SPRING的生命周期流程图

经过前面使用三大后置处理器BeanPostProcessor、BeanFactoryPostProcessor、InitializingBean对创建Bean流程中的干扰,梳理出SPRING的生命周期流程图如下

科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件

当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时,这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库(MFC)的核心组件,mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…

VUE3+TS+element-plus项目从0开始入门 - 创建项目、认识基本结构

文章目录 写在前面1、创建vue3项目npm create vuelatestnpm i 2、项目结构.vscodevue3结构a、项目树结构b、package.jsonc、tsconfig.jsond、index.htmld、srce、main.tsf、App.vue 写在前面 开前请自行下载vs code、node.js, 在vs code里面安装Vue - Official插件。本文使用的…

Rpc导读

手写Rpc框架 - 导读 git仓库-all-rpc GTIEE:https://gitee.com/quercus-sp204/all-rpc 【参考源码 yrpc】 1. Rpc概念 RPC 即远程过程调用(Remote Procedure Call) ,就是通过网络从远程计算机程序上请求服务。 本地调用抽象&…

番茄工作法html实现

对比了deepseek-r1-online和本地部署的14b的版本,输出的输出的html页面。 在线满血版的功能比较强大,可以一次完成所有要求。14b版本的功能有一些欠缺,但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…