pytorchDataLoader的num_workers参数与设置⼤⼩详解Q:在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么⼯作的?
train_loader = torch.utils.data.DataLoader(train_dataset,
batch_size=batch_size, shuffle=True,
num_workers=4)
参数详解:
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。缺点当然是速度更慢。
设置⼤⼩建议:
1、Dataloader的num_worker设置多少才合适,这个问题是很难有⼀个推荐的值。有以下⼏个建议:
2、num_workers=0表⽰只有主进程去加载batch数据,这个可能会是⼀个瓶颈。
3、num_workers = 1表⽰只有⼀个worker进程⽤来加载batch数据,⽽主进程是不参与数据加载的。这样速度也会很慢。num_workers>0 表⽰只有指定数量的worker进程去加载数据,主进程不参与。增加num_works也同时会增加cpu内存的消耗。所以num_workers的值依赖于 batch size和机器性能。
4、⼀般开始是将num_workers设置为等于计算机上的CPU数量
5、最好的办法是缓慢增加num_workers,直到训练速度不再提⾼,就停⽌增加num_workers的值。
补充:pytorch中Dataloader()中的num_workers设置问题
如果num_workers的值⼤于0,要在运⾏的部分放进__main__()函数⾥,才不会有错:
import numpy as np
import torch
from torch.autograd import Variable
functional
import matplotlib.pyplot as plt
import torch.utils.data as Data
BATCH_SIZE=5
x=torch.linspace(1,10,10)
y=torch.linspace(10,1,10)
torch_dataset=Data.TensorDataset(x,y)
loader=Data.DataLoader(
numpy库运行速度dataset=torch_dataset,
batch_size=BATCH_SIZE,
shuffle=True,
num_workers=2,
)
def main():
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())
if __name__=="__main__":
main()
'''
# 下⾯这样直接运⾏会报错:
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()
'''
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。