gpt4 book ai didi

解决pytorch trainloader遇到的多进程问题

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 63 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章解决pytorch trainloader遇到的多进程问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

pytorch中尝试用多进程加载训练数据集,源码如下:

?
1
trainloader = torch.utils.data.DataLoader(trainset, batch_size = 4 , shuffle = True , num_workers = 3 )

结果报错:

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. 。

从报错信息可以看到,当前进程在运行可执行代码时,产生了一个新进程。这可能意味着您没有使用fork来启动子进程或者是未在主模块中正确使用.

后来经过查阅发现了原因,因为windows系统下默认用spawn方法部署多线程,如果代码没有受到__main__模块的保护,新进程都认为是要再次运行的代码,将尝试再次执行与父进程相同的代码,生成另一个进程,依此类推,直到程序崩溃.

解决方法很简单

把调用多进程的代码放到__main__模块下即可.

?
1
2
3
4
if __name__ = = '__main__' :
     transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize(( 0.5 , 0.5 , 0.5 ), ( 0.5 , 0.5 , 0.5 ))])
     trainset = torchvision.datasets.CIFAR10(root = './data' , train = True , download = True , transform = transform)
     trainloader = torch.utils.data.DataLoader(trainset, batch_size = 4 , shuffle = True , num_workers = 3 )

补充:pytorch-Dataloader多进程使用出错 。

使用Dataloader进行多进程数据导入训练时,会因为多进程的问题而出错 。

dataloader = DataLoader(transformed_dataset, batch_size=4,shuffle=True, num_workers=4) 。

其中参数num_works=表示载入数据时使用的进程数,此时如果参数的值不为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. 。

此时在数据的调用之前加上if __name__ == '__main__':即可解决问题 。

?
1
2
3
if __name__ = = '__main__' : #这个地方可以解决多线程的问题
 
         for i_batch, sample_batched in enumerate (dataloader):

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/zhang123454lulu/article/details/83374860 。

最后此篇关于解决pytorch trainloader遇到的多进程问题的文章就讲到这里了,如果你想了解更多关于解决pytorch trainloader遇到的多进程问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com