精华内容
下载资源
问答
  • 今天小编就为大家分享一篇解决pytorch DataLoader num_workers出现的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 欢迎来到这个神经网络编程系列。 在这一集中,我们将看到如何利用PyTorch DataLoader类的多进程功能来加速神经网络训练过程。

    Speeding Up The Training Process

    为了加快培训过程,我们将使用DataLoader类的num_workers可选属性。

    num_workers属性告诉数据加载器实例要用于数据加载的子进程数。 默认情况下,num_workers值设置为零,零值告诉加载程序在主进程内部加载数据。

    这意味着培训过程将在主要过程中按顺序进行。 在训练过程中使用了一批并且需要另一批之后,我们从磁盘读取了批数据。

    现在,如果我们有一个工作进程,我们就可以利用我们的机器具有多个内核的事实。 这意味着在主流程准备好另一个批次时,已经可以加载下一个批次并准备好运行。 这就是速度的来源。 批处理使用其他工作进程加载,并在内存中排队。

    Optimal Value For The num_workers Attribute

    随之而来的自然问题是,我们应该添加多少个工人流程? 这里有很多因素会影响最佳数量,因此找出答案的最佳方法是进行测试。

    Testing Values For The num_workers Attribute

    要设置此测试,我们将创建一个num_workers值列表以进行尝试。 我们将尝试以下值:

    1. 0(默认)
    2. 1
    3. 2
    4. 4
    5. 8
    6. 16

    对于这些值中的每一个,我们将通过尝试以下值来更改批量大小:

    1. 100
    2. 1000
    3. 10000

    对于学习率,对于所有运行,我们将其保持在.01的恒定值。

    关于此设置的最后一件事要提到的事实是,对于每个运行,我们仅执行一个时期。

    好吧,让我们看看我们得到了什么。

    Different num_workers Values: Results

    好了,我们可以在下面看到我们得到的结果。 我们总共完成了18次运行。 我们有三组不同的批处理大小,并且在每组中,我们都更改了工作进程的数量。
    在这里插入图片描述
    从这些结果中得出的主要结论是,在所有三个批处理量中,除主要流程外还具有单个工作流程使速度提高了约20%。

    快20%!

    此外,在第一个工作进程之后添加其他工作进程并没有真正显示出任何进一步的改进。

    Interpreting The Results

    在添加单个工作进程之后,我们看到的20%的加速是有意义的,因为主进程要做的工作较少。

    当主进程忙于执行向前和向后传递时,工作进程正在加载下一批。当主进程准备好进行另一批处理时,工作进程已经在内存中排队了。

    结果,主进程不必从磁盘读取数据。相反,数据已经在内存中,这使我们的速度提高了20%。

    现在,为什么在增加更多的工人之后我们看不到额外的提速?

    Make It Go Faster With More Workers?

    如果一个工作人员足以让队列中的主进程充满数据,那么我们将向队列中添加更多批数据将无济于事。我认为这就是我们在这里看到的。

    仅仅因为我们将更多批次添加到队列中并不意味着这些批次的处理速度更快。因此,我们受限于向前和向后传播给定批次所需的时间。

    我们甚至可以看到,当我们有16个工人时,事情开始陷入困境。

    希望这可以帮助您加快速度!

    展开全文
  • 前段时间,我在调整yolo系列代码的时候,运行代码后,会提示 win页面太小问题,这种问题的解决办法之一就是通过调整 DataLoadernum_workers值的大小来解决,为了进一步了解num_workers到底起了什么作用,这里我查...

    前段时间,我在调整yolo系列代码的时候,运行代码后,会提示 win页面太小问题,这种问题的解决办法之一就是通过调整 DataLoader的num_workers值的大小来解决,为了进一步了解num_workers到底起了什么作用,这里我查了一些相关的资料。

    这里我们将探讨如何利用PyTorch DataLoader类的多进程功能来加快神经网络训练过程 

    一、训练进程提速

    为了加快训练过程,我们将利用DataLoader类的num_workers可选属性。

    num_workers属性告诉DataLoader实例要使用多少个子进程进行数据加载。默认情况下,num_workers值被设置为0,0值代表告诉加载器在主进程内部加载数据。

    0:这意味着训练进程将在主进程内部依次工作。在训练过程中使用一批批处理之后,我们从磁盘上读取另一批批处理数据。

    现在,如果我们有一个工作进程,我们可以利用我们的机器有多个内核这一事实。这意味着,在主进程准备好另一个批处理的时候,下一个批处理已经可以加载并准备好了。这就是速度提升的原因。批处理使用附加的辅助进程加载,并在内存中排队。

    二、num_works到底取何值

    在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?如果将num_worker设为0(也是默认值),就没有worker了吗?

    dataloader = loader(dataset,
                        batch_size=batch_size,
                        num_workers=nw,
                        sampler=sampler,
                        pin_memory=True,
                        collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate_fn)

    1、每每轮到dataloader加载数据时:dataloader一次性创建num_worker个worker,(也可以说dataloader一次性创建num_worker个工作进程,worker也是普通的工作进程),并用batch_sampler将指定batch分配给指定worker,worker将它负责的batch加载进RAM。然后,dataloader从RAM中找本轮迭代要用的batch,如果找到了,就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。一般情况下都是能找到的,因为batch_sampler指定batch时当然优先指定本轮要用的batch。

    2、num_worker设置得大,好处是寻找batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮...迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。

    3、如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

    展开全文
  • 最近在用RFBnet (源码是pytorch的)训练RSNA的比赛数据,除了要修改一点代码支持RSNA的数据集外(打算后续再写个博客),发现在使用dataloader读取数据时,如果设置num_workers为0,也就是用主进程读取数据,模型...

    参考:https://blog.csdn.net/qian1122221/article/details/88579684

    问题描述:
    最近在用RFBnet (源码是pytorch的)训练RSNA的比赛数据,除了要修改一点代码支持RSNA的数据集外(打算后续再写个博客),发现在使用dataloader读取数据时,如果设置num_workers为0,也就是用主进程读取数据,模型训练程序运行正常。如果设置num_workers为其他任何一个大于0的整数,也就是使用子进程读取数据时,训练程序会卡住,卡在训练之前,GPU使用率和显存占用率都为0。

     

    解决过程:
    由于是多进程就,用print调试大法,定位到是一行opencv代码的问题,在dataloader子类的__getitem__方法里面调用了

    image_array = cv2.cvtColor(image_array, cv2.COLOR_GRAY2BGR)
    所有子进程的代码都卡在这里了。之前也有遇到过类似的问题,python多进程调用opencv的代码会出现问题。于是就用numpy的concate替代了这个方法

    image_array = np.concatenate([image_array,image_array,image_array],axis=2)
    绕过这个问题就可以正常训练了。

     

    问题探索:
    其实这个问题,我在另外一台机器上是没有遇到了,该机器是python3.6+opencv3.4.2

    遇到问题的环境是docker环境,python3.5+opencv3.2

    我感觉跟opencv的版本可能有关系,等后续训练完成之后把docker里面opencv的版本升级到3.4.2再试一下

    展开全文
  • pytorch DataLoader num_workers 出现的问题

    万次阅读 多人点赞 2018-07-03 10:17:18
    最近在学pytorch,在使用数据分批训练时在导入数据是使用了 DataLoader 在参数num_workers的设置上使程序出现运行没有任何响应的结果 ,看看代码 import torch #导入模块 import torch.utils.data as Data BATCH_...

        最近在学pytorch,在使用数据分批训练时在导入数据是使用了 DataLoader 在参数 num_workers的设置上使程序出现运行没有任何响应的结果  ,看看代码

    import torch   #导入模块
    import torch.utils.data as Data

    BATCH_SIZE=8  #每一批的数据量

    x=torch.linspace(1,10,10)  #定义X为 1 到 10 等距离大小的数
    y=torch.linspace(10,1,10)

    #转换成torch能识别的Dataset
    torch_dataset = Data.TensorDataset( x,y) #将数据放入 torch_dataset

    loader=Data.DataLoader(
            dataset=torch_dataset,     #将数据放入loader
            batch_size=BATCH_SIZE,  #每个数据段大小为  BATCH_SIZE=5
            shuffle=True ,   #是否打乱数据的排布
            num_workers=2  #每次提取数据多进进程为2
            )
    for epoch in range(3):
        
        for step,(batch_x,batch_y) in enumerate(loader):
            
            print('epoch',epoch,'|step:',step," | batch_x",batch_x.numpy(),

                  '|batch_y:',batch_y.numpy())

    (以上代码取莫烦python教学视频,教学视频中没有报错)

    程序就停止成这样了

    上网查询没有得到有用的东西,因为程序没有报错,就是没有任何反应,(没有反应可能跟电脑或者编译器有关,我使用的是anconda spyder)于是决定自己找找

    期初我采用在语句后面加 print('1')检测程序停在了什么地方,(其实这是一种笨方法,在这里可以采用断点调试)程序停在了 for step,(batch_x,batch_y) in enumerate(loader):

    我以为是enumerate的问题,查资料发现这就是一个可返回列表元素和键值的函数,不存在问题

    继续排查,把目光放在了loader,于是查询了DataLoader的参数

    DataLoader的函数定义如下:

    DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
    num_workers=0, collate_fn=default_collate, pin_memory=False,
    drop_last=False)
     

    1.  dataset:加载的数据集(Dataset对象)
    2.  batch_size:batch size
    3.  shuffle::是否将数据打乱
    4.  sampler: 样本抽样,后续会详细介绍
    5.  num_workers:使用多进程加载的进程数,0代表不使用多进程
    6.  collate_fn: 如何将多个样本数据拼接成一个batch,一般使用默认的拼接方式即可
    7.  pin_memory:是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些

    8.  drop_last:dataset中的数据个数可能不是batch_size的整数倍,drop_last为True会将多出来不足一个batch的数据丢弃

    发现我所定义的几个参数只有num_workers嫌疑最大,于是将参数值改成了默认值 0,程序可以运行了,(一把老泪纵横)

    看看进程是什么鬼 发现在这里好像没啥用(具体自己上网查查)

     

    展开全文
  • PyTorch DataLoader num_workers Test - 加快速度 欢迎来到本期神经网络编程系列。在本集中,我们将看到如何利用PyTorch DataLoader类的多进程功能来加快神经网络训练过程。 加快训练进程 为了加快训练过程,我们将...
  • pytorch中DataLoadernum_workers参数详解与设置大小建议

    千次阅读 多人点赞 2021-04-04 11:50:26
    Q:在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的? train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True,
  • 电脑有10核20线程应该怎么设置torch.utils.data.DataLoadernum_workers使得我数据加载最快? 首先来搞定定义:概念核心数与线程数 核心数与线程数 核心:一个CPU具有的物理核心数(物理概念) 线程:是CPU调度和...
  • pytorch data.DataLoadernum_workers的问题

    千次阅读 2020-02-15 12:57:50
    我遇见的问题是: 是num_worker的问题,将 ** num_workers改为0就可以了** 不知道是不是版本的问题,我的是win10+3.7
  • 考虑这么一个场景,有海量txt文件,一个个batch读进来,测试一下torch DataLoader的效率如何。 基本信息: 本机配置:8核32G内存,工作站内置一块2T的机械硬盘,数据均放在该硬盘上 操作系统:ubuntu 16.04 LTS ...
  • 尝试在train_loader=DataLoader(train_data,batch_size=trainargs.batch_size,shuffle=True,num_workers=4) 设置num_workers=4,发现报错RuntimeError: Caught RuntimeError in DataLoader worker process。...
  • 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有...
  • 一直很迷,在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?如果将num_worker设为0(也是默认值),就没有worker了吗? worker的使用场景: from torch.utils.data ...
  • https://stackoverflow.com/questions/53998282/how-does-the-number-of-workers-parameter-in-pytorch-dataloader-actually-work 注:将数据转移到GPU上并不是DataLoader的job; 最好不要在Dataset类中将数据放到...
  • dataloader本质上是使用多进程来进行程序的加速,而python在调用多进程程序时如果不将主程序加入if __name__ == '__main__':下,子线程就会无限调用多线程程序,导致最后程序崩溃,因此要加入if __name__ == '__...
  • 报错信息如下: Exception ignored in: <function _MultiProcessingDataLoaderIter.__... File "/home/vincent/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 926, in __del__ .
  • pytorch中Dataloader()中的num_workers设置问题: 如果num_workers的值大于0,要在运行的部分放进__main__()函数里,才不会有错: import numpy as np import torch from torch.autograd import Variable import ...
  • 在Windows上使用Dataloader并设置num_workers为一个非零数字,enumerate取数据时会引发"EOFError: Ran out of input"的报错。解决方法是num_workers=0。 转载于:...
  • Dataloader中的num_workers设置与docker的shared memory相关问题错误一错误二产生错误的原因解决办法功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个...
  • 测试程序时发现,当DataLoader函数中加载数据时线程数设定大于0时,程序会卡住,但当设定线程数为1(num_workers=0即将用主进程加载数据)时,程序能正常运行,但由于仅单线程的加载致使神经网络在训练时会花将近...
  • num_workers是多进程执行的,其中子进程全是守护进程;pin_memory是多线程的。 其中每个worker加载一个batch的数据 选择num_workers 如果使用pin_memory: 此时是把所有数据放到host内存的固定区域,所以会一次性...
  • Pytorch之DataLoadernum_works参数设置

    千次阅读 多人点赞 2020-05-28 00:13:56
    数据集较小时(小于2W)建议num_works不用管默认就行,因为用了反而比没用慢。 当数据集较大时建议采用,num_works一般设置为(CPU线程数-1)为最佳,可以用以下代码找出最佳num_works(注意windows用户如果要使用...
  • Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (function set_num_threads) 参考链接:...
  • dataloader下的num_worker

    2021-03-18 09:52:30
    num-worker是, 是加载数据(batch)的线程数目,是通过影响数据加载速度,从而影响训练速度。 当加载batch的时间<数据训练的时间 既GPU训练完一组数据,可以直接从CPU调用next batch 数据, 不需要额外的worker...
  • DataLoader设置num_works时程序崩溃问题

    千次阅读 2019-06-21 17:16:07
    Docker容器中使用Pytorch训练时,当 DataLoader设置num_works>0时,训练程序崩溃,提示: ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm) 解决...
  • Pytorch 初学 ———num_workers问题 运行环境 配置一 cpu:AMD 5600x 内存:32G 硬盘:pm981a pytorch:1.8 CPU版本 系统:windows 10 配置二 cpu:i7 10700k 内存:32G 硬盘:固态(型号未知) pytorch:1.8 GPU版本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,918
精华内容 4,367
关键字:

dataloadernum_workers