pytorch锁死在dataloader(训练时卡死),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

cv2读取windows数据 python cv2.setnumthreads_python

Ctrl+C之后呈现的信息表明,这个bug是和多线程有关系

经过笔者实验,目前有三种可靠的解决方式

1).Dataloader里面不用cv2.imread进行读取图片,用cv2.imread还会带来一系列的不方便,比如不能结合torchvision进行数据增强,所以最好用PIL 里面的Image.open来读图片

2).将DataLoader 里面的参变量num_workers设置为0,但会导致数据的读取很慢,拖慢整个模型的训练

3).如果用了cv2.imread,也懒得改了,那就加两条语句,来关闭Opencv的多线程:cv2.setNumThreads(0)和cv2.ocl.setUseOpenCL(False)。加了这两条语句之后,并不影响模型的训练速度,根据笔者观察,速度相反还变快了,真神奇呀。

综上所述:如果遇到此问题,建议选择方法1和方法3来解决这个问题,因为不影响模型训练速度。

在opencv3.2下引入cpu并行算法

setNumThreads(numThreads);

代码的作用:

高并行计算。SPE已经完成了多线程化以充分利用多核心CPU的性能. 90%以上的计算任务都可均匀地分配到任意数量的线程中去. 与单线程相比,

双线程至少能提供60%的性能提升,而四线程可以带来150%以上的性能提升。使用SPEWorld::SetNumThreads()即可在任何时候开启多线程计算。

转载于:

总结实际操作过程如下:

1、尽量将jpg等格式的文件保存为bmp文件,可以降低解码时间;

2、dataloader函数中增加num_workers参数,该参数表示加载数据的线程数,建议设置为该系统中的CPU核心数,若CPU很强劲,而且内存很大,也可以考虑将该数值设置的更大一些。

train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)

修改为:

train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True,num_workers=multiprocessing.cpu_count())


虽然使用dataloader达到了iter(Dataset)的读取并行,但是没有实现在GPU运算时异步读取数据,可以考虑使用non_blocking实现。

dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers)
for epoch in range(epochs):
for batch_idx, (images, labels) in enumerate(dataloader):
images = images.to(device)
labels = labels.to(device)


改为:

dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers, pin_memory = True)
for epoch in range(epochs):
for batch_idx, (images, labels) in enumerate(dataloader):
images = images.to(device, non_blocking=True)
labels = labels.to(device, non_blocking=True)


需要注意的是:只有pin_memory=True并且num_workers>0时non_blocking才会有效。

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