[PyTorch]——DataLoader Num_workers

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

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

[PyTorch]——DataLoader Num_workers_第1张图片

一、训练进程提速

为了加快训练过程,我们将利用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。缺点当然是速度更慢。

你可能感兴趣的:(机器学习&深度学习,pytorch,人工智能,python)